Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Side by Side Diff: Source/core/svg/graphics/filters/SVGFEImage.cpp

Issue 14701012: Refactor m_absoluteTransform out of SVGFilter and into base class. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix copyrights Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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)
OLDNEW
« no previous file with comments | « Source/core/rendering/FilterEffectRenderer.cpp ('k') | Source/core/svg/graphics/filters/SVGFilter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698