SkASSERT(255 > alpha);
if (count > 0) {
- int src_scale = SkAlpha255To256(alpha);
do {
SkPMColor sc = *src++;
SkPMColorAssert(sc);
- if (sc)
- {
+ if (sc) {
uint16_t dc = *dst;
- unsigned sa = SkGetPackedA32(sc);
- unsigned dr, dg, db;
-
- if (sa == 255) {
- 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);
+ unsigned dst_scale = 255 - SkMulDiv255Round(SkGetPackedA32(sc), alpha);
+ unsigned dr = SkMulS16(SkPacked32ToR16(sc), alpha) + SkMulS16(SkGetPackedR16(dc), dst_scale);
+ unsigned dg = SkMulS16(SkPacked32ToG16(sc), alpha) + SkMulS16(SkGetPackedG16(dc), dst_scale);
+ unsigned db = SkMulS16(SkPacked32ToB16(sc), alpha) + SkMulS16(SkGetPackedB16(dc), dst_scale);
+ *dst = SkPackRGB16(SkDiv255Round(dr), SkDiv255Round(dg), SkDiv255Round(db));
}
dst += 1;
} while (--count != 0);
if (count > 0) {
do {
SkPMColor sc = *src++;
- if (sc)
- {
+ if (sc) {
uint16_t dc = *dst;
- unsigned sa = SkGetPackedA32(sc);
- unsigned dr, dg, db;
-
- if (sa == 255) {
- dr = SkAlphaBlend(SkPacked32ToR16(sc), SkGetPackedR16(dc), alpha);
- dg = SkAlphaBlend(SkPacked32ToG16(sc), SkGetPackedG16(dc), alpha);
- db = SkAlphaBlend(SkPacked32ToB16(sc), SkGetPackedB16(dc), alpha);
- } else {
- unsigned dst_scale = 255 - SkAlphaMul(sa, alpha);
- dr = (SkPacked32ToR16(sc) * alpha + SkGetPackedR16(dc) * dst_scale) >> 8;
- dg = (SkPacked32ToG16(sc) * alpha + SkGetPackedG16(dc) * dst_scale) >> 8;
- db = (SkPacked32ToB16(sc) * alpha + SkGetPackedB16(dc) * dst_scale) >> 8;
- }
- *dst = SkPackRGB16(dr, dg, db);
+ unsigned dst_scale = 255 - SkMulDiv255Round(SkGetPackedA32(sc), alpha);
+ unsigned dr = SkMulS16(SkPacked32ToR16(sc), alpha) + SkMulS16(SkGetPackedR16(dc), dst_scale);
+ unsigned dg = SkMulS16(SkPacked32ToG16(sc), alpha) + SkMulS16(SkGetPackedG16(dc), dst_scale);
+ unsigned db = SkMulS16(SkPacked32ToB16(sc), alpha) + SkMulS16(SkGetPackedB16(dc), dst_scale);
+ *dst = SkPackRGB16(SkDiv255Round(dr), SkDiv255Round(dg), SkDiv255Round(db));
}
dst += 1;
} while (--count != 0);
S32_D565_Opaque_PROC,
S32_D565_Blend_PROC,
S32A_D565_Opaque_PROC,
- S32A_D565_Blend_PROC,
+ // fails to treat src==0 as a no-op. see BlitRowTest.cpp
+ NULL, // S32A_D565_Blend_PROC,
// dither
S32_D565_Opaque_Dither_PROC,
static const SkBitmap::Config gDstConfig[] = {
SkBitmap::kARGB_8888_Config,
SkBitmap::kRGB_565_Config,
- SkBitmap::kARGB_4444_Config,
+// SkBitmap::kARGB_4444_Config,
// SkBitmap::kA8_Config,
};
if (gSrcRec[j].fSrc != 0 && blend) {
// can't make a numerical promise about blending anything
// but 0
- continue;
+ // continue;
}
paint.setDither(dither);
paint.setAlpha(blend ? 0x80 : 0xFF);