void SkRGB16_Black_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) { if (mask.fFormat == SkMask::kBW_Format) { SkRGB16_Black_BlitBW(fDevice, mask, clip); } else { uint16_t* SK_RESTRICT device = fDevice.getAddr16(clip.fLeft, clip.fTop); const uint8_t* SK_RESTRICT alpha = mask.getAddr8(clip.fLeft, clip.fTop); unsigned width = clip.width(); unsigned height = clip.height(); size_t deviceRB = fDevice.rowBytes() - (width << 1); unsigned maskRB = mask.fRowBytes - width; SkASSERT((int)height > 0); SkASSERT((int)width > 0); SkASSERT((int)deviceRB >= 0); SkASSERT((int)maskRB >= 0); do { unsigned w = width; do { unsigned aa = *alpha++; *device = SkAlphaMulRGB16(*device, SkAlpha255To256(255 - aa)); device += 1; } while (--w != 0); device = (uint16_t*)((char*)device + deviceRB); alpha += maskRB; } while (--height != 0); } }
virtual void filterSpan16(const uint16_t shader[], int count, uint16_t result[]) { // all mul components are the same unsigned scale = SkAlpha255To256(SkColorGetR(fMul)); if (count > 0) { do { *result++ = SkAlphaMulRGB16(*shader++, scale); } while (--count > 0); } }