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

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

Issue 640773004: Add clip to layer cache (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: clean up 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') | tests/GpuLayerCacheTest.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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 void trackSaveLayers(const SkRecords::SaveLayer& sl) { this->pushSaveLayerBl ock(sl.paint); } 101 void trackSaveLayers(const SkRecords::SaveLayer& sl) { this->pushSaveLayerBl ock(sl.paint); }
102 void trackSaveLayers(const SkRecords::Restore& r) { this->popSaveBlock(); } 102 void trackSaveLayers(const SkRecords::Restore& r) { this->popSaveBlock(); }
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 SkRect srcRect = SkRect::Make(src.fBounds);
112 SkIRect newClip(fCurrentClipBounds);
113
114 if (!newClip.intersect(this->adjustAndMap(srcRect, dp.paint))) {
115 continue;
116 }
117
111 this->updateStackForSaveLayer(); 118 this->updateStackForSaveLayer();
112 119
113 // TODO: need to store an SkRect in GrAccelData::SaveLayerInfo?
114 SkRect srcRect = SkRect::MakeXYWH(SkIntToScalar(src.fOffset.fX),
115 SkIntToScalar(src.fOffset.fY),
116 SkIntToScalar(src.fSize.width()),
117 SkIntToScalar(src.fSize.height())) ;
118 SkIRect newClip(fCurrentClipBounds);
119 newClip.intersect(this->adjustAndMap(srcRect, dp.paint));
120
121 GrAccelData::SaveLayerInfo& dst = fAccelData->addSaveLayerInfo(); 120 GrAccelData::SaveLayerInfo& dst = fAccelData->addSaveLayerInfo();
122 121
123 // If src.fPicture is NULL the layer is in dp.picture; otherwise 122 // If src.fPicture is NULL the layer is in dp.picture; otherwise
124 // it belongs to a sub-picture. 123 // it belongs to a sub-picture.
125 dst.fPicture = src.fPicture ? src.fPicture : static_cast<const SkPic ture*>(dp.picture); 124 dst.fPicture = src.fPicture ? src.fPicture : static_cast<const SkPic ture*>(dp.picture);
126 dst.fPicture->ref(); 125 dst.fPicture->ref();
127 dst.fSize = SkISize::Make(newClip.width(), newClip.height()); 126 dst.fBounds = newClip;
128 dst.fOffset = SkIPoint::Make(newClip.fLeft, newClip.fTop);
129 dst.fOriginXform = src.fOriginXform; 127 dst.fOriginXform = src.fOriginXform;
130 dst.fOriginXform.postConcat(*fCTM); 128 dst.fOriginXform.postConcat(*fCTM);
131 if (src.fPaint) { 129 if (src.fPaint) {
132 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint)); 130 dst.fPaint = SkNEW_ARGS(SkPaint, (*src.fPaint));
133 } 131 }
134 dst.fSaveLayerOpID = src.fSaveLayerOpID; 132 dst.fSaveLayerOpID = src.fSaveLayerOpID;
135 dst.fRestoreOpID = src.fRestoreOpID; 133 dst.fRestoreOpID = src.fRestoreOpID;
136 dst.fHasNestedLayers = src.fHasNestedLayers; 134 dst.fHasNestedLayers = src.fHasNestedLayers;
137 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested; 135 dst.fIsNested = fSaveLayersInStack > 0 || src.fIsNested;
138 } 136 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 172
175 if (!si.fIsSaveLayer) { 173 if (!si.fIsSaveLayer) {
176 return; 174 return;
177 } 175 }
178 176
179 --fSaveLayersInStack; 177 --fSaveLayersInStack;
180 178
181 GrAccelData::SaveLayerInfo& slInfo = fAccelData->addSaveLayerInfo(); 179 GrAccelData::SaveLayerInfo& slInfo = fAccelData->addSaveLayerInfo();
182 180
183 SkASSERT(NULL == slInfo.fPicture); // This layer is in the top-most pic ture 181 SkASSERT(NULL == slInfo.fPicture); // This layer is in the top-most pic ture
184 slInfo.fSize = SkISize::Make(si.fBounds.width(), si.fBounds.height()); 182 slInfo.fBounds = si.fBounds;
185 slInfo.fOffset = SkIPoint::Make(si.fBounds.fLeft, si.fBounds.fTop);
186 slInfo.fOriginXform = *fCTM; 183 slInfo.fOriginXform = *fCTM;
187 if (si.fPaint) { 184 if (si.fPaint) {
188 slInfo.fPaint = SkNEW_ARGS(SkPaint, (*si.fPaint)); 185 slInfo.fPaint = SkNEW_ARGS(SkPaint, (*si.fPaint));
189 } 186 }
190 slInfo.fSaveLayerOpID = si.fStartIndex; 187 slInfo.fSaveLayerOpID = si.fStartIndex;
191 slInfo.fRestoreOpID = fCurrentOp; 188 slInfo.fRestoreOpID = fCurrentOp;
192 slInfo.fHasNestedLayers = si.fHasNestedSaveLayer; 189 slInfo.fHasNestedLayers = si.fHasNestedSaveLayer;
193 slInfo.fIsNested = fSaveLayersInStack > 0; 190 slInfo.fIsNested = fSaveLayersInStack > 0;
194 } 191 }
195 192
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 } 251 }
255 252
256 SkAutoTUnref<GrAccelData> data(SkNEW_ARGS(GrAccelData, (key))); 253 SkAutoTUnref<GrAccelData> data(SkNEW_ARGS(GrAccelData, (key)));
257 254
258 pict->EXPERIMENTAL_addAccelData(data); 255 pict->EXPERIMENTAL_addAccelData(data);
259 256
260 CollectLayers collector(pict, data); 257 CollectLayers collector(pict, data);
261 258
262 return data; 259 return data;
263 } 260 }
OLDNEW
« no previous file with comments | « src/gpu/GrPictureUtils.h ('k') | tests/GpuLayerCacheTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698