summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-07-14 22:11:18 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-07-14 22:11:18 +0000
commit3aad4454df3d57a6c45496c701421b18e4c3aa81 (patch)
tree7b70c6360d09b70cc14e9b1322661215c55c4eab /src
parentFlood and merge filters (diff)
downloadinkscape-3aad4454df3d57a6c45496c701421b18e4c3aa81.tar.gz
inkscape-3aad4454df3d57a6c45496c701421b18e4c3aa81.zip
Offset filter
(bzr r9508.1.18)
Diffstat (limited to 'src')
-rw-r--r--src/display/nr-filter-blend.cpp1
-rw-r--r--src/display/nr-filter-offset.cpp47
-rw-r--r--src/display/nr-filter-offset.h3
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);