blob: 8c764faaef4a75b4b4a95cb811205d8c4f7f017d [file] [log] [blame]
/*
* 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 <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<SkGradientShader::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<SkGradientShader::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 = 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<SkColor4f> fColors;
SkGradientShader::Interpolation fInterpolation;
bool fDither = false;
};
///////////////////////////////////////////////////////////////////////////////
DEF_SLIDE( return new GradientsSlide(); )