| OLD | NEW |
| 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 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 fCanvas = canvas; | 340 fCanvas = canvas; |
| 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, SkCanvas::kARGB_ClipLa
yer_SaveFlag, |
| 351 SkCanvas::kARGB_ClipLayer_SaveFlag, true); | 351 true, SkCanvas::kFullLayer_SaveLayer
Strategy); |
| 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 (SkDrawLooper* looper = paint.getLooper()) { | 357 if (SkDrawLooper* looper = paint.getLooper()) { |
| 358 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex
t>( | 358 void* buffer = fLooperContextAllocator.reserveT<SkDrawLooper::Contex
t>( |
| 359 looper->contextSize()); | 359 looper->contextSize()); |
| 360 fLooperContext = looper->createContext(canvas, buffer); | 360 fLooperContext = looper->createContext(canvas, buffer); |
| 361 fIsSimple = false; | 361 fIsSimple = false; |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 | 803 |
| 804 fMCRec = newTop; | 804 fMCRec = newTop; |
| 805 | 805 |
| 806 if (SkCanvas::kClip_SaveFlag & flags) { | 806 if (SkCanvas::kClip_SaveFlag & flags) { |
| 807 fClipStack.save(); | 807 fClipStack.save(); |
| 808 } | 808 } |
| 809 | 809 |
| 810 return saveCount; | 810 return saveCount; |
| 811 } | 811 } |
| 812 | 812 |
| 813 void SkCanvas::willSave(SaveFlags) { |
| 814 // Do nothing. Subclasses may do something. |
| 815 } |
| 816 |
| 813 int SkCanvas::save(SaveFlags flags) { | 817 int SkCanvas::save(SaveFlags flags) { |
| 818 this->willSave(flags); |
| 814 // call shared impl | 819 // call shared impl |
| 815 return this->internalSave(flags); | 820 return this->internalSave(flags); |
| 816 } | 821 } |
| 817 | 822 |
| 818 static bool bounds_affects_clip(SkCanvas::SaveFlags flags) { | 823 static bool bounds_affects_clip(SkCanvas::SaveFlags flags) { |
| 819 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG | 824 #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
| 820 return (flags & SkCanvas::kClipToLayer_SaveFlag) != 0; | 825 return (flags & SkCanvas::kClipToLayer_SaveFlag) != 0; |
| 821 #else | 826 #else |
| 822 return true; | 827 return true; |
| 823 #endif | 828 #endif |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 860 return false; | 865 return false; |
| 861 } | 866 } |
| 862 } | 867 } |
| 863 | 868 |
| 864 if (intersection) { | 869 if (intersection) { |
| 865 *intersection = ir; | 870 *intersection = ir; |
| 866 } | 871 } |
| 867 return true; | 872 return true; |
| 868 } | 873 } |
| 869 | 874 |
| 875 SkCanvas::SaveLayerStrategy SkCanvas::willSaveLayer(const SkRect*, const SkPaint
*, SaveFlags) { |
| 876 |
| 877 // Do nothing. Subclasses may do something. |
| 878 return kFullLayer_SaveLayerStrategy; |
| 879 } |
| 880 |
| 870 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, | 881 int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, |
| 871 SaveFlags flags) { | 882 SaveFlags flags) { |
| 872 return this->internalSaveLayer(bounds, paint, flags, false); | 883 // Overriding classes may return false to signal that we don't need to creat
e a layer. |
| 884 SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, flags); |
| 885 return this->internalSaveLayer(bounds, paint, flags, false, strategy); |
| 873 } | 886 } |
| 874 | 887 |
| 875 static SkBaseDevice* createCompatibleDevice(SkCanvas* canvas, | 888 static SkBaseDevice* createCompatibleDevice(SkCanvas* canvas, |
| 876 const SkImageInfo& info) { | 889 const SkImageInfo& info) { |
| 877 SkBaseDevice* device = canvas->getDevice(); | 890 SkBaseDevice* device = canvas->getDevice(); |
| 878 return device ? device->createCompatibleDevice(info) : NULL; | 891 return device ? device->createCompatibleDevice(info) : NULL; |
| 879 } | 892 } |
| 880 | 893 |
| 881 int SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, | 894 int SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, Save
Flags flags, |
| 882 SaveFlags flags, bool justForImageFilter) { | 895 bool justForImageFilter, SaveLayerStrategy strat
egy) { |
| 883 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG | 896 #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
| 884 flags = (SaveFlags)(flags | kClipToLayer_SaveFlag); | 897 flags = (SaveFlags)(flags | kClipToLayer_SaveFlag); |
| 885 #endif | 898 #endif |
| 886 | 899 |
| 887 // do this before we create the layer. We don't call the public save() since | 900 // do this before we create the layer. We don't call the public save() since |
| 888 // that would invoke a possibly overridden virtual | 901 // that would invoke a possibly overridden virtual |
| 889 int count = this->internalSave(flags); | 902 int count = this->internalSave(flags); |
| 890 | 903 |
| 891 fDeviceCMDirty = true; | 904 fDeviceCMDirty = true; |
| 892 | 905 |
| 893 SkIRect ir; | 906 SkIRect ir; |
| 894 if (!this->clipRectBounds(bounds, flags, &ir, paint ? paint->getImageFilter(
) : NULL)) { | 907 if (!this->clipRectBounds(bounds, flags, &ir, paint ? paint->getImageFilter(
) : NULL)) { |
| 895 return count; | 908 return count; |
| 896 } | 909 } |
| 897 | 910 |
| 911 // FIXME: do willSaveLayer() overriders returning kNoLayer_SaveLayerStrategy
really care about |
| 912 // the clipRectBounds() call above? |
| 913 if (kNoLayer_SaveLayerStrategy == strategy) { |
| 914 return count; |
| 915 } |
| 916 |
| 898 // Kill the imagefilter if our device doesn't allow it | 917 // Kill the imagefilter if our device doesn't allow it |
| 899 SkLazyPaint lazyP; | 918 SkLazyPaint lazyP; |
| 900 if (paint && paint->getImageFilter()) { | 919 if (paint && paint->getImageFilter()) { |
| 901 if (!this->getTopDevice()->allowImageFilter(paint->getImageFilter())) { | 920 if (!this->getTopDevice()->allowImageFilter(paint->getImageFilter())) { |
| 902 if (justForImageFilter) { | 921 if (justForImageFilter) { |
| 903 // early exit if the layer was just for the imageFilter | 922 // early exit if the layer was just for the imageFilter |
| 904 return count; | 923 return count; |
| 905 } | 924 } |
| 906 SkPaint* p = lazyP.set(*paint); | 925 SkPaint* p = lazyP.set(*paint); |
| 907 p->setImageFilter(NULL); | 926 p->setImageFilter(NULL); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 940 SaveFlags flags) { | 959 SaveFlags flags) { |
| 941 if (0xFF == alpha) { | 960 if (0xFF == alpha) { |
| 942 return this->saveLayer(bounds, NULL, flags); | 961 return this->saveLayer(bounds, NULL, flags); |
| 943 } else { | 962 } else { |
| 944 SkPaint tmpPaint; | 963 SkPaint tmpPaint; |
| 945 tmpPaint.setAlpha(alpha); | 964 tmpPaint.setAlpha(alpha); |
| 946 return this->saveLayer(bounds, &tmpPaint, flags); | 965 return this->saveLayer(bounds, &tmpPaint, flags); |
| 947 } | 966 } |
| 948 } | 967 } |
| 949 | 968 |
| 969 void SkCanvas::willRestore() { |
| 970 // Do nothing. Subclasses may do something. |
| 971 } |
| 972 |
| 950 void SkCanvas::restore() { | 973 void SkCanvas::restore() { |
| 951 // check for underflow | 974 // check for underflow |
| 952 if (fMCStack.count() > 1) { | 975 if (fMCStack.count() > 1) { |
| 976 this->willRestore(); |
| 953 this->internalRestore(); | 977 this->internalRestore(); |
| 954 } | 978 } |
| 955 } | 979 } |
| 956 | 980 |
| 957 void SkCanvas::internalRestore() { | 981 void SkCanvas::internalRestore() { |
| 958 SkASSERT(fMCStack.count() != 0); | 982 SkASSERT(fMCStack.count() != 0); |
| 959 | 983 |
| 960 fDeviceCMDirty = true; | 984 fDeviceCMDirty = true; |
| 961 fCachedLocalClipBoundsDirty = true; | 985 fCachedLocalClipBoundsDirty = true; |
| 962 | 986 |
| (...skipping 1514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2477 if (!bitmap.allocPixels(info)) { | 2501 if (!bitmap.allocPixels(info)) { |
| 2478 return NULL; | 2502 return NULL; |
| 2479 } | 2503 } |
| 2480 | 2504 |
| 2481 // should this functionality be moved into allocPixels()? | 2505 // should this functionality be moved into allocPixels()? |
| 2482 if (!bitmap.info().isOpaque()) { | 2506 if (!bitmap.info().isOpaque()) { |
| 2483 bitmap.eraseColor(0); | 2507 bitmap.eraseColor(0); |
| 2484 } | 2508 } |
| 2485 return SkNEW_ARGS(SkCanvas, (bitmap)); | 2509 return SkNEW_ARGS(SkCanvas, (bitmap)); |
| 2486 } | 2510 } |
| OLD | NEW |