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

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

Issue 1068883004: restore clipstack to heap-ptr, so clients can ref it (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 8 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 | « include/core/SkCanvas.h ('k') | tests/CanvasTest.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 2008 The Android Open Source Project 2 * Copyright 2008 The Android Open Source Project
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 "SkCanvas.h" 8 #include "SkCanvas.h"
9 #include "SkCanvasPriv.h" 9 #include "SkCanvasPriv.h"
10 #include "SkBitmapDevice.h" 10 #include "SkBitmapDevice.h"
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 } 226 }
227 }; 227 };
228 228
229 class SkDrawIter : public SkDraw { 229 class SkDrawIter : public SkDraw {
230 public: 230 public:
231 SkDrawIter(SkCanvas* canvas, bool skipEmptyClips = true) { 231 SkDrawIter(SkCanvas* canvas, bool skipEmptyClips = true) {
232 canvas = canvas->canvasForDrawIter(); 232 canvas = canvas->canvasForDrawIter();
233 fCanvas = canvas; 233 fCanvas = canvas;
234 canvas->updateDeviceCMCache(); 234 canvas->updateDeviceCMCache();
235 235
236 fClipStack = &canvas->fClipStack; 236 fClipStack = canvas->fClipStack;
237 fCurrLayer = canvas->fMCRec->fTopLayer; 237 fCurrLayer = canvas->fMCRec->fTopLayer;
238 fSkipEmptyClips = skipEmptyClips; 238 fSkipEmptyClips = skipEmptyClips;
239 } 239 }
240 240
241 bool next() { 241 bool next() {
242 // skip over recs with empty clips 242 // skip over recs with empty clips
243 if (fSkipEmptyClips) { 243 if (fSkipEmptyClips) {
244 while (fCurrLayer && fCurrLayer->fClip.isEmpty()) { 244 while (fCurrLayer && fCurrLayer->fClip.isEmpty()) {
245 fCurrLayer = fCurrLayer->fNext; 245 fCurrLayer = fCurrLayer->fNext;
246 } 246 }
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { 428 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) {
429 fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag) ; 429 fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag) ;
430 fCachedLocalClipBounds.setEmpty(); 430 fCachedLocalClipBounds.setEmpty();
431 fCachedLocalClipBoundsDirty = true; 431 fCachedLocalClipBoundsDirty = true;
432 fAllowSoftClip = true; 432 fAllowSoftClip = true;
433 fAllowSimplifyClip = false; 433 fAllowSimplifyClip = false;
434 fDeviceCMDirty = true; 434 fDeviceCMDirty = true;
435 fSaveCount = 1; 435 fSaveCount = 1;
436 fMetaData = NULL; 436 fMetaData = NULL;
437 437
438 fClipStack.reset(SkNEW(SkClipStack));
439
438 fMCRec = (MCRec*)fMCStack.push_back(); 440 fMCRec = (MCRec*)fMCStack.push_back();
439 new (fMCRec) MCRec(fConservativeRasterClip); 441 new (fMCRec) MCRec(fConservativeRasterClip);
440 442
441 SkASSERT(sizeof(DeviceCM) <= sizeof(fBaseLayerStorage)); 443 SkASSERT(sizeof(DeviceCM) <= sizeof(fBaseLayerStorage));
442 fMCRec->fLayer = (DeviceCM*)fBaseLayerStorage; 444 fMCRec->fLayer = (DeviceCM*)fBaseLayerStorage;
443 new (fBaseLayerStorage) DeviceCM(NULL, NULL, NULL, fConservativeRasterClip); 445 new (fBaseLayerStorage) DeviceCM(NULL, NULL, NULL, fConservativeRasterClip);
444 446
445 fMCRec->fTopLayer = fMCRec->fLayer; 447 fMCRec->fTopLayer = fMCRec->fLayer;
446 448
447 fSurfaceBase = NULL; 449 fSurfaceBase = NULL;
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 734
733 ////////////////////////////////////////////////////////////////////////////// 735 //////////////////////////////////////////////////////////////////////////////
734 736
735 void SkCanvas::updateDeviceCMCache() { 737 void SkCanvas::updateDeviceCMCache() {
736 if (fDeviceCMDirty) { 738 if (fDeviceCMDirty) {
737 const SkMatrix& totalMatrix = this->getTotalMatrix(); 739 const SkMatrix& totalMatrix = this->getTotalMatrix();
738 const SkRasterClip& totalClip = fMCRec->fRasterClip; 740 const SkRasterClip& totalClip = fMCRec->fRasterClip;
739 DeviceCM* layer = fMCRec->fTopLayer; 741 DeviceCM* layer = fMCRec->fTopLayer;
740 742
741 if (NULL == layer->fNext) { // only one layer 743 if (NULL == layer->fNext) { // only one layer
742 layer->updateMC(totalMatrix, totalClip, fClipStack, NULL); 744 layer->updateMC(totalMatrix, totalClip, *fClipStack, NULL);
743 } else { 745 } else {
744 SkRasterClip clip(totalClip); 746 SkRasterClip clip(totalClip);
745 do { 747 do {
746 layer->updateMC(totalMatrix, clip, fClipStack, &clip); 748 layer->updateMC(totalMatrix, clip, *fClipStack, &clip);
747 } while ((layer = layer->fNext) != NULL); 749 } while ((layer = layer->fNext) != NULL);
748 } 750 }
749 fDeviceCMDirty = false; 751 fDeviceCMDirty = false;
750 } 752 }
751 } 753 }
752 754
753 /////////////////////////////////////////////////////////////////////////////// 755 ///////////////////////////////////////////////////////////////////////////////
754 756
755 void SkCanvas::checkForDeferredSave() { 757 void SkCanvas::checkForDeferredSave() {
756 if (fMCRec->fDeferredSaveCount > 0) { 758 if (fMCRec->fDeferredSaveCount > 0) {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 for (int i = 0; i < n; ++i) { 815 for (int i = 0; i < n; ++i) {
814 this->restore(); 816 this->restore();
815 } 817 }
816 } 818 }
817 819
818 void SkCanvas::internalSave() { 820 void SkCanvas::internalSave() {
819 MCRec* newTop = (MCRec*)fMCStack.push_back(); 821 MCRec* newTop = (MCRec*)fMCStack.push_back();
820 new (newTop) MCRec(*fMCRec); // balanced in restore() 822 new (newTop) MCRec(*fMCRec); // balanced in restore()
821 fMCRec = newTop; 823 fMCRec = newTop;
822 824
823 fClipStack.save(); 825 fClipStack->save();
824 } 826 }
825 827
826 static bool bounds_affects_clip(SkCanvas::SaveFlags flags) { 828 static bool bounds_affects_clip(SkCanvas::SaveFlags flags) {
827 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG 829 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
828 return (flags & SkCanvas::kClipToLayer_SaveFlag) != 0; 830 return (flags & SkCanvas::kClipToLayer_SaveFlag) != 0;
829 #else 831 #else
830 return true; 832 return true;
831 #endif 833 #endif
832 } 834 }
833 835
(...skipping 24 matching lines...) Expand all
858 return false; 860 return false;
859 } 861 }
860 } else { // no user bounds, so just use the clip 862 } else { // no user bounds, so just use the clip
861 ir = clipBounds; 863 ir = clipBounds;
862 } 864 }
863 SkASSERT(!ir.isEmpty()); 865 SkASSERT(!ir.isEmpty());
864 866
865 if (bounds_affects_clip(flags)) { 867 if (bounds_affects_clip(flags)) {
866 // Simplify the current clips since they will be applied properly during restore() 868 // Simplify the current clips since they will be applied properly during restore()
867 fCachedLocalClipBoundsDirty = true; 869 fCachedLocalClipBoundsDirty = true;
868 fClipStack.clipDevRect(ir, SkRegion::kReplace_Op); 870 fClipStack->clipDevRect(ir, SkRegion::kReplace_Op);
869 fMCRec->fRasterClip.setRect(ir); 871 fMCRec->fRasterClip.setRect(ir);
870 } 872 }
871 873
872 if (intersection) { 874 if (intersection) {
873 *intersection = ir; 875 *intersection = ir;
874 } 876 }
875 return true; 877 return true;
876 } 878 }
877 879
878 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) { 880 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) {
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 return this->saveLayer(bounds, &tmpPaint, flags); 969 return this->saveLayer(bounds, &tmpPaint, flags);
968 } 970 }
969 } 971 }
970 972
971 void SkCanvas::internalRestore() { 973 void SkCanvas::internalRestore() {
972 SkASSERT(fMCStack.count() != 0); 974 SkASSERT(fMCStack.count() != 0);
973 975
974 fDeviceCMDirty = true; 976 fDeviceCMDirty = true;
975 fCachedLocalClipBoundsDirty = true; 977 fCachedLocalClipBoundsDirty = true;
976 978
977 fClipStack.restore(); 979 fClipStack->restore();
978 980
979 // reserve our layer (if any) 981 // reserve our layer (if any)
980 DeviceCM* layer = fMCRec->fLayer; // may be null 982 DeviceCM* layer = fMCRec->fLayer; // may be null
981 // now detach it from fMCRec so we can pop(). Gets freed after its drawn 983 // now detach it from fMCRec so we can pop(). Gets freed after its drawn
982 fMCRec->fLayer = NULL; 984 fMCRec->fLayer = NULL;
983 985
984 // now do the normal restore() 986 // now do the normal restore()
985 fMCRec->~MCRec(); // balanced in save() 987 fMCRec->~MCRec(); // balanced in save()
986 fMCStack.pop_back(); 988 fMCStack.pop_back();
987 fMCRec = (MCRec*)fMCStack.back(); 989 fMCRec = (MCRec*)fMCStack.back();
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
1254 #ifdef SK_ENABLE_CLIP_QUICKREJECT 1256 #ifdef SK_ENABLE_CLIP_QUICKREJECT
1255 if (SkRegion::kIntersect_Op == op) { 1257 if (SkRegion::kIntersect_Op == op) {
1256 if (fMCRec->fRasterClip.isEmpty()) { 1258 if (fMCRec->fRasterClip.isEmpty()) {
1257 return false; 1259 return false;
1258 } 1260 }
1259 1261
1260 if (this->quickReject(rect)) { 1262 if (this->quickReject(rect)) {
1261 fDeviceCMDirty = true; 1263 fDeviceCMDirty = true;
1262 fCachedLocalClipBoundsDirty = true; 1264 fCachedLocalClipBoundsDirty = true;
1263 1265
1264 fClipStack.clipEmpty(); 1266 fClipStack->clipEmpty();
1265 return fMCRec->fRasterClip.setEmpty(); 1267 return fMCRec->fRasterClip.setEmpty();
1266 } 1268 }
1267 } 1269 }
1268 #endif 1270 #endif
1269 1271
1270 AutoValidateClip avc(this); 1272 AutoValidateClip avc(this);
1271 1273
1272 fDeviceCMDirty = true; 1274 fDeviceCMDirty = true;
1273 fCachedLocalClipBoundsDirty = true; 1275 fCachedLocalClipBoundsDirty = true;
1274 if (!fAllowSoftClip) { 1276 if (!fAllowSoftClip) {
1275 edgeStyle = kHard_ClipEdgeStyle; 1277 edgeStyle = kHard_ClipEdgeStyle;
1276 } 1278 }
1277 1279
1278 if (fMCRec->fMatrix.rectStaysRect()) { 1280 if (fMCRec->fMatrix.rectStaysRect()) {
1279 // for these simpler matrices, we can stay a rect even after applying 1281 // for these simpler matrices, we can stay a rect even after applying
1280 // the matrix. This means we don't have to a) make a path, and b) tell 1282 // the matrix. This means we don't have to a) make a path, and b) tell
1281 // the region code to scan-convert the path, only to discover that it 1283 // the region code to scan-convert the path, only to discover that it
1282 // is really just a rect. 1284 // is really just a rect.
1283 SkRect r; 1285 SkRect r;
1284 1286
1285 fMCRec->fMatrix.mapRect(&r, rect); 1287 fMCRec->fMatrix.mapRect(&r, rect);
1286 fClipStack.clipDevRect(r, op, kSoft_ClipEdgeStyle == edgeStyle); 1288 fClipStack->clipDevRect(r, op, kSoft_ClipEdgeStyle == edgeStyle);
1287 fMCRec->fRasterClip.op(r, this->getBaseLayerSize(), op, kSoft_ClipEdgeSt yle == edgeStyle); 1289 fMCRec->fRasterClip.op(r, this->getBaseLayerSize(), op, kSoft_ClipEdgeSt yle == edgeStyle);
1288 } else { 1290 } else {
1289 // since we're rotated or some such thing, we convert the rect to a path 1291 // since we're rotated or some such thing, we convert the rect to a path
1290 // and clip against that, since it can handle any matrix. However, to 1292 // and clip against that, since it can handle any matrix. However, to
1291 // avoid recursion in the case where we are subclassed (e.g. Pictures) 1293 // avoid recursion in the case where we are subclassed (e.g. Pictures)
1292 // we explicitly call "our" version of clipPath. 1294 // we explicitly call "our" version of clipPath.
1293 SkPath path; 1295 SkPath path;
1294 1296
1295 path.addRect(rect); 1297 path.addRect(rect);
1296 this->SkCanvas::onClipPath(path, op, edgeStyle); 1298 this->SkCanvas::onClipPath(path, op, edgeStyle);
(...skipping 19 matching lines...) Expand all
1316 SkRRect transformedRRect; 1318 SkRRect transformedRRect;
1317 if (rrect.transform(fMCRec->fMatrix, &transformedRRect)) { 1319 if (rrect.transform(fMCRec->fMatrix, &transformedRRect)) {
1318 AutoValidateClip avc(this); 1320 AutoValidateClip avc(this);
1319 1321
1320 fDeviceCMDirty = true; 1322 fDeviceCMDirty = true;
1321 fCachedLocalClipBoundsDirty = true; 1323 fCachedLocalClipBoundsDirty = true;
1322 if (!fAllowSoftClip) { 1324 if (!fAllowSoftClip) {
1323 edgeStyle = kHard_ClipEdgeStyle; 1325 edgeStyle = kHard_ClipEdgeStyle;
1324 } 1326 }
1325 1327
1326 fClipStack.clipDevRRect(transformedRRect, op, kSoft_ClipEdgeStyle == edg eStyle); 1328 fClipStack->clipDevRRect(transformedRRect, op, kSoft_ClipEdgeStyle == ed geStyle);
1327 1329
1328 SkPath devPath; 1330 SkPath devPath;
1329 devPath.addRRect(transformedRRect); 1331 devPath.addRRect(transformedRRect);
1330 1332
1331 rasterclip_path(&fMCRec->fRasterClip, this, devPath, op, kSoft_ClipEdgeS tyle == edgeStyle); 1333 rasterclip_path(&fMCRec->fRasterClip, this, devPath, op, kSoft_ClipEdgeS tyle == edgeStyle);
1332 return; 1334 return;
1333 } 1335 }
1334 1336
1335 SkPath path; 1337 SkPath path;
1336 path.addRRect(rrect); 1338 path.addRRect(rrect);
(...skipping 16 matching lines...) Expand all
1353 #ifdef SK_ENABLE_CLIP_QUICKREJECT 1355 #ifdef SK_ENABLE_CLIP_QUICKREJECT
1354 if (SkRegion::kIntersect_Op == op && !path.isInverseFillType()) { 1356 if (SkRegion::kIntersect_Op == op && !path.isInverseFillType()) {
1355 if (fMCRec->fRasterClip.isEmpty()) { 1357 if (fMCRec->fRasterClip.isEmpty()) {
1356 return false; 1358 return false;
1357 } 1359 }
1358 1360
1359 if (this->quickReject(path.getBounds())) { 1361 if (this->quickReject(path.getBounds())) {
1360 fDeviceCMDirty = true; 1362 fDeviceCMDirty = true;
1361 fCachedLocalClipBoundsDirty = true; 1363 fCachedLocalClipBoundsDirty = true;
1362 1364
1363 fClipStack.clipEmpty(); 1365 fClipStack->clipEmpty();
1364 return fMCRec->fRasterClip.setEmpty(); 1366 return fMCRec->fRasterClip.setEmpty();
1365 } 1367 }
1366 } 1368 }
1367 #endif 1369 #endif
1368 1370
1369 AutoValidateClip avc(this); 1371 AutoValidateClip avc(this);
1370 1372
1371 fDeviceCMDirty = true; 1373 fDeviceCMDirty = true;
1372 fCachedLocalClipBoundsDirty = true; 1374 fCachedLocalClipBoundsDirty = true;
1373 if (!fAllowSoftClip) { 1375 if (!fAllowSoftClip) {
1374 edgeStyle = kHard_ClipEdgeStyle; 1376 edgeStyle = kHard_ClipEdgeStyle;
1375 } 1377 }
1376 1378
1377 SkPath devPath; 1379 SkPath devPath;
1378 path.transform(fMCRec->fMatrix, &devPath); 1380 path.transform(fMCRec->fMatrix, &devPath);
1379 1381
1380 // Check if the transfomation, or the original path itself 1382 // Check if the transfomation, or the original path itself
1381 // made us empty. Note this can also happen if we contained NaN 1383 // made us empty. Note this can also happen if we contained NaN
1382 // values. computing the bounds detects this, and will set our 1384 // values. computing the bounds detects this, and will set our
1383 // bounds to empty if that is the case. (see SkRect::set(pts, count)) 1385 // bounds to empty if that is the case. (see SkRect::set(pts, count))
1384 if (devPath.getBounds().isEmpty()) { 1386 if (devPath.getBounds().isEmpty()) {
1385 // resetting the path will remove any NaN or other wanky values 1387 // resetting the path will remove any NaN or other wanky values
1386 // that might upset our scan converter. 1388 // that might upset our scan converter.
1387 devPath.reset(); 1389 devPath.reset();
1388 } 1390 }
1389 1391
1390 // if we called path.swap() we could avoid a deep copy of this path 1392 // if we called path.swap() we could avoid a deep copy of this path
1391 fClipStack.clipDevPath(devPath, op, kSoft_ClipEdgeStyle == edgeStyle); 1393 fClipStack->clipDevPath(devPath, op, kSoft_ClipEdgeStyle == edgeStyle);
1392 1394
1393 if (fAllowSimplifyClip) { 1395 if (fAllowSimplifyClip) {
1394 bool clipIsAA = getClipStack()->asPath(&devPath); 1396 bool clipIsAA = getClipStack()->asPath(&devPath);
1395 if (clipIsAA) { 1397 if (clipIsAA) {
1396 edgeStyle = kSoft_ClipEdgeStyle; 1398 edgeStyle = kSoft_ClipEdgeStyle;
1397 } 1399 }
1398 1400
1399 op = SkRegion::kReplace_Op; 1401 op = SkRegion::kReplace_Op;
1400 } 1402 }
1401 1403
1402 rasterclip_path(&fMCRec->fRasterClip, this, devPath, op, edgeStyle); 1404 rasterclip_path(&fMCRec->fRasterClip, this, devPath, op, edgeStyle);
1403 } 1405 }
1404 1406
1405 void SkCanvas::clipRegion(const SkRegion& rgn, SkRegion::Op op) { 1407 void SkCanvas::clipRegion(const SkRegion& rgn, SkRegion::Op op) {
1406 this->checkForDeferredSave(); 1408 this->checkForDeferredSave();
1407 this->onClipRegion(rgn, op); 1409 this->onClipRegion(rgn, op);
1408 } 1410 }
1409 1411
1410 void SkCanvas::onClipRegion(const SkRegion& rgn, SkRegion::Op op) { 1412 void SkCanvas::onClipRegion(const SkRegion& rgn, SkRegion::Op op) {
1411 AutoValidateClip avc(this); 1413 AutoValidateClip avc(this);
1412 1414
1413 fDeviceCMDirty = true; 1415 fDeviceCMDirty = true;
1414 fCachedLocalClipBoundsDirty = true; 1416 fCachedLocalClipBoundsDirty = true;
1415 1417
1416 // todo: signal fClipStack that we have a region, and therefore (I guess) 1418 // todo: signal fClipStack that we have a region, and therefore (I guess)
1417 // we have to ignore it, and use the region directly? 1419 // we have to ignore it, and use the region directly?
1418 fClipStack.clipDevRect(rgn.getBounds(), op); 1420 fClipStack->clipDevRect(rgn.getBounds(), op);
1419 1421
1420 fMCRec->fRasterClip.op(rgn, op); 1422 fMCRec->fRasterClip.op(rgn, op);
1421 } 1423 }
1422 1424
1423 #ifdef SK_DEBUG 1425 #ifdef SK_DEBUG
1424 void SkCanvas::validateClip() const { 1426 void SkCanvas::validateClip() const {
1425 // construct clipRgn from the clipstack 1427 // construct clipRgn from the clipstack
1426 const SkBaseDevice* device = this->getDevice(); 1428 const SkBaseDevice* device = this->getDevice();
1427 if (!device) { 1429 if (!device) {
1428 SkASSERT(this->isClipEmpty()); 1430 SkASSERT(this->isClipEmpty());
1429 return; 1431 return;
1430 } 1432 }
1431 1433
1432 SkIRect ir; 1434 SkIRect ir;
1433 ir.set(0, 0, device->width(), device->height()); 1435 ir.set(0, 0, device->width(), device->height());
1434 SkRasterClip tmpClip(ir, fConservativeRasterClip); 1436 SkRasterClip tmpClip(ir, fConservativeRasterClip);
1435 1437
1436 SkClipStack::B2TIter iter(fClipStack); 1438 SkClipStack::B2TIter iter(*fClipStack);
1437 const SkClipStack::Element* element; 1439 const SkClipStack::Element* element;
1438 while ((element = iter.next()) != NULL) { 1440 while ((element = iter.next()) != NULL) {
1439 switch (element->getType()) { 1441 switch (element->getType()) {
1440 case SkClipStack::Element::kRect_Type: 1442 case SkClipStack::Element::kRect_Type:
1441 element->getRect().round(&ir); 1443 element->getRect().round(&ir);
1442 tmpClip.op(ir, element->getOp()); 1444 tmpClip.op(ir, element->getOp());
1443 break; 1445 break;
1444 case SkClipStack::Element::kEmpty_Type: 1446 case SkClipStack::Element::kEmpty_Type:
1445 tmpClip.setEmpty(); 1447 tmpClip.setEmpty();
1446 break; 1448 break;
1447 default: { 1449 default: {
1448 SkPath path; 1450 SkPath path;
1449 element->asPath(&path); 1451 element->asPath(&path);
1450 rasterclip_path(&tmpClip, this, path, element->getOp(), element- >isAA()); 1452 rasterclip_path(&tmpClip, this, path, element->getOp(), element- >isAA());
1451 break; 1453 break;
1452 } 1454 }
1453 } 1455 }
1454 } 1456 }
1455 } 1457 }
1456 #endif 1458 #endif
1457 1459
1458 void SkCanvas::replayClips(ClipVisitor* visitor) const { 1460 void SkCanvas::replayClips(ClipVisitor* visitor) const {
1459 SkClipStack::B2TIter iter(fClipStack); 1461 SkClipStack::B2TIter iter(*fClipStack);
1460 const SkClipStack::Element* element; 1462 const SkClipStack::Element* element;
1461 1463
1462 while ((element = iter.next()) != NULL) { 1464 while ((element = iter.next()) != NULL) {
1463 element->replay(visitor); 1465 element->replay(visitor);
1464 } 1466 }
1465 } 1467 }
1466 1468
1467 /////////////////////////////////////////////////////////////////////////////// 1469 ///////////////////////////////////////////////////////////////////////////////
1468 1470
1469 bool SkCanvas::isClipEmpty() const { 1471 bool SkCanvas::isClipEmpty() const {
(...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after
2517 } 2519 }
2518 2520
2519 if (matrix) { 2521 if (matrix) {
2520 canvas->concat(*matrix); 2522 canvas->concat(*matrix);
2521 } 2523 }
2522 } 2524 }
2523 2525
2524 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { 2526 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() {
2525 fCanvas->restoreToCount(fSaveCount); 2527 fCanvas->restoreToCount(fSaveCount);
2526 } 2528 }
OLDNEW
« no previous file with comments | « include/core/SkCanvas.h ('k') | tests/CanvasTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698