Index: cc/paint/paint_op_buffer.h |
diff --git a/cc/paint/paint_op_buffer.h b/cc/paint/paint_op_buffer.h |
index d4d69387d21c4e61cef501707f9cef65324a5205..dec8543115b6d6994cd3a2fc5197bcd94d5ef71c 100644 |
--- a/cc/paint/paint_op_buffer.h |
+++ b/cc/paint/paint_op_buffer.h |
@@ -79,6 +79,10 @@ struct CC_PAINT_EXPORT PaintOp { |
PaintOpType GetType() const { return static_cast<PaintOpType>(type); } |
+ // Subclasses should provide a static Raster() method which is called from |
+ // here. The Raster method should take a const PaintOp* parameter. It is |
+ // static with a pointer to the base type so that we can use it as a function |
+ // pointer. |
void Raster(SkCanvas* canvas, const SkMatrix& original_ctm) const; |
bool IsDrawOp() const; |
@@ -104,6 +108,12 @@ struct CC_PAINT_EXPORT PaintOpWithFlags : PaintOp { |
int CountSlowPathsFromFlags() const { return flags.getPathEffect() ? 1 : 0; } |
+ // Subclasses should provide a static RasterWithFlags() method which is called |
+ // from the Raster() method. The RasterWithFlags() should use the PaintFlags |
+ // passed to it, instead of the |flags| member directly, as some callers may |
+ // provide a modified PaintFlags. The RasterWithFlags() method is static with |
+ // a const PaintOpWithFlags* parameter so that it can be used as a function |
+ // pointer. |
PaintFlags flags; |
}; |
@@ -289,7 +299,14 @@ struct CC_PAINT_EXPORT DrawArcOp final : PaintOpWithFlags { |
use_center(use_center) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
SkRect oval; |
SkScalar start_angle; |
@@ -307,7 +324,14 @@ struct CC_PAINT_EXPORT DrawCircleOp final : PaintOpWithFlags { |
: PaintOpWithFlags(flags), cx(cx), cy(cy), radius(radius) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
SkScalar cx; |
SkScalar cy; |
@@ -354,7 +378,14 @@ struct CC_PAINT_EXPORT DrawDRRectOp final : PaintOpWithFlags { |
: PaintOpWithFlags(flags), outer(outer), inner(inner) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
SkRRect outer; |
SkRRect inner; |
@@ -370,7 +401,14 @@ struct CC_PAINT_EXPORT DrawImageOp final : PaintOpWithFlags { |
~DrawImageOp(); |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
PaintImage image; |
SkScalar left; |
@@ -388,7 +426,14 @@ struct CC_PAINT_EXPORT DrawImageRectOp final : PaintOpWithFlags { |
~DrawImageRectOp(); |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
PaintImage image; |
SkRect src; |
@@ -403,7 +448,14 @@ struct CC_PAINT_EXPORT DrawIRectOp final : PaintOpWithFlags { |
: PaintOpWithFlags(flags), rect(rect) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
SkIRect rect; |
}; |
@@ -419,7 +471,15 @@ struct CC_PAINT_EXPORT DrawLineOp final : PaintOpWithFlags { |
: PaintOpWithFlags(flags), x0(x0), y0(y0), x1(x1), y1(y1) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
+ |
int CountSlowPaths() const; |
SkScalar x0; |
@@ -435,7 +495,14 @@ struct CC_PAINT_EXPORT DrawOvalOp final : PaintOpWithFlags { |
: PaintOpWithFlags(flags), oval(oval) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
SkRect oval; |
}; |
@@ -447,7 +514,14 @@ struct CC_PAINT_EXPORT DrawPathOp final : PaintOpWithFlags { |
: PaintOpWithFlags(flags), path(path) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
int CountSlowPaths() const; |
ThreadsafePath path; |
@@ -460,7 +534,15 @@ struct CC_PAINT_EXPORT DrawPosTextOp final : PaintOpWithArray<SkPoint> { |
~DrawPosTextOp(); |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
+ |
const void* GetData() const { return GetDataForThis(this); } |
void* GetData() { return GetDataForThis(this); } |
const SkPoint* GetArray() const { return GetArrayForThis(this); } |
@@ -487,7 +569,14 @@ struct CC_PAINT_EXPORT DrawRectOp final : PaintOpWithFlags { |
: PaintOpWithFlags(flags), rect(rect) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
SkRect rect; |
}; |
@@ -499,7 +588,14 @@ struct CC_PAINT_EXPORT DrawRRectOp final : PaintOpWithFlags { |
: PaintOpWithFlags(flags), rrect(rrect) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
SkRRect rrect; |
}; |
@@ -511,7 +607,14 @@ struct CC_PAINT_EXPORT DrawTextOp final : PaintOpWithData { |
: PaintOpWithData(flags, bytes), x(x), y(y) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
void* GetData() { return GetDataForThis(this); } |
const void* GetData() const { return GetDataForThis(this); } |
@@ -530,7 +633,14 @@ struct CC_PAINT_EXPORT DrawTextBlobOp final : PaintOpWithFlags { |
~DrawTextBlobOp(); |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
sk_sp<SkTextBlob> blob; |
SkScalar x; |
@@ -575,7 +685,14 @@ struct CC_PAINT_EXPORT SaveLayerOp final : PaintOpWithFlags { |
bounds(bounds ? *bounds : kUnsetRect) {} |
static void Raster(const PaintOp* op, |
SkCanvas* canvas, |
- const SkMatrix& original_ctm); |
+ const SkMatrix& original_ctm) { |
+ auto* flags_op = static_cast<const PaintOpWithFlags*>(op); |
+ RasterWithFlags(flags_op, &flags_op->flags, canvas, original_ctm); |
+ } |
+ static void RasterWithFlags(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
SkRect bounds; |
}; |