diff options
Diffstat (limited to 'libs/hwui/pipeline/skia/RenderNodeDrawable.cpp')
-rw-r--r-- | libs/hwui/pipeline/skia/RenderNodeDrawable.cpp | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp index 77d99a67b602..1ae06d082744 100644 --- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp +++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp @@ -16,6 +16,7 @@ #include "RenderNodeDrawable.h" #include <SkPaintFilterCanvas.h> +#include "StretchMask.h" #include "RenderNode.h" #include "SkiaDisplayList.h" #include "TransformCanvas.h" @@ -245,17 +246,37 @@ void RenderNodeDrawable::drawContent(SkCanvas* canvas) const { "SurfaceID|%" PRId64, renderNode->uniqueId()).c_str(), nullptr); } - if (renderNode->hasHolePunches()) { - TransformCanvas transformCanvas(canvas); - displayList->draw(&transformCanvas); - } - const StretchEffect& stretch = properties.layerProperties().getStretchEffect(); if (stretch.isEmpty()) { + // If we don't have any stretch effects, issue the filtered + // canvas draw calls to make sure we still punch a hole + // with the same canvas transformation + clip into the target + // canvas then draw the layer on top + if (renderNode->hasHolePunches()) { + TransformCanvas transformCanvas(canvas, SkBlendMode::kClear); + displayList->draw(&transformCanvas); + } canvas->drawImageRect(snapshotImage, bounds, bounds, sampling, &paint, SkCanvas::kStrict_SrcRectConstraint); } else { - sk_sp<SkShader> stretchShader = stretch.getShader(snapshotImage); + // If we do have stretch effects and have hole punches, + // then create a mask and issue the filtered draw calls to + // get the corresponding hole punches. + // Then apply the stretch to the mask and draw the mask to + // the destination + if (renderNode->hasHolePunches()) { + GrRecordingContext* context = canvas->recordingContext(); + StretchMask& stretchMask = renderNode->getStretchMask(); + stretchMask.draw(context, + stretch, + bounds, + displayList, + canvas); + } + + sk_sp<SkShader> stretchShader = stretch.getShader(bounds.width(), + bounds.height(), + snapshotImage); paint.setShader(stretchShader); canvas->drawRect(bounds, paint); } |