// unpremultiply and extract R, G, B components. static void pmcolor_to_rgb24(uint32_t color, uint8_t* rgb, SkColorType ct) { uint32_t s = SkUnPreMultiply::GetScale(SkGetA32Component(color, ct)); rgb[0] = SkUnPreMultiply::ApplyScale(s, SkGetR32Component(color, ct)); rgb[1] = SkUnPreMultiply::ApplyScale(s, SkGetG32Component(color, ct)); rgb[2] = SkUnPreMultiply::ApplyScale(s, SkGetB32Component(color, ct)); }
static void bitmap_to_pdf_pixels(const SkBitmap& bitmap, SkWStream* out) { if (!bitmap.getPixels()) { size_t size = pixel_count(bitmap) * pdf_color_component_count(bitmap.colorType()); fill_stream(out, '\x00', size); return; } SkBitmap copy; const SkBitmap& bm = not4444(bitmap, ©); SkAutoLockPixels autoLockPixels(bm); SkColorType colorType = bm.colorType(); SkAlphaType alphaType = bm.alphaType(); switch (colorType) { case kRGBA_8888_SkColorType: case kBGRA_8888_SkColorType: { SkASSERT(3 == pdf_color_component_count(colorType)); SkAutoTMalloc<uint8_t> scanline(3 * bm.width()); for (int y = 0; y < bm.height(); ++y) { const uint32_t* src = bm.getAddr32(0, y); uint8_t* dst = scanline.get(); for (int x = 0; x < bm.width(); ++x) { if (alphaType == kPremul_SkAlphaType) { uint32_t color = *src++; U8CPU alpha = SkGetA32Component(color, colorType); if (alpha != SK_AlphaTRANSPARENT) { pmcolor_to_rgb24(color, dst, colorType); } else { get_neighbor_avg_color(bm, x, y, dst, colorType); } dst += 3; } else { uint32_t color = *src++; *dst++ = SkGetR32Component(color, colorType); *dst++ = SkGetG32Component(color, colorType); *dst++ = SkGetB32Component(color, colorType); } } out->write(scanline.get(), 3 * bm.width()); } return; } case kRGB_565_SkColorType: { SkASSERT(3 == pdf_color_component_count(colorType)); SkAutoTMalloc<uint8_t> scanline(3 * bm.width()); for (int y = 0; y < bm.height(); ++y) { const uint16_t* src = bm.getAddr16(0, y); uint8_t* dst = scanline.get(); for (int x = 0; x < bm.width(); ++x) { U16CPU color565 = *src++; *dst++ = SkPacked16ToR32(color565); *dst++ = SkPacked16ToG32(color565); *dst++ = SkPacked16ToB32(color565); } out->write(scanline.get(), 3 * bm.width()); } return; } case kAlpha_8_SkColorType: SkASSERT(1 == pdf_color_component_count(colorType)); fill_stream(out, '\x00', pixel_count(bm)); return; case kGray_8_SkColorType: case kIndex_8_SkColorType: SkASSERT(1 == pdf_color_component_count(colorType)); // these two formats need no transformation to serialize. for (int y = 0; y < bm.height(); ++y) { out->write(bm.getAddr8(0, y), bm.width()); } return; case kUnknown_SkColorType: case kARGB_4444_SkColorType: default: SkDEBUGFAIL("unexpected color type"); } }