| /* |
| * 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/gm.h" |
| #include "include/core/SkCanvas.h" |
| #include "include/core/SkColor.h" |
| #include "include/core/SkColorFilter.h" |
| #include "include/core/SkFont.h" |
| #include "include/core/SkFontTypes.h" |
| #include "include/core/SkPaint.h" |
| #include "include/core/SkPoint.h" |
| #include "include/core/SkRect.h" |
| #include "include/core/SkRefCnt.h" |
| #include "include/core/SkScalar.h" |
| #include "include/core/SkShader.h" |
| #include "include/core/SkSize.h" |
| #include "include/core/SkString.h" |
| #include "include/core/SkTileMode.h" |
| #include "include/core/SkTypeface.h" |
| #include "include/core/SkTypes.h" |
| #include "include/effects/SkGradientShader.h" |
| #include "include/effects/SkHighContrastFilter.h" |
| #include "tools/ToolUtils.h" |
| |
| #include <stdio.h> |
| #include <string.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 ? |
| "InvBright" : |
| (config.fInvertStyle == InvertStyle::kInvertLightness ? |
| "InvLight" : "NoInvert")); |
| |
| snprintf(labelBuffer, sizeof(labelBuffer), "%s%s contrast=%.1f", |
| config.fGrayscale ? "Gray " : "", |
| invertStr, |
| config.fContrast); |
| |
| SkFont font; |
| font.setTypeface(ToolUtils::create_portable_typeface()); |
| font.setSize(0.075f); |
| font.setEdging(SkFont::Edging::kAntiAlias); |
| |
| size_t len = strlen(labelBuffer); |
| |
| SkScalar width = font.measureText(labelBuffer, len, SkTextEncoding::kUTF8); |
| canvas->drawSimpleText(labelBuffer, len, SkTextEncoding::kUTF8, 0.5f - width / 2, 0.16f, font, SkPaint()); |
| } |
| |
| 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); |
| |
| SkFont font; |
| font.setSize(0.15f); |
| font.setEdging(SkFont::Edging::kAlias); |
| |
| paint.setARGB(0xff, 0xbb, 0x77, 0x77); |
| canvas->drawString("A", 0.15f, 0.35f, font, paint); |
| |
| 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); |
| canvas->drawString("Z", 0.75f, 0.95f, font, paint); |
| |
| 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, |
| std::size(colors), SkTileMode::kClamp)); |
| 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, |
| std::size(colors2), SkTileMode::kClamp)); |
| canvas->drawRect(bounds, paint); |
| |
| canvas->restore(); |
| } |
| |
| class HighContrastFilterGM : public skiagm::GM { |
| protected: |
| void onOnceBeforeDraw() override { |
| 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, std::size(g1Colors), |
| SkTileMode::kClamp); |
| fGr2 = SkGradientShader::MakeLinear( |
| g2Points, g2Colors, pos, std::size(g2Colors), |
| SkTileMode::kClamp); |
| } |
| |
| SkString onShortName() override { |
| return SkString("highcontrastfilter"); |
| } |
| |
| SkISize onISize() override { |
| return SkISize::Make(800, 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 < std::size(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; |
| |
| using INHERITED = skiagm::GM; |
| }; |
| |
| DEF_GM(return new HighContrastFilterGM;) |