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; }
bool MediaControlsPainter::paintMediaVolumeSlider(const LayoutObject& object, const PaintInfo& paintInfo, const IntRect& rect) { const HTMLMediaElement* mediaElement = toParentMediaElement(object); if (!mediaElement) return false; GraphicsContext* context = paintInfo.context; const ComputedStyle& style = object.styleRef(); // Paint the slider bar. Color sliderBackgroundColor; if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled()) sliderBackgroundColor = Color(11, 11, 11); else sliderBackgroundColor = Color(0x9f, 0x9f, 0x9f); paintRoundedSliderBackground(rect, style, context, sliderBackgroundColor); // 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 (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled()) { if (volume > 0) { float thumbCenter = mediaVolumeSliderThumbWidth / 2; float zoomLevel = style.effectiveZoom(); float positionWidth = volume * (rect.width() - (zoomLevel * thumbCenter)); fillWidth = positionWidth + (zoomLevel * thumbCenter / 2); } } else { fillWidth = volume * rect.width(); } Color startColor = Color(195, 195, 195); Color endColor = Color(217, 217, 217); if (RuntimeEnabledFeatures::newMediaPlaybackUiEnabled()) startColor = endColor = Color(0x42, 0x85, 0xf4); // blue. paintSliderRangeHighlight(rect, style, context, 0.0, fillWidth, startColor, endColor); return true; }
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; }
void MediaControlsPainter::paintMediaSliderInternal(const LayoutObject& object, const PaintInfo& paintInfo, const IntRect& rect) { const bool useNewUi = RuntimeEnabledFeatures::newMediaPlaybackUiEnabled(); const HTMLMediaElement* mediaElement = toParentMediaElement(object); if (!mediaElement) return; const ComputedStyle& style = object.styleRef(); GraphicsContext* context = paintInfo.context; // Paint the slider bar in the "no data buffered" state. Color sliderBackgroundColor; if (!useNewUi) sliderBackgroundColor = Color(11, 11, 11); else sliderBackgroundColor = Color(0xda, 0xda, 0xda); paintRoundedSliderBackground(rect, style, context, sliderBackgroundColor); // 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. TimeRanges* bufferedTimeRanges = mediaElement->buffered(); float duration = mediaElement->duration(); float currentTime = mediaElement->currentTime(); if (std::isnan(duration) || std::isinf(duration) || !duration || std::isnan(currentTime)) return; for (unsigned i = 0; i < bufferedTimeRanges->length(); ++i) { float start = bufferedTimeRanges->start(i, ASSERT_NO_EXCEPTION); float end = bufferedTimeRanges->end(i, ASSERT_NO_EXCEPTION); // The delta is there to avoid corner cases when buffered // ranges is out of sync with current time because of // asynchronous media pipeline and current time caching in // HTMLMediaElement. // This is related to https://www.w3.org/Bugs/Public/show_bug.cgi?id=28125 // FIXME: Remove this workaround when WebMediaPlayer // has an asynchronous pause interface. if (std::isnan(start) || std::isnan(end) || start > currentTime + kCurrentTimeBufferedDelta || end < currentTime) continue; int startPosition = int(start * rect.width() / duration); int currentPosition = int(currentTime * rect.width() / duration); int endPosition = int(end * rect.width() / duration); if (!useNewUi) { // 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 highlight before current time. Color startColor; Color endColor; if (!useNewUi) { startColor = Color(195, 195, 195); // white-ish. endColor = Color(217, 217, 217); } else { startColor = endColor = Color(0x42, 0x85, 0xf4); // blue. } if (currentPosition > startPosition) paintSliderRangeHighlight(rect, style, context, startPosition, currentPosition, startColor, endColor); // Draw grey-ish highlight after current time. if (!useNewUi) { startColor = Color(60, 60, 60); endColor = Color(76, 76, 76); } else { startColor = endColor = Color(0x9f, 0x9f, 0x9f); // light grey. } if (endPosition > currentPosition) paintSliderRangeHighlight(rect, style, context, currentPosition, endPosition, startColor, endColor); return; } }