| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 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 #include "SkPixelRef.h" | 8 #include "SkPixelRef.h" |
| 9 #include "SkReadBuffer.h" | 9 #include "SkReadBuffer.h" |
| 10 #include "SkWriteBuffer.h" | 10 #include "SkWriteBuffer.h" |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 const_cast<SkAlphaType*>(&fInfo.
fAlphaType))); | 101 const_cast<SkAlphaType*>(&fInfo.
fAlphaType))); |
| 102 | 102 |
| 103 this->setMutex(mutex); | 103 this->setMutex(mutex); |
| 104 fRec.zero(); | 104 fRec.zero(); |
| 105 fLockCount = 0; | 105 fLockCount = 0; |
| 106 this->needsNewGenID(); | 106 this->needsNewGenID(); |
| 107 fIsImmutable = false; | 107 fIsImmutable = false; |
| 108 fPreLocked = false; | 108 fPreLocked = false; |
| 109 } | 109 } |
| 110 | 110 |
| 111 #ifdef SK_SUPPORT_LEGACY_PIXELREF_UNFLATTENABLE |
| 111 static SkImageInfo read_info(SkReadBuffer& buffer) { | 112 static SkImageInfo read_info(SkReadBuffer& buffer) { |
| 112 SkImageInfo info; | 113 SkImageInfo info; |
| 113 info.unflatten(buffer); | 114 info.unflatten(buffer); |
| 114 return info; | 115 return info; |
| 115 } | 116 } |
| 116 | 117 |
| 117 SkPixelRef::SkPixelRef(SkReadBuffer& buffer, SkBaseMutex* mutex) | 118 SkPixelRef::SkPixelRef(SkReadBuffer& buffer, SkBaseMutex* mutex) |
| 118 : INHERITED(buffer) | 119 : INHERITED(buffer) |
| 119 , fInfo(read_info(buffer)) | 120 , fInfo(read_info(buffer)) |
| 120 { | 121 { |
| 121 SkDEBUGCODE(SkAlphaType alphaType;) | 122 SkDEBUGCODE(SkAlphaType alphaType;) |
| 122 SkASSERT(SkColorTypeValidateAlphaType(fInfo.colorType(), fInfo.alphaType(),
&alphaType)); | 123 SkASSERT(SkColorTypeValidateAlphaType(fInfo.colorType(), fInfo.alphaType(),
&alphaType)); |
| 123 SkASSERT(fInfo.fAlphaType == alphaType); | 124 SkASSERT(fInfo.fAlphaType == alphaType); |
| 124 | 125 |
| 125 this->setMutex(mutex); | 126 this->setMutex(mutex); |
| 126 fRec.zero(); | 127 fRec.zero(); |
| 127 fLockCount = 0; | 128 fLockCount = 0; |
| 128 fIsImmutable = buffer.readBool(); | 129 fIsImmutable = buffer.readBool(); |
| 129 fGenerationID = buffer.readUInt(); | 130 fGenerationID = buffer.readUInt(); |
| 130 fUniqueGenerationID = false; // Conservatively assuming the original still
exists. | 131 fUniqueGenerationID = false; // Conservatively assuming the original still
exists. |
| 131 fPreLocked = false; | 132 fPreLocked = false; |
| 132 } | 133 } |
| 134 #endif |
| 133 | 135 |
| 134 SkPixelRef::~SkPixelRef() { | 136 SkPixelRef::~SkPixelRef() { |
| 135 this->callGenIDChangeListeners(); | 137 this->callGenIDChangeListeners(); |
| 136 } | 138 } |
| 137 | 139 |
| 138 void SkPixelRef::needsNewGenID() { | 140 void SkPixelRef::needsNewGenID() { |
| 139 fGenerationID = 0; | 141 fGenerationID = 0; |
| 140 fUniqueGenerationID = false; | 142 fUniqueGenerationID = false; |
| 141 } | 143 } |
| 142 | 144 |
| 143 void SkPixelRef::cloneGenID(const SkPixelRef& that) { | 145 void SkPixelRef::cloneGenID(const SkPixelRef& that) { |
| 144 // This is subtle. We must call that.getGenerationID() to make sure its gen
ID isn't 0. | 146 // This is subtle. We must call that.getGenerationID() to make sure its gen
ID isn't 0. |
| 145 this->fGenerationID = that.getGenerationID(); | 147 this->fGenerationID = that.getGenerationID(); |
| 146 this->fUniqueGenerationID = false; | 148 this->fUniqueGenerationID = false; |
| 147 that.fUniqueGenerationID = false; | 149 that.fUniqueGenerationID = false; |
| 148 } | 150 } |
| 149 | 151 |
| 150 void SkPixelRef::setPreLocked(void* pixels, size_t rowBytes, SkColorTable* ctabl
e) { | 152 void SkPixelRef::setPreLocked(void* pixels, size_t rowBytes, SkColorTable* ctabl
e) { |
| 151 #ifndef SK_IGNORE_PIXELREF_SETPRELOCKED | 153 #ifndef SK_IGNORE_PIXELREF_SETPRELOCKED |
| 152 // only call me in your constructor, otherwise fLockCount tracking can get | 154 // only call me in your constructor, otherwise fLockCount tracking can get |
| 153 // out of sync. | 155 // out of sync. |
| 154 fRec.fPixels = pixels; | 156 fRec.fPixels = pixels; |
| 155 fRec.fColorTable = ctable; | 157 fRec.fColorTable = ctable; |
| 156 fRec.fRowBytes = rowBytes; | 158 fRec.fRowBytes = rowBytes; |
| 157 fLockCount = SKPIXELREF_PRELOCKED_LOCKCOUNT; | 159 fLockCount = SKPIXELREF_PRELOCKED_LOCKCOUNT; |
| 158 fPreLocked = true; | 160 fPreLocked = true; |
| 159 #endif | 161 #endif |
| 160 } | 162 } |
| 161 | 163 |
| 162 void SkPixelRef::flatten(SkWriteBuffer& buffer) const { | |
| 163 this->INHERITED::flatten(buffer); | |
| 164 fInfo.flatten(buffer); | |
| 165 buffer.writeBool(fIsImmutable); | |
| 166 // We write the gen ID into the picture for within-process recording. This | |
| 167 // is safe since the same genID will never refer to two different sets of | |
| 168 // pixels (barring overflow). However, each process has its own "namespace" | |
| 169 // of genIDs. So for cross-process recording we write a zero which will | |
| 170 // trigger assignment of a new genID in playback. | |
| 171 if (buffer.isCrossProcess()) { | |
| 172 buffer.writeUInt(0); | |
| 173 } else { | |
| 174 buffer.writeUInt(fGenerationID); | |
| 175 fUniqueGenerationID = false; // Conservative, a copy is probably about
to exist. | |
| 176 } | |
| 177 } | |
| 178 | |
| 179 bool SkPixelRef::lockPixels(LockRec* rec) { | 164 bool SkPixelRef::lockPixels(LockRec* rec) { |
| 180 SkASSERT(!fPreLocked || SKPIXELREF_PRELOCKED_LOCKCOUNT == fLockCount); | 165 SkASSERT(!fPreLocked || SKPIXELREF_PRELOCKED_LOCKCOUNT == fLockCount); |
| 181 | 166 |
| 182 if (!fPreLocked) { | 167 if (!fPreLocked) { |
| 183 SkAutoMutexAcquire ac(*fMutex); | 168 SkAutoMutexAcquire ac(*fMutex); |
| 184 | 169 |
| 185 if (1 == ++fLockCount) { | 170 if (1 == ++fLockCount) { |
| 186 SkASSERT(fRec.isZero()); | 171 SkASSERT(fRec.isZero()); |
| 187 | 172 |
| 188 LockRec rec; | 173 LockRec rec; |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 | 288 |
| 304 #ifdef SK_BUILD_FOR_ANDROID | 289 #ifdef SK_BUILD_FOR_ANDROID |
| 305 void SkPixelRef::globalRef(void* data) { | 290 void SkPixelRef::globalRef(void* data) { |
| 306 this->ref(); | 291 this->ref(); |
| 307 } | 292 } |
| 308 | 293 |
| 309 void SkPixelRef::globalUnref() { | 294 void SkPixelRef::globalUnref() { |
| 310 this->unref(); | 295 this->unref(); |
| 311 } | 296 } |
| 312 #endif | 297 #endif |
| OLD | NEW |