Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1221)

Unified Diff: Source/core/rendering/RenderLayerScrollableArea.cpp

Issue 776943003: Factor painting code from RenderLayerScrollableArea into ScrollableAreaPainter (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/RenderLayerScrollableArea.cpp
diff --git a/Source/core/rendering/RenderLayerScrollableArea.cpp b/Source/core/rendering/RenderLayerScrollableArea.cpp
index 67e6e150191703f40d35578bbdb1852bcad9ee42..1e5ab1630974c8c046858bc2d970d636794cf6df 100644
--- a/Source/core/rendering/RenderLayerScrollableArea.cpp
+++ b/Source/core/rendering/RenderLayerScrollableArea.cpp
@@ -58,7 +58,6 @@
#include "core/page/FocusController.h"
#include "core/page/Page.h"
#include "core/page/scrolling/ScrollingCoordinator.h"
-#include "core/paint/ScrollbarPainter.h"
#include "core/rendering/RenderGeometryMap.h"
#include "core/rendering/RenderScrollbar.h"
#include "core/rendering/RenderScrollbarPart.h"
@@ -1022,86 +1021,6 @@ void RenderLayerScrollableArea::updateScrollCornerStyle()
}
}
-void RenderLayerScrollableArea::paintOverflowControls(GraphicsContext* context, const IntPoint& paintOffset, const IntRect& damageRect, bool paintingOverlayControls)
-{
- // Don't do anything if we have no overflow.
- if (!box().hasOverflowClip())
- return;
-
- IntPoint adjustedPaintOffset = paintOffset;
- if (paintingOverlayControls)
- adjustedPaintOffset = m_cachedOverlayScrollbarOffset;
-
- // Move the scrollbar widgets if necessary. We normally move and resize widgets during layout,
- // but sometimes widgets can move without layout occurring (most notably when you scroll a
- // document that contains fixed positioned elements).
- positionOverflowControls(toIntSize(adjustedPaintOffset));
-
- // Overlay scrollbars paint in a second pass through the layer tree so that they will paint
- // on top of everything else. If this is the normal painting pass, paintingOverlayControls
- // will be false, and we should just tell the root layer that there are overlay scrollbars
- // that need to be painted. That will cause the second pass through the layer tree to run,
- // and we'll paint the scrollbars then. In the meantime, cache tx and ty so that the
- // second pass doesn't need to re-enter the RenderTree to get it right.
- if (hasOverlayScrollbars() && !paintingOverlayControls) {
- m_cachedOverlayScrollbarOffset = paintOffset;
- // It's not necessary to do the second pass if the scrollbars paint into layers.
- if ((m_hBar && layerForHorizontalScrollbar()) || (m_vBar && layerForVerticalScrollbar()))
- return;
- IntRect localDamgeRect = damageRect;
- localDamgeRect.moveBy(-paintOffset);
- if (!overflowControlsIntersectRect(localDamgeRect))
- return;
-
- RenderView* renderView = box().view();
-
- RenderLayer* paintingRoot = layer()->enclosingLayerWithCompositedLayerMapping(IncludeSelf);
- if (!paintingRoot)
- paintingRoot = renderView->layer();
-
- paintingRoot->setContainsDirtyOverlayScrollbars(true);
- return;
- }
-
- // This check is required to avoid painting custom CSS scrollbars twice.
- if (paintingOverlayControls && !hasOverlayScrollbars())
- return;
-
- // Now that we're sure the scrollbars are in the right place, paint them.
- if (m_hBar && !layerForHorizontalScrollbar())
- m_hBar->paint(context, damageRect);
- if (m_vBar && !layerForVerticalScrollbar())
- m_vBar->paint(context, damageRect);
-
- if (layerForScrollCorner())
- return;
-
- // We fill our scroll corner with white if we have a scrollbar that doesn't run all the way up to the
- // edge of the box.
- paintScrollCorner(context, adjustedPaintOffset, damageRect);
-
- // Paint our resizer last, since it sits on top of the scroll corner.
- paintResizer(context, adjustedPaintOffset, damageRect);
-}
-
-void RenderLayerScrollableArea::paintScrollCorner(GraphicsContext* context, const IntPoint& paintOffset, const IntRect& damageRect)
-{
- IntRect absRect = scrollCornerRect();
- absRect.moveBy(paintOffset);
- if (!absRect.intersects(damageRect))
- return;
-
- if (m_scrollCorner) {
- ScrollbarPainter::paintIntoRect(m_scrollCorner, context, paintOffset, absRect);
- return;
- }
-
- // We don't want to paint white if we have overlay scrollbars, since we need
- // to see what is behind it.
- if (!hasOverlayScrollbars())
- context->fillRect(absRect, Color::white);
-}
-
bool RenderLayerScrollableArea::hitTestOverflowControls(HitTestResult& result, const IntPoint& localPoint)
{
if (!hasScrollbar() && !box().canResize())
@@ -1170,56 +1089,6 @@ IntRect RenderLayerScrollableArea::scrollCornerAndResizerRect() const
return scrollCornerAndResizer;
}
-bool RenderLayerScrollableArea::overflowControlsIntersectRect(const IntRect& localRect) const
-{
- const IntRect borderBox = box().pixelSnappedBorderBoxRect();
-
- if (rectForHorizontalScrollbar(borderBox).intersects(localRect))
- return true;
-
- if (rectForVerticalScrollbar(borderBox).intersects(localRect))
- return true;
-
- if (scrollCornerRect().intersects(localRect))
- return true;
-
- if (resizerCornerRect(borderBox, ResizerForPointer).intersects(localRect))
- return true;
-
- return false;
-}
-
-void RenderLayerScrollableArea::paintResizer(GraphicsContext* context, const IntPoint& paintOffset, const IntRect& damageRect)
-{
- if (box().style()->resize() == RESIZE_NONE)
- return;
-
- IntRect absRect = resizerCornerRect(box().pixelSnappedBorderBoxRect(), ResizerForPointer);
- absRect.moveBy(paintOffset);
- if (!absRect.intersects(damageRect))
- return;
-
- if (m_resizer) {
- ScrollbarPainter::paintIntoRect(m_resizer, context, paintOffset, absRect);
- return;
- }
-
- drawPlatformResizerImage(context, absRect);
-
- // Draw a frame around the resizer (1px grey line) if there are any scrollbars present.
- // Clipping will exclude the right and bottom edges of this frame.
- if (!hasOverlayScrollbars() && hasScrollbar()) {
- GraphicsContextStateSaver stateSaver(*context);
- context->clip(absRect);
- IntRect largerCorner = absRect;
- largerCorner.setSize(IntSize(largerCorner.width() + 1, largerCorner.height() + 1));
- context->setStrokeColor(Color(217, 217, 217));
- context->setStrokeThickness(1.0f);
- context->setFillColor(Color::transparent);
- context->drawRect(largerCorner);
- }
-}
-
bool RenderLayerScrollableArea::isPointInResizeControl(const IntPoint& absolutePoint, ResizerHitTestType resizerHitTestType) const
{
if (!box().canResize())
@@ -1280,35 +1149,6 @@ void RenderLayerScrollableArea::updateResizerStyle()
}
}
-void RenderLayerScrollableArea::drawPlatformResizerImage(GraphicsContext* context, IntRect resizerCornerRect)
-{
- float deviceScaleFactor = blink::deviceScaleFactor(box().frame());
-
- RefPtr<Image> resizeCornerImage;
- IntSize cornerResizerSize;
- if (deviceScaleFactor >= 2) {
- DEFINE_STATIC_REF(Image, resizeCornerImageHiRes, (Image::loadPlatformResource("textAreaResizeCorner@2x")));
- resizeCornerImage = resizeCornerImageHiRes;
- cornerResizerSize = resizeCornerImage->size();
- cornerResizerSize.scale(0.5f);
- } else {
- DEFINE_STATIC_REF(Image, resizeCornerImageLoRes, (Image::loadPlatformResource("textAreaResizeCorner")));
- resizeCornerImage = resizeCornerImageLoRes;
- cornerResizerSize = resizeCornerImage->size();
- }
-
- if (box().style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) {
- context->save();
- context->translate(resizerCornerRect.x() + cornerResizerSize.width(), resizerCornerRect.y() + resizerCornerRect.height() - cornerResizerSize.height());
- context->scale(-1.0, 1.0);
- context->drawImage(resizeCornerImage.get(), IntRect(IntPoint(), cornerResizerSize));
- context->restore();
- return;
- }
- IntRect imageRect(resizerCornerRect.maxXMaxYCorner() - cornerResizerSize, cornerResizerSize);
- context->drawImage(resizeCornerImage.get(), imageRect);
-}
-
IntSize RenderLayerScrollableArea::offsetFromResizeCorner(const IntPoint& absolutePoint) const
{
// Currently the resize corner is either the bottom right corner or the bottom left corner.
« no previous file with comments | « Source/core/rendering/RenderLayerScrollableArea.h ('k') | Source/core/rendering/compositing/CompositedLayerMapping.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698