/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkLazyPixelRef_DEFINED #define SkLazyPixelRef_DEFINED #include "SkBitmapFactory.h" #include "SkImage.h" #include "SkImageCache.h" #include "SkPixelRef.h" #include "SkFlattenable.h" #include "SkScaledImageCache.h" class SkColorTable; class SkData; class SkImageCache; #ifdef SK_DEBUG #define LAZY_CACHE_STATS 1 #elif !defined(LAZY_CACHE_STATS) #define LAZY_CACHE_STATS 0 #endif /** * PixelRef which defers decoding until SkBitmap::lockPixels() is called. */ class SkLazyPixelRef : public SkPixelRef { public: /** * Create a new SkLazyPixelRef. * @param SkData Encoded data representing the pixels. * @param DecodeProc Called to decode the pixels when needed. Must be non-NULL. * @param SkImageCache Object that handles allocating and freeing * the pixel memory, as needed. If NULL, use the global * SkScaledImageCache. */ SkLazyPixelRef(SkData*, SkBitmapFactory::DecodeProc, SkImageCache*); virtual ~SkLazyPixelRef(); #ifdef SK_DEBUG intptr_t getCacheId() const { return fCacheId; } #endif #if LAZY_CACHE_STATS static int32_t GetCacheHits() { return gCacheHits; } static int32_t GetCacheMisses() { return gCacheMisses; } static void ResetCacheStats() { gCacheHits = gCacheMisses = 0; } #endif // No need to flatten this object. When flattening an SkBitmap, SkOrderedWriteBuffer will check // the encoded data and write that instead. // Future implementations of SkFlattenableWriteBuffer will need to special case for // onRefEncodedData as well. SK_DECLARE_UNFLATTENABLE_OBJECT() protected: virtual void* onLockPixels(SkColorTable**) SK_OVERRIDE; virtual void onUnlockPixels() SK_OVERRIDE; virtual bool onLockPixelsAreWritable() const SK_OVERRIDE { return false; } virtual SkData* onRefEncodedData() SK_OVERRIDE; virtual bool onImplementsDecodeInto() SK_OVERRIDE; virtual bool onDecodeInto(int pow2, SkBitmap*) SK_OVERRIDE; private: bool fErrorInDecoding; SkData* fData; SkBitmapFactory::DecodeProc fDecodeProc; SkImageCache* fImageCache; union { SkImageCache::ID fCacheId; SkScaledImageCache::ID* fScaledCacheId; }; size_t fRowBytes; SkImageInfo fLazilyCachedInfo; #if LAZY_CACHE_STATS static int32_t gCacheHits; static int32_t gCacheMisses; #endif // lazily initialized our cached info. Returns NULL on failure. const SkImage::Info* getCachedInfo(); void* lockScaledImageCachePixels(); void* lockImageCachePixels(); typedef SkPixelRef INHERITED; }; #endif // SkLazyPixelRef_DEFINED