/** * Extract either the color or image data from a SkBitmap into a SkStream. * @param bitmap Bitmap to extract data from. * @param srcRect Region in the bitmap to extract. * @param extractAlpha Set to true to extract the alpha data or false to * extract the color data. * @param isTransparent Pointer to a bool to output whether the alpha is * completely transparent. May be NULL. Only valid when * extractAlpha == true. * @return Unencoded image data, or NULL if either data was not * available or alpha data was requested but the image was * entirely transparent or opaque. */ static SkStream* extract_image_data(const SkBitmap& bitmap, const SkIRect& srcRect, bool extractAlpha, bool* isTransparent) { SkColorType colorType = bitmap.colorType(); if (extractAlpha && (kIndex_8_SkColorType == colorType || kRGB_565_SkColorType == colorType)) { if (isTransparent != NULL) { *isTransparent = false; } return NULL; } SkAutoLockPixels lock(bitmap); if (NULL == bitmap.getPixels()) { return NULL; } bool isOpaque = true; bool transparent = extractAlpha; SkAutoTDelete<SkStream> stream; switch (colorType) { case kIndex_8_SkColorType: if (!extractAlpha) { stream.reset(extract_index8_image(bitmap, srcRect)); } break; case kARGB_4444_SkColorType: stream.reset(extract_argb4444_data(bitmap, srcRect, extractAlpha, &isOpaque, &transparent)); break; case kRGB_565_SkColorType: if (!extractAlpha) { stream.reset(extract_rgb565_image(bitmap, srcRect)); } break; case kN32_SkColorType: stream.reset(extract_argb8888_data(bitmap, srcRect, extractAlpha, &isOpaque, &transparent)); break; case kAlpha_8_SkColorType: if (!extractAlpha) { stream.reset(create_black_image()); } else { stream.reset(extract_a8_alpha(bitmap, srcRect, &isOpaque, &transparent)); } break; default: SkASSERT(false); } if (isTransparent != NULL) { *isTransparent = transparent; } if (extractAlpha && (transparent || isOpaque)) { return NULL; } return stream.detach(); }
/** * Extract either the color or image data from a SkBitmap into a SkStream. * @param bitmap Bitmap to extract data from. * @param srcRect Region in the bitmap to extract. * @param extractAlpha Set to true to extract the alpha data or false to * extract the color data. * @param isTransparent Pointer to a bool to output whether the alpha is * completely transparent. May be NULL. Only valid when * extractAlpha == true. * @return Unencoded image data, or NULL if either data was not * available or alpha data was requested but the image was * entirely transparent or opaque. */ static SkStream* extract_image_data(const SkBitmap& bitmap, const SkIRect& srcRect, bool extractAlpha, bool* isTransparent) { SkColorType colorType = bitmap.colorType(); if (extractAlpha && (kIndex_8_SkColorType == colorType || kRGB_565_SkColorType == colorType)) { if (isTransparent != NULL) { *isTransparent = false; } return NULL; } bool isOpaque = true; bool transparent = extractAlpha; SkStream* stream = NULL; bitmap.lockPixels(); switch (colorType) { case kIndex_8_SkColorType: if (!extractAlpha) { stream = extract_index8_image(bitmap, srcRect); } break; case kARGB_4444_SkColorType: stream = extract_argb4444_data(bitmap, srcRect, extractAlpha, &isOpaque, &transparent); break; case kRGB_565_SkColorType: if (!extractAlpha) { stream = extract_rgb565_image(bitmap, srcRect); } break; case kN32_SkColorType: stream = extract_argb8888_data(bitmap, srcRect, extractAlpha, &isOpaque, &transparent); break; case kAlpha_8_SkColorType: if (!extractAlpha) { stream = create_black_image(); } else { stream = extract_a8_alpha(bitmap, srcRect, &isOpaque, &transparent); } break; default: SkASSERT(false); } bitmap.unlockPixels(); if (isTransparent != NULL) { *isTransparent = transparent; } if (extractAlpha && (transparent || isOpaque)) { SkSafeUnref(stream); return NULL; } return stream; }