index ee6741d20aad10b8f2a313112d7ab489958a0529..683c4f83d45fe859bf13c04a16dd19f9ea7f0c9f 100644 (file)
#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-matrix.h"
#include "libnr/nr-pixblock.h"
FilterOffset::~FilterOffset()
{}
-int FilterOffset::render(FilterSlot &slot, Matrix const &trans) {
+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;
+ Matrix trans = units.get_matrix_primitiveunits2pb();
Point offset(dx, dy);
offset *= trans;
offset[X] -= trans[4];
offset[X] -= trans[4];
offset[Y] -= trans[5];
- area.x0 -= static_cast<NR::ICoord>(offset[X]);
- area.x1 -= static_cast<NR::ICoord>(offset[X]);
- area.y0 -= static_cast<NR::ICoord>(offset[Y]);
- area.y1 -= static_cast<NR::ICoord>(offset[Y]);
+ if (offset[X] > 0) {
+ area.x0 -= static_cast<NR::ICoord>(offset[X]);
+ } else {
+ area.x1 -= static_cast<NR::ICoord>(offset[X]);
+ }
+
+ if (offset[Y] > 0) {
+ area.y0 -= static_cast<NR::ICoord>(offset[Y]);
+ } else {
+ area.y1 -= static_cast<NR::ICoord>(offset[Y]);
+ }
}
} /* namespace NR */