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

Unified Diff: Source/core/platform/ScrollbarTheme.cpp

Issue 99103006: Moving GraphicsContext and dependencies from core to platform. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Final patch - fixes Android Created 7 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
« no previous file with comments | « Source/core/platform/ScrollbarTheme.h ('k') | Source/core/platform/ScrollbarThemeAndroid.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/platform/ScrollbarTheme.cpp
diff --git a/Source/core/platform/ScrollbarTheme.cpp b/Source/core/platform/ScrollbarTheme.cpp
deleted file mode 100644
index 1d6707b28094f3f5bbb6073068f4c99ce5766d30..0000000000000000000000000000000000000000
--- a/Source/core/platform/ScrollbarTheme.cpp
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- * Copyright (C) 2011 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "core/platform/ScrollbarTheme.h"
-
-#include "RuntimeEnabledFeatures.h"
-#include "core/platform/mock/ScrollbarThemeMock.h"
-#include "core/platform/mock/ScrollbarThemeOverlayMock.h"
-#include "platform/scroll/ScrollbarThemeClient.h"
-
-namespace WebCore {
-
-ScrollbarTheme* ScrollbarTheme::theme()
-{
- if (ScrollbarTheme::mockScrollbarsEnabled()) {
- if (RuntimeEnabledFeatures::overlayScrollbarsEnabled()) {
- DEFINE_STATIC_LOCAL(ScrollbarThemeOverlayMock, overlayMockTheme, ());
- return &overlayMockTheme;
- }
-
- DEFINE_STATIC_LOCAL(ScrollbarThemeMock, mockTheme, ());
- return &mockTheme;
- }
- return nativeTheme();
-}
-
-bool ScrollbarTheme::gMockScrollbarsEnabled = false;
-
-void ScrollbarTheme::setMockScrollbarsEnabled(bool flag)
-{
- gMockScrollbarsEnabled = flag;
-}
-
-bool ScrollbarTheme::mockScrollbarsEnabled()
-{
- return gMockScrollbarsEnabled;
-}
-
-bool ScrollbarTheme::paint(ScrollbarThemeClient* scrollbar, GraphicsContext* graphicsContext, const IntRect& damageRect)
-{
- // Create the ScrollbarControlPartMask based on the damageRect
- ScrollbarControlPartMask scrollMask = NoPart;
-
- IntRect backButtonStartPaintRect;
- IntRect backButtonEndPaintRect;
- IntRect forwardButtonStartPaintRect;
- IntRect forwardButtonEndPaintRect;
- if (hasButtons(scrollbar)) {
- backButtonStartPaintRect = backButtonRect(scrollbar, BackButtonStartPart, true);
- if (damageRect.intersects(backButtonStartPaintRect))
- scrollMask |= BackButtonStartPart;
- backButtonEndPaintRect = backButtonRect(scrollbar, BackButtonEndPart, true);
- if (damageRect.intersects(backButtonEndPaintRect))
- scrollMask |= BackButtonEndPart;
- forwardButtonStartPaintRect = forwardButtonRect(scrollbar, ForwardButtonStartPart, true);
- if (damageRect.intersects(forwardButtonStartPaintRect))
- scrollMask |= ForwardButtonStartPart;
- forwardButtonEndPaintRect = forwardButtonRect(scrollbar, ForwardButtonEndPart, true);
- if (damageRect.intersects(forwardButtonEndPaintRect))
- scrollMask |= ForwardButtonEndPart;
- }
-
- IntRect startTrackRect;
- IntRect thumbRect;
- IntRect endTrackRect;
- IntRect trackPaintRect = trackRect(scrollbar, true);
- if (damageRect.intersects(trackPaintRect))
- scrollMask |= TrackBGPart;
- bool thumbPresent = hasThumb(scrollbar);
- if (thumbPresent) {
- IntRect track = trackRect(scrollbar);
- splitTrack(scrollbar, track, startTrackRect, thumbRect, endTrackRect);
- if (damageRect.intersects(thumbRect))
- scrollMask |= ThumbPart;
- if (damageRect.intersects(startTrackRect))
- scrollMask |= BackTrackPart;
- if (damageRect.intersects(endTrackRect))
- scrollMask |= ForwardTrackPart;
- }
-
- // Paint the scrollbar background (only used by custom CSS scrollbars).
- paintScrollbarBackground(graphicsContext, scrollbar);
-
- // Paint the back and forward buttons.
- if (scrollMask & BackButtonStartPart)
- paintButton(graphicsContext, scrollbar, backButtonStartPaintRect, BackButtonStartPart);
- if (scrollMask & BackButtonEndPart)
- paintButton(graphicsContext, scrollbar, backButtonEndPaintRect, BackButtonEndPart);
- if (scrollMask & ForwardButtonStartPart)
- paintButton(graphicsContext, scrollbar, forwardButtonStartPaintRect, ForwardButtonStartPart);
- if (scrollMask & ForwardButtonEndPart)
- paintButton(graphicsContext, scrollbar, forwardButtonEndPaintRect, ForwardButtonEndPart);
-
- if (scrollMask & TrackBGPart)
- paintTrackBackground(graphicsContext, scrollbar, trackPaintRect);
-
- if ((scrollMask & ForwardTrackPart) || (scrollMask & BackTrackPart)) {
- // Paint the track pieces above and below the thumb.
- if (scrollMask & BackTrackPart)
- paintTrackPiece(graphicsContext, scrollbar, startTrackRect, BackTrackPart);
- if (scrollMask & ForwardTrackPart)
- paintTrackPiece(graphicsContext, scrollbar, endTrackRect, ForwardTrackPart);
-
- paintTickmarks(graphicsContext, scrollbar, trackPaintRect);
- }
-
- // Paint the thumb.
- if (scrollMask & ThumbPart)
- paintThumb(graphicsContext, scrollbar, thumbRect);
-
- return true;
-}
-
-ScrollbarPart ScrollbarTheme::hitTest(ScrollbarThemeClient* scrollbar, const IntPoint& position)
-{
- ScrollbarPart result = NoPart;
- if (!scrollbar->enabled())
- return result;
-
- IntPoint testPosition = scrollbar->convertFromContainingWindow(position);
- testPosition.move(scrollbar->x(), scrollbar->y());
-
- if (!scrollbar->frameRect().contains(testPosition))
- return NoPart;
-
- result = ScrollbarBGPart;
-
- IntRect track = trackRect(scrollbar);
- if (track.contains(testPosition)) {
- IntRect beforeThumbRect;
- IntRect thumbRect;
- IntRect afterThumbRect;
- splitTrack(scrollbar, track, beforeThumbRect, thumbRect, afterThumbRect);
- if (thumbRect.contains(testPosition))
- result = ThumbPart;
- else if (beforeThumbRect.contains(testPosition))
- result = BackTrackPart;
- else if (afterThumbRect.contains(testPosition))
- result = ForwardTrackPart;
- else
- result = TrackBGPart;
- } else if (backButtonRect(scrollbar, BackButtonStartPart).contains(testPosition)) {
- result = BackButtonStartPart;
- } else if (backButtonRect(scrollbar, BackButtonEndPart).contains(testPosition)) {
- result = BackButtonEndPart;
- } else if (forwardButtonRect(scrollbar, ForwardButtonStartPart).contains(testPosition)) {
- result = ForwardButtonStartPart;
- } else if (forwardButtonRect(scrollbar, ForwardButtonEndPart).contains(testPosition)) {
- result = ForwardButtonEndPart;
- }
- return result;
-}
-
-void ScrollbarTheme::invalidatePart(ScrollbarThemeClient* scrollbar, ScrollbarPart part)
-{
- if (part == NoPart)
- return;
-
- IntRect result;
- switch (part) {
- case BackButtonStartPart:
- result = backButtonRect(scrollbar, BackButtonStartPart, true);
- break;
- case BackButtonEndPart:
- result = backButtonRect(scrollbar, BackButtonEndPart, true);
- break;
- case ForwardButtonStartPart:
- result = forwardButtonRect(scrollbar, ForwardButtonStartPart, true);
- break;
- case ForwardButtonEndPart:
- result = forwardButtonRect(scrollbar, ForwardButtonEndPart, true);
- break;
- case TrackBGPart:
- result = trackRect(scrollbar, true);
- break;
- case ScrollbarBGPart:
- result = scrollbar->frameRect();
- break;
- default: {
- IntRect beforeThumbRect, thumbRect, afterThumbRect;
- splitTrack(scrollbar, trackRect(scrollbar), beforeThumbRect, thumbRect, afterThumbRect);
- if (part == BackTrackPart)
- result = beforeThumbRect;
- else if (part == ForwardTrackPart)
- result = afterThumbRect;
- else
- result = thumbRect;
- }
- }
- result.moveBy(-scrollbar->location());
- scrollbar->invalidateRect(result);
-}
-
-void ScrollbarTheme::splitTrack(ScrollbarThemeClient* scrollbar, const IntRect& unconstrainedTrackRect, IntRect& beforeThumbRect, IntRect& thumbRect, IntRect& afterThumbRect)
-{
- // This function won't even get called unless we're big enough to have some combination of these three rects where at least
- // one of them is non-empty.
- IntRect trackRect = constrainTrackRectToTrackPieces(scrollbar, unconstrainedTrackRect);
- int thumbPos = thumbPosition(scrollbar);
- if (scrollbar->orientation() == HorizontalScrollbar) {
- thumbRect = IntRect(trackRect.x() + thumbPos, trackRect.y(), thumbLength(scrollbar), scrollbar->height());
- beforeThumbRect = IntRect(trackRect.x(), trackRect.y(), thumbPos + thumbRect.width() / 2, trackRect.height());
- afterThumbRect = IntRect(trackRect.x() + beforeThumbRect.width(), trackRect.y(), trackRect.maxX() - beforeThumbRect.maxX(), trackRect.height());
- } else {
- thumbRect = IntRect(trackRect.x(), trackRect.y() + thumbPos, scrollbar->width(), thumbLength(scrollbar));
- beforeThumbRect = IntRect(trackRect.x(), trackRect.y(), trackRect.width(), thumbPos + thumbRect.height() / 2);
- afterThumbRect = IntRect(trackRect.x(), trackRect.y() + beforeThumbRect.height(), trackRect.width(), trackRect.maxY() - beforeThumbRect.maxY());
- }
-}
-
-// Returns the size represented by track taking into account scrolling past
-// the end of the document.
-static float usedTotalSize(ScrollbarThemeClient* scrollbar)
-{
- float overhangAtStart = -scrollbar->currentPos();
- float overhangAtEnd = scrollbar->currentPos() + scrollbar->visibleSize() - scrollbar->totalSize();
- float overhang = std::max(0.0f, std::max(overhangAtStart, overhangAtEnd));
- return scrollbar->totalSize() + overhang;
-}
-
-int ScrollbarTheme::thumbPosition(ScrollbarThemeClient* scrollbar)
-{
- if (scrollbar->enabled()) {
- float size = usedTotalSize(scrollbar) - scrollbar->visibleSize();
- // Avoid doing a floating point divide by zero and return 1 when usedTotalSize == visibleSize.
- if (!size)
- return 1;
- float pos = std::max(0.0f, scrollbar->currentPos()) * (trackLength(scrollbar) - thumbLength(scrollbar)) / size;
- return (pos < 1 && pos > 0) ? 1 : pos;
- }
- return 0;
-}
-
-int ScrollbarTheme::thumbLength(ScrollbarThemeClient* scrollbar)
-{
- if (!scrollbar->enabled())
- return 0;
-
- float overhang = 0;
- if (scrollbar->currentPos() < 0)
- overhang = -scrollbar->currentPos();
- else if (scrollbar->visibleSize() + scrollbar->currentPos() > scrollbar->totalSize())
- overhang = scrollbar->currentPos() + scrollbar->visibleSize() - scrollbar->totalSize();
- float proportion = (scrollbar->visibleSize() - overhang) / usedTotalSize(scrollbar);
- int trackLen = trackLength(scrollbar);
- int length = round(proportion * trackLen);
- length = std::max(length, minimumThumbLength(scrollbar));
- if (length > trackLen)
- length = 0; // Once the thumb is below the track length, it just goes away (to make more room for the track).
- return length;
-}
-
-int ScrollbarTheme::minimumThumbLength(ScrollbarThemeClient* scrollbar)
-{
- return scrollbarThickness(scrollbar->controlSize());
-}
-
-int ScrollbarTheme::trackPosition(ScrollbarThemeClient* scrollbar)
-{
- IntRect constrainedTrackRect = constrainTrackRectToTrackPieces(scrollbar, trackRect(scrollbar));
- return (scrollbar->orientation() == HorizontalScrollbar) ? constrainedTrackRect.x() - scrollbar->x() : constrainedTrackRect.y() - scrollbar->y();
-}
-
-int ScrollbarTheme::trackLength(ScrollbarThemeClient* scrollbar)
-{
- IntRect constrainedTrackRect = constrainTrackRectToTrackPieces(scrollbar, trackRect(scrollbar));
- return (scrollbar->orientation() == HorizontalScrollbar) ? constrainedTrackRect.width() : constrainedTrackRect.height();
-}
-
-void ScrollbarTheme::paintScrollCorner(GraphicsContext* context, const IntRect& cornerRect)
-{
- context->fillRect(cornerRect, Color::white);
-}
-
-IntRect ScrollbarTheme::thumbRect(ScrollbarThemeClient* scrollbar)
-{
- if (!hasThumb(scrollbar))
- return IntRect();
-
- IntRect track = trackRect(scrollbar);
- IntRect startTrackRect;
- IntRect thumbRect;
- IntRect endTrackRect;
- splitTrack(scrollbar, track, startTrackRect, thumbRect, endTrackRect);
-
- return thumbRect;
-}
-
-int ScrollbarTheme::thumbThickness(ScrollbarThemeClient* scrollbar)
-{
- IntRect track = trackRect(scrollbar);
- return scrollbar->orientation() == HorizontalScrollbar ? track.height() : track.width();
-}
-
-void ScrollbarTheme::paintOverhangBackground(GraphicsContext* context, const IntRect& horizontalOverhangRect, const IntRect& verticalOverhangRect, const IntRect& dirtyRect)
-{
- context->setFillColor(Color::white);
- if (!horizontalOverhangRect.isEmpty())
- context->fillRect(intersection(horizontalOverhangRect, dirtyRect));
- if (!verticalOverhangRect.isEmpty())
- context->fillRect(intersection(verticalOverhangRect, dirtyRect));
-}
-
-}
« no previous file with comments | « Source/core/platform/ScrollbarTheme.h ('k') | Source/core/platform/ScrollbarThemeAndroid.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698