⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 285597 in webkit


Ignore:
Timestamp:
Nov 10, 2021, 11:21:17 AM (5 years ago)
Author:
Said Abou-Hallawa
Message:

[GPU Process] Make SVGFilter and CSSFilter work in the same coordinates system
https://bugs.webkit.org/show_bug.cgi?id=232457
rdar://85035379

Reviewed by Simon Fraser.

Source/WebCore:

Currently SVGFilter sets the following members of Filter

  1. AffineTransform m_absoluteTransform: this is the scaling part from the transformation from the target element to the outermost coordinate system
  2. FloatSize m_filterResolution: this is the clamping scale if the size of the result ImageBuffers exceeds MaxClampedArea

And the CSSFilter sets the following member of Filter:

  1. float m_filterScale: this is the document().deviceScaleFactor()

The discrepancy happens also when creating the result ImageBuffers. For
SVGFilter, we create them with scaleFactor = 1. This means the logicalSize
of the ImageBuffer is equal to its backendSize. But for CSSFilter we
create them with scaleFactor = m_filterScale. This means the logicalSize
!= backendSize in this case.

We need to unify the coordinates system for both filters. We need also to
replace the three members by a single FloatSize called "m_filterScale".

  • css/CSSFilterImageValue.cpp:

(WebCore::CSSFilterImageValue::image):

  • platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:

(WebCore::FilterEffectRendererCoreImage::renderToImageBuffer):
(WebCore::FilterEffectRendererCoreImage::destRect const):

  • platform/graphics/filters/FEConvolveMatrix.cpp:

(WebCore::FEConvolveMatrix::platformApplySoftware):

  • platform/graphics/filters/FEDisplacementMap.cpp:

(WebCore::FEDisplacementMap::platformApplySoftware):

  • platform/graphics/filters/FEDropShadow.cpp:

(WebCore::FEDropShadow::determineAbsolutePaintRect):
(WebCore::FEDropShadow::platformApplySoftware):

  • platform/graphics/filters/FEGaussianBlur.cpp:

(WebCore::FEGaussianBlur::calculateKernelSize):
(WebCore::FEGaussianBlur::platformApplySoftware):

  • platform/graphics/filters/FEMorphology.cpp:

(WebCore::FEMorphology::determineAbsolutePaintRect):
(WebCore::FEMorphology::platformApplySoftware):

  • platform/graphics/filters/FEOffset.cpp:

(WebCore::FEOffset::determineAbsolutePaintRect):
(WebCore::FEOffset::platformApplySoftware):

  • platform/graphics/filters/FETile.cpp:

(WebCore::FETile::platformApplySoftware):

  • platform/graphics/filters/FETurbulence.cpp:

(WebCore::FETurbulence::fillRegion const):
(WebCore::FETurbulence::platformApplySoftware):

  • platform/graphics/filters/Filter.h:

(WebCore::Filter::filterScale const):
(WebCore::Filter::setFilterScale):
(WebCore::Filter::sourceImageRect const):
(WebCore::Filter::setSourceImageRect):
(WebCore::Filter::filterRegion const):
(WebCore::Filter::setFilterRegion):
(WebCore::Filter::scaledByFilterScale const):
(WebCore::Filter::sourceImage):
(WebCore::Filter::setSourceImage):
(WebCore::Filter::Filter):
(WebCore::Filter::filterResolution const): Deleted.
(WebCore::Filter::setFilterResolution): Deleted.
(WebCore::Filter::absoluteTransform const): Deleted.
(WebCore::Filter::isSVGFilter const): Deleted.
(WebCore::Filter::isCSSFilter const): Deleted.
(WebCore::Filter::scaledByFilterResolution const): Deleted.

  • platform/graphics/filters/FilterEffect.cpp:

(WebCore::FilterEffect::determineFilterPrimitiveSubregion):
(WebCore::FilterEffect::apply):
(WebCore::FilterEffect::imageBufferResult):
(WebCore::FilterEffect::unmultipliedResult):
(WebCore::FilterEffect::premultipliedResult):
(WebCore::FilterEffect::copyImageBytes const):
(WebCore::FilterEffect::convertPixelBufferToColorSpace):
(WebCore::FilterEffect::convertImageBufferToColorSpace):
(WebCore::FilterEffect::copyUnmultipliedResult):
(WebCore::FilterEffect::copyPremultipliedResult):
(WebCore::FilterEffect::createImageBufferResult):
(WebCore::FilterEffect::createUnmultipliedImageResult):
(WebCore::FilterEffect::createPremultipliedImageResult):

  • platform/graphics/filters/SourceGraphic.cpp:

(WebCore::SourceGraphic::determineAbsolutePaintRect):

  • rendering/CSSFilter.cpp:

(WebCore::CSSFilter::create):
(WebCore::CSSFilter::CSSFilter):
(WebCore::CSSFilter::buildReferenceFilter):
(WebCore::CSSFilter::build):
(WebCore::CSSFilter::allocateBackingStoreIfNeeded):
(WebCore::CSSFilter::determineFilterPrimitiveSubregion):
(WebCore::CSSFilter::clearIntermediateResults):
(WebCore::CSSFilter::setSourceImageRect):
(WebCore::CSSFilter::outputRect const):

  • rendering/CSSFilter.h:
  • rendering/RenderLayerFilters.cpp:

(WebCore::RenderLayerFilters::buildFilter):

  • rendering/svg/RenderSVGResourceFilter.cpp:

(WebCore::RenderSVGResourceFilter::applyResource):
(WebCore::RenderSVGResourceFilter::postApplyResource):

  • rendering/svg/RenderSVGResourceFilter.h:
  • rendering/svg/SVGRenderTreeAsText.cpp:

(WebCore::writeSVGResourceContainer):

  • svg/graphics/filters/SVGFEImage.cpp:

(WebCore::FEImage::determineAbsolutePaintRect):
(WebCore::FEImage::platformApplySoftware):

  • svg/graphics/filters/SVGFilter.cpp:

(WebCore::SVGFilter::SVGFilter):
(WebCore::SVGFilter::scaledByFilterScale const):
(WebCore::SVGFilter::create):
(WebCore::SVGFilter::scaledByFilterResolution const): Deleted.

  • svg/graphics/filters/SVGFilter.h:

LayoutTests:

Skip the hidpi reference filter tests till we connect the FilterEffects
to the correct parent Filter.

  • platform/ios/TestExpectations:
  • platform/mac/TestExpectations:

Remove unnecessary un-skipping for conic-gradients tests since they were
not skipped globally.

Location:
trunk
Files:
27 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r285591 r285597  
     12021-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
    1182021-11-10  Geza Lore  <glore@igalia.com>
    219
  • trunk/LayoutTests/TestExpectations

    r285583 r285597  
    51735173js/dom/reflect-set-onto-dom.html [ Skip ]
    51745174userscripts/user-script-plugin-document.html [ Skip ]
     5175
     5176# These filter related failures should be fixed once webkit.org/b/232705 is resolved
     5177webkit.org/b/232705 compositing/filters/drop-shadow.html [ Skip ]
     5178webkit.org/b/232705 compositing/filters/simple-image-with-svg-filter.html [ Skip ]
     5179webkit.org/b/232705 css3/filters/backdrop/backdrop-filter-with-border-radius-and-reflection-remove.html [ Skip ]
     5180webkit.org/b/232705 css3/filters/color-interpolation-filters.html [ Skip ]
     5181webkit.org/b/232705 css3/filters/css-opacity-with-drop-shadow.html [ Skip ]
     5182webkit.org/b/232705 css3/filters/drop-shadow.html [ Skip ]
     5183webkit.org/b/232705 css3/filters/effect-brightness-square.html [ Skip ]
     5184webkit.org/b/232705 css3/filters/effect-contrast-square.html [ Skip ]
     5185webkit.org/b/232705 css3/filters/effect-grayscale-square.html [ Skip ]
     5186webkit.org/b/232705 css3/filters/effect-hue-rotate-square.html [ Skip ]
     5187webkit.org/b/232705 css3/filters/effect-invert-square.html [ Skip ]
     5188webkit.org/b/232705 css3/filters/effect-reference-local-url-with-base.html [ Skip ]
     5189webkit.org/b/232705 css3/filters/effect-saturate-square.html [ Skip ]
     5190webkit.org/b/232705 css3/filters/effect-sepia-square.html [ Skip ]
     5191webkit.org/b/232705 css3/filters/filter-is-on-subpixel-position.html [ Skip ]
     5192webkit.org/b/232705 css3/filters/filter-on-overflow-hidden.html [ Skip ]
     5193webkit.org/b/232705 css3/filters/filters-on-svg-root.html [ Skip ]
     5194webkit.org/b/232705 css3/filters/hidpi-feConvolveMatrix.html [ Skip ]
     5195webkit.org/b/232705 css3/filters/hidpi-filter-is-on-subpixel-position.html [ Skip ]
     5196webkit.org/b/232705 css3/filters/invalidate-sourceAlpha.html [ Skip ]
     5197webkit.org/b/232705 css3/filters/null-effect-check.html [ Skip ]
     5198webkit.org/b/232705 css3/filters/reference-filter-set-filter-regions.html [ Skip ]
     5199webkit.org/b/232705 css3/masking/clip-path-filter.html [ Skip ]
     5200webkit.org/b/232705 fast/filter-image/filter-image.html [ Skip ]
     5201webkit.org/b/232705 fast/gradients/conic-gradient-alpha.html [ Skip ]
     5202webkit.org/b/232705 fast/gradients/conic-gradient-extended-stops.html [ Skip ]
     5203webkit.org/b/232705 fast/gradients/conic-gradient.html [ Skip ]
     5204webkit.org/b/232705 fast/hidpi/filters-and-image-buffer-resolution.html [ Skip ]
     5205webkit.org/b/232705 fast/hidpi/filters-blur.html [ Skip ]
     5206webkit.org/b/232705 fast/hidpi/filters-component-transfer.html [ Skip ]
     5207webkit.org/b/232705 fast/hidpi/filters-hue-rotate.html [ Skip ]
     5208webkit.org/b/232705 fast/hidpi/filters-invert.html [ Skip ]
     5209webkit.org/b/232705 fast/hidpi/filters-morphology.html [ Skip ]
     5210webkit.org/b/232705 fast/hidpi/filters-multiple.html [ Skip ]
     5211webkit.org/b/232705 fast/hidpi/filters-reference.html [ Skip ]
     5212webkit.org/b/232705 fast/hidpi/filters-shadow.html [ Skip ]
     5213webkit.org/b/232705 fast/hidpi/filters-turbulence.html [ Skip ]
     5214webkit.org/b/232705 fast/multicol/filter-in-columns.html [ Skip ]
     5215webkit.org/b/232705 http/tests/css/filters-on-iframes.html [ Skip ]
     5216webkit.org/b/232705 imported/blink/css3/filters/effect-reference-add-hw.html [ Skip ]
     5217webkit.org/b/232705 imported/blink/css3/filters/effect-reference-on-transparent-element.html [ Skip ]
     5218webkit.org/b/232705 imported/blink/css3/filters/effect-reference-source-alpha-hw.html [ Skip ]
     5219webkit.org/b/232705 imported/blink/svg/filters/filter-huge-clamping.svg [ Skip ]
     5220webkit.org/b/232705 imported/mozilla/svg/svg-effects-area-unzoomed.xhtml [ Skip ]
     5221webkit.org/b/232705 imported/mozilla/svg/svg-effects-area-zoomed-in.xhtml [ Skip ]
     5222webkit.org/b/232705 imported/mozilla/svg/svg-effects-area-zoomed-out.xhtml [ Skip ]
     5223webkit.org/b/232705 imported/w3c/web-platform-tests/css/css-overflow/overflow-scroll-resize-visibility-hidden.html [ Skip ]
     5224webkit.org/b/232705 svg/custom/feColorMatrix-values-leading-spaces.html [ Skip ]
     5225webkit.org/b/232705 svg/custom/resources-css-scaled.html [ Skip ]
     5226webkit.org/b/232705 svg/filters/big-sized-off-viewport-filter.svg [ Skip ]
  • trunk/LayoutTests/platform/ios/TestExpectations

    r285589 r285597  
    29732973editing/selection/character-granularity-rect.html [ Pass ]
    29742974
    2975 # < iOS12 doesn't support the CG needed for Conic Gradients
    2976 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 
    29892975# <rdar://problem/36455339> LayoutTest compositing/ios/overflow-scroll-touch-tiles.html is a flaky failure
    29902976compositing/ios/overflow-scroll-touch-tiles.html [ Pass Failure ]
  • trunk/LayoutTests/platform/mac/TestExpectations

    r285554 r285597  
    14141414
    14151415# < 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 ]
    14281416[ Mojave ] imported/w3c/web-platform-tests/css/css-images/multiple-position-color-stop-conic.html [ Pass ]
    14291417
  • trunk/Source/WebCore/ChangeLog

    r285589 r285597  
     12021-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
    11172021-11-10  Tyler Wilcock  <tyler_w@apple.com>
    2118
  • trunk/Source/WebCore/css/CSSFilterImageValue.cpp

    r284857 r285597  
    127127    cssFilter->setSourceImage(WTFMove(texture));
    128128    cssFilter->setSourceImageRect(imageRect);
    129     cssFilter->setFilterRegion(imageRect);
    130129    if (!cssFilter->build(renderer, m_filterOperations, FilterConsumer::FilterFunction))
    131130        return &Image::nullImage();
  • trunk/Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm

    r285543 r285597  
    243243{
    244244    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);
    246246    if (!m_outputImageBuffer) {
    247247        clearResult();
     
    255255{
    256256    IntSize destSize = lastEffect.absolutePaintRect().size();
    257     destSize.scale(lastEffect.filter().filterScale());
    258257    FloatRect destRect = FloatRect(FloatPoint(), destSize);
    259258    return destRect;
  • trunk/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp

    r285543 r285597  
    387387
    388388    IntSize paintSize = absolutePaintRect().size();
    389     paintSize.scale(filter().filterScale());
    390 
     389   
    391390    PaintingData paintingData = {
    392391        *sourcePixelArray,
  • trunk/Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp

    r285543 r285597  
    120120    Filter& filter = this->filter();
    121121    IntSize paintSize = absolutePaintRect().size();
    122     paintSize.scale(filter.filterScale());
    123122
    124     FloatSize scale = filter.scaledByFilterResolution({ m_scale, m_scale });
     123    FloatSize scale = filter.scaledByFilterScale({ m_scale, m_scale });
    125124    float scaleForColorX = scale.width() / 255.0;
    126125    float scaleForColorY = scale.height() / 255.0;
  • trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp

    r285543 r285597  
    5454    FloatRect absolutePaintRect = inputEffect(0)->absolutePaintRect();
    5555    FloatRect absoluteOffsetPaintRect(absolutePaintRect);
    56     absoluteOffsetPaintRect.move(filter.scaledByFilterResolution({ m_dx, m_dy }));
     56    absoluteOffsetPaintRect.move(filter.scaledByFilterScale({ m_dx, m_dy }));
    5757    absolutePaintRect.unite(absoluteOffsetPaintRect);
    5858
     
    8181    Filter& filter = this->filter();
    8282   
    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 });
    8685
    8786    FloatRect drawingRegion = drawingRegionOfInputImage(in->absolutePaintRect());
  • trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp

    r285543 r285597  
    486486IntSize FEGaussianBlur::calculateKernelSize(const Filter& filter, FloatSize stdDeviation)
    487487{
    488     return calculateUnscaledKernelSize(filter.scaledByFilterResolution(stdDeviation));
     488    return calculateUnscaledKernelSize(filter.scaledByFilterScale(stdDeviation));
    489489}
    490490
     
    538538
    539539    IntSize kernelSize = calculateKernelSize(filter(), { m_stdX, m_stdY });
    540     kernelSize.scale(filter().filterScale());
    541540
    542541    IntSize paintSize = absolutePaintRect().size();
    543     paintSize.scale(filter().filterScale());
    544542    auto tmpImageData = Uint8ClampedArray::tryCreateUninitialized(paintSize.area() * 4);
    545543    if (!tmpImageData)
  • trunk/Source/WebCore/platform/graphics/filters/FEMorphology.cpp

    r285543 r285597  
    7777    FloatRect paintRect = inputEffect(0)->absolutePaintRect();
    7878    Filter& filter = this->filter();
    79     paintRect.inflate(filter.scaledByFilterResolution({ m_radiusX, m_radiusY }));
     79    paintRect.inflate(filter.scaledByFilterScale({ m_radiusX, m_radiusY }));
    8080    if (clipsToBounds())
    8181        paintRect.intersect(maxEffectRect());
     
    264264        return;
    265265
    266     radius = flooredIntSize(filter.scaledByFilterResolution({ m_radiusX, m_radiusY }));
     266    radius = flooredIntSize(filter.scaledByFilterScale({ m_radiusX, m_radiusY }));
    267267    int radiusX = std::min(effectDrawingRect.width() - 1, radius.width());
    268268    int radiusY = std::min(effectDrawingRect.height() - 1, radius.height());
     
    274274    paintingData.srcPixelArray = sourcePixelArray.get();
    275275    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);
    280280
    281281    platformApply(paintingData);
  • trunk/Source/WebCore/platform/graphics/filters/FEOffset.cpp

    r285543 r285597  
    5757    FloatRect paintRect = inputEffect(0)->absolutePaintRect();
    5858    Filter& filter = this->filter();
    59     paintRect.move(filter.scaledByFilterResolution({ m_dx, m_dy }));
     59    paintRect.move(filter.scaledByFilterScale({ m_dx, m_dy }));
    6060    if (clipsToBounds())
    6161        paintRect.intersect(maxEffectRect());
     
    7878    FloatRect drawingRegion = drawingRegionOfInputImage(in->absolutePaintRect());
    7979    Filter& filter = this->filter();
    80     drawingRegion.move(filter.scaledByFilterResolution({ m_dx, m_dy }));
     80    drawingRegion.move(filter.scaledByFilterScale({ m_dx, m_dy }));
    8181    resultImage->context().drawImageBuffer(*inBuffer, drawingRegion);
    8282}
  • trunk/Source/WebCore/platform/graphics/filters/FETile.cpp

    r285543 r285597  
    6262        Filter& filter = this->filter();
    6363        tileRect = filter.filterRegion();
    64         tileRect.scale(filter.filterResolution().width(), filter.filterResolution().height());
     64        tileRect.scale(filter.filterScale());
    6565    }
    6666
  • trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp

    r285543 r285597  
    372372
    373373    IntRect filterRegion = absolutePaintRect();
    374     filterRegion.scale(filter().filterScale());
    375374    FloatPoint point(0, filterRegion.y() + startY);
    376375    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() };
    378377
    379378    for (int y = startY; y < endY; ++y) {
     
    382381        for (int x = 0; x < filterRegion.width(); ++x) {
    383382            point.setX(point.x() + 1);
    384             FloatPoint localPoint = inverseTransfrom.mapPoint(point);
     383            FloatPoint localPoint = point.scaled(inverseScale.width(), inverseScale.height());
    385384            auto values = calculateTurbulenceValueForPoint(paintingData, stitchData, localPoint);
    386385            pixelArray.setRange(values.components.data(), 4, indexOfPixelChannel);
     
    404403
    405404    IntSize resultSize(absolutePaintRect().size());
    406     resultSize.scale(filter().filterScale());
    407405
    408406    if (resultSize.isEmpty()) {
  • trunk/Source/WebCore/platform/graphics/filters/Filter.h

    r285543 r285597  
    3434class Filter : public FilterFunction {
    3535public:
     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(); }
    3648    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; }
    4649
    4750    RenderingMode renderingMode() const { return m_renderingMode; }
    4851    void setRenderingMode(RenderingMode renderingMode) { m_renderingMode = renderingMode; }
    4952
    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 
    5953protected:
    60     Filter(Filter::Type filterType, const AffineTransform& absoluteTransform, float filterScale = 1)
     54    Filter(Filter::Type filterType, const FloatSize& filterScale)
    6155        : FilterFunction(filterType)
    62         , m_absoluteTransform(absoluteTransform)
    6356        , m_filterScale(filterScale)
    6457    {
    6558    }
    6659
    67     Filter(Filter::Type filterType, const FloatSize& filterResolution)
     60    Filter(Filter::Type filterType, const FloatSize& filterScale, const FloatRect& sourceImageRect, const FloatRect& filterRegion)
    6861        : FilterFunction(filterType)
    69         , m_filterResolution(filterResolution)
     62        , m_filterScale(filterScale)
     63        , m_sourceImageRect(sourceImageRect)
     64        , m_filterRegion(filterRegion)
    7065    {
    7166    }
    7267
    7368private:
     69    FloatSize m_filterScale;
     70    FloatRect m_sourceImageRect;
     71    FloatRect m_filterRegion;
     72
    7473    RefPtr<ImageBuffer> m_sourceImage;
    75     FloatSize m_filterResolution;
    76     AffineTransform m_absoluteTransform;
    7774    RenderingMode m_renderingMode { RenderingMode::Unaccelerated };
    78     float m_filterScale { 1 };
    7975};
    8076
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp

    r285543 r285597  
    106106        }
    107107    } else
    108         subregion = m_filter.filterRegionInUserSpace();
     108        subregion = m_filter.filterRegion();
    109109
    110110    // After calling determineFilterPrimitiveSubregion on the target effect, reset the subregion again for <feTile>.
    111111    if (filterType() == FilterEffect::Type::FETile)
    112         subregion = m_filter.filterRegionInUserSpace();
     112        subregion = m_filter.filterRegion();
    113113
    114114    auto boundaries = effectBoundaries();
     
    124124    setFilterPrimitiveSubregion(subregion);
    125125
    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());
    129128    // Save this before clipping so we can use it to map lighting points from user space to buffer coordinates.
    130129    setUnclippedAbsoluteSubregion(absoluteSubregion);
     
    132131    // Clip every filter effect to the filter region.
    133132    auto absoluteScaledFilterRegion = m_filter.filterRegion();
    134     absoluteScaledFilterRegion.scale(filterResolution);
     133    absoluteScaledFilterRegion.scale(m_filter.filterScale());
    135134    absoluteSubregion.intersect(absoluteScaledFilterRegion);
    136135
     
    180179    setResultColorSpace(m_operatingColorSpace);
    181180
    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());
    183182
    184183    if (m_absolutePaintRect.isEmpty() || ImageBuffer::sizeNeedsClamping(m_absolutePaintRect.size()))
     
    272271        return m_imageBufferResult.get();
    273272
    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);
    275274    if (!m_imageBufferResult)
    276275        return nullptr;
     
    288287    IntSize scaledSize(rect.size());
    289288    ASSERT(!ImageBuffer::sizeNeedsClamping(scaledSize));
    290     scaledSize.scale(m_filter.filterScale());
    291289    auto checkedArea = scaledSize.area<RecordOverflow>() * 4;
    292290    if (checkedArea.hasOverflowed())
     
    303301    IntSize scaledSize(rect.size());
    304302    ASSERT(!ImageBuffer::sizeNeedsClamping(scaledSize));
    305     scaledSize.scale(m_filter.filterScale());
    306303    auto checkedArea = scaledSize.area<RecordOverflow>() * 4;
    307304    if (checkedArea.hasOverflowed())
     
    317314{
    318315    IntRect scaledRect(rect);
    319     scaledRect.scale(m_filter.filterScale());
    320316    IntSize scaledPaintSize(m_absolutePaintRect.size());
    321     scaledPaintSize.scale(m_filter.filterScale());
    322317
    323318    // Initialize the destination to transparent black, if not entirely covered by the source.
     
    443438
    444439    IntRect destinationRect(IntPoint(), pixelBuffer.size());
    445     destinationRect.scale(1 / m_filter.filterScale());
    446440    FloatSize clampedSize = ImageBuffer::clampedSize(destinationRect.size());
    447441    // 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);
    449443    if (!buffer)
    450444        return std::nullopt;
     
    460454
    461455    // 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);
    463457    if (!convertedBuffer)
    464458        return std::nullopt;
     
    512506            IntSize inputSize(m_absolutePaintRect.size());
    513507            ASSERT(!ImageBuffer::sizeNeedsClamping(inputSize));
    514             inputSize.scale(m_filter.filterScale());
    515508           
    516509            ASSERT(m_premultipliedImageResult->format().colorSpace == m_resultColorSpace);
     
    551544            IntSize inputSize(m_absolutePaintRect.size());
    552545            ASSERT(!ImageBuffer::sizeNeedsClamping(inputSize));
    553             inputSize.scale(m_filter.filterScale());
    554546
    555547            ASSERT(m_unmultipliedImageResult->format().colorSpace == m_resultColorSpace);
     
    579571
    580572    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);
    582574    return m_imageBufferResult.get();
    583575}
     
    596588    IntSize resultSize(m_absolutePaintRect.size());
    597589    ASSERT(!ImageBuffer::sizeNeedsClamping(resultSize));
    598     resultSize.scale(m_filter.filterScale());
    599590    PixelBufferFormat format { AlphaPremultiplication::Unpremultiplied, PixelFormat::RGBA8, m_resultColorSpace };
    600591    m_unmultipliedImageResult = PixelBuffer::tryCreate(format, resultSize);
     
    615606    IntSize resultSize(m_absolutePaintRect.size());
    616607    ASSERT(!ImageBuffer::sizeNeedsClamping(resultSize));
    617     resultSize.scale(m_filter.filterScale());
    618608    PixelBufferFormat format { AlphaPremultiplication::Premultiplied, PixelFormat::RGBA8, m_resultColorSpace };
    619609    m_premultipliedImageResult = PixelBuffer::tryCreate(format, resultSize);
  • trunk/Source/WebCore/platform/graphics/filters/SourceGraphic.cpp

    r285543 r285597  
    3636    Filter& filter = this->filter();
    3737    FloatRect paintRect = filter.sourceImageRect();
    38     paintRect.scale(filter.filterResolution().width(), filter.filterResolution().height());
    3938    setAbsolutePaintRect(enclosingIntRect(paintRect));
    4039}
  • trunk/Source/WebCore/rendering/CSSFilter.cpp

    r285543 r285597  
    5555namespace WebCore {
    5656
    57 Ref<CSSFilter> CSSFilter::create()
    58 {
    59     return adoptRef(*new CSSFilter);
    60 }
    61 
    62 CSSFilter::CSSFilter()
    63     : Filter(Filter::Type::CSSFilter, FloatSize { 1, 1 })
     57Ref<CSSFilter> CSSFilter::create(float scaleFactor)
     58{
     59    return adoptRef(*new CSSFilter(scaleFactor));
     60}
     61
     62CSSFilter::CSSFilter(float scaleFactor)
     63    : Filter(Filter::Type::CSSFilter, FloatSize { scaleFactor, scaleFactor })
    6464    , m_sourceGraphic(SourceGraphic::create(*this))
    6565{
    6666}
    67 
    68 CSSFilter::~CSSFilter() = default;
    6967
    7068GraphicsContext* CSSFilter::inputContext()
     
    8785
    8886    auto builder = makeUnique<SVGFilterBuilder>(&previousEffect);
    89     m_sourceAlpha = builder->getEffectById(SourceAlpha::effectName());
    9087
    9188    RefPtr<FilterEffect> effect;
     
    303300    m_effects.shrinkToFit();
    304301
    305     setMaxEffectRects(m_sourceDrawingRegion);
     302    setMaxEffectRects(sourceImageRect());
    306303#if USE(CORE_IMAGE)
    307304    if (!m_filterRenderer)
     
    332329        return;
    333330
    334     auto logicalSize = m_sourceDrawingRegion.size();
     331    auto logicalSize = sourceImageRect().size();
    335332    if (!sourceImage() || sourceImage()->logicalSize() != logicalSize) {
    336333#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));
    338335#else
    339336        UNUSED_PARAM(targetContext);
    340337        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));
    342339#endif
    343340    }
     
    351348    FloatRect subRegion = lastEffect.maxEffectRect();
    352349    // 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         setFilterResolution(scale);
     350    FloatSize filterScale { 1, 1 };
     351    if (ImageBuffer::sizeNeedsClamping(subRegion.size(), filterScale)) {
     352        setFilterScale(filterScale);
    356353        lastEffect.determineFilterPrimitiveSubregion();
    357354    }
     
    361358{
    362359    m_sourceGraphic->clearResult();
    363     if (m_sourceAlpha)
    364         m_sourceAlpha->clearResult();
    365360    for (auto& effect : m_effects)
    366361        effect->clearResult();
     
    401396void CSSFilter::setSourceImageRect(const FloatRect& sourceImageRect)
    402397{
    403     m_sourceDrawingRegion = sourceImageRect;
     398    Filter::setFilterRegion(sourceImageRect);
     399    Filter::setSourceImageRect(sourceImageRect);
    404400    setMaxEffectRects(sourceImageRect);
    405     setFilterRegion(sourceImageRect);
    406401    m_graphicsBufferAttached = false;
    407402}
     
    418413   
    419414    if (lastEffect.hasResult() || (m_filterRenderer && m_filterRenderer->hasResult()))
    420         return lastEffect.requestedRegionOfInputPixelBuffer(IntRect { m_filterRegion });
     415        return lastEffect.requestedRegionOfInputPixelBuffer(IntRect { filterRegion() });
    421416   
    422417    return { };
  • trunk/Source/WebCore/rendering/CSSFilter.h

    r264805 r285597  
    3939class ReferenceFilterOperation;
    4040class RenderElement;
    41 class SourceAlpha;
    4241class SourceGraphic;
    4342
     
    4847    friend class RenderLayerFilters;
    4948public:
    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);
    5450
    5551    ImageBuffer* output() const;
    5652
     53    void setSourceImageRect(const FloatRect&);
    5754    bool build(RenderElement&, const FilterOperations&, FilterConsumer);
    5855    void clearIntermediateResults();
     
    6663
    6764private:
    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);
    7766
    7867    RefPtr<FilterEffect> buildReferenceFilter(RenderElement&, FilterEffect& previousEffect, ReferenceFilterOperation&);
     
    8978    LayoutRect computeSourceImageRectForDirtyRect(const LayoutRect& filterBoxRect, const LayoutRect& dirtyRect);
    9079
    91     FloatRect m_sourceDrawingRegion;
    92     FloatRect m_filterRegion;
    93 
    9480    Vector<Ref<FilterEffect>> m_effects;
    9581    Ref<SourceGraphic> m_sourceGraphic;
    96     RefPtr<FilterEffect> m_sourceAlpha;
    9782
    9883    mutable IntOutsets m_outsets;
  • trunk/Source/WebCore/rendering/RenderLayerFilters.cpp

    r261597 r285597  
    119119void RenderLayerFilters::buildFilter(RenderElement& renderer, float scaleFactor, RenderingMode renderingMode)
    120120{
    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);
    129124
    130125    // If the filter fails to build, remove it from the layer. It will still attempt to
    131126    // 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.
    133127    if (!m_filter->build(renderer, renderer.style().filter(), FilterConsumer::FilterProperty))
    134128        m_filter = nullptr;
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp

    r283851 r285597  
    144144
    145145    // 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());
    147147
    148148    // Determine absolute boundaries of the filter and the drawing region.
    149149    filterData->drawingRegion = renderer.strokeBoundingBox();
    150150    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);
    152156
    153157    // Create the SVGFilter object.
    154158    bool primitiveBoundingBoxMode = filterElement().primitiveUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
    155     filterData->filter = SVGFilter::create(filterData->shearFreeAbsoluteTransform, absoluteDrawingRegion, targetBoundingBox, filterData->boundaries, primitiveBoundingBoxMode);
     159    filterData->filter = SVGFilter::create(filterScale, absoluteDrawingRegion, filterData->boundaries, targetBoundingBox, primitiveBoundingBoxMode);
    156160
    157161    // Create all relevant filter primitives.
     
    160164        return false;
    161165
    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 
    171166    static const unsigned maxTotalOfEffectInputs = 100;
    172167    FilterEffect* lastEffect = filterData->builder->lastEffect();
     
    178173    lastEffect->determineFilterPrimitiveSubregion();
    179174    FloatRect subRegion = lastEffect->maxEffectRect();
     175
    180176    // At least one FilterEffect has a too big image size,
    181177    // recalculate the effect sizes with new scale factors.
    182     if (ImageBuffer::sizeNeedsClamping(subRegion.size(), scale)) {
    183         filterData->filter->setFilterResolution(scale);
     178    if (ImageBuffer::sizeNeedsClamping(subRegion.size(), filterScale)) {
     179        filterData->filter->setFilterScale(filterScale);
    184180        lastEffect->determineFilterPrimitiveSubregion();
    185181    }
     
    195191
    196192    // 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);
    200194
    201195    auto renderingMode = renderer.settings().acceleratedFiltersEnabled() ? RenderingMode::Accelerated : RenderingMode::Unaccelerated;
     
    290284        ImageBuffer* resultImage = lastEffect->imageBufferResult();
    291285        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()));
    295287            context->drawImageBuffer(*resultImage, lastEffect->absolutePaintRect());
    296             context->scale(filterData.filter->filterResolution());
    297 
    298             context->concatCTM(filterData.shearFreeAbsoluteTransform);
     288            context->scale(filterData.filter->filterScale());
    299289        }
    300290    }
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h

    r283851 r285597  
    4848    RefPtr<ImageBuffer> sourceGraphicBuffer;
    4949    GraphicsContext* savedContext { nullptr };
    50     AffineTransform shearFreeAbsoluteTransform;
    5150    FloatRect boundaries;
    5251    FloatRect drawingRegion;
  • trunk/Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp

    r284718 r285597  
    433433        // Creating a placeholder filter which is passed to the builder.
    434434        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);
    436437        if (auto builder = filter.buildPrimitives(dummyFilter.get())) {
    437438            TextStream::IndentScope indentScope(ts);
  • trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp

    r285543 r285597  
    6666    );
    6767
    68     imageRect = filter().absoluteTransform().mapRect(imageRect);
     68    imageRect.scale(filter().filterScale());
    6969
    7070    if (clipsToBounds())
     
    9292            auto srcRect = m_sourceImageRect;
    9393            m_preserveAspectRatio.transformRect(imageRect, srcRect);
    94             imageRect = filter().absoluteTransform().mapRect(imageRect);
     94            imageRect.scale(filter().filterScale());
    9595            imageRect = drawingRegionOfInputImage(IntRect(imageRect));
    9696            context.drawImage(image, imageRect, srcRect);
     
    9999            auto imageRect = primitiveSubregion;
    100100            imageRect.moveBy(m_sourceImageRect.location());
    101             imageRect = filter().absoluteTransform().mapRect(imageRect);
     101            imageRect.scale(filter().filterScale());
    102102            imageRect = drawingRegionOfInputImage(IntRect(imageRect));
    103103            context.drawImageBuffer(imageBuffer, imageRect.location());
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp

    r285543 r285597  
    2525namespace WebCore {
    2626
    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)
     27SVGFilter::SVGFilter(const FloatSize& filterScale, const FloatRect& sourceImageRect, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, bool effectBBoxMode)
     28    : Filter(Filter::Type::SVGFilter, filterScale, sourceImageRect, filterRegion)
    3029    , m_targetBoundingBox(targetBoundingBox)
    31     , m_filterRegion(filterRegion)
    3230    , m_effectBBoxMode(effectBBoxMode)
    3331{
    34     m_absoluteFilterRegion = absoluteTransform.mapRect(filterRegion);
    3532}
    3633
    37 FloatSize SVGFilter::scaledByFilterResolution(FloatSize size) const
     34FloatSize SVGFilter::scaledByFilterScale(FloatSize size) const
    3835{
    3936    if (m_effectBBoxMode)
    4037        size = size * m_targetBoundingBox.size();
    4138
    42     return Filter::scaledByFilterResolution(size) * m_absoluteFilterRegion.size() / m_filterRegion.size();
     39    return Filter::scaledByFilterScale(size);
    4340}
    4441
    45 Ref<SVGFilter> SVGFilter::create(const AffineTransform& absoluteTransform, const FloatRect& absoluteSourceDrawingRegion, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode)
     42Ref<SVGFilter> SVGFilter::create(const FloatSize& filterScale, const FloatRect& sourceImageRect, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, bool effectBBoxMode)
    4643{
    47     return adoptRef(*new SVGFilter(absoluteTransform, absoluteSourceDrawingRegion, targetBoundingBox, filterRegion, effectBBoxMode));
     44    return adoptRef(*new SVGFilter(filterScale, sourceImageRect, filterRegion, targetBoundingBox, effectBBoxMode));
    4845}
    4946
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h

    r285543 r285597  
    2121#pragma once
    2222
    23 #include "AffineTransform.h"
    2423#include "Filter.h"
    25 #include "FilterEffect.h"
    2624#include "FloatRect.h"
    2725#include <wtf/Ref.h>
     
    3230class SVGFilter final : public Filter {
    3331public:
    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);
    3533
    36     FloatRect filterRegionInUserSpace() const final { return m_filterRegion; }
    37     FloatRect filterRegion() const final { return m_absoluteFilterRegion; }
     34    FloatSize scaledByFilterScale(FloatSize) const final;
    3835
    39     FloatSize scaledByFilterResolution(FloatSize) const final;
    40 
    41     FloatRect sourceImageRect() const final { return m_absoluteSourceDrawingRegion; }
    4236    FloatRect targetBoundingBox() const { return m_targetBoundingBox; }
    4337
    44     bool isSVGFilter() const final { return true; }
     38private:
     39    SVGFilter(const FloatSize& filterScale, const FloatRect& sourceImageRect, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode);
    4540
    46 private:
    47     SVGFilter(const AffineTransform& absoluteTransform, const FloatRect& absoluteSourceDrawingRegion, const FloatRect& targetBoundingBox, const FloatRect& filterRegion, bool effectBBoxMode);
    48 
    49     FloatRect m_absoluteSourceDrawingRegion;
    5041    FloatRect m_targetBoundingBox;
    51     FloatRect m_absoluteFilterRegion;
    52     FloatRect m_filterRegion;
    5342    bool m_effectBBoxMode;
    5443};
Note: See TracChangeset for help on using the changeset viewer.