bool SkGradientShaderBase::DescriptorScope::unflatten(SkReadBuffer& buffer) { fCount = buffer.getArrayCount(); if (fCount > kStorageCount) { size_t allocSize = (sizeof(SkColor) + sizeof(SkScalar)) * fCount; fDynamicStorage.reset(allocSize); fColors = (SkColor*)fDynamicStorage.get(); fPos = (SkScalar*)(fColors + fCount); } else { fColors = fColorStorage; fPos = fPosStorage; } if (!buffer.readColorArray(const_cast<SkColor*>(fColors), fCount)) { return false; } if (buffer.readBool()) { if (!buffer.readScalarArray(const_cast<SkScalar*>(fPos), fCount)) { return false; } } else { fPos = nullptr; } fTileMode = (SkShader::TileMode)buffer.read32(); fGradFlags = buffer.read32(); if (buffer.readBool()) { fLocalMatrix = &fLocalMatrixStorage; buffer.readMatrix(&fLocalMatrixStorage); } else { fLocalMatrix = nullptr; } return buffer.isValid(); }
void SkImageInfo::unflatten(SkReadBuffer& buffer) { fWidth = buffer.read32(); fHeight = buffer.read32(); uint32_t packed = buffer.read32(); fColorType = stored_to_live((packed >> 0) & kColorTypeMask); fAlphaType = (SkAlphaType)((packed >> 8) & kAlphaTypeMask); buffer.validate(alpha_type_is_valid(fAlphaType) && color_type_is_valid(fColorType)); sk_sp<SkData> data = buffer.readByteArrayAsData(); fColorSpace = SkColorSpace::Deserialize(data->data(), data->size()); }
sk_sp<SkFlattenable> SkComposeShader::CreateProc(SkReadBuffer& buffer) { sk_sp<SkShader> dst(buffer.readShader()); sk_sp<SkShader> src(buffer.readShader()); unsigned mode = buffer.read32(); float lerp = buffer.readScalar(); // check for valid mode before we cast to the enum type if (!buffer.validate(mode <= (unsigned)SkBlendMode::kLastMode)) { return nullptr; } return MakeCompose(std::move(dst), std::move(src), static_cast<SkBlendMode>(mode), lerp); }
sk_sp<SkFlattenable> SkComposeShader::CreateProc(SkReadBuffer& buffer) { sk_sp<SkShader> shaderA(buffer.readShader()); sk_sp<SkShader> shaderB(buffer.readShader()); SkBlendMode mode; if (buffer.isVersionLT(SkReadBuffer::kXfermodeToBlendMode2_Version)) { sk_sp<SkXfermode> xfer = buffer.readXfermode(); mode = xfer ? xfer->blend() : SkBlendMode::kSrcOver; } else { mode = (SkBlendMode)buffer.read32(); } if (!shaderA || !shaderB) { return nullptr; } return sk_make_sp<SkComposeShader>(std::move(shaderA), std::move(shaderB), mode); }
SkMallocPixelRef::SkMallocPixelRef(SkReadBuffer& buffer) : INHERITED(buffer, NULL) , fReleaseProc(sk_free_releaseproc) , fReleaseProcContext(NULL) { fRB = buffer.read32(); size_t size = buffer.isValid() ? this->info().getSafeSize(fRB) : 0; if (buffer.validateAvailable(size)) { fStorage = sk_malloc_throw(size); buffer.readByteArray(fStorage, size); } else { fStorage = NULL; } if (buffer.readBool()) { fCTable = SkNEW_ARGS(SkColorTable, (buffer)); } else { fCTable = NULL; } this->setPreLocked(fStorage, fRB, fCTable); }
SkPictureShader::SkPictureShader(SkReadBuffer& buffer) : INHERITED(buffer) { fTmx = static_cast<SkShader::TileMode>(buffer.read32()); fTmy = static_cast<SkShader::TileMode>(buffer.read32()); buffer.readRect(&fTile); fPicture = SkPicture::CreateFromBuffer(buffer); }