@@ -310,6 +310,123 @@ GdkPixbuf *meme_render_composite(GdkPixbuf *bg, GList *layers,
310310 return comp ;
311311}
312312
313+ void meme_draw_crop_chrome (cairo_t * cr , double w , double h ,
314+ double abs_x , double abs_y , double abs_w , double abs_h ) {
315+ double scale_ref = (w < h ? w : h ) / 800.0 ;
316+ double corner_len = CLAMP (18.0 * scale_ref , 12.0 , 26.0 );
317+ double edge_len = CLAMP (14.0 * scale_ref , 10.0 , 20.0 );
318+ double handle_thick = 3.0 ;
319+ int i ;
320+
321+ cairo_set_source_rgba (cr , 0 , 0 , 0 , 0.55 );
322+ if (abs_y > 0 ) {
323+ cairo_rectangle (cr , 0 , 0 , w , abs_y );
324+ cairo_fill (cr );
325+ }
326+ if (abs_y + abs_h < h ) {
327+ cairo_rectangle (cr , 0 , abs_y + abs_h , w , h - (abs_y + abs_h ));
328+ cairo_fill (cr );
329+ }
330+ if (abs_x > 0 ) {
331+ cairo_rectangle (cr , 0 , abs_y , abs_x , abs_h );
332+ cairo_fill (cr );
333+ }
334+ if (abs_x + abs_w < w ) {
335+ cairo_rectangle (cr , abs_x + abs_w , abs_y , w - (abs_x + abs_w ), abs_h );
336+ cairo_fill (cr );
337+ }
338+
339+ cairo_set_line_width (cr , 1.0 );
340+ cairo_set_source_rgba (cr , 1 , 1 , 1 , 0.35 );
341+ for (i = 1 ; i <= 2 ; i ++ ) {
342+ double gx = abs_x + abs_w * i / 3.0 ;
343+ double gy = abs_y + abs_h * i / 3.0 ;
344+ cairo_move_to (cr , gx , abs_y );
345+ cairo_line_to (cr , gx , abs_y + abs_h );
346+ cairo_move_to (cr , abs_x , gy );
347+ cairo_line_to (cr , abs_x + abs_w , gy );
348+ }
349+ cairo_stroke (cr );
350+
351+
352+ cairo_set_line_width (cr , 3.0 );
353+ cairo_set_source_rgba (cr , 0 , 0 , 0 , 0.45 );
354+ cairo_rectangle (cr , abs_x , abs_y , abs_w , abs_h );
355+ cairo_stroke (cr );
356+
357+ cairo_set_line_width (cr , 1.5 );
358+ cairo_set_source_rgba (cr , 1 , 1 , 1 , 0.95 );
359+ cairo_rectangle (cr , abs_x , abs_y , abs_w , abs_h );
360+ cairo_stroke (cr );
361+ cairo_set_line_cap (cr , CAIRO_LINE_CAP_ROUND );
362+
363+ {
364+ struct { double x , y , dx , dy ; } corners [4 ] = {
365+ { abs_x , abs_y , 1 , 1 },
366+ { abs_x + abs_w , abs_y , -1 , 1 },
367+ { abs_x , abs_y + abs_h , 1 , -1 },
368+ { abs_x + abs_w , abs_y + abs_h , -1 , -1 },
369+ };
370+ int c ;
371+ for (c = 0 ; c < 4 ; c ++ ) {
372+ double x = corners [c ].x , y = corners [c ].y ;
373+ double dx = corners [c ].dx , dy = corners [c ].dy ;
374+
375+ cairo_set_line_width (cr , handle_thick + 2.0 );
376+ cairo_set_source_rgba (cr , 0 , 0 , 0 , 0.4 );
377+ cairo_move_to (cr , x + dx * corner_len , y );
378+ cairo_line_to (cr , x , y );
379+ cairo_line_to (cr , x , y + dy * corner_len );
380+ cairo_stroke (cr );
381+
382+ cairo_set_line_width (cr , handle_thick );
383+ cairo_set_source_rgba (cr , 1 , 1 , 1 , 1 );
384+ cairo_move_to (cr , x + dx * corner_len , y );
385+ cairo_line_to (cr , x , y );
386+ cairo_line_to (cr , x , y + dy * corner_len );
387+ cairo_stroke (cr );
388+ }
389+ }
390+
391+ {
392+ struct { double x , y , horiz ; } edges [4 ] = {
393+ { abs_x + abs_w / 2.0 , abs_y , 1 },
394+ { abs_x + abs_w / 2.0 , abs_y + abs_h , 1 },
395+ { abs_x , abs_y + abs_h / 2.0 , 0 },
396+ { abs_x + abs_w , abs_y + abs_h / 2.0 , 0 },
397+ };
398+ int e ;
399+ for (e = 0 ; e < 4 ; e ++ ) {
400+ double x = edges [e ].x , y = edges [e ].y ;
401+ double half = edge_len / 2.0 ;
402+
403+ cairo_set_line_width (cr , handle_thick + 2.0 );
404+ cairo_set_source_rgba (cr , 0 , 0 , 0 , 0.4 );
405+ if (edges [e ].horiz ) {
406+ cairo_move_to (cr , x - half , y );
407+ cairo_line_to (cr , x + half , y );
408+ } else {
409+ cairo_move_to (cr , x , y - half );
410+ cairo_line_to (cr , x , y + half );
411+ }
412+ cairo_stroke (cr );
413+
414+ cairo_set_line_width (cr , handle_thick );
415+ cairo_set_source_rgba (cr , 1 , 1 , 1 , 1 );
416+ if (edges [e ].horiz ) {
417+ cairo_move_to (cr , x - half , y );
418+ cairo_line_to (cr , x + half , y );
419+ } else {
420+ cairo_move_to (cr , x , y - half );
421+ cairo_line_to (cr , x , y + half );
422+ }
423+ cairo_stroke (cr );
424+ }
425+ }
426+
427+ cairo_set_line_cap (cr , CAIRO_LINE_CAP_BUTT );
428+ }
429+
313430GdkTexture * meme_render_editor_overlay (GdkPixbuf * composite , GList * layers , ImageLayer * selected , gboolean crop_active , double cx , double cy , double cw , double ch ) {
314431 GdkPixbuf * res ;
315432 GdkTexture * tex ;
@@ -330,123 +447,7 @@ GdkTexture *meme_render_editor_overlay(GdkPixbuf *composite, GList *layers, Imag
330447 cairo_paint (cr );
331448
332449 if (crop_active ) {
333- double abs_x = cx * w ;
334- double abs_y = cy * h ;
335- double abs_w = cw * w ;
336- double abs_h = ch * h ;
337- double scale_ref = (w < h ? w : h ) / 800.0 ;
338- double corner_len = CLAMP (18.0 * scale_ref , 12.0 , 26.0 );
339- double edge_len = CLAMP (14.0 * scale_ref , 10.0 , 20.0 );
340- double handle_thick = 3.0 ;
341- int i ;
342-
343- cairo_set_source_rgba (cr , 0 , 0 , 0 , 0.55 );
344- if (abs_y > 0 ) {
345- cairo_rectangle (cr , 0 , 0 , w , abs_y );
346- cairo_fill (cr );
347- }
348- if (abs_y + abs_h < h ) {
349- cairo_rectangle (cr , 0 , abs_y + abs_h , w , h - (abs_y + abs_h ));
350- cairo_fill (cr );
351- }
352- if (abs_x > 0 ) {
353- cairo_rectangle (cr , 0 , abs_y , abs_x , abs_h );
354- cairo_fill (cr );
355- }
356- if (abs_x + abs_w < w ) {
357- cairo_rectangle (cr , abs_x + abs_w , abs_y , w - (abs_x + abs_w ), abs_h );
358- cairo_fill (cr );
359- }
360-
361- cairo_set_line_width (cr , 1.0 );
362- cairo_set_source_rgba (cr , 1 , 1 , 1 , 0.35 );
363- for (i = 1 ; i <= 2 ; i ++ ) {
364- double gx = abs_x + abs_w * i / 3.0 ;
365- double gy = abs_y + abs_h * i / 3.0 ;
366- cairo_move_to (cr , gx , abs_y );
367- cairo_line_to (cr , gx , abs_y + abs_h );
368- cairo_move_to (cr , abs_x , gy );
369- cairo_line_to (cr , abs_x + abs_w , gy );
370- }
371- cairo_stroke (cr );
372-
373-
374- cairo_set_line_width (cr , 3.0 );
375- cairo_set_source_rgba (cr , 0 , 0 , 0 , 0.45 );
376- cairo_rectangle (cr , abs_x , abs_y , abs_w , abs_h );
377- cairo_stroke (cr );
378-
379- cairo_set_line_width (cr , 1.5 );
380- cairo_set_source_rgba (cr , 1 , 1 , 1 , 0.95 );
381- cairo_rectangle (cr , abs_x , abs_y , abs_w , abs_h );
382- cairo_stroke (cr );
383- cairo_set_line_cap (cr , CAIRO_LINE_CAP_ROUND );
384-
385- {
386- struct { double x , y , dx , dy ; } corners [4 ] = {
387- { abs_x , abs_y , 1 , 1 },
388- { abs_x + abs_w , abs_y , -1 , 1 },
389- { abs_x , abs_y + abs_h , 1 , -1 },
390- { abs_x + abs_w , abs_y + abs_h , -1 , -1 },
391- };
392- int c ;
393- for (c = 0 ; c < 4 ; c ++ ) {
394- double x = corners [c ].x , y = corners [c ].y ;
395- double dx = corners [c ].dx , dy = corners [c ].dy ;
396-
397- cairo_set_line_width (cr , handle_thick + 2.0 );
398- cairo_set_source_rgba (cr , 0 , 0 , 0 , 0.4 );
399- cairo_move_to (cr , x + dx * corner_len , y );
400- cairo_line_to (cr , x , y );
401- cairo_line_to (cr , x , y + dy * corner_len );
402- cairo_stroke (cr );
403-
404- cairo_set_line_width (cr , handle_thick );
405- cairo_set_source_rgba (cr , 1 , 1 , 1 , 1 );
406- cairo_move_to (cr , x + dx * corner_len , y );
407- cairo_line_to (cr , x , y );
408- cairo_line_to (cr , x , y + dy * corner_len );
409- cairo_stroke (cr );
410- }
411- }
412-
413- {
414- struct { double x , y , horiz ; } edges [4 ] = {
415- { abs_x + abs_w / 2.0 , abs_y , 1 },
416- { abs_x + abs_w / 2.0 , abs_y + abs_h , 1 },
417- { abs_x , abs_y + abs_h / 2.0 , 0 },
418- { abs_x + abs_w , abs_y + abs_h / 2.0 , 0 },
419- };
420- int e ;
421- for (e = 0 ; e < 4 ; e ++ ) {
422- double x = edges [e ].x , y = edges [e ].y ;
423- double half = edge_len / 2.0 ;
424-
425- cairo_set_line_width (cr , handle_thick + 2.0 );
426- cairo_set_source_rgba (cr , 0 , 0 , 0 , 0.4 );
427- if (edges [e ].horiz ) {
428- cairo_move_to (cr , x - half , y );
429- cairo_line_to (cr , x + half , y );
430- } else {
431- cairo_move_to (cr , x , y - half );
432- cairo_line_to (cr , x , y + half );
433- }
434- cairo_stroke (cr );
435-
436- cairo_set_line_width (cr , handle_thick );
437- cairo_set_source_rgba (cr , 1 , 1 , 1 , 1 );
438- if (edges [e ].horiz ) {
439- cairo_move_to (cr , x - half , y );
440- cairo_line_to (cr , x + half , y );
441- } else {
442- cairo_move_to (cr , x , y - half );
443- cairo_line_to (cr , x , y + half );
444- }
445- cairo_stroke (cr );
446- }
447- }
448-
449- cairo_set_line_cap (cr , CAIRO_LINE_CAP_BUTT );
450+ meme_draw_crop_chrome (cr , w , h , cx * w , cy * h , cw * w , ch * h );
450451 } else if (selected ) {
451452 double sx = selected -> x * w ;
452453 double sy = selected -> y * h ;
0 commit comments