void SkARGB32_Blitter::blitMask(const SkMask& mask, const SkIRect& clip) { SkASSERT(mask.fBounds.contains(clip)); SkASSERT(fSrcA != 0xFF); if (fSrcA == 0) { return; } if (mask.fFormat == SkMask::kBW_Format) { SkARGB32_BlendBW(fDevice, mask, clip, fPMColor, SkAlpha255To256(255 - fSrcA)); 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 = SkBlendARGB32(srcColor, *device, aa); device += 1; } while (--w != 0); device = (uint32_t*)((char*)device + devRB); alpha += maskRB; } while (--height != 0); }
} else { uint32_t sc = SkAlphaMulQ(color, SkAlpha255To256(aa)); SkBlitRow::Color32(device, device, count, sc); } } runs += count; antialias += count; device += count; } } void SkARGB32_Blitter::blitAntiH2(int x, int y, U8CPU a0, U8CPU a1) { uint32_t* device = fDevice.writable_addr32(x, y); SkDEBUGCODE((void)fDevice.writable_addr32(x + 1, y);) device[0] = SkBlendARGB32(fPMColor, device[0], a0); device[1] = SkBlendARGB32(fPMColor, device[1], a1); } void SkARGB32_Blitter::blitAntiV2(int x, int y, U8CPU a0, U8CPU a1) { uint32_t* device = fDevice.writable_addr32(x, y); SkDEBUGCODE((void)fDevice.writable_addr32(x, y + 1);) device[0] = SkBlendARGB32(fPMColor, device[0], a0); device = (uint32_t*)((char*)device + fDevice.rowBytes()); device[0] = SkBlendARGB32(fPMColor, device[0], a1); } ////////////////////////////////////////////////////////////////////////////////////// #define solid_8_pixels(mask, dst, color) \
void SkARGB32_Shader_Blitter::blitAntiH(int x, int y, const SkAlpha antialias[], const int16_t runs[]) { SkPMColor* span = fBuffer; uint32_t* device = fDevice.getAddr32(x, y); SkShader* shader = fShader; if (fXfermode) { for (;;) { SkXfermode* xfer = fXfermode; int count = *runs; if (count <= 0) break; int aa = *antialias; if (aa) { shader->shadeSpan(x, y, span, count); if (aa == 255) { xfer->xfer32(device, span, count, NULL); } else { // count is almost always 1 for (int i = count - 1; i >= 0; --i) { xfer->xfer32(&device[i], &span[i], 1, antialias); } } } device += count; runs += count; antialias += count; x += count; } } else if (fShader->getFlags() & SkShader::kOpaqueAlpha_Flag) { for (;;) { int count = *runs; if (count <= 0) { break; } int aa = *antialias; if (aa) { if (aa == 255) { // cool, have the shader draw right into the device shader->shadeSpan(x, y, device, count); } else { shader->shadeSpan(x, y, span, count); for (int i = count - 1; i >= 0; --i) { if (span[i]) { device[i] = SkBlendARGB32(span[i], device[i], aa); } } } } device += count; runs += count; antialias += count; x += count; } } else { // no xfermode but we are not opaque for (;;) { int count = *runs; if (count <= 0) { break; } int aa = *antialias; if (aa) { fShader->shadeSpan(x, y, span, count); if (aa == 255) { for (int i = count - 1; i >= 0; --i) { if (span[i]) { device[i] = SkPMSrcOver(span[i], device[i]); } } } else { for (int i = count - 1; i >= 0; --i) { if (span[i]) { device[i] = SkBlendARGB32(span[i], device[i], aa); } } } } device += count; runs += count; antialias += count; x += count; } } }