b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues/*
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues * feComponentTransfer filter primitive renderer
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues *
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues * Authors:
5ef6cb9428f2e6f5457e890a1c3b37f53730c07aFelipe C. da S. Sanches * Felipe Corrêa da Silva Sanches <juca@members.fsf.org>
5e5e1f6c598e7ee29846563874900ae3d0810149jaspervdg * Jasper van de Gronde <th.v.d.gronde@hccnet.nl>
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues *
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues * Copyright (C) 2007 authors
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues *
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues * Released under GNU GPL, read the file 'COPYING' for more information
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues */
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues
0cc082e09c2ce5f515a90ce45a6a440c11150dc6JucaBlues#include <math.h>
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński#include "display/cairo-templates.h"
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński#include "display/cairo-utils.h"
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński#include "display/nr-filter-component-transfer.h"
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński#include "display/nr-filter-slot.h"
a415d1eef0dc633042c80f242723c2aaf137ba7ajucablues
d9a7c806ee7f408ddb61ff4f233c9d96111ee2b5johanengelennamespace Inkscape {
d9a7c806ee7f408ddb61ff4f233c9d96111ee2b5johanengelennamespace Filters {
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucabluesFilterComponentTransfer::FilterComponentTransfer()
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues{
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues}
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucabluesFilterPrimitive * FilterComponentTransfer::create() {
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues return new FilterComponentTransfer();
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues}
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucabluesFilterComponentTransfer::~FilterComponentTransfer()
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues{}
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-freestruct UnmultiplyAlpha {
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free guint32 operator()(guint32 in) {
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free EXTRACT_ARGB32(in, a, r, g, b);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free if (a == 0 )
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free return in;
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free r = unpremul_alpha(r, a);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free g = unpremul_alpha(g, a);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free b = unpremul_alpha(b, a);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free ASSEMBLE_ARGB32(out, a, r, g, b);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free return out;
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free }
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free};
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-freestruct MultiplyAlpha {
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free guint32 operator()(guint32 in) {
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free EXTRACT_ARGB32(in, a, r, g, b);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free if (a == 0 )
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free return in;
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free r = premul_alpha(r, a);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free g = premul_alpha(g, a);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free b = premul_alpha(b, a);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free ASSEMBLE_ARGB32(out, a, r, g, b);
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free return out;
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free }
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free};
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosińskistruct ComponentTransfer {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński ComponentTransfer(guint32 color)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński : _shift(color * 8)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński , _mask(0xff << _shift)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński {}
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosińskiprotected:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 _shift;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 _mask;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński};
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-freestruct ComponentTransferTable : public ComponentTransfer {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński ComponentTransferTable(guint32 color, std::vector<double> const &values)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński : ComponentTransfer(color)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński , _v(values.size())
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński for (unsigned i = 0; i< values.size(); ++i) {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński _v[i] = round(CLAMP(values[i], 0.0, 1.0) * 255);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 operator()(guint32 in) {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 component = (in & _mask) >> _shift;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 k = (_v.size() - 1) * component;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 dx = k % 255; k /= 255;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński component = _v[k]*255 + (_v[k+1] - _v[k])*dx;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński component = (component + 127) / 255;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński return (in & ~_mask) | (component << _shift);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosińskiprivate:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński std::vector<guint32> _v;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński};
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-freestruct ComponentTransferDiscrete : public ComponentTransfer {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński ComponentTransferDiscrete(guint32 color, std::vector<double> const &values)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński : ComponentTransfer(color)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński , _v(values.size())
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński for (unsigned i = 0; i< values.size(); ++i) {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński _v[i] = round(CLAMP(values[i], 0.0, 1.0) * 255);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 operator()(guint32 in) {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 component = (in & _mask) >> _shift;
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free guint32 k = (_v.size()) * component / 255;
d8f377e5fcfa6a77c7d207d395f6ed50b1ae9ee6tavmjong-free if( k == _v.size() ) --k;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński component = _v[k];
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free return (in & ~_mask) | ((guint32)component << _shift);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosińskiprivate:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński std::vector<guint32> _v;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński};
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-freestruct ComponentTransferLinear : public ComponentTransfer {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński ComponentTransferLinear(guint32 color, double intercept, double slope)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński : ComponentTransfer(color)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński , _intercept(round(intercept*255*255))
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński , _slope(round(slope*255))
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński {}
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 operator()(guint32 in) {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński gint32 component = (in & _mask) >> _shift;
0cc082e09c2ce5f515a90ce45a6a440c11150dc6JucaBlues
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński // TODO: this can probably be reduced to something simpler
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński component = pxclamp(_slope * component + _intercept, 0, 255*255);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński component = (component + 127) / 255;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński return (in & ~_mask) | (component << _shift);
b0fc1b5cad067af61ffdc6ff82667bfea7ef3f77kiirala }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosińskiprivate:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński gint32 _intercept;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński gint32 _slope;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński};
b0fc1b5cad067af61ffdc6ff82667bfea7ef3f77kiirala
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-freestruct ComponentTransferGamma : public ComponentTransfer {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński ComponentTransferGamma(guint32 color, double amplitude, double exponent, double offset)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński : ComponentTransfer(color)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński , _amplitude(amplitude)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński , _exponent(exponent)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński , _offset(offset)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński {}
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 operator()(guint32 in) {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński double component = (in & _mask) >> _shift;
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free component /= 255.0;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński component = _amplitude * pow(component, _exponent) + _offset;
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free guint32 cpx = pxclamp(component * 255.0, 0, 255);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński return (in & ~_mask) | (cpx << _shift);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosińskiprivate:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński double _amplitude;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński double _exponent;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński double _offset;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński};
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosińskivoid FilterComponentTransfer::render_cairo(FilterSlot &slot)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński{
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński cairo_surface_t *input = slot.getcairo(_input);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński cairo_surface_t *out = ink_cairo_surface_create_same_size(input, CAIRO_CONTENT_COLOR_ALPHA);
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free // We may need to transform input surface to correct color interpolation space. The input surface
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free // might be used as input to another primitive but it is likely that all the primitives in a given
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free // filter use the same color interpolation space so we don't copy the input before converting.
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free SPColorInterpolation ci_fp = SP_CSS_COLOR_INTERPOLATION_AUTO;
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free if( _style ) {
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free ci_fp = (SPColorInterpolation)_style->color_interpolation_filters.computed;
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free set_cairo_surface_ci(out, ci_fp );
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free }
6d8f5d4d0168d3966402ec5794ec4e0ae220f526tavmjong-free set_cairo_surface_ci( input, ci_fp );
9f6f7e74a1ded383518676e0ecb2ccc5caa73d25tavmjong-free
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński //cairo_surface_t *outtemp = ink_cairo_surface_create_identical(out);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński ink_cairo_surface_blit(input, out);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free // We need to operate on unmultipled by alpha color values otherwise a change in alpha screws
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free // up the premultiplied by alpha r, g, b values.
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free ink_cairo_surface_filter(out, out, UnmultiplyAlpha());
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński // parameters: R = 0, G = 1, B = 2, A = 3
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński // Cairo: R = 2, G = 1, B = 0, A = 3
3c841a7cc2d4432ce4961ae20c6671ef4f7466c8tavmjong-free // If tableValues is empty, use identity.
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free for (unsigned i = 0; i < 4; ++i) {
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński guint32 color = 2 - i;
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free if(i==3) color = 3; // alpha
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński switch (type[i]) {
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński case COMPONENTTRANSFER_TYPE_TABLE:
3c841a7cc2d4432ce4961ae20c6671ef4f7466c8tavmjong-free if(!tableValues[i].empty()) {
3c841a7cc2d4432ce4961ae20c6671ef4f7466c8tavmjong-free ink_cairo_surface_filter(out, out,
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free ComponentTransferTable(color, tableValues[i]));
3c841a7cc2d4432ce4961ae20c6671ef4f7466c8tavmjong-free }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński break;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński case COMPONENTTRANSFER_TYPE_DISCRETE:
3c841a7cc2d4432ce4961ae20c6671ef4f7466c8tavmjong-free if(!tableValues[i].empty()) {
3c841a7cc2d4432ce4961ae20c6671ef4f7466c8tavmjong-free ink_cairo_surface_filter(out, out,
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free ComponentTransferDiscrete(color, tableValues[i]));
3c841a7cc2d4432ce4961ae20c6671ef4f7466c8tavmjong-free }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński break;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński case COMPONENTTRANSFER_TYPE_LINEAR:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński ink_cairo_surface_filter(out, out,
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free ComponentTransferLinear(color, intercept[i], slope[i]));
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński break;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński case COMPONENTTRANSFER_TYPE_GAMMA:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński ink_cairo_surface_filter(out, out,
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free ComponentTransferGamma(color, amplitude[i], exponent[i], offset[i]));
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński break;
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński case COMPONENTTRANSFER_TYPE_ERROR:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński case COMPONENTTRANSFER_TYPE_IDENTITY:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński default:
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński break;
0cc082e09c2ce5f515a90ce45a6a440c11150dc6JucaBlues }
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński //ink_cairo_surface_blit(out, outtemp);
0cc082e09c2ce5f515a90ce45a6a440c11150dc6JucaBlues }
0cc082e09c2ce5f515a90ce45a6a440c11150dc6JucaBlues
77793cdab9411c49c1659b7ba6802cc10d9a7e89tavmjong-free ink_cairo_surface_filter(out, out, MultiplyAlpha());
c6843f4373787d9ec7987e26edaaea04a0996cbfjfbarraud
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues slot.set(_output, out);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński cairo_surface_destroy(out);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński //cairo_surface_destroy(outtemp);
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński}
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński
dff9bb0d25ad38c515c32e2c76a20e747c8eed10Krzysztof Kosińskibool FilterComponentTransfer::can_handle_affine(Geom::Affine const &)
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński{
354e9a1515ed6d7957de6b135670bfb538468351Krzysztof Kosiński return true;
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues}
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues
1cf2607271f83cc4b20ccace552395d793055c90Krzysztof Kosińskidouble FilterComponentTransfer::complexity(Geom::Affine const &)
1cf2607271f83cc4b20ccace552395d793055c90Krzysztof Kosiński{
1cf2607271f83cc4b20ccace552395d793055c90Krzysztof Kosiński return 2.0;
1cf2607271f83cc4b20ccace552395d793055c90Krzysztof Kosiński}
1cf2607271f83cc4b20ccace552395d793055c90Krzysztof Kosiński
d9a7c806ee7f408ddb61ff4f233c9d96111ee2b5johanengelen} /* namespace Filters */
d9a7c806ee7f408ddb61ff4f233c9d96111ee2b5johanengelen} /* namespace Inkscape */
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues/*
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues Local Variables:
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues mode:c++
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues c-file-style:"stroustrup"
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues indent-tabs-mode:nil
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues fill-column:99
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues End:
b3e4991faeba9d490160bb88bf142fe3f28eeefdjucablues*/
a4030d5ca449e7e384bc699cd249ee704faaeab0Chris Morgan// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :