/*
 * 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);
}
