Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 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 #include "SkBitmapCache.h" | 8 #include "SkBitmapCache.h" |
| 9 #include "SkPixelRef.h" | 9 #include "SkPixelRef.h" |
| 10 #include "SkThread.h" | 10 #include "SkThread.h" |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 145 // only call me in your constructor, otherwise fLockCount tracking can get | 145 // only call me in your constructor, otherwise fLockCount tracking can get |
| 146 // out of sync. | 146 // out of sync. |
| 147 fRec.fPixels = pixels; | 147 fRec.fPixels = pixels; |
| 148 fRec.fColorTable = ctable; | 148 fRec.fColorTable = ctable; |
| 149 fRec.fRowBytes = rowBytes; | 149 fRec.fRowBytes = rowBytes; |
| 150 fLockCount = SKPIXELREF_PRELOCKED_LOCKCOUNT; | 150 fLockCount = SKPIXELREF_PRELOCKED_LOCKCOUNT; |
| 151 fPreLocked = true; | 151 fPreLocked = true; |
| 152 #endif | 152 #endif |
| 153 } | 153 } |
| 154 | 154 |
| 155 bool SkPixelRef::lockPixelsInsideMutex(LockRec* rec) { | |
|
scroggo
2015/05/19 20:11:42
fMutex->assertHeld();
reed1
2015/05/21 20:59:35
Done.
| |
| 156 if (1 == ++fLockCount) { | |
| 157 SkASSERT(fRec.isZero()); | |
| 158 | |
| 159 LockRec rec; | |
| 160 if (!this->onNewLockPixels(&rec)) { | |
| 161 return false; | |
| 162 } | |
| 163 SkASSERT(!rec.isZero()); // else why did onNewLock return true? | |
| 164 fRec = rec; | |
| 165 } | |
| 166 *rec = fRec; | |
| 167 return true; | |
| 168 } | |
| 169 | |
| 155 bool SkPixelRef::lockPixels(LockRec* rec) { | 170 bool SkPixelRef::lockPixels(LockRec* rec) { |
| 156 SkASSERT(!fPreLocked || SKPIXELREF_PRELOCKED_LOCKCOUNT == fLockCount); | 171 SkASSERT(!fPreLocked || SKPIXELREF_PRELOCKED_LOCKCOUNT == fLockCount); |
| 157 | 172 |
| 158 if (!fPreLocked) { | 173 if (fPreLocked) { |
| 174 *rec = fRec; | |
| 175 return true; | |
| 176 } else { | |
| 159 TRACE_EVENT_BEGIN0("skia", "SkPixelRef::lockPixelsMutex"); | 177 TRACE_EVENT_BEGIN0("skia", "SkPixelRef::lockPixelsMutex"); |
| 160 SkAutoMutexAcquire ac(*fMutex); | 178 SkAutoMutexAcquire ac(*fMutex); |
| 161 TRACE_EVENT_END0("skia", "SkPixelRef::lockPixelsMutex"); | 179 TRACE_EVENT_END0("skia", "SkPixelRef::lockPixelsMutex"); |
| 162 | 180 return this->lockPixelsInsideMutex(rec); |
| 163 if (1 == ++fLockCount) { | |
| 164 SkASSERT(fRec.isZero()); | |
| 165 | |
| 166 LockRec rec; | |
| 167 if (!this->onNewLockPixels(&rec)) { | |
| 168 return false; | |
| 169 } | |
| 170 SkASSERT(!rec.isZero()); // else why did onNewLock return true? | |
| 171 fRec = rec; | |
| 172 } | |
| 173 } | 181 } |
| 174 *rec = fRec; | |
| 175 return true; | |
| 176 } | 182 } |
| 177 | 183 |
| 178 bool SkPixelRef::lockPixels() { | 184 bool SkPixelRef::lockPixels() { |
| 179 LockRec rec; | 185 LockRec rec; |
| 180 return this->lockPixels(&rec); | 186 return this->lockPixels(&rec); |
| 181 } | 187 } |
| 182 | 188 |
| 183 void SkPixelRef::unlockPixels() { | 189 void SkPixelRef::unlockPixels() { |
| 184 SkASSERT(!fPreLocked || SKPIXELREF_PRELOCKED_LOCKCOUNT == fLockCount); | 190 SkASSERT(!fPreLocked || SKPIXELREF_PRELOCKED_LOCKCOUNT == fLockCount); |
| 185 | 191 |
| 186 if (!fPreLocked) { | 192 if (!fPreLocked) { |
| 187 SkAutoMutexAcquire ac(*fMutex); | 193 SkAutoMutexAcquire ac(*fMutex); |
| 188 | 194 |
| 189 SkASSERT(fLockCount > 0); | 195 SkASSERT(fLockCount > 0); |
| 190 if (0 == --fLockCount) { | 196 if (0 == --fLockCount) { |
| 191 // don't call onUnlockPixels unless onLockPixels succeeded | 197 // don't call onUnlockPixels unless onLockPixels succeeded |
| 192 if (fRec.fPixels) { | 198 if (fRec.fPixels) { |
| 193 this->onUnlockPixels(); | 199 this->onUnlockPixels(); |
| 194 fRec.zero(); | 200 fRec.zero(); |
| 195 } else { | 201 } else { |
| 196 SkASSERT(fRec.isZero()); | 202 SkASSERT(fRec.isZero()); |
| 197 } | 203 } |
| 198 } | 204 } |
| 199 } | 205 } |
| 200 } | 206 } |
| 201 | 207 |
| 208 bool SkPixelRef::requestLock(const LockRequest& request, LockResult* result) { | |
| 209 SkASSERT(result); | |
| 210 if (request.fSize.isEmpty()) { | |
| 211 return false; | |
| 212 } | |
| 213 | |
| 214 if (fPreLocked) { | |
| 215 result->fUnlockProc = NULL; | |
| 216 result->fUnlockContext = NULL; | |
| 217 result->fCTable = fRec.fColorTable; | |
| 218 result->fPixels = fRec.fPixels; | |
| 219 result->fRowBytes = fRec.fRowBytes; | |
| 220 result->fSize.set(fInfo.width(), fInfo.height()); | |
| 221 return true; | |
| 222 } else { | |
| 223 SkAutoMutexAcquire ac(*fMutex); | |
| 224 return this->onRequestLock(request, result); | |
| 225 } | |
| 226 } | |
| 227 | |
| 202 bool SkPixelRef::lockPixelsAreWritable() const { | 228 bool SkPixelRef::lockPixelsAreWritable() const { |
| 203 return this->onLockPixelsAreWritable(); | 229 return this->onLockPixelsAreWritable(); |
| 204 } | 230 } |
| 205 | 231 |
| 206 bool SkPixelRef::onLockPixelsAreWritable() const { | 232 bool SkPixelRef::onLockPixelsAreWritable() const { |
| 207 return true; | 233 return true; |
| 208 } | 234 } |
| 209 | 235 |
| 210 uint32_t SkPixelRef::getGenerationID() const { | 236 uint32_t SkPixelRef::getGenerationID() const { |
| 211 uint32_t id = fTaggedGenID.load(); | 237 uint32_t id = fTaggedGenID.load(); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 264 } | 290 } |
| 265 | 291 |
| 266 void SkPixelRef::setImmutable() { | 292 void SkPixelRef::setImmutable() { |
| 267 fIsImmutable = true; | 293 fIsImmutable = true; |
| 268 } | 294 } |
| 269 | 295 |
| 270 bool SkPixelRef::readPixels(SkBitmap* dst, const SkIRect* subset) { | 296 bool SkPixelRef::readPixels(SkBitmap* dst, const SkIRect* subset) { |
| 271 return this->onReadPixels(dst, subset); | 297 return this->onReadPixels(dst, subset); |
| 272 } | 298 } |
| 273 | 299 |
| 300 //////////////////////////////////////////////////////////////////////////////// /////////////////// | |
| 301 | |
| 274 bool SkPixelRef::onReadPixels(SkBitmap* dst, const SkIRect* subset) { | 302 bool SkPixelRef::onReadPixels(SkBitmap* dst, const SkIRect* subset) { |
| 275 return false; | 303 return false; |
| 276 } | 304 } |
| 277 | 305 |
| 278 SkData* SkPixelRef::onRefEncodedData() { | 306 SkData* SkPixelRef::onRefEncodedData() { |
| 279 return NULL; | 307 return NULL; |
| 280 } | 308 } |
| 281 | 309 |
| 282 bool SkPixelRef::onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBy tes[3], | 310 bool SkPixelRef::onGetYUV8Planes(SkISize sizes[3], void* planes[3], size_t rowBy tes[3], |
| 283 SkYUVColorSpace* colorSpace) { | 311 SkYUVColorSpace* colorSpace) { |
| 284 return false; | 312 return false; |
| 285 } | 313 } |
| 286 | 314 |
| 287 size_t SkPixelRef::getAllocatedSizeInBytes() const { | 315 size_t SkPixelRef::getAllocatedSizeInBytes() const { |
| 288 return 0; | 316 return 0; |
| 289 } | 317 } |
| 290 | 318 |
| 319 static void unlock_legacy_result(void* ctx) { | |
| 320 SkPixelRef* pr = (SkPixelRef*)ctx; | |
| 321 pr->unlockPixels(); | |
| 322 } | |
| 323 | |
| 324 bool SkPixelRef::onRequestLock(const LockRequest& request, LockResult* result) { | |
| 325 LockRec rec; | |
| 326 if (!this->lockPixelsInsideMutex(&rec)) { | |
| 327 return false; | |
| 328 } | |
| 329 | |
| 330 result->fUnlockProc = unlock_legacy_result; | |
| 331 result->fUnlockContext = SkRef(this); | |
| 332 result->fCTable = rec.fColorTable; | |
| 333 result->fPixels = rec.fPixels; | |
| 334 result->fRowBytes = rec.fRowBytes; | |
| 335 result->fSize.set(fInfo.width(), fInfo.height()); | |
| 336 return true; | |
| 337 } | |
| OLD | NEW |