aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--dm/DMSrcSink.cpp17
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())
{