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