Index: cc/paint/paint_op_buffer.cc |
diff --git a/cc/paint/paint_op_buffer.cc b/cc/paint/paint_op_buffer.cc |
index 0fb012d76ad2b2061ea7dbb5a34cb938e288c16a..8387dae108ab6a8a9977512dce602c85a38e475c 100644 |
--- a/cc/paint/paint_op_buffer.cc |
+++ b/cc/paint/paint_op_buffer.cc |
@@ -46,6 +46,10 @@ namespace cc { |
using RasterFunction = void (*)(const PaintOp* op, |
SkCanvas* canvas, |
const SkMatrix& original_ctm); |
+using RasterWithFlagsFunction = void (*)(const PaintOpWithFlags* op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm); |
NOINLINE static void RasterWithAlphaInternal(RasterFunction raster_fn, |
const PaintOp* op, |
@@ -71,22 +75,21 @@ struct Rasterizer { |
} |
}; |
-NOINLINE static void RasterWithAlphaInternalForFlags(RasterFunction raster_fn, |
- const PaintOpWithFlags* op, |
- SkCanvas* canvas, |
- uint8_t alpha) { |
+NOINLINE static void RasterWithAlphaInternalForFlags( |
+ RasterWithFlagsFunction raster_fn, |
+ const PaintOpWithFlags* op, |
+ SkCanvas* canvas, |
+ uint8_t alpha) { |
SkMatrix unused_matrix; |
if (alpha == 255) { |
- raster_fn(op, canvas, unused_matrix); |
+ raster_fn(op, &op->flags, canvas, unused_matrix); |
} else if (op->flags.SupportsFoldingAlpha()) { |
- PaintOpWithFlags* mutable_op = const_cast<PaintOpWithFlags*>(op); |
- uint8_t flags_alpha = op->flags.getAlpha(); |
- mutable_op->flags.setAlpha(SkMulDiv255Round(flags_alpha, alpha)); |
- raster_fn(op, canvas, unused_matrix); |
- mutable_op->flags.setAlpha(flags_alpha); |
+ PaintFlags flags = op->flags; |
+ flags.setAlpha(SkMulDiv255Round(flags.getAlpha(), alpha)); |
+ raster_fn(op, &flags, canvas, unused_matrix); |
} else { |
canvas->saveLayerAlpha(nullptr, alpha); |
- raster_fn(op, canvas, unused_matrix); |
+ raster_fn(op, &op->flags, canvas, unused_matrix); |
canvas->restore(); |
} |
} |
@@ -97,7 +100,7 @@ struct Rasterizer<T, true> { |
static_assert(T::kHasPaintFlags, |
"This function expects the PaintOp to have PaintFlags"); |
DCHECK(T::kIsDrawOp); |
- RasterWithAlphaInternalForFlags(&T::Raster, op, canvas, alpha); |
+ RasterWithAlphaInternalForFlags(&T::RasterWithFlags, op, canvas, alpha); |
} |
}; |
@@ -233,19 +236,21 @@ void ConcatOp::Raster(const PaintOp* base_op, |
canvas->concat(op->matrix); |
} |
-void DrawArcOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawArcOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawArcOp*>(base_op); |
canvas->drawArc(op->oval, op->start_angle, op->sweep_angle, op->use_center, |
- ToSkPaint(op->flags)); |
+ ToSkPaint(*flags)); |
} |
-void DrawCircleOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawCircleOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawCircleOp*>(base_op); |
- canvas->drawCircle(op->cx, op->cy, op->radius, ToSkPaint(op->flags)); |
+ canvas->drawCircle(op->cx, op->cy, op->radius, ToSkPaint(*flags)); |
} |
void DrawColorOp::Raster(const PaintOp* base_op, |
@@ -262,66 +267,74 @@ void DrawDisplayItemListOp::Raster(const PaintOp* base_op, |
op->list->Raster(canvas, nullptr); |
} |
-void DrawDRRectOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawDRRectOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawDRRectOp*>(base_op); |
- canvas->drawDRRect(op->outer, op->inner, ToSkPaint(op->flags)); |
+ canvas->drawDRRect(op->outer, op->inner, ToSkPaint(*flags)); |
} |
-void DrawImageOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawImageOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawImageOp*>(base_op); |
canvas->drawImage(op->image.sk_image().get(), op->left, op->top, |
- ToSkPaint(&op->flags)); |
+ ToSkPaint(flags)); |
} |
-void DrawImageRectOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawImageRectOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawImageRectOp*>(base_op); |
// TODO(enne): Probably PaintCanvas should just use the skia enum directly. |
SkCanvas::SrcRectConstraint skconstraint = |
static_cast<SkCanvas::SrcRectConstraint>(op->constraint); |
canvas->drawImageRect(op->image.sk_image().get(), op->src, op->dst, |
- ToSkPaint(&op->flags), skconstraint); |
+ ToSkPaint(flags), skconstraint); |
} |
-void DrawIRectOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawIRectOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawIRectOp*>(base_op); |
- canvas->drawIRect(op->rect, ToSkPaint(op->flags)); |
+ canvas->drawIRect(op->rect, ToSkPaint(*flags)); |
} |
-void DrawLineOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawLineOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawLineOp*>(base_op); |
- canvas->drawLine(op->x0, op->y0, op->x1, op->y1, ToSkPaint(op->flags)); |
+ canvas->drawLine(op->x0, op->y0, op->x1, op->y1, ToSkPaint(*flags)); |
} |
-void DrawOvalOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawOvalOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawOvalOp*>(base_op); |
- canvas->drawOval(op->oval, ToSkPaint(op->flags)); |
+ canvas->drawOval(op->oval, ToSkPaint(*flags)); |
} |
-void DrawPathOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawPathOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawPathOp*>(base_op); |
- canvas->drawPath(op->path, ToSkPaint(op->flags)); |
+ canvas->drawPath(op->path, ToSkPaint(*flags)); |
} |
-void DrawPosTextOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawPosTextOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawPosTextOp*>(base_op); |
canvas->drawPosText(op->GetData(), op->bytes, op->GetArray(), |
- ToSkPaint(op->flags)); |
+ ToSkPaint(*flags)); |
} |
void DrawRecordOp::Raster(const PaintOp* base_op, |
@@ -331,33 +344,36 @@ void DrawRecordOp::Raster(const PaintOp* base_op, |
op->record->playback(canvas); |
} |
-void DrawRectOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawRectOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawRectOp*>(base_op); |
- canvas->drawRect(op->rect, ToSkPaint(op->flags)); |
+ canvas->drawRect(op->rect, ToSkPaint(*flags)); |
} |
-void DrawRRectOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawRRectOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawRRectOp*>(base_op); |
- canvas->drawRRect(op->rrect, ToSkPaint(op->flags)); |
+ canvas->drawRRect(op->rrect, ToSkPaint(*flags)); |
} |
-void DrawTextOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawTextOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawTextOp*>(base_op); |
- canvas->drawText(op->GetData(), op->bytes, op->x, op->y, |
- ToSkPaint(op->flags)); |
+ canvas->drawText(op->GetData(), op->bytes, op->x, op->y, ToSkPaint(*flags)); |
} |
-void DrawTextBlobOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void DrawTextBlobOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const DrawTextBlobOp*>(base_op); |
- canvas->drawTextBlob(op->blob.get(), op->x, op->y, ToSkPaint(op->flags)); |
+ canvas->drawTextBlob(op->blob.get(), op->x, op->y, ToSkPaint(*flags)); |
} |
void RestoreOp::Raster(const PaintOp* base_op, |
@@ -379,14 +395,15 @@ void SaveOp::Raster(const PaintOp* base_op, |
canvas->save(); |
} |
-void SaveLayerOp::Raster(const PaintOp* base_op, |
- SkCanvas* canvas, |
- const SkMatrix& original_ctm) { |
+void SaveLayerOp::RasterWithFlags(const PaintOpWithFlags* base_op, |
+ const PaintFlags* flags, |
+ SkCanvas* canvas, |
+ const SkMatrix& original_ctm) { |
auto* op = static_cast<const SaveLayerOp*>(base_op); |
// See PaintOp::kUnsetRect |
bool unset = op->bounds.left() == SK_ScalarInfinity; |
- canvas->saveLayer(unset ? nullptr : &op->bounds, ToSkPaint(&op->flags)); |
+ canvas->saveLayer(unset ? nullptr : &op->bounds, ToSkPaint(flags)); |
} |
void SaveLayerAlphaOp::Raster(const PaintOp* base_op, |