blob: 36f95e64b2410f1fe2909ff015f3b3d2ff572cc9 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.com8a1c16f2008-12-17 15:59:43 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2008 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@android.com8a1c16f2008-12-17 15:59:43 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#ifndef SkImageRef_DEFINED
11#define SkImageRef_DEFINED
12
13#include "SkPixelRef.h"
14#include "SkBitmap.h"
15#include "SkImageDecoder.h"
16#include "SkString.h"
17
18class SkImageRefPool;
scroggo@google.comb5571b32013-09-25 21:34:24 +000019class SkStreamRewindable;
reed@android.com8a1c16f2008-12-17 15:59:43 +000020
21// define this to enable dumping whenever we add/remove/purge an imageref
22//#define DUMP_IMAGEREF_LIFECYCLE
23
24class SkImageRef : public SkPixelRef {
25public:
26 /** Create a new imageref from a stream. NOTE: the stream is not copied, but
27 since it may be accessed from another thread, the caller must ensure
28 that this imageref is the only owner of the stream. i.e. - sole
29 ownership of the stream object is transferred to this imageref object.
rmistry@google.comfbfcd562012-08-23 18:09:54 +000030
reed@android.com1337a7b2009-03-16 13:56:10 +000031 @param stream The stream containing the encoded image data. This may be
32 retained (by calling ref()), so the caller should not
33 explicitly delete it.
reed@android.com8a1c16f2008-12-17 15:59:43 +000034 @param config The preferred config of the decoded bitmap.
35 @param sampleSize Requested sampleSize for decoding. Defaults to 1.
36 */
reed@google.combf790232013-12-13 19:45:58 +000037 SkImageRef(const SkImageInfo&, SkStreamRewindable*, int sampleSize = 1,
scroggo@google.comb5571b32013-09-25 21:34:24 +000038 SkBaseMutex* mutex = NULL);
reed@android.com8a1c16f2008-12-17 15:59:43 +000039 virtual ~SkImageRef();
reed@android.combb9aea92009-09-24 17:21:05 +000040
41 /** this value is passed onto the decoder. Default is true
42 */
43 void setDitherImage(bool dither) { fDoDither = dither; }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000044
reed@android.com8a1c16f2008-12-17 15:59:43 +000045 /** Return true if the image can be decoded. If so, and bitmap is non-null,
46 call its setConfig() with the corresponding values, but explicitly will
47 not set its pixels or colortable. Use SkPixelRef::lockPixels() for that.
rmistry@google.comfbfcd562012-08-23 18:09:54 +000048
reed@android.com8a1c16f2008-12-17 15:59:43 +000049 If there has been an error decoding the bitmap, this will return false
50 and ignore the bitmap parameter.
51 */
52 bool getInfo(SkBitmap* bm);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000053
djsollen@google.com57f49692011-02-23 20:46:31 +000054 /** Return true if the image can be decoded and is opaque. Calling this
55 method will decode and set the pixels in the specified bitmap and
56 sets the isOpaque flag.
57 */
58 bool isOpaque(SkBitmap* bm);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000059
reed@android.coma14ea0e2009-03-17 17:59:53 +000060 SkImageDecoderFactory* getDecoderFactory() const { return fFactory; }
61 // returns the factory parameter
62 SkImageDecoderFactory* setDecoderFactory(SkImageDecoderFactory*);
reed@android.com8a1c16f2008-12-17 15:59:43 +000063
reed@android.com8a1c16f2008-12-17 15:59:43 +000064protected:
65 /** Override if you want to install a custom allocator.
66 When this is called we will have already acquired the mutex!
67 */
scroggo@google.comb5571b32013-09-25 21:34:24 +000068 virtual bool onDecode(SkImageDecoder* codec, SkStreamRewindable*, SkBitmap*,
reed@android.com8a1c16f2008-12-17 15:59:43 +000069 SkBitmap::Config, SkImageDecoder::Mode);
70
71 /* Overrides from SkPixelRef
72 When these are called, we will have already acquired the mutex!
73 */
74
reed@google.comf1ce0522014-01-03 16:22:48 +000075 virtual bool onNewLockPixels(LockRec*) SK_OVERRIDE;
reed@android.com8a1c16f2008-12-17 15:59:43 +000076 // override this in your subclass to clean up when we're unlocking pixels
reed@google.comf1ce0522014-01-03 16:22:48 +000077 virtual void onUnlockPixels() SK_OVERRIDE {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +000078
djsollen@google.com528a5562013-02-01 15:57:13 +000079 SkImageRef(SkFlattenableReadBuffer&, SkBaseMutex* mutex = NULL);
djsollen@google.com54924242012-03-29 15:18:04 +000080 virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
reed@android.com8a1c16f2008-12-17 15:59:43 +000081
82 SkBitmap fBitmap;
83
rmistry@google.comfbfcd562012-08-23 18:09:54 +000084private:
scroggo@google.comb5571b32013-09-25 21:34:24 +000085 SkStreamRewindable* setStream(SkStreamRewindable*);
reed@android.com8a1c16f2008-12-17 15:59:43 +000086 // called with mutex already held. returns true if the bitmap is in the
87 // requested state (or further, i.e. has pixels)
88 bool prepareBitmap(SkImageDecoder::Mode);
89
reed@android.coma14ea0e2009-03-17 17:59:53 +000090 SkImageDecoderFactory* fFactory; // may be null
scroggo@google.comb5571b32013-09-25 21:34:24 +000091 SkStreamRewindable* fStream;
reed@android.coma14ea0e2009-03-17 17:59:53 +000092 int fSampleSize;
reed@android.combb9aea92009-09-24 17:21:05 +000093 bool fDoDither;
reed@android.coma14ea0e2009-03-17 17:59:53 +000094 bool fErrorInDecoding;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000095
reed@android.com8a1c16f2008-12-17 15:59:43 +000096 friend class SkImageRefPool;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000097
98 SkImageRef* fPrev, *fNext;
reed@android.com8a1c16f2008-12-17 15:59:43 +000099 size_t ramUsed() const;
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000100
reed@android.com8a1c16f2008-12-17 15:59:43 +0000101 typedef SkPixelRef INHERITED;
102};
103
104#endif