diff options
Diffstat (limited to 'WebCore/rendering/RenderLayer.cpp')
-rw-r--r-- | WebCore/rendering/RenderLayer.cpp | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/WebCore/rendering/RenderLayer.cpp b/WebCore/rendering/RenderLayer.cpp index 2d2559c..27ff32f 100644 --- a/WebCore/rendering/RenderLayer.cpp +++ b/WebCore/rendering/RenderLayer.cpp @@ -143,8 +143,8 @@ RenderLayer::RenderLayer(RenderBoxModelObject* renderer) , m_height(0) , m_scrollX(0) , m_scrollY(0) - , m_scrollOriginX(0) , m_scrollLeftOverflow(0) + , m_scrollTopOverflow(0) , m_scrollWidth(0) , m_scrollHeight(0) , m_inResizeMode(false) @@ -249,6 +249,15 @@ bool RenderLayer::hasAcceleratedCompositing() const #endif } +bool RenderLayer::canRender3DTransforms() const +{ +#if USE(ACCELERATED_COMPOSITING) + return compositor()->canRender3DTransforms(); +#else + return false; +#endif +} + void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags, IntPoint* cachedOffset) { if (flags & DoFullRepaint) { @@ -310,8 +319,6 @@ void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags, IntPoint updateVisibilityStatus(); - updateTransform(); - if (flags & UpdatePagination) updatePagination(); else @@ -429,7 +436,7 @@ void RenderLayer::updateTransform() ASSERT(box); m_transform->makeIdentity(); box->style()->applyTransform(*m_transform, box->borderBoxRect().size(), RenderStyle::IncludeTransformOrigin); - makeMatrixRenderable(*m_transform, hasAcceleratedCompositing()); + makeMatrixRenderable(*m_transform, canRender3DTransforms()); } if (had3DTransform != has3DTransform()) @@ -446,7 +453,7 @@ TransformationMatrix RenderLayer::currentTransform() const TransformationMatrix currTransform; RefPtr<RenderStyle> style = renderer()->animation()->getAnimatedStyleForRenderer(renderer()); style->applyTransform(currTransform, renderBox()->borderBoxRect().size(), RenderStyle::IncludeTransformOrigin); - makeMatrixRenderable(currTransform, hasAcceleratedCompositing()); + makeMatrixRenderable(currTransform, canRender3DTransforms()); return currTransform; } #endif @@ -1341,11 +1348,12 @@ void RenderLayer::scrollToOffset(int x, int y, bool updateScrollbars, bool repai // complicated (since it will involve testing whether our layer // is either occluded by another layer or clipped by an enclosing // layer or contains fixed backgrounds, etc.). - int newScrollX = x - m_scrollOriginX; - if (m_scrollY == y && m_scrollX == newScrollX) + int newScrollX = x - m_scrollOrigin.x(); + int newScrollY = y - m_scrollOrigin.y(); + if (m_scrollY == newScrollY && m_scrollX == newScrollX) return; m_scrollX = newScrollX; - m_scrollY = y; + m_scrollY = newScrollY; // Update the positions of our child layers. Don't have updateLayerPositions() update // compositing layers, because we need to do a deep update from the compositing ancestor. @@ -1999,22 +2007,26 @@ void RenderLayer::computeScrollDimensions(bool* needHBar, bool* needVBar) m_scrollDimensionsDirty = false; - bool ltr = renderer()->style()->isLeftToRightDirection(); - int clientWidth = box->clientWidth(); int clientHeight = box->clientHeight(); - m_scrollLeftOverflow = ltr ? 0 : min(0, box->leftmostPosition(true, false) - box->borderLeft()); + bool hasLeftOverflow = (!box->style()->isHorizontalWritingMode() || !box->style()->isLeftToRightDirection()) && box->style()->writingMode() != LeftToRightWritingMode; + bool hasTopOverflow = (box->style()->isHorizontalWritingMode() || !box->style()->isLeftToRightDirection()) && box->style()->writingMode() != TopToBottomWritingMode; + + m_scrollLeftOverflow = !hasLeftOverflow ? 0 : min(0, box->leftmostPosition(true, false) - box->borderLeft()); + m_scrollTopOverflow = !hasTopOverflow ? 0 : min(0, box->topmostPosition(true, false) - box->borderTop()); - int rightPos = ltr ? + int rightPos = !hasLeftOverflow ? box->rightmostPosition(true, false) - box->borderLeft() : clientWidth - m_scrollLeftOverflow; - int bottomPos = box->lowestPosition(true, false) - box->borderTop(); + int bottomPos = !hasTopOverflow ? + box->lowestPosition(true, false) - box->borderTop() : + clientHeight - m_scrollTopOverflow; m_scrollWidth = max(rightPos, clientWidth); m_scrollHeight = max(bottomPos, clientHeight); - m_scrollOriginX = ltr ? 0 : m_scrollWidth - clientWidth; + m_scrollOrigin = IntPoint(!hasLeftOverflow ? 0 : m_scrollWidth - clientWidth, !hasTopOverflow ? 0 : m_scrollHeight - clientHeight); if (needHBar) *needHBar = rightPos > clientWidth; @@ -2028,7 +2040,6 @@ void RenderLayer::updateOverflowStatus(bool horizontalOverflow, bool verticalOve m_horizontalOverflow = horizontalOverflow; m_verticalOverflow = verticalOverflow; m_overflowStatusDirty = false; - return; } @@ -2399,7 +2410,7 @@ void RenderLayer::paintLayer(RenderLayer* rootLayer, GraphicsContext* p, // Avoid painting layers when stylesheets haven't loaded. This eliminates FOUC. // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document // will do a full repaint(). - if (renderer()->document()->didLayoutWithPendingStylesheets() && !renderer()->isRenderView() && !renderer()->isRoot()) + if (renderer()->document()->mayCauseFlashOfUnstyledContent() && !renderer()->isRenderView() && !renderer()->isRoot()) return; // If this layer is totally invisible then there is nothing to paint. |