def _check_button_cb(self, button, preference): '''Callback for all checkbutton-type preferences.''' prefs[preference] = button.get_active() if preference == 'color box bg' and button.get_active(): if not prefs['smart bg'] or not self._window.filehandler.file_loaded: self._window.set_bg_color(prefs['bg colour']) elif preference == 'smart bg' and button.get_active(): # if the color is no longer using the smart background then return it to the chosen color if not prefs[preference]: self._window.set_bg_color(prefs['bg colour']) else: # draw_image() will set the main background to the smart background self._window.draw_image() elif preference == 'color box thumb bg' and button.get_active(): if prefs[preference]: prefs['smart thumb bg'] = False prefs['thumbnail bg uses main colour'] = False self._window.thumbnailsidebar.change_thumbnail_background_color(prefs['thumb bg colour']) else: self._window.draw_image() elif preference == 'smart thumb bg' and button.get_active(): if prefs[preference]: prefs['color box thumb bg'] = False prefs['thumbnail bg uses main colour'] = False pixbuf = image_tools.static_image(image_tools.unwrap_image( self._window.images[0])) # XXX transitional(double page limitation) if pixbuf: bg_color = image_tools.get_most_common_edge_color(pixbuf) self._window.thumbnailsidebar.change_thumbnail_background_color(bg_color) else: self._window.draw_image() elif preference in ('checkered bg for transparent images', 'no double page for wide images', 'auto rotate from exif'): self._window.draw_image() elif (preference == 'hide all in fullscreen' and self._window.is_fullscreen): self._window.draw_image() elif preference == 'show page numbers on thumbnails': self._window.thumbnailsidebar.toggle_page_numbers_visible() elif preference in ('animation background', 'animation transform'): self._window.filehandler.refresh_file() elif preference in ('check image mimetype',): self._window.filehandler.refresh_file()
def _check_button_cb(self, button, preference): """Callback for all checkbutton-type preferences.""" prefs[preference] = button.get_active() if preference == 'color box bg' and button.get_active(): if not prefs['smart bg'] or not self._window.filehandler.file_loaded: self._window.set_bg_colour(prefs['bg colour']) elif preference == 'smart bg' and button.get_active(): # if the color is no longer using the smart background then return it to the chosen color if not prefs[preference]: self._window.set_bg_colour(prefs['bg colour']) else: # draw_image() will set the main background to the smart background self._window.draw_image() elif preference == 'color box thumb bg' and button.get_active(): if prefs[preference]: prefs['smart thumb bg'] = False prefs['thumbnail bg uses main colour'] = False self._window.thumbnailsidebar.change_thumbnail_background_color(prefs['thumb bg colour']) else: self._window.draw_image() elif preference == 'smart thumb bg' and button.get_active(): if prefs[preference]: prefs['color box thumb bg'] = False prefs['thumbnail bg uses main colour'] = False pixbuf = image_tools.static_image(image_tools.unwrap_image( self._window.images[0])) # XXX transitional(double page limitation) if pixbuf: bg_color = image_tools.get_most_common_edge_colour(pixbuf) self._window.thumbnailsidebar.change_thumbnail_background_color(bg_color) else: self._window.draw_image() elif preference in ('checkered bg for transparent images', 'no double page for wide images', 'auto rotate from exif'): self._window.draw_image() elif (preference == 'hide all in fullscreen' and self._window.is_fullscreen): self._window.draw_image() elif preference == 'show page numbers on thumbnails': self._window.thumbnailsidebar.toggle_page_numbers_visible()
def _add_subpixbuf(self, canvas, x, y, image_size, source_pixbuf): '''Copy a subpixbuf from <source_pixbuf> to <canvas> as it should be in the lens if the coordinates <x>, <y> are the mouse pointer position on the main window layout area. The displayed image (scaled from the <source_pixbuf>) must have size <image_size>. ''' # Prevent division by zero exceptions further down if not image_size[0]: return # FIXME This merely prevents Errors being raised if source_pixbuf is an # animation. The result might be broken, though, since animation, # rotation etc. might not match or will be ignored: source_pixbuf = image_tools.static_image(source_pixbuf) rotation = prefs['rotation'] if prefs['auto rotate from exif']: rotation += image_tools.get_implied_rotation(source_pixbuf) rotation = rotation % 360 if rotation in [90, 270]: scale = float(source_pixbuf.get_height()) / image_size[0] else: scale = float(source_pixbuf.get_width()) / image_size[0] x *= scale y *= scale source_mag = prefs['lens magnification'] / scale width = height = prefs['lens size'] / source_mag paste_left = x > width / 2 paste_top = y > height / 2 dest_x = max(0, int(math.ceil((width / 2 - x) * source_mag))) dest_y = max(0, int(math.ceil((height / 2 - y) * source_mag))) if rotation == 90: x, y = y, source_pixbuf.get_height() - x elif rotation == 180: x = source_pixbuf.get_width() - x y = source_pixbuf.get_height() - y elif rotation == 270: x, y = source_pixbuf.get_width() - y, x if prefs['horizontal flip']: if rotation in (90, 270): y = source_pixbuf.get_height() - y else: x = source_pixbuf.get_width() - x if prefs['vertical flip']: if rotation in (90, 270): x = source_pixbuf.get_width() - x else: y = source_pixbuf.get_height() - y src_x = x - width / 2 src_y = y - height / 2 if src_x < 0: width += src_x src_x = 0 if src_y < 0: height += src_y src_y = 0 width = max(0, min(source_pixbuf.get_width() - src_x, width)) height = max(0, min(source_pixbuf.get_height() - src_y, height)) if width < 1 or height < 1: return subpixbuf = source_pixbuf.new_subpixbuf(int(src_x), int(src_y), int(width), int(height)) subpixbuf = subpixbuf.scale_simple( int(math.ceil(source_mag * subpixbuf.get_width())), int(math.ceil(source_mag * subpixbuf.get_height())), prefs['scaling quality']) if rotation == 90: subpixbuf = subpixbuf.rotate_simple(Gdk.PIXBUF_ROTATE_CLOCKWISE) elif rotation == 180: subpixbuf = subpixbuf.rotate_simple(Gdk.PIXBUF_ROTATE_UPSIDEDOWN) elif rotation == 270: subpixbuf = subpixbuf.rotate_simple( Gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE) if prefs['horizontal flip']: subpixbuf = subpixbuf.flip(horizontal=True) if prefs['vertical flip']: subpixbuf = subpixbuf.flip(horizontal=False) subpixbuf = self._window.enhancer.enhance(subpixbuf) if paste_left: dest_x = 0 else: dest_x = min(canvas.get_width() - subpixbuf.get_width(), dest_x) if paste_top: dest_y = 0 else: dest_y = min(canvas.get_height() - subpixbuf.get_height(), dest_y) if subpixbuf.get_has_alpha( ) and prefs['checkered bg for transparent images']: subpixbuf = subpixbuf.composite_color_simple( subpixbuf.get_width(), subpixbuf.get_height(), GdkPixbuf.InterpType.NEAREST, 255, 8, 0x777777, 0x999999) subpixbuf.copy_area(0, 0, subpixbuf.get_width(), subpixbuf.get_height(), canvas, dest_x, dest_y)
def draw_histogram(self, pixbuf): """Draw a histogram representing <pixbuf> in the dialog.""" pixbuf = image_tools.static_image(pixbuf) histogram_pixbuf = histogram.draw_histogram(pixbuf, text=False) self._hist_image.set_from_pixbuf(histogram_pixbuf)
def _add_subpixbuf(self, canvas, x, y, image_size, source_pixbuf): """Copy a subpixbuf from <source_pixbuf> to <canvas> as it should be in the lens if the coordinates <x>, <y> are the mouse pointer position on the main window layout area. The displayed image (scaled from the <source_pixbuf>) must have size <image_size>. """ # Prevent division by zero exceptions further down if not image_size[0]: return # FIXME This merely prevents Errors being raised if source_pixbuf is an # animation. The result might be broken, though, since animation, # rotation etc. might not match or will be ignored: source_pixbuf = image_tools.static_image(source_pixbuf) rotation = prefs['rotation'] if prefs['auto rotate from exif']: rotation += image_tools.get_implied_rotation(source_pixbuf) rotation = rotation % 360 if rotation in [90, 270]: scale = float(source_pixbuf.get_height()) / image_size[0] else: scale = float(source_pixbuf.get_width()) / image_size[0] x *= scale y *= scale source_mag = prefs['lens magnification'] / scale width = height = prefs['lens size'] / source_mag paste_left = x > width / 2 paste_top = y > height / 2 dest_x = max(0, int(math.ceil((width / 2 - x) * source_mag))) dest_y = max(0, int(math.ceil((height / 2 - y) * source_mag))) if rotation == 90: x, y = y, source_pixbuf.get_height() - x elif rotation == 180: x = source_pixbuf.get_width() - x y = source_pixbuf.get_height() - y elif rotation == 270: x, y = source_pixbuf.get_width() - y, x if prefs['horizontal flip']: if rotation in (90, 270): y = source_pixbuf.get_height() - y else: x = source_pixbuf.get_width() - x if prefs['vertical flip']: if rotation in (90, 270): x = source_pixbuf.get_width() - x else: y = source_pixbuf.get_height() - y src_x = x - width / 2 src_y = y - height / 2 if src_x < 0: width += src_x src_x = 0 if src_y < 0: height += src_y src_y = 0 width = max(0, min(source_pixbuf.get_width() - src_x, width)) height = max(0, min(source_pixbuf.get_height() - src_y, height)) if width < 1 or height < 1: return subpixbuf = source_pixbuf.subpixbuf(int(src_x), int(src_y), int(width), int(height)) subpixbuf = subpixbuf.scale_simple( int(math.ceil(source_mag * subpixbuf.get_width())), int(math.ceil(source_mag * subpixbuf.get_height())), prefs['scaling quality']) if rotation == 90: subpixbuf = subpixbuf.rotate_simple( gtk.gdk.PIXBUF_ROTATE_CLOCKWISE) elif rotation == 180: subpixbuf = subpixbuf.rotate_simple( gtk.gdk.PIXBUF_ROTATE_UPSIDEDOWN) elif rotation == 270: subpixbuf = subpixbuf.rotate_simple( gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE) if prefs['horizontal flip']: subpixbuf = subpixbuf.flip(horizontal=True) if prefs['vertical flip']: subpixbuf = subpixbuf.flip(horizontal=False) subpixbuf = self._window.enhancer.enhance(subpixbuf) if paste_left: dest_x = 0 else: dest_x = min(canvas.get_width() - subpixbuf.get_width(), dest_x) if paste_top: dest_y = 0 else: dest_y = min(canvas.get_height() - subpixbuf.get_height(), dest_y) if subpixbuf.get_has_alpha() and prefs['checkered bg for transparent images']: subpixbuf = subpixbuf.composite_color_simple(subpixbuf.get_width(), subpixbuf.get_height(), gtk.gdk.INTERP_NEAREST, 255, 8, 0x777777, 0x999999) subpixbuf.copy_area(0, 0, subpixbuf.get_width(), subpixbuf.get_height(), canvas, dest_x, dest_y)