summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2019-10-31 20:45:25 +0100
committerLuboš Luňák <l.lunak@collabora.com>2019-11-26 13:24:54 +0100
commit94e2be87acc89ae1381aaaecb344e03fddb2c29f (patch)
tree76419a063d4dfb607e3b3330a9b047b87e650874
parentskia: don't loop to first point if the polygon is not closed (diff)
downloadcore-94e2be87acc89ae1381aaaecb344e03fddb2c29f.tar.gz
core-94e2be87acc89ae1381aaaecb344e03fddb2c29f.zip
skia: implement blendAlphaBitmap and blendBitmap
Change-Id: I83f33795bea5ed72f1f3269f30f64b1b24566538
-rw-r--r--vcl/skia/gdiimpl.cxx72
1 files changed, 64 insertions, 8 deletions
diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx
index a406d85e924d..150b47e83aa6 100644
--- a/vcl/skia/gdiimpl.cxx
+++ b/vcl/skia/gdiimpl.cxx
@@ -640,20 +640,76 @@ void SkiaSalGraphicsImpl::copyBits(const SalTwoRect& rPosAry, SalGraphics* pSrcG
postDraw();
}
-bool SkiaSalGraphicsImpl::blendBitmap(const SalTwoRect&, const SalBitmap& rBitmap)
+bool SkiaSalGraphicsImpl::blendBitmap(const SalTwoRect& rPosAry, const SalBitmap& rBitmap)
{
- (void)rBitmap;
- return false;
+ if (rPosAry.mnSrcWidth <= 0 || rPosAry.mnSrcHeight <= 0 || rPosAry.mnDestWidth <= 0
+ || rPosAry.mnDestHeight <= 0)
+ {
+ return false;
+ }
+
+ assert(dynamic_cast<const SkiaSalBitmap*>(&rBitmap));
+
+ preDraw();
+
+ const SkiaSalBitmap& rSkiaBitmap = static_cast<const SkiaSalBitmap&>(rBitmap);
+
+ SkRect aSourceRect
+ = SkRect::MakeXYWH(rPosAry.mnSrcX, rPosAry.mnSrcY, rPosAry.mnSrcWidth, rPosAry.mnSrcHeight);
+ SkRect aDestinationRect = SkRect::MakeXYWH(rPosAry.mnDestX, rPosAry.mnDestY,
+ rPosAry.mnDestWidth, rPosAry.mnDestHeight);
+
+ SkPaint aPaint;
+ aPaint.setBlendMode(SkBlendMode::kMultiply);
+ mSurface->getCanvas()->drawBitmapRect(rSkiaBitmap.GetSkBitmap(), aSourceRect, aDestinationRect,
+ &aPaint);
+
+ postDraw();
+
+ return true;
}
-bool SkiaSalGraphicsImpl::blendAlphaBitmap(const SalTwoRect&, const SalBitmap& rSrcBitmap,
+bool SkiaSalGraphicsImpl::blendAlphaBitmap(const SalTwoRect& rPosAry,
+ const SalBitmap& rSourceBitmap,
const SalBitmap& rMaskBitmap,
const SalBitmap& rAlphaBitmap)
{
- (void)rSrcBitmap;
- (void)rMaskBitmap;
- (void)rAlphaBitmap;
- return false;
+ if (rPosAry.mnSrcWidth <= 0 || rPosAry.mnSrcHeight <= 0 || rPosAry.mnDestWidth <= 0
+ || rPosAry.mnDestHeight <= 0)
+ {
+ return false;
+ }
+
+ assert(dynamic_cast<const SkiaSalBitmap*>(&rSrcBitmap));
+ assert(dynamic_cast<const SkiaSalBitmap*>(&rMaskBitmap));
+ assert(dynamic_cast<const SkiaSalBitmap*>(&rAlphaBitmap));
+
+ SkBitmap aTempBitmap;
+ if (!aTempBitmap.tryAllocN32Pixels(rSourceBitmap.GetSize().Width(),
+ rSourceBitmap.GetSize().Height()))
+ {
+ return false;
+ }
+
+ const SkiaSalBitmap& rSkiaSourceBitmap = static_cast<const SkiaSalBitmap&>(rSourceBitmap);
+ const SkiaSalBitmap& rSkiaMaskBitmap = static_cast<const SkiaSalBitmap&>(rMaskBitmap);
+ const SkiaSalBitmap& rSkiaAlphaBitmap = static_cast<const SkiaSalBitmap&>(rAlphaBitmap);
+
+ SkCanvas aCanvas(aTempBitmap);
+ SkPaint aPaint;
+
+ aPaint.setBlendMode(SkBlendMode::kSrc);
+ aCanvas.drawBitmap(rSkiaMaskBitmap.GetAlphaSkBitmap(), 0, 0, &aPaint);
+
+ aPaint.setBlendMode(SkBlendMode::kSrcIn);
+ aCanvas.drawBitmap(rSkiaAlphaBitmap.GetAlphaSkBitmap(), 0, 0, &aPaint);
+
+ aPaint.setBlendMode(SkBlendMode::kSrcOut);
+ aCanvas.drawBitmap(rSkiaSourceBitmap.GetSkBitmap(), 0, 0, &aPaint);
+
+ drawBitmap(rPosAry, aTempBitmap);
+
+ return true;
}
void SkiaSalGraphicsImpl::drawBitmap(const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap)