From 2f5eafec8d66d018d760b85a829c1d4ba1b0ed6d Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Wed, 7 Jul 2010 19:21:03 +0200 Subject: Switch to nearest neighbor filtering when image is larger than original (bzr r9508.1.12) --- src/display/cairo-utils.cpp | 14 ++++++++++++++ src/display/cairo-utils.h | 1 + src/display/nr-arena-image.cpp | 5 +++++ 3 files changed, 20 insertions(+) (limited to 'src') 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); -- cgit v1.2.3