2
* feMorphology filter primitive renderer
5
* Felipe Corrêa da Silva Sanches <felipe.sanches@gmail.com>
7
* Copyright (C) 2007 authors
9
* Released under GNU GPL, read the file 'COPYING' for more information
12
#include "display/nr-filter-morphology.h"
13
#include "display/nr-filter-units.h"
17
FilterMorphology::FilterMorphology()
21
FilterPrimitive * FilterMorphology::create() {
22
return new FilterMorphology();
25
FilterMorphology::~FilterMorphology()
28
int FilterMorphology::render(FilterSlot &slot, FilterUnits const &/*units*/) {
29
NRPixBlock *in = slot.get(_input);
31
g_warning("Missing source image for feMorphology (in=%d)", _input);
35
NRPixBlock *out = new NRPixBlock;
43
int rmax,gmax,bmax,amax;
44
int rmin,gmin,bmin,amin;
46
nr_pixblock_setup_fast(out, in->mode, x0, y0, x1, y1, true);
48
unsigned char *in_data = NR_PIXBLOCK_PX(in);
49
unsigned char *out_data = NR_PIXBLOCK_PX(out);
51
for(x=xradius; x<w-xradius; x++){
52
for(y=yradius; y<h-yradius; y++){
53
rmin=rmax=in_data[4*(x + w*y)];
54
gmin=gmax=in_data[4*(x + w*y)+1];
55
bmin=bmax=in_data[4*(x + w*y)+2];
56
amin=amax=in_data[4*(x + w*y)+3];
57
for(i=x-xradius;i<x+xradius;i++){
58
for(j=y-yradius;j<y+yradius;j++){
59
if(in_data[4*(i + w*j)]>rmax) rmax = in_data[4*(i + w*j)];
60
if(in_data[4*(i + w*j)+1]>gmax) gmax = in_data[4*(i + w*j)+1];
61
if(in_data[4*(i + w*j)+2]>bmax) bmax = in_data[4*(i + w*j)+2];
62
if(in_data[4*(i + w*j)+3]>amax) amax = in_data[4*(i + w*j)+3];
64
if(in_data[4*(i + w*j)]<rmin) rmin = in_data[4*(i + w*j)];
65
if(in_data[4*(i + w*j)+1]<gmin) gmin = in_data[4*(i + w*j)+1];
66
if(in_data[4*(i + w*j)+2]<bmin) bmin = in_data[4*(i + w*j)+2];
67
if(in_data[4*(i + w*j)+3]<amin) amin = in_data[4*(i + w*j)+3];
70
if (Operator==MORPHOLOGY_OPERATOR_DILATE){
71
out_data[4*(x + w*y)]=rmax;
72
out_data[4*(x + w*y)+1]=gmax;
73
out_data[4*(x + w*y)+2]=bmax;
74
out_data[4*(x + w*y)+3]=amax;
76
out_data[4*(x + w*y)]=rmin;
77
out_data[4*(x + w*y)+1]=gmin;
78
out_data[4*(x + w*y)+2]=bmin;
79
out_data[4*(x + w*y)+3]=amin;
85
slot.set(_output, out);
89
void FilterMorphology::area_enlarge(NRRectL &area, Matrix const &/*trans*/)
97
void FilterMorphology::set_operator(FilterMorphologyOperator &o){
101
void FilterMorphology::set_xradius(int x){
105
void FilterMorphology::set_yradius(int y){
109
FilterTraits FilterMorphology::get_input_traits() {
110
return TRAIT_PARALLER;
118
c-file-style:"stroustrup"
119
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
124
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :