Skip to content

Commit c072ceb

Browse files
Fix misleading censor rendering for large images (#228)
1 parent 2dfccf2 commit c072ceb

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

gradia/overlay/drawing_actions.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -655,9 +655,18 @@ def get_bounds(self) -> QuadBounds:
655655
class CensorAction(RectAction):
656656
def __init__(self, start: tuple[int, int], end: tuple[int, int], background_pixbuf: GdkPixbuf.Pixbuf, options):
657657
super().__init__(start, end, False, options)
658-
self.block_size = 8
658+
659+
self.original_scale = 1.0
660+
self.base_block_size = 8
659661
self.background_pixbuf = background_pixbuf
660662

663+
def set_original_scale(self, scale: float):
664+
self.original_scale = scale
665+
666+
def _get_scaled_block_size(self, current_scale: float) -> float:
667+
scale_ratio = current_scale / self.original_scale
668+
return self.base_block_size * scale_ratio
669+
661670
def draw(self, cr: cairo.Context, image_to_widget_coords: Callable[[int, int], tuple[float, float]], scale: float):
662671
x1, y1 = image_to_widget_coords(*self.start)
663672
x2, y2 = image_to_widget_coords(*self.end)
@@ -668,15 +677,17 @@ def draw(self, cr: cairo.Context, image_to_widget_coords: Callable[[int, int], t
668677
crop = self._get_image_crop()
669678
if not crop:
670679
return
671-
self._draw_pixelation(cr, crop, x, y, width, height)
672680

673-
def _draw_pixelation(self, cr: cairo.Context, crop: dict, x: float, y: float, width: float, height: float):
681+
scaled_block_size = self._get_scaled_block_size(scale)
682+
self._draw_pixelation(cr, crop, x, y, width, height, scaled_block_size)
683+
684+
def _draw_pixelation(self, cr: cairo.Context, crop: dict, x: float, y: float, width: float, height: float, block_size: float):
674685
cr.save()
675686
cr.rectangle(x, y, width, height)
676687
cr.clip()
677688

678-
blocks_x = max(1, int(width / self.block_size))
679-
blocks_y = max(1, int(height / self.block_size))
689+
blocks_x = max(1, int(width / block_size))
690+
blocks_y = max(1, int(height / block_size))
680691

681692
tiny_surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, blocks_x, blocks_y)
682693
tiny_cr = cairo.Context(tiny_surface)

gradia/overlay/drawing_overlay.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,8 @@ def _on_drag_end(self, gesture, dx_widget, dy_widget):
690690
self.actions.append(CircleAction(self.start_point, self.end_point,self.current_shift_pressed, self.options.copy()))
691691
elif mode == DrawingMode.CENSOR:
692692
censor_action = CensorAction(self.start_point, self.end_point, self._get_background_pixbuf(), self.options.copy())
693+
current_scale = self._get_scale_factor()
694+
censor_action.set_original_scale(current_scale)
693695
self.actions.append(censor_action)
694696

695697
self.start_point = None
@@ -779,7 +781,10 @@ def _on_draw(self, area, cr: cairo.Context, width: int, height: int):
779781
elif self.options.mode == DrawingMode.CIRCLE:
780782
CircleAction(self.start_point, self.end_point, self.current_shift_pressed, self.options.copy()).draw(cr, self._image_to_widget_coords, scale)
781783
elif self.options.mode == DrawingMode.CENSOR:
782-
CensorAction(self.start_point, self.end_point, self._get_background_pixbuf(),self.options.copy()).draw(cr, self._image_to_widget_coords, scale)
784+
temp_censor = CensorAction(self.start_point, self.end_point, self._get_background_pixbuf(), self.options.copy())
785+
temp_censor.set_original_scale(scale)
786+
temp_censor.draw(cr, self._image_to_widget_coords, scale)
787+
783788
if self.is_text_editing and self.text_position and self.live_text:
784789
if self.editing_text_action:
785790
preview = TextAction(

0 commit comments

Comments
 (0)