aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-04-26 11:48:33 +0000
committerGravatar mike@reedtribe.org <mike@reedtribe.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-04-26 11:48:33 +0000
commitea4ac97dec2eb291139bd906939e0d2e05cdd7ef (patch)
treed9eee5c680c32669a48c21a564515a66e00a1258 /src/core
parent9ce767c41333682c858ff26e99be2b800a2ef2b0 (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.cpp26
-rw-r--r--src/core/SkDevice.cpp36
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() {