Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(250)

Side by Side Diff: include/core/SkPixelRef.h

Issue 68973005: Expand pixelref to return SkImageInfo and rowbytes (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2008 The Android Open Source Project 3 * Copyright 2008 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #ifndef SkPixelRef_DEFINED 10 #ifndef SkPixelRef_DEFINED
11 #define SkPixelRef_DEFINED 11 #define SkPixelRef_DEFINED
12 12
13 #include "SkBitmap.h" 13 #include "SkBitmap.h"
14 #include "SkRefCnt.h" 14 #include "SkRefCnt.h"
15 #include "SkString.h" 15 #include "SkString.h"
16 #include "SkFlattenable.h" 16 #include "SkFlattenable.h"
17 #include "SkImageInfo.h"
17 #include "SkTDArray.h" 18 #include "SkTDArray.h"
18 19
19 #ifdef SK_DEBUG 20 #ifdef SK_DEBUG
20 /** 21 /**
21 * Defining SK_IGNORE_PIXELREF_SETPRELOCKED will force all pixelref 22 * Defining SK_IGNORE_PIXELREF_SETPRELOCKED will force all pixelref
22 * subclasses to correctly handle lock/unlock pixels. For performance 23 * subclasses to correctly handle lock/unlock pixels. For performance
23 * reasons, simple malloc-based subclasses call setPreLocked() to skip 24 * reasons, simple malloc-based subclasses call setPreLocked() to skip
24 * the overhead of implementing these calls. 25 * the overhead of implementing these calls.
25 * 26 *
26 * This build-flag disables that optimization, to add in debugging our 27 * This build-flag disables that optimization, to add in debugging our
(...skipping 18 matching lines...) Expand all
45 46
46 This class can be shared/accessed between multiple threads. 47 This class can be shared/accessed between multiple threads.
47 */ 48 */
48 class SK_API SkPixelRef : public SkFlattenable { 49 class SK_API SkPixelRef : public SkFlattenable {
49 public: 50 public:
50 SK_DECLARE_INST_COUNT(SkPixelRef) 51 SK_DECLARE_INST_COUNT(SkPixelRef)
51 52
52 explicit SkPixelRef(SkBaseMutex* mutex = NULL); 53 explicit SkPixelRef(SkBaseMutex* mutex = NULL);
53 virtual ~SkPixelRef(); 54 virtual ~SkPixelRef();
54 55
56 struct LockRec {
57 void* fPixels;
58 SkColorTable* fColorTable;
59 size_t fRowBytes;
60
61 void zero() { sk_bzero(this, sizeof(*this)); }
62 };
63
64 /**
65 * Return the data's rowbytes. Will be 0 if the the lockCount is 0.
66 */
67 size_t rowBytes() const { return fRec.fRowBytes; }
68
55 /** Return the pixel memory returned from lockPixels, or null if the 69 /** Return the pixel memory returned from lockPixels, or null if the
56 lockCount is 0. 70 lockCount is 0.
57 */ 71 */
58 void* pixels() const { return fPixels; } 72 void* pixels() const { return fRec.fPixels; }
59 73
60 /** Return the current colorTable (if any) if pixels are locked, or null. 74 /** Return the current colorTable (if any) if pixels are locked, or null.
61 */ 75 */
62 SkColorTable* colorTable() const { return fColorTable; } 76 SkColorTable* colorTable() const { return fRec.fColorTable; }
63 77
64 /** 78 /**
65 * Returns true if the lockcount > 0 79 * Returns true if the lockcount > 0
66 */ 80 */
67 bool isLocked() const { return fLockCount > 0; } 81 bool isLocked() const { return fLockCount > 0; }
68 82
69 SkDEBUGCODE(int getLockCount() const { return fLockCount; }) 83 SkDEBUGCODE(int getLockCount() const { return fLockCount; })
70 84
71 /** Call to access the pixel memory, which is returned. Balance with a call 85 /** Call to access the pixel memory, which is returned. Balance with a call
72 to unlockPixels(). 86 to unlockPixels().
73 */ 87 */
74 void lockPixels(); 88 void lockPixels();
89
90 /**
91 * Call to access the pixel memory. On success, return true and fill out
92 * the specified rec. On failure, return false and ignore the rec parameter .
93 */
94 bool lockPixels(LockRec* rec);
95
75 /** Call to balanace a previous call to lockPixels(). Returns the pixels 96 /** Call to balanace a previous call to lockPixels(). Returns the pixels
76 (or null) after the unlock. NOTE: lock calls can be nested, but the 97 (or null) after the unlock. NOTE: lock calls can be nested, but the
77 matching number of unlock calls must be made in order to free the 98 matching number of unlock calls must be made in order to free the
78 memory (if the subclass implements caching/deferred-decoding.) 99 memory (if the subclass implements caching/deferred-decoding.)
79 */ 100 */
80 void unlockPixels(); 101 void unlockPixels();
81 102
82 /** 103 /**
83 * Some bitmaps can return a copy of their pixels for lockPixels(), but 104 * Some bitmaps can return a copy of their pixels for lockPixels(), but
84 * that copy, if modified, will not be pushed back. These bitmaps should 105 * that copy, if modified, will not be pushed back. These bitmaps should
85 * not be used as targets for a raster device/canvas (since all pixels 106 * not be used as targets for a raster device/canvas (since all pixels
86 * modifications will be lost when unlockPixels() is called.) 107 * modifications will be lost when unlockPixels() is called.)
87 */ 108 */
88 bool lockPixelsAreWritable() const; 109 bool lockPixelsAreWritable() const;
89 110
111 /**
112 * On success, return true and return the ImageInfo. On failure, return
113 * false and ignore the ImageInfo parameter.
114 */
115 bool getInfo(SkImageInfo*);
116
90 /** Returns a non-zero, unique value corresponding to the pixels in this 117 /** Returns a non-zero, unique value corresponding to the pixels in this
91 pixelref. Each time the pixels are changed (and notifyPixelsChanged is 118 pixelref. Each time the pixels are changed (and notifyPixelsChanged is
92 called), a different generation ID will be returned. 119 called), a different generation ID will be returned.
93 */ 120 */
94 uint32_t getGenerationID() const; 121 uint32_t getGenerationID() const;
95 122
96 /** Call this if you have changed the contents of the pixels. This will in- 123 /** Call this if you have changed the contents of the pixels. This will in-
97 turn cause a different generation ID value to be returned from 124 turn cause a different generation ID value to be returned from
98 getGenerationID(). 125 getGenerationID().
99 */ 126 */
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 // This can be used to invalidate caches keyed by SkPixelRef generation ID. 248 // This can be used to invalidate caches keyed by SkPixelRef generation ID.
222 struct GenIDChangeListener { 249 struct GenIDChangeListener {
223 virtual ~GenIDChangeListener() {} 250 virtual ~GenIDChangeListener() {}
224 virtual void onChange() = 0; 251 virtual void onChange() = 0;
225 }; 252 };
226 253
227 // Takes ownership of listener. 254 // Takes ownership of listener.
228 void addGenIDChangeListener(GenIDChangeListener* listener); 255 void addGenIDChangeListener(GenIDChangeListener* listener);
229 256
230 protected: 257 protected:
231 /** Called when the lockCount goes from 0 to 1. The caller will have already 258 /**
232 acquire a mutex for thread safety, so this method need not do that. 259 * Return the ImageInfo, returning true on success. On failure, return
233 */ 260 * false and ignore the info parameter.
234 virtual void* onLockPixels(SkColorTable**) = 0; 261 *
235 /** Called when the lock count goes from 1 to 0. The caller will have 262 * The caller will have already acquired a mutex for thread safety, so this
236 already acquire a mutex for thread safety, so this method need not do 263 * method need not do that.
237 that. 264 */
238 */ 265 virtual bool onGetInfo(SkImageInfo*) = 0;
266
267 /**
268 * On success, returns true and fills out the LockRec for the pixels. On
269 * failure returns false and ignores the LockRec parameter.
270 *
271 * The caller will have already acquired a mutex for thread safety, so this
272 * method need not do that.
273 */
274 virtual bool onNewLockPixels(LockRec*) = 0;
275
276 /**
277 * Balancing the previous successful call to onNewLockPixels. The locked
278 * pixel address will no longer be referenced, so the subclass is free to
279 * move or discard that memory.
280 *
281 * The caller will have already acquired a mutex for thread safety, so this
282 * method need not do that.
283 */
239 virtual void onUnlockPixels() = 0; 284 virtual void onUnlockPixels() = 0;
240 285
241 /** Default impl returns true */ 286 /** Default impl returns true */
242 virtual bool onLockPixelsAreWritable() const; 287 virtual bool onLockPixelsAreWritable() const;
243 288
244 // returns false; 289 // returns false;
245 virtual bool onImplementsDecodeInto(); 290 virtual bool onImplementsDecodeInto();
246 // returns false; 291 // returns false;
247 virtual bool onDecodeInto(int pow2, SkBitmap* bitmap); 292 virtual bool onDecodeInto(int pow2, SkBitmap* bitmap);
248 293
(...skipping 13 matching lines...) Expand all
262 */ 307 */
263 SkBaseMutex* mutex() const { return fMutex; } 308 SkBaseMutex* mutex() const { return fMutex; }
264 309
265 // serialization 310 // serialization
266 SkPixelRef(SkFlattenableReadBuffer&, SkBaseMutex*); 311 SkPixelRef(SkFlattenableReadBuffer&, SkBaseMutex*);
267 virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE; 312 virtual void flatten(SkFlattenableWriteBuffer&) const SK_OVERRIDE;
268 313
269 // only call from constructor. Flags this to always be locked, removing 314 // only call from constructor. Flags this to always be locked, removing
270 // the need to grab the mutex and call onLockPixels/onUnlockPixels. 315 // the need to grab the mutex and call onLockPixels/onUnlockPixels.
271 // Performance tweak to avoid those calls (esp. in multi-thread use case). 316 // Performance tweak to avoid those calls (esp. in multi-thread use case).
272 void setPreLocked(void* pixels, SkColorTable* ctable); 317 void setPreLocked(const SkImageInfo&, void*, size_t rowBytes, SkColorTable*) ;
273 318
274 private: 319 private:
275 SkBaseMutex* fMutex; // must remain in scope for the life of this object 320 SkBaseMutex* fMutex; // must remain in scope for the life of this object
276 void* fPixels; 321 SkImageInfo fInfo;
277 SkColorTable* fColorTable; // we do not track ownership, subclass does 322 LockRec fRec;
278 int fLockCount; 323 int fLockCount;
279 324
280 mutable uint32_t fGenerationID; 325 mutable uint32_t fGenerationID;
281 mutable bool fUniqueGenerationID; 326 mutable bool fUniqueGenerationID;
282 327
283 SkTDArray<GenIDChangeListener*> fGenIDChangeListeners; // pointers are owne d 328 SkTDArray<GenIDChangeListener*> fGenIDChangeListeners; // pointers are owne d
284 329
285 SkString fURI; 330 SkString fURI;
286 331
287 // can go from false to true, but never from true to false 332 // can go from false to true, but never from true to false
288 bool fIsImmutable; 333 bool fIsImmutable;
289 // only ever set in constructor, const after that 334 // only ever set in constructor, const after that
290 bool fPreLocked; 335 bool fPreLocked;
291 336
292 void needsNewGenID(); 337 void needsNewGenID();
293 void callGenIDChangeListeners(); 338 void callGenIDChangeListeners();
294 339
295 void setMutex(SkBaseMutex* mutex); 340 void setMutex(SkBaseMutex* mutex);
296 341
297 // When copying a bitmap to another with the same shape and config, we can s afely 342 // When copying a bitmap to another with the same shape and config, we can s afely
298 // clone the pixelref generation ID too, which makes them equivalent under c aching. 343 // clone the pixelref generation ID too, which makes them equivalent under c aching.
299 friend class SkBitmap; // only for cloneGenID 344 friend class SkBitmap; // only for cloneGenID
300 void cloneGenID(const SkPixelRef&); 345 void cloneGenID(const SkPixelRef&);
301 346
302 typedef SkFlattenable INHERITED; 347 typedef SkFlattenable INHERITED;
303 }; 348 };
304 349
305 #endif 350 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698