| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkRecorder.h" | 8 #include "SkRecorder.h" |
| 9 #include "SkPatchUtils.h" | 9 #include "SkPatchUtils.h" |
| 10 #include "SkPicture.h" | 10 #include "SkPicture.h" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 public: | 67 public: |
| 68 Reference(const T& x) : fX(x) {} | 68 Reference(const T& x) : fX(x) {} |
| 69 operator const T&() const { return fX; } | 69 operator const T&() const { return fX; } |
| 70 private: | 70 private: |
| 71 const T& fX; | 71 const T& fX; |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 template <typename T> | 74 template <typename T> |
| 75 static Reference<T> delay_copy(const T& x) { return Reference<T>(x); } | 75 static Reference<T> delay_copy(const T& x) { return Reference<T>(x); } |
| 76 | 76 |
| 77 // SkPath::getBounds() isn't thread safe unless we precache the bounds in a sing
lethreaded context. |
| 78 // Recording is a convenient time to do this, but we could delay it to between r
ecord and playback. |
| 79 static Reference<SkPath> force_path_bounds(const SkPath& p) { |
| 80 p.updateBoundsCache(); |
| 81 return Reference<SkPath>(p); |
| 82 } |
| 83 |
| 77 // Use copy() only for optional arguments, to be copied if present or skipped if
not. | 84 // Use copy() only for optional arguments, to be copied if present or skipped if
not. |
| 78 // (For most types we just pass by value and let copy constructors do their thin
g.) | 85 // (For most types we just pass by value and let copy constructors do their thin
g.) |
| 79 template <typename T> | 86 template <typename T> |
| 80 T* SkRecorder::copy(const T* src) { | 87 T* SkRecorder::copy(const T* src) { |
| 81 if (NULL == src) { | 88 if (NULL == src) { |
| 82 return NULL; | 89 return NULL; |
| 83 } | 90 } |
| 84 return SkNEW_PLACEMENT_ARGS(fRecord->alloc<T>(), T, (*src)); | 91 return SkNEW_PLACEMENT_ARGS(fRecord->alloc<T>(), T, (*src)); |
| 85 } | 92 } |
| 86 | 93 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 | 158 |
| 152 void SkRecorder::onDrawDrawable(SkCanvasDrawable* drawable) { | 159 void SkRecorder::onDrawDrawable(SkCanvasDrawable* drawable) { |
| 153 if (!fDrawableList) { | 160 if (!fDrawableList) { |
| 154 fDrawableList.reset(SkNEW(SkCanvasDrawableList)); | 161 fDrawableList.reset(SkNEW(SkCanvasDrawableList)); |
| 155 } | 162 } |
| 156 fDrawableList->append(drawable); | 163 fDrawableList->append(drawable); |
| 157 APPEND(DrawDrawable, drawable->getBounds(), fDrawableList->count() - 1); | 164 APPEND(DrawDrawable, drawable->getBounds(), fDrawableList->count() - 1); |
| 158 } | 165 } |
| 159 | 166 |
| 160 void SkRecorder::drawPath(const SkPath& path, const SkPaint& paint) { | 167 void SkRecorder::drawPath(const SkPath& path, const SkPaint& paint) { |
| 161 APPEND(DrawPath, delay_copy(paint), delay_copy(path)); | 168 APPEND(DrawPath, delay_copy(paint), force_path_bounds(path)); |
| 162 } | 169 } |
| 163 | 170 |
| 164 void SkRecorder::drawBitmap(const SkBitmap& bitmap, | 171 void SkRecorder::drawBitmap(const SkBitmap& bitmap, |
| 165 SkScalar left, | 172 SkScalar left, |
| 166 SkScalar top, | 173 SkScalar top, |
| 167 const SkPaint* paint) { | 174 const SkPaint* paint) { |
| 168 APPEND(DrawBitmap, this->copy(paint), delay_copy(bitmap), left, top); | 175 APPEND(DrawBitmap, this->copy(paint), delay_copy(bitmap), left, top); |
| 169 } | 176 } |
| 170 | 177 |
| 171 void SkRecorder::drawBitmapRectToRect(const SkBitmap& bitmap, | 178 void SkRecorder::drawBitmapRectToRect(const SkBitmap& bitmap, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 constY, | 244 constY, |
| 238 this->copy(xpos, points)); | 245 this->copy(xpos, points)); |
| 239 } | 246 } |
| 240 | 247 |
| 241 void SkRecorder::onDrawTextOnPath(const void* text, size_t byteLength, const SkP
ath& path, | 248 void SkRecorder::onDrawTextOnPath(const void* text, size_t byteLength, const SkP
ath& path, |
| 242 const SkMatrix* matrix, const SkPaint& paint)
{ | 249 const SkMatrix* matrix, const SkPaint& paint)
{ |
| 243 APPEND(DrawTextOnPath, | 250 APPEND(DrawTextOnPath, |
| 244 delay_copy(paint), | 251 delay_copy(paint), |
| 245 this->copy((const char*)text, byteLength), | 252 this->copy((const char*)text, byteLength), |
| 246 byteLength, | 253 byteLength, |
| 247 delay_copy(path), | 254 force_path_bounds(path), |
| 248 this->copy(matrix)); | 255 this->copy(matrix)); |
| 249 } | 256 } |
| 250 | 257 |
| 251 void SkRecorder::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, | 258 void SkRecorder::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, |
| 252 const SkPaint& paint) { | 259 const SkPaint& paint) { |
| 253 APPEND(DrawTextBlob, delay_copy(paint), blob, x, y); | 260 APPEND(DrawTextBlob, delay_copy(paint), blob, x, y); |
| 254 } | 261 } |
| 255 | 262 |
| 256 void SkRecorder::onDrawPicture(const SkPicture* pic, const SkMatrix* matrix, con
st SkPaint* paint) { | 263 void SkRecorder::onDrawPicture(const SkPicture* pic, const SkMatrix* matrix, con
st SkPaint* paint) { |
| 257 APPEND(DrawPicture, this->copy(paint), pic, this->copy(matrix)); | 264 APPEND(DrawPicture, this->copy(paint), pic, this->copy(matrix)); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 334 | 341 |
| 335 void SkRecorder::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyl
e edgeStyle) { | 342 void SkRecorder::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyl
e edgeStyle) { |
| 336 INHERITED(onClipRRect, rrect, op, edgeStyle); | 343 INHERITED(onClipRRect, rrect, op, edgeStyle); |
| 337 SkRecords::RegionOpAndAA opAA(op, kSoft_ClipEdgeStyle == edgeStyle); | 344 SkRecords::RegionOpAndAA opAA(op, kSoft_ClipEdgeStyle == edgeStyle); |
| 338 APPEND(ClipRRect, this->devBounds(), rrect, opAA); | 345 APPEND(ClipRRect, this->devBounds(), rrect, opAA); |
| 339 } | 346 } |
| 340 | 347 |
| 341 void SkRecorder::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle e
dgeStyle) { | 348 void SkRecorder::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle e
dgeStyle) { |
| 342 INHERITED(onClipPath, path, op, edgeStyle); | 349 INHERITED(onClipPath, path, op, edgeStyle); |
| 343 SkRecords::RegionOpAndAA opAA(op, kSoft_ClipEdgeStyle == edgeStyle); | 350 SkRecords::RegionOpAndAA opAA(op, kSoft_ClipEdgeStyle == edgeStyle); |
| 344 APPEND(ClipPath, this->devBounds(), delay_copy(path), opAA); | 351 APPEND(ClipPath, this->devBounds(), force_path_bounds(path), opAA); |
| 345 } | 352 } |
| 346 | 353 |
| 347 void SkRecorder::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { | 354 void SkRecorder::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { |
| 348 INHERITED(onClipRegion, deviceRgn, op); | 355 INHERITED(onClipRegion, deviceRgn, op); |
| 349 APPEND(ClipRegion, this->devBounds(), delay_copy(deviceRgn), op); | 356 APPEND(ClipRegion, this->devBounds(), delay_copy(deviceRgn), op); |
| 350 } | 357 } |
| 351 | 358 |
| 352 void SkRecorder::beginCommentGroup(const char* description) { | 359 void SkRecorder::beginCommentGroup(const char* description) { |
| 353 APPEND(BeginCommentGroup, this->copy(description)); | 360 APPEND(BeginCommentGroup, this->copy(description)); |
| 354 } | 361 } |
| 355 | 362 |
| 356 void SkRecorder::addComment(const char* key, const char* value) { | 363 void SkRecorder::addComment(const char* key, const char* value) { |
| 357 APPEND(AddComment, this->copy(key), this->copy(value)); | 364 APPEND(AddComment, this->copy(key), this->copy(value)); |
| 358 } | 365 } |
| 359 | 366 |
| 360 void SkRecorder::endCommentGroup() { | 367 void SkRecorder::endCommentGroup() { |
| 361 APPEND(EndCommentGroup); | 368 APPEND(EndCommentGroup); |
| 362 } | 369 } |
| 363 | 370 |
| 364 bool SkRecorder::isDrawingToLayer() const { | 371 bool SkRecorder::isDrawingToLayer() const { |
| 365 return fSaveLayerCount > 0; | 372 return fSaveLayerCount > 0; |
| 366 } | 373 } |
| 367 | 374 |
| 368 void SkRecorder::drawData(const void* data, size_t length) { | 375 void SkRecorder::drawData(const void* data, size_t length) { |
| 369 APPEND(DrawData, copy((const char*)data), length); | 376 APPEND(DrawData, copy((const char*)data), length); |
| 370 } | 377 } |
| OLD | NEW |