summaryrefslogtreecommitdiffstats
path: root/src/display
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-07-07 17:21:03 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-07-07 17:21:03 +0000
commit2f5eafec8d66d018d760b85a829c1d4ba1b0ed6d (patch)
tree271bd139e254192743f02b6686aa33ee39e8c2a7 /src/display
parentSmaller intermediate rendering regions (diff)
downloadinkscape-2f5eafec8d66d018d760b85a829c1d4ba1b0ed6d.tar.gz
inkscape-2f5eafec8d66d018d760b85a829c1d4ba1b0ed6d.zip
Switch to nearest neighbor filtering when image is larger than original
(bzr r9508.1.12)
Diffstat (limited to 'src/display')
-rw-r--r--src/display/cairo-utils.cpp14
-rw-r--r--src/display/cairo-utils.h1
-rw-r--r--src/display/nr-arena-image.cpp5
3 files changed, 20 insertions, 0 deletions
diff --git a/src/display/cairo-utils.cpp b/src/display/cairo-utils.cpp
index 8aaf838ed..bb401dc87 100644
--- a/src/display/cairo-utils.cpp
+++ b/src/display/cairo-utils.cpp
@@ -315,6 +315,20 @@ ink_cairo_pattern_set_matrix(cairo_pattern_t *cp, Geom::Matrix const &m)
cairo_pattern_set_matrix(cp, &cm);
}
+void
+ink_cairo_set_source_argb32_pixbuf(cairo_t *ct, GdkPixbuf *pb, double x, double y)
+{
+ guchar *data = gdk_pixbuf_get_pixels(pb);
+ int w = gdk_pixbuf_get_width(pb);
+ int h = gdk_pixbuf_get_height(pb);
+ int stride = gdk_pixbuf_get_rowstride(pb);
+
+ cairo_surface_t *pbs = cairo_image_surface_create_for_data(
+ data, CAIRO_FORMAT_ARGB32, w, h, stride);
+ cairo_set_source_surface(ct, pbs, x, y);
+ cairo_surface_destroy(pbs);
+}
+
// taken from Cairo sources
static inline guint32 premul_alpha(guint32 color, guint32 alpha)
{
diff --git a/src/display/cairo-utils.h b/src/display/cairo-utils.h
index 882742d5f..096dc6046 100644
--- a/src/display/cairo-utils.h
+++ b/src/display/cairo-utils.h
@@ -82,6 +82,7 @@ void ink_cairo_set_source_color(cairo_t *ct, SPColor const &color, double opacit
void ink_cairo_set_source_rgba32(cairo_t *ct, guint32 rgba);
void ink_cairo_transform(cairo_t *ct, Geom::Matrix const &m);
void ink_cairo_pattern_set_matrix(cairo_pattern_t *cp, Geom::Matrix const &m);
+void ink_cairo_set_source_argb32_pixbuf(cairo_t *ct, GdkPixbuf *pb, double x, double y);
void convert_pixels_pixbuf_to_argb32(guchar *data, int w, int h, int rs);
void convert_pixels_argb32_to_pixbuf(guchar *data, int w, int h, int rs);
diff --git a/src/display/nr-arena-image.cpp b/src/display/nr-arena-image.cpp
index f198b176b..325cff65a 100644
--- a/src/display/nr-arena-image.cpp
+++ b/src/display/nr-arena-image.cpp
@@ -197,6 +197,11 @@ nr_arena_image_render( cairo_t *ct, NRArenaItem *item, NRRectL *area, NRPixBlock
cairo_pattern_t *p = cairo_get_source(ct);
ink_cairo_pattern_set_matrix(p, image->grid2px);
+ Geom::Matrix total = item->ctm * image->grid2px.inverse();
+ if (total.expansionX() > 1.0 || total.expansionY() > 1.0) {
+ cairo_pattern_set_filter(p, CAIRO_FILTER_NEAREST);
+ }
+
cairo_paint_with_alpha(ct, ((double) item->opacity) / 255.0);
cairo_restore(ct);