Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2286)

Unified Diff: cc/paint/paint_op_buffer.cc

Issue 2863673002: cc: Fix data race in PaintOpBuffer by not mutating PaintOps. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/paint/paint_op_buffer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « cc/paint/paint_op_buffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698