Apply stories fade in raster renderer.

This commit is contained in:
John Preston 2023-05-12 10:07:37 +04:00
parent 30871ed116
commit 0d3df824e3
3 changed files with 48 additions and 36 deletions

View File

@ -16,14 +16,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
namespace Media::View { namespace Media::View {
OverlayWidget::RendererSW::RendererSW(not_null<OverlayWidget*> owner) OverlayWidget::RendererSW::RendererSW(not_null<OverlayWidget*> owner)
: _owner(owner) : _owner(owner)
, _transparentBrush(style::TransparentPlaceholder()) { , _transparentBrush(style::TransparentPlaceholder()) {
} }
void OverlayWidget::RendererSW::paintFallback( void OverlayWidget::RendererSW::paintFallback(
Painter &&p, Painter &&p,
const QRegion &clip, const QRegion &clip,
Ui::GL::Backend backend) { Ui::GL::Backend backend) {
_p = &p; _p = &p;
_clip = &clip; _clip = &clip;
_clipOuter = clip.boundingRect(); _clipOuter = clip.boundingRect();
@ -49,8 +49,8 @@ void OverlayWidget::RendererSW::paintBackground() {
} }
QRect OverlayWidget::RendererSW::TransformRect( QRect OverlayWidget::RendererSW::TransformRect(
QRectF geometry, QRectF geometry,
int rotation) { int rotation) {
const auto center = geometry.center(); const auto center = geometry.center();
const auto rect = ((rotation % 180) == 90) const auto rect = ((rotation % 180) == 90)
? QRectF( ? QRectF(
@ -67,7 +67,7 @@ QRect OverlayWidget::RendererSW::TransformRect(
} }
void OverlayWidget::RendererSW::paintTransformedVideoFrame( void OverlayWidget::RendererSW::paintTransformedVideoFrame(
ContentGeometry geometry) { ContentGeometry geometry) {
Expects(_owner->_streamed != nullptr); Expects(_owner->_streamed != nullptr);
const auto rotation = int(geometry.rotation); const auto rotation = int(geometry.rotation);
@ -76,15 +76,15 @@ void OverlayWidget::RendererSW::paintTransformedVideoFrame(
return; return;
} }
paintTransformedImage(_owner->videoFrame(), rect, rotation); paintTransformedImage(_owner->videoFrame(), rect, rotation);
paintControlsFade(rect, geometry.controlsOpacity); paintControlsFade(rect, geometry.controlsOpacity, geometry.fade);
} }
void OverlayWidget::RendererSW::paintTransformedStaticContent( void OverlayWidget::RendererSW::paintTransformedStaticContent(
const QImage &image, const QImage &image,
ContentGeometry geometry, ContentGeometry geometry,
bool semiTransparent, bool semiTransparent,
bool fillTransparentBackground, bool fillTransparentBackground,
int index) { int index) {
const auto rotation = int(geometry.rotation); const auto rotation = int(geometry.rotation);
const auto rect = TransformRect(geometry.rect, rotation); const auto rect = TransformRect(geometry.rect, rotation);
if (!rect.intersects(_clipOuter)) { if (!rect.intersects(_clipOuter)) {
@ -97,12 +97,19 @@ void OverlayWidget::RendererSW::paintTransformedStaticContent(
if (!image.isNull()) { if (!image.isNull()) {
paintTransformedImage(image, rect, rotation); paintTransformedImage(image, rect, rotation);
} }
paintControlsFade(rect, geometry.controlsOpacity); paintControlsFade(rect, geometry.controlsOpacity, geometry.fade);
} }
void OverlayWidget::RendererSW::paintControlsFade( void OverlayWidget::RendererSW::paintControlsFade(
QRect geometry, QRect geometry,
float64 opacity) { float64 opacity,
float64 fullFade) {
if (fullFade > 0.) {
_p->setOpacity(fullFade);
_p->fillRect(geometry, Qt::black);
opacity *= 1. - fullFade;
}
_p->setOpacity(opacity); _p->setOpacity(opacity);
_p->setClipRect(geometry); _p->setClipRect(geometry);
const auto width = _owner->width(); const auto width = _owner->width();
@ -136,9 +143,9 @@ void OverlayWidget::RendererSW::paintControlsFade(
} }
void OverlayWidget::RendererSW::paintTransformedImage( void OverlayWidget::RendererSW::paintTransformedImage(
const QImage &image, const QImage &image,
QRect rect, QRect rect,
int rotation) { int rotation) {
PainterHighQualityEnabler hq(*_p); PainterHighQualityEnabler hq(*_p);
if (UsePainterRotation(rotation)) { if (UsePainterRotation(rotation)) {
if (rotation) { if (rotation) {
@ -155,9 +162,9 @@ void OverlayWidget::RendererSW::paintTransformedImage(
} }
void OverlayWidget::RendererSW::paintRadialLoading( void OverlayWidget::RendererSW::paintRadialLoading(
QRect inner, QRect inner,
bool radial, bool radial,
float64 radialOpacity) { float64 radialOpacity) {
_owner->paintRadialLoadingContent(*_p, inner, radial, radialOpacity); _owner->paintRadialLoadingContent(*_p, inner, radial, radialOpacity);
} }
@ -166,8 +173,8 @@ void OverlayWidget::RendererSW::paintThemePreview(QRect outer) {
} }
void OverlayWidget::RendererSW::paintDocumentBubble( void OverlayWidget::RendererSW::paintDocumentBubble(
QRect outer, QRect outer,
QRect icon) { QRect icon) {
if (outer.intersects(_clipOuter)) { if (outer.intersects(_clipOuter)) {
_owner->paintDocumentBubbleContent(*_p, outer, icon, _clipOuter); _owner->paintDocumentBubbleContent(*_p, outer, icon, _clipOuter);
if (icon.intersects(_clipOuter)) { if (icon.intersects(_clipOuter)) {
@ -186,12 +193,12 @@ void OverlayWidget::RendererSW::paintControlsStart() {
} }
void OverlayWidget::RendererSW::paintControl( void OverlayWidget::RendererSW::paintControl(
OverState control, OverState control,
QRect over, QRect over,
float64 overOpacity, float64 overOpacity,
QRect inner, QRect inner,
float64 innerOpacity, float64 innerOpacity,
const style::icon &icon) { const style::icon &icon) {
if (!over.isEmpty() && !over.intersects(_clipOuter)) { if (!over.isEmpty() && !over.intersects(_clipOuter)) {
return; return;
} }

View File

@ -33,7 +33,10 @@ private:
const QImage &image, const QImage &image,
QRect rect, QRect rect,
int rotation); int rotation);
void paintControlsFade(QRect geometry, float64 opacity); void paintControlsFade(
QRect geometry,
float64 opacity,
float64 fullFade);
void paintRadialLoading( void paintRadialLoading(
QRect inner, QRect inner,
bool radial, bool radial,

View File

@ -4011,10 +4011,12 @@ void OverlayWidget::storiesTogglePaused(bool paused) {
|| !_streamed->instance.player().active()) { || !_streamed->instance.player().active()) {
return; return;
} else if (_streamed->instance.player().paused()) { } else if (_streamed->instance.player().paused()) {
_streamed->instance.resume(); if (!paused) {
updatePlaybackState(); _streamed->instance.resume();
playbackPauseMusic(); updatePlaybackState();
} else { playbackPauseMusic();
}
} else if (paused) {
_streamed->instance.pause(); _streamed->instance.pause();
updatePlaybackState(); updatePlaybackState();
} }