Allocation *Allocation::createFromStream(Context *rsc, IStream *stream) { // First make sure we are reading the correct object RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); if (classID != RS_A3D_CLASS_ID_ALLOCATION) { ALOGE("allocation loading skipped due to invalid class id\n"); return NULL; } String8 name; stream->loadString(&name); Type *type = Type::createFromStream(rsc, stream); if (!type) { return NULL; } type->compute(); // Number of bytes we wrote out for this allocation uint32_t dataSize = stream->loadU32(); if (dataSize != type->getSizeBytes()) { ALOGE("failed to read allocation because numbytes written is not the same loaded type wants\n"); ObjectBase::checkDelete(type); return NULL; } Allocation *alloc = Allocation::createAllocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT); alloc->setName(name.string(), name.size()); type->decUserRef(); uint32_t count = dataSize / type->getElementSizeBytes(); // Read in all of our allocation data alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize); stream->reset(stream->getPos() + dataSize); return alloc; }