fix bitmapinfo

git-svn-id: http://skia.googlecode.com/svn/trunk@1744 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2011-06-28 21:52:34 +00:00
parent 292ade6625
commit 9c16bc020f

View File

@ -11,29 +11,34 @@ static void SkBitmap_ReleaseInfo(void* info, const void* pixelData, size_t size)
(SK_A32_SHIFT == (a) && SK_R32_SHIFT == (r) \ (SK_A32_SHIFT == (a) && SK_R32_SHIFT == (r) \
&& SK_G32_SHIFT == (g) && SK_B32_SHIFT == (b)) && SK_G32_SHIFT == (g) && SK_B32_SHIFT == (b))
static SkBitmap* prepareForImageRef(const SkBitmap& bm, static bool getBitmapInfo(const SkBitmap& bm,
size_t* bitsPerComponent, size_t* bitsPerComponent,
CGBitmapInfo* info) { CGBitmapInfo* info,
bool upscaleTo32 = false; bool* upscaleTo32) {
if (upscaleTo32) {
*upscaleTo32 = false;
}
switch (bm.config()) { switch (bm.config()) {
case SkBitmap::kRGB_565_Config: case SkBitmap::kRGB_565_Config:
upscaleTo32 = true; if (upscaleTo32) {
*upscaleTo32 = true;
}
// fall through // fall through
case SkBitmap::kARGB_8888_Config: case SkBitmap::kARGB_8888_Config:
*bitsPerComponent = 8; *bitsPerComponent = 8;
#if defined(SK_CPU_LENDIAN) && HAS_ARGB_SHIFTS(24, 0, 8, 16) \ #if defined(SK_CPU_LENDIAN) && HAS_ARGB_SHIFTS(24, 0, 8, 16) \
|| defined(SK_CPU_BENDIAN) && HAS_ARGB_SHIFTS(0, 24, 16, 8) || defined(SK_CPU_BENDIAN) && HAS_ARGB_SHIFTS(0, 24, 16, 8)
*info = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast; *info = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast;
#elif defined(SK_CPU_LENDIAN) && HAS_ARGB_SHIFTS(24, 16, 8, 0) \ #elif defined(SK_CPU_LENDIAN) && HAS_ARGB_SHIFTS(24, 16, 8, 0) \
|| defined(SK_CPU_BENDIAN) && HAS_ARGB_SHIFTS(24, 16, 8, 0) || defined(SK_CPU_BENDIAN) && HAS_ARGB_SHIFTS(24, 16, 8, 0)
// Matches the CGBitmapInfo that Apple recommends for best // Matches the CGBitmapInfo that Apple recommends for best
// performance, used by google chrome. // performance, used by google chrome.
*info = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst; *info = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst;
#else #else
// ...add more formats as required... // ...add more formats as required...
#warning Cannot convert SkBitmap to CGImageRef with these shiftmasks. \ #warning Cannot convert SkBitmap to CGImageRef with these shiftmasks. \
This will probably not work. This will probably not work.
// Legacy behavior. Perhaps turn this into an error at some // Legacy behavior. Perhaps turn this into an error at some
// point. // point.
*info = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast; *info = kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast;
@ -51,7 +56,17 @@ static SkBitmap* prepareForImageRef(const SkBitmap& bm,
*info = kCGBitmapByteOrder16Little | kCGImageAlphaPremultipliedLast; *info = kCGBitmapByteOrder16Little | kCGImageAlphaPremultipliedLast;
break; break;
default: default:
return NULL; return false;
}
return true;
}
static SkBitmap* prepareForImageRef(const SkBitmap& bm,
size_t* bitsPerComponent,
CGBitmapInfo* info) {
bool upscaleTo32;
if (!getBitmapInfo(bm, bitsPerComponent, info, &upscaleTo32)) {
return NULL;
} }
SkBitmap* copy; SkBitmap* copy;
@ -172,15 +187,19 @@ bool SkPDFDocumentToBitmap(SkStream* stream, SkBitmap* output) {
int w = (int)CGRectGetWidth(bounds); int w = (int)CGRectGetWidth(bounds);
int h = (int)CGRectGetHeight(bounds); int h = (int)CGRectGetHeight(bounds);
SkBitmap bitmap; SkBitmap bitmap;
bitmap.setConfig(SkBitmap::kARGB_8888_Config, w, h); bitmap.setConfig(SkBitmap::kARGB_8888_Config, w, h);
bitmap.allocPixels(); bitmap.allocPixels();
bitmap.eraseColor(SK_ColorWHITE); bitmap.eraseColor(SK_ColorWHITE);
size_t bitsPerComponent;
CGBitmapInfo info;
getBitmapInfo(bitmap, &bitsPerComponent, &info, NULL);
CGBitmapInfo info = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst;
CGContextRef ctx = CGBitmapContextCreateWithData(bitmap.getPixels(), CGContextRef ctx = CGBitmapContextCreateWithData(bitmap.getPixels(),
w, h, 8, bitmap.rowBytes(), w, h, bitsPerComponent,
bitmap.rowBytes(),
CGColorSpaceCreateDeviceRGB(), CGColorSpaceCreateDeviceRGB(),
info, NULL, NULL); info, NULL, NULL);
if (ctx) { if (ctx) {