SkFlattenable* SkComposeShader::CreateProc(SkReadBuffer& buffer) { sk_sp<SkShader> shaderA(buffer.readShader()); sk_sp<SkShader> shaderB(buffer.readShader()); sk_sp<SkXfermode> mode(buffer.readXfermode()); if (!shaderA || !shaderB) { return nullptr; } return new SkComposeShader(std::move(shaderA), std::move(shaderB), std::move(mode)); }
SkFlattenable* SkComposeShader::CreateProc(SkReadBuffer& buffer) { SkAutoTUnref<SkShader> shaderA(buffer.readShader()); SkAutoTUnref<SkShader> shaderB(buffer.readShader()); SkAutoTUnref<SkXfermode> mode(buffer.readXfermode()); if (!shaderA.get() || !shaderB.get()) { return NULL; } return SkNEW_ARGS(SkComposeShader, (shaderA, shaderB, mode)); }
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); }
static SkShader* make_shader(SkXfermode::Mode mode) { SkPoint pts[2]; SkColor colors[2]; pts[0].set(0, 0); pts[1].set(SkIntToScalar(100), 0); colors[0] = SK_ColorRED; colors[1] = SK_ColorBLUE; SkAutoTUnref<SkShader> shaderA(SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode)); pts[0].set(0, 0); pts[1].set(0, SkIntToScalar(100)); colors[0] = SK_ColorBLACK; colors[1] = SkColorSetARGB(0x80, 0, 0, 0); SkAutoTUnref<SkShader> shaderB(SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode)); SkAutoTUnref<SkXfermode> xfer(SkXfermode::Create(mode)); return new SkComposeShader(shaderA, shaderB, xfer); }