| OLD | NEW |
| (Empty) |
| 1 #include "SkPixelRef.h" | |
| 2 #include "SkFlattenable.h" | |
| 3 #include "SkThread.h" | |
| 4 | |
| 5 static SkMutex gPixelRefMutex; | |
| 6 static int32_t gPixelRefGenerationID; | |
| 7 | |
| 8 SkPixelRef::SkPixelRef(SkMutex* mutex) { | |
| 9 if (NULL == mutex) { | |
| 10 mutex = &gPixelRefMutex; | |
| 11 } | |
| 12 fMutex = mutex; | |
| 13 fPixels = NULL; | |
| 14 fColorTable = NULL; // we do not track ownership of this | |
| 15 fLockCount = 0; | |
| 16 fGenerationID = 0; // signal to rebuild | |
| 17 fIsImmutable = false; | |
| 18 } | |
| 19 | |
| 20 SkPixelRef::SkPixelRef(SkFlattenableReadBuffer& buffer, SkMutex* mutex) { | |
| 21 if (NULL == mutex) { | |
| 22 mutex = &gPixelRefMutex; | |
| 23 } | |
| 24 fMutex = mutex; | |
| 25 fPixels = NULL; | |
| 26 fColorTable = NULL; // we do not track ownership of this | |
| 27 fLockCount = 0; | |
| 28 fGenerationID = 0; // signal to rebuild | |
| 29 fIsImmutable = buffer.readBool(); | |
| 30 } | |
| 31 | |
| 32 void SkPixelRef::flatten(SkFlattenableWriteBuffer& buffer) const { | |
| 33 buffer.writeBool(fIsImmutable); | |
| 34 } | |
| 35 | |
| 36 void SkPixelRef::lockPixels() { | |
| 37 SkAutoMutexAcquire ac(*fMutex); | |
| 38 | |
| 39 if (1 == ++fLockCount) { | |
| 40 fPixels = this->onLockPixels(&fColorTable); | |
| 41 } | |
| 42 } | |
| 43 | |
| 44 void SkPixelRef::unlockPixels() { | |
| 45 SkAutoMutexAcquire ac(*fMutex); | |
| 46 | |
| 47 SkASSERT(fLockCount > 0); | |
| 48 if (0 == --fLockCount) { | |
| 49 this->onUnlockPixels(); | |
| 50 fPixels = NULL; | |
| 51 fColorTable = NULL; | |
| 52 } | |
| 53 } | |
| 54 | |
| 55 uint32_t SkPixelRef::getGenerationID() const { | |
| 56 uint32_t genID = fGenerationID; | |
| 57 if (0 == genID) { | |
| 58 // do a loop in case our global wraps around, as we never want to | |
| 59 // return a 0 | |
| 60 do { | |
| 61 genID = sk_atomic_inc(&gPixelRefGenerationID) + 1; | |
| 62 } while (0 == genID); | |
| 63 fGenerationID = genID; | |
| 64 } | |
| 65 return genID; | |
| 66 } | |
| 67 | |
| 68 void SkPixelRef::notifyPixelsChanged() { | |
| 69 if (fIsImmutable) { | |
| 70 SkDebugf("========== notifyPixelsChanged called on immutable pixelref"); | |
| 71 sk_throw(); | |
| 72 } | |
| 73 // this signals us to recompute this next time around | |
| 74 fGenerationID = 0; | |
| 75 } | |
| 76 | |
| 77 void SkPixelRef::setImmutable() { | |
| 78 fIsImmutable = true; | |
| 79 } | |
| 80 | |
| 81 /////////////////////////////////////////////////////////////////////////////// | |
| 82 | |
| 83 #define MAX_PAIR_COUNT 16 | |
| 84 | |
| 85 struct Pair { | |
| 86 const char* fName; | |
| 87 SkPixelRef::Factory fFactory; | |
| 88 }; | |
| 89 | |
| 90 static int gCount; | |
| 91 static Pair gPairs[MAX_PAIR_COUNT]; | |
| 92 | |
| 93 void SkPixelRef::Register(const char name[], Factory factory) { | |
| 94 SkASSERT(name); | |
| 95 SkASSERT(factory); | |
| 96 | |
| 97 static bool gOnce; | |
| 98 if (!gOnce) { | |
| 99 gCount = 0; | |
| 100 gOnce = true; | |
| 101 } | |
| 102 | |
| 103 SkASSERT(gCount < MAX_PAIR_COUNT); | |
| 104 | |
| 105 gPairs[gCount].fName = name; | |
| 106 gPairs[gCount].fFactory = factory; | |
| 107 gCount += 1; | |
| 108 } | |
| 109 | |
| 110 SkPixelRef::Factory SkPixelRef::NameToFactory(const char name[]) { | |
| 111 const Pair* pairs = gPairs; | |
| 112 for (int i = gCount - 1; i >= 0; --i) { | |
| 113 if (strcmp(pairs[i].fName, name) == 0) { | |
| 114 return pairs[i].fFactory; | |
| 115 } | |
| 116 } | |
| 117 return NULL; | |
| 118 } | |
| 119 | |
| 120 const char* SkPixelRef::FactoryToName(Factory fact) { | |
| 121 const Pair* pairs = gPairs; | |
| 122 for (int i = gCount - 1; i >= 0; --i) { | |
| 123 if (pairs[i].fFactory == fact) { | |
| 124 return pairs[i].fName; | |
| 125 } | |
| 126 } | |
| 127 return NULL; | |
| 128 } | |
| 129 | |
| OLD | NEW |