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

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

Issue 996233002: Simplify clip inside a layer -- will be applied in restore (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: add assert Created 5 years, 9 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 | « no previous file | 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 "SkCanvas.h" 8 #include "SkCanvas.h"
9 #include "SkCanvasPriv.h" 9 #include "SkCanvasPriv.h"
10 #include "SkBitmapDevice.h" 10 #include "SkBitmapDevice.h"
(...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG 826 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
827 return (flags & SkCanvas::kClipToLayer_SaveFlag) != 0; 827 return (flags & SkCanvas::kClipToLayer_SaveFlag) != 0;
828 #else 828 #else
829 return true; 829 return true;
830 #endif 830 #endif
831 } 831 }
832 832
833 bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, 833 bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags,
834 SkIRect* intersection, const SkImageFilter* imageF ilter) { 834 SkIRect* intersection, const SkImageFilter* imageF ilter) {
835 SkIRect clipBounds; 835 SkIRect clipBounds;
836 SkRegion::Op op = SkRegion::kIntersect_Op;
837 if (!this->getClipDeviceBounds(&clipBounds)) { 836 if (!this->getClipDeviceBounds(&clipBounds)) {
838 return false; 837 return false;
839 } 838 }
840 839
841 const SkMatrix& ctm = fMCRec->fMatrix; // this->getTotalMatrix() 840 const SkMatrix& ctm = fMCRec->fMatrix; // this->getTotalMatrix()
842 841
843 if (imageFilter) { 842 if (imageFilter) {
844 imageFilter->filterBounds(clipBounds, ctm, &clipBounds); 843 imageFilter->filterBounds(clipBounds, ctm, &clipBounds);
845 // Filters may grow the bounds beyond the device bounds.
846 op = SkRegion::kReplace_Op;
847 } 844 }
848 SkIRect ir; 845 SkIRect ir;
849 if (bounds) { 846 if (bounds) {
850 SkRect r; 847 SkRect r;
851 848
852 ctm.mapRect(&r, *bounds); 849 ctm.mapRect(&r, *bounds);
853 r.roundOut(&ir); 850 r.roundOut(&ir);
854 // early exit if the layer's bounds are clipped out 851 // early exit if the layer's bounds are clipped out
855 if (!ir.intersect(clipBounds)) { 852 if (!ir.intersect(clipBounds)) {
856 if (bounds_affects_clip(flags)) { 853 if (bounds_affects_clip(flags)) {
857 fCachedLocalClipBoundsDirty = true; 854 fCachedLocalClipBoundsDirty = true;
858 fMCRec->fRasterClip.setEmpty(); 855 fMCRec->fRasterClip.setEmpty();
859 } 856 }
860 return false; 857 return false;
861 } 858 }
862 } else { // no user bounds, so just use the clip 859 } else { // no user bounds, so just use the clip
863 ir = clipBounds; 860 ir = clipBounds;
864 } 861 }
862 SkASSERT(!ir.isEmpty());
865 863
866 if (bounds_affects_clip(flags)) { 864 if (bounds_affects_clip(flags)) {
865 // Simplify the current clips since they will be applied properly during restore()
867 fCachedLocalClipBoundsDirty = true; 866 fCachedLocalClipBoundsDirty = true;
868 fClipStack->clipDevRect(ir, op); 867 fClipStack->clipDevRect(ir, SkRegion::kReplace_Op);
869 // early exit if the clip is now empty 868 fMCRec->fRasterClip.setRect(ir);
870 if (!fMCRec->fRasterClip.op(ir, op)) {
871 return false;
872 }
873 } 869 }
874 870
875 if (intersection) { 871 if (intersection) {
876 *intersection = ir; 872 *intersection = ir;
877 } 873 }
878 return true; 874 return true;
879 } 875 }
880 876
881 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) { 877 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) {
882 if (gIgnoreSaveLayerBounds) { 878 if (gIgnoreSaveLayerBounds) {
(...skipping 1643 matching lines...) Expand 10 before | Expand all | Expand 10 after
2526 } 2522 }
2527 2523
2528 if (matrix) { 2524 if (matrix) {
2529 canvas->concat(*matrix); 2525 canvas->concat(*matrix);
2530 } 2526 }
2531 } 2527 }
2532 2528
2533 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { 2529 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() {
2534 fCanvas->restoreToCount(fSaveCount); 2530 fCanvas->restoreToCount(fSaveCount);
2535 } 2531 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698