summaryrefslogtreecommitdiffstats
path: root/src/dialogs
diff options
context:
space:
mode:
authorJon A. Cruz <jon@joncruz.org>2009-02-18 08:56:07 +0000
committerjoncruz <joncruz@users.sourceforge.net>2009-02-18 08:56:07 +0000
commitbc2ef24b8f59abc29117dd7430e8b20eb3712318 (patch)
treee35f7257da376fefafd4415c6cb4ca877c963ba7 /src/dialogs
parentWarning cleanup. (diff)
downloadinkscape-bc2ef24b8f59abc29117dd7430e8b20eb3712318.tar.gz
inkscape-bc2ef24b8f59abc29117dd7430e8b20eb3712318.zip
Scale preview pixmap as needed and cache scaled version.
(bzr r7318)
Diffstat (limited to 'src/dialogs')
-rw-r--r--src/dialogs/eek-preview.cpp22
-rw-r--r--src/dialogs/eek-preview.h3
2 files changed, 24 insertions, 1 deletions
diff --git a/src/dialogs/eek-preview.cpp b/src/dialogs/eek-preview.cpp
index e0d0fb4e2..1c1adf543 100644
--- a/src/dialogs/eek-preview.cpp
+++ b/src/dialogs/eek-preview.cpp
@@ -73,6 +73,13 @@ void eek_preview_set_pixbuf( EekPreview* preview, GdkPixbuf* pixbuf )
preview->_previewPixbuf = pixbuf;
gtk_widget_queue_draw(GTK_WIDGET(preview));
+
+ if (preview->_scaled) {
+ g_object_unref(preview->_scaled);
+ preview->_scaled = 0;
+ }
+ preview->_scaledW = gdk_pixbuf_get_width(preview->_previewPixbuf);
+ preview->_scaledH = gdk_pixbuf_get_height(preview->_previewPixbuf);
}
@@ -320,7 +327,17 @@ gboolean eek_preview_expose_event( GtkWidget* widget, GdkEventExpose* event )
gint w = 0;
gint h = 0;
gdk_drawable_get_size(drawable, &w, &h);
- gdk_draw_pixbuf( drawable, 0, preview->_previewPixbuf, 0, 0, 0, 0, w, h, GDK_RGB_DITHER_NONE, 0, 0 );
+ if ((w != preview->_scaledW) || (h != preview->_scaledH)) {
+ if (preview->_scaled) {
+ g_object_unref(preview->_scaled);
+ }
+ preview->_scaled = gdk_pixbuf_scale_simple(preview->_previewPixbuf, w, h, GDK_INTERP_BILINEAR);
+ preview->_scaledW = w;
+ preview->_scaledH = h;
+ }
+
+ GdkPixbuf* pix = (preview->_scaled) ? preview->_scaled : preview->_previewPixbuf;
+ gdk_draw_pixbuf( drawable, 0, pix, 0, 0, 0, 0, w, h, GDK_RGB_DITHER_NONE, 0, 0 );
}
@@ -647,6 +664,8 @@ static void eek_preview_init( EekPreview *preview )
preview->_r = 0x80;
preview->_g = 0x80;
preview->_b = 0xcc;
+ preview->_scaledW = 0;
+ preview->_scaledH = 0;
preview->_hot = FALSE;
preview->_within = FALSE;
@@ -658,6 +677,7 @@ static void eek_preview_init( EekPreview *preview )
preview->_ratio = 100;
preview->_previewPixbuf = 0;
+ preview->_scaled = 0;
/*
GdkColor color = {0};
diff --git a/src/dialogs/eek-preview.h b/src/dialogs/eek-preview.h
index e4d935ae9..6eb5c8930 100644
--- a/src/dialogs/eek-preview.h
+++ b/src/dialogs/eek-preview.h
@@ -97,6 +97,8 @@ struct _EekPreview
int _r;
int _g;
int _b;
+ int _scaledW;
+ int _scaledH;
gboolean _hot;
gboolean _within;
@@ -108,6 +110,7 @@ struct _EekPreview
guint _ratio;
guint _linked;
GdkPixbuf* _previewPixbuf;
+ GdkPixbuf* _scaled;
};
struct _EekPreviewClass