Skip to content
This repository has been archived by the owner on Feb 25, 2025. It is now read-only.

Revert "Remove dlCanvasRecorder from flutter::PictureRecorder" #38137

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 45 additions & 39 deletions lib/ui/painting/canvas.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,16 @@ void Canvas::Create(Dart_Handle wrapper,
fml::RefPtr<Canvas> canvas = fml::MakeRefCounted<Canvas>(
recorder->BeginRecording(SkRect::MakeLTRB(left, top, right, bottom)));
recorder->set_canvas(canvas);
canvas->display_list_recorder_ = recorder->display_list_recorder();
canvas->AssociateWithDartWrapper(wrapper);
}

Canvas::Canvas(sk_sp<DisplayListBuilder> builder)
: display_list_builder_(std::move(builder)) {}
Canvas::Canvas(SkCanvas* canvas) : canvas_(canvas) {}

Canvas::~Canvas() {}

void Canvas::save() {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->save();
}
}
Expand All @@ -75,7 +75,7 @@ void Canvas::saveLayerWithoutBounds(Dart_Handle paint_objects,
Paint paint(paint_objects, paint_data);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
bool restore_with_paint =
paint.sync_to(builder(), kSaveLayerWithPaintFlags);
FML_DCHECK(restore_with_paint);
Expand All @@ -94,7 +94,7 @@ void Canvas::saveLayer(double left,

FML_DCHECK(paint.isNotNull());
SkRect bounds = SkRect::MakeLTRB(left, top, right, bottom);
if (display_list_builder_) {
if (display_list_recorder_) {
bool restore_with_paint =
paint.sync_to(builder(), kSaveLayerWithPaintFlags);
FML_DCHECK(restore_with_paint);
Expand All @@ -104,53 +104,53 @@ void Canvas::saveLayer(double left,
}

void Canvas::restore() {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->restore();
}
}

int Canvas::getSaveCount() {
if (display_list_builder_) {
if (display_list_recorder_) {
return builder()->getSaveCount();
} else {
return 0;
}
}

void Canvas::restoreToCount(int count) {
if (display_list_builder_ && count < getSaveCount()) {
if (display_list_recorder_ && count < getSaveCount()) {
builder()->restoreToCount(count);
}
}

void Canvas::translate(double dx, double dy) {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->translate(dx, dy);
}
}

void Canvas::scale(double sx, double sy) {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->scale(sx, sy);
}
}

void Canvas::rotate(double radians) {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->rotate(radians * 180.0 / M_PI);
}
}

void Canvas::skew(double sx, double sy) {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->skew(sx, sy);
}
}

void Canvas::transform(const tonic::Float64List& matrix4) {
// The Float array stored by Dart Matrix4 is in column-major order
// Both DisplayList and SkM44 constructor take row-major matrix order
if (display_list_builder_) {
if (display_list_recorder_) {
// clang-format off
builder()->transformFullPerspective(
matrix4[ 0], matrix4[ 4], matrix4[ 8], matrix4[12],
Expand All @@ -162,7 +162,10 @@ void Canvas::transform(const tonic::Float64List& matrix4) {
}

void Canvas::getTransform(Dart_Handle matrix4_handle) {
SkM44 sk_m44 = display_list_builder_->getTransformFullPerspective();
SkM44 sk_m44 =
display_list_recorder_
? display_list_recorder_->builder()->getTransformFullPerspective()
: canvas_->getLocalToDevice();
SkScalar m44_values[16];
// The Float array stored by Dart Matrix4 is in column-major order
sk_m44.getColMajor(m44_values);
Expand All @@ -178,14 +181,14 @@ void Canvas::clipRect(double left,
double bottom,
SkClipOp clipOp,
bool doAntiAlias) {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->clipRect(SkRect::MakeLTRB(left, top, right, bottom), clipOp,
doAntiAlias);
}
}

void Canvas::clipRRect(const RRect& rrect, bool doAntiAlias) {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->clipRRect(rrect.sk_rrect, SkClipOp::kIntersect, doAntiAlias);
}
}
Expand All @@ -196,13 +199,13 @@ void Canvas::clipPath(const CanvasPath* path, bool doAntiAlias) {
ToDart("Canvas.clipPath called with non-genuine Path."));
return;
}
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->clipPath(path->path(), SkClipOp::kIntersect, doAntiAlias);
}
}

void Canvas::getDestinationClipBounds(Dart_Handle rect_handle) {
if (display_list_builder_) {
if (display_list_recorder_) {
auto rect = tonic::Float64List(rect_handle);
SkRect bounds = builder()->getDestinationClipBounds();
rect[0] = bounds.fLeft;
Expand All @@ -213,9 +216,9 @@ void Canvas::getDestinationClipBounds(Dart_Handle rect_handle) {
}

void Canvas::getLocalClipBounds(Dart_Handle rect_handle) {
if (display_list_builder_) {
if (display_list_recorder_) {
auto rect = tonic::Float64List(rect_handle);
SkRect bounds = display_list_builder_->getLocalClipBounds();
SkRect bounds = display_list_recorder_->builder()->getLocalClipBounds();
rect[0] = bounds.fLeft;
rect[1] = bounds.fTop;
rect[2] = bounds.fRight;
Expand All @@ -224,7 +227,7 @@ void Canvas::getLocalClipBounds(Dart_Handle rect_handle) {
}

void Canvas::drawColor(SkColor color, DlBlendMode blend_mode) {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->drawColor(color, blend_mode);
}
}
Expand All @@ -238,7 +241,7 @@ void Canvas::drawLine(double x1,
Paint paint(paint_objects, paint_data);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(), kDrawLineFlags);
builder()->drawLine(SkPoint::Make(x1, y1), SkPoint::Make(x2, y2));
}
Expand All @@ -248,7 +251,7 @@ void Canvas::drawPaint(Dart_Handle paint_objects, Dart_Handle paint_data) {
Paint paint(paint_objects, paint_data);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(), kDrawPaintFlags);
std::shared_ptr<const DlImageFilter> filter = builder()->getImageFilter();
if (filter && !filter->asColorFilter()) {
Expand All @@ -269,7 +272,7 @@ void Canvas::drawRect(double left,
Paint paint(paint_objects, paint_data);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(), kDrawRectFlags);
builder()->drawRect(SkRect::MakeLTRB(left, top, right, bottom));
}
Expand All @@ -281,7 +284,7 @@ void Canvas::drawRRect(const RRect& rrect,
Paint paint(paint_objects, paint_data);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(), kDrawRRectFlags);
builder()->drawRRect(rrect.sk_rrect);
}
Expand All @@ -294,7 +297,7 @@ void Canvas::drawDRRect(const RRect& outer,
Paint paint(paint_objects, paint_data);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(), kDrawDRRectFlags);
builder()->drawDRRect(outer.sk_rrect, inner.sk_rrect);
}
Expand All @@ -309,7 +312,7 @@ void Canvas::drawOval(double left,
Paint paint(paint_objects, paint_data);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(), kDrawOvalFlags);
builder()->drawOval(SkRect::MakeLTRB(left, top, right, bottom));
}
Expand All @@ -323,7 +326,7 @@ void Canvas::drawCircle(double x,
Paint paint(paint_objects, paint_data);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(), kDrawCircleFlags);
builder()->drawCircle(SkPoint::Make(x, y), radius);
}
Expand All @@ -341,7 +344,7 @@ void Canvas::drawArc(double left,
Paint paint(paint_objects, paint_data);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(),
useCenter //
? kDrawArcWithCenterFlags
Expand All @@ -363,7 +366,7 @@ void Canvas::drawPath(const CanvasPath* path,
ToDart("Canvas.drawPath called with non-genuine Path."));
return;
}
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(), kDrawPathFlags);
builder()->drawPath(path->path());
}
Expand Down Expand Up @@ -392,7 +395,7 @@ Dart_Handle Canvas::drawImage(const CanvasImage* image,
}

auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
if (display_list_builder_) {
if (display_list_recorder_) {
bool with_attributes = paint.sync_to(builder(), kDrawImageWithPaintFlags);
builder()->drawImage(dl_image, SkPoint::Make(x, y), sampling,
with_attributes);
Expand Down Expand Up @@ -431,7 +434,7 @@ Dart_Handle Canvas::drawImageRect(const CanvasImage* image,
SkRect src = SkRect::MakeLTRB(src_left, src_top, src_right, src_bottom);
SkRect dst = SkRect::MakeLTRB(dst_left, dst_top, dst_right, dst_bottom);
auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);
if (display_list_builder_) {
if (display_list_recorder_) {
bool with_attributes =
paint.sync_to(builder(), kDrawImageRectWithPaintFlags);
builder()->drawImageRect(dl_image, src, dst, sampling, with_attributes,
Expand Down Expand Up @@ -473,7 +476,7 @@ Dart_Handle Canvas::drawImageNine(const CanvasImage* image,
center.round(&icenter);
SkRect dst = SkRect::MakeLTRB(dst_left, dst_top, dst_right, dst_bottom);
auto filter = ImageFilter::FilterModeFromIndex(bitmapSamplingIndex);
if (display_list_builder_) {
if (display_list_recorder_) {
bool with_attributes =
paint.sync_to(builder(), kDrawImageNineWithPaintFlags);
builder()->drawImageNine(dl_image, icenter, dst, filter, with_attributes);
Expand All @@ -488,8 +491,10 @@ void Canvas::drawPicture(Picture* picture) {
return;
}
if (picture->display_list()) {
if (display_list_builder_) {
if (display_list_recorder_) {
builder()->drawDisplayList(picture->display_list());
} else if (canvas_) {
picture->display_list()->RenderTo(canvas_);
}
} else {
FML_DCHECK(false);
Expand All @@ -506,7 +511,7 @@ void Canvas::drawPoints(Dart_Handle paint_objects,
"SkPoint doesn't use floats.");

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
switch (point_mode) {
case SkCanvas::kPoints_PointMode:
paint.sync_to(builder(), kDrawPointsAsPointsFlags);
Expand Down Expand Up @@ -536,7 +541,7 @@ void Canvas::drawVertices(const Vertices* vertices,
return;
}
FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
paint.sync_to(builder(), kDrawVerticesFlags);
builder()->drawVertices(vertices->vertices(), blend_mode);
}
Expand Down Expand Up @@ -573,7 +578,7 @@ Dart_Handle Canvas::drawAtlas(Dart_Handle paint_objects,
auto sampling = ImageFilter::SamplingFromIndex(filterQualityIndex);

FML_DCHECK(paint.isNotNull());
if (display_list_builder_) {
if (display_list_recorder_) {
tonic::Float32List transforms(transforms_handle);
tonic::Float32List rects(rects_handle);
tonic::Int32List colors(colors_handle);
Expand Down Expand Up @@ -605,7 +610,7 @@ void Canvas::drawShadow(const CanvasPath* path,
->get_window(0)
->viewport_metrics()
.device_pixel_ratio;
if (display_list_builder_) {
if (display_list_recorder_) {
// The DrawShadow mechanism results in non-public operations to be
// performed on the canvas involving an SkDrawShadowRec. Since we
// cannot include the header that defines that structure, we cannot
Expand All @@ -619,7 +624,8 @@ void Canvas::drawShadow(const CanvasPath* path,
}

void Canvas::Invalidate() {
display_list_builder_ = nullptr;
canvas_ = nullptr;
display_list_recorder_ = nullptr;
if (dart_wrapper()) {
ClearDartWrapper();
}
Expand Down
17 changes: 14 additions & 3 deletions lib/ui/painting/canvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#include "flutter/lib/ui/painting/rrect.h"
#include "flutter/lib/ui/painting/vertices.h"
#include "flutter/lib/ui/ui_dart_state.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/utils/SkShadowUtils.h"
#include "third_party/tonic/typed_data/typed_list.h"

namespace flutter {
Expand Down Expand Up @@ -185,20 +187,29 @@ class Canvas : public RefCountedDartWrappable<Canvas>, DisplayListOpFlags {
double elevation,
bool transparentOccluder);

SkCanvas* canvas() const { return canvas_; }
void Invalidate();

DisplayListBuilder* builder() { return display_list_builder_.get(); }
DisplayListBuilder* builder() {
return display_list_recorder_ ? display_list_recorder_->builder().get()
: nullptr;
}

private:
explicit Canvas(sk_sp<DisplayListBuilder> canvas);
explicit Canvas(SkCanvas* canvas);

// The SkCanvas is supplied by a call to SkPictureRecorder::beginRecording,
// which does not transfer ownership. For this reason, we hold a raw
// pointer and manually set to null in Clear.
SkCanvas* canvas_;

// A copy of the recorder used by the SkCanvas->DisplayList adapter for cases
// where we cannot record the SkCanvas method call through the various OnOp()
// virtual methods or where we can be more efficient by talking directly in
// the DisplayList operation lexicon. The recorder has a method for recording
// paint attributes from an SkPaint and an operation type as well as access
// to the raw DisplayListBuilder for emitting custom rendering operations.
sk_sp<DisplayListBuilder> display_list_builder_;
sk_sp<DisplayListCanvasRecorder> display_list_recorder_;
};

} // namespace flutter
Expand Down
1 change: 1 addition & 0 deletions lib/ui/painting/picture.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "flutter/lib/ui/dart_wrapper.h"
#include "flutter/lib/ui/painting/image.h"
#include "flutter/lib/ui/ui_dart_state.h"
#include "third_party/skia/include/core/SkPicture.h"

namespace flutter {
class Canvas;
Expand Down
Loading