1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "imgui.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/Slide.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker class GradientsSlide : public Slide { 20*c8dee2aaSAndroid Build Coastguard Worker public: GradientsSlide()21*c8dee2aaSAndroid Build Coastguard Worker GradientsSlide() { 22*c8dee2aaSAndroid Build Coastguard Worker fName = "Gradients"; 23*c8dee2aaSAndroid Build Coastguard Worker fColors.push_back(SkColors::kBlue); 24*c8dee2aaSAndroid Build Coastguard Worker fColors.push_back(SkColors::kYellow); 25*c8dee2aaSAndroid Build Coastguard Worker } 26*c8dee2aaSAndroid Build Coastguard Worker drawUI()27*c8dee2aaSAndroid Build Coastguard Worker void drawUI() { 28*c8dee2aaSAndroid Build Coastguard Worker ImGui::Begin("Gradient"); 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker ImGui::Checkbox("Dither", &fDither); 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker bool premul = static_cast<bool>(fInterpolation.fInPremul); 33*c8dee2aaSAndroid Build Coastguard Worker ImGui::Checkbox("Premul", &premul); 34*c8dee2aaSAndroid Build Coastguard Worker fInterpolation.fInPremul = static_cast<SkGradientShader::Interpolation::InPremul>(premul); 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker int hm = static_cast<int>(fInterpolation.fHueMethod); 37*c8dee2aaSAndroid Build Coastguard Worker ImGui::Combo("Hue Method", &hm, "Shorter\0Longer\0Increasing\0Decreasing\0\0"); 38*c8dee2aaSAndroid Build Coastguard Worker fInterpolation.fHueMethod = static_cast<SkGradientShader::Interpolation::HueMethod>(hm); 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker int removeIdx = -1; 41*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < (int)fColors.size(); ++i) { 42*c8dee2aaSAndroid Build Coastguard Worker ImGui::PushID(i); 43*c8dee2aaSAndroid Build Coastguard Worker if (ImGui::Button("X")) { 44*c8dee2aaSAndroid Build Coastguard Worker removeIdx = i; 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker ImGui::SameLine(); 47*c8dee2aaSAndroid Build Coastguard Worker ImGui::ColorEdit4("##Color", fColors[i].vec()); 48*c8dee2aaSAndroid Build Coastguard Worker ImGui::PopID(); 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker if (removeIdx >= 0 && fColors.size() > 2) { 51*c8dee2aaSAndroid Build Coastguard Worker fColors.erase(fColors.begin() + removeIdx); 52*c8dee2aaSAndroid Build Coastguard Worker } 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker if (ImGui::Button("+")) { 55*c8dee2aaSAndroid Build Coastguard Worker fColors.push_back(SkColors::kBlack); 56*c8dee2aaSAndroid Build Coastguard Worker } 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker ImGui::End(); 59*c8dee2aaSAndroid Build Coastguard Worker } 60*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)61*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 62*c8dee2aaSAndroid Build Coastguard Worker canvas->clear(SK_ColorGRAY); 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker this->drawUI(); 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker SkPoint pts[2] = {{0, 0}, {256, 0}}; 67*c8dee2aaSAndroid Build Coastguard Worker SkRect r = {0, 0, 256, 32}; 68*c8dee2aaSAndroid Build Coastguard Worker SkPaint labelPaint; 69*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 70*c8dee2aaSAndroid Build Coastguard Worker paint.setDither(fDither); 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 73*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(10, 10); 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker using CS = SkGradientShader::Interpolation::ColorSpace; 76*c8dee2aaSAndroid Build Coastguard Worker struct Config { 77*c8dee2aaSAndroid Build Coastguard Worker CS fColorSpace; 78*c8dee2aaSAndroid Build Coastguard Worker const char* fLabel; 79*c8dee2aaSAndroid Build Coastguard Worker }; 80*c8dee2aaSAndroid Build Coastguard Worker static const Config kConfigs[] = { 81*c8dee2aaSAndroid Build Coastguard Worker { CS::kDestination, "Destination" }, 82*c8dee2aaSAndroid Build Coastguard Worker { CS::kSRGB, "sRGB" }, 83*c8dee2aaSAndroid Build Coastguard Worker { CS::kSRGBLinear, "Linear sRGB" }, 84*c8dee2aaSAndroid Build Coastguard Worker { CS::kLab, "CIELAB" }, 85*c8dee2aaSAndroid Build Coastguard Worker { CS::kOKLab, "Oklab" }, 86*c8dee2aaSAndroid Build Coastguard Worker { CS::kOKLabGamutMap, "OklabGamutMap" }, 87*c8dee2aaSAndroid Build Coastguard Worker { CS::kLCH, "LCH" }, 88*c8dee2aaSAndroid Build Coastguard Worker { CS::kOKLCH, "Oklch" }, 89*c8dee2aaSAndroid Build Coastguard Worker { CS::kOKLCHGamutMap, "OklchGamutMap" }, 90*c8dee2aaSAndroid Build Coastguard Worker { CS::kHSL, "HSL" }, 91*c8dee2aaSAndroid Build Coastguard Worker { CS::kHWB, "HWB" }, 92*c8dee2aaSAndroid Build Coastguard Worker }; 93*c8dee2aaSAndroid Build Coastguard Worker SkFont font = ToolUtils::DefaultFont(); 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker for (const Config& config : kConfigs) { 96*c8dee2aaSAndroid Build Coastguard Worker fInterpolation.fColorSpace = config.fColorSpace; 97*c8dee2aaSAndroid Build Coastguard Worker 98*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(SkGradientShader::MakeLinear(pts, fColors.data(), 99*c8dee2aaSAndroid Build Coastguard Worker SkColorSpace::MakeSRGB(), nullptr, 100*c8dee2aaSAndroid Build Coastguard Worker (int)fColors.size(), SkTileMode::kClamp, 101*c8dee2aaSAndroid Build Coastguard Worker fInterpolation, nullptr)); 102*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(r, paint); 103*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(config.fLabel, strlen(config.fLabel), SkTextEncoding::kUTF8, 104*c8dee2aaSAndroid Build Coastguard Worker 266, 20, font, labelPaint); 105*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(0, 42); 106*c8dee2aaSAndroid Build Coastguard Worker } 107*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 108*c8dee2aaSAndroid Build Coastguard Worker } 109*c8dee2aaSAndroid Build Coastguard Worker 110*c8dee2aaSAndroid Build Coastguard Worker private: 111*c8dee2aaSAndroid Build Coastguard Worker std::vector<SkColor4f> fColors; 112*c8dee2aaSAndroid Build Coastguard Worker SkGradientShader::Interpolation fInterpolation; 113*c8dee2aaSAndroid Build Coastguard Worker bool fDither = false; 114*c8dee2aaSAndroid Build Coastguard Worker }; 115*c8dee2aaSAndroid Build Coastguard Worker 116*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 117*c8dee2aaSAndroid Build Coastguard Worker 118*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE( return new GradientsSlide(); ) 119