diff options
| author | Krzysztof Kosi??ski <tweenk.pl@gmail.com> | 2010-07-07 17:21:03 +0000 |
|---|---|---|
| committer | Krzysztof KosiĆski <tweenk.pl@gmail.com> | 2010-07-07 17:21:03 +0000 |
| commit | 2f5eafec8d66d018d760b85a829c1d4ba1b0ed6d (patch) | |
| tree | 271bd139e254192743f02b6686aa33ee39e8c2a7 /src/display | |
| parent | Smaller intermediate rendering regions (diff) | |
| download | inkscape-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.cpp | 14 | ||||
| -rw-r--r-- | src/display/cairo-utils.h | 1 | ||||
| -rw-r--r-- | src/display/nr-arena-image.cpp | 5 |
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); |
