#ifndef SkImageGenerator_DEFINED
#define SkImageGenerator_DEFINED
+#include "SkDiscardableMemory.h"
#include "SkImageInfo.h"
+class SkBitmap;
class SkData;
+class SkImageGenerator;
+
+/**
+ * Takes ownership of SkImageGenerator. If this method fails for
+ * whatever reason, it will return false and immediatetely delete
+ * the generator. If it succeeds, it will modify destination
+ * bitmap.
+ *
+ * If this fails or when the SkDiscardablePixelRef that is
+ * installed into destination is destroyed, it will call
+ * SkDELETE() on the generator. Therefore, generator should be
+ * allocated with SkNEW() or SkNEW_ARGS().
+ *
+ * @param destination Upon success, this bitmap will be
+ * configured and have a pixelref installed.
+ *
+ * @param factory If not NULL, this object will be used as a
+ * source of discardable memory when decoding. If NULL, then
+ * SkDiscardableMemory::Create() will be called.
+ *
+ * @return true iff successful.
+ */
+SK_API bool SkInstallDiscardablePixelRef(SkImageGenerator* generator,
+ SkBitmap* destination,
+ SkDiscardableMemory::Factory* factory = NULL);
+
/**
* An interface that allows a purgeable PixelRef (such as a
* SkDiscardablePixelRef) to decode and re-decode an image as needed.
*/
-class SkImageGenerator {
+class SK_API SkImageGenerator {
public:
/**
* The PixelRef which takes ownership of this SkImageGenerator
#include "SkDecodingImageGenerator.h"
#include "SkData.h"
-#include "SkDiscardablePixelRef.h"
#include "SkImageDecoder.h"
+#include "SkImageGenerator.h"
#include "SkImagePriv.h"
#include "SkStream.h"
SkASSERT(data != NULL);
SkASSERT(dst != NULL);
SkImageGenerator* gen(SkNEW_ARGS(SkDecodingImageGenerator, (data)));
- return SkDiscardablePixelRef::Install(gen, dst, factory);
+ return SkInstallDiscardablePixelRef(gen, dst, factory);
}
bool SkDecodingImageGenerator::Install(SkStreamRewindable* stream,
return false;
}
SkImageGenerator* gen(SkNEW_ARGS(SkDecodingImageGenerator, (stream)));
- return SkDiscardablePixelRef::Install(gen, dst, factory);
+ return SkInstallDiscardablePixelRef(gen, dst, factory);
}
#include "SkDiscardablePixelRef.h"
#include "SkDiscardableMemory.h"
+#include "SkImageGenerator.h"
SkDiscardablePixelRef::SkDiscardablePixelRef(SkImageGenerator* generator,
const SkImageInfo& info,
}
}
-bool SkDiscardablePixelRef::Install(SkImageGenerator* generator,
- SkBitmap* dst,
- SkDiscardableMemory::Factory* factory) {
+bool SkInstallDiscardablePixelRef(SkImageGenerator* generator,
+ SkBitmap* dst,
+ SkDiscardableMemory::Factory* factory) {
SkImageInfo info;
SkASSERT(generator != NULL);
if ((NULL == generator)
|| (!generator->getInfo(&info))
- || (!dst->setConfig(info, 0))
- || (0 == dst->getSize())) { // dst->getSize=0 Probably a bad config
+ || (!dst->setConfig(info, 0))) {
SkDELETE(generator);
return false;
}
+ SkASSERT(dst->config() != SkBitmap::kNo_Config);
+ if (dst->empty()) { // Use a normal pixelref.
+ SkDELETE(generator); // Do not need this anymore.
+ return dst->allocPixels(NULL, NULL);
+ }
SkAutoTUnref<SkDiscardablePixelRef> ref(SkNEW_ARGS(SkDiscardablePixelRef,
(generator, info,
dst->getSize(),
#define SkDiscardablePixelRef_DEFINED
#include "SkDiscardableMemory.h"
-#include "SkPixelRef.h"
#include "SkImageGenerator.h"
#include "SkImageInfo.h"
-
-/**
- * An interface that allows a purgable PixelRef to re-decode an image.
- */
-
-typedef SkDiscardableMemory* (*SkDiscardableMemoryFactory)(size_t bytes);
-
+#include "SkPixelRef.h"
class SkDiscardablePixelRef : public SkPixelRef {
public:
- /**
- * Takes ownership of SkImageGenerator. If this method fails for
- * whatever reason, it will return false and immediatetely delete
- * the generator. If it succeeds, it will modify destination
- * bitmap.
- *
- * If Install fails or when the SkDiscardablePixelRef that is
- * installed into destination is destroyed, it will call
- * SkDELETE() on the generator. Therefore, generator should be
- * allocated with SkNEW() or SkNEW_ARGS().
- *
- * @param destination Upon success, this bitmap will be
- * configured and have a pixelref installed.
- *
- * @param factory If not NULL, this object will be used as a
- * source of discardable memory when decoding. If NULL, then
- * SkDiscardableMemory::Create() will be called.
- *
- * @return true iff successful.
- */
- static bool Install(SkImageGenerator* generator,
- SkBitmap* destination,
- SkDiscardableMemory::Factory* factory = NULL);
-
SK_DECLARE_UNFLATTENABLE_OBJECT()
protected:
size_t size,
size_t rowBytes,
SkDiscardableMemory::Factory* factory);
+ friend bool SkInstallDiscardablePixelRef(SkImageGenerator*,
+ SkBitmap*,
+ SkDiscardableMemory::Factory*);
+ typedef SkPixelRef INHERITED;
};
#endif // SkDiscardablePixelRef_DEFINED
#include "SkCanvas.h"
#include "SkData.h"
#include "SkDecodingImageGenerator.h"
-#include "SkDiscardablePixelRef.h"
#include "SkDiscardableMemoryPool.h"
#include "SkImageDecoder.h"
#include "SkCachingPixelRef.h"
// Ignore factory; use global SkScaledImageCache.
success = SkCachingPixelRef::Install(gen.detach(), &lazy);
} else {
- success = SkDiscardablePixelRef::Install(gen.detach(), &lazy, factory);
+ success = SkInstallDiscardablePixelRef(gen.detach(), &lazy, factory);
}
REPORTER_ASSERT(reporter, success
== (TestImageGenerator::kFailGetInfo_TestType != type));
#include "SkCanvas.h"
#include "SkData.h"
#include "SkDiscardableMemoryPool.h"
-#include "SkDiscardablePixelRef.h"
+#include "SkImageGenerator.h"
#include "SkPaint.h"
#include "SkShader.h"
#include "SkSurface.h"
SkAutoTUnref<SkDiscardableMemoryPool> pool(SkNEW_ARGS(SkDiscardableMemoryPool,
(10 * 1000, NULL)));
SkBitmap bm;
- bool installSuccess = SkDiscardablePixelRef::Install(SkNEW(FailureImageGenerator), &bm, pool);
+ bool installSuccess = SkInstallDiscardablePixelRef(SkNEW(FailureImageGenerator), &bm, pool);
REPORTER_ASSERT(reporter, installSuccess);
// now our bitmap has a pixelref, but we know it will fail to lock
#include "SkData.h"
#include "SkDecodingImageGenerator.h"
#include "SkDiscardableMemoryPool.h"
-#include "SkDiscardablePixelRef.h"
+#include "SkImageGenerator.h"
#include "SkForceLinking.h"
#include "SkCommandLineFlags.h"
// Only meaningful if platform has a default discardable
// memory implementation that differs from the global DM pool.
}
- return SkDiscardablePixelRef::Install(gen.detach(), dst, pool);
+ return SkInstallDiscardablePixelRef(gen.detach(), dst, pool);
}