Changeset 165892 in webkit


Ignore:
Timestamp:
Mar 19, 2014 7:25:34 AM (10 years ago)
Author:
Alan Bujtas
Message:

Subpixel rendering: Transform origin is miscalculated when RenderLayer's
offsetfromRenderer has device pixel fraction value.
https://bugs.webkit.org/show_bug.cgi?id=129859

Reviewed by Simon Fraser.

We need to calculate the transformed origin using the painting coordinates to produce
pixel precise result.

Source/WebCore:

  • rendering/RenderLayerBacking.cpp:

(WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
(WebCore::RenderLayerBacking::computeTransformOriginForPainting):

  • rendering/RenderLayerBacking.h:

LayoutTests:

  • compositing/columns/composited-columns-expected.txt:
  • compositing/geometry/limit-layer-bounds-opacity-transition-expected.txt:
  • compositing/repaint/resize-repaint-expected.txt:
  • platform/mac/compositing/repaint/invalidations-on-composited-layers-expected.txt:
  • platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt:
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r165890 r165892  
     12014-03-19  Zalan Bujtas  <zalan@apple.com>
     2
     3        Subpixel rendering: Transform origin is miscalculated when RenderLayer's
     4        offsetfromRenderer has device pixel fraction value.
     5        https://bugs.webkit.org/show_bug.cgi?id=129859
     6
     7        Reviewed by Simon Fraser.
     8
     9        We need to calculate the transformed origin using the painting coordinates to produce
     10        pixel precise result.
     11
     12        * compositing/columns/composited-columns-expected.txt:
     13        * compositing/geometry/limit-layer-bounds-opacity-transition-expected.txt:
     14        * compositing/repaint/resize-repaint-expected.txt:
     15        * platform/mac/compositing/repaint/invalidations-on-composited-layers-expected.txt:
     16        * platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt:
     17
    1182014-03-19  Mihnea Ovidenie  <mihnea@adobe.com>
    219
  • trunk/LayoutTests/compositing/columns/composited-columns-expected.txt

    r154785 r165892  
    88        (GraphicsLayer
    99          (position 8.00 8.00)
     10          (anchor 0.50 0.50)
    1011          (bounds 769.00 840.00)
    1112          (drawsContent 1)
  • trunk/LayoutTests/compositing/geometry/limit-layer-bounds-opacity-transition-expected.txt

    r146814 r165892  
    1010        (GraphicsLayer
    1111          (position 8.00 8.00)
     12          (anchor 1.00 1.00)
    1213          (bounds 1.00 1.00)
    1314        )
  • trunk/LayoutTests/compositing/repaint/resize-repaint-expected.txt

    r163021 r165892  
    1212        (GraphicsLayer
    1313          (position 8.00 8.00)
     14          (anchor 0.50 0.50)
    1415          (bounds 402.00 207.00)
    1516          (drawsContent 1)
  • trunk/LayoutTests/platform/mac/compositing/repaint/invalidations-on-composited-layers-expected.txt

    r163021 r165892  
    1919            (GraphicsLayer
    2020              (position 50.00 50.00)
     21              (anchor 0.51 0.51)
    2122              (bounds 75.00 75.00)
    2223              (contentsOpaque 1)
  • trunk/LayoutTests/platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt

    r161884 r165892  
    1313        (GraphicsLayer
    1414          (position 14.00 6.00)
     15          (anchor 0.50 0.50)
    1516          (bounds 757.00 152.00)
    1617          (children 1
     
    2425        (GraphicsLayer
    2526          (position 14.00 160.00)
     27          (anchor 0.50 0.50)
    2628          (bounds 757.00 152.00)
    2729          (contentsVisible 0)
     
    3638        (GraphicsLayer
    3739          (position 14.00 314.00)
     40          (anchor 0.50 0.50)
    3841          (bounds 757.00 152.00)
    3942          (contentsVisible 0)
     
    5255
    5356(GraphicsLayer
    54   (bounds 785.00 1321.00)
     57  (bounds 785.00 1366.00)
    5558  (children 1
    5659    (GraphicsLayer
    57       (bounds 785.00 1321.00)
     60      (bounds 785.00 1366.00)
    5861      (contentsOpaque 1)
    5962      (children 3
    6063        (GraphicsLayer
    6164          (position 14.00 6.00)
     65          (anchor 0.50 0.50)
    6266          (bounds 757.00 152.00)
    6367          (children 1
     
    7074        (GraphicsLayer
    7175          (position 14.00 160.00)
     76          (anchor 0.50 0.50)
    7277          (bounds 757.00 152.00)
    7378          (contentsVisible 0)
     
    8287        (GraphicsLayer
    8388          (position 14.00 314.00)
     89          (anchor 0.50 0.50)
    8490          (bounds 757.00 152.00)
    8591          (contentsVisible 0)
     
    98104
    99105(GraphicsLayer
    100   (bounds 785.00 2000.00)
     106  (bounds 785.00 2090.00)
    101107  (children 1
    102108    (GraphicsLayer
    103       (bounds 785.00 2000.00)
     109      (bounds 785.00 2090.00)
    104110      (contentsOpaque 1)
    105111      (children 3
    106112        (GraphicsLayer
    107113          (position 14.00 6.00)
     114          (anchor 0.50 0.50)
    108115          (bounds 757.00 152.00)
    109116          (children 1
     
    116123        (GraphicsLayer
    117124          (position 14.00 160.00)
     125          (anchor 0.50 0.50)
    118126          (bounds 757.00 152.00)
    119127          (drawsContent 1)
     
    127135        (GraphicsLayer
    128136          (position 14.00 314.00)
     137          (anchor 0.50 0.50)
    129138          (bounds 757.00 152.00)
    130139          (contentsVisible 0)
  • trunk/Source/WebCore/ChangeLog

    r165891 r165892  
     12014-03-19  Zalan Bujtas  <zalan@apple.com>
     2
     3        Subpixel rendering: Transform origin is miscalculated when RenderLayer's
     4        offsetfromRenderer has device pixel fraction value.
     5        https://bugs.webkit.org/show_bug.cgi?id=129859
     6
     7        Reviewed by Simon Fraser.
     8
     9        We need to calculate the transformed origin using the painting coordinates to produce
     10        pixel precise result.
     11
     12        * rendering/RenderLayerBacking.cpp:
     13        (WebCore::RenderLayerBacking::updateGraphicsLayerGeometry):
     14        (WebCore::RenderLayerBacking::computeTransformOriginForPainting):
     15        * rendering/RenderLayerBacking.h:
     16
    1172014-03-19  Claudio Saavedra  <csaavedra@igalia.com>
    218
  • trunk/Source/WebCore/rendering/RenderLayerBacking.cpp

    r165863 r165892  
    840840   
    841841    if (m_owningLayer.hasTransform()) {
    842         const LayoutRect borderBox = toRenderBox(renderer()).pixelSnappedBorderBoxRect();
    843 
     842        // Update properties that depend on layer dimensions.
     843        FloatPoint3D transformOrigin = computeTransformOriginForPainting(toRenderBox(renderer()).borderBoxRect());
    844844        // Get layout bounds in the coords of compAncestor to match relativeCompositingBounds.
    845         LayoutRect layerBounds(offsetFromParent, borderBox.size());
    846 
    847         // Update properties that depend on layer dimensions
    848         FloatPoint3D transformOrigin = computeTransformOrigin(borderBox);
     845        FloatPoint layerOffset = roundedForPainting(offsetFromParent, deviceScaleFactor);
    849846        // Compute the anchor point, which is in the center of the renderer box unless transform-origin is set.
    850         FloatPoint3D anchor(enclosingRelativeCompositingBounds.width() != 0.0f ? ((layerBounds.x() - enclosingRelativeCompositingBounds.x()) + transformOrigin.x())
    851             / enclosingRelativeCompositingBounds.width() : 0.5f, enclosingRelativeCompositingBounds.height() != 0.0f ? ((layerBounds.y() - enclosingRelativeCompositingBounds.y())
    852             + transformOrigin.y()) / enclosingRelativeCompositingBounds.height() : 0.5f, transformOrigin.z());
     847        FloatPoint3D anchor(enclosingRelativeCompositingBounds.width() ? ((layerOffset.x() - enclosingRelativeCompositingBounds.x()) + transformOrigin.x())
     848            / enclosingRelativeCompositingBounds.width() : 0.5, enclosingRelativeCompositingBounds.height() ? ((layerOffset.y() - enclosingRelativeCompositingBounds.y())
     849            + transformOrigin.y()) / enclosingRelativeCompositingBounds.height() : 0.5, transformOrigin.z());
     850
    853851        if (m_contentsContainmentLayer)
    854852            m_contentsContainmentLayer->setAnchorPoint(anchor);
     
    874872        }
    875873    } else {
    876         m_graphicsLayer->setAnchorPoint(FloatPoint3D(0.5f, 0.5f, 0));
     874        m_graphicsLayer->setAnchorPoint(FloatPoint3D(0.5, 0.5, 0));
    877875        if (m_contentsContainmentLayer)
    878             m_contentsContainmentLayer->setAnchorPoint(FloatPoint3D(0.5f, 0.5f, 0));
     876            m_contentsContainmentLayer->setAnchorPoint(FloatPoint3D(0.5, 0.5, 0));
    879877    }
    880878
     
    19171915}
    19181916
    1919 FloatPoint3D RenderLayerBacking::computeTransformOrigin(const LayoutRect& borderBox) const
     1917FloatPoint3D RenderLayerBacking::computeTransformOriginForPainting(const LayoutRect& borderBox) const
    19201918{
    19211919    const RenderStyle& style = renderer().style();
     1920    float deviceScaleFactor = renderer().document().deviceScaleFactor();
    19221921
    19231922    FloatPoint3D origin;
    1924     origin.setX(floatValueForLength(style.transformOriginX(), borderBox.width()));
    1925     origin.setY(floatValueForLength(style.transformOriginY(), borderBox.height()));
     1923    origin.setX(roundToDevicePixel(floatValueForLength(style.transformOriginX(), borderBox.width()), deviceScaleFactor));
     1924    origin.setY(roundToDevicePixel(floatValueForLength(style.transformOriginY(), borderBox.height()), deviceScaleFactor));
    19261925    origin.setZ(style.transformOriginZ());
    1927 
    1928     return origin;
    1929 }
    1930 
    1931 FloatPoint RenderLayerBacking::computePerspectiveOrigin(const LayoutRect& borderBox) const
    1932 {
    1933     const RenderStyle& style = renderer().style();
    1934 
    1935     float boxWidth = borderBox.width();
    1936     float boxHeight = borderBox.height();
    1937 
    1938     FloatPoint origin;
    1939     origin.setX(floatValueForLength(style.perspectiveOriginX(), boxWidth));
    1940     origin.setY(floatValueForLength(style.perspectiveOriginY(), boxHeight));
    19411926
    19421927    return origin;
  • trunk/Source/WebCore/rendering/RenderLayerBacking.h

    r165863 r165892  
    251251   
    252252    LayoutSize contentOffsetInCompostingLayer() const;
    253     // Result is transform origin in pixels.
    254     FloatPoint3D computeTransformOrigin(const LayoutRect& borderBox) const;
    255     // Result is perspective origin in pixels.
    256     FloatPoint computePerspectiveOrigin(const LayoutRect& borderBox) const;
     253    // Result is transform origin in device pixels.
     254    FloatPoint3D computeTransformOriginForPainting(const LayoutRect& borderBox) const;
    257255
    258256    void updateOpacity(const RenderStyle*);
Note: See TracChangeset for help on using the changeset viewer.