Changeset 109060 in webkit


Ignore:
Timestamp:
Feb 27, 2012 6:36:59 PM (12 years ago)
Author:
shawnsingh@chromium.org
Message:

RenderLayer ClipRect not accounting for transforms
https://bugs.webkit.org/show_bug.cgi?id=76486

Reviewed by Simon Fraser.

Source/WebCore:

Test: compositing/layer-creation/overlap-transformed-and-clipped.html

This patch changes calculateClipRects() so that the clipRect
offset is allowed to be converted across layers with
transforms. This is necessary because the RenderLayerCompositor
needs clipRects in document space, rather than with respect to
some local clipping layer.

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::calculateClipRects):

  • rendering/RenderObject.cpp:

(WebCore::RenderObject::localToContainerPoint):
(WebCore):

  • rendering/RenderObject.h:

(RenderObject):

LayoutTests:

  • compositing/layer-creation/overlap-transformed-and-clipped-expected.png: Added.
  • compositing/layer-creation/overlap-transformed-and-clipped-expected.txt: Added.
  • compositing/layer-creation/overlap-transformed-and-clipped.html: Added.
Location:
trunk
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r109058 r109060  
     12012-02-27  Shawn Singh  <shawnsingh@chromium.org>
     2
     3        RenderLayer ClipRect not accounting for transforms
     4        https://bugs.webkit.org/show_bug.cgi?id=76486
     5
     6        Reviewed by Simon Fraser.
     7
     8        * compositing/layer-creation/overlap-transformed-and-clipped-expected.png: Added.
     9        * compositing/layer-creation/overlap-transformed-and-clipped-expected.txt: Added.
     10        * compositing/layer-creation/overlap-transformed-and-clipped.html: Added.
     11
    1122012-02-27  Adam Klein  <adamk@chromium.org>
    213
  • trunk/Source/WebCore/ChangeLog

    r109058 r109060  
     12012-02-27  Shawn Singh  <shawnsingh@chromium.org>
     2
     3        RenderLayer ClipRect not accounting for transforms
     4        https://bugs.webkit.org/show_bug.cgi?id=76486
     5
     6        Reviewed by Simon Fraser.
     7
     8        Test: compositing/layer-creation/overlap-transformed-and-clipped.html
     9
     10        This patch changes calculateClipRects() so that the clipRect
     11        offset is allowed to be converted across layers with
     12        transforms. This is necessary because the RenderLayerCompositor
     13        needs clipRects in document space, rather than with respect to
     14        some local clipping layer.
     15
     16        * rendering/RenderLayer.cpp:
     17        (WebCore::RenderLayer::calculateClipRects):
     18        * rendering/RenderObject.cpp:
     19        (WebCore::RenderObject::localToContainerPoint):
     20        (WebCore):
     21        * rendering/RenderObject.h:
     22        (RenderObject):
     23
    1242012-02-27  Adam Klein  <adamk@chromium.org>
    225
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r108659 r109060  
    36543654    if (renderer()->hasOverflowClip() || renderer()->hasClip()) {
    36553655        // This layer establishes a clip of some kind.
     3656
     3657        // This offset cannot use convertToLayerCoords, because sometimes our rootLayer may be across
     3658        // some transformed layer boundary, for example, in the RenderLayerCompositor overlapMap, where
     3659        // clipRects are needed in view space.
    36563660        LayoutPoint offset;
    3657         convertToLayerCoords(rootLayer, offset);
     3661        offset = roundedIntPoint(renderer()->localToContainerPoint(FloatPoint(), rootLayer->renderer()));
    36583662        RenderView* view = renderer()->view();
    36593663        ASSERT(view);
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r109011 r109060  
    20952095}
    20962096
     2097FloatPoint RenderObject::localToContainerPoint(const FloatPoint& localPoint, RenderBoxModelObject* repaintContainer, bool fixed, bool* wasFixed) const
     2098{
     2099    TransformState transformState(TransformState::ApplyTransformDirection, localPoint);
     2100    mapLocalToContainer(repaintContainer, fixed, true, transformState, wasFixed);
     2101    transformState.flatten();
     2102
     2103    return transformState.lastPlanarPoint();
     2104}
     2105
    20972106LayoutSize RenderObject::offsetFromContainer(RenderObject* o, const LayoutPoint& point) const
    20982107{
  • trunk/Source/WebCore/rendering/RenderObject.h

    r108719 r109060  
    645645        return localToContainerQuad(quad, 0, fixed, wasFixed);
    646646    }
     647
    647648    // Convert a local quad into the coordinate system of container, taking transforms into account.
    648649    FloatQuad localToContainerQuad(const FloatQuad&, RenderBoxModelObject* repaintContainer, bool fixed = false, bool* wasFixed = 0) const;
     650    FloatPoint localToContainerPoint(const FloatPoint&, RenderBoxModelObject* repaintContainer, bool fixed = false, bool* wasFixed = 0) const;
    649651
    650652    // Return the offset from the container() renderer (excluding transforms). In multi-column layout,
Note: See TracChangeset for help on using the changeset viewer.