SkFlattenable* SkMergeImageFilter::CreateProc(SkReadBuffer& buffer) { Common common; if (!common.unflatten(buffer, -1)) { return nullptr; } const int count = common.inputCount(); bool hasModes = buffer.readBool(); if (hasModes) { SkAutoSTArray<4, SkXfermode::Mode> modes(count); SkAutoSTArray<4, uint8_t> modes8(count); if (!buffer.readByteArray(modes8.get(), count)) { return nullptr; } for (int i = 0; i < count; ++i) { modes[i] = (SkXfermode::Mode)modes8[i]; buffer.validate(SkIsValidMode(modes[i])); } if (!buffer.isValid()) { return nullptr; } return Create(common.inputs(), count, modes.get(), &common.cropRect()); } return Create(common.inputs(), count, nullptr, &common.cropRect()); }
SkModeColorFilter(SkReadBuffer& buffer) { fColor = buffer.readColor(); fMode = (SkXfermode::Mode)buffer.readUInt(); if (buffer.isValid()) { this->updateCache(); buffer.validate(SkIsValidMode(fMode)); } }
SkMergeImageFilter::SkMergeImageFilter(SkReadBuffer& buffer) : INHERITED(-1, buffer) { bool hasModes = buffer.readBool(); if (hasModes) { this->initAllocModes(); int nbInputs = countInputs(); size_t size = nbInputs * sizeof(fModes[0]); SkASSERT(buffer.getArrayCount() == size); if (buffer.validate(buffer.getArrayCount() == size) && buffer.readByteArray(fModes, size)) { for (int i = 0; i < nbInputs; ++i) { buffer.validate(SkIsValidMode((SkXfermode::Mode)fModes[i])); } } } else { fModes = 0; } }
SkColorFilter* SkColorFilter::CreateModeFilter(SkColor color, SkXfermode::Mode mode) { if (!SkIsValidMode(mode)) { return NULL; } unsigned alpha = SkColorGetA(color); // first collaps some modes if possible if (SkXfermode::kClear_Mode == mode) { color = 0; mode = SkXfermode::kSrc_Mode; } else if (SkXfermode::kSrcOver_Mode == mode) { if (0 == alpha) { mode = SkXfermode::kDst_Mode; } else if (255 == alpha) { mode = SkXfermode::kSrc_Mode; } // else just stay srcover } // weed out combinations that are noops, and just return null if (SkXfermode::kDst_Mode == mode || (0 == alpha && (SkXfermode::kSrcOver_Mode == mode || SkXfermode::kDstOver_Mode == mode || SkXfermode::kDstOut_Mode == mode || SkXfermode::kSrcATop_Mode == mode || SkXfermode::kXor_Mode == mode || SkXfermode::kDarken_Mode == mode)) || (0xFF == alpha && SkXfermode::kDstIn_Mode == mode)) { return NULL; } switch (mode) { case SkXfermode::kSrc_Mode: return SkNEW_ARGS(Src_SkModeColorFilter, (color)); case SkXfermode::kSrcOver_Mode: return SkNEW_ARGS(SrcOver_SkModeColorFilter, (color)); default: return SkNEW_ARGS(SkModeColorFilter, (color, mode)); } }
SkModeColorFilter(SkFlattenableReadBuffer& buffer) { fColor = buffer.readColor(); fMode = (SkXfermode::Mode)buffer.readUInt(); this->updateCache(); buffer.validate(SkIsValidMode(fMode)); }