| OLD | NEW | 
|---|
| 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 185 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 196              bool conservativeRasterClip, bool deviceIsBitmapDevice) | 196              bool conservativeRasterClip, bool deviceIsBitmapDevice) | 
| 197         : fNext(NULL) | 197         : fNext(NULL) | 
| 198         , fClip(conservativeRasterClip) | 198         , fClip(conservativeRasterClip) | 
| 199         , fDeviceIsBitmapDevice(deviceIsBitmapDevice) | 199         , fDeviceIsBitmapDevice(deviceIsBitmapDevice) | 
| 200     { | 200     { | 
| 201         if (NULL != device) { | 201         if (NULL != device) { | 
| 202             device->ref(); | 202             device->ref(); | 
| 203             device->onAttachToCanvas(canvas); | 203             device->onAttachToCanvas(canvas); | 
| 204         } | 204         } | 
| 205         fDevice = device; | 205         fDevice = device; | 
| 206         fPaint = paint ? SkNEW_ARGS(SkPaint, (*paint)) : NULL; | 206         fPaint = paint ? new SkPaint(*paint) : NULL; | 
| 207     } | 207     } | 
| 208 | 208 | 
| 209     ~DeviceCM() { | 209     ~DeviceCM() { | 
| 210         if (fDevice) { | 210         if (fDevice) { | 
| 211             fDevice->onDetachFromCanvas(); | 211             fDevice->onDetachFromCanvas(); | 
| 212             fDevice->unref(); | 212             fDevice->unref(); | 
| 213         } | 213         } | 
| 214         SkDELETE(fPaint); | 214         delete fPaint; | 
| 215     } | 215     } | 
| 216 | 216 | 
| 217     void reset(const SkIRect& bounds) { | 217     void reset(const SkIRect& bounds) { | 
| 218         SkASSERT(!fPaint); | 218         SkASSERT(!fPaint); | 
| 219         SkASSERT(!fNext); | 219         SkASSERT(!fNext); | 
| 220         SkASSERT(fDevice); | 220         SkASSERT(fDevice); | 
| 221         fClip.setRect(bounds); | 221         fClip.setRect(bounds); | 
| 222     } | 222     } | 
| 223 | 223 | 
| 224     void updateMC(const SkMatrix& totalMatrix, const SkRasterClip& totalClip, | 224     void updateMC(const SkMatrix& totalMatrix, const SkRasterClip& totalClip, | 
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 297         fFilter = SkSafeRef(prev.fFilter); | 297         fFilter = SkSafeRef(prev.fFilter); | 
| 298         fLayer = NULL; | 298         fLayer = NULL; | 
| 299         fTopLayer = prev.fTopLayer; | 299         fTopLayer = prev.fTopLayer; | 
| 300         fDeferredSaveCount = 0; | 300         fDeferredSaveCount = 0; | 
| 301 | 301 | 
| 302         // don't bother initializing fNext | 302         // don't bother initializing fNext | 
| 303         inc_rec(); | 303         inc_rec(); | 
| 304     } | 304     } | 
| 305     ~MCRec() { | 305     ~MCRec() { | 
| 306         SkSafeUnref(fFilter); | 306         SkSafeUnref(fFilter); | 
| 307         SkDELETE(fLayer); | 307         delete fLayer; | 
| 308         dec_rec(); | 308         dec_rec(); | 
| 309     } | 309     } | 
| 310 | 310 | 
| 311     void reset(const SkIRect& bounds) { | 311     void reset(const SkIRect& bounds) { | 
| 312         SkASSERT(fLayer); | 312         SkASSERT(fLayer); | 
| 313         SkASSERT(fDeferredSaveCount == 0); | 313         SkASSERT(fDeferredSaveCount == 0); | 
| 314 | 314 | 
| 315         fMatrix.reset(); | 315         fMatrix.reset(); | 
| 316         fRasterClip.setRect(bounds); | 316         fRasterClip.setRect(bounds); | 
| 317         fLayer->reset(bounds); | 317         fLayer->reset(bounds); | 
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 597 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { | 597 SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) { | 
| 598     fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag)
      ; | 598     fConservativeRasterClip = SkToBool(flags & kConservativeRasterClip_InitFlag)
      ; | 
| 599     fCachedLocalClipBounds.setEmpty(); | 599     fCachedLocalClipBounds.setEmpty(); | 
| 600     fCachedLocalClipBoundsDirty = true; | 600     fCachedLocalClipBoundsDirty = true; | 
| 601     fAllowSoftClip = true; | 601     fAllowSoftClip = true; | 
| 602     fAllowSimplifyClip = false; | 602     fAllowSimplifyClip = false; | 
| 603     fDeviceCMDirty = true; | 603     fDeviceCMDirty = true; | 
| 604     fSaveCount = 1; | 604     fSaveCount = 1; | 
| 605     fMetaData = NULL; | 605     fMetaData = NULL; | 
| 606 | 606 | 
| 607     fClipStack.reset(SkNEW(SkClipStack)); | 607     fClipStack.reset(new SkClipStack); | 
| 608 | 608 | 
| 609     fMCRec = (MCRec*)fMCStack.push_back(); | 609     fMCRec = (MCRec*)fMCStack.push_back(); | 
| 610     new (fMCRec) MCRec(fConservativeRasterClip); | 610     new (fMCRec) MCRec(fConservativeRasterClip); | 
| 611 | 611 | 
| 612     SkASSERT(sizeof(DeviceCM) <= sizeof(fDeviceCMStorage)); | 612     SkASSERT(sizeof(DeviceCM) <= sizeof(fDeviceCMStorage)); | 
| 613     fMCRec->fLayer = (DeviceCM*)fDeviceCMStorage; | 613     fMCRec->fLayer = (DeviceCM*)fDeviceCMStorage; | 
| 614     new (fDeviceCMStorage) DeviceCM(NULL, NULL, NULL, fConservativeRasterClip, f
      alse); | 614     new (fDeviceCMStorage) DeviceCM(NULL, NULL, NULL, fConservativeRasterClip, f
      alse); | 
| 615 | 615 | 
| 616     fMCRec->fTopLayer = fMCRec->fLayer; | 616     fMCRec->fTopLayer = fMCRec->fLayer; | 
| 617 | 617 | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 657 | 657 | 
| 658     typedef SkBitmapDevice INHERITED; | 658     typedef SkBitmapDevice INHERITED; | 
| 659 }; | 659 }; | 
| 660 | 660 | 
| 661 SkCanvas::SkCanvas(int width, int height, const SkSurfaceProps* props) | 661 SkCanvas::SkCanvas(int width, int height, const SkSurfaceProps* props) | 
| 662     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 662     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 
| 663     , fProps(SkSurfacePropsCopyOrDefault(props)) | 663     , fProps(SkSurfacePropsCopyOrDefault(props)) | 
| 664 { | 664 { | 
| 665     inc_canvas(); | 665     inc_canvas(); | 
| 666 | 666 | 
| 667     this->init(SkNEW_ARGS(SkNoPixelsBitmapDevice, | 667     this->init(new SkNoPixelsBitmapDevice(SkIRect::MakeWH(width, height), fProps
      ), | 
| 668                           (SkIRect::MakeWH(width, height), fProps)), kDefault_In
      itFlags)->unref(); | 668                kDefault_InitFlags)->unref(); | 
| 669 } | 669 } | 
| 670 | 670 | 
| 671 SkCanvas::SkCanvas(const SkIRect& bounds, InitFlags flags) | 671 SkCanvas::SkCanvas(const SkIRect& bounds, InitFlags flags) | 
| 672     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 672     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 
| 673     , fProps(SkSurfaceProps::kLegacyFontHost_InitType) | 673     , fProps(SkSurfaceProps::kLegacyFontHost_InitType) | 
| 674 { | 674 { | 
| 675     inc_canvas(); | 675     inc_canvas(); | 
| 676 | 676 | 
| 677     this->init(SkNEW_ARGS(SkNoPixelsBitmapDevice, (bounds, fProps)), flags)->unr
      ef(); | 677     this->init(new SkNoPixelsBitmapDevice(bounds, fProps), flags)->unref(); | 
| 678 } | 678 } | 
| 679 | 679 | 
| 680 SkCanvas::SkCanvas(SkBaseDevice* device) | 680 SkCanvas::SkCanvas(SkBaseDevice* device) | 
| 681     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 681     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 
| 682     , fProps(device->surfaceProps()) | 682     , fProps(device->surfaceProps()) | 
| 683 { | 683 { | 
| 684     inc_canvas(); | 684     inc_canvas(); | 
| 685 | 685 | 
| 686     this->init(device, kDefault_InitFlags); | 686     this->init(device, kDefault_InitFlags); | 
| 687 } | 687 } | 
| 688 | 688 | 
| 689 SkCanvas::SkCanvas(SkBaseDevice* device, InitFlags flags) | 689 SkCanvas::SkCanvas(SkBaseDevice* device, InitFlags flags) | 
| 690     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 690     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 
| 691     , fProps(device->surfaceProps()) | 691     , fProps(device->surfaceProps()) | 
| 692 { | 692 { | 
| 693     inc_canvas(); | 693     inc_canvas(); | 
| 694 | 694 | 
| 695     this->init(device, flags); | 695     this->init(device, flags); | 
| 696 } | 696 } | 
| 697 | 697 | 
| 698 SkCanvas::SkCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props) | 698 SkCanvas::SkCanvas(const SkBitmap& bitmap, const SkSurfaceProps& props) | 
| 699     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 699     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 
| 700     , fProps(props) | 700     , fProps(props) | 
| 701 { | 701 { | 
| 702     inc_canvas(); | 702     inc_canvas(); | 
| 703 | 703 | 
| 704     SkAutoTUnref<SkBaseDevice> device(SkNEW_ARGS(SkBitmapDevice, (bitmap, fProps
      ))); | 704     SkAutoTUnref<SkBaseDevice> device(new SkBitmapDevice(bitmap, fProps)); | 
| 705     this->init(device, kDefault_InitFlags); | 705     this->init(device, kDefault_InitFlags); | 
| 706 } | 706 } | 
| 707 | 707 | 
| 708 SkCanvas::SkCanvas(const SkBitmap& bitmap) | 708 SkCanvas::SkCanvas(const SkBitmap& bitmap) | 
| 709     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 709     : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) | 
| 710     , fProps(SkSurfaceProps::kLegacyFontHost_InitType) | 710     , fProps(SkSurfaceProps::kLegacyFontHost_InitType) | 
| 711 { | 711 { | 
| 712     inc_canvas(); | 712     inc_canvas(); | 
| 713 | 713 | 
| 714     SkAutoTUnref<SkBaseDevice> device(SkNEW_ARGS(SkBitmapDevice, (bitmap, fProps
      ))); | 714     SkAutoTUnref<SkBaseDevice> device(new SkBitmapDevice(bitmap, fProps)); | 
| 715     this->init(device, kDefault_InitFlags); | 715     this->init(device, kDefault_InitFlags); | 
| 716 } | 716 } | 
| 717 | 717 | 
| 718 SkCanvas::~SkCanvas() { | 718 SkCanvas::~SkCanvas() { | 
| 719     // free up the contents of our deque | 719     // free up the contents of our deque | 
| 720     this->restoreToCount(1);    // restore everything but the last | 720     this->restoreToCount(1);    // restore everything but the last | 
| 721 | 721 | 
| 722     this->internalRestore();    // restore the last, since we're going away | 722     this->internalRestore();    // restore the last, since we're going away | 
| 723 | 723 | 
| 724     SkDELETE(fMetaData); | 724     delete fMetaData; | 
| 725 | 725 | 
| 726     dec_canvas(); | 726     dec_canvas(); | 
| 727 } | 727 } | 
| 728 | 728 | 
| 729 SkDrawFilter* SkCanvas::getDrawFilter() const { | 729 SkDrawFilter* SkCanvas::getDrawFilter() const { | 
| 730     return fMCRec->fFilter; | 730     return fMCRec->fFilter; | 
| 731 } | 731 } | 
| 732 | 732 | 
| 733 SkDrawFilter* SkCanvas::setDrawFilter(SkDrawFilter* filter) { | 733 SkDrawFilter* SkCanvas::setDrawFilter(SkDrawFilter* filter) { | 
| 734     this->checkForDeferredSave(); | 734     this->checkForDeferredSave(); | 
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1128                 SkErrorInternals::SetError(kInternalError_SkError, | 1128                 SkErrorInternals::SetError(kInternalError_SkError, | 
| 1129                                            "Unable to create device for layer.")
      ; | 1129                                            "Unable to create device for layer.")
      ; | 
| 1130                 return; | 1130                 return; | 
| 1131             } | 1131             } | 
| 1132             forceSpriteOnRestore = true; | 1132             forceSpriteOnRestore = true; | 
| 1133         } | 1133         } | 
| 1134         device = newDev; | 1134         device = newDev; | 
| 1135     } | 1135     } | 
| 1136 | 1136 | 
| 1137     device->setOrigin(ir.fLeft, ir.fTop); | 1137     device->setOrigin(ir.fLeft, ir.fTop); | 
| 1138     DeviceCM* layer = SkNEW_ARGS(DeviceCM, (device, paint, this, fConservativeRa
      sterClip, | 1138     DeviceCM* layer = | 
| 1139                                             forceSpriteOnRestore)); | 1139             new DeviceCM(device, paint, this, fConservativeRasterClip, forceSpri
      teOnRestore); | 
| 1140     device->unref(); | 1140     device->unref(); | 
| 1141 | 1141 | 
| 1142     layer->fNext = fMCRec->fTopLayer; | 1142     layer->fNext = fMCRec->fTopLayer; | 
| 1143     fMCRec->fLayer = layer; | 1143     fMCRec->fLayer = layer; | 
| 1144     fMCRec->fTopLayer = layer;    // this field is NOT an owner of layer | 1144     fMCRec->fTopLayer = layer;    // this field is NOT an owner of layer | 
| 1145 } | 1145 } | 
| 1146 | 1146 | 
| 1147 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) { | 1147 int SkCanvas::saveLayerAlpha(const SkRect* bounds, U8CPU alpha) { | 
| 1148     return this->saveLayerAlpha(bounds, alpha, kARGB_ClipLayer_SaveFlag); | 1148     return this->saveLayerAlpha(bounds, alpha, kARGB_ClipLayer_SaveFlag); | 
| 1149 } | 1149 } | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1181         since if we're being recorded, we don't want to record this (the | 1181         since if we're being recorded, we don't want to record this (the | 
| 1182         recorder will have already recorded the restore). | 1182         recorder will have already recorded the restore). | 
| 1183     */ | 1183     */ | 
| 1184     if (layer) { | 1184     if (layer) { | 
| 1185         if (layer->fNext) { | 1185         if (layer->fNext) { | 
| 1186             const SkIPoint& origin = layer->fDevice->getOrigin(); | 1186             const SkIPoint& origin = layer->fDevice->getOrigin(); | 
| 1187             this->internalDrawDevice(layer->fDevice, origin.x(), origin.y(), | 1187             this->internalDrawDevice(layer->fDevice, origin.x(), origin.y(), | 
| 1188                                      layer->fPaint, layer->fDeviceIsBitmapDevice
      ); | 1188                                      layer->fPaint, layer->fDeviceIsBitmapDevice
      ); | 
| 1189             // reset this, since internalDrawDevice will have set it to true | 1189             // reset this, since internalDrawDevice will have set it to true | 
| 1190             fDeviceCMDirty = true; | 1190             fDeviceCMDirty = true; | 
| 1191             SkDELETE(layer); | 1191             delete layer; | 
| 1192         } else { | 1192         } else { | 
| 1193             // we're at the root | 1193             // we're at the root | 
| 1194             SkASSERT(layer == (void*)fDeviceCMStorage); | 1194             SkASSERT(layer == (void*)fDeviceCMStorage); | 
| 1195             layer->~DeviceCM(); | 1195             layer->~DeviceCM(); | 
| 1196         } | 1196         } | 
| 1197     } | 1197     } | 
| 1198 } | 1198 } | 
| 1199 | 1199 | 
| 1200 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
      rops) { | 1200 SkSurface* SkCanvas::newSurface(const SkImageInfo& info, const SkSurfaceProps* p
      rops) { | 
| 1201     if (NULL == props) { | 1201     if (NULL == props) { | 
| (...skipping 1667 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2869 | 2869 | 
| 2870 SkCanvas* SkCanvas::NewRasterDirect(const SkImageInfo& info, void* pixels, size_
      t rowBytes) { | 2870 SkCanvas* SkCanvas::NewRasterDirect(const SkImageInfo& info, void* pixels, size_
      t rowBytes) { | 
| 2871     if (!supported_for_raster_canvas(info)) { | 2871     if (!supported_for_raster_canvas(info)) { | 
| 2872         return NULL; | 2872         return NULL; | 
| 2873     } | 2873     } | 
| 2874 | 2874 | 
| 2875     SkBitmap bitmap; | 2875     SkBitmap bitmap; | 
| 2876     if (!bitmap.installPixels(info, pixels, rowBytes)) { | 2876     if (!bitmap.installPixels(info, pixels, rowBytes)) { | 
| 2877         return NULL; | 2877         return NULL; | 
| 2878     } | 2878     } | 
| 2879     return SkNEW_ARGS(SkCanvas, (bitmap)); | 2879     return new SkCanvas(bitmap); | 
| 2880 } | 2880 } | 
| 2881 | 2881 | 
| 2882 /////////////////////////////////////////////////////////////////////////////// | 2882 /////////////////////////////////////////////////////////////////////////////// | 
| 2883 | 2883 | 
| 2884 SkAutoCanvasMatrixPaint::SkAutoCanvasMatrixPaint(SkCanvas* canvas, const SkMatri
      x* matrix, | 2884 SkAutoCanvasMatrixPaint::SkAutoCanvasMatrixPaint(SkCanvas* canvas, const SkMatri
      x* matrix, | 
| 2885                                                  const SkPaint* paint, const SkR
      ect& bounds) | 2885                                                  const SkPaint* paint, const SkR
      ect& bounds) | 
| 2886     : fCanvas(canvas) | 2886     : fCanvas(canvas) | 
| 2887     , fSaveCount(canvas->getSaveCount()) | 2887     , fSaveCount(canvas->getSaveCount()) | 
| 2888 { | 2888 { | 
| 2889     if (paint) { | 2889     if (paint) { | 
| 2890         SkRect newBounds = bounds; | 2890         SkRect newBounds = bounds; | 
| 2891         if (matrix) { | 2891         if (matrix) { | 
| 2892             matrix->mapRect(&newBounds); | 2892             matrix->mapRect(&newBounds); | 
| 2893         } | 2893         } | 
| 2894         canvas->saveLayer(&newBounds, paint); | 2894         canvas->saveLayer(&newBounds, paint); | 
| 2895     } else if (matrix) { | 2895     } else if (matrix) { | 
| 2896         canvas->save(); | 2896         canvas->save(); | 
| 2897     } | 2897     } | 
| 2898 | 2898 | 
| 2899     if (matrix) { | 2899     if (matrix) { | 
| 2900         canvas->concat(*matrix); | 2900         canvas->concat(*matrix); | 
| 2901     } | 2901     } | 
| 2902 } | 2902 } | 
| 2903 | 2903 | 
| 2904 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 2904 SkAutoCanvasMatrixPaint::~SkAutoCanvasMatrixPaint() { | 
| 2905     fCanvas->restoreToCount(fSaveCount); | 2905     fCanvas->restoreToCount(fSaveCount); | 
| 2906 } | 2906 } | 
| OLD | NEW | 
|---|