Index: src/core/SkRecords.h |
diff --git a/src/core/SkRecords.h b/src/core/SkRecords.h |
index d6308a913075d41366a649da62f95176110981c0..00332c341c3b4576212e99e7a719d39d2c7538d6 100644 |
--- a/src/core/SkRecords.h |
+++ b/src/core/SkRecords.h |
@@ -184,33 +184,43 @@ private: |
// Like SkBitmap, but deep copies pixels if they're not immutable. |
// Using this, we guarantee the immutability of all bitmaps we record. |
-class ImmutableBitmap : SkNoncopyable { |
-public: |
+struct ImmutableBitmap : public SkBitmap { |
explicit ImmutableBitmap(const SkBitmap& bitmap) { |
if (bitmap.isImmutable()) { |
- fBitmap = bitmap; |
+ *(SkBitmap*)this = bitmap; |
} else { |
- bitmap.copyTo(&fBitmap); |
+ bitmap.copyTo(this); |
} |
- fBitmap.setImmutable(); |
+ this->setImmutable(); |
} |
+}; |
- operator const SkBitmap& () const { return fBitmap; } |
+// SkPath::getBounds() isn't thread safe unless we precache the bounds in a singlethreaded context. |
+// Recording is a convenient time to do this, but we could delay it to between record and playback. |
+struct BoundedPath : public SkPath { |
+ explicit BoundedPath(const SkPath& path) : SkPath(path) { |
+ this->updateBoundsCache(); |
+ } |
+}; |
-private: |
- SkBitmap fBitmap; |
+// Like SkPath::getBounds(), SkMatrix::getType() isn't thread safe unless we precache it. |
+// This may not cover all SkMatrices used by the picture (e.g. some could be hiding in a shader). |
+struct TypedMatrix : public SkMatrix { |
+ explicit TypedMatrix(const SkMatrix& matrix) : SkMatrix(matrix) { |
+ (void)this->getType(); |
+ } |
}; |
RECORD0(NoOp); |
-RECORD2(Restore, SkIRect, devBounds, SkMatrix, matrix); |
+RECORD2(Restore, SkIRect, devBounds, TypedMatrix, matrix); |
RECORD0(Save); |
RECORD3(SaveLayer, Optional<SkRect>, bounds, Optional<SkPaint>, paint, SkCanvas::SaveFlags, flags); |
RECORD1(PushCull, SkRect, rect); |
RECORD0(PopCull); |
-RECORD1(SetMatrix, SkMatrix, matrix); |
+RECORD1(SetMatrix, TypedMatrix, matrix); |
struct RegionOpAndAA { |
RegionOpAndAA(SkRegion::Op op, bool aa) : op(op), aa(aa) {} |
@@ -219,10 +229,10 @@ struct RegionOpAndAA { |
}; |
SK_COMPILE_ASSERT(sizeof(RegionOpAndAA) == 4, RegionOpAndAASize); |
-RECORD3(ClipPath, SkIRect, devBounds, SkPath, path, RegionOpAndAA, opAA); |
-RECORD3(ClipRRect, SkIRect, devBounds, SkRRect, rrect, RegionOpAndAA, opAA); |
-RECORD3(ClipRect, SkIRect, devBounds, SkRect, rect, RegionOpAndAA, opAA); |
-RECORD3(ClipRegion, SkIRect, devBounds, SkRegion, region, SkRegion::Op, op); |
+RECORD3(ClipPath, SkIRect, devBounds, BoundedPath, path, RegionOpAndAA, opAA); |
+RECORD3(ClipRRect, SkIRect, devBounds, SkRRect, rrect, RegionOpAndAA, opAA); |
+RECORD3(ClipRect, SkIRect, devBounds, SkRect, rect, RegionOpAndAA, opAA); |
+RECORD3(ClipRegion, SkIRect, devBounds, SkRegion, region, SkRegion::Op, op); |
RECORD1(Clear, SkColor, color); |
@@ -235,7 +245,7 @@ RECORD4(DrawBitmap, Optional<SkPaint>, paint, |
ImmutableBitmap, bitmap, |
SkScalar, left, |
SkScalar, top); |
-RECORD3(DrawBitmapMatrix, Optional<SkPaint>, paint, ImmutableBitmap, bitmap, SkMatrix, matrix); |
+RECORD3(DrawBitmapMatrix, Optional<SkPaint>, paint, ImmutableBitmap, bitmap, TypedMatrix, matrix); |
RECORD4(DrawBitmapNine, Optional<SkPaint>, paint, |
ImmutableBitmap, bitmap, |
SkIRect, center, |
@@ -260,10 +270,10 @@ RECORD4(DrawImageRect, Optional<SkPaint>, paint, |
SkRect, dst); |
RECORD2(DrawOval, SkPaint, paint, SkRect, oval); |
RECORD1(DrawPaint, SkPaint, paint); |
-RECORD2(DrawPath, SkPaint, paint, SkPath, path); |
+RECORD2(DrawPath, SkPaint, paint, BoundedPath, path); |
RECORD3(DrawPicture, Optional<SkPaint>, paint, |
RefBox<const SkPicture>, picture, |
- Optional<SkMatrix>, matrix); |
+ TypedMatrix, matrix); |
RECORD4(DrawPoints, SkPaint, paint, SkCanvas::PointMode, mode, unsigned, count, SkPoint*, pts); |
RECORD4(DrawPosText, SkPaint, paint, |
PODArray<char>, text, |
@@ -289,8 +299,8 @@ RECORD4(DrawTextBlob, SkPaint, paint, |
RECORD5(DrawTextOnPath, SkPaint, paint, |
PODArray<char>, text, |
size_t, byteLength, |
- SkPath, path, |
- Optional<SkMatrix>, matrix); |
+ BoundedPath, path, |
+ TypedMatrix, matrix); |
RECORD2(DrawData, PODArray<char>, data, size_t, length); |