2
* feOffset filter primitive renderer
5
* Niko Kiirala <niko@kiirala.com>
7
* Copyright (C) 2007 authors
9
* Released under GNU GPL, read the file 'COPYING' for more information
12
#include "display/nr-filter-offset.h"
13
#include "display/nr-filter-slot.h"
14
#include "display/nr-filter-units.h"
15
#include "libnr/nr-blit.h"
16
#include "libnr/nr-matrix.h"
17
#include "libnr/nr-pixblock.h"
18
#include "libnr/nr-point.h"
19
#include "libnr/nr-point-matrix-ops.h"
20
#include "libnr/nr-rect-l.h"
24
FilterOffset::FilterOffset() :
28
FilterPrimitive * FilterOffset::create() {
29
return new FilterOffset();
32
FilterOffset::~FilterOffset()
35
int FilterOffset::render(FilterSlot &slot, FilterUnits const &units) {
36
NRPixBlock *in = slot.get(_input);
37
// Bail out if source image is missing
39
g_warning("Missing source image for feOffset (in=%d)", _input);
43
NRPixBlock *out = new NRPixBlock;
45
Matrix trans = units.get_matrix_primitiveunits2pb();
48
offset[X] -= trans[4];
49
offset[Y] -= trans[5];
51
nr_pixblock_setup_fast(out, in->mode,
52
in->area.x0, in->area.y0, in->area.x1, in->area.y1,
54
nr_blit_pixblock_pixblock(out, in);
56
out->area.x0 += static_cast<NR::ICoord>(offset[X]);
57
out->area.y0 += static_cast<NR::ICoord>(offset[Y]);
58
out->area.x1 += static_cast<NR::ICoord>(offset[X]);
59
out->area.y1 += static_cast<NR::ICoord>(offset[Y]);
60
out->visible_area = out->area;
63
slot.set(_output, out);
68
void FilterOffset::set_dx(double amount) {
72
void FilterOffset::set_dy(double amount) {
76
void FilterOffset::area_enlarge(NRRectL &area, Matrix const &trans)
80
offset[X] -= trans[4];
81
offset[Y] -= trans[5];
84
area.x0 -= static_cast<NR::ICoord>(offset[X]);
86
area.x1 -= static_cast<NR::ICoord>(offset[X]);
90
area.y0 -= static_cast<NR::ICoord>(offset[Y]);
92
area.y1 -= static_cast<NR::ICoord>(offset[Y]);
101
c-file-style:"stroustrup"
102
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
107
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :