[Libreoffice-commits] core.git: vcl/skia
LuboÅ¡ LuÅák (via logerrit)
logerrit at kemper.freedesktop.org
Mon Jan 6 10:13:32 UTC 2020
vcl/skia/salbmp.cxx | 41 +++++++++++++++++++++++++++++++++++++----
1 file changed, 37 insertions(+), 4 deletions(-)
New commits:
commit ac867fa7541c27319ae271357f20d5d4d6bc6544
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Thu Dec 19 20:17:42 2019 +0100
Commit: Luboš Luňák <l.lunak at collabora.com>
CommitDate: Mon Jan 6 11:12:59 2020 +0100
use Skia-based bitmap scaling for SkiaSalBitmap
It should be done on GPU if Vulkan is used.
Change-Id: I347169af2c3a5c78bd221e986cff9ed656ce93df
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/85544
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak at collabora.com>
diff --git a/vcl/skia/salbmp.cxx b/vcl/skia/salbmp.cxx
index 781d6f87c9ad..9f81965de88d 100644
--- a/vcl/skia/salbmp.cxx
+++ b/vcl/skia/salbmp.cxx
@@ -320,15 +320,48 @@ bool SkiaSalBitmap::GetSystemData(BitmapSystemData&)
return false;
}
-bool SkiaSalBitmap::ScalingSupported() const { return false; }
+bool SkiaSalBitmap::ScalingSupported() const { return true; }
-bool SkiaSalBitmap::Scale(const double&, const double&, BmpScaleFlag)
+bool SkiaSalBitmap::Scale(const double& rScaleX, const double& rScaleY, BmpScaleFlag nScaleFlag)
{
#ifdef DBG_UTIL
assert(mWriteAccessCount == 0);
#endif
- // TODO?
- return false;
+ Size newSize(FRound(mSize.Width() * rScaleX), FRound(mSize.Height() * rScaleY));
+ if (mSize == newSize)
+ return true;
+
+ SAL_INFO("vcl.skia", "scale(" << this << "): " << mSize << "->" << newSize << ":"
+ << static_cast<int>(nScaleFlag));
+
+ SkPaint paint;
+ switch (nScaleFlag)
+ {
+ case BmpScaleFlag::Fast:
+ paint.setFilterQuality(kNone_SkFilterQuality);
+ break;
+ case BmpScaleFlag::Default:
+ paint.setFilterQuality(kMedium_SkFilterQuality);
+ break;
+ case BmpScaleFlag::BestQuality:
+ paint.setFilterQuality(kHigh_SkFilterQuality);
+ break;
+ default:
+ return false;
+ }
+ sk_sp<SkSurface> surface = SkiaHelper::createSkSurface(newSize);
+ assert(surface);
+ paint.setBlendMode(SkBlendMode::kSrc); // draw as is, including alpha
+ surface->getCanvas()->drawImageRect(
+ GetSkImage(), SkRect::MakeXYWH(0, 0, mSize.Width(), mSize.Height()),
+ SkRect::MakeXYWH(0, 0, newSize.Width(), newSize.Height()), &paint);
+ // This will get generated from mImage if needed.
+ mBitmap.reset();
+ mBuffer.reset();
+ ResetSkImages();
+ mImage = surface->makeImageSnapshot();
+ mSize = newSize;
+ return true;
}
bool SkiaSalBitmap::Replace(const Color&, const Color&, sal_uInt8)
More information about the Libreoffice-commits
mailing list