Changeset 285597 in webkit
- Timestamp:
- Nov 10, 2021, 11:21:17 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 27 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/TestExpectations (modified) (1 diff)
-
LayoutTests/platform/ios/TestExpectations (modified) (1 diff)
-
LayoutTests/platform/mac/TestExpectations (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/css/CSSFilterImageValue.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm (modified) (2 diffs)
-
Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FEDropShadow.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/filters/FEMorphology.cpp (modified) (3 diffs)
-
Source/WebCore/platform/graphics/filters/FEOffset.cpp (modified) (2 diffs)
-
Source/WebCore/platform/graphics/filters/FETile.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FETurbulence.cpp (modified) (3 diffs)
-
Source/WebCore/platform/graphics/filters/Filter.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FilterEffect.cpp (modified) (15 diffs)
-
Source/WebCore/platform/graphics/filters/SourceGraphic.cpp (modified) (1 diff)
-
Source/WebCore/rendering/CSSFilter.cpp (modified) (8 diffs)
-
Source/WebCore/rendering/CSSFilter.h (modified) (4 diffs)
-
Source/WebCore/rendering/RenderLayerFilters.cpp (modified) (1 diff)
-
Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp (modified) (5 diffs)
-
Source/WebCore/rendering/svg/RenderSVGResourceFilter.h (modified) (1 diff)
-
Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp (modified) (1 diff)
-
Source/WebCore/svg/graphics/filters/SVGFEImage.cpp (modified) (3 diffs)
-
Source/WebCore/svg/graphics/filters/SVGFilter.cpp (modified) (1 diff)
-
Source/WebCore/svg/graphics/filters/SVGFilter.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r285591 r285597 1 2021-11-10 Said Abou-Hallawa <said@apple.com> 2 3 [GPU Process] Make SVGFilter and CSSFilter work in the same coordinates system 4 https://bugs.webkit.org/show_bug.cgi?id=232457 5 rdar://85035379 6 7 Reviewed by Simon Fraser. 8 9 * TestExpectations: 10 Skip the hidpi reference filter tests till we connect the FilterEffects 11 to the correct parent Filter. 12 13 * platform/ios/TestExpectations: 14 * platform/mac/TestExpectations: 15 Remove unnecessary un-skipping for conic-gradients tests since they were 16 not skipped globally. 17 1 18 2021-11-10 Geza Lore <glore@igalia.com> 2 19 -
trunk/LayoutTests/TestExpectations
r285583 r285597 5173 5173 js/dom/reflect-set-onto-dom.html [ Skip ] 5174 5174 userscripts/user-script-plugin-document.html [ Skip ] 5175 5176 # These filter related failures should be fixed once webkit.org/b/232705 is resolved 5177 webkit.org/b/232705 compositing/filters/drop-shadow.html [ Skip ] 5178 webkit.org/b/232705 compositing/filters/simple-image-with-svg-filter.html [ Skip ] 5179 webkit.org/b/232705 css3/filters/backdrop/backdrop-filter-with-border-radius-and-reflection-remove.html [ Skip ] 5180 webkit.org/b/232705 css3/filters/color-interpolation-filters.html [ Skip ] 5181 webkit.org/b/232705 css3/filters/css-opacity-with-drop-shadow.html [ Skip ] 5182 webkit.org/b/232705 css3/filters/drop-shadow.html [ Skip ] 5183 webkit.org/b/232705 css3/filters/effect-brightness-square.html [ Skip ] 5184 webkit.org/b/232705 css3/filters/effect-contrast-square.html [ Skip ] 5185 webkit.org/b/232705 css3/filters/effect-grayscale-square.html [ Skip ] 5186 webkit.org/b/232705 css3/filters/effect-hue-rotate-square.html [ Skip ] 5187 webkit.org/b/232705 css3/filters/effect-invert-square.html [ Skip ] 5188 webkit.org/b/232705 css3/filters/effect-reference-local-url-with-base.html [ Skip ] 5189 webkit.org/b/232705 css3/filters/effect-saturate-square.html [ Skip ] 5190 webkit.org/b/232705 css3/filters/effect-sepia-square.html [ Skip ] 5191 webkit.org/b/232705 css3/filters/filter-is-on-subpixel-position.html [ Skip ] 5192 webkit.org/b/232705 css3/filters/filter-on-overflow-hidden.html [ Skip ] 5193 webkit.org/b/232705 css3/filters/filters-on-svg-root.html [ Skip ] 5194 webkit.org/b/232705 css3/filters/hidpi-feConvolveMatrix.html [ Skip ] 5195 webkit.org/b/232705 css3/filters/hidpi-filter-is-on-subpixel-position.html [ Skip ] 5196 webkit.org/b/232705 css3/filters/invalidate-sourceAlpha.html [ Skip ] 5197 webkit.org/b/232705 css3/filters/null-effect-check.html [ Skip ] 5198 webkit.org/b/232705 css3/filters/reference-filter-set-filter-regions.html [ Skip ] 5199 webkit.org/b/232705 css3/masking/clip-path-filter.html [ Skip ] 5200 webkit.org/b/232705 fast/filter-image/filter-image.html [ Skip ] 5201 webkit.org/b/232705 fast/gradients/conic-gradient-alpha.html [ Skip ] 5202 webkit.org/b/232705 fast/gradients/conic-gradient-extended-stops.html [ Skip ] 5203 webkit.org/b/232705 fast/gradients/conic-gradient.html [ Skip ] 5204 webkit.org/b/232705 fast/hidpi/filters-and-image-buffer-resolution.html [ Skip ] 5205 webkit.org/b/232705 fast/hidpi/filters-blur.html [ Skip ] 5206 webkit.org/b/232705 fast/hidpi/filters-component-transfer.html [ Skip ] 5207 webkit.org/b/232705 fast/hidpi/filters-hue-rotate.html [ Skip ] 5208 webkit.org/b/232705 fast/hidpi/filters-invert.html [ Skip ] 5209 webkit.org/b/232705 fast/hidpi/filters-morphology.html [ Skip ] 5210 webkit.org/b/232705 fast/hidpi/filters-multiple.html [ Skip ] 5211 webkit.org/b/232705 fast/hidpi/filters-reference.html [ Skip ] 5212 webkit.org/b/232705 fast/hidpi/filters-shadow.html [ Skip ] 5213 webkit.org/b/232705 fast/hidpi/filters-turbulence.html [ Skip ] 5214 webkit.org/b/232705 fast/multicol/filter-in-columns.html [ Skip ] 5215 webkit.org/b/232705 http/tests/css/filters-on-iframes.html [ Skip ] 5216 webkit.org/b/232705 imported/blink/css3/filters/effect-reference-add-hw.html [ Skip ] 5217 webkit.org/b/232705 imported/blink/css3/filters/effect-reference-on-transparent-element.html [ Skip ] 5218 webkit.org/b/232705 imported/blink/css3/filters/effect-reference-source-alpha-hw.html [ Skip ] 5219 webkit.org/b/232705 imported/blink/svg/filters/filter-huge-clamping.svg [ Skip ] 5220 webkit.org/b/232705 imported/mozilla/svg/svg-effects-area-unzoomed.xhtml [ Skip ] 5221 webkit.org/b/232705 imported/mozilla/svg/svg-effects-area-zoomed-in.xhtml [ Skip ] 5222 webkit.org/b/232705 imported/mozilla/svg/svg-effects-area-zoomed-out.xhtml [ Skip ] 5223 webkit.org/b/232705 imported/w3c/web-platform-tests/css/css-overflow/overflow-scroll-resize-visibility-hidden.html [ Skip ] 5224 webkit.org/b/232705 svg/custom/feColorMatrix-values-leading-spaces.html [ Skip ] 5225 webkit.org/b/232705 svg/custom/resources-css-scaled.html [ Skip ] 5226 webkit.org/b/232705 svg/filters/big-sized-off-viewport-filter.svg [ Skip ] -
trunk/LayoutTests/platform/ios/TestExpectations
r285589 r285597 2973 2973 editing/selection/character-granularity-rect.html [ Pass ] 2974 2974 2975 # < iOS12 doesn't support the CG needed for Conic Gradients2976 http/wpt/css/css-images-4/conic-gradient-parsing.html [ Pass ]2977 fast/gradients/conic-repeating.html [ Pass ]2978 fast/gradients/conic.html [ Pass ]2979 fast/gradients/conic-off-center.html [ Pass ]2980 fast/gradients/conic-center-outside-box.html [ Pass ]2981 fast/gradients/conic-extended-stops.html [ Pass ]2982 fast/gradients/conic-from-angle.html [ Pass ]2983 fast/gradients/conic-repeating-last-stop.html [ Pass ]2984 fast/gradients/conic-gradient-alpha.html [ Pass ]2985 fast/gradients/conic-gradient-extended-stops.html [ Pass ]2986 fast/gradients/conic-gradient.html [ Pass ]2987 fast/gradients/conic-two-hints.html [ Pass ]2988 2989 2975 # <rdar://problem/36455339> LayoutTest compositing/ios/overflow-scroll-touch-tiles.html is a flaky failure 2990 2976 compositing/ios/overflow-scroll-touch-tiles.html [ Pass Failure ] -
trunk/LayoutTests/platform/mac/TestExpectations
r285554 r285597 1414 1414 1415 1415 # < Mojave doesn't support the CG needed for Conic Gradients 1416 http/wpt/css/css-images-4/conic-gradient-parsing.html [ Pass ]1417 fast/gradients/conic-repeating.html [ Pass ]1418 fast/gradients/conic.html [ Pass ]1419 fast/gradients/conic-off-center.html [ Pass ]1420 fast/gradients/conic-center-outside-box.html [ Pass ]1421 fast/gradients/conic-extended-stops.html [ Pass ]1422 fast/gradients/conic-from-angle.html [ Pass ]1423 fast/gradients/conic-repeating-last-stop.html [ Pass ]1424 fast/gradients/conic-gradient-alpha.html [ Pass ]1425 fast/gradients/conic-gradient-extended-stops.html [ Pass ]1426 fast/gradients/conic-gradient.html [ Pass ]1427 fast/gradients/conic-two-hints.html [ Pass ]1428 1416 [ Mojave ] imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic.html [ Pass ] 1429 1417 -
trunk/Source/WebCore/ChangeLog
r285589 r285597 1 2021-11-10 Said Abou-Hallawa <said@apple.com> 2 3 [GPU Process] Make SVGFilter and CSSFilter work in the same coordinates system 4 https://bugs.webkit.org/show_bug.cgi?id=232457 5 rdar://85035379 6 7 Reviewed by Simon Fraser. 8 9 Currently SVGFilter sets the following members of Filter 10 11 1. AffineTransform m_absoluteTransform: this is the scaling part from the 12 transformation from the target element to the outermost coordinate system 13 2. FloatSize m_filterResolution: this is the clamping scale if the size 14 of the result ImageBuffers exceeds MaxClampedArea 15 16 And the CSSFilter sets the following member of Filter: 17 18 1. float m_filterScale: this is the document().deviceScaleFactor() 19 20 The discrepancy happens also when creating the result ImageBuffers. For 21 SVGFilter, we create them with scaleFactor = 1. This means the logicalSize 22 of the ImageBuffer is equal to its backendSize. But for CSSFilter we 23 create them with scaleFactor = m_filterScale. This means the logicalSize 24 != backendSize in this case. 25 26 We need to unify the coordinates system for both filters. We need also to 27 replace the three members by a single FloatSize called "m_filterScale". 28 29 * css/CSSFilterImageValue.cpp: 30 (WebCore::CSSFilterImageValue::image): 31 * platform/graphics/coreimage/FilterEffectRendererCoreImage.mm: 32 (WebCore::FilterEffectRendererCoreImage::renderToImageBuffer): 33 (WebCore::FilterEffectRendererCoreImage::destRect const): 34 * platform/graphics/filters/FEConvolveMatrix.cpp: 35 (WebCore::FEConvolveMatrix::platformApplySoftware): 36 * platform/graphics/filters/FEDisplacementMap.cpp: 37 (WebCore::FEDisplacementMap::platformApplySoftware): 38 * platform/graphics/filters/FEDropShadow.cpp: 39 (WebCore::FEDropShadow::determineAbsolutePaintRect): 40 (WebCore::FEDropShadow::platformApplySoftware): 41 * platform/graphics/filters/FEGaussianBlur.cpp: 42 (WebCore::FEGaussianBlur::calculateKernelSize): 43 (WebCore::FEGaussianBlur::platformApplySoftware): 44 * platform/graphics/filters/FEMorphology.cpp: 45 (WebCore::FEMorphology::determineAbsolutePaintRect): 46 (WebCore::FEMorphology::platformApplySoftware): 47 * platform/graphics/filters/FEOffset.cpp: 48 (WebCore::FEOffset::determineAbsolutePaintRect): 49 (WebCore::FEOffset::platformApplySoftware): 50 * platform/graphics/filters/FETile.cpp: 51 (WebCore::FETile::platformApplySoftware): 52 * platform/graphics/filters/FETurbulence.cpp: 53 (WebCore::FETurbulence::fillRegion const): 54 (WebCore::FETurbulence::platformApplySoftware): 55 * platform/graphics/filters/Filter.h: 56 (WebCore::Filter::filterScale const): 57 (WebCore::Filter::setFilterScale): 58 (WebCore::Filter::sourceImageRect const): 59 (WebCore::Filter::setSourceImageRect): 60 (WebCore::Filter::filterRegion const): 61 (WebCore::Filter::setFilterRegion): 62 (WebCore::Filter::scaledByFilterScale const): 63 (WebCore::Filter::sourceImage): 64 (WebCore::Filter::setSourceImage): 65 (WebCore::Filter::Filter): 66 (WebCore::Filter::filterResolution const): Deleted. 67 (WebCore::Filter::setFilterResolution): Deleted. 68 (WebCore::Filter::absoluteTransform const): Deleted. 69 (WebCore::Filter::isSVGFilter const): Deleted. 70 (WebCore::Filter::isCSSFilter const): Deleted. 71 (WebCore::Filter::scaledByFilterResolution const): Deleted. 72 * platform/graphics/filters/FilterEffect.cpp: 73 (WebCore::FilterEffect::determineFilterPrimitiveSubregion): 74 (WebCore::FilterEffect::apply): 75 (WebCore::FilterEffect::imageBufferResult): 76 (WebCore::FilterEffect::unmultipliedResult): 77 (WebCore::FilterEffect::premultipliedResult): 78 (WebCore::FilterEffect::copyImageBytes const): 79 (WebCore::FilterEffect::convertPixelBufferToColorSpace): 80 (WebCore::FilterEffect::convertImageBufferToColorSpace): 81 (WebCore::FilterEffect::copyUnmultipliedResult): 82 (WebCore::FilterEffect::copyPremultipliedResult): 83 (WebCore::FilterEffect::createImageBufferResult): 84 (WebCore::FilterEffect::createUnmultipliedImageResult): 85 (WebCore::FilterEffect::createPremultipliedImageResult): 86 * platform/graphics/filters/SourceGraphic.cpp: 87 (WebCore::SourceGraphic::determineAbsolutePaintRect): 88 * rendering/CSSFilter.cpp: 89 (WebCore::CSSFilter::create): 90 (WebCore::CSSFilter::CSSFilter): 91 (WebCore::CSSFilter::buildReferenceFilter): 92 (WebCore::CSSFilter::build): 93 (WebCore::CSSFilter::allocateBackingStoreIfNeeded): 94 (WebCore::CSSFilter::determineFilterPrimitiveSubregion): 95 (WebCore::CSSFilter::clearIntermediateResults): 96 (WebCore::CSSFilter::setSourceImageRect): 97 (WebCore::CSSFilter::outputRect const): 98 * rendering/CSSFilter.h: 99 * rendering/RenderLayerFilters.cpp: 100 (WebCore::RenderLayerFilters::buildFilter): 101 * rendering/svg/RenderSVGResourceFilter.cpp: 102 (WebCore::RenderSVGResourceFilter::applyResource): 103 (WebCore::RenderSVGResourceFilter::postApplyResource): 104 * rendering/svg/RenderSVGResourceFilter.h: 105 * rendering/svg/SVGRenderTreeAsText.cpp: 106 (WebCore::writeSVGResourceContainer): 107 * svg/graphics/filters/SVGFEImage.cpp: 108 (WebCore::FEImage::determineAbsolutePaintRect): 109 (WebCore::FEImage::platformApplySoftware): 110 * svg/graphics/filters/SVGFilter.cpp: 111 (WebCore::SVGFilter::SVGFilter): 112 (WebCore::SVGFilter::scaledByFilterScale const): 113 (WebCore::SVGFilter::create): 114 (WebCore::SVGFilter::scaledByFilterResolution const): Deleted. 115 * svg/graphics/filters/SVGFilter.h: 116 1 117 2021-11-10 Tyler Wilcock <tyler_w@apple.com> 2 118 -
trunk/Source/WebCore/css/CSSFilterImageValue.cpp
r284857 r285597 127 127 cssFilter->setSourceImage(WTFMove(texture)); 128 128 cssFilter->setSourceImageRect(imageRect); 129 cssFilter->setFilterRegion(imageRect);130 129 if (!cssFilter->build(renderer, m_filterOperations, FilterConsumer::FilterFunction)) 131 130 return &Image::nullImage(); -
trunk/Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm
r285543 r285597 243 243 { 244 244 FloatSize clampedSize = ImageBuffer::clampedSize(lastEffect.absolutePaintRect().size()); 245 m_outputImageBuffer = IOSurfaceImageBuffer::create(clampedSize, lastEffect.filter().filterScale(), lastEffect.resultColorSpace(), PixelFormat::BGRA8);245 m_outputImageBuffer = IOSurfaceImageBuffer::create(clampedSize, 1, lastEffect.resultColorSpace(), PixelFormat::BGRA8); 246 246 if (!m_outputImageBuffer) { 247 247 clearResult(); … … 255 255 { 256 256 IntSize destSize = lastEffect.absolutePaintRect().size(); 257 destSize.scale(lastEffect.filter().filterScale());258 257 FloatRect destRect = FloatRect(FloatPoint(), destSize); 259 258 return destRect; -
trunk/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp
r285543 r285597 387 387 388 388 IntSize paintSize = absolutePaintRect().size(); 389 paintSize.scale(filter().filterScale()); 390 389 391 390 PaintingData paintingData = { 392 391 *sourcePixelArray, -
trunk/Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp
r285543 r285597 120 120 Filter& filter = this->filter(); 121 121 IntSize paintSize = absolutePaintRect().size(); 122 paintSize.scale(filter.filterScale());123 122 124 FloatSize scale = filter.scaledByFilter Resolution({ m_scale, m_scale });123 FloatSize scale = filter.scaledByFilterScale({ m_scale, m_scale }); 125 124 float scaleForColorX = scale.width() / 255.0; 126 125 float scaleForColorY = scale.height() / 255.0; -
trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp
r285543 r285597 54 54 FloatRect absolutePaintRect = inputEffect(0)->absolutePaintRect(); 55 55 FloatRect absoluteOffsetPaintRect(absolutePaintRect); 56 absoluteOffsetPaintRect.move(filter.scaledByFilter Resolution({ m_dx, m_dy }));56 absoluteOffsetPaintRect.move(filter.scaledByFilterScale({ m_dx, m_dy })); 57 57 absolutePaintRect.unite(absoluteOffsetPaintRect); 58 58 … … 81 81 Filter& filter = this->filter(); 82 82 83 FloatSize blurRadius = 2 * filter.scaledByFilterResolution({ m_stdX, m_stdY }); 84 blurRadius.scale(filter.filterScale()); 85 FloatSize offset = filter.scaledByFilterResolution({ m_dx, m_dy }); 83 FloatSize blurRadius = 2 * filter.scaledByFilterScale({ m_stdX, m_stdY }); 84 FloatSize offset = filter.scaledByFilterScale({ m_dx, m_dy }); 86 85 87 86 FloatRect drawingRegion = drawingRegionOfInputImage(in->absolutePaintRect()); -
trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp
r285543 r285597 486 486 IntSize FEGaussianBlur::calculateKernelSize(const Filter& filter, FloatSize stdDeviation) 487 487 { 488 return calculateUnscaledKernelSize(filter.scaledByFilter Resolution(stdDeviation));488 return calculateUnscaledKernelSize(filter.scaledByFilterScale(stdDeviation)); 489 489 } 490 490 … … 538 538 539 539 IntSize kernelSize = calculateKernelSize(filter(), { m_stdX, m_stdY }); 540 kernelSize.scale(filter().filterScale());541 540 542 541 IntSize paintSize = absolutePaintRect().size(); 543 paintSize.scale(filter().filterScale());544 542 auto tmpImageData = Uint8ClampedArray::tryCreateUninitialized(paintSize.area() * 4); 545 543 if (!tmpImageData) -
trunk/Source/WebCore/platform/graphics/filters/FEMorphology.cpp
r285543 r285597 77 77 FloatRect paintRect = inputEffect(0)->absolutePaintRect(); 78 78 Filter& filter = this->filter(); 79 paintRect.inflate(filter.scaledByFilter Resolution({ m_radiusX, m_radiusY }));79 paintRect.inflate(filter.scaledByFilterScale({ m_radiusX, m_radiusY })); 80 80 if (clipsToBounds()) 81 81 paintRect.intersect(maxEffectRect()); … … 264 264 return; 265 265 266 radius = flooredIntSize(filter.scaledByFilter Resolution({ m_radiusX, m_radiusY }));266 radius = flooredIntSize(filter.scaledByFilterScale({ m_radiusX, m_radiusY })); 267 267 int radiusX = std::min(effectDrawingRect.width() - 1, radius.width()); 268 268 int radiusY = std::min(effectDrawingRect.height() - 1, radius.height()); … … 274 274 paintingData.srcPixelArray = sourcePixelArray.get(); 275 275 paintingData.dstPixelArray = &destinationPixelArray; 276 paintingData.width = ceilf(effectDrawingRect.width() * filter.filterScale());277 paintingData.height = ceilf(effectDrawingRect.height() * filter.filterScale());278 paintingData.radiusX = ceilf(radiusX * filter.filterScale());279 paintingData.radiusY = ceilf(radiusY * filter.filterScale());276 paintingData.width = ceilf(effectDrawingRect.width()); 277 paintingData.height = ceilf(effectDrawingRect.height()); 278 paintingData.radiusX = ceilf(radiusX); 279 paintingData.radiusY = ceilf(radiusY); 280 280 281 281 platformApply(paintingData); -
trunk/Source/WebCore/platform/graphics/filters/FEOffset.cpp
r285543 r285597 57 57 FloatRect paintRect = inputEffect(0)->absolutePaintRect(); 58 58 Filter& filter = this->filter(); 59 paintRect.move(filter.scaledByFilter Resolution({ m_dx, m_dy }));59 paintRect.move(filter.scaledByFilterScale({ m_dx, m_dy })); 60 60 if (clipsToBounds()) 61 61 paintRect.intersect(maxEffectRect()); … … 78 78 FloatRect drawingRegion = drawingRegionOfInputImage(in->absolutePaintRect()); 79 79 Filter& filter = this->filter(); 80 drawingRegion.move(filter.scaledByFilter Resolution({ m_dx, m_dy }));80 drawingRegion.move(filter.scaledByFilterScale({ m_dx, m_dy })); 81 81 resultImage->context().drawImageBuffer(*inBuffer, drawingRegion); 82 82 } -
trunk/Source/WebCore/platform/graphics/filters/FETile.cpp
r285543 r285597 62 62 Filter& filter = this->filter(); 63 63 tileRect = filter.filterRegion(); 64 tileRect.scale(filter.filter Resolution().width(), filter.filterResolution().height());64 tileRect.scale(filter.filterScale()); 65 65 } 66 66 -
trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp
r285543 r285597 372 372 373 373 IntRect filterRegion = absolutePaintRect(); 374 filterRegion.scale(filter().filterScale());375 374 FloatPoint point(0, filterRegion.y() + startY); 376 375 int indexOfPixelChannel = startY * (filterRegion.width() << 2); 377 AffineTransform inverseTransfrom = filter().absoluteTransform().inverse().value_or(AffineTransform());376 FloatSize inverseScale = { 1 / filter().filterScale().width(), 1 / filter().filterScale().height() }; 378 377 379 378 for (int y = startY; y < endY; ++y) { … … 382 381 for (int x = 0; x < filterRegion.width(); ++x) { 383 382 point.setX(point.x() + 1); 384 FloatPoint localPoint = inverseTransfrom.mapPoint(point);383 FloatPoint localPoint = point.scaled(inverseScale.width(), inverseScale.height()); 385 384 auto values = calculateTurbulenceValueForPoint(paintingData, stitchData, localPoint); 386 385 pixelArray.setRange(values.components.data(), 4, indexOfPixelChannel); … … 404 403 405 404 IntSize resultSize(absolutePaintRect().size()); 406 resultSize.scale(filter().filterScale());407 405 408 406 if (resultSize.isEmpty()) { -
trunk/Source/WebCore/platform/graphics/filters/Filter.h
r285543 r285597 34 34 class Filter : public FilterFunction { 35 35 public: 36 FloatSize filterScale() const { return m_filterScale; } 37 void setFilterScale(const FloatSize& filterScale) { m_filterScale = filterScale; } 38 39 FloatRect sourceImageRect() const { return m_sourceImageRect; } 40 void setSourceImageRect(const FloatRect& sourceImageRect) { m_sourceImageRect = sourceImageRect; } 41 42 FloatRect filterRegion() const { return m_filterRegion; } 43 void setFilterRegion(const FloatRect& filterRegion) { m_filterRegion = filterRegion; } 44 45 virtual FloatSize scaledByFilterScale(FloatSize size) const { return size * m_filterScale; } 46 47 ImageBuffer* sourceImage() { return m_sourceImage.get(); } 36 48 void setSourceImage(RefPtr<ImageBuffer>&& sourceImage) { m_sourceImage = WTFMove(sourceImage); } 37 ImageBuffer* sourceImage() { return m_sourceImage.get(); }38 39 FloatSize filterResolution() const { return m_filterResolution; }40 void setFilterResolution(const FloatSize& filterResolution) { m_filterResolution = filterResolution; }41 42 float filterScale() const { return m_filterScale; }43 void setFilterScale(float scale) { m_filterScale = scale; }44 45 const AffineTransform& absoluteTransform() const { return m_absoluteTransform; }46 49 47 50 RenderingMode renderingMode() const { return m_renderingMode; } 48 51 void setRenderingMode(RenderingMode renderingMode) { m_renderingMode = renderingMode; } 49 52 50 virtual bool isSVGFilter() const { return false; }51 virtual bool isCSSFilter() const { return false; }52 53 virtual FloatSize scaledByFilterResolution(FloatSize size) const { return size * m_filterResolution; }54 55 virtual FloatRect sourceImageRect() const = 0;56 virtual FloatRect filterRegion() const = 0;57 virtual FloatRect filterRegionInUserSpace() const = 0;58 59 53 protected: 60 Filter(Filter::Type filterType, const AffineTransform& absoluteTransform, float filterScale = 1)54 Filter(Filter::Type filterType, const FloatSize& filterScale) 61 55 : FilterFunction(filterType) 62 , m_absoluteTransform(absoluteTransform)63 56 , m_filterScale(filterScale) 64 57 { 65 58 } 66 59 67 Filter(Filter::Type filterType, const FloatSize& filter Resolution)60 Filter(Filter::Type filterType, const FloatSize& filterScale, const FloatRect& sourceImageRect, const FloatRect& filterRegion) 68 61 : FilterFunction(filterType) 69 , m_filterResolution(filterResolution) 62 , m_filterScale(filterScale) 63 , m_sourceImageRect(sourceImageRect) 64 , m_filterRegion(filterRegion) 70 65 { 71 66 } 72 67 73 68 private: 69 FloatSize m_filterScale; 70 FloatRect m_sourceImageRect; 71 FloatRect m_filterRegion; 72 74 73 RefPtr<ImageBuffer> m_sourceImage; 75 FloatSize m_filterResolution;76 AffineTransform m_absoluteTransform;77 74 RenderingMode m_renderingMode { RenderingMode::Unaccelerated }; 78 float m_filterScale { 1 };79 75 }; 80 76 -
trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp
r285543 r285597 106 106 } 107 107 } else 108 subregion = m_filter.filterRegion InUserSpace();108 subregion = m_filter.filterRegion(); 109 109 110 110 // After calling determineFilterPrimitiveSubregion on the target effect, reset the subregion again for <feTile>. 111 111 if (filterType() == FilterEffect::Type::FETile) 112 subregion = m_filter.filterRegion InUserSpace();112 subregion = m_filter.filterRegion(); 113 113 114 114 auto boundaries = effectBoundaries(); … … 124 124 setFilterPrimitiveSubregion(subregion); 125 125 126 auto absoluteSubregion = m_filter.absoluteTransform().mapRect(subregion); 127 auto filterResolution = m_filter.filterResolution(); 128 absoluteSubregion.scale(filterResolution); 126 auto absoluteSubregion = subregion; 127 absoluteSubregion.scale(m_filter.filterScale()); 129 128 // Save this before clipping so we can use it to map lighting points from user space to buffer coordinates. 130 129 setUnclippedAbsoluteSubregion(absoluteSubregion); … … 132 131 // Clip every filter effect to the filter region. 133 132 auto absoluteScaledFilterRegion = m_filter.filterRegion(); 134 absoluteScaledFilterRegion.scale( filterResolution);133 absoluteScaledFilterRegion.scale(m_filter.filterScale()); 135 134 absoluteSubregion.intersect(absoluteScaledFilterRegion); 136 135 … … 180 179 setResultColorSpace(m_operatingColorSpace); 181 180 182 LOG_WITH_STREAM(Filters, stream << "FilterEffect " << filterName() << " " << this << " apply():\n filterPrimitiveSubregion " << m_filterPrimitiveSubregion << "\n effectBoundaries " << m_effectBoundaries << "\n absoluteUnclippedSubregion " << m_absoluteUnclippedSubregion << "\n absolutePaintRect " << m_absolutePaintRect << "\n maxEffectRect " << m_maxEffectRect << "\n filter scale " << m_filter.filterScale() << "\n filter resolution " << m_filter.filterResolution());181 LOG_WITH_STREAM(Filters, stream << "FilterEffect " << filterName() << " " << this << " apply():\n filterPrimitiveSubregion " << m_filterPrimitiveSubregion << "\n effectBoundaries " << m_effectBoundaries << "\n absoluteUnclippedSubregion " << m_absoluteUnclippedSubregion << "\n absolutePaintRect " << m_absolutePaintRect << "\n maxEffectRect " << m_maxEffectRect << "\n filter scale " << m_filter.filterScale()); 183 182 184 183 if (m_absolutePaintRect.isEmpty() || ImageBuffer::sizeNeedsClamping(m_absolutePaintRect.size())) … … 272 271 return m_imageBufferResult.get(); 273 272 274 m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), m_filter.renderingMode(), m_filter.filterScale(), m_resultColorSpace, PixelFormat::BGRA8);273 m_imageBufferResult = ImageBuffer::create(m_absolutePaintRect.size(), m_filter.renderingMode(), 1, m_resultColorSpace, PixelFormat::BGRA8); 275 274 if (!m_imageBufferResult) 276 275 return nullptr; … … 288 287 IntSize scaledSize(rect.size()); 289 288 ASSERT(!ImageBuffer::sizeNeedsClamping(scaledSize)); 290 scaledSize.scale(m_filter.filterScale());291 289 auto checkedArea = scaledSize.area<RecordOverflow>() * 4; 292 290 if (checkedArea.hasOverflowed()) … … 303 301 IntSize scaledSize(rect.size()); 304 302 ASSERT(!ImageBuffer::sizeNeedsClamping(scaledSize)); 305 scaledSize.scale(m_filter.filterScale());306 303 auto checkedArea = scaledSize.area<RecordOverflow>() * 4; 307 304 if (checkedArea.hasOverflowed()) … … 317 314 { 318 315 IntRect scaledRect(rect); 319 scaledRect.scale(m_filter.filterScale());320 316 IntSize scaledPaintSize(m_absolutePaintRect.size()); 321 scaledPaintSize.scale(m_filter.filterScale());322 317 323 318 // Initialize the destination to transparent black, if not entirely covered by the source. … … 443 438 444 439 IntRect destinationRect(IntPoint(), pixelBuffer.size()); 445 destinationRect.scale(1 / m_filter.filterScale());446 440 FloatSize clampedSize = ImageBuffer::clampedSize(destinationRect.size()); 447 441 // Create an ImageBuffer to store incoming PixelBuffer 448 auto buffer = ImageBuffer::create(clampedSize, m_filter.renderingMode(), m_filter.filterScale(), operatingColorSpace(), PixelFormat::BGRA8);442 auto buffer = ImageBuffer::create(clampedSize, m_filter.renderingMode(), 1, operatingColorSpace(), PixelFormat::BGRA8); 449 443 if (!buffer) 450 444 return std::nullopt; … … 460 454 461 455 // Create an ImageBuffer with the correct color space and utilize CG to handle color space conversion 462 auto convertedBuffer = ImageBuffer::create(clampedSize, m_filter.renderingMode(), m_filter.filterScale(), targetColorSpace, PixelFormat::BGRA8);456 auto convertedBuffer = ImageBuffer::create(clampedSize, m_filter.renderingMode(), 1, targetColorSpace, PixelFormat::BGRA8); 463 457 if (!convertedBuffer) 464 458 return std::nullopt; … … 512 506 IntSize inputSize(m_absolutePaintRect.size()); 513 507 ASSERT(!ImageBuffer::sizeNeedsClamping(inputSize)); 514 inputSize.scale(m_filter.filterScale());515 508 516 509 ASSERT(m_premultipliedImageResult->format().colorSpace == m_resultColorSpace); … … 551 544 IntSize inputSize(m_absolutePaintRect.size()); 552 545 ASSERT(!ImageBuffer::sizeNeedsClamping(inputSize)); 553 inputSize.scale(m_filter.filterScale());554 546 555 547 ASSERT(m_unmultipliedImageResult->format().colorSpace == m_resultColorSpace); … … 579 571 580 572 FloatSize clampedSize = ImageBuffer::clampedSize(m_absolutePaintRect.size()); 581 m_imageBufferResult = ImageBuffer::create(clampedSize, m_filter.renderingMode(), m_filter.filterScale(), m_resultColorSpace, PixelFormat::BGRA8);573 m_imageBufferResult = ImageBuffer::create(clampedSize, m_filter.renderingMode(), 1, m_resultColorSpace, PixelFormat::BGRA8); 582 574 return m_imageBufferResult.get(); 583 575 } … … 596 588 IntSize resultSize(m_absolutePaintRect.size()); 597 589 ASSERT(!ImageBuffer::sizeNeedsClamping(resultSize)); 598 resultSize.scale(m_filter.filterScale());599 590 PixelBufferFormat format { AlphaPremultiplication::Unpremultiplied, PixelFormat::RGBA8, m_resultColorSpace }; 600 591 m_unmultipliedImageResult = PixelBuffer::tryCreate(format, resultSize); … … 615 606 IntSize resultSize(m_absolutePaintRect.size()); 616 607 ASSERT(!ImageBuffer::sizeNeedsClamping(resultSize)); 617 resultSize.scale(m_filter.filterScale());618 608 PixelBufferFormat format { AlphaPremultiplication::Premultiplied, PixelFormat::RGBA8, m_resultColorSpace }; 619 609 m_premultipliedImageResult = PixelBuffer::tryCreate(format, resultSize); -
trunk/Source/WebCore/platform/graphics/filters/SourceGraphic.cpp
r285543 r285597 36 36 Filter& filter = this->filter(); 37 37 FloatRect paintRect = filter.sourceImageRect(); 38 paintRect.scale(filter.filterResolution().width(), filter.filterResolution().height());39 38 setAbsolutePaintRect(enclosingIntRect(paintRect)); 40 39 } -
trunk/Source/WebCore/rendering/CSSFilter.cpp
r285543 r285597 55 55 namespace WebCore { 56 56 57 Ref<CSSFilter> CSSFilter::create( )58 { 59 return adoptRef(*new CSSFilter );60 } 61 62 CSSFilter::CSSFilter( )63 : Filter(Filter::Type::CSSFilter, FloatSize { 1, 1})57 Ref<CSSFilter> CSSFilter::create(float scaleFactor) 58 { 59 return adoptRef(*new CSSFilter(scaleFactor)); 60 } 61 62 CSSFilter::CSSFilter(float scaleFactor) 63 : Filter(Filter::Type::CSSFilter, FloatSize { scaleFactor, scaleFactor }) 64 64 , m_sourceGraphic(SourceGraphic::create(*this)) 65 65 { 66 66 } 67 68 CSSFilter::~CSSFilter() = default;69 67 70 68 GraphicsContext* CSSFilter::inputContext() … … 87 85 88 86 auto builder = makeUnique<SVGFilterBuilder>(&previousEffect); 89 m_sourceAlpha = builder->getEffectById(SourceAlpha::effectName());90 87 91 88 RefPtr<FilterEffect> effect; … … 303 300 m_effects.shrinkToFit(); 304 301 305 setMaxEffectRects( m_sourceDrawingRegion);302 setMaxEffectRects(sourceImageRect()); 306 303 #if USE(CORE_IMAGE) 307 304 if (!m_filterRenderer) … … 332 329 return; 333 330 334 auto logicalSize = m_sourceDrawingRegion.size();331 auto logicalSize = sourceImageRect().size(); 335 332 if (!sourceImage() || sourceImage()->logicalSize() != logicalSize) { 336 333 #if USE(DIRECT2D) 337 setSourceImage(ImageBuffer::create(logicalSize, renderingMode(), &targetContext, filterScale(), DestinationColorSpace::SRGB(), PixelFormat::BGRA8));334 setSourceImage(ImageBuffer::create(logicalSize, renderingMode(), &targetContext, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8)); 338 335 #else 339 336 UNUSED_PARAM(targetContext); 340 337 RenderingMode mode = m_filterRenderer ? RenderingMode::Accelerated : renderingMode(); 341 setSourceImage(ImageBuffer::create(logicalSize, mode, filterScale(), DestinationColorSpace::SRGB(), PixelFormat::BGRA8));338 setSourceImage(ImageBuffer::create(logicalSize, mode, 1, DestinationColorSpace::SRGB(), PixelFormat::BGRA8)); 342 339 #endif 343 340 } … … 351 348 FloatRect subRegion = lastEffect.maxEffectRect(); 352 349 // At least one FilterEffect has a too big image size, recalculate the effect sizes with new scale factors. 353 FloatSize scale;354 if (ImageBuffer::sizeNeedsClamping(subRegion.size(), scale)) {355 setFilter Resolution(scale);350 FloatSize filterScale { 1, 1 }; 351 if (ImageBuffer::sizeNeedsClamping(subRegion.size(), filterScale)) { 352 setFilterScale(filterScale); 356 353 lastEffect.determineFilterPrimitiveSubregion(); 357 354 } … … 361 358 { 362 359 m_sourceGraphic->clearResult(); 363 if (m_sourceAlpha)364 m_sourceAlpha->clearResult();365 360 for (auto& effect : m_effects) 366 361 effect->clearResult(); … … 401 396 void CSSFilter::setSourceImageRect(const FloatRect& sourceImageRect) 402 397 { 403 m_sourceDrawingRegion = sourceImageRect; 398 Filter::setFilterRegion(sourceImageRect); 399 Filter::setSourceImageRect(sourceImageRect); 404 400 setMaxEffectRects(sourceImageRect); 405 setFilterRegion(sourceImageRect);406 401 m_graphicsBufferAttached = false; 407 402 } … … 418 413 419 414 if (lastEffect.hasResult() || (m_filterRenderer && m_filterRenderer->hasResult())) 420 return lastEffect.requestedRegionOfInputPixelBuffer(IntRect { m_filterRegion});415 return lastEffect.requestedRegionOfInputPixelBuffer(IntRect { filterRegion() }); 421 416 422 417 return { }; -
trunk/Source/WebCore/rendering/CSSFilter.h
r264805 r285597 39 39 class ReferenceFilterOperation; 40 40 class RenderElement; 41 class SourceAlpha;42 41 class SourceGraphic; 43 42 … … 48 47 friend class RenderLayerFilters; 49 48 public: 50 static Ref<CSSFilter> create(); 51 52 void setSourceImageRect(const FloatRect&); 53 void setFilterRegion(const FloatRect& filterRegion) { m_filterRegion = filterRegion; } 49 static Ref<CSSFilter> create(float scaleFactor = 1); 54 50 55 51 ImageBuffer* output() const; 56 52 53 void setSourceImageRect(const FloatRect&); 57 54 bool build(RenderElement&, const FilterOperations&, FilterConsumer); 58 55 void clearIntermediateResults(); … … 66 63 67 64 private: 68 CSSFilter(); 69 virtual ~CSSFilter(); 70 71 bool isCSSFilter() const final { return true; } 72 73 FloatRect sourceImageRect() const final { return m_sourceDrawingRegion; } 74 75 FloatRect filterRegion() const final { return m_filterRegion; } 76 FloatRect filterRegionInUserSpace() const final { return m_filterRegion; } 65 CSSFilter(float scaleFactor); 77 66 78 67 RefPtr<FilterEffect> buildReferenceFilter(RenderElement&, FilterEffect& previousEffect, ReferenceFilterOperation&); … … 89 78 LayoutRect computeSourceImageRectForDirtyRect(const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect); 90 79 91 FloatRect m_sourceDrawingRegion;92 FloatRect m_filterRegion;93 94 80 Vector<Ref<FilterEffect>> m_effects; 95 81 Ref<SourceGraphic> m_sourceGraphic; 96 RefPtr<FilterEffect> m_sourceAlpha;97 82 98 83 mutable IntOutsets m_outsets; -
trunk/Source/WebCore/rendering/RenderLayerFilters.cpp
r261597 r285597 119 119 void RenderLayerFilters::buildFilter(RenderElement& renderer, float scaleFactor, RenderingMode renderingMode) 120 120 { 121 if (!m_filter) { 122 m_filter = CSSFilter::create(); 123 m_filter->setFilterScale(scaleFactor); 124 m_filter->setRenderingMode(renderingMode); 125 } else if (m_filter->filterScale() != scaleFactor) { 126 m_filter->setFilterScale(scaleFactor); 127 m_filter->clearIntermediateResults(); 128 } 121 // FIXME: this rebuilds the entire effects chain even if the filter style didn't change. 122 m_filter = CSSFilter::create(scaleFactor); 123 m_filter->setRenderingMode(renderingMode); 129 124 130 125 // If the filter fails to build, remove it from the layer. It will still attempt to 131 126 // go through regular processing (e.g. compositing), but never apply anything. 132 // FIXME: this rebuilds the entire effects chain even if the filter style didn't change.133 127 if (!m_filter->build(renderer, renderer.style().filter(), FilterConsumer::FilterProperty)) 134 128 m_filter = nullptr; -
trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp
r283851 r285597 144 144 145 145 // Eliminate shear of the absolute transformation matrix, to be able to produce unsheared tile images for feTile. 146 filterData->shearFreeAbsoluteTransform = AffineTransform(absoluteTransform.xScale(), 0, 0, absoluteTransform.yScale(), 0, 0);146 FloatSize filterScale(absoluteTransform.xScale(), absoluteTransform.yScale()); 147 147 148 148 // Determine absolute boundaries of the filter and the drawing region. 149 149 filterData->drawingRegion = renderer.strokeBoundingBox(); 150 150 filterData->drawingRegion.intersect(filterData->boundaries); 151 FloatRect absoluteDrawingRegion = filterData->shearFreeAbsoluteTransform.mapRect(filterData->drawingRegion); 151 152 // Determine scale factor for filter. The size of intermediate ImageBuffers shouldn't be bigger than kMaxFilterSize. 153 FloatRect absoluteDrawingRegion = filterData->drawingRegion; 154 absoluteDrawingRegion.scale(filterScale); 155 ImageBuffer::sizeNeedsClamping(absoluteDrawingRegion.size(), filterScale); 152 156 153 157 // Create the SVGFilter object. 154 158 bool primitiveBoundingBoxMode = filterElement().primitiveUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; 155 filterData->filter = SVGFilter::create(filter Data->shearFreeAbsoluteTransform, absoluteDrawingRegion, targetBoundingBox, filterData->boundaries, primitiveBoundingBoxMode);159 filterData->filter = SVGFilter::create(filterScale, absoluteDrawingRegion, filterData->boundaries, targetBoundingBox, primitiveBoundingBoxMode); 156 160 157 161 // Create all relevant filter primitives. … … 160 164 return false; 161 165 162 // Determine scale factor for filter. The size of intermediate ImageBuffers shouldn't be bigger than kMaxFilterSize.163 FloatRect tempSourceRect = absoluteDrawingRegion;164 FloatSize scale(1, 1);165 ImageBuffer::sizeNeedsClamping(tempSourceRect.size(), scale);166 tempSourceRect.scale(scale.width(), scale.height());167 168 // Set the scale level in SVGFilter.169 filterData->filter->setFilterResolution(scale);170 171 166 static const unsigned maxTotalOfEffectInputs = 100; 172 167 FilterEffect* lastEffect = filterData->builder->lastEffect(); … … 178 173 lastEffect->determineFilterPrimitiveSubregion(); 179 174 FloatRect subRegion = lastEffect->maxEffectRect(); 175 180 176 // At least one FilterEffect has a too big image size, 181 177 // recalculate the effect sizes with new scale factors. 182 if (ImageBuffer::sizeNeedsClamping(subRegion.size(), scale)) {183 filterData->filter->setFilter Resolution(scale);178 if (ImageBuffer::sizeNeedsClamping(subRegion.size(), filterScale)) { 179 filterData->filter->setFilterScale(filterScale); 184 180 lastEffect->determineFilterPrimitiveSubregion(); 185 181 } … … 195 191 196 192 // Change the coordinate transformation applied to the filtered element to reflect the resolution of the filter. 197 AffineTransform effectiveTransform; 198 effectiveTransform.scale(scale.width(), scale.height()); 199 effectiveTransform.multiply(filterData->shearFreeAbsoluteTransform); 193 AffineTransform effectiveTransform = AffineTransform(filterScale.width(), 0, 0, filterScale.height(), 0, 0); 200 194 201 195 auto renderingMode = renderer.settings().acceleratedFiltersEnabled() ? RenderingMode::Accelerated : RenderingMode::Unaccelerated; … … 290 284 ImageBuffer* resultImage = lastEffect->imageBufferResult(); 291 285 if (resultImage) { 292 context->concatCTM(filterData.shearFreeAbsoluteTransform.inverse().value_or(AffineTransform())); 293 294 context->scale(FloatSize(1 / filterData.filter->filterResolution().width(), 1 / filterData.filter->filterResolution().height())); 286 context->scale(FloatSize(1 / filterData.filter->filterScale().width(), 1 / filterData.filter->filterScale().height())); 295 287 context->drawImageBuffer(*resultImage, lastEffect->absolutePaintRect()); 296 context->scale(filterData.filter->filterResolution()); 297 298 context->concatCTM(filterData.shearFreeAbsoluteTransform); 288 context->scale(filterData.filter->filterScale()); 299 289 } 300 290 } -
trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h
r283851 r285597 48 48 RefPtr<ImageBuffer> sourceGraphicBuffer; 49 49 GraphicsContext* savedContext { nullptr }; 50 AffineTransform shearFreeAbsoluteTransform;51 50 FloatRect boundaries; 52 51 FloatRect drawingRegion; -
trunk/Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp
r284718 r285597 433 433 // Creating a placeholder filter which is passed to the builder. 434 434 FloatRect dummyRect; 435 auto dummyFilter = SVGFilter::create(AffineTransform(), dummyRect, dummyRect, dummyRect, true); 435 FloatSize dummyScale(1, 1); 436 auto dummyFilter = SVGFilter::create(dummyScale, dummyRect, dummyRect, dummyRect, true); 436 437 if (auto builder = filter.buildPrimitives(dummyFilter.get())) { 437 438 TextStream::IndentScope indentScope(ts); -
trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp
r285543 r285597 66 66 ); 67 67 68 imageRect = filter().absoluteTransform().mapRect(imageRect);68 imageRect.scale(filter().filterScale()); 69 69 70 70 if (clipsToBounds()) … … 92 92 auto srcRect = m_sourceImageRect; 93 93 m_preserveAspectRatio.transformRect(imageRect, srcRect); 94 imageRect = filter().absoluteTransform().mapRect(imageRect);94 imageRect.scale(filter().filterScale()); 95 95 imageRect = drawingRegionOfInputImage(IntRect(imageRect)); 96 96 context.drawImage(image, imageRect, srcRect); … … 99 99 auto imageRect = primitiveSubregion; 100 100 imageRect.moveBy(m_sourceImageRect.location()); 101 imageRect = filter().absoluteTransform().mapRect(imageRect);101 imageRect.scale(filter().filterScale()); 102 102 imageRect = drawingRegionOfInputImage(IntRect(imageRect)); 103 103 context.drawImageBuffer(imageBuffer, imageRect.location()); -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp
r285543 r285597 25 25 namespace WebCore { 26 26 27 SVGFilter::SVGFilter(const AffineTransform& absoluteTransform, const FloatRect& absoluteSourceDrawingRegion, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode) 28 : Filter(Filter::Type::CSSFilter, absoluteTransform) 29 , m_absoluteSourceDrawingRegion(absoluteSourceDrawingRegion) 27 SVGFilter::SVGFilter(const FloatSize& filterScale, const FloatRect& sourceImageRect, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, bool effectBBoxMode) 28 : Filter(Filter::Type::SVGFilter, filterScale, sourceImageRect, filterRegion) 30 29 , m_targetBoundingBox(targetBoundingBox) 31 , m_filterRegion(filterRegion)32 30 , m_effectBBoxMode(effectBBoxMode) 33 31 { 34 m_absoluteFilterRegion = absoluteTransform.mapRect(filterRegion);35 32 } 36 33 37 FloatSize SVGFilter::scaledByFilter Resolution(FloatSize size) const34 FloatSize SVGFilter::scaledByFilterScale(FloatSize size) const 38 35 { 39 36 if (m_effectBBoxMode) 40 37 size = size * m_targetBoundingBox.size(); 41 38 42 return Filter::scaledByFilter Resolution(size) * m_absoluteFilterRegion.size() / m_filterRegion.size();39 return Filter::scaledByFilterScale(size); 43 40 } 44 41 45 Ref<SVGFilter> SVGFilter::create(const AffineTransform& absoluteTransform, const FloatRect& absoluteSourceDrawingRegion, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode)42 Ref<SVGFilter> SVGFilter::create(const FloatSize& filterScale, const FloatRect& sourceImageRect, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, bool effectBBoxMode) 46 43 { 47 return adoptRef(*new SVGFilter( absoluteTransform, absoluteSourceDrawingRegion, targetBoundingBox, filterRegion, effectBBoxMode));44 return adoptRef(*new SVGFilter(filterScale, sourceImageRect, filterRegion, targetBoundingBox, effectBBoxMode)); 48 45 } 49 46 -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h
r285543 r285597 21 21 #pragma once 22 22 23 #include "AffineTransform.h"24 23 #include "Filter.h" 25 #include "FilterEffect.h"26 24 #include "FloatRect.h" 27 25 #include <wtf/Ref.h> … … 32 30 class SVGFilter final : public Filter { 33 31 public: 34 static Ref<SVGFilter> create(const AffineTransform&, const FloatRect&, const FloatRect&, const FloatRect&, bool);32 static Ref<SVGFilter> create(const FloatSize& filterScale, const FloatRect& sourceImageRect, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode); 35 33 36 FloatRect filterRegionInUserSpace() const final { return m_filterRegion; } 37 FloatRect filterRegion() const final { return m_absoluteFilterRegion; } 34 FloatSize scaledByFilterScale(FloatSize) const final; 38 35 39 FloatSize scaledByFilterResolution(FloatSize) const final;40 41 FloatRect sourceImageRect() const final { return m_absoluteSourceDrawingRegion; }42 36 FloatRect targetBoundingBox() const { return m_targetBoundingBox; } 43 37 44 bool isSVGFilter() const final { return true; } 38 private: 39 SVGFilter(const FloatSize& filterScale, const FloatRect& sourceImageRect, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode); 45 40 46 private:47 SVGFilter(const AffineTransform& absoluteTransform, const FloatRect& absoluteSourceDrawingRegion, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode);48 49 FloatRect m_absoluteSourceDrawingRegion;50 41 FloatRect m_targetBoundingBox; 51 FloatRect m_absoluteFilterRegion;52 FloatRect m_filterRegion;53 42 bool m_effectBBoxMode; 54 43 };
Note:
See TracChangeset
for help on using the changeset viewer.