| Index: Source/core/rendering/RenderMediaControlsChromium.cpp
|
| diff --git a/Source/core/rendering/RenderMediaControlsChromium.cpp b/Source/core/rendering/RenderMediaControlsChromium.cpp
|
| deleted file mode 100644
|
| index 26fc395f103186a58558614e240d0708d2826c96..0000000000000000000000000000000000000000
|
| --- a/Source/core/rendering/RenderMediaControlsChromium.cpp
|
| +++ /dev/null
|
| @@ -1,452 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2009 Apple Inc.
|
| - * Copyright (C) 2009 Google 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/rendering/RenderMediaControlsChromium.h"
|
| -
|
| -#include "bindings/v8/ExceptionStatePlaceholder.h"
|
| -#include "core/html/HTMLMediaElement.h"
|
| -#include "core/html/TimeRanges.h"
|
| -#include "core/platform/graphics/Gradient.h"
|
| -#include "core/platform/graphics/GraphicsContext.h"
|
| -#include "core/rendering/PaintInfo.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -typedef WTF::HashMap<const char*, Image*> MediaControlImageMap;
|
| -static MediaControlImageMap* gMediaControlImageMap = 0;
|
| -
|
| -static Image* platformResource(const char* name)
|
| -{
|
| - if (!gMediaControlImageMap)
|
| - gMediaControlImageMap = new MediaControlImageMap();
|
| - if (Image* image = gMediaControlImageMap->get(name))
|
| - return image;
|
| - if (Image* image = Image::loadPlatformResource(name).leakRef()) {
|
| - gMediaControlImageMap->set(name, image);
|
| - return image;
|
| - }
|
| - ASSERT_NOT_REACHED();
|
| - return 0;
|
| -}
|
| -
|
| -static bool hasSource(const HTMLMediaElement* mediaElement)
|
| -{
|
| - return mediaElement->networkState() != HTMLMediaElement::NETWORK_EMPTY
|
| - && mediaElement->networkState() != HTMLMediaElement::NETWORK_NO_SOURCE;
|
| -}
|
| -
|
| -static bool paintMediaButton(GraphicsContext* context, const IntRect& rect, Image* image)
|
| -{
|
| - context->drawImage(image, rect);
|
| - return true;
|
| -}
|
| -
|
| -static bool paintMediaMuteButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - HTMLMediaElement* mediaElement = toParentMediaElement(object);
|
| - if (!mediaElement)
|
| - return false;
|
| -
|
| - static Image* soundLevel3 = platformResource("mediaplayerSoundLevel3");
|
| - static Image* soundLevel2 = platformResource("mediaplayerSoundLevel2");
|
| - static Image* soundLevel1 = platformResource("mediaplayerSoundLevel1");
|
| - static Image* soundLevel0 = platformResource("mediaplayerSoundLevel0");
|
| - static Image* soundDisabled = platformResource("mediaplayerSoundDisabled");
|
| -
|
| - if (!hasSource(mediaElement) || !mediaElement->hasAudio())
|
| - return paintMediaButton(paintInfo.context, rect, soundDisabled);
|
| -
|
| - if (mediaElement->muted() || mediaElement->volume() <= 0)
|
| - return paintMediaButton(paintInfo.context, rect, soundLevel0);
|
| -
|
| - if (mediaElement->volume() <= 0.33)
|
| - return paintMediaButton(paintInfo.context, rect, soundLevel1);
|
| -
|
| - if (mediaElement->volume() <= 0.66)
|
| - return paintMediaButton(paintInfo.context, rect, soundLevel2);
|
| -
|
| - return paintMediaButton(paintInfo.context, rect, soundLevel3);
|
| -}
|
| -
|
| -static bool paintMediaPlayButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - HTMLMediaElement* mediaElement = toParentMediaElement(object);
|
| - if (!mediaElement)
|
| - return false;
|
| -
|
| - static Image* mediaPlay = platformResource("mediaplayerPlay");
|
| - static Image* mediaPause = platformResource("mediaplayerPause");
|
| - static Image* mediaPlayDisabled = platformResource("mediaplayerPlayDisabled");
|
| -
|
| - if (!hasSource(mediaElement))
|
| - return paintMediaButton(paintInfo.context, rect, mediaPlayDisabled);
|
| -
|
| - return paintMediaButton(paintInfo.context, rect, mediaElement->canPlay() ? mediaPlay : mediaPause);
|
| -}
|
| -
|
| -static bool paintMediaOverlayPlayButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - HTMLMediaElement* mediaElement = toParentMediaElement(object);
|
| - if (!mediaElement)
|
| - return false;
|
| -
|
| - if (!hasSource(mediaElement) || !mediaElement->canPlay())
|
| - return false;
|
| -
|
| - static Image* mediaOverlayPlay = platformResource("mediaplayerOverlayPlay");
|
| - return paintMediaButton(paintInfo.context, rect, mediaOverlayPlay);
|
| -}
|
| -
|
| -static Image* getMediaSliderThumb()
|
| -{
|
| - static Image* mediaSliderThumb = platformResource("mediaplayerSliderThumb");
|
| - return mediaSliderThumb;
|
| -}
|
| -
|
| -static void paintRoundedSliderBackground(const IntRect& rect, const RenderStyle* style, GraphicsContext* context)
|
| -{
|
| - int borderRadius = rect.height() / 2;
|
| - IntSize radii(borderRadius, borderRadius);
|
| - Color sliderBackgroundColor = Color(11, 11, 11);
|
| - context->save();
|
| - context->fillRoundedRect(rect, radii, radii, radii, radii, sliderBackgroundColor);
|
| - context->restore();
|
| -}
|
| -
|
| -static void paintSliderRangeHighlight(const IntRect& rect, const RenderStyle* style, GraphicsContext* context, int startPosition, int endPosition, Color startColor, Color endColor)
|
| -{
|
| - // Calculate border radius; need to avoid being smaller than half the slider height
|
| - // because of https://bugs.webkit.org/show_bug.cgi?id=30143.
|
| - int borderRadius = rect.height() / 2;
|
| - IntSize radii(borderRadius, borderRadius);
|
| -
|
| - // Calculate highlight rectangle and edge dimensions.
|
| - int startOffset = startPosition;
|
| - int endOffset = rect.width() - endPosition;
|
| - int rangeWidth = endPosition - startPosition;
|
| -
|
| - if (rangeWidth <= 0)
|
| - return;
|
| -
|
| - // Make sure the range width is bigger than border radius at the edges to retain rounded corners.
|
| - if (startOffset < borderRadius && rangeWidth < borderRadius)
|
| - rangeWidth = borderRadius;
|
| - if (endOffset < borderRadius && rangeWidth < borderRadius) {
|
| - startPosition -= borderRadius - rangeWidth;
|
| - rangeWidth = borderRadius;
|
| - }
|
| -
|
| - // Set rectangle to highlight range.
|
| - IntRect highlightRect = rect;
|
| - highlightRect.move(startOffset, 0);
|
| - highlightRect.setWidth(rangeWidth);
|
| -
|
| - // Don't bother drawing an empty area.
|
| - if (highlightRect.isEmpty())
|
| - return;
|
| -
|
| - // Calculate white-grey gradient.
|
| - IntPoint sliderTopLeft = highlightRect.location();
|
| - IntPoint sliderBottomLeft = sliderTopLeft;
|
| - sliderBottomLeft.move(0, highlightRect.height());
|
| - RefPtr<Gradient> gradient = Gradient::create(sliderTopLeft, sliderBottomLeft);
|
| - gradient->addColorStop(0.0, startColor);
|
| - gradient->addColorStop(1.0, endColor);
|
| -
|
| - // Fill highlight rectangle with gradient, potentially rounded if on left or right edge.
|
| - context->save();
|
| - context->setFillGradient(gradient);
|
| -
|
| - if (startOffset < borderRadius && endOffset < borderRadius)
|
| - context->fillRoundedRect(highlightRect, radii, radii, radii, radii, startColor);
|
| - else if (startOffset < borderRadius)
|
| - context->fillRoundedRect(highlightRect, radii, IntSize(0, 0), radii, IntSize(0, 0), startColor);
|
| - else if (endOffset < borderRadius)
|
| - context->fillRoundedRect(highlightRect, IntSize(0, 0), radii, IntSize(0, 0), radii, startColor);
|
| - else
|
| - context->fillRect(highlightRect);
|
| -
|
| - context->restore();
|
| -}
|
| -
|
| -const int mediaSliderThumbWidth = 32;
|
| -
|
| -static bool paintMediaSlider(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - HTMLMediaElement* mediaElement = toParentMediaElement(object);
|
| - if (!mediaElement)
|
| - return false;
|
| -
|
| - RenderStyle* style = object->style();
|
| - GraphicsContext* context = paintInfo.context;
|
| -
|
| - paintRoundedSliderBackground(rect, style, context);
|
| -
|
| - // Draw the buffered range. Since the element may have multiple buffered ranges and it'd be
|
| - // distracting/'busy' to show all of them, show only the buffered range containing the current play head.
|
| - RefPtr<TimeRanges> bufferedTimeRanges = mediaElement->buffered();
|
| - float duration = mediaElement->duration();
|
| - float currentTime = mediaElement->currentTime();
|
| - if (std::isnan(duration) || std::isinf(duration) || !duration || std::isnan(currentTime))
|
| - return true;
|
| -
|
| - for (unsigned i = 0; i < bufferedTimeRanges->length(); ++i) {
|
| - float start = bufferedTimeRanges->start(i, ASSERT_NO_EXCEPTION);
|
| - float end = bufferedTimeRanges->end(i, ASSERT_NO_EXCEPTION);
|
| - if (std::isnan(start) || std::isnan(end) || start > currentTime || end < currentTime)
|
| - continue;
|
| - int startPosition = int(start * rect.width() / duration);
|
| - int currentPosition = int(currentTime * rect.width() / duration);
|
| - int endPosition = int(end * rect.width() / duration);
|
| -
|
| - // Add half the thumb width proportionally adjusted to the current painting position.
|
| - int thumbCenter = mediaSliderThumbWidth / 2;
|
| - int addWidth = thumbCenter * (1.0 - 2.0 * currentPosition / rect.width());
|
| - currentPosition += addWidth;
|
| -
|
| - // Draw white-ish highlight before current time.
|
| - Color startColor = Color(195, 195, 195);
|
| - Color endColor = Color(217, 217, 217);
|
| - if (currentPosition > startPosition)
|
| - paintSliderRangeHighlight(rect, style, context, startPosition, currentPosition, startColor, endColor);
|
| -
|
| - // Draw grey-ish highlight after current time.
|
| - startColor = Color(60, 60, 60);
|
| - endColor = Color(76, 76, 76);
|
| -
|
| - if (endPosition > currentPosition)
|
| - paintSliderRangeHighlight(rect, style, context, currentPosition, endPosition, startColor, endColor);
|
| -
|
| - return true;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -static bool paintMediaSliderThumb(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - ASSERT(object->node());
|
| - HTMLMediaElement* mediaElement = toParentMediaElement(object->node()->shadowHost());
|
| - if (!mediaElement)
|
| - return false;
|
| -
|
| - if (!hasSource(mediaElement))
|
| - return true;
|
| -
|
| - Image* mediaSliderThumb = getMediaSliderThumb();
|
| - return paintMediaButton(paintInfo.context, rect, mediaSliderThumb);
|
| -}
|
| -
|
| -const int mediaVolumeSliderThumbWidth = 24;
|
| -
|
| -static bool paintMediaVolumeSlider(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - HTMLMediaElement* mediaElement = toParentMediaElement(object);
|
| - if (!mediaElement)
|
| - return false;
|
| -
|
| - GraphicsContext* context = paintInfo.context;
|
| - RenderStyle* style = object->style();
|
| -
|
| - paintRoundedSliderBackground(rect, style, context);
|
| -
|
| - // Calculate volume position for white background rectangle.
|
| - float volume = mediaElement->volume();
|
| - if (std::isnan(volume) || volume < 0)
|
| - return true;
|
| - if (volume > 1)
|
| - volume = 1;
|
| - if (!hasSource(mediaElement) || !mediaElement->hasAudio() || mediaElement->muted())
|
| - volume = 0;
|
| -
|
| - // Calculate the position relative to the center of the thumb.
|
| - float fillWidth = 0;
|
| - if (volume > 0) {
|
| - float thumbCenter = mediaVolumeSliderThumbWidth / 2;
|
| - float zoomLevel = style->effectiveZoom();
|
| - float positionWidth = volume * (rect.width() - (zoomLevel * thumbCenter));
|
| - fillWidth = positionWidth + (zoomLevel * thumbCenter / 2);
|
| - }
|
| -
|
| - Color startColor = Color(195, 195, 195);
|
| - Color endColor = Color(217, 217, 217);
|
| -
|
| - paintSliderRangeHighlight(rect, style, context, 0.0, fillWidth, startColor, endColor);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -static bool paintMediaVolumeSliderThumb(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - ASSERT(object->node());
|
| - HTMLMediaElement* mediaElement = toParentMediaElement(object->node()->shadowHost());
|
| - if (!mediaElement)
|
| - return false;
|
| -
|
| - if (!hasSource(mediaElement) || !mediaElement->hasAudio())
|
| - return true;
|
| -
|
| - static Image* mediaVolumeSliderThumb = platformResource("mediaplayerVolumeSliderThumb");
|
| - return paintMediaButton(paintInfo.context, rect, mediaVolumeSliderThumb);
|
| -}
|
| -
|
| -static bool paintMediaFullscreenButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - HTMLMediaElement* mediaElement = toParentMediaElement(object);
|
| - if (!mediaElement)
|
| - return false;
|
| -
|
| - static Image* mediaFullscreenButton = platformResource("mediaplayerFullscreen");
|
| - return paintMediaButton(paintInfo.context, rect, mediaFullscreenButton);
|
| -}
|
| -
|
| -static bool paintMediaToggleClosedCaptionsButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - HTMLMediaElement* mediaElement = toParentMediaElement(object);
|
| - if (!mediaElement)
|
| - return false;
|
| -
|
| - static Image* mediaClosedCaptionButton = platformResource("mediaplayerClosedCaption");
|
| - static Image* mediaClosedCaptionButtonDisabled = platformResource("mediaplayerClosedCaptionDisabled");
|
| -
|
| - if (mediaElement->webkitClosedCaptionsVisible())
|
| - return paintMediaButton(paintInfo.context, rect, mediaClosedCaptionButton);
|
| -
|
| - return paintMediaButton(paintInfo.context, rect, mediaClosedCaptionButtonDisabled);
|
| -}
|
| -
|
| -
|
| -bool RenderMediaControlsChromium::paintMediaControlsPart(MediaControlElementType part, RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
|
| -{
|
| - switch (part) {
|
| - case MediaMuteButton:
|
| - case MediaUnMuteButton:
|
| - return paintMediaMuteButton(object, paintInfo, rect);
|
| - case MediaPauseButton:
|
| - case MediaPlayButton:
|
| - return paintMediaPlayButton(object, paintInfo, rect);
|
| - case MediaShowClosedCaptionsButton:
|
| - return paintMediaToggleClosedCaptionsButton(object, paintInfo, rect);
|
| - case MediaSlider:
|
| - return paintMediaSlider(object, paintInfo, rect);
|
| - case MediaSliderThumb:
|
| - return paintMediaSliderThumb(object, paintInfo, rect);
|
| - case MediaVolumeSlider:
|
| - return paintMediaVolumeSlider(object, paintInfo, rect);
|
| - case MediaVolumeSliderThumb:
|
| - return paintMediaVolumeSliderThumb(object, paintInfo, rect);
|
| - case MediaEnterFullscreenButton:
|
| - case MediaExitFullscreenButton:
|
| - return paintMediaFullscreenButton(object, paintInfo, rect);
|
| - case MediaOverlayPlayButton:
|
| - return paintMediaOverlayPlayButton(object, paintInfo, rect);
|
| - case MediaVolumeSliderMuteButton:
|
| - case MediaSeekBackButton:
|
| - case MediaSeekForwardButton:
|
| - case MediaVolumeSliderContainer:
|
| - case MediaTimelineContainer:
|
| - case MediaCurrentTimeDisplay:
|
| - case MediaTimeRemainingDisplay:
|
| - case MediaControlsPanel:
|
| - case MediaRewindButton:
|
| - case MediaReturnToRealtimeButton:
|
| - case MediaStatusDisplay:
|
| - case MediaHideClosedCaptionsButton:
|
| - case MediaTextTrackDisplayContainer:
|
| - case MediaTextTrackDisplay:
|
| - case MediaFullScreenVolumeSlider:
|
| - case MediaFullScreenVolumeSliderThumb:
|
| - ASSERT_NOT_REACHED();
|
| - break;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -const int mediaSliderThumbHeight = 24;
|
| -const int mediaVolumeSliderThumbHeight = 24;
|
| -
|
| -void RenderMediaControlsChromium::adjustMediaSliderThumbSize(RenderStyle* style)
|
| -{
|
| - static Image* mediaSliderThumb = platformResource("mediaplayerSliderThumb");
|
| - static Image* mediaVolumeSliderThumb = platformResource("mediaplayerVolumeSliderThumb");
|
| - int width = 0;
|
| - int height = 0;
|
| -
|
| - Image* thumbImage = 0;
|
| - if (style->appearance() == MediaSliderThumbPart) {
|
| - thumbImage = mediaSliderThumb;
|
| - width = mediaSliderThumbWidth;
|
| - height = mediaSliderThumbHeight;
|
| - } else if (style->appearance() == MediaVolumeSliderThumbPart) {
|
| - thumbImage = mediaVolumeSliderThumb;
|
| - width = mediaVolumeSliderThumbWidth;
|
| - height = mediaVolumeSliderThumbHeight;
|
| - }
|
| -
|
| - float zoomLevel = style->effectiveZoom();
|
| - if (thumbImage) {
|
| - style->setWidth(Length(static_cast<int>(width * zoomLevel), Fixed));
|
| - style->setHeight(Length(static_cast<int>(height * zoomLevel), Fixed));
|
| - }
|
| -}
|
| -
|
| -static String formatChromiumMediaControlsTime(float time, float duration)
|
| -{
|
| - if (!std::isfinite(time))
|
| - time = 0;
|
| - if (!std::isfinite(duration))
|
| - duration = 0;
|
| - int seconds = static_cast<int>(fabsf(time));
|
| - int hours = seconds / (60 * 60);
|
| - int minutes = (seconds / 60) % 60;
|
| - seconds %= 60;
|
| -
|
| - // duration defines the format of how the time is rendered
|
| - int durationSecs = static_cast<int>(fabsf(duration));
|
| - int durationHours = durationSecs / (60 * 60);
|
| - int durationMins = (durationSecs / 60) % 60;
|
| -
|
| - if (durationHours || hours)
|
| - return String::format("%s%01d:%02d:%02d", (time < 0 ? "-" : ""), hours, minutes, seconds);
|
| - if (durationMins > 9)
|
| - return String::format("%s%02d:%02d", (time < 0 ? "-" : ""), minutes, seconds);
|
| -
|
| - return String::format("%s%01d:%02d", (time < 0 ? "-" : ""), minutes, seconds);
|
| -}
|
| -
|
| -String RenderMediaControlsChromium::formatMediaControlsTime(float time)
|
| -{
|
| - return formatChromiumMediaControlsTime(time, time);
|
| -}
|
| -
|
| -String RenderMediaControlsChromium::formatMediaControlsCurrentTime(float currentTime, float duration)
|
| -{
|
| - return formatChromiumMediaControlsTime(currentTime, duration);
|
| -}
|
| -
|
| -} // namespace WebCore
|
|
|