Merge "Resolve drawable when playing back DisplayListData in the RenderThread."
This commit is contained in:
committed by
Android (Google) Code Review
commit
8f101b8303
@@ -274,7 +274,12 @@ struct DrawDrawable final : Op {
|
||||
}
|
||||
sk_sp<SkDrawable> drawable;
|
||||
SkMatrix matrix = SkMatrix::I();
|
||||
void draw(SkCanvas* c, const SkMatrix&) const { c->drawDrawable(drawable.get(), &matrix); }
|
||||
// It is important that we call drawable->draw(c) here instead of c->drawDrawable(drawable).
|
||||
// Drawables are mutable and in cases, like RenderNodeDrawable, are not expected to produce the
|
||||
// same content if retained outside the duration of the frame. Therefore we resolve
|
||||
// them now and do not allow the canvas to take a reference to the drawable and potentially
|
||||
// keep it alive for longer than the frames duration (e.g. SKP serialization).
|
||||
void draw(SkCanvas* c, const SkMatrix&) const { drawable->draw(c, &matrix); }
|
||||
};
|
||||
struct DrawPicture final : Op {
|
||||
static const auto kType = Type::DrawPicture;
|
||||
|
||||
@@ -313,8 +313,7 @@ SkCanvas* SkiaPipeline::tryCapture(SkSurface* surface) {
|
||||
case CaptureMode::CallbackAPI:
|
||||
case CaptureMode::SingleFrameSKP:
|
||||
mRecorder.reset(new SkPictureRecorder());
|
||||
pictureCanvas = mRecorder->beginRecording(surface->width(), surface->height(),
|
||||
nullptr, SkPictureRecorder::kPlaybackDrawPicture_RecordFlag);
|
||||
pictureCanvas = mRecorder->beginRecording(surface->width(), surface->height());
|
||||
break;
|
||||
case CaptureMode::MultiFrameSKP:
|
||||
// If a multi frame recording is active, initialize recording for a single frame of a
|
||||
|
||||
@@ -1096,10 +1096,8 @@ TEST(ReorderBarrierDrawable, testShadowMatrix) {
|
||||
int getDrawCounter() { return mDrawCounter; }
|
||||
|
||||
virtual void onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix) override {
|
||||
// expect to draw 2 RenderNodeDrawable, 1 StartReorderBarrierDrawable,
|
||||
// 1 EndReorderBarrierDrawable
|
||||
mDrawCounter++;
|
||||
SkCanvas::onDrawDrawable(drawable, matrix);
|
||||
// Do not expect this to be called. See RecordingCanvas.cpp DrawDrawable for context.
|
||||
EXPECT_TRUE(false);
|
||||
}
|
||||
|
||||
virtual void didTranslate(SkScalar dx, SkScalar dy) override {
|
||||
@@ -1159,8 +1157,8 @@ TEST(ReorderBarrierDrawable, testShadowMatrix) {
|
||||
// create a canvas not backed by any device/pixels, but with dimensions to avoid quick rejection
|
||||
ShadowTestCanvas canvas(CANVAS_WIDTH, CANVAS_HEIGHT);
|
||||
RenderNodeDrawable drawable(parent.get(), &canvas, false);
|
||||
canvas.drawDrawable(&drawable);
|
||||
EXPECT_EQ(9, canvas.getDrawCounter());
|
||||
drawable.draw(&canvas);
|
||||
EXPECT_EQ(5, canvas.getDrawCounter());
|
||||
}
|
||||
|
||||
// Draw a vector drawable twice but with different bounds and verify correct bounds are used.
|
||||
|
||||
Reference in New Issue
Block a user