static inline U16CPU SkBlend3216(SkPMColor src, U16CPU dst, unsigned scale) { SkASSERT(scale <= 32); scale <<= 3; return SkPackRGB16(SkAlphaBlend(SkPacked32ToR16(src), SkGetPackedR16(dst), scale), SkAlphaBlend(SkPacked32ToG16(src), SkGetPackedG16(dst), scale), SkAlphaBlend(SkPacked32ToB16(src), SkGetPackedB16(dst), scale)); }
static SkPMColor SkFourByteInterp(SkPMColor src, SkPMColor dst, unsigned scale) { unsigned a = SkAlphaBlend(SkGetPackedA32(src), SkGetPackedA32(dst), scale); unsigned r = SkAlphaBlend(SkGetPackedR32(src), SkGetPackedR32(dst), scale); unsigned g = SkAlphaBlend(SkGetPackedG32(src), SkGetPackedG32(dst), scale); unsigned b = SkAlphaBlend(SkGetPackedB32(src), SkGetPackedB32(dst), scale); return SkPackARGB32(a, r, g, b); }
void SkProcXfermode::xferA8(SK_RESTRICT SkAlpha dst[], const SK_RESTRICT SkPMColor src[], int count, const SK_RESTRICT SkAlpha aa[]) { SkASSERT(dst && src && count >= 0); SkXfermodeProc proc = fProc; if (NULL != proc) { if (NULL == aa) { for (int i = count - 1; i >= 0; --i) { SkPMColor res = proc(src[i], dst[i] << SK_A32_SHIFT); dst[i] = SkToU8(SkGetPackedA32(res)); } } else { for (int i = count - 1; i >= 0; --i) { unsigned a = aa[i]; if (0 != a) { SkAlpha dstA = dst[i]; SkPMColor res = proc(src[i], dstA << SK_A32_SHIFT); unsigned A = SkGetPackedA32(res); if (0xFF != a) { A = SkAlphaBlend(A, dstA, SkAlpha255To256(a)); } dst[i] = SkToU8(A); } } } } }
static inline void D16_S32A_Blend_Pixel_helper(uint16_t* dst, SkPMColor sc, unsigned src_scale) { uint16_t dc = *dst; unsigned sa = SkGetPackedA32(sc); unsigned dr, dg, db; if (255 == sa) { dr = SkAlphaBlend(SkPacked32ToR16(sc), SkGetPackedR16(dc), src_scale); dg = SkAlphaBlend(SkPacked32ToG16(sc), SkGetPackedG16(dc), src_scale); db = SkAlphaBlend(SkPacked32ToB16(sc), SkGetPackedB16(dc), src_scale); } else { unsigned dst_scale = 255 - SkAlphaMul(sa, src_scale); dr = (SkPacked32ToR16(sc) * src_scale + SkGetPackedR16(dc) * dst_scale) >> 8; dg = (SkPacked32ToG16(sc) * src_scale + SkGetPackedG16(dc) * dst_scale) >> 8; db = (SkPacked32ToB16(sc) * src_scale + SkGetPackedB16(dc) * dst_scale) >> 8; } *dst = SkPackRGB16(dr, dg, db); }
static void blit_lcd32_opaque(SkPMColor dst[], const uint32_t src[], SkPMColor color, int width) { int srcR = SkGetPackedR32(color); int srcG = SkGetPackedG32(color); int srcB = SkGetPackedB32(color); for (int i = 0; i < width; i++) { uint32_t mask = src[i]; if (0 == mask) { continue; } SkPMColor d = dst[i]; int maskR = SkGetPackedR32(mask); int maskG = SkGetPackedG32(mask); int maskB = SkGetPackedB32(mask); // Now upscale them to 0..256, so we can use SkAlphaBlend maskR = SkAlpha255To256(maskR); maskG = SkAlpha255To256(maskG); maskB = SkAlpha255To256(maskB); int maskA = SkMax32(SkMax32(maskR, maskG), maskB); int dstA = SkGetPackedA32(d); int dstR = SkGetPackedR32(d); int dstG = SkGetPackedG32(d); int dstB = SkGetPackedB32(d); dst[i] = SkPackARGB32(SkAlphaBlend(0xFF, dstA, maskA), SkAlphaBlend(srcR, dstR, maskR), SkAlphaBlend(srcG, dstG, maskG), SkAlphaBlend(srcB, dstB, maskB)); } }
virtual void xferA8(SK_RESTRICT SkAlpha dst[], const SK_RESTRICT SkPMColor src[], int count, const SK_RESTRICT SkAlpha aa[]) { SkASSERT(dst && src && count >= 0); if (NULL == aa) { for (int i = count - 1; i >= 0; --i) { dst[i] = SkToU8(SkGetPackedA32(src[i])); } } else { for (int i = count - 1; i >= 0; --i) { unsigned a = aa[i]; if (0 != a) { unsigned srcA = SkGetPackedA32(src[i]); if (a == 0xFF) { dst[i] = SkToU8(srcA); } else { dst[i] = SkToU8(SkAlphaBlend(srcA, dst[i], a)); } } } } }