/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "imgui.h" #include "include/core/SkCanvas.h" #include "include/core/SkFont.h" #include "include/effects/SkGradientShader.h" #include "tools/fonts/FontToolUtils.h" #include "tools/viewer/Slide.h" #include /////////////////////////////////////////////////////////////////////////////// class GradientsSlide : public Slide { public: GradientsSlide() { fName = "Gradients"; fColors.push_back(SkColors::kBlue); fColors.push_back(SkColors::kYellow); } void drawUI() { ImGui::Begin("Gradient"); ImGui::Checkbox("Dither", &fDither); bool premul = static_cast(fInterpolation.fInPremul); ImGui::Checkbox("Premul", &premul); fInterpolation.fInPremul = static_cast(premul); int hm = static_cast(fInterpolation.fHueMethod); ImGui::Combo("Hue Method", &hm, "Shorter\0Longer\0Increasing\0Decreasing\0\0"); fInterpolation.fHueMethod = static_cast(hm); int removeIdx = -1; for (int i = 0; i < (int)fColors.size(); ++i) { ImGui::PushID(i); if (ImGui::Button("X")) { removeIdx = i; } ImGui::SameLine(); ImGui::ColorEdit4("##Color", fColors[i].vec()); ImGui::PopID(); } if (removeIdx >= 0 && fColors.size() > 2) { fColors.erase(fColors.begin() + removeIdx); } if (ImGui::Button("+")) { fColors.push_back(SkColors::kBlack); } ImGui::End(); } void draw(SkCanvas* canvas) override { canvas->clear(SK_ColorGRAY); this->drawUI(); SkPoint pts[2] = {{0, 0}, {256, 0}}; SkRect r = {0, 0, 256, 32}; SkPaint labelPaint; SkPaint paint; paint.setDither(fDither); canvas->save(); canvas->translate(10, 10); using CS = SkGradientShader::Interpolation::ColorSpace; struct Config { CS fColorSpace; const char* fLabel; }; static const Config kConfigs[] = { { CS::kDestination, "Destination" }, { CS::kSRGB, "sRGB" }, { CS::kSRGBLinear, "Linear sRGB" }, { CS::kLab, "CIELAB" }, { CS::kOKLab, "Oklab" }, { CS::kOKLabGamutMap, "OklabGamutMap" }, { CS::kLCH, "LCH" }, { CS::kOKLCH, "Oklch" }, { CS::kOKLCHGamutMap, "OklchGamutMap" }, { CS::kHSL, "HSL" }, { CS::kHWB, "HWB" }, }; SkFont font = ToolUtils::DefaultFont(); for (const Config& config : kConfigs) { fInterpolation.fColorSpace = config.fColorSpace; paint.setShader(SkGradientShader::MakeLinear(pts, fColors.data(), SkColorSpace::MakeSRGB(), nullptr, (int)fColors.size(), SkTileMode::kClamp, fInterpolation, nullptr)); canvas->drawRect(r, paint); canvas->drawSimpleText(config.fLabel, strlen(config.fLabel), SkTextEncoding::kUTF8, 266, 20, font, labelPaint); canvas->translate(0, 42); } canvas->restore(); } private: std::vector fColors; SkGradientShader::Interpolation fInterpolation; bool fDither = false; }; /////////////////////////////////////////////////////////////////////////////// DEF_SLIDE( return new GradientsSlide(); )