Fix semi-transparent .webp in media viewer.

This commit is contained in:
John Preston 2021-06-14 15:28:39 +04:00
parent 7059336ff0
commit 4e0355d09f
6 changed files with 11 additions and 3 deletions

View file

@ -183,7 +183,7 @@ void OverlayWidget::RendererGL::paintTransformedVideoFrame(
} }
if (data.format == Streaming::FrameFormat::ARGB32) { if (data.format == Streaming::FrameFormat::ARGB32) {
Assert(!data.original.isNull()); Assert(!data.original.isNull());
paintTransformedStaticContent(data.original, geometry, false); paintTransformedStaticContent(data.original, geometry, false, false);
return; return;
} }
Assert(data.format == Streaming::FrameFormat::YUV420); Assert(data.format == Streaming::FrameFormat::YUV420);
@ -237,12 +237,14 @@ void OverlayWidget::RendererGL::paintTransformedVideoFrame(
_yuv420Program->setUniformValue("u_texture", GLint(1)); _yuv420Program->setUniformValue("u_texture", GLint(1));
_yuv420Program->setUniformValue("v_texture", GLint(2)); _yuv420Program->setUniformValue("v_texture", GLint(2));
toggleBlending(false);
paintTransformedContent(&*_yuv420Program, geometry); paintTransformedContent(&*_yuv420Program, geometry);
} }
void OverlayWidget::RendererGL::paintTransformedStaticContent( void OverlayWidget::RendererGL::paintTransformedStaticContent(
const QImage &image, const QImage &image,
ContentGeometry geometry, ContentGeometry geometry,
bool semiTransparent,
bool fillTransparentBackground) { bool fillTransparentBackground) {
Expects(image.isNull() Expects(image.isNull()
|| image.format() == QImage::Format_RGB32 || image.format() == QImage::Format_RGB32
@ -300,6 +302,7 @@ void OverlayWidget::RendererGL::paintTransformedStaticContent(
} }
program->setUniformValue("s_texture", GLint(0)); program->setUniformValue("s_texture", GLint(0));
toggleBlending(semiTransparent && !fillTransparentBackground);
paintTransformedContent(&*program, geometry); paintTransformedContent(&*program, geometry);
} }
@ -341,7 +344,6 @@ void OverlayWidget::RendererGL::paintTransformedContent(
program->setUniformValue("viewport", _uniformViewport); program->setUniformValue("viewport", _uniformViewport);
toggleBlending(false);
FillTexturedRectangle(*_f, &*program); FillTexturedRectangle(*_f, &*program);
} }

View file

@ -45,6 +45,7 @@ private:
void paintTransformedStaticContent( void paintTransformedStaticContent(
const QImage &image, const QImage &image,
ContentGeometry geometry, ContentGeometry geometry,
bool semiTransparent,
bool fillTransparentBackground) override; bool fillTransparentBackground) override;
void paintTransformedContent( void paintTransformedContent(
not_null<QOpenGLShaderProgram*> program, not_null<QOpenGLShaderProgram*> program,

View file

@ -77,6 +77,7 @@ void OverlayWidget::RendererSW::paintTransformedVideoFrame(
void OverlayWidget::RendererSW::paintTransformedStaticContent( void OverlayWidget::RendererSW::paintTransformedStaticContent(
const QImage &image, const QImage &image,
ContentGeometry geometry, ContentGeometry geometry,
bool semiTransparent,
bool fillTransparentBackground) { bool fillTransparentBackground) {
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);

View file

@ -26,6 +26,7 @@ private:
void paintTransformedStaticContent( void paintTransformedStaticContent(
const QImage &image, const QImage &image,
ContentGeometry geometry, ContentGeometry geometry,
bool semiTransparent,
bool fillTransparentBackground) override; bool fillTransparentBackground) override;
void paintTransformedImage( void paintTransformedImage(
const QImage &image, const QImage &image,

View file

@ -18,6 +18,7 @@ public:
virtual void paintTransformedStaticContent( virtual void paintTransformedStaticContent(
const QImage &image, const QImage &image,
ContentGeometry geometry, ContentGeometry geometry,
bool semiTransparent,
bool fillTransparentBackground) = 0; bool fillTransparentBackground) = 0;
virtual void paintRadialLoading( virtual void paintRadialLoading(
QRect inner, QRect inner,

View file

@ -627,7 +627,8 @@ bool OverlayWidget::contentShown() const {
bool OverlayWidget::opaqueContentShown() const { bool OverlayWidget::opaqueContentShown() const {
return contentShown() return contentShown()
&& (!_document && (!_staticContentTransparent
|| !_document
|| (!_document->isVideoMessage() && !_document->sticker())); || (!_document->isVideoMessage() && !_document->sticker()));
} }
@ -3268,6 +3269,7 @@ void OverlayWidget::paint(not_null<Renderer*> renderer) {
renderer->paintTransformedStaticContent( renderer->paintTransformedStaticContent(
_staticContent, _staticContent,
contentGeometry(), contentGeometry(),
_staticContentTransparent,
fillTransparentBackground); fillTransparentBackground);
} }
paintRadialLoading(renderer); paintRadialLoading(renderer);