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

Side by Side Diff: src/core/SkRecordDraw.cpp

Issue 1308703007: Fix filter primitive bounds computations. (Closed) Base URL: https://skia.googlesource.com/skia.git@saveLayer-bounds-not-transformed
Patch Set: Fix comment style; remove useless param names Created 5 years 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/core/SkMatrixImageFilter.cpp ('k') | src/effects/SkBlurImageFilter.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 "SkLayerInfo.h" 8 #include "SkLayerInfo.h"
9 #include "SkRecordDraw.h" 9 #include "SkRecordDraw.h"
10 #include "SkPatchUtils.h" 10 #include "SkPatchUtils.h"
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 } 214 }
215 215
216 return rect; 216 return rect;
217 } 217 }
218 218
219 private: 219 private:
220 struct SaveBounds { 220 struct SaveBounds {
221 int controlOps; // Number of control ops in this Save block, incl uding the Save. 221 int controlOps; // Number of control ops in this Save block, incl uding the Save.
222 Bounds bounds; // Bounds of everything in the block. 222 Bounds bounds; // Bounds of everything in the block.
223 const SkPaint* paint; // Unowned. If set, adjusts the bounds of all op s in this block. 223 const SkPaint* paint; // Unowned. If set, adjusts the bounds of all op s in this block.
224 SkMatrix ctm;
224 }; 225 };
225 226
226 // Only Restore, SetMatrix, and Concat change the CTM. 227 // Only Restore, SetMatrix, and Concat change the CTM.
227 template <typename T> void updateCTM(const T&) {} 228 template <typename T> void updateCTM(const T&) {}
228 void updateCTM(const Restore& op) { fCTM = op.matrix; } 229 void updateCTM(const Restore& op) { fCTM = op.matrix; }
229 void updateCTM(const SetMatrix& op) { fCTM = op.matrix; } 230 void updateCTM(const SetMatrix& op) { fCTM = op.matrix; }
230 void updateCTM(const Concat& op) { fCTM.preConcat(op.matrix); } 231 void updateCTM(const Concat& op) { fCTM.preConcat(op.matrix); }
231 232
232 // Most ops don't change the clip. 233 // Most ops don't change the clip.
233 template <typename T> void updateClipBounds(const T&) {} 234 template <typename T> void updateClipBounds(const T&) {}
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 295
295 void pushSaveBlock(const SkPaint* paint) { 296 void pushSaveBlock(const SkPaint* paint) {
296 // Starting a new Save block. Push a new entry to represent that. 297 // Starting a new Save block. Push a new entry to represent that.
297 SaveBounds sb; 298 SaveBounds sb;
298 sb.controlOps = 0; 299 sb.controlOps = 0;
299 // If the paint affects transparent black, the bound shouldn't be smalle r 300 // If the paint affects transparent black, the bound shouldn't be smalle r
300 // than the current clip bounds. 301 // than the current clip bounds.
301 sb.bounds = 302 sb.bounds =
302 PaintMayAffectTransparentBlack(paint) ? fCurrentClipBounds : Bounds: :MakeEmpty(); 303 PaintMayAffectTransparentBlack(paint) ? fCurrentClipBounds : Bounds: :MakeEmpty();
303 sb.paint = paint; 304 sb.paint = paint;
305 sb.ctm = this->fCTM;
304 306
305 fSaveStack.push(sb); 307 fSaveStack.push(sb);
306 this->pushControl(); 308 this->pushControl();
307 } 309 }
308 310
309 static bool PaintMayAffectTransparentBlack(const SkPaint* paint) { 311 static bool PaintMayAffectTransparentBlack(const SkPaint* paint) {
310 if (paint) { 312 if (paint) {
311 // FIXME: this is very conservative 313 // FIXME: this is very conservative
312 if (paint->getImageFilter() || paint->getColorFilter()) { 314 if (paint->getImageFilter() || paint->getColorFilter()) {
313 return true; 315 return true;
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 *rect = paint->computeFastBounds(*rect, rect); 558 *rect = paint->computeFastBounds(*rect, rect);
557 return true; 559 return true;
558 } 560 }
559 return false; 561 return false;
560 } 562 }
561 return true; 563 return true;
562 } 564 }
563 565
564 bool adjustForSaveLayerPaints(SkRect* rect, int savesToIgnore = 0) const { 566 bool adjustForSaveLayerPaints(SkRect* rect, int savesToIgnore = 0) const {
565 for (int i = fSaveStack.count() - 1 - savesToIgnore; i >= 0; i--) { 567 for (int i = fSaveStack.count() - 1 - savesToIgnore; i >= 0; i--) {
568 SkMatrix inverse;
569 if (!fSaveStack[i].ctm.invert(&inverse)) {
570 return false;
571 }
572 inverse.mapRect(rect);
566 if (!AdjustForPaint(fSaveStack[i].paint, rect)) { 573 if (!AdjustForPaint(fSaveStack[i].paint, rect)) {
567 return false; 574 return false;
568 } 575 }
576 fSaveStack[i].ctm.mapRect(rect);
mtklein 2015/12/09 16:59:41 Is it important that we do rect = (M (M^-1 rect))
mtklein 2015/12/09 17:00:53 (Or put (M^-1 rect) into another SkRect instead of
Stephen White 2015/12/09 17:02:57 The problem is that we don't know the rect at save
mtklein 2015/12/09 17:06:04 So, (*rect at line 577) != (*rect at line 571)?
Stephen White 2015/12/09 17:10:52 Yeah. It may have been munged by AdjustForPaint().
mtklein 2015/12/09 17:15:25 Oh, of course. That's the whole point of this met
569 } 577 }
570 return true; 578 return true;
571 } 579 }
572 580
573 const int fNumRecords; 581 const int fNumRecords;
574 582
575 // We do not guarantee anything for operations outside of the cull rect 583 // We do not guarantee anything for operations outside of the cull rect
576 const SkRect fCullRect; 584 const SkRect fCullRect;
577 585
578 // Conservative identity-space bounds for each op in the SkRecord. 586 // Conservative identity-space bounds for each op in the SkRecord.
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record, SkRec t bounds[], 808 void SkRecordComputeLayers(const SkRect& cullRect, const SkRecord& record, SkRec t bounds[],
801 const SkBigPicture::SnapshotArray* pictList, SkLayerI nfo* data) { 809 const SkBigPicture::SnapshotArray* pictList, SkLayerI nfo* data) {
802 SkRecords::CollectLayers visitor(cullRect, record, bounds, pictList, data); 810 SkRecords::CollectLayers visitor(cullRect, record, bounds, pictList, data);
803 for (int curOp = 0; curOp < record.count(); curOp++) { 811 for (int curOp = 0; curOp < record.count(); curOp++) {
804 visitor.setCurrentOp(curOp); 812 visitor.setCurrentOp(curOp);
805 record.visit<void>(curOp, visitor); 813 record.visit<void>(curOp, visitor);
806 } 814 }
807 visitor.cleanUp(); 815 visitor.cleanUp();
808 } 816 }
809 817
OLDNEW
« no previous file with comments | « src/core/SkMatrixImageFilter.cpp ('k') | src/effects/SkBlurImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698