void SkARGB32_Opaque_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) { SkASSERT(mask.fBounds.contains(clip)); if (mask.fFormat == SkMask::kBW_Format) { SkARGB32_BlitBW(fDevice, mask, clip, fPMColor); return; } int x = clip.fLeft; int y = clip.fTop; int width = clip.width(); int height = clip.height(); uint32_t* device = fDevice.getAddr32(x, y); const uint8_t* alpha = mask.getAddr(x, y); uint32_t srcColor = fPMColor; unsigned devRB = fDevice.rowBytes() - (width << 2); unsigned maskRB = mask.fRowBytes - width; do { int w = width; do { unsigned aa = *alpha++; *device = SkAlphaMulQ(srcColor, SkAlpha255To256(aa)) + SkAlphaMulQ(*device, SkAlpha255To256(255 - aa)); device += 1; } while (--w != 0); device = (uint32_t*)((char*)device + devRB); alpha += maskRB; } while (--height != 0); }
void SkARGB32_Black_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) { SkASSERT(mask.fBounds.contains(clip)); if (mask.fFormat == SkMask::kBW_Format) { SkPMColor black = (SkPMColor)(SK_A32_MASK << SK_A32_SHIFT); SkARGB32_BlitBW(fDevice, mask, clip, black); } else { uint32_t* device = fDevice.getAddr32(clip.fLeft, clip.fTop); const uint8_t* alpha = mask.getAddr(clip.fLeft, clip.fTop); unsigned width = clip.width(); unsigned height = clip.height(); unsigned deviceRB = fDevice.rowBytes() - (width << 2); 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 = (aa << SK_A32_SHIFT) + SkAlphaMulQ(*device, SkAlpha255To256(255 - aa)); device += 1; } while (--w != 0); device = (uint32_t*)((char*)device + deviceRB); alpha += maskRB; } while (--height != 0); } }
void SkARGB32_Opaque_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) { SkASSERT(mask.fBounds.contains(clip)); if (mask.fFormat == SkMask::kBW_Format) { SkARGB32_BlitBW(fDevice, mask, clip, fPMColor); return; } else if (SkMask::kARGB32_Format == mask.fFormat) { SkARGB32_Blit32(fDevice, mask, clip, fPMColor); return; } else if (SkMask::kLCD16_Format == mask.fFormat) { blitmask_lcd16(fDevice, mask, clip, fPMColor); return; } else if (SkMask::kLCD32_Format == mask.fFormat) { blitmask_lcd32(fDevice, mask, clip, fPMColor); return; } int x = clip.fLeft; int y = clip.fTop; int width = clip.width(); int height = clip.height(); fBlitMaskProc(fDevice.getAddr32(x, y), fDevice.rowBytes(), SkBitmap::kARGB_8888_Config, mask.getAddr(x, y), mask.fRowBytes, fColor, width, height); }
void SkARGB32_Opaque_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) { SkASSERT(mask.fBounds.contains(clip)); if (SkBlitMask::BlitColor(fDevice, mask, clip, fColor)) { return; } if (mask.fFormat == SkMask::kBW_Format) { SkARGB32_BlitBW(fDevice, mask, clip, fPMColor); } else if (SkMask::kARGB32_Format == mask.fFormat) { SkARGB32_Blit32(fDevice, mask, clip, fPMColor); } }