1/*
2 * Copyright (C) 2009 Apple Inc. All Rights Reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "RenderMediaControls.h"
28
29#include "GraphicsContext.h"
30#include "HTMLMediaElement.h"
31#include "HTMLNames.h"
32#include "RenderThemeSafari.h"
33#include "SoftLinking.h"
34#include <CoreGraphics/CoreGraphics.h>
35
36using namespace std;
37
38namespace WebCore {
39
40#ifdef DEBUG_ALL
41SOFT_LINK_DEBUG_LIBRARY(SafariTheme)
42#else
43SOFT_LINK_LIBRARY(SafariTheme)
44#endif
45
46SOFT_LINK(SafariTheme, paintThemePart, void, __stdcall, (ThemePart part, CGContextRef context, const CGRect& rect, NSControlSize size, ThemeControlState state), (part, context, rect, size, state))
47SOFT_LINK(SafariTheme, STPaintProgressIndicator, void, APIENTRY, (ProgressIndicatorType type, CGContextRef context, const CGRect& rect, NSControlSize size, ThemeControlState state, float value), (type, context, rect, size, state, value))
48
49#if ENABLE(VIDEO)
50
51static ThemeControlState determineState(RenderObject* o)
52{
53    ThemeControlState result = 0;
54    RenderTheme* theme = o->theme();
55    if (theme->isActive(o))
56        result |= SafariTheme::ActiveState;
57    if (theme->isEnabled(o) && !theme->isReadOnlyControl(o))
58        result |= SafariTheme::EnabledState;
59    if (theme->isPressed(o))
60        result |= SafariTheme::PressedState;
61    if (theme->isChecked(o))
62        result |= SafariTheme::CheckedState;
63    if (theme->isIndeterminate(o))
64        result |= SafariTheme::IndeterminateCheckedState;
65    if (theme->isFocused(o))
66        result |= SafariTheme::FocusedState;
67    if (theme->isDefault(o))
68        result |= SafariTheme::DefaultState;
69    return result;
70}
71
72static const int mediaSliderThumbWidth = 13;
73static const int mediaSliderThumbHeight = 14;
74
75void RenderMediaControls::adjustMediaSliderThumbSize(RenderObject* o)
76{
77    if (o->style()->appearance() != MediaSliderThumbPart)
78        return;
79
80    float zoomLevel = o->style()->effectiveZoom();
81    o->style()->setWidth(Length(static_cast<int>(mediaSliderThumbWidth * zoomLevel), Fixed));
82    o->style()->setHeight(Length(static_cast<int>(mediaSliderThumbHeight * zoomLevel), Fixed));
83}
84
85bool RenderMediaControls::paintMediaControlsPart(MediaControlElementType part, RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
86{
87    ASSERT(SafariThemeLibrary());
88
89    switch (part) {
90        case MediaFullscreenButton:
91            paintThemePart(SafariTheme::MediaFullscreenButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
92            break;
93        case MediaShowClosedCaptionsButton:
94        case MediaHideClosedCaptionsButton:
95#if SAFARI_THEME_VERSION >= 4
96            if (MediaControlToggleClosedCaptionsButtonElement* btn = static_cast<MediaControlToggleClosedCaptionsButtonElement*>(o->node())) {
97                bool captionsVisible = btn->displayType() == MediaHideClosedCaptionsButton;
98                paintThemePart(captionsVisible ? SafariTheme::MediaHideClosedCaptionsButtonPart : SafariTheme::MediaShowClosedCaptionsButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
99            }
100#endif
101            break;
102        case MediaMuteButton:
103        case MediaUnMuteButton:
104            if (MediaControlMuteButtonElement* btn = static_cast<MediaControlMuteButtonElement*>(o->node())) {
105                bool audioEnabled = btn->displayType() == MediaMuteButton;
106                paintThemePart(audioEnabled ? SafariTheme::MediaMuteButtonPart : SafariTheme::MediaUnMuteButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
107            }
108            break;
109        case MediaPauseButton:
110        case MediaPlayButton:
111            if (MediaControlPlayButtonElement* btn = static_cast<MediaControlPlayButtonElement*>(o->node())) {
112                bool canPlay = btn->displayType() == MediaPlayButton;
113                paintThemePart(canPlay ? SafariTheme::MediaPlayButtonPart : SafariTheme::MediaPauseButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
114            }
115            break;
116        case MediaSeekBackButton:
117            paintThemePart(SafariTheme::MediaSeekBackButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
118            break;
119        case MediaSeekForwardButton:
120            paintThemePart(SafariTheme::MediaSeekForwardButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
121            break;
122        case MediaSlider: {
123            if (HTMLMediaElement* mediaElement = toParentMediaElement(o))
124                STPaintProgressIndicator(SafariTheme::MediaType, paintInfo.context->platformContext(), r, NSRegularControlSize, 0, mediaElement->percentLoaded());
125            break;
126        }
127        case MediaSliderThumb:
128            paintThemePart(SafariTheme::MediaSliderThumbPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
129            break;
130        case MediaVolumeSliderContainer:
131            // FIXME: Implement volume slider.
132            ASSERT_NOT_REACHED();
133            break;
134        case MediaVolumeSlider:
135            // FIXME: Implement volume slider.
136            ASSERT_NOT_REACHED();
137            break;
138        case MediaVolumeSliderThumb:
139            // FIXME: Implement volume slider.
140            ASSERT_NOT_REACHED();
141            break;
142        case MediaTimelineContainer:
143            ASSERT_NOT_REACHED();
144            break;
145        case MediaCurrentTimeDisplay:
146            ASSERT_NOT_REACHED();
147            break;
148        case MediaTimeRemainingDisplay:
149            ASSERT_NOT_REACHED();
150            break;
151        case MediaControlsPanel:
152            ASSERT_NOT_REACHED();
153            break;
154    }
155    return false;
156}
157
158#endif  // #if ENABLE(VIDEO)
159
160} // namespace WebCore
161