void* SkMetaData::set(const char name[], const void* data, size_t dataSize, Type type, int count) { SkASSERT(name); SkASSERT(dataSize); SkASSERT(count > 0); (void)this->remove(name, type); size_t len = strlen(name); Rec* rec = Rec::Alloc(sizeof(Rec) + dataSize * count + len + 1); #ifndef SK_DEBUG rec->fType = SkToU8(type); #else rec->fType = type; #endif rec->fDataLen = SkToU8(dataSize); rec->fDataCount = SkToU16(count); if (data) memcpy(rec->data(), data, dataSize * count); memcpy(rec->name(), name, len + 1); #ifdef SK_DEBUG rec->fName = rec->name(); switch (type) { case kS32_Type: rec->fData.fS32 = *(const int32_t*)rec->data(); break; case kScalar_Type: rec->fData.fScalar = *(const SkScalar*)rec->data(); break; case kString_Type: rec->fData.fString = (const char*)rec->data(); break; case kPtr_Type: rec->fData.fPtr = *(void**)rec->data(); break; case kBool_Type: rec->fData.fBool = *(const bool*)rec->data(); break; default: SkASSERT(!"bad type"); break; } #endif rec->fNext = fRec; fRec = rec; return rec->data(); }
bool SkMetaData::remove(const char name[], Type type) { Rec* rec = fRec; Rec* prev = nullptr; while (rec) { Rec* next = rec->fNext; if (rec->fType == type && !strcmp(rec->name(), name)) { if (prev) { prev->fNext = next; } else { fRec = next; } if (kPtr_Type == type) { PtrPair* pair = (PtrPair*)rec->data(); if (pair->fProc && pair->fPtr) { (void)pair->fProc(pair->fPtr, false); } } Rec::Free(rec); return true; } prev = rec; rec = next; } return false; }
void* SkMetaData::set(const char name[], const void* data, size_t dataSize, Type type, int count) { SkASSERT(name); SkASSERT(dataSize); SkASSERT(count > 0); (void)this->remove(name, type); size_t len = strlen(name); Rec* rec = Rec::Alloc(sizeof(Rec) + dataSize * count + len + 1); #ifndef SK_DEBUG rec->fType = SkToU8(type); #else rec->fType = type; #endif rec->fDataLen = SkToU8(dataSize); rec->fDataCount = SkToU16(count); if (data) memcpy(rec->data(), data, dataSize * count); memcpy(rec->name(), name, len + 1); if (kPtr_Type == type) { PtrPair* pair = (PtrPair*)rec->data(); if (pair->fProc && pair->fPtr) { pair->fPtr = pair->fProc(pair->fPtr, true); } } rec->fNext = fRec; fRec = rec; return rec->data(); }
bool SkMetaData::remove(const char name[], Type type) { Rec* rec = fRec; Rec* prev = NULL; while (rec) { Rec* next = rec->fNext; if (rec->fType == type && !strcmp(rec->name(), name)) { if (prev) prev->fNext = next; else fRec = next; Rec::Free(rec); return true; } prev = rec; rec = next; } return false; }