1 /*
2 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * aint with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20 #include "config.h"
21
22 #if ENABLE(SVG) && ENABLE(FILTERS)
23 #include "SVGFilter.h"
24
25 namespace WebCore {
26
SVGFilter(const FloatRect & itemBox,const FloatRect & filterRect,bool effectBBoxMode)27 SVGFilter::SVGFilter(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode)
28 : Filter()
29 , m_itemBox(itemBox)
30 , m_filterRect(filterRect)
31 , m_effectBBoxMode(effectBBoxMode)
32 {
33 }
34
calculateEffectSubRegion(FilterEffect * effect)35 void SVGFilter::calculateEffectSubRegion(FilterEffect* effect)
36 {
37 FloatRect subRegionBBox = effect->effectBoundaries();
38 FloatRect useBBox = effect->unionOfChildEffectSubregions();
39 FloatRect newSubRegion = subRegionBBox;
40
41 if (m_effectBBoxMode) {
42 newSubRegion = useBBox;
43
44 if (effect->hasX())
45 newSubRegion.setX(m_itemBox.x() + subRegionBBox.x() * m_itemBox.width());
46
47 if (effect->hasY())
48 newSubRegion.setY(m_itemBox.y() + subRegionBBox.y() * m_itemBox.height());
49
50 if (effect->hasWidth())
51 newSubRegion.setWidth(subRegionBBox.width() * m_itemBox.width());
52
53 if (effect->hasHeight())
54 newSubRegion.setHeight(subRegionBBox.height() * m_itemBox.height());
55 } else {
56 if (!effect->hasX())
57 newSubRegion.setX(useBBox.x());
58
59 if (!effect->hasY())
60 newSubRegion.setY(useBBox.y());
61
62 if (!effect->hasWidth())
63 newSubRegion.setWidth(useBBox.width());
64
65 if (!effect->hasHeight())
66 newSubRegion.setHeight(useBBox.height());
67 }
68
69 // clip every filter effect to the filter region
70 newSubRegion.intersect(m_filterRect);
71
72 effect->setSubRegion(newSubRegion);
73 newSubRegion.scale(filterResolution().width(), filterResolution().height());
74 effect->setScaledSubRegion(newSubRegion);
75 m_maxImageSize = m_maxImageSize.expandedTo(newSubRegion.size());
76 }
77
create(const FloatRect & itemBox,const FloatRect & filterRect,bool effectBBoxMode)78 PassRefPtr<SVGFilter> SVGFilter::create(const FloatRect& itemBox, const FloatRect& filterRect, bool effectBBoxMode)
79 {
80 return adoptRef(new SVGFilter(itemBox, filterRect, effectBBoxMode));
81 }
82
83 } // namespace WebCore
84
85 #endif // ENABLE(SVG) && ENABLE(FILTERS)
86