bool RenderThemeGtk::paintMediaSliderTrack(const RenderObject& o, const PaintInfo& paintInfo, const IntRect& r) { HTMLMediaElement* mediaElement = parentMediaElement(o); if (!mediaElement) return false; GraphicsContext* context = paintInfo.context; context->save(); context->setStrokeStyle(NoStroke); float mediaDuration = mediaElement->duration(); float totalTrackWidth = r.width(); RenderStyle* style = &o.style(); RefPtr<TimeRanges> timeRanges = mediaElement->buffered(); for (unsigned index = 0; index < timeRanges->length(); ++index) { float start = timeRanges->start(index, IGNORE_EXCEPTION); float end = timeRanges->end(index, IGNORE_EXCEPTION); float startRatio = start / mediaDuration; float lengthRatio = (end - start) / mediaDuration; if (!lengthRatio) continue; IntRect rangeRect(r); rangeRect.setWidth(lengthRatio * totalTrackWidth); if (index) rangeRect.move(startRatio * totalTrackWidth, 0); context->fillRoundedRect(FloatRoundedRect(rangeRect, borderRadiiFromStyle(style)), style->visitedDependentColor(CSSPropertyColor), style->colorSpace()); } context->restore(); return false; }
bool RenderThemeGtk::paintMediaVolumeSliderTrack(const RenderObject& renderObject, const PaintInfo& paintInfo, const IntRect& rect) { HTMLMediaElement* mediaElement = parentMediaElement(renderObject); if (!mediaElement) return true; float volume = mediaElement->muted() ? 0.0f : mediaElement->volume(); if (!volume) return true; GraphicsContext* context = paintInfo.context; context->save(); context->setStrokeStyle(NoStroke); int rectHeight = rect.height(); float trackHeight = rectHeight * volume; RenderStyle* style = &renderObject.style(); IntRect volumeRect(rect); volumeRect.move(0, rectHeight - trackHeight); volumeRect.setHeight(ceil(trackHeight)); context->fillRoundedRect(FloatRoundedRect(volumeRect, borderRadiiFromStyle(style)), style->visitedDependentColor(CSSPropertyColor), style->colorSpace()); context->restore(); return false; }
bool RenderMediaControls::paintMediaControlsPart(MediaControlElementType part, const RenderObject& o, const PaintInfo& paintInfo, const IntRect& r) { GraphicsContextStateSaver stateSaver(*paintInfo.context); switch (part) { case MediaEnterFullscreenButton: case MediaExitFullscreenButton: if (MediaControlFullscreenButtonElement* btn = static_cast<MediaControlFullscreenButtonElement*>(o.node())) { bool enterButton = btn->displayType() == MediaEnterFullscreenButton; wkDrawMediaUIPart(enterButton ? WKMediaUIPartFullscreenButton : WKMediaUIPartExitFullscreenButton, paintInfo.context->platformContext(), r, determineState(o)); } break; case MediaShowClosedCaptionsButton: case MediaHideClosedCaptionsButton: if (MediaControlToggleClosedCaptionsButtonElement* btn = static_cast<MediaControlToggleClosedCaptionsButtonElement*>(o.node())) { bool captionsVisible = btn->displayType() == MediaHideClosedCaptionsButton; wkDrawMediaUIPart(captionsVisible ? WKMediaUIPartHideClosedCaptionsButton : WKMediaUIPartShowClosedCaptionsButton, paintInfo.context->platformContext(), r, determineState(o)); } break; case MediaMuteButton: case MediaUnMuteButton: if (MediaControlMuteButtonElement* btn = static_cast<MediaControlMuteButtonElement*>(o.node())) { bool audioEnabled = btn->displayType() == MediaMuteButton; wkDrawMediaUIPart(audioEnabled ? WKMediaUIPartMuteButton : WKMediaUIPartUnMuteButton, paintInfo.context->platformContext(), r, determineState(o)); } break; case MediaPauseButton: case MediaPlayButton: if (MediaControlPlayButtonElement* btn = static_cast<MediaControlPlayButtonElement*>(o.node())) { bool canPlay = btn->displayType() == MediaPlayButton; wkDrawMediaUIPart(canPlay ? WKMediaUIPartPlayButton : WKMediaUIPartPauseButton, paintInfo.context->platformContext(), r, determineState(o)); } break; case MediaRewindButton: wkDrawMediaUIPart(WKMediaUIPartRewindButton, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaReturnToRealtimeButton: wkDrawMediaUIPart(WKMediaUIPartSeekToRealtimeButton, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaSeekBackButton: wkDrawMediaUIPart(WKMediaUIPartSeekBackButton, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaSeekForwardButton: wkDrawMediaUIPart(WKMediaUIPartSeekForwardButton, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaSlider: { if (HTMLMediaElement* mediaElement = parentMediaElement(o)) { FloatRect unzoomedRect = getUnzoomedRectAndAdjustCurrentContext(o, paintInfo, r); wkDrawMediaSliderTrack(paintInfo.context->platformContext(), unzoomedRect, mediaElement->percentLoaded() * mediaElement->duration(), mediaElement->currentTime(), mediaElement->duration(), determineState(o)); } break; } case MediaSliderThumb: wkDrawMediaUIPart(WKMediaUIPartTimelineSliderThumb, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaVolumeSliderContainer: wkDrawMediaUIPart(WKMediaUIPartVolumeSliderContainer, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaVolumeSlider: wkDrawMediaUIPart(WKMediaUIPartVolumeSlider, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaVolumeSliderThumb: wkDrawMediaUIPart(WKMediaUIPartVolumeSliderThumb, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaFullScreenVolumeSlider: wkDrawMediaUIPart(WKMediaUIPartFullScreenVolumeSlider, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaFullScreenVolumeSliderThumb: wkDrawMediaUIPart(WKMediaUIPartFullScreenVolumeSliderThumb, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaTimelineContainer: wkDrawMediaUIPart(WKMediaUIPartBackground, paintInfo.context->platformContext(), r, determineState(o)); break; case MediaCurrentTimeDisplay: ASSERT_NOT_REACHED(); break; case MediaTimeRemainingDisplay: ASSERT_NOT_REACHED(); break; case MediaControlsPanel: ASSERT_NOT_REACHED(); case MediaTextTrackDisplayContainer: case MediaTextTrackDisplay: case MediaClosedCaptionsContainer: case MediaClosedCaptionsTrackList: ASSERT_NOT_REACHED(); break; } return false; }
bool AccessibilityMediaControlsContainer::controllingVideoElement() const { auto element = parentMediaElement(*m_renderer); return !element || element->isVideo(); }