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

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

Issue 194923008: Revert "De-virtualize SkCanvas save/restore." (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 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 | Annotate | Revision Log
« no previous file with comments | « src/core/SkBBoxHierarchyRecord.cpp ('k') | src/core/SkPictureRecord.h » ('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 /* 2 /*
3 * Copyright 2008 The Android Open Source Project 3 * Copyright 2008 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 fFilter = canvas->getDrawFilter(); 341 fFilter = canvas->getDrawFilter();
342 fPaint = NULL; 342 fPaint = NULL;
343 fSaveCount = canvas->getSaveCount(); 343 fSaveCount = canvas->getSaveCount();
344 fDoClearImageFilter = false; 344 fDoClearImageFilter = false;
345 fDone = false; 345 fDone = false;
346 346
347 if (!skipLayerForImageFilter && fOrigPaint.getImageFilter()) { 347 if (!skipLayerForImageFilter && fOrigPaint.getImageFilter()) {
348 SkPaint tmp; 348 SkPaint tmp;
349 tmp.setImageFilter(fOrigPaint.getImageFilter()); 349 tmp.setImageFilter(fOrigPaint.getImageFilter());
350 (void)canvas->internalSaveLayer(bounds, &tmp, 350 (void)canvas->internalSaveLayer(bounds, &tmp,
351 SkCanvas::kARGB_ClipLayer_SaveFlag, true, fa lse); 351 SkCanvas::kARGB_ClipLayer_SaveFlag, true);
352 // we'll clear the imageFilter for the actual draws in next(), so 352 // we'll clear the imageFilter for the actual draws in next(), so
353 // it will only be applied during the restore(). 353 // it will only be applied during the restore().
354 fDoClearImageFilter = true; 354 fDoClearImageFilter = true;
355 } 355 }
356 356
357 if (fLooper) { 357 if (fLooper) {
358 fLooper->init(canvas); 358 fLooper->init(canvas);
359 fIsSimple = false; 359 fIsSimple = false;
360 } else { 360 } else {
361 // can we be marked as simple? 361 // can we be marked as simple?
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 799
800 fMCRec = newTop; 800 fMCRec = newTop;
801 801
802 if (SkCanvas::kClip_SaveFlag & flags) { 802 if (SkCanvas::kClip_SaveFlag & flags) {
803 fClipStack.save(); 803 fClipStack.save();
804 } 804 }
805 805
806 return saveCount; 806 return saveCount;
807 } 807 }
808 808
809 void SkCanvas::onSave(SaveFlags) {
810 // Do nothing. Subclasses may do something.
811 }
812
813 int SkCanvas::save(SaveFlags flags) { 809 int SkCanvas::save(SaveFlags flags) {
814 this->onSave(flags);
815 // call shared impl 810 // call shared impl
816 return this->internalSave(flags); 811 return this->internalSave(flags);
817 } 812 }
818 813
819 static bool bounds_affects_clip(SkCanvas::SaveFlags flags) { 814 static bool bounds_affects_clip(SkCanvas::SaveFlags flags) {
820 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG 815 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
821 return (flags & SkCanvas::kClipToLayer_SaveFlag) != 0; 816 return (flags & SkCanvas::kClipToLayer_SaveFlag) != 0;
822 #else 817 #else
823 return true; 818 return true;
824 #endif 819 #endif
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 return false; 856 return false;
862 } 857 }
863 } 858 }
864 859
865 if (intersection) { 860 if (intersection) {
866 *intersection = ir; 861 *intersection = ir;
867 } 862 }
868 return true; 863 return true;
869 } 864 }
870 865
871 bool SkCanvas::onSaveLayer(const SkRect*, const SkPaint*, SaveFlags) {
872 // Do nothing. Subclasses may do something.
873 return true;
874 }
875
876 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, 866 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
877 SaveFlags flags) { 867 SaveFlags flags) {
878 // Overriding classes may return false to signal that we don't need to creat e a layer. 868 return this->internalSaveLayer(bounds, paint, flags, false);
879 bool skipLayer = !this->onSaveLayer(bounds, paint, flags);
880 return this->internalSaveLayer(bounds, paint, flags, false, skipLayer);
881 } 869 }
882 870
883 static SkBaseDevice* createCompatibleDevice(SkCanvas* canvas, 871 static SkBaseDevice* createCompatibleDevice(SkCanvas* canvas,
884 const SkImageInfo& info) { 872 const SkImageInfo& info) {
885 SkBaseDevice* device = canvas->getDevice(); 873 SkBaseDevice* device = canvas->getDevice();
886 return device ? device->createCompatibleDevice(info) : NULL; 874 return device ? device->createCompatibleDevice(info) : NULL;
887 } 875 }
888 876
889 int SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, 877 int SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint,
890 SaveFlags flags, bool justForImageFilter, bool s kipLayer) { 878 SaveFlags flags, bool justForImageFilter) {
891 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG 879 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
892 flags = (SaveFlags)(flags | kClipToLayer_SaveFlag); 880 flags = (SaveFlags)(flags | kClipToLayer_SaveFlag);
893 #endif 881 #endif
894 882
895 // do this before we create the layer. We don't call the public save() since 883 // do this before we create the layer. We don't call the public save() since
896 // that would invoke a possibly overridden virtual 884 // that would invoke a possibly overridden virtual
897 int count = this->internalSave(flags); 885 int count = this->internalSave(flags);
898 886
899 fDeviceCMDirty = true; 887 fDeviceCMDirty = true;
900 888
901 SkIRect ir; 889 SkIRect ir;
902 if (!this->clipRectBounds(bounds, flags, &ir, paint ? paint->getImageFilter( ) : NULL)) { 890 if (!this->clipRectBounds(bounds, flags, &ir, paint ? paint->getImageFilter( ) : NULL)) {
903 return count; 891 return count;
904 } 892 }
905 893
906 // FIXME: do onSaveLayer() overriders returning false really care about the clipRectBounds()
907 // call above?
908 if (skipLayer)
909 return count;
910
911 // Kill the imagefilter if our device doesn't allow it 894 // Kill the imagefilter if our device doesn't allow it
912 SkLazyPaint lazyP; 895 SkLazyPaint lazyP;
913 if (paint && paint->getImageFilter()) { 896 if (paint && paint->getImageFilter()) {
914 if (!this->getTopDevice()->allowImageFilter(paint->getImageFilter())) { 897 if (!this->getTopDevice()->allowImageFilter(paint->getImageFilter())) {
915 if (justForImageFilter) { 898 if (justForImageFilter) {
916 // early exit if the layer was just for the imageFilter 899 // early exit if the layer was just for the imageFilter
917 return count; 900 return count;
918 } 901 }
919 SkPaint* p = lazyP.set(*paint); 902 SkPaint* p = lazyP.set(*paint);
920 p->setImageFilter(NULL); 903 p->setImageFilter(NULL);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 SaveFlags flags) { 936 SaveFlags flags) {
954 if (0xFF == alpha) { 937 if (0xFF == alpha) {
955 return this->saveLayer(bounds, NULL, flags); 938 return this->saveLayer(bounds, NULL, flags);
956 } else { 939 } else {
957 SkPaint tmpPaint; 940 SkPaint tmpPaint;
958 tmpPaint.setAlpha(alpha); 941 tmpPaint.setAlpha(alpha);
959 return this->saveLayer(bounds, &tmpPaint, flags); 942 return this->saveLayer(bounds, &tmpPaint, flags);
960 } 943 }
961 } 944 }
962 945
963 void SkCanvas::onRestore() {
964 // Do nothing. Subclasses may do something.
965 }
966
967 void SkCanvas::restore() { 946 void SkCanvas::restore() {
968 // check for underflow 947 // check for underflow
969 if (fMCStack.count() > 1) { 948 if (fMCStack.count() > 1) {
970 this->onRestore();
971 this->internalRestore(); 949 this->internalRestore();
972 } 950 }
973 } 951 }
974 952
975 void SkCanvas::internalRestore() { 953 void SkCanvas::internalRestore() {
976 SkASSERT(fMCStack.count() != 0); 954 SkASSERT(fMCStack.count() != 0);
977 955
978 fDeviceCMDirty = true; 956 fDeviceCMDirty = true;
979 fCachedLocalClipBoundsDirty = true; 957 fCachedLocalClipBoundsDirty = true;
980 958
(...skipping 1500 matching lines...) Expand 10 before | Expand all | Expand 10 after
2481 if (!bitmap.allocPixels(info)) { 2459 if (!bitmap.allocPixels(info)) {
2482 return NULL; 2460 return NULL;
2483 } 2461 }
2484 2462
2485 // should this functionality be moved into allocPixels()? 2463 // should this functionality be moved into allocPixels()?
2486 if (!bitmap.info().isOpaque()) { 2464 if (!bitmap.info().isOpaque()) {
2487 bitmap.eraseColor(0); 2465 bitmap.eraseColor(0);
2488 } 2466 }
2489 return SkNEW_ARGS(SkCanvas, (bitmap)); 2467 return SkNEW_ARGS(SkCanvas, (bitmap));
2490 } 2468 }
OLDNEW
« no previous file with comments | « src/core/SkBBoxHierarchyRecord.cpp ('k') | src/core/SkPictureRecord.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698