summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@collabora.com>2019-12-19 20:17:42 +0100
committerLuboš Luňák <l.lunak@collabora.com>2020-01-06 11:12:59 +0100
commitac867fa7541c27319ae271357f20d5d4d6bc6544 (patch)
tree888f83dcfda436760d3f5c569189c3c62ca9a4a3 /vcl
parent7702efe9ec6bbc428d89e83d957677cd3d323803 (diff)
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@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/skia/salbmp.cxx41
1 files changed, 37 insertions, 4 deletions
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)