| /* |
| * Copyright 2017 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "gm.h" |
| |
| #include "SkColorPriv.h" |
| #include "SkToSRGBColorFilter.h" |
| |
| DEF_SIMPLE_GM_BG(tosrgb_colorfilter, canvas, 130, 130, SK_ColorBLACK) { |
| // Src bitmap with some colors that we're going to interpret as being in a few different spaces |
| SkBitmap bmp; |
| bmp.allocN32Pixels(3, 2); |
| SkPMColor* pixels = reinterpret_cast<SkPMColor*>(bmp.getPixels()); |
| pixels[0] = SkPackARGB32(0xFF, 0xA0, 0x00, 0x00); |
| pixels[1] = SkPackARGB32(0xFF, 0x00, 0xA0, 0x00); |
| pixels[2] = SkPackARGB32(0xFF, 0x00, 0x00, 0xA0); |
| pixels[3] = SkPackARGB32(0xFF, 0x00, 0xA0, 0xA0); |
| pixels[4] = SkPackARGB32(0xFF, 0xA0, 0x00, 0xA0); |
| pixels[5] = SkPackARGB32(0xFF, 0xA0, 0xA0, 0x00); |
| |
| // Reference image |
| canvas->drawBitmapRect(bmp, SkRect::MakeXYWH(10, 10, 50, 50), nullptr); |
| |
| auto srgb = SkColorSpace::MakeSRGB(); |
| auto rec2020 = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, SkNamedGamut::kRec2020); |
| |
| // NarrowGamut RGB (an artifically smaller than sRGB gamut) |
| skcms_Matrix3x3 narrowGamutRGBMatrix; |
| SkAssertResult(skcms_PrimariesToXYZD50( |
| 0.54f, 0.33f, // Rx, Ry |
| 0.33f, 0.50f, // Gx, Gy |
| 0.25f, 0.20f, // Bx, By |
| 0.3127f, 0.3290f, // Wx, Wy |
| &narrowGamutRGBMatrix)); |
| auto narrow = SkColorSpace::MakeRGB(SkNamedTransferFn::kSRGB, narrowGamutRGBMatrix); |
| |
| SkPaint paint; |
| |
| // Transforming sRGB -> sRGB should do nothing. Top two squares should look identical. |
| paint.setColorFilter(SkToSRGBColorFilter::Make(srgb)); |
| canvas->drawBitmapRect(bmp, SkRect::MakeXYWH(70, 10, 50, 50), &paint); |
| |
| // Rec2020 -> sRGB should produce more vivid colors. |
| paint.setColorFilter(SkToSRGBColorFilter::Make(rec2020)); |
| canvas->drawBitmapRect(bmp, SkRect::MakeXYWH(10, 70, 50, 50), &paint); |
| |
| // Narrow -> sRGB should produce more muted colors. |
| paint.setColorFilter(SkToSRGBColorFilter::Make(narrow)); |
| canvas->drawBitmapRect(bmp, SkRect::MakeXYWH(70, 70, 50, 50), &paint); |
| } |