Changeset 226363 in webkit


Ignore:
Timestamp:
Jan 3, 2018 9:58:05 AM (6 years ago)
Author:
Simon Fraser
Message:

SVG lighting filter lights are in the wrong coordinate system
https://bugs.webkit.org/show_bug.cgi?id=181147

Reviewed by Zalan Bujtas.

Source/WebCore:

Point and spot light coordinates weren't being converted into buffer-relative
coordinates before being fed into the lighting math, resulting in incorrect light
rendering on Retina devices, and when the filter primitive region was clipped.

Fix by storing absoluteUnclippedSubregion on FilterEffect, which allows us to map
lighting points from user space coordinates into the coordinates of the buffer being
used for rendering. Also scale the light z coordinate by doing a dummy point mapping in x.

Rename members of PointLightSource and SpotLightSource to make it clear which coordinate
system they are in.

Tests include HiDPI tests.

Tests: svg/filters/fePointLight-coordinates-expected.svg

svg/filters/fePointLight-coordinates.svg
svg/filters/feSpotLight-coordinates-expected.svg
svg/filters/feSpotLight-coordinates.svg
svg/filters/hidpi/fePointLight-coordinates-expected.svg
svg/filters/hidpi/fePointLight-coordinates.svg
svg/filters/hidpi/feSpotLight-coordinates-expected.svg
svg/filters/hidpi/feSpotLight-coordinates.svg

  • platform/graphics/FloatPoint3D.h: Make it easy to get and set the X and Y coords as a FloatPoint.

(WebCore::FloatPoint3D::xy const):
(WebCore::FloatPoint3D::setXY):

  • platform/graphics/GeometryUtilities.cpp:

(WebCore::mapPoint):
(WebCore::mapRect):

  • platform/graphics/GeometryUtilities.h: Helper to make a point between rects.
  • platform/graphics/filters/DistantLightSource.cpp:

(WebCore::DistantLightSource::initPaintingData):

  • platform/graphics/filters/DistantLightSource.h:
  • platform/graphics/filters/FELighting.cpp:

(WebCore::FELighting::drawLighting):

  • platform/graphics/filters/FilterEffect.cpp:

(WebCore::FilterEffect::mapPointFromUserSpaceToBuffer const):

  • platform/graphics/filters/FilterEffect.h:

(WebCore::FilterEffect::setUnclippedAbsoluteSubregion):

  • platform/graphics/filters/LightSource.h:
  • platform/graphics/filters/PointLightSource.cpp:

(WebCore::PointLightSource::initPaintingData):
(WebCore::PointLightSource::computePixelLightingData const):
(WebCore::PointLightSource::setX):
(WebCore::PointLightSource::setY):
(WebCore::PointLightSource::setZ):

  • platform/graphics/filters/PointLightSource.h:

(WebCore::PointLightSource::position const):
(WebCore::PointLightSource::PointLightSource):

  • platform/graphics/filters/SpotLightSource.cpp:

(WebCore::SpotLightSource::initPaintingData):
(WebCore::SpotLightSource::computePixelLightingData const):
(WebCore::SpotLightSource::setX):
(WebCore::SpotLightSource::setY):
(WebCore::SpotLightSource::setZ):
(WebCore::SpotLightSource::setPointsAtX):
(WebCore::SpotLightSource::setPointsAtY):
(WebCore::SpotLightSource::setPointsAtZ):

  • platform/graphics/filters/SpotLightSource.h:

(WebCore::SpotLightSource::position const):
(WebCore::SpotLightSource::direction const):
(WebCore::SpotLightSource::SpotLightSource):

  • rendering/svg/RenderSVGResourceFilter.cpp:

(WebCore::RenderSVGResourceFilter::buildPrimitives const):

  • rendering/svg/RenderSVGResourceFilterPrimitive.cpp:

(WebCore::RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion):

LayoutTests:

  • svg/filters/fePointLight-coordinates-expected.svg: Added.
  • svg/filters/fePointLight-coordinates.svg: Added.
  • svg/filters/feSpotLight-coordinates-expected.svg: Added.
  • svg/filters/feSpotLight-coordinates.svg: Added.
  • svg/filters/hidpi/fePointLight-coordinates-expected.svg: Added.
  • svg/filters/hidpi/fePointLight-coordinates.svg: Added.
  • svg/filters/hidpi/feSpotLight-coordinates-expected.svg: Added.
  • svg/filters/hidpi/feSpotLight-coordinates.svg: Added.
Location:
trunk
Files:
9 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r226361 r226363  
     12018-01-03  Simon Fraser  <simon.fraser@apple.com>
     2
     3        SVG lighting filter lights are in the wrong coordinate system
     4        https://bugs.webkit.org/show_bug.cgi?id=181147
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        * svg/filters/fePointLight-coordinates-expected.svg: Added.
     9        * svg/filters/fePointLight-coordinates.svg: Added.
     10        * svg/filters/feSpotLight-coordinates-expected.svg: Added.
     11        * svg/filters/feSpotLight-coordinates.svg: Added.
     12        * svg/filters/hidpi/fePointLight-coordinates-expected.svg: Added.
     13        * svg/filters/hidpi/fePointLight-coordinates.svg: Added.
     14        * svg/filters/hidpi/feSpotLight-coordinates-expected.svg: Added.
     15        * svg/filters/hidpi/feSpotLight-coordinates.svg: Added.
     16
    1172018-01-03  Youenn Fablet  <youenn@apple.com>
    218
  • trunk/Source/WebCore/ChangeLog

    r226361 r226363  
     12018-01-03  Simon Fraser  <simon.fraser@apple.com>
     2
     3        SVG lighting filter lights are in the wrong coordinate system
     4        https://bugs.webkit.org/show_bug.cgi?id=181147
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        Point and spot light coordinates weren't being converted into buffer-relative
     9        coordinates before being fed into the lighting math, resulting in incorrect light
     10        rendering on Retina devices, and when the filter primitive region was clipped.
     11
     12        Fix by storing absoluteUnclippedSubregion on FilterEffect, which allows us to map
     13        lighting points from user space coordinates into the coordinates of the buffer being
     14        used for rendering. Also scale the light z coordinate by doing a dummy point mapping in x.
     15
     16        Rename members of PointLightSource and SpotLightSource to make it clear which coordinate
     17        system they are in.
     18
     19        Tests include HiDPI tests.
     20
     21        Tests: svg/filters/fePointLight-coordinates-expected.svg
     22               svg/filters/fePointLight-coordinates.svg
     23               svg/filters/feSpotLight-coordinates-expected.svg
     24               svg/filters/feSpotLight-coordinates.svg
     25               svg/filters/hidpi/fePointLight-coordinates-expected.svg
     26               svg/filters/hidpi/fePointLight-coordinates.svg
     27               svg/filters/hidpi/feSpotLight-coordinates-expected.svg
     28               svg/filters/hidpi/feSpotLight-coordinates.svg
     29
     30        * platform/graphics/FloatPoint3D.h: Make it easy to get and set the X and Y coords as a FloatPoint.
     31        (WebCore::FloatPoint3D::xy const):
     32        (WebCore::FloatPoint3D::setXY):
     33        * platform/graphics/GeometryUtilities.cpp:
     34        (WebCore::mapPoint):
     35        (WebCore::mapRect):
     36        * platform/graphics/GeometryUtilities.h: Helper to make a point between rects.
     37        * platform/graphics/filters/DistantLightSource.cpp:
     38        (WebCore::DistantLightSource::initPaintingData):
     39        * platform/graphics/filters/DistantLightSource.h:
     40        * platform/graphics/filters/FELighting.cpp:
     41        (WebCore::FELighting::drawLighting):
     42        * platform/graphics/filters/FilterEffect.cpp:
     43        (WebCore::FilterEffect::mapPointFromUserSpaceToBuffer const):
     44        * platform/graphics/filters/FilterEffect.h:
     45        (WebCore::FilterEffect::setUnclippedAbsoluteSubregion):
     46        * platform/graphics/filters/LightSource.h:
     47        * platform/graphics/filters/PointLightSource.cpp:
     48        (WebCore::PointLightSource::initPaintingData):
     49        (WebCore::PointLightSource::computePixelLightingData const):
     50        (WebCore::PointLightSource::setX):
     51        (WebCore::PointLightSource::setY):
     52        (WebCore::PointLightSource::setZ):
     53        * platform/graphics/filters/PointLightSource.h:
     54        (WebCore::PointLightSource::position const):
     55        (WebCore::PointLightSource::PointLightSource):
     56        * platform/graphics/filters/SpotLightSource.cpp:
     57        (WebCore::SpotLightSource::initPaintingData):
     58        (WebCore::SpotLightSource::computePixelLightingData const):
     59        (WebCore::SpotLightSource::setX):
     60        (WebCore::SpotLightSource::setY):
     61        (WebCore::SpotLightSource::setZ):
     62        (WebCore::SpotLightSource::setPointsAtX):
     63        (WebCore::SpotLightSource::setPointsAtY):
     64        (WebCore::SpotLightSource::setPointsAtZ):
     65        * platform/graphics/filters/SpotLightSource.h:
     66        (WebCore::SpotLightSource::position const):
     67        (WebCore::SpotLightSource::direction const):
     68        (WebCore::SpotLightSource::SpotLightSource):
     69        * rendering/svg/RenderSVGResourceFilter.cpp:
     70        (WebCore::RenderSVGResourceFilter::buildPrimitives const):
     71        * rendering/svg/RenderSVGResourceFilterPrimitive.cpp:
     72        (WebCore::RenderSVGResourceFilterPrimitive::determineFilterPrimitiveSubregion):
     73
    1742018-01-03  Youenn Fablet  <youenn@apple.com>
    275
  • trunk/Source/WebCore/platform/graphics/FloatPoint3D.h

    r220503 r226363  
    6363    float y() const { return m_y; }
    6464    void setY(float y) { m_y = y; }
     65   
     66    FloatPoint xy() const { return { m_x, m_y }; }
     67    void setXY(FloatPoint p)
     68    {
     69        m_x = p.x();
     70        m_y = p.y();
     71    }
    6572
    6673    float z() const { return m_z; }
  • trunk/Source/WebCore/platform/graphics/GeometryUtilities.cpp

    r222245 r226363  
    9797}
    9898
     99FloatPoint mapPoint(FloatPoint p, const FloatRect& srcRect, const FloatRect& destRect)
     100{
     101    if (!srcRect.width() || !srcRect.height())
     102        return p;
     103
     104    float widthScale = destRect.width() / srcRect.width();
     105    float heightScale = destRect.height() / srcRect.height();
     106
     107    return {
     108        destRect.x() + (p.x() - srcRect.x()) * widthScale,
     109        destRect.y() + (p.y() - srcRect.y()) * heightScale
     110    };
     111}
     112
    99113FloatRect mapRect(const FloatRect& r, const FloatRect& srcRect, const FloatRect& destRect)
    100114{
     
    104118    float widthScale = destRect.width() / srcRect.width();
    105119    float heightScale = destRect.height() / srcRect.height();
    106     return FloatRect(destRect.x() + (r.x() - srcRect.x()) * widthScale,
     120    return {
     121        destRect.x() + (r.x() - srcRect.x()) * widthScale,
    107122        destRect.y() + (r.y() - srcRect.y()) * heightScale,
    108         r.width() * widthScale, r.height() * heightScale);
     123        r.width() * widthScale,
     124        r.height() * heightScale
     125    };
    109126}
    110127
  • trunk/Source/WebCore/platform/graphics/GeometryUtilities.h

    r222113 r226363  
    4242WEBCORE_EXPORT FloatRect unionRect(const Vector<FloatRect>&);
    4343
    44 // Map rect r from srcRect to an equivalent rect in destRect.
     44// Map point from srcRect to an equivalent point in destRect.
     45FloatPoint mapPoint(FloatPoint, const FloatRect& srcRect, const FloatRect& destRect);
     46
     47// Map rect from srcRect to an equivalent rect in destRect.
    4548FloatRect mapRect(const FloatRect&, const FloatRect& srcRect, const FloatRect& destRect);
    4649
  • trunk/Source/WebCore/platform/graphics/filters/DistantLightSource.cpp

    r226317 r226363  
    3636namespace WebCore {
    3737
    38 void DistantLightSource::initPaintingData(PaintingData& paintingData)
     38void DistantLightSource::initPaintingData(const FilterEffect&, PaintingData& paintingData)
    3939{
    4040    float azimuth = deg2rad(m_azimuth);
  • trunk/Source/WebCore/platform/graphics/filters/DistantLightSource.h

    r225122 r226363  
    4242    bool setElevation(float) override;
    4343
    44     void initPaintingData(PaintingData&) override;
     44    void initPaintingData(const FilterEffect&, PaintingData&) override;
    4545    ComputedLightingData computePixelLightingData(const PaintingData&, int x, int y, float z) const final;
    4646
  • trunk/Source/WebCore/platform/graphics/filters/FELighting.cpp

    r226317 r226363  
    402402    Color lightColor = (operatingColorSpace() == ColorSpaceLinearRGB) ? sRGBToLinearColor(m_lightingColor) : m_lightingColor;
    403403    paintingData.initialLightingData.colorVector = FloatPoint3D(lightColor.red(), lightColor.green(), lightColor.blue());
    404     m_lightSource->initPaintingData(paintingData);
     404    m_lightSource->initPaintingData(*this, paintingData);
    405405
    406406    // Top left.
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp

    r225453 r226363  
    2626
    2727#include "Filter.h"
     28#include "GeometryUtilities.h"
    2829#include "ImageBuffer.h"
    2930#include "Logging.h"
     
    6566    else
    6667        m_absolutePaintRect.unite(enclosingIntRect(m_maxEffectRect));
     68}
     69
     70FloatPoint FilterEffect::mapPointFromUserSpaceToBuffer(FloatPoint userSpacePoint) const
     71{
     72    FloatPoint absolutePoint = mapPoint(userSpacePoint, m_filterPrimitiveSubregion, m_absoluteUnclippedSubregion);
     73    absolutePoint.moveBy(-m_absolutePaintRect.location());
     74    return absolutePoint;
    6775}
    6876
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h

    r225366 r226363  
    137137    FloatRect effectBoundaries() const { return m_effectBoundaries; }
    138138    void setEffectBoundaries(const FloatRect& effectBoundaries) { m_effectBoundaries = effectBoundaries; }
     139   
     140    void setUnclippedAbsoluteSubregion(const FloatRect& r) { m_absoluteUnclippedSubregion = r; }
     141   
     142    FloatPoint mapPointFromUserSpaceToBuffer(FloatPoint) const;
    139143
    140144    Filter& filter() { return m_filter; }
     
    209213    // filter primitive on a later step.
    210214    FloatRect m_effectBoundaries;
     215   
     216    // filterPrimitiveSubregion mapped to absolute coordinates before clipping.
     217    FloatRect m_absoluteUnclippedSubregion;
    211218
    212219    bool m_alphaImage { false };
  • trunk/Source/WebCore/platform/graphics/filters/LightSource.h

    r226317 r226363  
    3939};
    4040
     41class FilterEffect;
     42
    4143class LightSource : public RefCounted<LightSource> {
    4244public:
     
    6466    virtual WTF::TextStream& externalRepresentation(WTF::TextStream&) const = 0;
    6567
    66     virtual void initPaintingData(PaintingData&) = 0;
     68    virtual void initPaintingData(const FilterEffect&, PaintingData&) = 0;
    6769    // z is a float number, since it is the alpha value scaled by a user
    68     // specified "surfaceScale" constant, which type is <number> in the SVG standard
     70    // specified "surfaceScale" constant, which type is <number> in the SVG standard.
     71    // x and y are in the coordinates of the FilterEffect's buffer.
    6972    virtual ComputedLightingData computePixelLightingData(const PaintingData&, int x, int y, float z) const = 0;
    7073
    7174    virtual bool setAzimuth(float) { return false; }
    7275    virtual bool setElevation(float) { return false; }
     76   
     77    // These are in user space coordinates.
    7378    virtual bool setX(float) { return false; }
    7479    virtual bool setY(float) { return false; }
     
    7782    virtual bool setPointsAtY(float) { return false; }
    7883    virtual bool setPointsAtZ(float) { return false; }
     84   
    7985    virtual bool setSpecularExponent(float) { return false; }
    8086    virtual bool setLimitingConeAngle(float) { return false; }
  • trunk/Source/WebCore/platform/graphics/filters/PointLightSource.cpp

    r226317 r226363  
    3636namespace WebCore {
    3737
    38 void PointLightSource::initPaintingData(PaintingData&)
     38void PointLightSource::initPaintingData(const FilterEffect& filterEffect, PaintingData&)
    3939{
     40    m_bufferPosition.setXY(filterEffect.mapPointFromUserSpaceToBuffer(m_userSpacePosition.xy()));
     41    // To scale Z, map a point offset from m_userSpacePosition in the x direction by z.
     42    FloatPoint mappedZ = filterEffect.mapPointFromUserSpaceToBuffer({ m_userSpacePosition.x() + m_userSpacePosition.z(), m_userSpacePosition.y() });
     43    m_bufferPosition.setZ(mappedZ.x() - m_bufferPosition.x());
    4044}
    4145
     
    4347{
    4448    FloatPoint3D lightVector = {
    45         m_position.x() - x,
    46         m_position.y() - y,
    47         m_position.z() - z
     49        m_bufferPosition.x() - x,
     50        m_bufferPosition.y() - y,
     51        m_bufferPosition.z() - z
    4852    };
    4953
     
    5357bool PointLightSource::setX(float x)
    5458{
    55     if (m_position.x() == x)
     59    if (m_userSpacePosition.x() == x)
    5660        return false;
    57     m_position.setX(x);
     61    m_userSpacePosition.setX(x);
    5862    return true;
    5963}
     
    6165bool PointLightSource::setY(float y)
    6266{
    63     if (m_position.y() == y)
     67    if (m_userSpacePosition.y() == y)
    6468        return false;
    65     m_position.setY(y);
     69    m_userSpacePosition.setY(y);
    6670    return true;
    6771}
     
    6973bool PointLightSource::setZ(float z)
    7074{
    71     if (m_position.z() == z)
     75    if (m_userSpacePosition.z() == z)
    7276        return false;
    73     m_position.setZ(z);
     77    m_userSpacePosition.setZ(z);
    7478    return true;
    7579}
  • trunk/Source/WebCore/platform/graphics/filters/PointLightSource.h

    r225122 r226363  
    3535    }
    3636
    37     const FloatPoint3D& position() const { return m_position; }
     37    const FloatPoint3D& position() const { return m_userSpacePosition; }
    3838    bool setX(float) override;
    3939    bool setY(float) override;
    4040    bool setZ(float) override;
    4141
    42     void initPaintingData(PaintingData&) override;
     42    void initPaintingData(const FilterEffect&, PaintingData&) override;
    4343    ComputedLightingData computePixelLightingData(const PaintingData&, int x, int y, float z) const final;
    4444
     
    4848    PointLightSource(const FloatPoint3D& position)
    4949        : LightSource(LS_POINT)
    50         , m_position(position)
     50        , m_userSpacePosition(position)
    5151    {
    5252    }
    5353
    54     FloatPoint3D m_position;
     54    FloatPoint3D m_userSpacePosition;
     55    FloatPoint3D m_bufferPosition;
    5556};
    5657
  • trunk/Source/WebCore/platform/graphics/filters/SpotLightSource.cpp

    r226317 r226363  
    4141static const float antiAliasTreshold = 0.016f;
    4242
    43 void SpotLightSource::initPaintingData(PaintingData& paintingData)
     43void SpotLightSource::initPaintingData(const FilterEffect& filterEffect, PaintingData& paintingData)
    4444{
    45     paintingData.directionVector = m_direction - m_position;
     45    m_bufferPosition.setXY(filterEffect.mapPointFromUserSpaceToBuffer(m_userSpacePosition.xy()));
     46    // To scale Z, map a point offset from m_userSpacePosition in the x direction by z.
     47    FloatPoint mappedZ = filterEffect.mapPointFromUserSpaceToBuffer({ m_userSpacePosition.x() + m_userSpacePosition.z(), m_userSpacePosition.y() });
     48    m_bufferPosition.setZ(mappedZ.x() - m_bufferPosition.x());
     49   
     50    paintingData.directionVector = m_userSpacePointsAt - m_userSpacePosition;
    4651    paintingData.directionVector.normalize();
    4752
     
    7176{
    7277    FloatPoint3D lightVector = {
    73         m_position.x() - x,
    74         m_position.y() - y,
    75         m_position.z() - z
     78        m_bufferPosition.x() - x,
     79        m_bufferPosition.y() - y,
     80        m_bufferPosition.z() - z
    7681    };
    7782    float lightVectorLength = lightVector.length();
     
    112117bool SpotLightSource::setX(float x)
    113118{
    114     if (m_position.x() == x)
     119    if (m_userSpacePosition.x() == x)
    115120        return false;
    116     m_position.setX(x);
     121    m_userSpacePosition.setX(x);
    117122    return true;
    118123}
     
    120125bool SpotLightSource::setY(float y)
    121126{
    122     if (m_position.y() == y)
     127    if (m_userSpacePosition.y() == y)
    123128        return false;
    124     m_position.setY(y);
     129    m_userSpacePosition.setY(y);
    125130    return true;
    126131}
     
    128133bool SpotLightSource::setZ(float z)
    129134{
    130     if (m_position.z() == z)
     135    if (m_userSpacePosition.z() == z)
    131136        return false;
    132     m_position.setZ(z);
     137    m_userSpacePosition.setZ(z);
    133138    return true;
    134139}
     
    136141bool SpotLightSource::setPointsAtX(float pointsAtX)
    137142{
    138     if (m_direction.x() == pointsAtX)
     143    if (m_userSpacePointsAt.x() == pointsAtX)
    139144        return false;
    140     m_direction.setX(pointsAtX);
     145    m_userSpacePointsAt.setX(pointsAtX);
    141146    return true;
    142147}
     
    144149bool SpotLightSource::setPointsAtY(float pointsAtY)
    145150{
    146     if (m_direction.y() == pointsAtY)
     151    if (m_userSpacePointsAt.y() == pointsAtY)
    147152        return false;
    148     m_direction.setY(pointsAtY);
     153    m_userSpacePointsAt.setY(pointsAtY);
    149154    return true;
    150155}
     
    152157bool SpotLightSource::setPointsAtZ(float pointsAtZ)
    153158{
    154     if (m_direction.z() == pointsAtZ)
     159    if (m_userSpacePointsAt.z() == pointsAtZ)
    155160        return false;
    156     m_direction.setZ(pointsAtZ);
     161    m_userSpacePointsAt.setZ(pointsAtZ);
    157162    return true;
    158163}
  • trunk/Source/WebCore/platform/graphics/filters/SpotLightSource.h

    r225122 r226363  
    3636    }
    3737
    38     const FloatPoint3D& position() const { return m_position; }
    39     const FloatPoint3D& direction() const { return m_direction; }
     38    const FloatPoint3D& position() const { return m_userSpacePosition; }
     39    const FloatPoint3D& direction() const { return m_userSpacePointsAt; }
    4040    float specularExponent() const { return m_specularExponent; }
    4141    float limitingConeAngle() const { return m_limitingConeAngle; }
     
    5151    bool setLimitingConeAngle(float) override;
    5252
    53     void initPaintingData(PaintingData&) override;
     53    void initPaintingData(const FilterEffect&, PaintingData&) override;
    5454    ComputedLightingData computePixelLightingData(const PaintingData&, int x, int y, float z) const final;
    5555
     
    5757
    5858private:
    59     SpotLightSource(const FloatPoint3D& position, const FloatPoint3D& direction,
    60         float specularExponent, float limitingConeAngle)
     59    SpotLightSource(const FloatPoint3D& position, const FloatPoint3D& direction, float specularExponent, float limitingConeAngle)
    6160        : LightSource(LS_SPOT)
    62         , m_position(position)
    63         , m_direction(direction)
     61        , m_userSpacePosition(position)
     62        , m_userSpacePointsAt(direction)
    6463        , m_specularExponent(specularExponent)
    6564        , m_limitingConeAngle(limitingConeAngle)
     
    6766    }
    6867
    69     FloatPoint3D m_position;
    70     FloatPoint3D m_direction;
     68    FloatPoint3D m_userSpacePosition;
     69    FloatPoint3D m_userSpacePointsAt;
     70
     71    FloatPoint3D m_bufferPosition;
    7172
    7273    float m_specularExponent;
  • trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilterPrimitive.cpp

    r224537 r226363  
    105105    FloatRect absoluteSubregion = filter.absoluteTransform().mapRect(subregion);
    106106    FloatSize filterResolution = filter.filterResolution();
    107     absoluteSubregion.scale(filterResolution.width(), filterResolution.height());
     107    absoluteSubregion.scale(filterResolution);
     108    // Save this before clipping so we can use it to map lighting points from user space to buffer coordinates.
     109    effect.setUnclippedAbsoluteSubregion(absoluteSubregion);
    108110
    109111    // Clip every filter effect to the filter region.
    110112    FloatRect absoluteScaledFilterRegion = filter.filterRegion();
    111     absoluteScaledFilterRegion.scale(filterResolution.width(), filterResolution.height());
     113    absoluteScaledFilterRegion.scale(filterResolution);
    112114    absoluteSubregion.intersect(absoluteScaledFilterRegion);
    113115
Note: See TracChangeset for help on using the changeset viewer.