OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> |
3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> |
4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org> | 4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org> |
5 * Copyright (C) 2010 Dirk Schulze <krit@webkit.org> | 5 * Copyright (C) 2010 Dirk Schulze <krit@webkit.org> |
6 * Copyright (C) 2013 Google Inc. All rights reserved. | 6 * Copyright (C) 2013 Google Inc. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "core/platform/graphics/GraphicsContext.h" | 29 #include "core/platform/graphics/GraphicsContext.h" |
30 #include "core/platform/graphics/filters/Filter.h" | 30 #include "core/platform/graphics/filters/Filter.h" |
31 #include "core/platform/graphics/transforms/AffineTransform.h" | 31 #include "core/platform/graphics/transforms/AffineTransform.h" |
32 #include "core/platform/text/TextStream.h" | 32 #include "core/platform/text/TextStream.h" |
33 #include "core/rendering/RenderObject.h" | 33 #include "core/rendering/RenderObject.h" |
34 #include "core/rendering/RenderTreeAsText.h" | 34 #include "core/rendering/RenderTreeAsText.h" |
35 #include "core/rendering/svg/SVGRenderingContext.h" | 35 #include "core/rendering/svg/SVGRenderingContext.h" |
36 #include "core/svg/SVGPreserveAspectRatio.h" | 36 #include "core/svg/SVGPreserveAspectRatio.h" |
37 #include "core/svg/SVGStyledElement.h" | 37 #include "core/svg/SVGStyledElement.h" |
38 #include "core/svg/SVGURIReference.h" | 38 #include "core/svg/SVGURIReference.h" |
39 #include "core/svg/graphics/filters/SVGFilter.h" | |
40 | 39 |
41 namespace WebCore { | 40 namespace WebCore { |
42 | 41 |
43 FEImage::FEImage(Filter* filter, PassRefPtr<Image> image, const SVGPreserveAspec
tRatio& preserveAspectRatio) | 42 FEImage::FEImage(Filter* filter, PassRefPtr<Image> image, const SVGPreserveAspec
tRatio& preserveAspectRatio) |
44 : FilterEffect(filter) | 43 : FilterEffect(filter) |
45 , m_image(image) | 44 , m_image(image) |
46 , m_document(0) | 45 , m_document(0) |
47 , m_preserveAspectRatio(preserveAspectRatio) | 46 , m_preserveAspectRatio(preserveAspectRatio) |
48 { | 47 { |
49 } | 48 } |
(...skipping 11 matching lines...) Expand all Loading... |
61 return adoptRef(new FEImage(filter, image, preserveAspectRatio)); | 60 return adoptRef(new FEImage(filter, image, preserveAspectRatio)); |
62 } | 61 } |
63 | 62 |
64 PassRefPtr<FEImage> FEImage::createWithIRIReference(Filter* filter, Document* do
cument, const String& href, const SVGPreserveAspectRatio& preserveAspectRatio) | 63 PassRefPtr<FEImage> FEImage::createWithIRIReference(Filter* filter, Document* do
cument, const String& href, const SVGPreserveAspectRatio& preserveAspectRatio) |
65 { | 64 { |
66 return adoptRef(new FEImage(filter, document, href, preserveAspectRatio)); | 65 return adoptRef(new FEImage(filter, document, href, preserveAspectRatio)); |
67 } | 66 } |
68 | 67 |
69 void FEImage::determineAbsolutePaintRect() | 68 void FEImage::determineAbsolutePaintRect() |
70 { | 69 { |
71 SVGFilter* svgFilter = static_cast<SVGFilter*>(filter()); | 70 FloatRect paintRect = filter()->absoluteTransform().mapRect(filterPrimitiveS
ubregion()); |
72 | |
73 FloatRect paintRect = svgFilter->absoluteTransform().mapRect(filterPrimitive
Subregion()); | |
74 FloatRect srcRect; | 71 FloatRect srcRect; |
75 if (m_image) { | 72 if (m_image) { |
76 srcRect.setSize(m_image->size()); | 73 srcRect.setSize(m_image->size()); |
77 m_preserveAspectRatio.transformRect(paintRect, srcRect); | 74 m_preserveAspectRatio.transformRect(paintRect, srcRect); |
78 } else if (RenderObject* renderer = referencedRenderer()) | 75 } else if (RenderObject* renderer = referencedRenderer()) |
79 srcRect = svgFilter->absoluteTransform().mapRect(renderer->repaintRectIn
LocalCoordinates()); | 76 srcRect = filter()->absoluteTransform().mapRect(renderer->repaintRectInL
ocalCoordinates()); |
80 | 77 |
81 if (clipsToBounds()) | 78 if (clipsToBounds()) |
82 paintRect.intersect(maxEffectRect()); | 79 paintRect.intersect(maxEffectRect()); |
83 else | 80 else |
84 paintRect.unite(maxEffectRect()); | 81 paintRect.unite(maxEffectRect()); |
85 setAbsolutePaintRect(enclosingIntRect(paintRect)); | 82 setAbsolutePaintRect(enclosingIntRect(paintRect)); |
86 } | 83 } |
87 | 84 |
88 RenderObject* FEImage::referencedRenderer() const | 85 RenderObject* FEImage::referencedRenderer() const |
89 { | 86 { |
90 if (!m_document) | 87 if (!m_document) |
91 return 0; | 88 return 0; |
92 Element* hrefElement = SVGURIReference::targetElementFromIRIString(m_href, m
_document); | 89 Element* hrefElement = SVGURIReference::targetElementFromIRIString(m_href, m
_document); |
93 if (!hrefElement || !hrefElement->isSVGElement()) | 90 if (!hrefElement || !hrefElement->isSVGElement()) |
94 return 0; | 91 return 0; |
95 return hrefElement->renderer(); | 92 return hrefElement->renderer(); |
96 } | 93 } |
97 | 94 |
98 void FEImage::applySoftware() | 95 void FEImage::applySoftware() |
99 { | 96 { |
100 RenderObject* renderer = referencedRenderer(); | 97 RenderObject* renderer = referencedRenderer(); |
101 if (!m_image && !renderer) | 98 if (!m_image && !renderer) |
102 return; | 99 return; |
103 | 100 |
104 ImageBuffer* resultImage = createImageBufferResult(); | 101 ImageBuffer* resultImage = createImageBufferResult(); |
105 if (!resultImage) | 102 if (!resultImage) |
106 return; | 103 return; |
107 | 104 |
108 SVGFilter* svgFilter = static_cast<SVGFilter*>(filter()); | 105 FloatRect destRect = filter()->absoluteTransform().mapRect(filterPrimitiveSu
bregion()); |
109 FloatRect destRect = svgFilter->absoluteTransform().mapRect(filterPrimitiveS
ubregion()); | |
110 | 106 |
111 FloatRect srcRect; | 107 FloatRect srcRect; |
112 if (renderer) | 108 if (renderer) |
113 srcRect = svgFilter->absoluteTransform().mapRect(renderer->repaintRectIn
LocalCoordinates()); | 109 srcRect = filter()->absoluteTransform().mapRect(renderer->repaintRectInL
ocalCoordinates()); |
114 else { | 110 else { |
115 srcRect = FloatRect(FloatPoint(), m_image->size()); | 111 srcRect = FloatRect(FloatPoint(), m_image->size()); |
116 m_preserveAspectRatio.transformRect(destRect, srcRect); | 112 m_preserveAspectRatio.transformRect(destRect, srcRect); |
117 } | 113 } |
118 | 114 |
119 IntPoint paintLocation = absolutePaintRect().location(); | 115 IntPoint paintLocation = absolutePaintRect().location(); |
120 destRect.move(-paintLocation.x(), -paintLocation.y()); | 116 destRect.move(-paintLocation.x(), -paintLocation.y()); |
121 | 117 |
122 // FEImage results are always in ColorSpaceDeviceRGB | 118 // FEImage results are always in ColorSpaceDeviceRGB |
123 setResultColorSpace(ColorSpaceDeviceRGB); | 119 setResultColorSpace(ColorSpaceDeviceRGB); |
124 | 120 |
125 if (renderer) { | 121 if (renderer) { |
126 const AffineTransform& absoluteTransform = svgFilter->absoluteTransform(
); | 122 const AffineTransform& absoluteTransform = filter()->absoluteTransform()
; |
127 resultImage->context()->concatCTM(absoluteTransform); | 123 resultImage->context()->concatCTM(absoluteTransform); |
128 | 124 |
129 SVGElement* contextNode = toSVGElement(renderer->node()); | 125 SVGElement* contextNode = toSVGElement(renderer->node()); |
130 if (contextNode->isSVGStyledElement() && toSVGStyledElement(contextNode)
->hasRelativeLengths()) { | 126 if (contextNode->isSVGStyledElement() && toSVGStyledElement(contextNode)
->hasRelativeLengths()) { |
131 SVGLengthContext lengthContext(contextNode); | 127 SVGLengthContext lengthContext(contextNode); |
132 float width = 0; | 128 float width = 0; |
133 float height = 0; | 129 float height = 0; |
134 | 130 |
135 // If we're referencing an element with percentage units, eg. <rect
with="30%"> those values were resolved against the viewport. | 131 // If we're referencing an element with percentage units, eg. <rect
with="30%"> those values were resolved against the viewport. |
136 // Build up a transformation that maps from the viewport space to th
e filter primitive subregion. | 132 // Build up a transformation that maps from the viewport space to th
e filter primitive subregion. |
(...skipping 20 matching lines...) Expand all Loading... |
157 ts << "[feImage"; | 153 ts << "[feImage"; |
158 FilterEffect::externalRepresentation(ts); | 154 FilterEffect::externalRepresentation(ts); |
159 ts << " image-size=\"" << imageSize.width() << "x" << imageSize.height() <<
"\"]\n"; | 155 ts << " image-size=\"" << imageSize.width() << "x" << imageSize.height() <<
"\"]\n"; |
160 // FIXME: should this dump also object returned by SVGFEImage::image() ? | 156 // FIXME: should this dump also object returned by SVGFEImage::image() ? |
161 return ts; | 157 return ts; |
162 } | 158 } |
163 | 159 |
164 } // namespace WebCore | 160 } // namespace WebCore |
165 | 161 |
166 #endif // ENABLE(SVG) | 162 #endif // ENABLE(SVG) |
OLD | NEW |