SkShader* SkShader::CreateBitmapShader(const SkBitmap& src, TileMode tmx, TileMode tmy, void* storage, size_t storageSize) { SkShader* shader; SkColor color; if (canUseColorShader(src, &color)) { SK_PLACEMENT_NEW_ARGS(shader, SkColorShader, storage, storageSize, (color)); } else { SK_PLACEMENT_NEW_ARGS(shader, SkBitmapProcShader, storage, storageSize, (src, tmx, tmy)); } return shader; }
SkShader* SkShader::CreateBitmapShader(const SkBitmap& src, TileMode tmx, TileMode tmy, void* storage, size_t storageSize) { SkShader* shader; SK_PLACEMENT_NEW_ARGS(shader, SkBitmapProcShader, storage, storageSize, (src, tmx, tmy)); return shader; }
SkSpriteBlitter* SkSpriteBlitter::ChooseD32(const SkBitmap& source, const SkPaint& paint, void* storage, size_t storageSize) { if (paint.getMaskFilter() != NULL) { return NULL; } U8CPU alpha = paint.getAlpha(); SkXfermode* xfermode = paint.getXfermode(); SkColorFilter* filter = paint.getColorFilter(); SkSpriteBlitter* blitter = NULL; switch (source.getConfig()) { case SkBitmap::kARGB_4444_Config: if (alpha != 0xFF) { return NULL; // we only have opaque sprites } if (xfermode || filter) { SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S4444_XferFilter, storage, storageSize, (source, paint)); } else if (source.isOpaque()) { SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S4444_Opaque, storage, storageSize, (source)); } else { SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S4444, storage, storageSize, (source)); } break; case SkBitmap::kARGB_8888_Config: if (xfermode || filter) { if (255 == alpha) { // this can handle xfermode or filter, but not alpha SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S32A_XferFilter, storage, storageSize, (source, paint)); } } else { // this can handle alpha, but not xfermode or filter SK_PLACEMENT_NEW_ARGS(blitter, Sprite_D32_S32, storage, storageSize, (source, alpha)); } break; default: break; } return blitter; }