diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/include/images/SkImageRef.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/include/images/SkImageRef.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,104 @@ + +/* + * Copyright 2008 The Android Open Source Project + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#ifndef SkImageRef_DEFINED +#define SkImageRef_DEFINED + +#include "SkPixelRef.h" +#include "SkBitmap.h" +#include "SkImageDecoder.h" +#include "SkString.h" + +class SkImageRefPool; +class SkStreamRewindable; + +// define this to enable dumping whenever we add/remove/purge an imageref +//#define DUMP_IMAGEREF_LIFECYCLE + +class SkImageRef : public SkPixelRef { +public: + /** Create a new imageref from a stream. NOTE: the stream is not copied, but + since it may be accessed from another thread, the caller must ensure + that this imageref is the only owner of the stream. i.e. - sole + ownership of the stream object is transferred to this imageref object. + + @param stream The stream containing the encoded image data. This may be + retained (by calling ref()), so the caller should not + explicitly delete it. + @param config The preferred config of the decoded bitmap. + @param sampleSize Requested sampleSize for decoding. Defaults to 1. + */ + SkImageRef(const SkImageInfo&, SkStreamRewindable*, int sampleSize = 1, + SkBaseMutex* mutex = NULL); + virtual ~SkImageRef(); + + /** this value is passed onto the decoder. Default is true + */ + void setDitherImage(bool dither) { fDoDither = dither; } + + /** Return true if the image can be decoded. If so, and bitmap is non-null, + call its setConfig() with the corresponding values, but explicitly will + not set its pixels or colortable. Use SkPixelRef::lockPixels() for that. + + If there has been an error decoding the bitmap, this will return false + and ignore the bitmap parameter. + */ + bool getInfo(SkBitmap* bm); + + /** Return true if the image can be decoded and is opaque. Calling this + method will decode and set the pixels in the specified bitmap and + sets the isOpaque flag. + */ + bool isOpaque(SkBitmap* bm); + + SkImageDecoderFactory* getDecoderFactory() const { return fFactory; } + // returns the factory parameter + SkImageDecoderFactory* setDecoderFactory(SkImageDecoderFactory*); + +protected: + /** Override if you want to install a custom allocator. + When this is called we will have already acquired the mutex! + */ + virtual bool onDecode(SkImageDecoder* codec, SkStreamRewindable*, SkBitmap*, + SkBitmap::Config, SkImageDecoder::Mode); + + /* Overrides from SkPixelRef + When these are called, we will have already acquired the mutex! + */ + + virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE; + // override this in your subclass to clean up when we're unlocking pixels + virtual void onUnlockPixels() SK_OVERRIDE {} + + SkImageRef(SkReadBuffer&, SkBaseMutex* mutex = NULL); + virtual void flatten(SkWriteBuffer&) const SK_OVERRIDE; + + SkBitmap fBitmap; + +private: + SkStreamRewindable* setStream(SkStreamRewindable*); + // called with mutex already held. returns true if the bitmap is in the + // requested state (or further, i.e. has pixels) + bool prepareBitmap(SkImageDecoder::Mode); + + SkImageDecoderFactory* fFactory; // may be null + SkStreamRewindable* fStream; + int fSampleSize; + bool fDoDither; + bool fErrorInDecoding; + + friend class SkImageRefPool; + + SkImageRef* fPrev, *fNext; + size_t ramUsed() const; + + typedef SkPixelRef INHERITED; +}; + +#endif