diff options
author | 2023-03-29 17:01:25 -0400 | |
---|---|---|
committer | 2023-03-31 17:44:24 -0400 | |
commit | b2a4b93b3f9f08035273cade32a4468e3005406c (patch) | |
tree | 6501abf48441ee465943d0db5b871354690be498 /libs/hwui/SkiaCanvas.cpp | |
parent | 55e626a4a5c75306bccb92f02372047a543d6207 (diff) |
Support rendering gainmaps to PQ & HLG
Bug: 270744068
Test: GainmapTests in uirendering
Change-Id: I57e55b1a27d49c19d232ad9c4418d715eca57f7c
Diffstat (limited to 'libs/hwui/SkiaCanvas.cpp')
-rw-r--r-- | libs/hwui/SkiaCanvas.cpp | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 7a1276982d0a..8394c3cd4175 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -50,6 +50,7 @@ #include "Mesh.h" #include "NinePatchUtils.h" #include "VectorDrawable.h" +#include "effects/GainmapRenderer.h" #include "hwui/Bitmap.h" #include "hwui/MinikinUtils.h" #include "hwui/PaintFilter.h" @@ -589,18 +590,25 @@ void SkiaCanvas::drawMesh(const Mesh& mesh, sk_sp<SkBlender> blender, const Pain void SkiaCanvas::drawBitmap(Bitmap& bitmap, float left, float top, const Paint* paint) { auto image = bitmap.makeImage(); + + if (bitmap.hasGainmap()) { + Paint gainmapPaint = paint ? *paint : Paint(); + sk_sp<SkShader> gainmapShader = uirenderer::MakeGainmapShader( + image, bitmap.gainmap()->bitmap->makeImage(), bitmap.gainmap()->info, + SkTileMode::kClamp, SkTileMode::kClamp, gainmapPaint.sampling()); + gainmapPaint.setShader(gainmapShader); + return drawRect(left, top, left + bitmap.width(), top + bitmap.height(), gainmapPaint); + } + applyLooper(paint, [&](const Paint& p) { mCanvas->drawImage(image, left, top, p.sampling(), &p); }); } void SkiaCanvas::drawBitmap(Bitmap& bitmap, const SkMatrix& matrix, const Paint* paint) { - auto image = bitmap.makeImage(); SkAutoCanvasRestore acr(mCanvas, true); mCanvas->concat(matrix); - applyLooper(paint, [&](const Paint& p) { - mCanvas->drawImage(image, 0, 0, p.sampling(), &p); - }); + drawBitmap(bitmap, 0, 0, paint); } void SkiaCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float srcRight, @@ -610,6 +618,16 @@ void SkiaCanvas::drawBitmap(Bitmap& bitmap, float srcLeft, float srcTop, float s SkRect srcRect = SkRect::MakeLTRB(srcLeft, srcTop, srcRight, srcBottom); SkRect dstRect = SkRect::MakeLTRB(dstLeft, dstTop, dstRight, dstBottom); + if (bitmap.hasGainmap()) { + Paint gainmapPaint = paint ? *paint : Paint(); + sk_sp<SkShader> gainmapShader = uirenderer::MakeGainmapShader( + image, bitmap.gainmap()->bitmap->makeImage(), bitmap.gainmap()->info, + SkTileMode::kClamp, SkTileMode::kClamp, gainmapPaint.sampling()); + gainmapShader = gainmapShader->makeWithLocalMatrix(SkMatrix::RectToRect(srcRect, dstRect)); + gainmapPaint.setShader(gainmapShader); + return drawRect(dstLeft, dstTop, dstRight, dstBottom, gainmapPaint); + } + applyLooper(paint, [&](const Paint& p) { mCanvas->drawImageRect(image, srcRect, dstRect, p.sampling(), &p, SkCanvas::kFast_SrcRectConstraint); |