diff options
author | mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-04-26 11:48:33 +0000 |
---|---|---|
committer | mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-04-26 11:48:33 +0000 |
commit | ea4ac97dec2eb291139bd906939e0d2e05cdd7ef (patch) | |
tree | d9eee5c680c32669a48c21a564515a66e00a1258 /src/core | |
parent | 9ce767c41333682c858ff26e99be2b800a2ef2b0 (diff) |
make SkDeviceFactory reference counted
git-svn-id: http://skia.googlecode.com/svn/trunk@1180 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkCanvas.cpp | 26 | ||||
-rw-r--r-- | src/core/SkDevice.cpp | 36 |
2 files changed, 52 insertions, 10 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 07c2748a7a..dbd4852006 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -417,21 +417,27 @@ SkDevice* SkCanvas::init(SkDevice* device) { } SkCanvas::SkCanvas(SkDeviceFactory* factory) - : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)), - fDeviceFactory(factory) { + : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) { inc_canvas(); - if (!factory) - fDeviceFactory = SkNEW(SkRasterDeviceFactory); + if (factory) { + factory->ref(); + } else { + factory = SkNEW(SkRasterDeviceFactory); + } + fDeviceFactory = factory; this->init(NULL); } SkCanvas::SkCanvas(SkDevice* device) - : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)), - fDeviceFactory(device->getDeviceFactory()) { + : fMCStack(sizeof(MCRec), fMCRecStorage, sizeof(fMCRecStorage)) { inc_canvas(); + fDeviceFactory = device->getDeviceFactory(); + SkASSERT(fDeviceFactory); + fDeviceFactory->ref(); + this->init(device); } @@ -441,6 +447,9 @@ SkCanvas::SkCanvas(const SkBitmap& bitmap) SkDevice* device = SkNEW_ARGS(SkDevice, (this, bitmap, false)); fDeviceFactory = device->getDeviceFactory(); + SkASSERT(fDeviceFactory); + fDeviceFactory->ref(); + this->init(device)->unref(); } @@ -450,7 +459,7 @@ SkCanvas::~SkCanvas() { this->internalRestore(); // restore the last, since we're going away SkSafeUnref(fBounder); - SkDELETE(fDeviceFactory); + SkSafeUnref(fDeviceFactory); dec_canvas(); } @@ -560,8 +569,7 @@ bool SkCanvas::readPixels(const SkIRect& srcRect, SkBitmap* bitmap) { } SkDeviceFactory* SkCanvas::setDeviceFactory(SkDeviceFactory* factory) { - SkDELETE(fDeviceFactory); - fDeviceFactory = factory; + SkRefCnt_SafeAssign(fDeviceFactory, factory); return factory; } diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index 6305e190fe..850a53fd16 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -3,10 +3,31 @@ #include "SkMetaData.h" #include "SkRect.h" -SkDeviceFactory::~SkDeviceFactory() {} +//#define TRACE_FACTORY_LIFETIME + +#ifdef TRACE_FACTORY_LIFETIME + static int gFactoryCounter; +#endif + +SkDeviceFactory::SkDeviceFactory() { +#ifdef TRACE_FACTORY_LIFETIME + SkDebugf("+++ factory index %d\n", gFactoryCounter); + ++gFactoryCounter; +#endif +} + +SkDeviceFactory::~SkDeviceFactory() { +#ifdef TRACE_FACTORY_LIFETIME + --gFactoryCounter; + SkDebugf("--- factory index %d\n", gFactoryCounter); +#endif +} + +/////////////////////////////////////////////////////////////////////////////// SkDevice::SkDevice(SkCanvas* canvas) : fCanvas(canvas), fMetaData(NULL) { fOrigin.setZero(); + fCachedDeviceFactory = NULL; } SkDevice::SkDevice(SkCanvas* canvas, const SkBitmap& bitmap, bool isForLayer) @@ -21,10 +42,23 @@ SkDevice::SkDevice(SkCanvas* canvas, const SkBitmap& bitmap, bool isForLayer) } } } + fCachedDeviceFactory = NULL; } SkDevice::~SkDevice() { delete fMetaData; + SkSafeUnref(fCachedDeviceFactory); +} + +SkDeviceFactory* SkDevice::onNewDeviceFactory() { + return SkNEW(SkRasterDeviceFactory); +} + +SkDeviceFactory* SkDevice::getDeviceFactory() { + if (NULL == fCachedDeviceFactory) { + fCachedDeviceFactory = this->onNewDeviceFactory(); + } + return fCachedDeviceFactory; } SkMetaData& SkDevice::getMetaData() { |