Codebase list mirage / ee9fed7
Replace crop drawing code with Cairo Thomas Ross 3 years ago
1 changed file(s) with 32 addition(s) and 30 deletion(s). Raw diff Collapse all Expand all
2424
2525 gi.require_version("Gtk", "3.0")
2626 from gi.repository import Gtk, Gdk, GdkPixbuf, GObject, GLib, Gio
27 import cairo
2728 import os, sys, getopt, configparser, string, gc
2829 import random, urllib.request, gettext, locale
2930 import stat, time, subprocess, shutil, filecmp
47054706 | Gdk.EventMask.BUTTON_RELEASE_MASK
47064707 )
47074708 image.connect(
4708 "expose-event",
4709 self.crop_image_expose_cb,
4710 crop_pixbuf,
4711 image_width,
4712 image_height,
4709 "draw", self.draw_crop_image, crop_pixbuf, image_width, image_height,
47134710 )
47144711 image.connect(
47154712 "motion_notify_event",
47164713 self.crop_image_mouse_moved,
4717 image,
47184714 0,
47194715 0,
47204716 x,
47264722 width_adj,
47274723 height_adj,
47284724 )
4729 image.connect("button_press_event", self.crop_image_button_press, image)
4725 image.connect("button_press_event", self.crop_image_button_press)
47304726 image.connect("button_release_event", self.crop_image_button_release)
47314727 self.x_changed = x.connect(
47324728 "value-changed",
48984894 self.drawing_crop_rectangle = True
48994895 self.update_rectangle = True
49004896 self.crop_image_mouse_moved(
4897 image,
49014898 None,
4902 None,
4903 image,
49044899 x2,
49054900 y2,
49064901 x,
49154910 self.update_rectangle = False
49164911 self.drawing_crop_rectangle = False
49174912
4918 def crop_image_expose_cb(self, image, event, pixbuf, width, height):
4919 image.window.draw_pixbuf(None, pixbuf, 0, 0, 0, 0, width, height)
4913 def draw_crop_image(self, widget, cr, pixbuf, width, height):
4914 Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0)
4915 cr.paint()
4916
4917 if self.rect is not None:
4918 cr.set_source_rgb(1, 1, 1)
4919 cr.set_operator(cairo.Operator.DIFFERENCE)
4920 cr.rectangle(self.rect[0], self.rect[1], self.rect[2], self.rect[3])
4921 cr.stroke()
49204922
49214923 def crop_image_mouse_moved(
49224924 self,
49234925 widget,
49244926 event,
4925 image,
49264927 x2,
49274928 y2,
49284929 x,
49384939 x2, y2, state = self.get_pointer(event.window)
49394940 if self.drawing_crop_rectangle:
49404941 if self.crop_rectangle != None or self.update_rectangle:
4941 gc = image.window.new_gc(function=Gdk.INVERT)
4942 if self.rect != None:
4943 # Get rid of the previous drawn rectangle:
4944 image.window.draw_rectangle(
4945 gc,
4946 False,
4947 self.rect[0],
4948 self.rect[1],
4949 self.rect[2],
4950 self.rect[3],
4951 )
49524942 self.rect = [0, 0, 0, 0]
49534943 if self.crop_rectangle[0] > x2:
49544944 self.rect[0] = x2
49624952 else:
49634953 self.rect[1] = self.crop_rectangle[1]
49644954 self.rect[3] = y2 - self.crop_rectangle[1]
4965 image.window.draw_rectangle(
4966 gc, False, self.rect[0], self.rect[1], self.rect[2], self.rect[3]
4955
4956 region = cairo.Region(
4957 cairo.RectangleInt(0, 0, image_width, image_height)
49674958 )
4959 window = widget.get_window()
4960 drawing_context = window.begin_draw_frame(region)
4961 cr = drawing_context.get_cairo_context()
4962 widget.draw(cr)
4963 window.end_draw_frame(drawing_context)
4964
49684965 # Convert the rectangle coordinates of the current image
49694966 # to coordinates of pixbuf_original
49704967 if self.rect[0] < 0:
50405037 width.handler_unblock(self.width_changed)
50415038 height.handler_unblock(self.height_changed)
50425039
5043 def crop_image_button_press(self, widget, event, image):
5040 def crop_image_button_press(self, widget, event):
50445041 x, y, state = self.get_pointer(event.window)
50455042 if state & Gdk.ModifierType.BUTTON1_MASK:
50465043 self.drawing_crop_rectangle = True
50475044 self.crop_rectangle = [x, y]
5048 gc = image.window.new_gc(function=Gdk.INVERT)
50495045 if self.rect != None:
5050 # Get rid of the previous drawn rectangle:
5051 image.window.draw_rectangle(
5052 gc, False, self.rect[0], self.rect[1], self.rect[2], self.rect[3]
5046 region = cairo.Region(
5047 cairo.RectangleInt(
5048 self.rect[0], self.rect[1], self.rect[2], self.rect[3]
5049 )
50535050 )
5051 window = widget.get_window()
5052 drawing_context = window.begin_draw_frame(region)
5053 cr = drawing_context.get_cairo_context()
5054 widget.draw(cr)
5055 window.end_draw_frame(drawing_context)
50545056 self.rect = None
50555057
50565058 def crop_image_button_release(self, widget, event):