OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010, 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 | 591 |
592 // Store the local bounds of the RenderLayer subtree before applying the
offset. | 592 // Store the local bounds of the RenderLayer subtree before applying the
offset. |
593 m_squashedLayers[i].compositedBounds = squashedBounds; | 593 m_squashedLayers[i].compositedBounds = squashedBounds; |
594 | 594 |
595 squashedBounds.move(m_squashedLayers[i].offsetFromSquashingCLM); | 595 squashedBounds.move(m_squashedLayers[i].offsetFromSquashingCLM); |
596 totalSquashBounds.unite(squashedBounds); | 596 totalSquashBounds.unite(squashedBounds); |
597 } | 597 } |
598 | 598 |
599 // The totalSquashBounds is positioned with respect to m_owningLayer of this
CompositedLayerMapping. | 599 // The totalSquashBounds is positioned with respect to m_owningLayer of this
CompositedLayerMapping. |
600 // But the squashingLayer needs to be positioned with respect to the ancesto
r CompositedLayerMapping. | 600 // But the squashingLayer needs to be positioned with respect to the ancesto
r CompositedLayerMapping. |
601 // The conversion between m_owningLayer and the ancestor CLM is already comp
uted in the caller as |delta|. | 601 // The conversion between m_owningLayer and the ancestor CLM is already comp
uted in the caller as |
602 // FIXME: probably not the right place to round from LayoutPoint to IntPoint
? | 602 // |delta| + |m_subpixelAccumulation|. |
603 IntPoint squashLayerPosition = pixelSnappedIntRect(totalSquashBounds).locati
on(); | 603 LayoutPoint rawDelta = delta + m_subpixelAccumulation; |
604 squashLayerPosition.moveBy(delta); | 604 totalSquashBounds.moveBy(rawDelta); |
| 605 IntRect squashLayerBounds = enclosingIntRect(totalSquashBounds); |
| 606 IntPoint squashLayerOrigin = squashLayerBounds.location(); |
| 607 LayoutPoint squashLayerOriginInOwningLayerSpace = LayoutPoint(squashLayerOri
gin - rawDelta); |
605 | 608 |
606 m_squashingLayer->setPosition(squashLayerPosition); | 609 m_squashingLayer->setPosition(squashLayerBounds.location()); |
607 m_squashingLayer->setSize(totalSquashBounds.size()); | 610 m_squashingLayer->setSize(squashLayerBounds.size()); |
608 | 611 |
609 // Now that the squashing bounds are known, we can convert the RenderLayer p
ainting offsets | 612 // Now that the squashing bounds are known, we can convert the RenderLayer p
ainting offsets |
610 // from CLM owning layer space to the squashing layer space. | 613 // from CLM owning layer space to the squashing layer space. |
611 // | 614 // |
612 // The painting offset we want to compute for each squashed RenderLayer is e
ssentially the position of | 615 // The painting offset we want to compute for each squashed RenderLayer is e
ssentially the position of |
613 // the squashed RenderLayer described w.r.t. m_squashingLayer's origin. For
this purpose we already cached | 616 // the squashed RenderLayer described w.r.t. m_squashingLayer's origin. For
this purpose we already cached |
614 // offsetFromSquashingCLM before, which describes where the squashed RenderL
ayer is located w.r.t. | 617 // offsetFromSquashingCLM before, which describes where the squashed RenderL
ayer is located w.r.t. |
615 // m_owningLayer. So we just need to convert that point from m_owningLayer s
pace to m_squashingLayer | 618 // m_owningLayer. So we just need to convert that point from m_owningLayer s
pace to m_squashingLayer |
616 // space. This is simply done by subtracing totalSquashBounds... but then th
e offset overall needs to be | 619 // space. This is simply done by subtracing squashLayerOriginInOwningLayerSp
ace, but then the offset |
617 // negated because that's the direction that the painting code expects the o
ffset to be. | 620 // overall needs to be negated because that's the direction that the paintin
g code expects the |
| 621 // offset to be. |
618 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { | 622 for (size_t i = 0; i < m_squashedLayers.size(); ++i) { |
619 m_squashedLayers[i].offsetFromRenderer = IntSize(-m_squashedLayers[i].of
fsetFromSquashingCLM.width() + totalSquashBounds.x(), | 623 LayoutSize offsetFromSquashLayerOrigin = LayoutPoint(m_squashedLayers[i]
.offsetFromSquashingCLM) - squashLayerOriginInOwningLayerSpace; |
620 -m_squashedLayers[i].offsetFromSquashingCLM.height() + totalSquashBo
unds.y()); | 624 m_squashedLayers[i].offsetFromRenderer = -flooredIntSize(offsetFromSquas
hLayerOrigin); |
| 625 m_squashedLayers[i].subpixelAccumulation = offsetFromSquashLayerOrigin.f
raction(); |
621 | 626 |
622 // FIXME: find a better design to avoid this redundant value - most like
ly it will make | 627 // FIXME: find a better design to avoid this redundant value - most like
ly it will make |
623 // sense to move the paint task info into RenderLayer's m_compositingPro
perties. | 628 // sense to move the paint task info into RenderLayer's m_compositingPro
perties. |
624 m_squashedLayers[i].renderLayer->setOffsetFromSquashingLayerOrigin(m_squ
ashedLayers[i].offsetFromRenderer); | 629 m_squashedLayers[i].renderLayer->setOffsetFromSquashingLayerOrigin(m_squ
ashedLayers[i].offsetFromRenderer); |
625 } | 630 } |
626 } | 631 } |
627 | 632 |
628 GraphicsLayerUpdater::UpdateType CompositedLayerMapping::updateGraphicsLayerGeom
etry(GraphicsLayerUpdater::UpdateType updateType) | 633 GraphicsLayerUpdater::UpdateType CompositedLayerMapping::updateGraphicsLayerGeom
etry(GraphicsLayerUpdater::UpdateType updateType) |
629 { | 634 { |
630 // If we haven't built z-order lists yet, wait until later. | 635 // If we haven't built z-order lists yet, wait until later. |
(...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1893 | 1898 |
1894 IntSize offset = paintInfo.offsetFromRenderer; | 1899 IntSize offset = paintInfo.offsetFromRenderer; |
1895 context->translate(-offset); | 1900 context->translate(-offset); |
1896 | 1901 |
1897 // The dirtyRect is in the coords of the painting root. | 1902 // The dirtyRect is in the coords of the painting root. |
1898 IntRect dirtyRect(clip); | 1903 IntRect dirtyRect(clip); |
1899 dirtyRect.move(offset); | 1904 dirtyRect.move(offset); |
1900 | 1905 |
1901 if (!(paintInfo.paintingPhase & GraphicsLayerPaintOverflowContents)) { | 1906 if (!(paintInfo.paintingPhase & GraphicsLayerPaintOverflowContents)) { |
1902 LayoutRect bounds = paintInfo.compositedBounds; | 1907 LayoutRect bounds = paintInfo.compositedBounds; |
1903 bounds.move(m_subpixelAccumulation); | 1908 bounds.move(paintInfo.subpixelAccumulation); |
1904 dirtyRect.intersect(pixelSnappedIntRect(bounds)); | 1909 dirtyRect.intersect(pixelSnappedIntRect(bounds)); |
1905 } else { | 1910 } else { |
1906 dirtyRect.move(roundedIntSize(m_subpixelAccumulation)); | 1911 dirtyRect.move(roundedIntSize(paintInfo.subpixelAccumulation)); |
1907 } | 1912 } |
1908 | 1913 |
1909 #ifndef NDEBUG | 1914 #ifndef NDEBUG |
1910 paintInfo.renderLayer->renderer()->assertSubtreeIsLaidOut(); | 1915 paintInfo.renderLayer->renderer()->assertSubtreeIsLaidOut(); |
1911 #endif | 1916 #endif |
1912 | 1917 |
1913 if (paintInfo.renderLayer->compositingState() != PaintsIntoGroupedBacking) { | 1918 if (paintInfo.renderLayer->compositingState() != PaintsIntoGroupedBacking) { |
1914 // FIXME: GraphicsLayers need a way to split for RenderRegions. | 1919 // FIXME: GraphicsLayers need a way to split for RenderRegions. |
1915 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe
haviorNormal, m_subpixelAccumulation); | 1920 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe
haviorNormal, paintInfo.subpixelAccumulation); |
1916 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, paintFl
ags); | 1921 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, paintFl
ags); |
1917 | 1922 |
1918 ASSERT(!paintInfo.isBackgroundLayer || paintFlags & PaintLayerPaintingRo
otBackgroundOnly); | 1923 ASSERT(!paintInfo.isBackgroundLayer || paintFlags & PaintLayerPaintingRo
otBackgroundOnly); |
1919 | 1924 |
1920 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars()) | 1925 if (paintInfo.renderLayer->containsDirtyOverlayScrollbars()) |
1921 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, pai
ntFlags | PaintLayerPaintingOverlayScrollbars); | 1926 paintInfo.renderLayer->paintLayerContents(context, paintingInfo, pai
ntFlags | PaintLayerPaintingOverlayScrollbars); |
1922 } else { | 1927 } else { |
1923 ASSERT(compositor()->layerSquashingEnabled()); | 1928 ASSERT(compositor()->layerSquashingEnabled()); |
1924 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe
haviorNormal, LayoutSize()); | 1929 LayerPaintingInfo paintingInfo(paintInfo.renderLayer, dirtyRect, PaintBe
haviorNormal, paintInfo.subpixelAccumulation); |
1925 paintInfo.renderLayer->paintLayer(context, paintingInfo, paintFlags); | 1930 paintInfo.renderLayer->paintLayer(context, paintingInfo, paintFlags); |
1926 } | 1931 } |
1927 | 1932 |
1928 ASSERT(!paintInfo.renderLayer->m_usedTransparency); | 1933 ASSERT(!paintInfo.renderLayer->m_usedTransparency); |
1929 | 1934 |
1930 // Manually restore the context to its original state by applying the opposi
te translation. | 1935 // Manually restore the context to its original state by applying the opposi
te translation. |
1931 context->translate(offset); | 1936 context->translate(offset); |
1932 } | 1937 } |
1933 | 1938 |
1934 static void paintScrollbar(Scrollbar* scrollbar, GraphicsContext& context, const
IntRect& clip) | 1939 static void paintScrollbar(Scrollbar* scrollbar, GraphicsContext& context, const
IntRect& clip) |
(...skipping 28 matching lines...) Expand all Loading... |
1963 || graphicsLayer == m_maskLayer.get() | 1968 || graphicsLayer == m_maskLayer.get() |
1964 || graphicsLayer == m_childClippingMaskLayer.get() | 1969 || graphicsLayer == m_childClippingMaskLayer.get() |
1965 || graphicsLayer == m_scrollingContentsLayer.get()) { | 1970 || graphicsLayer == m_scrollingContentsLayer.get()) { |
1966 | 1971 |
1967 GraphicsLayerPaintInfo paintInfo; | 1972 GraphicsLayerPaintInfo paintInfo; |
1968 paintInfo.renderLayer = &m_owningLayer; | 1973 paintInfo.renderLayer = &m_owningLayer; |
1969 paintInfo.compositedBounds = compositedBounds(); | 1974 paintInfo.compositedBounds = compositedBounds(); |
1970 paintInfo.offsetFromRenderer = graphicsLayer->offsetFromRenderer(); | 1975 paintInfo.offsetFromRenderer = graphicsLayer->offsetFromRenderer(); |
1971 paintInfo.paintingPhase = paintingPhase; | 1976 paintInfo.paintingPhase = paintingPhase; |
1972 paintInfo.isBackgroundLayer = (graphicsLayer == m_backgroundLayer); | 1977 paintInfo.isBackgroundLayer = (graphicsLayer == m_backgroundLayer); |
| 1978 paintInfo.subpixelAccumulation = m_subpixelAccumulation; |
1973 | 1979 |
1974 // We have to use the same root as for hit testing, because both methods
can compute and cache clipRects. | 1980 // We have to use the same root as for hit testing, because both methods
can compute and cache clipRects. |
1975 doPaintTask(paintInfo, &context, clip); | 1981 doPaintTask(paintInfo, &context, clip); |
1976 } else if (graphicsLayer == m_squashingLayer.get()) { | 1982 } else if (graphicsLayer == m_squashingLayer.get()) { |
1977 ASSERT(compositor()->layerSquashingEnabled()); | 1983 ASSERT(compositor()->layerSquashingEnabled()); |
1978 for (size_t i = 0; i < m_squashedLayers.size(); ++i) | 1984 for (size_t i = 0; i < m_squashedLayers.size(); ++i) |
1979 doPaintTask(m_squashedLayers[i], &context, clip); | 1985 doPaintTask(m_squashedLayers[i], &context, clip); |
1980 } else if (graphicsLayer == layerForHorizontalScrollbar()) { | 1986 } else if (graphicsLayer == layerForHorizontalScrollbar()) { |
1981 paintScrollbar(m_owningLayer.scrollableArea()->horizontalScrollbar(), co
ntext, clip); | 1987 paintScrollbar(m_owningLayer.scrollableArea()->horizontalScrollbar(), co
ntext, clip); |
1982 } else if (graphicsLayer == layerForVerticalScrollbar()) { | 1988 } else if (graphicsLayer == layerForVerticalScrollbar()) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2032 LayoutRect CompositedLayerMapping::compositedBounds() const | 2038 LayoutRect CompositedLayerMapping::compositedBounds() const |
2033 { | 2039 { |
2034 return m_compositedBounds; | 2040 return m_compositedBounds; |
2035 } | 2041 } |
2036 | 2042 |
2037 void CompositedLayerMapping::setCompositedBounds(const LayoutRect& bounds) | 2043 void CompositedLayerMapping::setCompositedBounds(const LayoutRect& bounds) |
2038 { | 2044 { |
2039 m_compositedBounds = bounds; | 2045 m_compositedBounds = bounds; |
2040 } | 2046 } |
2041 | 2047 |
2042 bool CompositedLayerMapping::updateSquashingLayerAssignment(RenderLayer* layer,
IntSize offsetFromSquashingCLM, size_t nextSquashedLayerIndex) | 2048 bool CompositedLayerMapping::updateSquashingLayerAssignment(RenderLayer* layer,
LayoutSize offsetFromSquashingCLM, size_t nextSquashedLayerIndex) |
2043 { | 2049 { |
2044 ASSERT(compositor()->layerSquashingEnabled()); | 2050 ASSERT(compositor()->layerSquashingEnabled()); |
2045 | 2051 |
2046 GraphicsLayerPaintInfo paintInfo; | 2052 GraphicsLayerPaintInfo paintInfo; |
2047 paintInfo.renderLayer = layer; | 2053 paintInfo.renderLayer = layer; |
2048 // NOTE: composited bounds are updated elsewhere | 2054 // NOTE: composited bounds are updated elsewhere |
2049 // NOTE: offsetFromRenderer is updated elsewhere | 2055 // NOTE: offsetFromRenderer is updated elsewhere |
2050 paintInfo.offsetFromSquashingCLM = offsetFromSquashingCLM; | 2056 paintInfo.offsetFromSquashingCLM = offsetFromSquashingCLM; |
2051 paintInfo.paintingPhase = GraphicsLayerPaintAllWithOverflowClip; | 2057 paintInfo.paintingPhase = GraphicsLayerPaintAllWithOverflowClip; |
2052 paintInfo.isBackgroundLayer = false; | 2058 paintInfo.isBackgroundLayer = false; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2127 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { | 2133 } else if (graphicsLayer == m_scrollingContentsLayer.get()) { |
2128 name = "Scrolling Contents Layer"; | 2134 name = "Scrolling Contents Layer"; |
2129 } else { | 2135 } else { |
2130 ASSERT_NOT_REACHED(); | 2136 ASSERT_NOT_REACHED(); |
2131 } | 2137 } |
2132 | 2138 |
2133 return name; | 2139 return name; |
2134 } | 2140 } |
2135 | 2141 |
2136 } // namespace WebCore | 2142 } // namespace WebCore |
OLD | NEW |