diff options
author | 2014-09-24 08:52:18 -0700 | |
---|---|---|
committer | 2014-09-24 08:52:19 -0700 | |
commit | 30d2cc6ff47cb7f981d83e9a536971beec920f61 (patch) | |
tree | 279ab6885df001b92be3ebb2ff696e76c99f471f /src/gpu/GrPictureUtils.cpp | |
parent | 34a9895baf8b2bf95c4f6944a7914be1a74f1524 (diff) |
Update layer hoisting code to correctly render sub-picture layers
The prior code assumed all layers came from a single picture.
BUG=skia:2315
R=bsalomon@google.com
Author: robertphillips@google.com
Review URL: https://codereview.chromium.org/595543002
Diffstat (limited to 'src/gpu/GrPictureUtils.cpp')
-rw-r--r-- | src/gpu/GrPictureUtils.cpp | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/src/gpu/GrPictureUtils.cpp b/src/gpu/GrPictureUtils.cpp index 0cc1f1e065..a4f32e7e02 100644 --- a/src/gpu/GrPictureUtils.cpp +++ b/src/gpu/GrPictureUtils.cpp @@ -110,8 +110,6 @@ private: this->updateStackForSaveLayer(); - GrAccelData::SaveLayerInfo dst; - // TODO: need to store an SkRect in GrAccelData::SaveLayerInfo? SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(src.fOffset.fX), SkIntToScalar(src.fOffset.fY), @@ -120,25 +118,24 @@ private: SkIRect newClip(fCurrentClipBounds); newClip.intersect(this->adjustAndMap(srcRect, dp.paint)); + GrAccelData::SaveLayerInfo& dst = fAccelData->addSaveLayerInfo(); + dst.fValid = true; - dst.fPictureID = dp.picture->uniqueID(); + // If src.fPicture is NULL the layer is in dp.picture; otherwise + // it belongs to a sub-picture. + dst.fPicture = src.fPicture ? src.fPicture : static_cast<const SkPicture*>(dp.picture); + dst.fPicture->ref(); dst.fSize = SkISize::Make(newClip.width(), newClip.height()); dst.fOffset = SkIPoint::Make(newClip.fLeft, newClip.fTop); dst.fOriginXform = *fCTM; dst.fOriginXform.postConcat(src.fOriginXform); - - if (NULL == src.fPaint) { - dst.fPaint = NULL; - } else { + if (src.fPaint) { dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint)); } - dst.fSaveLayerOpID = src.fSaveLayerOpID; dst.fRestoreOpID = src.fRestoreOpID; dst.fHasNestedLayers = src.fHasNestedLayers; dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested; - - fAccelData->addSaveLayerInfo(dst); } } @@ -182,26 +179,20 @@ private: --fSaveLayersInStack; - GrAccelData::SaveLayerInfo slInfo; + GrAccelData::SaveLayerInfo& slInfo = fAccelData->addSaveLayerInfo(); slInfo.fValid = true; - slInfo.fPictureID = fPictureID; + SkASSERT(NULL == slInfo.fPicture); // This layer is in the top-most picture slInfo.fSize = SkISize::Make(si.fBounds.width(), si.fBounds.height()); slInfo.fOffset = SkIPoint::Make(si.fBounds.fLeft, si.fBounds.fTop); slInfo.fOriginXform = *fCTM; - - if (NULL == si.fPaint) { - slInfo.fPaint = NULL; - } else { + if (si.fPaint) { slInfo.fPaint = SkNEW_ARGS(SkPaint, (*si.fPaint)); } - slInfo.fSaveLayerOpID = si.fStartIndex; slInfo.fRestoreOpID = fCurrentOp; slInfo.fHasNestedLayers = si.fHasNestedSaveLayer; slInfo.fIsNested = fSaveLayersInStack > 0; - - fAccelData->addSaveLayerInfo(slInfo); } // Returns true if rect was meaningfully adjusted for the effects of paint, |