Chromium Code Reviews| Index: src/core/SkPicture.cpp |
| diff --git a/src/core/SkPicture.cpp b/src/core/SkPicture.cpp |
| index 7120f611791d1632b7dc2ccb2c800d44da868756..ae82988c2608a47143d9ccfc672cd5da015119dc 100644 |
| --- a/src/core/SkPicture.cpp |
| +++ b/src/core/SkPicture.cpp |
| @@ -130,26 +130,24 @@ SkPicture::SkPicture() |
| fWidth = fHeight = 0; |
| } |
| -// This method makes a SkPicturePlayback object from an in-progress recording. |
| -// Unfortunately, it does not include the restoreToCount of a real endRecording |
| -// call. |
| -SkPicturePlayback* SkPicture::FakeEndRecording(const SkPicture* resourceSrc, |
| - const SkPictureRecord& record) { |
| - SkPictInfo info; |
| - resourceSrc->createHeader(&info); |
| +SkPicture::SkPicture(int width, int height, |
| + SkPictureRecord& record, |
| + bool deepCopyOps) |
| + : fAccelData(NULL) |
|
mtklein
2014/06/11 15:31:49
GCC whined at me that fWidth and fHeight should co
robertphillips
2014/06/11 17:06:50
Done.
|
| + , fWidth(width) |
| + , fHeight(height) { |
| + this->needsNewGenID(); |
| - // FakeEndRecording is only called from partialReplay. For that use case |
| - // we cannot be certain that the next call to SkWriter32::overwriteTAt |
| - // will be preceded by an append (i.e., that the required copy on write |
| - // will occur). In this case just force a deep copy of the operations. |
| - const bool deepCopyOps = true; |
| - return SkNEW_ARGS(SkPicturePlayback, (resourceSrc, record, info, deepCopyOps)); |
| + fPathHeap.reset(SkSafeRef(record.pathHeap())); |
|
mtklein
2014/06/11 15:30:21
Is it just me or is it weird to have the path heap
robertphillips
2014/06/11 17:06:49
Yep - that is probably my next move (i.e., moving
|
| + |
| + SkPictInfo info; |
| + this->createHeader(&info); |
| + fPlayback = SkNEW_ARGS(SkPicturePlayback, (this, record, info, deepCopyOps)); |
| } |
| SkPicture::SkPicture(const SkPicture& src) |
| : INHERITED() |
| - , fAccelData(NULL) |
| - , fContentInfo(src.fContentInfo) { |
| + , fAccelData(NULL) { |
| this->needsNewGenID(); |
| fWidth = src.fWidth; |
| fHeight = src.fHeight; |
| @@ -209,7 +207,6 @@ void SkPicture::swap(SkPicture& other) { |
| SkTSwap(fWidth, other.fWidth); |
| SkTSwap(fHeight, other.fHeight); |
| fPathHeap.swap(&other.fPathHeap); |
| - fContentInfo.swap(&other.fContentInfo); |
| } |
| SkPicture* SkPicture::clone() const { |
| @@ -228,7 +225,6 @@ void SkPicture::clone(SkPicture* pictures, int count) const { |
| clone->fWidth = fWidth; |
| clone->fHeight = fHeight; |
| SkDELETE(clone->fPlayback); |
| - clone->fContentInfo.set(fContentInfo); |
| /* We want to copy the src's playback. However, if that hasn't been built |
| yet, we need to fake a call to endRecording() without actually calling |
| @@ -524,23 +520,14 @@ void SkPicture::flatten(SkWriteBuffer& buffer) const { |
| #if SK_SUPPORT_GPU |
| bool SkPicture::suitableForGpuRasterization(GrContext* context, const char **reason) const { |
| - // TODO: the heuristic used here needs to be refined |
| - static const int kNumPaintWithPathEffectUsesTol = 1; |
| - static const int kNumAAConcavePaths = 5; |
| - |
| - SkASSERT(this->numAAHairlineConcavePaths() <= this->numAAConcavePaths()); |
| - |
| - bool ret = this->numPaintWithPathEffectUses() < kNumPaintWithPathEffectUsesTol && |
| - (this->numAAConcavePaths()-this->numAAHairlineConcavePaths()) < kNumAAConcavePaths; |
| - if (!ret && reason) { |
| - if (this->numPaintWithPathEffectUses() >= kNumPaintWithPathEffectUsesTol) |
| - *reason = "Too many path effects."; |
| - else if ((this->numAAConcavePaths()-this->numAAHairlineConcavePaths()) >= kNumAAConcavePaths) |
| - *reason = "Too many anti-aliased concave paths."; |
| - else |
| - *reason = "Unknown reason for GPU unsuitability."; |
| + if (NULL == fPlayback) { |
| + if (NULL != reason) { |
| + *reason = "Missing playback object."; |
| + } |
| + return false; |
| } |
| - return ret; |
| + |
| + return fPlayback->suitableForGpuRasterization(context, reason); |
| } |
| #endif |