SkFlattenable* SkFlattenableReadBuffer::readFlattenable() { SkFlattenable::Factory factory = NULL; if (fFactoryCount > 0) { int32_t index = this->readU32(); if (0 == index) { return NULL; // writer failed to give us the flattenable } index = -index; // we stored the negative of the index index -= 1; // we stored the index-base-1 SkASSERT(index < fFactoryCount); factory = fFactoryArray[index]; } else if (fFactoryTDArray) { const int32_t* peek = (const int32_t*)this->peek(); if (*peek <= 0) { int32_t index = this->readU32(); if (0 == index) { return NULL; // writer failed to give us the flattenable } index = -index; // we stored the negative of the index index -= 1; // we stored the index-base-1 factory = (*fFactoryTDArray)[index]; } else { const char* name = this->readString(); factory = SkFlattenable::NameToFactory(name); if (factory) { SkASSERT(fFactoryTDArray->find(factory) < 0); *fFactoryTDArray->append() = factory; } else { // SkDebugf("can't find factory for [%s]\n", name); } // if we didn't find a factory, that's our failure, not the writer's, // so we fall through, so we can skip the sizeRecorded data. } } else { factory = (SkFlattenable::Factory)readFunctionPtr(); if (NULL == factory) { return NULL; // writer failed to give us the flattenable } } // if we get here, factory may still be null, but if that is the case, the // failure was ours, not the writer. SkFlattenable* obj = NULL; uint32_t sizeRecorded = this->readU32(); if (factory) { uint32_t offset = this->offset(); obj = (*factory)(*this); // check that we read the amount we expected uint32_t sizeRead = this->offset() - offset; if (sizeRecorded != sizeRead) { // we could try to fix up the offset... sk_throw(); } } else { // we must skip the remaining data this->skip(sizeRecorded); } return obj; }
SkFlattenable* SkFlattenableReadBuffer::readFlattenable() { SkFlattenable::Factory factory = NULL; if (fFactoryCount > 0) { uint32_t index = this->readU32(); if (index > 0) { index -= 1; SkASSERT(index < (unsigned)fFactoryCount); factory = fFactoryArray[index]; // if we recorded an index, but failed to get a factory, we need // to skip the flattened data in the buffer if (NULL == factory) { uint32_t size = this->readU32(); this->skip(size); // fall through and return NULL for the object } } } else { factory = (SkFlattenable::Factory)readFunctionPtr(); } SkFlattenable* obj = NULL; if (factory) { uint32_t sizeRecorded = this->readU32(); uint32_t offset = this->offset(); obj = (*factory)(*this); // check that we read the amount we expected uint32_t sizeRead = this->offset() - offset; if (sizeRecorded != sizeRead) { // we could try to fix up the offset... sk_throw(); } } return obj; }
SkFlattenable* SkOrderedReadBuffer::readFlattenable() { SkFlattenable::Factory factory = NULL; if (fFactoryCount > 0) { int32_t index = fReader.readU32(); if (0 == index) { return NULL; // writer failed to give us the flattenable } index -= 1; // we stored the index-base-1 SkASSERT(index < fFactoryCount); factory = fFactoryArray[index]; } else if (fFactoryTDArray) { int32_t index = fReader.readU32(); if (0 == index) { return NULL; // writer failed to give us the flattenable } index -= 1; // we stored the index-base-1 factory = (*fFactoryTDArray)[index]; } else { factory = (SkFlattenable::Factory)readFunctionPtr(); if (NULL == factory) { return NULL; // writer failed to give us the flattenable } } // if we get here, factory may still be null, but if that is the case, the // failure was ours, not the writer. SkFlattenable* obj = NULL; uint32_t sizeRecorded = fReader.readU32(); if (factory) { uint32_t offset = fReader.offset(); obj = (*factory)(*this); // check that we read the amount we expected uint32_t sizeRead = fReader.offset() - offset; if (sizeRecorded != sizeRead) { // we could try to fix up the offset... sk_throw(); } } else { // we must skip the remaining data fReader.skip(sizeRecorded); } return obj; }