RenderMediaControls.cpp [plain text]
#include "config.h"
#include "RenderMediaControls.h"
#include "GraphicsContext.h"
#include "HTMLMediaElement.h"
#include "HTMLNames.h"
#include "RenderThemeSafari.h"
#include "SoftLinking.h"
#include <CoreGraphics/CoreGraphics.h>
using namespace std;
namespace WebCore {
#if !defined(NDEBUG) && defined(USE_DEBUG_SAFARI_THEME)
SOFT_LINK_DEBUG_LIBRARY(SafariTheme)
#else
SOFT_LINK_LIBRARY(SafariTheme)
#endif
SOFT_LINK(SafariTheme, paintThemePart, void, __stdcall, (ThemePart part, CGContextRef context, const CGRect& rect, NSControlSize size, ThemeControlState state), (part, context, rect, size, state))
SOFT_LINK(SafariTheme, STPaintProgressIndicator, void, APIENTRY, (ProgressIndicatorType type, CGContextRef context, const CGRect& rect, NSControlSize size, ThemeControlState state, float value), (type, context, rect, size, state, value))
#if ENABLE(VIDEO)
static ThemeControlState determineState(RenderObject* o)
{
ThemeControlState result = 0;
if (theme()->isActive(o))
result |= SafariTheme::ActiveState;
if (theme()->isEnabled(o) && !theme()->isReadOnlyControl(o))
result |= SafariTheme::EnabledState;
if (theme()->isPressed(o))
result |= SafariTheme::PressedState;
if (theme()->isChecked(o))
result |= SafariTheme::CheckedState;
if (theme()->isIndeterminate(o))
result |= SafariTheme::IndeterminateCheckedState;
if (theme()->isFocused(o))
result |= SafariTheme::FocusedState;
if (theme()->isDefault(o))
result |= SafariTheme::DefaultState;
return result;
}
static const int mediaSliderThumbWidth = 13;
static const int mediaSliderThumbHeight = 14;
void RenderMediaControls::adjustMediaSliderThumbSize(RenderObject* o)
{
if (o->style()->appearance() != MediaSliderThumbPart)
return;
o->style()->setWidth(Length(mediaSliderThumbWidth, Fixed));
o->style()->setHeight(Length(mediaSliderThumbHeight, Fixed));
}
static HTMLMediaElement* parentMediaElement(RenderObject* o)
{
Node* node = o->node();
Node* mediaNode = node ? node->shadowAncestorNode() : 0;
if (!mediaNode || (!mediaNode->hasTagName(HTMLNames::videoTag) && !mediaNode->hasTagName(HTMLNames::audioTag)))
return 0;
return static_cast<HTMLMediaElement*>(mediaNode);
}
bool RenderMediaControls::paintMediaControlsPart(MediaControlElementType part, RenderObject* o, const RenderObject::PaintInfo& paintInfo, const IntRect& r)
{
ASSERT(SafariThemeLibrary());
switch (part) {
case MediaFullscreenButton:
paintThemePart(SafariTheme::MediaFullscreenButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
break;
case MediaMuteButton:
case MediaUnMuteButton:
if (HTMLMediaElement* mediaElement = parentMediaElement(o))
paintThemePart(mediaElement->muted() ? SafariTheme::MediaUnMuteButtonPart : SafariTheme::MediaMuteButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
break;
case MediaPauseButton:
case MediaPlayButton:
if (HTMLMediaElement* mediaElement = parentMediaElement(o))
paintThemePart(mediaElement->canPlay() ? SafariTheme::MediaPlayButtonPart : SafariTheme::MediaPauseButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
break;
case MediaSeekBackButton:
paintThemePart(SafariTheme::MediaSeekBackButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
break;
case MediaSeekForwardButton:
paintThemePart(SafariTheme::MediaSeekForwardButtonPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
break;
case MediaSlider: {
HTMLMediaElement* mediaElement = parentMediaElement(o);
if (!mediaElement)
break;
MediaPlayer* player = mediaElement->player();
float duration = player ? player->duration() : 0;
float percentLoaded = duration ? player->maxTimeBuffered() /duration : 0;
STPaintProgressIndicator(SafariTheme::MediaType, paintInfo.context->platformContext(), r, NSRegularControlSize, 0, percentLoaded);
break;
}
case MediaSliderThumb:
paintThemePart(SafariTheme::MediaSliderThumbPart, paintInfo.context->platformContext(), r, NSRegularControlSize, determineState(o));
break;
case MediaTimelineContainer:
ASSERT_NOT_REACHED();
break;
case MediaCurrentTimeDisplay:
ASSERT_NOT_REACHED();
break;
case MediaTimeRemainingDisplay:
ASSERT_NOT_REACHED();
break;
case MediaControlsPanel:
ASSERT_NOT_REACHED();
break;
}
return false;
}
#endif // #if ENABLE(VIDEO)
}