| 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
|
|
|