diff options
-rw-r--r-- | dm/DMSrcSink.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index 12d8a06ebd..1985b1d0ce 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -415,6 +415,19 @@ static void draw_to_canvas(SkCanvas* canvas, const SkImageInfo& info, void* pixe canvas->drawBitmap(bitmap, left, top); } +// For codec srcs, we want the "draw" step to be a memcpy. Any interesting color space or +// color format conversions should be performed by the codec. Sometimes the output of the +// decode will be in an interesting color space. On our srgb and f16 backends, we need to +// "pretend" that the color space is standard sRGB to avoid triggering color conversion +// at draw time. +static void set_bitmap_color_space(SkImageInfo* info) { + if (kRGBA_F16_SkColorType == info->colorType()) { + *info = info->makeColorSpace(SkColorSpace::MakeSRGBLinear()); + } else { + *info = info->makeColorSpace(SkColorSpace::MakeSRGB()); + } +} + Error CodecSrc::draw(SkCanvas* canvas) const { sk_sp<SkData> encoded(SkData::MakeFromFileName(fPath.c_str())); if (!encoded) { @@ -461,6 +474,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const { } SkImageInfo bitmapInfo = decodeInfo; + set_bitmap_color_space(&bitmapInfo); if (kRGBA_8888_SkColorType == decodeInfo.colorType() || kBGRA_8888_SkColorType == decodeInfo.colorType()) { bitmapInfo = bitmapInfo.makeColorType(kN32_SkColorType); @@ -857,6 +871,7 @@ Error AndroidCodecSrc::draw(SkCanvas* canvas) const { SkBitmap bitmap; SkImageInfo bitmapInfo = decodeInfo; + set_bitmap_color_space(&bitmapInfo); if (kRGBA_8888_SkColorType == decodeInfo.colorType() || kBGRA_8888_SkColorType == decodeInfo.colorType()) { bitmapInfo = bitmapInfo.makeColorType(kN32_SkColorType); @@ -996,6 +1011,7 @@ Error ImageGenSrc::draw(SkCanvas* canvas) const { SkPMColor colorPtr[256]; int colorCount = 256; + set_bitmap_color_space(&decodeInfo); draw_to_canvas(canvas, decodeInfo, pixels.get(), rowBytes, colorPtr, colorCount, CodecSrc::kGetFromCanvas_DstColorType); return ""; @@ -1074,6 +1090,7 @@ Error ColorCodecSrc::draw(SkCanvas* canvas) const { } SkImageInfo bitmapInfo = decodeInfo; + set_bitmap_color_space(&bitmapInfo); if (kRGBA_8888_SkColorType == decodeInfo.colorType() || kBGRA_8888_SkColorType == decodeInfo.colorType()) { |