| 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 |