2017-02-14 19:15:31 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2017 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "gm.h"
|
2017-03-22 17:47:51 +00:00
|
|
|
#include "sk_tool_utils.h"
|
2017-02-14 19:15:31 +00:00
|
|
|
#include "SkCanvas.h"
|
2018-12-20 22:10:27 +00:00
|
|
|
#include "SkFont.h"
|
2017-02-14 19:15:31 +00:00
|
|
|
#include "SkGradientShader.h"
|
|
|
|
#include "SkHighContrastFilter.h"
|
|
|
|
|
|
|
|
using InvertStyle = SkHighContrastConfig::InvertStyle;
|
|
|
|
|
|
|
|
static SkScalar kSize = 200;
|
|
|
|
static SkColor kColor1 = SkColorSetARGB(0xff, 0xff, 0xff, 0);
|
|
|
|
static SkColor kColor2 = SkColorSetARGB(0xff, 0x82, 0xff, 0);
|
|
|
|
|
|
|
|
static void draw_label(SkCanvas* canvas, const SkHighContrastConfig& config) {
|
|
|
|
char labelBuffer[256];
|
|
|
|
const char* invertStr =
|
|
|
|
(config.fInvertStyle == InvertStyle::kInvertBrightness ?
|
|
|
|
"InvBrightness" :
|
|
|
|
(config.fInvertStyle == InvertStyle::kInvertLightness ?
|
|
|
|
"InvLightness" : "NoInvert"));
|
|
|
|
|
|
|
|
snprintf(labelBuffer, sizeof(labelBuffer), "%s%s contrast=%.1f",
|
|
|
|
config.fGrayscale ? "Gray " : "",
|
|
|
|
invertStr,
|
|
|
|
config.fContrast);
|
|
|
|
|
2018-12-20 22:10:27 +00:00
|
|
|
SkFont font;
|
|
|
|
font.setTypeface(sk_tool_utils::create_portable_typeface());
|
|
|
|
font.setSize(0.05f);
|
|
|
|
font.setEdging(SkFont::Edging::kAlias);
|
|
|
|
|
2017-02-14 19:15:31 +00:00
|
|
|
size_t len = strlen(labelBuffer);
|
|
|
|
|
2018-12-20 22:10:27 +00:00
|
|
|
SkScalar width = font.measureText(labelBuffer, len, kUTF8_SkTextEncoding);
|
|
|
|
canvas->drawSimpleText(labelBuffer, len, kUTF8_SkTextEncoding, 0.5f - width / 2, 0.16f, font, SkPaint());
|
2017-02-14 19:15:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void draw_scene(SkCanvas* canvas, const SkHighContrastConfig& config) {
|
|
|
|
SkRect bounds = SkRect::MakeLTRB(0.0f, 0.0f, 1.0f, 1.0f);
|
|
|
|
SkPaint xferPaint;
|
|
|
|
xferPaint.setColorFilter(SkHighContrastFilter::Make(config));
|
|
|
|
canvas->saveLayer(&bounds, &xferPaint);
|
|
|
|
|
|
|
|
SkPaint paint;
|
|
|
|
bounds = SkRect::MakeLTRB(0.1f, 0.2f, 0.9f, 0.4f);
|
|
|
|
paint.setARGB(0xff, 0x66, 0x11, 0x11);
|
|
|
|
canvas->drawRect(bounds, paint);
|
|
|
|
|
|
|
|
paint.setARGB(0xff, 0xbb, 0x77, 0x77);
|
|
|
|
paint.setTextSize(0.15f);
|
2017-04-28 19:35:12 +00:00
|
|
|
canvas->drawString("A", 0.15f, 0.35f, paint);
|
2017-02-14 19:15:31 +00:00
|
|
|
|
|
|
|
bounds = SkRect::MakeLTRB(0.1f, 0.8f, 0.9f, 1.0f);
|
|
|
|
paint.setARGB(0xff, 0xcc, 0xcc, 0xff);
|
|
|
|
canvas->drawRect(bounds, paint);
|
|
|
|
|
|
|
|
paint.setARGB(0xff, 0x88, 0x88, 0xbb);
|
|
|
|
paint.setTextSize(0.15f);
|
2017-04-28 19:35:12 +00:00
|
|
|
canvas->drawString("Z", 0.75f, 0.95f, paint);
|
2017-02-14 19:15:31 +00:00
|
|
|
|
|
|
|
bounds = SkRect::MakeLTRB(0.1f, 0.4f, 0.9f, 0.6f);
|
|
|
|
SkPoint pts[] = { { 0, 0 }, { 1, 0 } };
|
|
|
|
SkColor colors[] = { SK_ColorWHITE, SK_ColorBLACK };
|
|
|
|
SkScalar pos[] = { 0.2f, 0.8f };
|
|
|
|
paint.setShader(SkGradientShader::MakeLinear(
|
|
|
|
pts, colors, pos,
|
|
|
|
SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode));
|
|
|
|
canvas->drawRect(bounds, paint);
|
|
|
|
|
|
|
|
bounds = SkRect::MakeLTRB(0.1f, 0.6f, 0.9f, 0.8f);
|
|
|
|
SkColor colors2[] = { SK_ColorGREEN, SK_ColorWHITE };
|
|
|
|
paint.setShader(SkGradientShader::MakeLinear(
|
|
|
|
pts, colors2, pos,
|
|
|
|
SK_ARRAY_COUNT(colors2), SkShader::kClamp_TileMode));
|
|
|
|
canvas->drawRect(bounds, paint);
|
|
|
|
|
|
|
|
canvas->restore();
|
|
|
|
}
|
|
|
|
|
|
|
|
class HighContrastFilterGM : public skiagm::GM {
|
|
|
|
public:
|
|
|
|
HighContrastFilterGM() {
|
|
|
|
SkColor g1Colors[] = { kColor1, SkColorSetA(kColor1, 0x20) };
|
|
|
|
SkColor g2Colors[] = { kColor2, SkColorSetA(kColor2, 0x20) };
|
|
|
|
SkPoint g1Points[] = { { 0, 0 }, { 0, 100 } };
|
|
|
|
SkPoint g2Points[] = { { 0, 0 }, { kSize, 0 } };
|
|
|
|
SkScalar pos[] = { 0.2f, 1.0f };
|
|
|
|
|
|
|
|
SkHighContrastConfig fConfig;
|
|
|
|
fFilter = SkHighContrastFilter::Make(fConfig);
|
|
|
|
fGr1 = SkGradientShader::MakeLinear(
|
|
|
|
g1Points, g1Colors, pos, SK_ARRAY_COUNT(g1Colors),
|
|
|
|
SkShader::kClamp_TileMode);
|
|
|
|
fGr2 = SkGradientShader::MakeLinear(
|
|
|
|
g2Points, g2Colors, pos, SK_ARRAY_COUNT(g2Colors),
|
|
|
|
SkShader::kClamp_TileMode);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
SkString onShortName() override {
|
|
|
|
return SkString("highcontrastfilter");
|
|
|
|
}
|
|
|
|
|
|
|
|
SkISize onISize() override {
|
|
|
|
return SkISize::Make(600, 420);
|
|
|
|
}
|
|
|
|
|
|
|
|
void onDraw(SkCanvas* canvas) override {
|
|
|
|
SkHighContrastConfig configs[] = {
|
|
|
|
{ false, InvertStyle::kNoInvert, 0.0f },
|
|
|
|
{ false, InvertStyle::kInvertBrightness, 0.0f },
|
|
|
|
{ false, InvertStyle::kInvertLightness, 0.0f },
|
|
|
|
{ false, InvertStyle::kInvertLightness, 0.2f },
|
|
|
|
{ true, InvertStyle::kNoInvert, 0.0f },
|
|
|
|
{ true, InvertStyle::kInvertBrightness, 0.0f },
|
|
|
|
{ true, InvertStyle::kInvertLightness, 0.0f },
|
|
|
|
{ true, InvertStyle::kInvertLightness, 0.2f },
|
|
|
|
};
|
|
|
|
|
|
|
|
for (size_t i = 0; i < SK_ARRAY_COUNT(configs); ++i) {
|
|
|
|
SkScalar x = kSize * (i % 4);
|
|
|
|
SkScalar y = kSize * (i / 4);
|
|
|
|
canvas->save();
|
|
|
|
canvas->translate(x, y);
|
|
|
|
canvas->scale(kSize, kSize);
|
|
|
|
draw_scene(canvas, configs[i]);
|
|
|
|
draw_label(canvas, configs[i]);
|
|
|
|
canvas->restore();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
sk_sp<SkColorFilter> fFilter;
|
|
|
|
sk_sp<SkShader> fGr1, fGr2;
|
|
|
|
|
|
|
|
typedef skiagm::GM INHERITED;
|
|
|
|
};
|
|
|
|
|
|
|
|
DEF_GM(return new HighContrastFilterGM;)
|