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

create a DlCanvas class and a DlCanvas->SkCanvas adapter #35774

Closed
wants to merge 2 commits into from
Closed
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
4 changes: 4 additions & 0 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ FILE: ../../../flutter/display_list/display_list_builder.h
FILE: ../../../flutter/display_list/display_list_builder_benchmarks.cc
FILE: ../../../flutter/display_list/display_list_builder_multiplexer.cc
FILE: ../../../flutter/display_list/display_list_builder_multiplexer.h
FILE: ../../../flutter/display_list/display_list_canvas.cc
FILE: ../../../flutter/display_list/display_list_canvas.h
FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.cc
FILE: ../../../flutter/display_list/display_list_canvas_dispatcher.h
FILE: ../../../flutter/display_list/display_list_canvas_recorder.cc
Expand Down Expand Up @@ -106,6 +108,8 @@ FILE: ../../../flutter/display_list/display_list_path_effect_unittests.cc
FILE: ../../../flutter/display_list/display_list_rtree.cc
FILE: ../../../flutter/display_list/display_list_rtree.h
FILE: ../../../flutter/display_list/display_list_sampling_options.h
FILE: ../../../flutter/display_list/display_list_skcanvas_adapter.cc
FILE: ../../../flutter/display_list/display_list_skcanvas_adapter.h
FILE: ../../../flutter/display_list/display_list_test_utils.cc
FILE: ../../../flutter/display_list/display_list_test_utils.h
FILE: ../../../flutter/display_list/display_list_tile_mode.h
Expand Down
4 changes: 4 additions & 0 deletions display_list/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ source_set("display_list") {
"display_list_builder.h",
"display_list_builder_multiplexer.cc",
"display_list_builder_multiplexer.h",
"display_list_canvas.cc",
"display_list_canvas.h",
"display_list_canvas_dispatcher.cc",
"display_list_canvas_dispatcher.h",
"display_list_canvas_recorder.cc",
Expand Down Expand Up @@ -54,6 +56,8 @@ source_set("display_list") {
"display_list_rtree.cc",
"display_list_rtree.h",
"display_list_sampling_options.h",
"display_list_skcanvas_adapter.cc",
"display_list_skcanvas_adapter.h",
"display_list_tile_mode.h",
"display_list_utils.cc",
"display_list_utils.h",
Expand Down
64 changes: 36 additions & 28 deletions display_list/display_list_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -508,9 +508,9 @@ void DisplayListBuilder::saveLayer(const SkRect* bounds,
}
}
}
void DisplayListBuilder::saveLayer(const SkRect* bounds,
const DlPaint* paint,
const DlImageFilter* backdrop) {
void DisplayListBuilder::onSaveLayer(const SkRect* bounds,
const DlPaint* paint,
const DlImageFilter* backdrop) {
if (paint != nullptr) {
setAttributesFromDlPaint(*paint,
DisplayListOpFlags::kSaveLayerWithPaintFlags);
Expand Down Expand Up @@ -700,7 +700,7 @@ void DisplayListBuilder::intersect(const SkRect& rect) {
current_layer_->clip_bounds.setEmpty();
}
}
SkRect DisplayListBuilder::getLocalClipBounds() {
SkRect DisplayListBuilder::getLocalClipBounds() const {
SkM44 inverse;
if (current_layer_->matrix.invert(&inverse)) {
SkRect devBounds;
Expand Down Expand Up @@ -897,10 +897,10 @@ void DisplayListBuilder::drawImage(const sk_sp<DlImage> image,
: Push<DrawImageOp>(0, 1, std::move(image), point, sampling);
CheckLayerOpacityCompatibility(render_with_attributes);
}
void DisplayListBuilder::drawImage(const sk_sp<DlImage> image,
const SkPoint point,
DlImageSampling sampling,
const DlPaint* paint) {
void DisplayListBuilder::onDrawImage(const sk_sp<DlImage> image,
const SkPoint point,
DlImageSampling sampling,
const DlPaint* paint) {
if (paint != nullptr) {
setAttributesFromDlPaint(*paint,
DisplayListOpFlags::kDrawImageWithPaintFlags);
Expand All @@ -919,12 +919,13 @@ void DisplayListBuilder::drawImageRect(const sk_sp<DlImage> image,
render_with_attributes, constraint);
CheckLayerOpacityCompatibility(render_with_attributes);
}
void DisplayListBuilder::drawImageRect(const sk_sp<DlImage> image,
const SkRect& src,
const SkRect& dst,
DlImageSampling sampling,
const DlPaint* paint,
SkCanvas::SrcRectConstraint constraint) {
void DisplayListBuilder::onDrawImageRect(
const sk_sp<DlImage> image,
const SkRect& src,
const SkRect& dst,
DlImageSampling sampling,
const DlPaint* paint,
SkCanvas::SrcRectConstraint constraint) {
if (paint != nullptr) {
setAttributesFromDlPaint(*paint,
DisplayListOpFlags::kDrawImageRectWithPaintFlags);
Expand All @@ -944,11 +945,11 @@ void DisplayListBuilder::drawImageNine(const sk_sp<DlImage> image,
: Push<DrawImageNineOp>(0, 1, std::move(image), center, dst, filter);
CheckLayerOpacityCompatibility(render_with_attributes);
}
void DisplayListBuilder::drawImageNine(const sk_sp<DlImage> image,
const SkIRect& center,
const SkRect& dst,
DlFilterMode filter,
const DlPaint* paint) {
void DisplayListBuilder::onDrawImageNine(const sk_sp<DlImage> image,
const SkIRect& center,
const SkRect& dst,
DlFilterMode filter,
const DlPaint* paint) {
if (paint != nullptr) {
setAttributesFromDlPaint(*paint,
DisplayListOpFlags::kDrawImageNineWithPaintFlags);
Expand Down Expand Up @@ -1017,15 +1018,15 @@ void DisplayListBuilder::drawAtlas(const sk_sp<DlImage> atlas,
// of the transforms and texture rectangles.
UpdateLayerOpacityCompatibility(false);
}
void DisplayListBuilder::drawAtlas(const sk_sp<DlImage> atlas,
const SkRSXform xform[],
const SkRect tex[],
const DlColor colors[],
int count,
DlBlendMode mode,
DlImageSampling sampling,
const SkRect* cull_rect,
const DlPaint* paint) {
void DisplayListBuilder::onDrawAtlas(const sk_sp<DlImage> atlas,
const SkRSXform xform[],
const SkRect tex[],
const DlColor colors[],
int count,
DlBlendMode mode,
DlImageSampling sampling,
const SkRect* cull_rect,
const DlPaint* paint) {
if (paint != nullptr) {
setAttributesFromDlPaint(*paint,
DisplayListOpFlags::kDrawAtlasWithPaintFlags);
Expand Down Expand Up @@ -1073,6 +1074,13 @@ void DisplayListBuilder::drawTextBlob(const sk_sp<SkTextBlob> blob,
Push<DrawTextBlobOp>(0, 1, std::move(blob), x, y);
CheckLayerOpacityCompatibility();
}
void DisplayListBuilder::drawTextBlob(const sk_sp<SkTextBlob> blob,
SkScalar x,
SkScalar y,
const DlPaint& paint) {
setAttributesFromDlPaint(paint, DisplayListOpFlags::kDrawTextBlobFlags);
drawTextBlob(blob, x, y);
}
void DisplayListBuilder::drawShadow(const SkPath& path,
const DlColor color,
const SkScalar elevation,
Expand Down
130 changes: 76 additions & 54 deletions display_list/display_list_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include "flutter/display_list/display_list.h"
#include "flutter/display_list/display_list_blend_mode.h"
#include "flutter/display_list/display_list_canvas.h"
#include "flutter/display_list/display_list_comparable.h"
#include "flutter/display_list/display_list_dispatcher.h"
#include "flutter/display_list/display_list_flags.h"
Expand All @@ -25,6 +26,7 @@ namespace flutter {
// those rendering commands can be captured into a DisplayList using
// the DisplayListCanvasRecorder class.
class DisplayListBuilder final : public virtual Dispatcher,
public virtual DlCanvas,
public SkRefCnt,
DisplayListOpFlags {
public:
Expand Down Expand Up @@ -166,12 +168,9 @@ class DisplayListBuilder final : public virtual Dispatcher,
: SaveLayerOptions::kNoAttributes,
nullptr);
}
void saveLayer(const SkRect* bounds,
const DlPaint* paint,
const DlImageFilter* backdrop = nullptr);
void restore() override;
int getSaveCount() { return layer_stack_.size(); }
void restoreToCount(int restore_count);
int getSaveCount() override { return layer_stack_.size(); }
void restoreToCount(int restore_count) override;

void translate(SkScalar tx, SkScalar ty) override;
void scale(SkScalar sx, SkScalar sy) override;
Expand All @@ -194,19 +193,21 @@ class DisplayListBuilder final : public virtual Dispatcher,
SkScalar mwx, SkScalar mwy, SkScalar mwz, SkScalar mwt) override;
// clang-format on
void transformReset() override;
void transform(const SkMatrix* matrix);
void transform(const SkM44* matrix44);
void transform(const SkMatrix& matrix) { transform(&matrix); }
void transform(const SkM44& matrix44) { transform(&matrix44); }
void transform(const SkMatrix* matrix) override;
void transform(const SkM44* matrix44) override;

/// Returns the 4x4 full perspective transform representing all transform
/// operations executed so far in this DisplayList within the enclosing
/// save stack.
SkM44 getTransformFullPerspective() { return current_layer_->matrix; }
SkM44 getTransformFullPerspective() const override {
return current_layer_->matrix;
}
/// Returns the 3x3 partial perspective transform representing all transform
/// operations executed so far in this DisplayList within the enclosing
/// save stack.
SkMatrix getTransform() { return current_layer_->matrix.asM33(); }
SkMatrix getTransform() const override {
return current_layer_->matrix.asM33();
}

void clipRect(const SkRect& rect, SkClipOp clip_op, bool is_aa) override;
void clipRRect(const SkRRect& rrect, SkClipOp clip_op, bool is_aa) override;
Expand All @@ -215,31 +216,37 @@ class DisplayListBuilder final : public virtual Dispatcher,
/// Conservative estimate of the bounds of all outstanding clip operations
/// measured in the coordinate space within which this DisplayList will
/// be rendered.
SkRect getDestinationClipBounds() { return current_layer_->clip_bounds; }
SkRect getDestinationClipBounds() const override {
return current_layer_->clip_bounds;
}
/// Conservative estimate of the bounds of all outstanding clip operations
/// transformed into the local coordinate space in which currently
/// recorded rendering operations are interpreted.
SkRect getLocalClipBounds();
SkRect getLocalClipBounds() const override;

void drawPaint() override;
void drawPaint(const DlPaint& paint);
void drawPaint(const DlPaint& paint) override;
void drawColor(DlColor color, DlBlendMode mode) override;
void drawLine(const SkPoint& p0, const SkPoint& p1) override;
void drawLine(const SkPoint& p0, const SkPoint& p1, const DlPaint& paint);
void drawLine(const SkPoint& p0,
const SkPoint& p1,
const DlPaint& paint) override;
void drawRect(const SkRect& rect) override;
void drawRect(const SkRect& rect, const DlPaint& paint);
void drawRect(const SkRect& rect, const DlPaint& paint) override;
void drawOval(const SkRect& bounds) override;
void drawOval(const SkRect& bounds, const DlPaint& paint);
void drawOval(const SkRect& bounds, const DlPaint& paint) override;
void drawCircle(const SkPoint& center, SkScalar radius) override;
void drawCircle(const SkPoint& center, SkScalar radius, const DlPaint& paint);
void drawCircle(const SkPoint& center,
SkScalar radius,
const DlPaint& paint) override;
void drawRRect(const SkRRect& rrect) override;
void drawRRect(const SkRRect& rrect, const DlPaint& paint);
void drawRRect(const SkRRect& rrect, const DlPaint& paint) override;
void drawDRRect(const SkRRect& outer, const SkRRect& inner) override;
void drawDRRect(const SkRRect& outer,
const SkRRect& inner,
const DlPaint& paint);
const DlPaint& paint) override;
void drawPath(const SkPath& path) override;
void drawPath(const SkPath& path, const DlPaint& paint);
void drawPath(const SkPath& path, const DlPaint& paint) override;
void drawArc(const SkRect& bounds,
SkScalar start,
SkScalar sweep,
Expand All @@ -248,14 +255,14 @@ class DisplayListBuilder final : public virtual Dispatcher,
SkScalar start,
SkScalar sweep,
bool useCenter,
const DlPaint& paint);
const DlPaint& paint) override;
void drawPoints(SkCanvas::PointMode mode,
uint32_t count,
const SkPoint pts[]) override;
void drawPoints(SkCanvas::PointMode mode,
uint32_t count,
const SkPoint pts[],
const DlPaint& paint);
const DlPaint& paint) override;
void drawSkVertices(const sk_sp<SkVertices> vertices,
SkBlendMode mode) override;
void drawVertices(const DlVertices* vertices, DlBlendMode mode) override;
Expand All @@ -265,20 +272,11 @@ class DisplayListBuilder final : public virtual Dispatcher,
}
void drawVertices(const DlVertices* vertices,
DlBlendMode mode,
const DlPaint& paint);
void drawVertices(const std::shared_ptr<const DlVertices> vertices,
DlBlendMode mode,
const DlPaint& paint) {
drawVertices(vertices.get(), mode, paint);
}
const DlPaint& paint) override;
void drawImage(const sk_sp<DlImage> image,
const SkPoint point,
DlImageSampling sampling,
bool render_with_attributes) override;
void drawImage(const sk_sp<DlImage> image,
const SkPoint point,
DlImageSampling sampling,
const DlPaint* paint = nullptr);
void drawImageRect(
const sk_sp<DlImage> image,
const SkRect& src,
Expand All @@ -287,23 +285,11 @@ class DisplayListBuilder final : public virtual Dispatcher,
bool render_with_attributes,
SkCanvas::SrcRectConstraint constraint =
SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint) override;
void drawImageRect(const sk_sp<DlImage> image,
const SkRect& src,
const SkRect& dst,
DlImageSampling sampling,
const DlPaint* paint = nullptr,
SkCanvas::SrcRectConstraint constraint =
SkCanvas::SrcRectConstraint::kFast_SrcRectConstraint);
void drawImageNine(const sk_sp<DlImage> image,
const SkIRect& center,
const SkRect& dst,
DlFilterMode filter,
bool render_with_attributes) override;
void drawImageNine(const sk_sp<DlImage> image,
const SkIRect& center,
const SkRect& dst,
DlFilterMode filter,
const DlPaint* paint = nullptr);
void drawImageLattice(const sk_sp<DlImage> image,
const SkCanvas::Lattice& lattice,
const SkRect& dst,
Expand All @@ -318,30 +304,66 @@ class DisplayListBuilder final : public virtual Dispatcher,
DlImageSampling sampling,
const SkRect* cullRect,
bool render_with_attributes) override;
void drawAtlas(const sk_sp<DlImage> atlas,
const SkRSXform xform[],
const SkRect tex[],
const DlColor colors[],
int count,
DlBlendMode mode,
DlImageSampling sampling,
const SkRect* cullRect,
const DlPaint* paint = nullptr);
void drawPicture(const sk_sp<SkPicture> picture,
const SkMatrix* matrix,
bool render_with_attributes) override;
void drawDisplayList(const sk_sp<DisplayList> display_list) override;
void drawTextBlob(const sk_sp<SkTextBlob> blob,
SkScalar x,
SkScalar y) override;
void drawTextBlob(const sk_sp<SkTextBlob> blob,
SkScalar x,
SkScalar y,
const DlPaint& paint) override;
void drawShadow(const SkPath& path,
const DlColor color,
const SkScalar elevation,
bool transparent_occluder,
SkScalar dpr) override;

// These using calls draw in the overloads in DlCanvas that implement
// default parameters.
using DlCanvas::drawAtlas;
using DlCanvas::drawImage;
using DlCanvas::drawImageNine;
using DlCanvas::drawImageRect;
using DlCanvas::drawVertices;
using DlCanvas::saveLayer;
using DlCanvas::transform;

sk_sp<DisplayList> Build();

protected:
// The "on" versios of these calls are used to avoid conflicts with
// the methods in DlCanvas that have default parametrs.
void onSaveLayer(const SkRect* bounds,
const DlPaint* paint,
const DlImageFilter* backdrop) override;
void onDrawImage(const sk_sp<DlImage> image,
const SkPoint point,
DlImageSampling sampling,
const DlPaint* paint) override;
void onDrawImageRect(const sk_sp<DlImage> image,
const SkRect& src,
const SkRect& dst,
DlImageSampling sampling,
const DlPaint* paint,
SkCanvas::SrcRectConstraint constraint) override;
void onDrawImageNine(const sk_sp<DlImage> image,
const SkIRect& center,
const SkRect& dst,
DlFilterMode filter,
const DlPaint* paint) override;
void onDrawAtlas(const sk_sp<DlImage> atlas,
const SkRSXform xform[],
const SkRect tex[],
const DlColor colors[],
int count,
DlBlendMode mode,
DlImageSampling sampling,
const SkRect* cullRect,
const DlPaint* paint) override;

private:
void checkForDeferredSave();

Expand Down
Loading