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

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

Issue 1289623004: Every pixel ref gets its own mutex. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: mutable Created 5 years, 4 months 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
« no previous file with comments | « no previous file | src/core/SkPixelRef.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2008 The Android Open Source Project 2 * Copyright 2008 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkPixelRef_DEFINED 8 #ifndef SkPixelRef_DEFINED
9 #define SkPixelRef_DEFINED 9 #define SkPixelRef_DEFINED
10 10
(...skipping 18 matching lines...) Expand all
29 29
30 This class is the smart container for pixel memory, and is used with 30 This class is the smart container for pixel memory, and is used with
31 SkBitmap. A pixelref is installed into a bitmap, and then the bitmap can 31 SkBitmap. A pixelref is installed into a bitmap, and then the bitmap can
32 access the actual pixel memory by calling lockPixels/unlockPixels. 32 access the actual pixel memory by calling lockPixels/unlockPixels.
33 33
34 This class can be shared/accessed between multiple threads. 34 This class can be shared/accessed between multiple threads.
35 */ 35 */
36 class SK_API SkPixelRef : public SkRefCnt { 36 class SK_API SkPixelRef : public SkRefCnt {
37 public: 37 public:
38 explicit SkPixelRef(const SkImageInfo&); 38 explicit SkPixelRef(const SkImageInfo&);
39 SkPixelRef(const SkImageInfo&, SkBaseMutex* mutex);
40 virtual ~SkPixelRef(); 39 virtual ~SkPixelRef();
41 40
42 const SkImageInfo& info() const { 41 const SkImageInfo& info() const {
43 return fInfo; 42 return fInfo;
44 } 43 }
45 44
46 /** Return the pixel memory returned from lockPixels, or null if the 45 /** Return the pixel memory returned from lockPixels, or null if the
47 lockCount is 0. 46 lockCount is 0.
48 */ 47 */
49 void* pixels() const { return fRec.fPixels; } 48 void* pixels() const { return fRec.fPixels; }
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 * 311 *
313 * @return default impl returns 0. 312 * @return default impl returns 0.
314 */ 313 */
315 virtual size_t getAllocatedSizeInBytes() const; 314 virtual size_t getAllocatedSizeInBytes() const;
316 315
317 virtual bool onRequestLock(const LockRequest&, LockResult*); 316 virtual bool onRequestLock(const LockRequest&, LockResult*);
318 317
319 /** Return the mutex associated with this pixelref. This value is assigned 318 /** Return the mutex associated with this pixelref. This value is assigned
320 in the constructor, and cannot change during the lifetime of the object. 319 in the constructor, and cannot change during the lifetime of the object.
321 */ 320 */
322 SkBaseMutex* mutex() const { return fMutex; } 321 SkBaseMutex* mutex() const { return &fMutex; }
323 322
324 // only call from constructor. Flags this to always be locked, removing 323 // only call from constructor. Flags this to always be locked, removing
325 // the need to grab the mutex and call onLockPixels/onUnlockPixels. 324 // the need to grab the mutex and call onLockPixels/onUnlockPixels.
326 // Performance tweak to avoid those calls (esp. in multi-thread use case). 325 // Performance tweak to avoid those calls (esp. in multi-thread use case).
327 void setPreLocked(void*, size_t rowBytes, SkColorTable*); 326 void setPreLocked(void*, size_t rowBytes, SkColorTable*);
328 327
329 private: 328 private:
330 SkBaseMutex* fMutex; // must remain in scope for the life of this object 329 mutable SkMutex fMutex;
331 330
332 // mostly const. fInfo.fAlpahType can be changed at runtime. 331 // mostly const. fInfo.fAlpahType can be changed at runtime.
333 const SkImageInfo fInfo; 332 const SkImageInfo fInfo;
334 333
335 // LockRec is only valid if we're in a locked state (isLocked()) 334 // LockRec is only valid if we're in a locked state (isLocked())
336 LockRec fRec; 335 LockRec fRec;
337 int fLockCount; 336 int fLockCount;
338 337
339 bool lockPixelsInsideMutex(); 338 bool lockPixelsInsideMutex();
340 339
(...skipping 17 matching lines...) Expand all
358 kTemporarilyImmutable, // Considered immutable, but can revert to mutab le. 357 kTemporarilyImmutable, // Considered immutable, but can revert to mutab le.
359 kImmutable, // Once set to this state, it never leaves. 358 kImmutable, // Once set to this state, it never leaves.
360 } fMutability : 8; // easily fits inside a byte 359 } fMutability : 8; // easily fits inside a byte
361 360
362 // only ever set in constructor, const after that 361 // only ever set in constructor, const after that
363 bool fPreLocked; 362 bool fPreLocked;
364 363
365 void needsNewGenID(); 364 void needsNewGenID();
366 void callGenIDChangeListeners(); 365 void callGenIDChangeListeners();
367 366
368 void setMutex(SkBaseMutex* mutex);
369
370 void setTemporarilyImmutable(); 367 void setTemporarilyImmutable();
371 void restoreMutability(); 368 void restoreMutability();
372 friend class SkSurface_Raster; // For the two methods above. 369 friend class SkSurface_Raster; // For the two methods above.
373 370
374 bool isPreLocked() const { return fPreLocked; } 371 bool isPreLocked() const { return fPreLocked; }
375 friend class SkImage_Raster; 372 friend class SkImage_Raster;
376 373
377 // When copying a bitmap to another with the same shape and config, we can s afely 374 // When copying a bitmap to another with the same shape and config, we can s afely
378 // clone the pixelref generation ID too, which makes them equivalent under c aching. 375 // clone the pixelref generation ID too, which makes them equivalent under c aching.
379 friend class SkBitmap; // only for cloneGenID 376 friend class SkBitmap; // only for cloneGenID
(...skipping 10 matching lines...) Expand all
390 /** 387 /**
391 * Allocate a new pixelref matching the specified ImageInfo, allocating 388 * Allocate a new pixelref matching the specified ImageInfo, allocating
392 * the memory for the pixels. If the ImageInfo requires a ColorTable, 389 * the memory for the pixels. If the ImageInfo requires a ColorTable,
393 * the pixelref will ref() the colortable. 390 * the pixelref will ref() the colortable.
394 * On failure return NULL. 391 * On failure return NULL.
395 */ 392 */
396 virtual SkPixelRef* create(const SkImageInfo&, size_t rowBytes, SkColorTable *) = 0; 393 virtual SkPixelRef* create(const SkImageInfo&, size_t rowBytes, SkColorTable *) = 0;
397 }; 394 };
398 395
399 #endif 396 #endif
OLDNEW
« no previous file with comments | « no previous file | src/core/SkPixelRef.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698