void setup(const SkPixmap& dst, int left, int top, const SkPaint& paint) override { fDst = dst; fLeft = left; fTop = top; fPaintColor = paint.getColor4f(); SkRasterPipeline p(fAlloc); p.append_load(fSource.colorType(), &fSrcPtr); if (fSource.colorType() == kAlpha_8_SkColorType) { // The color for A8 images comes from the (sRGB) paint color. p.append_set_rgb(fAlloc, fPaintColor); p.append(SkRasterPipeline::premul); } if (auto dstCS = fDst.colorSpace()) { auto srcCS = fSource.colorSpace(); if (!srcCS || fSource.colorType() == kAlpha_8_SkColorType) { // We treat untagged images as sRGB. // A8 images get their r,g,b from the paint color, so they're also sRGB. srcCS = sk_srgb_singleton(); } auto srcAT = fSource.isOpaque() ? kOpaque_SkAlphaType : kPremul_SkAlphaType; fAlloc->make<SkColorSpaceXformSteps>(srcCS, srcAT, dstCS, kPremul_SkAlphaType) ->apply(&p, fSource.colorType()); } if (fPaintColor.fA != 1.0f) { p.append(SkRasterPipeline::scale_1_float, &fPaintColor.fA); } bool is_opaque = fSource.isOpaque() && fPaintColor.fA == 1.0f; fBlitter = SkCreateRasterPipelineBlitter(fDst, paint, p, is_opaque, fAlloc); }
void setup(const SkPixmap& dst, int left, int top, const SkPaint& paint) override { fDst = dst; fLeft = left; fTop = top; fPaintColor = SkColor4f_from_SkColor(paint.getColor(), fDst.colorSpace()); SkRasterPipeline p(fAlloc); switch (fSource.colorType()) { case kAlpha_8_SkColorType: p.append(SkRasterPipeline::load_a8, &fSrcPtr); break; case kGray_8_SkColorType: p.append(SkRasterPipeline::load_g8, &fSrcPtr); break; case kRGB_565_SkColorType: p.append(SkRasterPipeline::load_565, &fSrcPtr); break; case kARGB_4444_SkColorType: p.append(SkRasterPipeline::load_4444, &fSrcPtr); break; case kBGRA_8888_SkColorType: p.append(SkRasterPipeline::load_bgra, &fSrcPtr); break; case kRGBA_8888_SkColorType: p.append(SkRasterPipeline::load_8888, &fSrcPtr); break; case kRGBA_F16_SkColorType: p.append(SkRasterPipeline::load_f16, &fSrcPtr); break; default: SkASSERT(false); } if (fDst.colorSpace() && (!fSource.colorSpace() || fSource.colorSpace()->gammaCloseToSRGB())) { p.append_from_srgb(fSource.alphaType()); } if (fSource.colorType() == kAlpha_8_SkColorType) { p.append(SkRasterPipeline::set_rgb, &fPaintColor); p.append(SkRasterPipeline::premul); } append_gamut_transform(&p, fAlloc, fSource.colorSpace(), fDst.colorSpace(), kPremul_SkAlphaType); if (fPaintColor.fA != 1.0f) { p.append(SkRasterPipeline::scale_1_float, &fPaintColor.fA); } bool is_opaque = fSource.isOpaque() && fPaintColor.fA == 1.0f; fBlitter = SkCreateRasterPipelineBlitter(fDst, paint, p, is_opaque, fAlloc); }