| Index: src/core/SkPixelRef.cpp
|
| diff --git a/src/core/SkPixelRef.cpp b/src/core/SkPixelRef.cpp
|
| index 90e2a40ea4fb92513d4ba351a366ec330ba2b207..1fda14b0258ad99609571e179896e15dbc2b4544 100644
|
| --- a/src/core/SkPixelRef.cpp
|
| +++ b/src/core/SkPixelRef.cpp
|
| @@ -160,8 +160,18 @@ void SkPixelRef::cloneGenID(const SkPixelRef& that) {
|
| SkASSERT(!that. genIDIsUnique());
|
| }
|
|
|
| +static void validate_pixels_ctable(const void* pixels, const SkColorTable* ctable, SkColorType ct) {
|
| + SkASSERT(pixels);
|
| + if (kIndex_8_SkColorType == ct) {
|
| + SkASSERT(ctable);
|
| + } else {
|
| + SkASSERT(NULL == ctable);
|
| + }
|
| +}
|
| +
|
| void SkPixelRef::setPreLocked(void* pixels, size_t rowBytes, SkColorTable* ctable) {
|
| #ifndef SK_IGNORE_PIXELREF_SETPRELOCKED
|
| + validate_pixels_ctable(pixels, ctable, fInfo.colorType());
|
| // only call me in your constructor, otherwise fLockCount tracking can get
|
| // out of sync.
|
| fRec.fPixels = pixels;
|
| @@ -172,38 +182,33 @@ void SkPixelRef::setPreLocked(void* pixels, size_t rowBytes, SkColorTable* ctabl
|
| #endif
|
| }
|
|
|
| -bool SkPixelRef::lockPixelsInsideMutex(LockRec* rec) {
|
| +// Increments fLockCount only on success
|
| +bool SkPixelRef::lockPixelsInsideMutex() {
|
| fMutex->assertHeld();
|
|
|
| - // For historical reasons, we always inc fLockCount, even if we return false.
|
| - // It would be nice to change this (it seems), and only inc if we actually succeed...
|
| if (1 == ++fLockCount) {
|
| SkASSERT(fRec.isZero());
|
| -
|
| - LockRec rec;
|
| - if (!this->onNewLockPixels(&rec)) {
|
| + if (!this->onNewLockPixels(&fRec)) {
|
| + fRec.zero();
|
| fLockCount -= 1; // we return fLockCount unchanged if we fail.
|
| return false;
|
| }
|
| - SkASSERT(!rec.isZero()); // else why did onNewLock return true?
|
| - fRec = rec;
|
| }
|
| - *rec = fRec;
|
| + validate_pixels_ctable(fRec.fPixels, fRec.fColorTable, fInfo.colorType());
|
| return true;
|
| }
|
|
|
| -bool SkPixelRef::lockPixels(LockRec* rec) {
|
| +// For historical reasons, we always inc fLockCount, even if we return false.
|
| +// It would be nice to change this (it seems), and only inc if we actually succeed...
|
| +bool SkPixelRef::lockPixels() {
|
| SkASSERT(!fPreLocked || SKPIXELREF_PRELOCKED_LOCKCOUNT == fLockCount);
|
|
|
| - if (fPreLocked) {
|
| - *rec = fRec;
|
| - return true;
|
| - } else {
|
| + if (!fPreLocked) {
|
| TRACE_EVENT_BEGIN0("skia", "SkPixelRef::lockPixelsMutex");
|
| SkAutoMutexAcquire ac(*fMutex);
|
| TRACE_EVENT_END0("skia", "SkPixelRef::lockPixelsMutex");
|
| SkDEBUGCODE(int oldCount = fLockCount;)
|
| - bool success = this->lockPixelsInsideMutex(rec);
|
| + bool success = this->lockPixelsInsideMutex();
|
| // lockPixelsInsideMutex only increments the count if it succeeds.
|
| SkASSERT(oldCount + (int)success == fLockCount);
|
|
|
| @@ -211,14 +216,19 @@ bool SkPixelRef::lockPixels(LockRec* rec) {
|
| // For compatibility with SkBitmap calling lockPixels, we still want to increment
|
| // fLockCount even if we failed. If we updated SkBitmap we could remove this oddity.
|
| fLockCount += 1;
|
| + return false;
|
| }
|
| - return success;
|
| }
|
| + validate_pixels_ctable(fRec.fPixels, fRec.fColorTable, fInfo.colorType());
|
| + return true;
|
| }
|
|
|
| -bool SkPixelRef::lockPixels() {
|
| - LockRec rec;
|
| - return this->lockPixels(&rec);
|
| +bool SkPixelRef::lockPixels(LockRec* rec) {
|
| + if (this->lockPixels()) {
|
| + *rec = fRec;
|
| + return true;
|
| + }
|
| + return false;
|
| }
|
|
|
| void SkPixelRef::unlockPixels() {
|
| @@ -253,11 +263,14 @@ bool SkPixelRef::requestLock(const LockRequest& request, LockResult* result) {
|
| result->fPixels = fRec.fPixels;
|
| result->fRowBytes = fRec.fRowBytes;
|
| result->fSize.set(fInfo.width(), fInfo.height());
|
| - return true;
|
| } else {
|
| SkAutoMutexAcquire ac(*fMutex);
|
| - return this->onRequestLock(request, result);
|
| + if (!this->onRequestLock(request, result)) {
|
| + return false;
|
| + }
|
| }
|
| + validate_pixels_ctable(result->fPixels, result->fCTable, fInfo.colorType());
|
| + return true;
|
| }
|
|
|
| bool SkPixelRef::lockPixelsAreWritable() const {
|
| @@ -358,16 +371,15 @@ static void unlock_legacy_result(void* ctx) {
|
| }
|
|
|
| bool SkPixelRef::onRequestLock(const LockRequest& request, LockResult* result) {
|
| - LockRec rec;
|
| - if (!this->lockPixelsInsideMutex(&rec)) {
|
| + if (!this->lockPixelsInsideMutex()) {
|
| return false;
|
| }
|
|
|
| result->fUnlockProc = unlock_legacy_result;
|
| result->fUnlockContext = SkRef(this); // this is balanced in our fUnlockProc
|
| - result->fCTable = rec.fColorTable;
|
| - result->fPixels = rec.fPixels;
|
| - result->fRowBytes = rec.fRowBytes;
|
| + result->fCTable = fRec.fColorTable;
|
| + result->fPixels = fRec.fPixels;
|
| + result->fRowBytes = fRec.fRowBytes;
|
| result->fSize.set(fInfo.width(), fInfo.height());
|
| return true;
|
| }
|
|
|