diff options
| author | Krzysztof Kosi??ski <tweenk.pl@gmail.com> | 2010-07-14 22:11:18 +0000 |
|---|---|---|
| committer | Krzysztof KosiĆski <tweenk.pl@gmail.com> | 2010-07-14 22:11:18 +0000 |
| commit | 3aad4454df3d57a6c45496c701421b18e4c3aa81 (patch) | |
| tree | 7b70c6360d09b70cc14e9b1322661215c55c4eab /src | |
| parent | Flood and merge filters (diff) | |
| download | inkscape-3aad4454df3d57a6c45496c701421b18e4c3aa81.tar.gz inkscape-3aad4454df3d57a6c45496c701421b18e4c3aa81.zip | |
Offset filter
(bzr r9508.1.18)
Diffstat (limited to 'src')
| -rw-r--r-- | src/display/nr-filter-blend.cpp | 1 | ||||
| -rw-r--r-- | src/display/nr-filter-offset.cpp | 47 | ||||
| -rw-r--r-- | src/display/nr-filter-offset.h | 3 |
3 files changed, 22 insertions, 29 deletions
diff --git a/src/display/nr-filter-blend.cpp b/src/display/nr-filter-blend.cpp index 758b49fe4..8a1cfa6f4 100644 --- a/src/display/nr-filter-blend.cpp +++ b/src/display/nr-filter-blend.cpp @@ -159,6 +159,7 @@ void surface_blend(cairo_surface_t *in1, cairo_surface_t *in2, cairo_surface_t * // WARNING: code below assumes that: // 1. Cairo ARGB32 surface strides are always divisible by 4 // 2. We can only receive CAIRO_FORMAT_ARGB32 or CAIRO_FORMAT_A8 surfaces + // 3. Both surfaces are of the same size int w = cairo_image_surface_get_width(in2); int h = cairo_image_surface_get_height(in2); diff --git a/src/display/nr-filter-offset.cpp b/src/display/nr-filter-offset.cpp index fd4f55053..b44c5fac7 100644 --- a/src/display/nr-filter-offset.cpp +++ b/src/display/nr-filter-offset.cpp @@ -9,11 +9,10 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ +#include "display/cairo-utils.h" #include "display/nr-filter-offset.h" #include "display/nr-filter-slot.h" #include "display/nr-filter-units.h" -#include "libnr/nr-blit.h" -#include "libnr/nr-pixblock.h" #include "libnr/nr-rect-l.h" namespace Inkscape { @@ -33,37 +32,29 @@ FilterPrimitive * FilterOffset::create() { FilterOffset::~FilterOffset() {} -int FilterOffset::render(FilterSlot &slot, FilterUnits const &units) { - NRPixBlock *in = slot.get(_input); - // Bail out if source image is missing - if (!in) { - g_warning("Missing source image for feOffset (in=%d)", _input); - return 1; - } - - NRPixBlock *out = new NRPixBlock; +void FilterOffset::render_cairo(FilterSlot &slot) +{ + cairo_surface_t *in = slot.getcairo(_input); + cairo_surface_t *out = ink_cairo_surface_create_identical(in); + cairo_t *ct = cairo_create(out); - Geom::Matrix trans = units.get_matrix_primitiveunits2pb(); + Geom::Matrix trans = slot.get_units().get_matrix_primitiveunits2pb(); Geom::Point offset(dx, dy); offset *= trans; offset[X] -= trans[4]; offset[Y] -= trans[5]; - nr_pixblock_setup_fast(out, in->mode, - in->area.x0, in->area.y0, in->area.x1, in->area.y1, - true); - nr_blit_pixblock_pixblock(out, in); + cairo_set_source_surface(ct, in, offset[X], offset[Y]); + cairo_paint(ct); + cairo_destroy(ct); - out->area.x0 += static_cast<NR::ICoord>(offset[X]); - out->area.y0 += static_cast<NR::ICoord>(offset[Y]); - out->area.x1 += static_cast<NR::ICoord>(offset[X]); - out->area.y1 += static_cast<NR::ICoord>(offset[Y]); - out->visible_area = out->area; - - out->empty = FALSE; slot.set(_output, out); + cairo_surface_destroy(out); +} - return 0; +bool FilterOffset::can_handle_affine(Geom::Matrix const &) +{ + return true; } void FilterOffset::set_dx(double amount) { @@ -82,15 +73,15 @@ void FilterOffset::area_enlarge(NRRectL &area, Geom::Matrix const &trans) offset[Y] -= trans[5]; if (offset[X] > 0) { - area.x0 -= static_cast<NR::ICoord>(offset[X]); + area.x0 -= ceil(offset[X]); } else { - area.x1 -= static_cast<NR::ICoord>(offset[X]); + area.x1 -= floor(offset[X]); } if (offset[Y] > 0) { - area.y0 -= static_cast<NR::ICoord>(offset[Y]); + area.y0 -= ceil(offset[Y]); } else { - area.y1 -= static_cast<NR::ICoord>(offset[Y]); + area.y1 -= floor(offset[Y]); } } diff --git a/src/display/nr-filter-offset.h b/src/display/nr-filter-offset.h index b00ad25fe..8404aa3d9 100644 --- a/src/display/nr-filter-offset.h +++ b/src/display/nr-filter-offset.h @@ -26,8 +26,9 @@ public: static FilterPrimitive *create(); virtual ~FilterOffset(); - virtual int render(FilterSlot &slot, FilterUnits const &units); + virtual void render_cairo(FilterSlot &slot); virtual void area_enlarge(NRRectL &area, Geom::Matrix const &trans); + virtual bool can_handle_affine(Geom::Matrix const &); void set_dx(double amount); void set_dy(double amount); |
