Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2016 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "gm.h"
      9 #include "SkColor.h"
     10 #include "SkColorSpace_Base.h"
     11 #include "SkColorSpaceXform.h"
     12 #include "SkRect.h"
     13 #include "SkShader.h"
     14 
     15 class ColorSpaceXformGM : public skiagm::GM {
     16 public:
     17     ColorSpaceXformGM() {}
     18 
     19 protected:
     20     void onOnceBeforeDraw() override {
     21         SkColor colors[] = {
     22             SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA, SK_ColorCYAN, SK_ColorYELLOW,
     23             SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorMAGENTA,
     24         };
     25         static_assert(kNumColors == SK_ARRAY_COUNT(colors), "Fix number of colors.");
     26 
     27         for (int i = 0; i < kNumColors; i++) {
     28             fSRGBColors[i] = SkColor4f::FromColor(colors[i]);
     29         }
     30 
     31         static constexpr float kWideGamutRGB_toXYZD50[]{
     32             0.7161046f, 0.1009296f, 0.1471858f,
     33             0.2581874f, 0.7249378f, 0.0168748f,
     34             0.0000000f, 0.0517813f, 0.7734287f,
     35         };
     36 
     37         SkMatrix44 wideGamut(SkMatrix44::kUninitialized_Constructor);
     38         wideGamut.set3x3RowMajorf(kWideGamutRGB_toXYZD50);
     39 
     40         // Test BGRA input.
     41         sk_sp<SkColorSpace> srcSpace = SkColorSpace::MakeSRGB();
     42         sk_sp<SkColorSpace> dstSpace =
     43                 SkColorSpace::MakeRGB(SkColorSpace::kLinear_RenderTargetGamma, wideGamut);
     44         std::unique_ptr<SkColorSpaceXform> xform = SkColorSpaceXform::New(srcSpace.get(),
     45                                                                           dstSpace.get());
     46         xform->apply(SkColorSpaceXform::kRGBA_F32_ColorFormat, fWideGamutColors0,
     47                      SkColorSpaceXform::kBGRA_8888_ColorFormat, colors, kNumColors,
     48                      kOpaque_SkAlphaType);
     49 
     50         // Test F32 input.
     51         srcSpace = as_CSB(srcSpace)->makeLinearGamma();
     52         xform = SkColorSpaceXform::New(srcSpace.get(), dstSpace.get());
     53         xform->apply(SkColorSpaceXform::kRGBA_F32_ColorFormat, fWideGamutColors1,
     54                      SkColorSpaceXform::kRGBA_F32_ColorFormat, fSRGBColors, kNumColors,
     55                      kOpaque_SkAlphaType);
     56     }
     57 
     58     SkString onShortName() override {
     59         return SkString("colorspacexform");
     60     }
     61 
     62     SkISize onISize() override {
     63         return SkISize::Make(500, 300);
     64     }
     65 
     66     void onDraw(SkCanvas* canvas) override {
     67         auto drawColors = [canvas](SkColor4f* colors) {
     68             SkRect r = SkRect::MakeXYWH(0.0f, 0.0f, 50.0f, 100.0f);
     69 
     70             canvas->save();
     71             for (int i = 0; i < kNumColors; i++) {
     72                 auto space = SkColorSpace::MakeSRGBLinear();
     73                 sk_sp<SkShader> s = SkShader::MakeColorShader(colors[i], space);
     74                 SkPaint paint;
     75                 paint.setShader(s);
     76                 canvas->drawRect(r, paint);
     77                 canvas->translate(50.0f, 0.0f);
     78             }
     79             canvas->restore();
     80         };
     81 
     82         // Wide gamut colors should appear darker - we are simulating a more intense display.
     83         drawColors(fSRGBColors);
     84         canvas->translate(0.0f, 100.0f);
     85         drawColors(fWideGamutColors0);
     86         canvas->translate(0.0f, 100.0f);
     87         drawColors(fWideGamutColors1);
     88     }
     89 
     90 private:
     91     static constexpr int kNumColors = 10;
     92 
     93     SkColor4f fSRGBColors[kNumColors];
     94     SkColor4f fWideGamutColors0[kNumColors];
     95     SkColor4f fWideGamutColors1[kNumColors];
     96 
     97     typedef skiagm::GM INHERITED;
     98 };
     99 
    100 DEF_GM(return new ColorSpaceXformGM;)
    101