| /* | |
| * 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/SkGradient.h" | |
| #include "tools/fonts/FontToolUtils.h" | |
| #include "tools/viewer/Slide.h" | |
| #include <vector> | |
| /////////////////////////////////////////////////////////////////////////////// | |
| 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<bool>(fInterpolation.fInPremul); | |
| ImGui::Checkbox("Premul", &premul); | |
| fInterpolation.fInPremul = static_cast<SkGradient::Interpolation::InPremul>(premul); | |
| int hm = static_cast<int>(fInterpolation.fHueMethod); | |
| ImGui::Combo("Hue Method", &hm, "Shorter\0Longer\0Increasing\0Decreasing\0\0"); | |
| fInterpolation.fHueMethod = static_cast<SkGradient::Interpolation::HueMethod>(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 = SkGradient::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(SkShaders::LinearGradient(pts, | |
| {{fColors, {}, SkTileMode::kClamp}, fInterpolation})); | |
| 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<SkColor4f> fColors; | |
| SkGradient::Interpolation fInterpolation; | |
| bool fDither = false; | |
| }; | |
| /////////////////////////////////////////////////////////////////////////////// | |
| DEF_SLIDE( return new GradientsSlide(); ) |