Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/ImageView.py
diff options
context:
space:
mode:
Diffstat (limited to 'ImageView.py')
-rw-r--r--ImageView.py51
1 files changed, 40 insertions, 11 deletions
diff --git a/ImageView.py b/ImageView.py
index 2785337..7ec9a41 100644
--- a/ImageView.py
+++ b/ImageView.py
@@ -66,6 +66,10 @@ class ImageViewer(Gtk.DrawingArea):
self.connect('draw', self.__draw_cb)
self.angle = 0
+ self._zoom_ori = 1.0
+ self._angle_ori = 0.0
+ self._fast = True
+ self._redraw_id = None
def do_get_property(self, pspec):
if pspec.name == 'zoom':
@@ -97,12 +101,12 @@ class ImageViewer(Gtk.DrawingArea):
def __draw_cb(self, widget, ctx):
timeini = time.time()
- logging.debug('ImageViewer.draw start')
+ logging.error('ImageViewer.draw start')
if self.surface is None:
if self.file_location is None:
return
-
+ logging.error('init surface with image')
# http://cairographics.org/gdkpixbufpycairo/
pixbuf = GdkPixbuf.Pixbuf.new_from_file(self.file_location)
self.surface = ctx.get_target().create_similar(
@@ -116,17 +120,19 @@ class ImageViewer(Gtk.DrawingArea):
w = int(self.surface.get_width() * self.zoom)
h = int(self.surface.get_height() * self.zoom)
- logging.debug('W: %s, H: %s', w, h)
+ logging.error('W: %s, H: %s', w, h)
ctx.save()
+ if self._fast:
+ ctx.set_antialias(cairo.ANTIALIAS_NONE)
if self.angle != 0:
- logging.debug('Rotating: %s', -self.angle)
+ logging.error('Rotating: %s', self.angle)
ctx.translate(0.5 * w, 0.5 * h)
- ctx.rotate(-self.angle)
+ ctx.rotate(self.angle)
ctx.translate(-0.5 * w, -0.5 * h)
if self.zoom != 1:
- logging.debug('Scaling: %s', self.zoom)
+ logging.error('Scaling: %s', self.zoom)
ctx.scale(self.zoom, self.zoom)
rect = self.get_allocation()
@@ -140,13 +146,37 @@ class ImageViewer(Gtk.DrawingArea):
y = int((rect.height - h) / 2)
ctx.set_source_surface(self.surface, x, y)
+ if self._fast:
+ ctx.get_source().set_filter(cairo.FILTER_NEAREST)
ctx.paint()
- logging.debug('ImageViewer.draw end %f', (time.time() - timeini))
+ logging.error('ImageViewer.draw end %f', (time.time() - timeini))
+
+ if not self._fast:
+ if self._redraw_id is not None:
+ GObject.source_remove(self._redraw_id)
+ self._redraw_id = GObject.timeout_add(200,
+ self._redraw_high_quality)
+
+ def _redraw_high_quality(self):
+ self._fast = False
+ self._redraw_id = None
+ self.queue_draw()
+ return False
def set_zoom(self, zoom):
self._optimal_zoom_flag = False
self._set_zoom(zoom)
+ def set_zoom_relative(self, scale):
+ if scale == 1.0:
+ self._zoom_ori = self.zoom
+ self._set_zoom(self._zoom_ori * scale)
+
+ def set_angle_relative(self, diff):
+ if diff == 0.0:
+ self._angle_ori = self.angle
+ self.set_angle(self._angle_ori + diff)
+
def set_angle(self, angle):
self._optimal_zoom_flag = True
@@ -210,13 +240,12 @@ class ImageViewer(Gtk.DrawingArea):
def _set_zoom(self, zoom):
self.zoom = zoom
-
- # README: this is a hack to not raise the 'draw' event (again)
- # when we request more space to show the scroll bars
+# # README: this is a hack to not raise the 'draw' event (again)
+# # when we request more space to show the scroll bars
+ self._fast = True
w = int(self.surface.get_width() * self.zoom)
h = int(self.surface.get_height() * self.zoom)
self.set_size_request(w, h)
- # self.queue_draw()
self.emit('zoom-changed')