diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2019-10-31 20:45:25 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2019-11-26 13:24:54 +0100 |
commit | 94e2be87acc89ae1381aaaecb344e03fddb2c29f (patch) | |
tree | 76419a063d4dfb607e3b3330a9b047b87e650874 | |
parent | skia: don't loop to first point if the polygon is not closed (diff) | |
download | core-94e2be87acc89ae1381aaaecb344e03fddb2c29f.tar.gz core-94e2be87acc89ae1381aaaecb344e03fddb2c29f.zip |
skia: implement blendAlphaBitmap and blendBitmap
Change-Id: I83f33795bea5ed72f1f3269f30f64b1b24566538
-rw-r--r-- | vcl/skia/gdiimpl.cxx | 72 |
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) |