diff options
Diffstat (limited to 'WebCore/rendering/RenderThemeMac.mm')
| -rw-r--r-- | WebCore/rendering/RenderThemeMac.mm | 172 |
1 files changed, 124 insertions, 48 deletions
diff --git a/WebCore/rendering/RenderThemeMac.mm b/WebCore/rendering/RenderThemeMac.mm index c3ec91a..6315f9f 100644 --- a/WebCore/rendering/RenderThemeMac.mm +++ b/WebCore/rendering/RenderThemeMac.mm @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -21,6 +21,7 @@ #import "RenderThemeMac.h" #import "BitmapImage.h" +#import "ColorMac.h" #import "CSSStyleSelector.h" #import "CSSValueKeywords.h" #import "Document.h" @@ -33,6 +34,7 @@ #import "Image.h" #import "LocalCurrentGraphicsContext.h" #import "MediaControlElements.h" +#import "RenderMedia.h" #import "RenderSlider.h" #import "RenderView.h" #import "SharedBuffer.h" @@ -101,10 +103,15 @@ enum { leftPadding }; -RenderTheme* theme() +PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page*) { - static RenderThemeMac* macTheme = new RenderThemeMac; - return macTheme; + static RenderTheme* rt = RenderThemeMac::create().releaseRef(); + return rt; +} + +PassRefPtr<RenderTheme> RenderThemeMac::create() +{ + return adoptRef(new RenderThemeMac); } RenderThemeMac::RenderThemeMac() @@ -151,6 +158,14 @@ Color RenderThemeMac::platformInactiveListBoxSelectionForegroundColor() const return Color::black; } +Color RenderThemeMac::platformFocusRingColor() const +{ + if (usesTestModeFocusRingColor()) + return oldAquaFocusRingColor(); + + return systemColor(CSSValueWebkitFocusRingColor); +} + Color RenderThemeMac::platformInactiveListBoxSelectionBackgroundColor() const { return platformInactiveSelectionBackgroundColor(); @@ -408,6 +423,9 @@ Color RenderThemeMac::systemColor(int cssValueId) const case CSSValueThreedlightshadow: color = convertNSColorToColor([NSColor controlLightHighlightColor]); break; + case CSSValueWebkitFocusRingColor: + color = convertNSColorToColor([NSColor keyboardFocusIndicatorColor]); + break; case CSSValueWindow: color = convertNSColorToColor([NSColor windowBackgroundColor]); break; @@ -1116,7 +1134,7 @@ bool RenderThemeMac::paintSliderThumb(RenderObject* o, const RenderObject::Paint else oldPressed = m_isSliderThumbHorizontalPressed; - bool pressed = static_cast<RenderSlider*>(o->parent())->inDragMode(); + bool pressed = toRenderSlider(o->parent())->inDragMode(); if (o->style()->appearance() == SliderThumbVerticalPart) m_isSliderThumbVerticalPressed = pressed; @@ -1403,25 +1421,37 @@ typedef enum { static int mediaControllerTheme() { - static const long minimumQuickTimeVersion = 0x07600000; // 7.6 + static const long minimumQuickTimeVersion = 0x07630000; // 7.6.3 static SInt32 quickTimeVersion = 0; + static int controllerTheme = -1; + + if (controllerTheme != -1) + return controllerTheme; + + controllerTheme = MediaControllerThemeClassic; if (!quickTimeVersion) { OSErr err; err = Gestalt(gestaltQuickTime, &quickTimeVersion); if (err != noErr) - return MediaControllerThemeClassic; + return controllerTheme; } if (quickTimeVersion < minimumQuickTimeVersion) - return MediaControllerThemeClassic; + return controllerTheme; - // keep the feature off for now without an explicit opt-in Boolean validKey; Boolean useQTMediaUI = CFPreferencesGetAppBooleanValue(CFSTR("UseQuickTimeMediaUI"), CFSTR("com.apple.WebCore"), &validKey); + +#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) + if (validKey && !useQTMediaUI) + return controllerTheme; +#else if (!validKey || !useQTMediaUI) - return MediaControllerThemeClassic; + return controllerTheme; +#endif - return MediaControllerThemeQT; + controllerTheme = MediaControllerThemeQT; + return controllerTheme; } #endif @@ -1460,6 +1490,37 @@ void RenderThemeMac::adjustSliderThumbSize(RenderObject* o) const #if ENABLE(VIDEO) +enum WKMediaControllerThemeState { + MediaUIPartDisabledFlag = 1 << 0, + MediaUIPartPressedFlag = 1 << 1, + MediaUIPartDrawEndCapsFlag = 1 << 3, +}; + +static unsigned getMediaUIPartStateFlags(Node* node) +{ + unsigned flags = 0; + + if (node->active()) + flags |= MediaUIPartPressedFlag; + return flags; +} + +// Utility to scale when the UI part are not scaled by wkDrawMediaUIPart +static FloatRect getUnzoomedRectAndAdjustCurrentContext(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect &originalRect) +{ + float zoomLevel = o->style()->effectiveZoom(); + FloatRect unzoomedRect(originalRect); + if (zoomLevel != 1.0f && mediaControllerTheme() == MediaControllerThemeQT) { + unzoomedRect.setWidth(unzoomedRect.width() / zoomLevel); + unzoomedRect.setHeight(unzoomedRect.height() / zoomLevel); + paintInfo.context->translate(unzoomedRect.x(), unzoomedRect.y()); + paintInfo.context->scale(FloatSize(zoomLevel, zoomLevel)); + paintInfo.context->translate(-unzoomedRect.x(), -unzoomedRect.y()); + } + return unzoomedRect; +} + + bool RenderThemeMac::paintMediaFullscreenButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) { Node* node = o->node(); @@ -1467,7 +1528,7 @@ bool RenderThemeMac::paintMediaFullscreenButton(RenderObject* o, const RenderObj return false; LocalCurrentGraphicsContext localContext(paintInfo.context); - wkDrawMediaUIPart(MediaFullscreenButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active()); + wkDrawMediaUIPart(MediaFullscreenButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, getMediaUIPartStateFlags(node)); return false; } @@ -1478,12 +1539,11 @@ bool RenderThemeMac::paintMediaMuteButton(RenderObject* o, const RenderObject::P if (!mediaNode || (!mediaNode->hasTagName(videoTag) && !mediaNode->hasTagName(audioTag))) return false; - HTMLMediaElement* mediaElement = static_cast<HTMLMediaElement*>(mediaNode); - if (!mediaElement) - return false; - - LocalCurrentGraphicsContext localContext(paintInfo.context); - wkDrawMediaUIPart(mediaElement->muted() ? MediaUnMuteButton : MediaMuteButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active()); + if (MediaControlPlayButtonElement* btn = static_cast<MediaControlPlayButtonElement*>(node)) { + LocalCurrentGraphicsContext localContext(paintInfo.context); + wkDrawMediaUIPart(btn->displayType(), mediaControllerTheme(), paintInfo.context->platformContext(), r, getMediaUIPartStateFlags(node)); + + } return false; } @@ -1494,12 +1554,10 @@ bool RenderThemeMac::paintMediaPlayButton(RenderObject* o, const RenderObject::P if (!mediaNode || (!mediaNode->hasTagName(videoTag) && !mediaNode->hasTagName(audioTag))) return false; - HTMLMediaElement* mediaElement = static_cast<HTMLMediaElement*>(mediaNode); - if (!mediaElement) - return false; - - LocalCurrentGraphicsContext localContext(paintInfo.context); - wkDrawMediaUIPart(mediaElement->canPlay() ? MediaPlayButton : MediaPauseButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active()); + if (MediaControlPlayButtonElement* btn = static_cast<MediaControlPlayButtonElement*>(node)) { + LocalCurrentGraphicsContext localContext(paintInfo.context); + wkDrawMediaUIPart(btn->displayType(), mediaControllerTheme(), paintInfo.context->platformContext(), r, getMediaUIPartStateFlags(node)); + } return false; } @@ -1510,7 +1568,7 @@ bool RenderThemeMac::paintMediaSeekBackButton(RenderObject* o, const RenderObjec return false; LocalCurrentGraphicsContext localContext(paintInfo.context); - wkDrawMediaUIPart(MediaSeekBackButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active()); + wkDrawMediaUIPart(MediaSeekBackButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, getMediaUIPartStateFlags(node)); return false; } @@ -1521,7 +1579,7 @@ bool RenderThemeMac::paintMediaSeekForwardButton(RenderObject* o, const RenderOb return false; LocalCurrentGraphicsContext localContext(paintInfo.context); - wkDrawMediaUIPart(MediaSeekForwardButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active()); + wkDrawMediaUIPart(MediaSeekForwardButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, getMediaUIPartStateFlags(node)); return false; } @@ -1545,7 +1603,12 @@ bool RenderThemeMac::paintMediaSliderTrack(RenderObject* o, const RenderObject:: currentTime = player->currentTime(); } - wkDrawMediaSliderTrack(mediaControllerTheme(), paintInfo.context->platformContext(), r, timeLoaded, currentTime, duration); + paintInfo.context->save(); + FloatRect unzoomedRect = getUnzoomedRectAndAdjustCurrentContext(o, paintInfo, r); + wkDrawMediaSliderTrack(mediaControllerTheme(), paintInfo.context->platformContext(), unzoomedRect, + timeLoaded, currentTime, duration, getMediaUIPartStateFlags(node)); + + paintInfo.context->restore(); return false; } @@ -1556,18 +1619,41 @@ bool RenderThemeMac::paintMediaSliderThumb(RenderObject* o, const RenderObject:: return false; LocalCurrentGraphicsContext localContext(paintInfo.context); - wkDrawMediaUIPart(MediaSliderThumb, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active()); + wkDrawMediaUIPart(MediaSliderThumb, mediaControllerTheme(), paintInfo.context->platformContext(), r, getMediaUIPartStateFlags(node)); + return false; +} + +bool RenderThemeMac::paintMediaRewindButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) +{ + Node* node = o->node(); + if (!node) + return false; + + LocalCurrentGraphicsContext localContext(paintInfo.context); + wkDrawMediaUIPart(MediaRewindButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, getMediaUIPartStateFlags(node)); return false; } -bool RenderThemeMac::paintMediaTimelineContainer(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) +bool RenderThemeMac::paintMediaReturnToRealtimeButton(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) +{ + Node* node = o->node(); + if (!node) + return false; + + LocalCurrentGraphicsContext localContext(paintInfo.context); + wkDrawMediaUIPart(MediaReturnToRealtimeButton, mediaControllerTheme(), paintInfo.context->platformContext(), r, getMediaUIPartStateFlags(node)); + return false; +} + + +bool RenderThemeMac::paintMediaControlsBackground(RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r) { Node* node = o->node(); if (!node) return false; LocalCurrentGraphicsContext localContext(paintInfo.context); - wkDrawMediaUIPart(MediaTimelineContainer, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active()); + wkDrawMediaUIPart(MediaTimelineContainer, mediaControllerTheme(), paintInfo.context->platformContext(), r, getMediaUIPartStateFlags(node)); return false; } @@ -1577,8 +1663,10 @@ bool RenderThemeMac::paintMediaCurrentTime(RenderObject* o, const RenderObject:: if (!node) return false; - LocalCurrentGraphicsContext localContext(paintInfo.context); - wkDrawMediaUIPart(MediaCurrentTimeDisplay, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active()); + paintInfo.context->save(); + FloatRect unzoomedRect = getUnzoomedRectAndAdjustCurrentContext(o, paintInfo, r); + wkDrawMediaUIPart(MediaCurrentTimeDisplay, mediaControllerTheme(), paintInfo.context->platformContext(), unzoomedRect, getMediaUIPartStateFlags(node)); + paintInfo.context->restore(); return false; } @@ -1588,8 +1676,10 @@ bool RenderThemeMac::paintMediaTimeRemaining(RenderObject* o, const RenderObject if (!node) return false; - LocalCurrentGraphicsContext localContext(paintInfo.context); - wkDrawMediaUIPart(MediaTimeRemainingDisplay, mediaControllerTheme(), paintInfo.context->platformContext(), r, node->active()); + paintInfo.context->save(); + FloatRect unzoomedRect = getUnzoomedRectAndAdjustCurrentContext(o, paintInfo, r); + wkDrawMediaUIPart(MediaTimeRemainingDisplay, mediaControllerTheme(), paintInfo.context->platformContext(), unzoomedRect, getMediaUIPartStateFlags(node)); + paintInfo.context->restore(); return false; } @@ -1600,20 +1690,6 @@ String RenderThemeMac::extraMediaControlsStyleSheet() else return String(); } - -bool RenderThemeMac::hitTestMediaControlPart(RenderObject* o, const IntPoint& absPoint) -{ - if (!o->isBox()) - return false; - - if (mediaControllerTheme() == MediaControllerThemeQT) { - ControlPart part = o->style()->appearance(); - FloatPoint localPoint = o->absoluteToLocal(absPoint, false, true); // respect transforms - return wkHitTestMediaUIPart(part - MediaFullscreenButtonPart, MediaControllerThemeQT, CGRect(toRenderBox(o)->borderBoxRect()), CGPoint(localPoint)); - } - else - return RenderTheme::hitTestMediaControlPart(o, absPoint); -} #endif NSPopUpButtonCell* RenderThemeMac::popupButton() const |
