// returns true and set color if the bitmap can be drawn as a single color // (for efficiency) static bool can_use_color_shader(const SkBitmap& bm, SkColor* color) { #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK // HWUI does not support color shaders (see b/22390304) return false; #endif if (1 != bm.width() || 1 != bm.height()) { return false; } SkAutoLockPixels alp(bm); if (!bm.readyToDraw()) { return false; } switch (bm.colorType()) { case kN32_SkColorType: *color = SkUnPreMultiply::PMColorToColor(*bm.getAddr32(0, 0)); return true; case kRGB_565_SkColorType: *color = SkPixel16ToColor(*bm.getAddr16(0, 0)); return true; case kIndex_8_SkColorType: *color = SkUnPreMultiply::PMColorToColor(bm.getIndex8Color(0, 0)); return true; default: // just skip the other configs for now break; } return false; }
// returns true and set color if the bitmap can be drawn as a single color // (for efficiency) static bool canUseColorShader(const SkBitmap& bm, SkColor* color) { if (1 != bm.width() || 1 != bm.height()) { return false; } SkAutoLockPixels alp(bm); if (!bm.readyToDraw()) { return false; } switch (bm.config()) { case SkBitmap::kARGB_8888_Config: *color = SkUnPreMultiply::PMColorToColor(*bm.getAddr32(0, 0)); return true; case SkBitmap::kRGB_565_Config: *color = SkPixel16ToColor(*bm.getAddr16(0, 0)); return true; case SkBitmap::kIndex8_Config: *color = SkUnPreMultiply::PMColorToColor(bm.getIndex8Color(0, 0)); return true; default: // just skip the other configs for now break; } return false; }
// returns true and set color if the bitmap can be drawn as a single color // (for efficiency) static bool can_use_color_shader(const SkImage* image, SkColor* color) { #ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK // HWUI does not support color shaders (see b/22390304) return false; #endif if (1 != image->width() || 1 != image->height()) { return false; } SkPixmap pmap; if (!image->peekPixels(&pmap)) { return false; } switch (pmap.colorType()) { case kN32_SkColorType: *color = SkUnPreMultiply::PMColorToColor(*pmap.addr32(0, 0)); return true; case kRGB_565_SkColorType: *color = SkPixel16ToColor(*pmap.addr16(0, 0)); return true; case kIndex_8_SkColorType: { const SkColorTable& ctable = *pmap.ctable(); *color = SkUnPreMultiply::PMColorToColor(ctable[*pmap.addr8(0, 0)]); return true; } default: // just skip the other configs for now break; } return false; }
SkColor color_to_565(SkColor color) { SkPMColor pmColor = SkPreMultiplyColor(color); U16CPU color16 = SkPixel32ToPixel16(pmColor); return SkPixel16ToColor(color16); }