summaryrefslogtreecommitdiff
path: root/vcl/skia
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@centrum.cz>2021-02-25 11:37:54 +0000
committerLuboš Luňák <l.lunak@collabora.com>2021-03-01 15:53:55 +0100
commit9d8c04d2d5529626d649af3fcebb6d4b65193b28 (patch)
treedc363880969b86fb7cefa67be2c0a20addbe6f36 /vcl/skia
parent2977dc5846b557bb9c7dc33ac92921f7b4096763 (diff)
generic Skia workaround for VCL sending empty size (tdf#140288)
There have already been commits to handle this, but the case of getting the wrong size the first was still broken (or was fixed in the past and got broken again). Try to be generic by forcing these to be always considered to be offscreen and force non-zero size there. Change-Id: Ie366a296f7f6645333630fa31e9fe18d54c7fba8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111528 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
Diffstat (limited to 'vcl/skia')
-rw-r--r--vcl/skia/gdiimpl.cxx34
-rw-r--r--vcl/skia/win/gdiimpl.cxx1
-rw-r--r--vcl/skia/x11/gdiimpl.cxx2
3 files changed, 24 insertions, 13 deletions
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index 950010183cb1..d8ddf48536c0 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -334,14 +334,24 @@ void SkiaSalGraphicsImpl::createWindowSurface(bool forceRaster)
#endif
}
+bool SkiaSalGraphicsImpl::isOffscreen() const
+{
+ if (mProvider == nullptr || mProvider->IsOffScreen())
+ return true;
+ // HACK: Sometimes (tdf#131939, tdf#138022, tdf#140288) VCL passes us a zero-sized window,
+ // and zero size is invalid for Skia, so force offscreen surface, where we handle this.
+ if (GetWidth() <= 0 || GetHeight() <= 0)
+ return true;
+ return false;
+}
+
void SkiaSalGraphicsImpl::createOffscreenSurface()
{
SkiaZone zone;
assert(isOffscreen());
assert(!mSurface);
assert(!mWindowContext);
- // When created (especially on Windows), Init() gets called with size (0,0), which is invalid size
- // for Skia. May happen also in rare cases such as shutting down (tdf#131939).
+ // HACK: See isOffscreen().
int width = std::max(1, GetWidth());
int height = std::max(1, GetHeight());
switch (SkiaHelper::renderMethodToUse())
@@ -460,17 +470,7 @@ void SkiaSalGraphicsImpl::checkSurface()
}
else if (GetWidth() != mSurface->width() || GetHeight() != mSurface->height())
{
- if (avoidRecreateByResize())
- return;
-
- if (!GetWidth() || !GetHeight())
- {
- SAL_WARN("vcl.skia", "recreate(" << this << "): can't create empty surface "
- << Size(GetWidth(), GetHeight())
- << " => keeping old one!");
- return;
- }
-
+ if (!avoidRecreateByResize())
{
Size oldSize(mSurface->width(), mSurface->height());
// Recreating a surface means that the old SkSurface contents will be lost.
@@ -503,6 +503,14 @@ void SkiaSalGraphicsImpl::checkSurface()
}
}
+bool SkiaSalGraphicsImpl::avoidRecreateByResize() const
+{
+ // Keep the old surface if VCL sends us a broken size (see isOffscreen()).
+ if (GetWidth() == 0 || GetHeight() == 0)
+ return true;
+ return false;
+}
+
void SkiaSalGraphicsImpl::flushDrawing()
{
if (!mSurface)
diff --git a/vcl/skia/win/gdiimpl.cxx b/vcl/skia/win/gdiimpl.cxx
index 054555ca6e41..8467b1d80765 100644
--- a/vcl/skia/win/gdiimpl.cxx
+++ b/vcl/skia/win/gdiimpl.cxx
@@ -38,6 +38,7 @@ void WinSkiaSalGraphicsImpl::createWindowContext(bool forceRaster)
{
SkiaZone zone;
sk_app::DisplayParams displayParams;
+ assert(GetWidth() > 0 && GetHeight() > 0);
displayParams.fSurfaceProps = *SkiaHelper::surfaceProps();
switch (forceRaster ? SkiaHelper::RenderRaster : SkiaHelper::renderMethodToUse())
{
diff --git a/vcl/skia/x11/gdiimpl.cxx b/vcl/skia/x11/gdiimpl.cxx
index 29fb15d27140..2ef186ad78d0 100644
--- a/vcl/skia/x11/gdiimpl.cxx
+++ b/vcl/skia/x11/gdiimpl.cxx
@@ -108,6 +108,8 @@ X11SkiaSalGraphicsImpl::createWindowContext(Display* display, Drawable drawable,
bool X11SkiaSalGraphicsImpl::avoidRecreateByResize() const
{
+ if (SkiaSalGraphicsImpl::avoidRecreateByResize())
+ return true;
if (!mSurface || isOffscreen())
return false;
// Skia's WindowContext uses actual dimensions of the X window, which due to X11 being