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

Unified Diff: Source/core/platform/ScrollbarThemeMacCommon.mm

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
Index: Source/core/platform/ScrollbarThemeMacCommon.mm
diff --git a/Source/core/platform/ScrollbarThemeMacCommon.mm b/Source/core/platform/ScrollbarThemeMacCommon.mm
deleted file mode 100644
index f37fb4475729d146058d0e21f4e2cc8f23f5c0d6..0000000000000000000000000000000000000000
--- a/Source/core/platform/ScrollbarThemeMacCommon.mm
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright (C) 2008, 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/ScrollbarThemeMacCommon.h"
-
-#include <Carbon/Carbon.h>
-#include "core/platform/ScrollbarThemeMacNonOverlayAPI.h"
-#include "core/platform/ScrollbarThemeMacOverlayAPI.h"
-#include "core/platform/graphics/Gradient.h"
-#include "core/platform/graphics/GraphicsContext.h"
-#include "core/platform/graphics/GraphicsContextStateSaver.h"
-#include "core/platform/graphics/GraphicsLayer.h"
-#include "core/platform/graphics/ImageBuffer.h"
-#include "core/platform/graphics/mac/ColorMac.h"
-#include "core/platform/mac/LocalCurrentGraphicsContext.h"
-#include "core/platform/mac/NSScrollerImpDetails.h"
-#include "core/platform/mac/ScrollAnimatorMac.h"
-#include "platform/PlatformMouseEvent.h"
-#include "platform/scroll/ScrollbarThemeClient.h"
-#include "public/platform/mac/WebThemeEngine.h"
-#include "public/platform/Platform.h"
-#include "public/platform/WebRect.h"
-#include "skia/ext/skia_utils_mac.h"
-#include "wtf/HashSet.h"
-#include "wtf/StdLibExtras.h"
-#include "wtf/TemporaryChange.h"
-#include "wtf/UnusedParam.h"
-
-// FIXME: There are repainting problems due to Aqua scroll bar buttons' visual overflow.
-
-using namespace std;
-using namespace WebCore;
-
-@interface NSColor (WebNSColorDetails)
-+ (NSImage *)_linenPatternImage;
-@end
-
-namespace WebCore {
-
-typedef HashSet<ScrollbarThemeClient*> ScrollbarSet;
-
-static ScrollbarSet& scrollbarSet()
-{
- DEFINE_STATIC_LOCAL(ScrollbarSet, set, ());
- return set;
-}
-
-}
-
-namespace WebCore {
-
-static float gInitialButtonDelay = 0.5f;
-static float gAutoscrollButtonDelay = 0.05f;
-static bool gJumpOnTrackClick = false;
-
-ScrollbarTheme* ScrollbarTheme::nativeTheme()
-{
- static ScrollbarThemeMacCommon* theme = NULL;
- if (theme)
- return theme;
- if (isScrollbarOverlayAPIAvailable()) {
- DEFINE_STATIC_LOCAL(ScrollbarThemeMacOverlayAPI, overlayTheme, ());
- theme = &overlayTheme;
- } else {
- DEFINE_STATIC_LOCAL(ScrollbarThemeMacNonOverlayAPI, nonOverlayTheme, ());
- theme = &nonOverlayTheme;
- }
- return theme;
-}
-
-void ScrollbarThemeMacCommon::registerScrollbar(ScrollbarThemeClient* scrollbar)
-{
- scrollbarSet().add(scrollbar);
-}
-
-void ScrollbarThemeMacCommon::unregisterScrollbar(ScrollbarThemeClient* scrollbar)
-{
- scrollbarSet().remove(scrollbar);
-}
-
-void ScrollbarThemeMacCommon::paintGivenTickmarks(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect, const Vector<IntRect>& tickmarks)
-{
- if (scrollbar->orientation() != VerticalScrollbar)
- return;
-
- if (rect.height() <= 0 || rect.width() <= 0)
- return; // nothing to draw on.
-
- if (!tickmarks.size())
- return;
-
- GraphicsContextStateSaver stateSaver(*context);
- context->setShouldAntialias(false);
- context->setStrokeColor(Color(0xCC, 0xAA, 0x00, 0xFF));
- context->setFillColor(Color(0xFF, 0xDD, 0x00, 0xFF));
-
- for (Vector<IntRect>::const_iterator i = tickmarks.begin(); i != tickmarks.end(); ++i) {
- // Calculate how far down (in %) the tick-mark should appear.
- const float percent = static_cast<float>(i->y()) / scrollbar->totalSize();
- if (percent < 0.0 || percent > 1.0)
- continue;
-
- // Calculate how far down (in pixels) the tick-mark should appear.
- const int yPos = rect.y() + (rect.height() * percent);
-
- // Paint.
- FloatRect tickRect(rect.x(), yPos, rect.width(), 2);
- context->fillRect(tickRect);
- context->strokeRect(tickRect, 1);
- }
-}
-
-void ScrollbarThemeMacCommon::paintOverhangBackground(GraphicsContext* context, const IntRect& horizontalOverhangRect, const IntRect& verticalOverhangRect, const IntRect& dirtyRect)
-{
- const bool hasHorizontalOverhang = !horizontalOverhangRect.isEmpty();
- const bool hasVerticalOverhang = !verticalOverhangRect.isEmpty();
-
- GraphicsContextStateSaver stateSaver(*context);
-
- if (!m_overhangPattern) {
- // Lazily load the linen pattern image used for overhang drawing.
- RefPtr<Image> patternImage = Image::loadPlatformResource("overhangPattern");
- m_overhangPattern = Pattern::create(patternImage, true, true);
- }
- context->setFillPattern(m_overhangPattern);
- if (hasHorizontalOverhang)
- context->fillRect(intersection(horizontalOverhangRect, dirtyRect));
- if (hasVerticalOverhang)
- context->fillRect(intersection(verticalOverhangRect, dirtyRect));
-}
-
-void ScrollbarThemeMacCommon::paintOverhangShadows(GraphicsContext* context, const IntSize& scrollOffset, const IntRect& horizontalOverhangRect, const IntRect& verticalOverhangRect, const IntRect& dirtyRect)
-{
- // The extent of each shadow in pixels.
- const int kShadowSize = 4;
- // Offset of negative one pixel to make the gradient blend with the toolbar's bottom border.
- const int kToolbarShadowOffset = -1;
- const struct {
- float stop;
- Color color;
- } kShadowColors[] = {
- { 0.000, Color(0, 0, 0, 255) },
- { 0.125, Color(0, 0, 0, 57) },
- { 0.375, Color(0, 0, 0, 41) },
- { 0.625, Color(0, 0, 0, 18) },
- { 0.875, Color(0, 0, 0, 6) },
- { 1.000, Color(0, 0, 0, 0) }
- };
- const unsigned kNumShadowColors = sizeof(kShadowColors)/sizeof(kShadowColors[0]);
-
- const bool hasHorizontalOverhang = !horizontalOverhangRect.isEmpty();
- const bool hasVerticalOverhang = !verticalOverhangRect.isEmpty();
- // Prefer non-additive shadows, but degrade to additive shadows if there is vertical overhang.
- const bool useAdditiveShadows = hasVerticalOverhang;
-
- GraphicsContextStateSaver stateSaver(*context);
-
- FloatPoint shadowCornerOrigin;
- FloatPoint shadowCornerOffset;
-
- // Draw the shadow for the horizontal overhang.
- if (hasHorizontalOverhang) {
- int toolbarShadowHeight = kShadowSize;
- RefPtr<Gradient> gradient;
- IntRect shadowRect = horizontalOverhangRect;
- shadowRect.setHeight(kShadowSize);
- if (scrollOffset.height() < 0) {
- if (useAdditiveShadows) {
- toolbarShadowHeight = std::min(horizontalOverhangRect.height(), kShadowSize);
- } else if (horizontalOverhangRect.height() < 2 * kShadowSize + kToolbarShadowOffset) {
- // Split the overhang area between the web content shadow and toolbar shadow if it's too small.
- shadowRect.setHeight((horizontalOverhangRect.height() + 1) / 2);
- toolbarShadowHeight = horizontalOverhangRect.height() - shadowRect.height() - kToolbarShadowOffset;
- }
- shadowRect.setY(horizontalOverhangRect.maxY() - shadowRect.height());
- gradient = Gradient::create(FloatPoint(0, shadowRect.maxY()), FloatPoint(0, shadowRect.maxY() - kShadowSize));
- shadowCornerOrigin.setY(shadowRect.maxY());
- shadowCornerOffset.setY(-kShadowSize);
- } else {
- gradient = Gradient::create(FloatPoint(0, shadowRect.y()), FloatPoint(0, shadowRect.maxY()));
- shadowCornerOrigin.setY(shadowRect.y());
- }
- if (hasVerticalOverhang) {
- shadowRect.setWidth(shadowRect.width() - verticalOverhangRect.width());
- if (scrollOffset.width() < 0) {
- shadowRect.setX(shadowRect.x() + verticalOverhangRect.width());
- shadowCornerOrigin.setX(shadowRect.x());
- shadowCornerOffset.setX(-kShadowSize);
- } else {
- shadowCornerOrigin.setX(shadowRect.maxX());
- }
- }
- for (unsigned i = 0; i < kNumShadowColors; i++)
- gradient->addColorStop(kShadowColors[i].stop, kShadowColors[i].color);
- context->setFillGradient(gradient);
- context->fillRect(intersection(shadowRect, dirtyRect));
-
- // Draw a drop-shadow from the toolbar.
- if (scrollOffset.height() < 0) {
- shadowRect.setY(kToolbarShadowOffset);
- shadowRect.setHeight(toolbarShadowHeight);
- gradient = Gradient::create(FloatPoint(0, shadowRect.y()), FloatPoint(0, shadowRect.y() + kShadowSize));
- for (unsigned i = 0; i < kNumShadowColors; i++)
- gradient->addColorStop(kShadowColors[i].stop, kShadowColors[i].color);
- context->setFillGradient(gradient);
- context->fillRect(intersection(shadowRect, dirtyRect));
- }
- }
-
- // Draw the shadow for the vertical overhang.
- if (hasVerticalOverhang) {
- RefPtr<Gradient> gradient;
- IntRect shadowRect = verticalOverhangRect;
- shadowRect.setWidth(kShadowSize);
- if (scrollOffset.width() < 0) {
- shadowRect.setX(verticalOverhangRect.maxX() - shadowRect.width());
- gradient = Gradient::create(FloatPoint(shadowRect.maxX(), 0), FloatPoint(shadowRect.x(), 0));
- } else {
- gradient = Gradient::create(FloatPoint(shadowRect.x(), 0), FloatPoint(shadowRect.maxX(), 0));
- }
- for (unsigned i = 0; i < kNumShadowColors; i++)
- gradient->addColorStop(kShadowColors[i].stop, kShadowColors[i].color);
- context->setFillGradient(gradient);
- context->fillRect(intersection(shadowRect, dirtyRect));
-
- // Draw a drop-shadow from the toolbar.
- shadowRect = verticalOverhangRect;
- shadowRect.setY(kToolbarShadowOffset);
- shadowRect.setHeight(kShadowSize);
- gradient = Gradient::create(FloatPoint(0, shadowRect.y()), FloatPoint(0, shadowRect.maxY()));
- for (unsigned i = 0; i < kNumShadowColors; i++)
- gradient->addColorStop(kShadowColors[i].stop, kShadowColors[i].color);
- context->setFillGradient(gradient);
- context->fillRect(intersection(shadowRect, dirtyRect));
- }
-
- // If both rectangles present, draw a radial gradient for the corner.
- if (hasHorizontalOverhang && hasVerticalOverhang) {
- RefPtr<Gradient> gradient = Gradient::create(shadowCornerOrigin, 0, shadowCornerOrigin, kShadowSize);
- for (unsigned i = 0; i < kNumShadowColors; i++)
- gradient->addColorStop(kShadowColors[i].stop, kShadowColors[i].color);
- context->setFillGradient(gradient);
- context->fillRect(FloatRect(shadowCornerOrigin.x() + shadowCornerOffset.x(), shadowCornerOrigin.y() + shadowCornerOffset.y(), kShadowSize, kShadowSize));
- }
-}
-
-void ScrollbarThemeMacCommon::paintTickmarks(GraphicsContext* context, ScrollbarThemeClient* scrollbar, const IntRect& rect)
-{
- // Note: This is only used for css-styled scrollbars on mac.
- if (scrollbar->orientation() != VerticalScrollbar)
- return;
-
- if (rect.height() <= 0 || rect.width() <= 0)
- return;
-
- Vector<IntRect> tickmarks;
- scrollbar->getTickmarks(tickmarks);
- if (!tickmarks.size())
- return;
-
- // Inset a bit.
- IntRect tickmarkTrackRect = rect;
- tickmarkTrackRect.setX(tickmarkTrackRect.x() + 1);
- tickmarkTrackRect.setWidth(tickmarkTrackRect.width() - 2);
- paintGivenTickmarks(context, scrollbar, tickmarkTrackRect, tickmarks);
-}
-
-ScrollbarThemeMacCommon::~ScrollbarThemeMacCommon()
-{
-}
-
-void ScrollbarThemeMacCommon::preferencesChanged(float initialButtonDelay, float autoscrollButtonDelay, bool jumpOnTrackClick, bool redraw)
-{
- updateButtonPlacement();
- gInitialButtonDelay = initialButtonDelay;
- gAutoscrollButtonDelay = autoscrollButtonDelay;
- gJumpOnTrackClick = jumpOnTrackClick;
- if (redraw && !scrollbarSet().isEmpty()) {
- ScrollbarSet::iterator end = scrollbarSet().end();
- for (ScrollbarSet::iterator it = scrollbarSet().begin(); it != end; ++it) {
- (*it)->styleChanged();
- (*it)->invalidate();
- }
- }
-}
-
-double ScrollbarThemeMacCommon::initialAutoscrollTimerDelay()
-{
- return gInitialButtonDelay;
-}
-
-double ScrollbarThemeMacCommon::autoscrollTimerDelay()
-{
- return gAutoscrollButtonDelay;
-}
-
-bool ScrollbarThemeMacCommon::shouldCenterOnThumb(ScrollbarThemeClient*, const PlatformMouseEvent& evt)
-{
- if (evt.button() != LeftButton)
- return false;
- if (gJumpOnTrackClick)
- return !evt.altKey();
- return evt.altKey();
-}
-
-bool ScrollbarThemeMacCommon::shouldDragDocumentInsteadOfThumb(ScrollbarThemeClient*, const PlatformMouseEvent& event)
-{
- return event.altKey();
-}
-
-int ScrollbarThemeMacCommon::scrollbarPartToHIPressedState(ScrollbarPart part)
-{
- switch (part) {
- case BackButtonStartPart:
- return kThemeTopOutsideArrowPressed;
- case BackButtonEndPart:
- return kThemeTopOutsideArrowPressed; // This does not make much sense. For some reason the outside constant is required.
- case ForwardButtonStartPart:
- return kThemeTopInsideArrowPressed;
- case ForwardButtonEndPart:
- return kThemeBottomOutsideArrowPressed;
- case ThumbPart:
- return kThemeThumbPressed;
- default:
- return 0;
- }
-}
-
-} // namespace WebCore
« no previous file with comments | « Source/core/platform/ScrollbarThemeMacCommon.h ('k') | Source/core/platform/ScrollbarThemeMacNonOverlayAPI.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698