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

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

Issue 2296703003: test dont-clip-layer (Closed)
Patch Set: update gm bounds Created 4 years, 3 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 | « gm/aaclip.cpp ('k') | no next file » | 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 "SkBitmapDevice.h" 8 #include "SkBitmapDevice.h"
9 #include "SkCanvas.h" 9 #include "SkCanvas.h"
10 #include "SkCanvasPriv.h" 10 #include "SkCanvasPriv.h"
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 void reset(const SkIRect& bounds) { 307 void reset(const SkIRect& bounds) {
308 SkASSERT(fLayer); 308 SkASSERT(fLayer);
309 SkASSERT(fDeferredSaveCount == 0); 309 SkASSERT(fDeferredSaveCount == 0);
310 310
311 fMatrix.reset(); 311 fMatrix.reset();
312 fRasterClip.setRect(bounds); 312 fRasterClip.setRect(bounds);
313 fLayer->reset(bounds); 313 fLayer->reset(bounds);
314 } 314 }
315 }; 315 };
316 316
317 static SkIRect compute_device_bounds(SkBaseDevice* device) {
318 return SkIRect::MakeXYWH(device->getOrigin().x(), device->getOrigin().y(),
319 device->width(), device->height());
320 }
321
317 class SkDrawIter : public SkDraw { 322 class SkDrawIter : public SkDraw {
318 public: 323 public:
319 SkDrawIter(SkCanvas* canvas) { 324 SkDrawIter(SkCanvas* canvas) {
320 canvas = canvas->canvasForDrawIter(); 325 canvas = canvas->canvasForDrawIter();
321 canvas->updateDeviceCMCache(); 326 canvas->updateDeviceCMCache();
322 327
323 fClipStack = canvas->fClipStack; 328 fClipStack = canvas->fClipStack;
324 fCurrLayer = canvas->fMCRec->fTopLayer; 329 fCurrLayer = canvas->fMCRec->fTopLayer;
330
331 fMultiDeviceCS = nullptr;
332 if (fCurrLayer->fNext) {
333 fMultiDeviceCS = canvas->fClipStack;
334 fMultiDeviceCS->save();
335 }
336 }
337
338 ~SkDrawIter() {
339 if (fMultiDeviceCS) {
340 fMultiDeviceCS->restore();
341 }
325 } 342 }
326 343
327 bool next() { 344 bool next() {
345 if (fMultiDeviceCS && fDevice) {
346 // remove the previous device's bounds
347 fMultiDeviceCS->clipDevRect(compute_device_bounds(fDevice),
348 SkRegion::kDifference_Op);
349 }
350
328 // skip over recs with empty clips 351 // skip over recs with empty clips
329 while (fCurrLayer && fCurrLayer->fClip.isEmpty()) { 352 while (fCurrLayer && fCurrLayer->fClip.isEmpty()) {
330 fCurrLayer = fCurrLayer->fNext; 353 fCurrLayer = fCurrLayer->fNext;
331 } 354 }
332 355
333 const DeviceCM* rec = fCurrLayer; 356 const DeviceCM* rec = fCurrLayer;
334 if (rec && rec->fDevice) { 357 if (rec && rec->fDevice) {
335 358
336 fMatrix = rec->fMatrix; 359 fMatrix = rec->fMatrix;
337 fRC = &rec->fClip; 360 fRC = &rec->fClip;
(...skipping 15 matching lines...) Expand all
353 SkBaseDevice* getDevice() const { return fDevice; } 376 SkBaseDevice* getDevice() const { return fDevice; }
354 const SkRasterClip& getClip() const { return *fRC; } 377 const SkRasterClip& getClip() const { return *fRC; }
355 int getX() const { return fDevice->getOrigin().x(); } 378 int getX() const { return fDevice->getOrigin().x(); }
356 int getY() const { return fDevice->getOrigin().y(); } 379 int getY() const { return fDevice->getOrigin().y(); }
357 const SkMatrix& getMatrix() const { return *fMatrix; } 380 const SkMatrix& getMatrix() const { return *fMatrix; }
358 const SkPaint* getPaint() const { return fPaint; } 381 const SkPaint* getPaint() const { return fPaint; }
359 382
360 private: 383 private:
361 const DeviceCM* fCurrLayer; 384 const DeviceCM* fCurrLayer;
362 const SkPaint* fPaint; // May be null. 385 const SkPaint* fPaint; // May be null.
386 SkClipStack* fMultiDeviceCS;
363 387
364 typedef SkDraw INHERITED; 388 typedef SkDraw INHERITED;
365 }; 389 };
366 390
367 ///////////////////////////////////////////////////////////////////////////// 391 /////////////////////////////////////////////////////////////////////////////
368 392
369 static SkPaint* set_if_needed(SkLazyPaint* lazy, const SkPaint& orig) { 393 static SkPaint* set_if_needed(SkLazyPaint* lazy, const SkPaint& orig) {
370 return lazy->isValid() ? lazy->get() : lazy->set(orig); 394 return lazy->isValid() ? lazy->get() : lazy->set(orig);
371 } 395 }
372 396
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 1064
1041 void SkCanvas::internalSave() { 1065 void SkCanvas::internalSave() {
1042 MCRec* newTop = (MCRec*)fMCStack.push_back(); 1066 MCRec* newTop = (MCRec*)fMCStack.push_back();
1043 new (newTop) MCRec(*fMCRec); // balanced in restore() 1067 new (newTop) MCRec(*fMCRec); // balanced in restore()
1044 fMCRec = newTop; 1068 fMCRec = newTop;
1045 1069
1046 fClipStack->save(); 1070 fClipStack->save();
1047 } 1071 }
1048 1072
1049 bool SkCanvas::BoundsAffectsClip(SaveLayerFlags saveLayerFlags) { 1073 bool SkCanvas::BoundsAffectsClip(SaveLayerFlags saveLayerFlags) {
1050 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
1051 return !(saveLayerFlags & SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag); 1074 return !(saveLayerFlags & SkCanvas::kDontClipToLayer_PrivateSaveLayerFlag);
1052 #else
1053 return true;
1054 #endif
1055 } 1075 }
1056 1076
1057 bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveLayerFlags saveLayerFlag s, 1077 bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveLayerFlags saveLayerFlag s,
1058 SkIRect* intersection, const SkImageFilter* imageF ilter) { 1078 SkIRect* intersection, const SkImageFilter* imageF ilter) {
1059 SkIRect clipBounds; 1079 SkIRect clipBounds;
1060 if (!this->getClipDeviceBounds(&clipBounds)) { 1080 if (!this->getClipDeviceBounds(&clipBounds)) {
1061 return false; 1081 return false;
1062 } 1082 }
1063 1083
1064 const SkMatrix& ctm = fMCRec->fMatrix; // this->getTotalMatrix() 1084 const SkMatrix& ctm = fMCRec->fMatrix; // this->getTotalMatrix()
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1161 // keep the same characteristics as the prev 1181 // keep the same characteristics as the prev
1162 return SkImageInfo::Make(w, h, prev.colorType(), alphaType, sk_ref_sp(pr ev.colorSpace())); 1182 return SkImageInfo::Make(w, h, prev.colorType(), alphaType, sk_ref_sp(pr ev.colorSpace()));
1163 } 1183 }
1164 } 1184 }
1165 1185
1166 void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra tegy) { 1186 void SkCanvas::internalSaveLayer(const SaveLayerRec& rec, SaveLayerStrategy stra tegy) {
1167 const SkRect* bounds = rec.fBounds; 1187 const SkRect* bounds = rec.fBounds;
1168 const SkPaint* paint = rec.fPaint; 1188 const SkPaint* paint = rec.fPaint;
1169 SaveLayerFlags saveLayerFlags = rec.fSaveLayerFlags; 1189 SaveLayerFlags saveLayerFlags = rec.fSaveLayerFlags;
1170 1190
1171 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
1172 saveLayerFlags &= ~kDontClipToLayer_PrivateSaveLayerFlag;
1173 #endif
1174
1175 SkLazyPaint lazyP; 1191 SkLazyPaint lazyP;
1176 SkImageFilter* imageFilter = paint ? paint->getImageFilter() : NULL; 1192 SkImageFilter* imageFilter = paint ? paint->getImageFilter() : NULL;
1177 SkMatrix stashedMatrix = fMCRec->fMatrix; 1193 SkMatrix stashedMatrix = fMCRec->fMatrix;
1178 SkMatrix remainder; 1194 SkMatrix remainder;
1179 SkSize scale; 1195 SkSize scale;
1180 /* 1196 /*
1181 * ImageFilters (so far) do not correctly handle matrices (CTM) that contai n rotation/skew/etc. 1197 * ImageFilters (so far) do not correctly handle matrices (CTM) that contai n rotation/skew/etc.
1182 * but they do handle scaling. To accommodate this, we do the following: 1198 * but they do handle scaling. To accommodate this, we do the following:
1183 * 1199 *
1184 * 1. Stash off the current CTM 1200 * 1. Stash off the current CTM
(...skipping 2259 matching lines...) Expand 10 before | Expand all | Expand 10 after
3444 3460
3445 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { 3461 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() {
3446 fCanvas->restoreToCount(fSaveCount); 3462 fCanvas->restoreToCount(fSaveCount);
3447 } 3463 }
3448 3464
3449 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API 3465 #ifdef SK_SUPPORT_LEGACY_NEW_SURFACE_API
3450 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p rops) { 3466 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p rops) {
3451 return this->makeSurface(info, props).release(); 3467 return this->makeSurface(info, props).release();
3452 } 3468 }
3453 #endif 3469 #endif
OLDNEW
« no previous file with comments | « gm/aaclip.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698