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

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

Issue 1387573003: Pass SkiaImageFilterBuilder& to FilterEffect::createImageFilter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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
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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 else if (LayoutObject* layoutObject = referencedLayoutObject()) 148 else if (LayoutObject* layoutObject = referencedLayoutObject())
149 imageSize = enclosingIntRect(getLayoutObjectRepaintRect(layoutObject)).s ize(); 149 imageSize = enclosingIntRect(getLayoutObjectRepaintRect(layoutObject)).s ize();
150 writeIndent(ts, indent); 150 writeIndent(ts, indent);
151 ts << "[feImage"; 151 ts << "[feImage";
152 FilterEffect::externalRepresentation(ts); 152 FilterEffect::externalRepresentation(ts);
153 ts << " image-size=\"" << imageSize.width() << "x" << imageSize.height() << "\"]\n"; 153 ts << " image-size=\"" << imageSize.width() << "x" << imageSize.height() << "\"]\n";
154 // FIXME: should this dump also object returned by SVGFEImage::image() ? 154 // FIXME: should this dump also object returned by SVGFEImage::image() ?
155 return ts; 155 return ts;
156 } 156 }
157 157
158 PassRefPtr<SkImageFilter> FEImage::createImageFilterForLayoutObject(LayoutObject & layoutObject, SkiaImageFilterBuilder* builder) 158 PassRefPtr<SkImageFilter> FEImage::createImageFilterForLayoutObject(const Layout Object& layoutObject)
159 { 159 {
160 FloatRect dstRect = filterPrimitiveSubregion(); 160 FloatRect dstRect = filterPrimitiveSubregion();
161 161
162 AffineTransform transform; 162 AffineTransform transform;
163 SVGElement* contextNode = toSVGElement(layoutObject.node()); 163 SVGElement* contextNode = toSVGElement(layoutObject.node());
164 164
165 if (contextNode->hasRelativeLengths()) { 165 if (contextNode->hasRelativeLengths()) {
166 SVGLengthContext lengthContext(contextNode); 166 SVGLengthContext lengthContext(contextNode);
167 FloatSize viewportSize; 167 FloatSize viewportSize;
168 168
169 // If we're referencing an element with percentage units, eg. <rect with ="30%"> those values were resolved against the viewport. 169 // If we're referencing an element with percentage units, eg. <rect with ="30%"> those values were resolved against the viewport.
170 // Build up a transformation that maps from the viewport space to the fi lter primitive subregion. 170 // Build up a transformation that maps from the viewport space to the fi lter primitive subregion.
171 if (lengthContext.determineViewport(viewportSize)) 171 if (lengthContext.determineViewport(viewportSize))
172 transform = makeMapBetweenRects(FloatRect(FloatPoint(), viewportSize ), dstRect); 172 transform = makeMapBetweenRects(FloatRect(FloatPoint(), viewportSize ), dstRect);
173 } else { 173 } else {
174 transform.translate(dstRect.x(), dstRect.y()); 174 transform.translate(dstRect.x(), dstRect.y());
175 } 175 }
176 176
177 SkPictureBuilder filterPicture(dstRect); 177 SkPictureBuilder filterPicture(dstRect);
178 { 178 {
179 TransformRecorder transformRecorder(filterPicture.context(), layoutObjec t, transform); 179 TransformRecorder transformRecorder(filterPicture.context(), layoutObjec t, transform);
180 SVGPaintContext::paintSubtree(&filterPicture.context(), &layoutObject); 180 SVGPaintContext::paintSubtree(&filterPicture.context(), &layoutObject);
181 } 181 }
182 RefPtr<const SkPicture> recording = filterPicture.endRecording(); 182 RefPtr<const SkPicture> recording = filterPicture.endRecording();
183 183
184 RefPtr<SkImageFilter> result = adoptRef(SkPictureImageFilter::Create(recordi ng.get(), dstRect)); 184 RefPtr<SkImageFilter> result = adoptRef(SkPictureImageFilter::Create(recordi ng.get(), dstRect));
185 return result.release(); 185 return result.release();
186 } 186 }
187 187
188 PassRefPtr<SkImageFilter> FEImage::createImageFilter(SkiaImageFilterBuilder* bui lder) 188 PassRefPtr<SkImageFilter> FEImage::createImageFilter(SkiaImageFilterBuilder& bui lder)
189 { 189 {
190 if (auto* layoutObject = referencedLayoutObject()) 190 if (auto* layoutObject = referencedLayoutObject())
191 return createImageFilterForLayoutObject(*layoutObject, builder); 191 return createImageFilterForLayoutObject(*layoutObject);
192 192
193 RefPtr<SkImage> image = m_image ? m_image->imageForCurrentFrame() : nullptr; 193 RefPtr<SkImage> image = m_image ? m_image->imageForCurrentFrame() : nullptr;
194 if (!image) { 194 if (!image) {
195 // "A href reference that is an empty image (zero width or zero height), that fails 195 // "A href reference that is an empty image (zero width or zero height), that fails
196 // to download, is non-existent, or that cannot be displayed (e.g. becau se it is 196 // to download, is non-existent, or that cannot be displayed (e.g. becau se it is
197 // not in a supported image format) fills the filter primitive subregion with 197 // not in a supported image format) fills the filter primitive subregion with
198 // transparent black." 198 // transparent black."
199 return createTransparentBlack(builder); 199 return createTransparentBlack(builder);
200 } 200 }
201 201
202 FloatRect srcRect = FloatRect(FloatPoint(), m_image->size()); 202 FloatRect srcRect = FloatRect(FloatPoint(), m_image->size());
203 FloatRect dstRect = filterPrimitiveSubregion(); 203 FloatRect dstRect = filterPrimitiveSubregion();
204 204
205 m_preserveAspectRatio->transformRect(dstRect, srcRect); 205 m_preserveAspectRatio->transformRect(dstRect, srcRect);
206 206
207 return adoptRef(SkImageSource::Create(image.get(), srcRect, dstRect, kHigh_S kFilterQuality)); 207 return adoptRef(SkImageSource::Create(image.get(), srcRect, dstRect, kHigh_S kFilterQuality));
208 } 208 }
209 209
210 } // namespace blink 210 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698