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

Side by Side Diff: src/gpu/GrPictureUtils.cpp

Issue 595543002: Update layer hoisting code to correctly render sub-picture layers (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Add cast Created 6 years, 2 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 unified diff | Download patch
« no previous file with comments | « src/gpu/GrPictureUtils.h ('k') | src/gpu/SkGpuDevice.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "GrPictureUtils.h" 8 #include "GrPictureUtils.h"
9 9
10 #include "SkPaintPriv.h" 10 #include "SkPaintPriv.h"
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 void trackSaveLayers(const SkRecords::DrawPicture& dp) { 103 void trackSaveLayers(const SkRecords::DrawPicture& dp) {
104 // For sub-pictures, we wrap their layer information within the parent 104 // For sub-pictures, we wrap their layer information within the parent
105 // picture's rendering hierarchy 105 // picture's rendering hierarchy
106 const GrAccelData* childData = GPUOptimize(dp.picture); 106 const GrAccelData* childData = GPUOptimize(dp.picture);
107 107
108 for (int i = 0; i < childData->numSaveLayers(); ++i) { 108 for (int i = 0; i < childData->numSaveLayers(); ++i) {
109 const GrAccelData::SaveLayerInfo& src = childData->saveLayerInfo(i); 109 const GrAccelData::SaveLayerInfo& src = childData->saveLayerInfo(i);
110 110
111 this->updateStackForSaveLayer(); 111 this->updateStackForSaveLayer();
112 112
113 GrAccelData::SaveLayerInfo dst;
114
115 // TODO: need to store an SkRect in GrAccelData::SaveLayerInfo? 113 // TODO: need to store an SkRect in GrAccelData::SaveLayerInfo?
116 SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(src.fOffset.fX), 114 SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(src.fOffset.fX),
117 SkIntToScalar(src.fOffset.fY), 115 SkIntToScalar(src.fOffset.fY),
118 SkIntToScalar(src.fSize.width()), 116 SkIntToScalar(src.fSize.width()),
119 SkIntToScalar(src.fSize.height())) ; 117 SkIntToScalar(src.fSize.height())) ;
120 SkIRect newClip(fCurrentClipBounds); 118 SkIRect newClip(fCurrentClipBounds);
121 newClip.intersect(this->adjustAndMap(srcRect, dp.paint)); 119 newClip.intersect(this->adjustAndMap(srcRect, dp.paint));
122 120
121 GrAccelData::SaveLayerInfo& dst = fAccelData->addSaveLayerInfo();
122
123 dst.fValid = true; 123 dst.fValid = true;
124 dst.fPictureID = dp.picture->uniqueID(); 124 // If src.fPicture is NULL the layer is in dp.picture; otherwise
125 // it belongs to a sub-picture.
126 dst.fPicture = src.fPicture ? src.fPicture : static_cast<const SkPic ture*>(dp.picture);
127 dst.fPicture->ref();
125 dst.fSize = SkISize::Make(newClip.width(), newClip.height()); 128 dst.fSize = SkISize::Make(newClip.width(), newClip.height());
126 dst.fOffset = SkIPoint::Make(newClip.fLeft, newClip.fTop); 129 dst.fOffset = SkIPoint::Make(newClip.fLeft, newClip.fTop);
127 dst.fOriginXform = *fCTM; 130 dst.fOriginXform = *fCTM;
128 dst.fOriginXform.postConcat(src.fOriginXform); 131 dst.fOriginXform.postConcat(src.fOriginXform);
129 132 if (src.fPaint) {
130 if (NULL == src.fPaint) {
131 dst.fPaint = NULL;
132 } else {
133 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint)); 133 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint));
134 } 134 }
135
136 dst.fSaveLayerOpID = src.fSaveLayerOpID; 135 dst.fSaveLayerOpID = src.fSaveLayerOpID;
137 dst.fRestoreOpID = src.fRestoreOpID; 136 dst.fRestoreOpID = src.fRestoreOpID;
138 dst.fHasNestedLayers = src.fHasNestedLayers; 137 dst.fHasNestedLayers = src.fHasNestedLayers;
139 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested; 138 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested;
140
141 fAccelData->addSaveLayerInfo(dst);
142 } 139 }
143 } 140 }
144 141
145 void pushSaveBlock() { 142 void pushSaveBlock() {
146 fSaveStack.push(SaveInfo(fCurrentOp, false, NULL, SkIRect::MakeEmpty())) ; 143 fSaveStack.push(SaveInfo(fCurrentOp, false, NULL, SkIRect::MakeEmpty())) ;
147 } 144 }
148 145
149 // Inform all the saveLayers already on the stack that they now have a 146 // Inform all the saveLayers already on the stack that they now have a
150 // nested saveLayer inside them 147 // nested saveLayer inside them
151 void updateStackForSaveLayer() { 148 void updateStackForSaveLayer() {
(...skipping 23 matching lines...) Expand all
175 172
176 SaveInfo si; 173 SaveInfo si;
177 fSaveStack.pop(&si); 174 fSaveStack.pop(&si);
178 175
179 if (!si.fIsSaveLayer) { 176 if (!si.fIsSaveLayer) {
180 return; 177 return;
181 } 178 }
182 179
183 --fSaveLayersInStack; 180 --fSaveLayersInStack;
184 181
185 GrAccelData::SaveLayerInfo slInfo; 182 GrAccelData::SaveLayerInfo& slInfo = fAccelData->addSaveLayerInfo();
186 183
187 slInfo.fValid = true; 184 slInfo.fValid = true;
188 slInfo.fPictureID = fPictureID; 185 SkASSERT(NULL == slInfo.fPicture); // This layer is in the top-most pic ture
189 slInfo.fSize = SkISize::Make(si.fBounds.width(), si.fBounds.height()); 186 slInfo.fSize = SkISize::Make(si.fBounds.width(), si.fBounds.height());
190 slInfo.fOffset = SkIPoint::Make(si.fBounds.fLeft, si.fBounds.fTop); 187 slInfo.fOffset = SkIPoint::Make(si.fBounds.fLeft, si.fBounds.fTop);
191 slInfo.fOriginXform = *fCTM; 188 slInfo.fOriginXform = *fCTM;
192 189 if (si.fPaint) {
193 if (NULL == si.fPaint) {
194 slInfo.fPaint = NULL;
195 } else {
196 slInfo.fPaint = SkNEW_ARGS(SkPaint, (*si.fPaint)); 190 slInfo.fPaint = SkNEW_ARGS(SkPaint, (*si.fPaint));
197 } 191 }
198
199 slInfo.fSaveLayerOpID = si.fStartIndex; 192 slInfo.fSaveLayerOpID = si.fStartIndex;
200 slInfo.fRestoreOpID = fCurrentOp; 193 slInfo.fRestoreOpID = fCurrentOp;
201 slInfo.fHasNestedLayers = si.fHasNestedSaveLayer; 194 slInfo.fHasNestedLayers = si.fHasNestedSaveLayer;
202 slInfo.fIsNested = fSaveLayersInStack > 0; 195 slInfo.fIsNested = fSaveLayersInStack > 0;
203
204 fAccelData->addSaveLayerInfo(slInfo);
205 } 196 }
206 197
207 // Returns true if rect was meaningfully adjusted for the effects of paint, 198 // Returns true if rect was meaningfully adjusted for the effects of paint,
208 // false if the paint could affect the rect in unknown ways. 199 // false if the paint could affect the rect in unknown ways.
209 static bool AdjustForPaint(const SkPaint* paint, SkRect* rect) { 200 static bool AdjustForPaint(const SkPaint* paint, SkRect* rect) {
210 if (paint) { 201 if (paint) {
211 if (paint->canComputeFastBounds()) { 202 if (paint->canComputeFastBounds()) {
212 *rect = paint->computeFastBounds(*rect, rect); 203 *rect = paint->computeFastBounds(*rect, rect);
213 return true; 204 return true;
214 } 205 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 } 256 }
266 257
267 SkAutoTUnref<GrAccelData> data(SkNEW_ARGS(GrAccelData, (key))); 258 SkAutoTUnref<GrAccelData> data(SkNEW_ARGS(GrAccelData, (key)));
268 259
269 pict->EXPERIMENTAL_addAccelData(data); 260 pict->EXPERIMENTAL_addAccelData(data);
270 261
271 CollectLayers collector(pict, data); 262 CollectLayers collector(pict, data);
272 263
273 return data; 264 return data;
274 } 265 }
OLDNEW
« no previous file with comments | « src/gpu/GrPictureUtils.h ('k') | src/gpu/SkGpuDevice.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698