1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkHighContrastFilter.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotusing InvertStyle = SkHighContrastConfig::InvertStyle; 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkScalar kSize = 200; 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkColor kColor1 = SkColorSetARGB(0xff, 0xff, 0xff, 0); 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkColor kColor2 = SkColorSetARGB(0xff, 0x82, 0xff, 0); 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void draw_label(SkCanvas* canvas, const SkHighContrastConfig& config) { 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot char labelBuffer[256]; 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* invertStr = 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (config.fInvertStyle == InvertStyle::kInvertBrightness ? 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot "InvBrightness" : 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot (config.fInvertStyle == InvertStyle::kInvertLightness ? 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot "InvLightness" : "NoInvert")); 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot snprintf(labelBuffer, sizeof(labelBuffer), "%s%s contrast=%.1f", 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot config.fGrayscale ? "Gray " : "", 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot invertStr, 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot config.fContrast); 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_tool_utils::set_portable_typeface(&paint); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setTextSize(0.05f); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t len = strlen(labelBuffer); 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar width = paint.measureText(labelBuffer, len); 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawText(labelBuffer, len, 0.5f - width / 2, 0.16f, paint); 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void draw_scene(SkCanvas* canvas, const SkHighContrastConfig& config) { 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect bounds = SkRect::MakeLTRB(0.0f, 0.0f, 1.0f, 1.0f); 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint xferPaint; 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot xferPaint.setColorFilter(SkHighContrastFilter::Make(config)); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->saveLayer(&bounds, &xferPaint); 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bounds = SkRect::MakeLTRB(0.1f, 0.2f, 0.9f, 0.4f); 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setARGB(0xff, 0x66, 0x11, 0x11); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(bounds, paint); 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setARGB(0xff, 0xbb, 0x77, 0x77); 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setTextSize(0.15f); 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawString("A", 0.15f, 0.35f, paint); 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bounds = SkRect::MakeLTRB(0.1f, 0.8f, 0.9f, 1.0f); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setARGB(0xff, 0xcc, 0xcc, 0xff); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(bounds, paint); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setARGB(0xff, 0x88, 0x88, 0xbb); 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setTextSize(0.15f); 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawString("Z", 0.75f, 0.95f, paint); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bounds = SkRect::MakeLTRB(0.1f, 0.4f, 0.9f, 0.6f); 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint pts[] = { { 0, 0 }, { 1, 0 } }; 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colors[] = { SK_ColorWHITE, SK_ColorBLACK }; 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar pos[] = { 0.2f, 0.8f }; 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setShader(SkGradientShader::MakeLinear( 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pts, colors, pos, 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode)); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(bounds, paint); 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bounds = SkRect::MakeLTRB(0.1f, 0.6f, 0.9f, 0.8f); 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor colors2[] = { SK_ColorGREEN, SK_ColorWHITE }; 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setShader(SkGradientShader::MakeLinear( 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pts, colors2, pos, 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ARRAY_COUNT(colors2), SkShader::kClamp_TileMode)); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(bounds, paint); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass HighContrastFilterGM : public skiagm::GM { 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot HighContrastFilterGM() { 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor g1Colors[] = { kColor1, SkColorSetA(kColor1, 0x20) }; 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor g2Colors[] = { kColor2, SkColorSetA(kColor2, 0x20) }; 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint g1Points[] = { { 0, 0 }, { 0, 100 } }; 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint g2Points[] = { { 0, 0 }, { kSize, 0 } }; 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar pos[] = { 0.2f, 1.0f }; 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkHighContrastConfig fConfig; 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFilter = SkHighContrastFilter::Make(fConfig); 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fGr1 = SkGradientShader::MakeLinear( 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot g1Points, g1Colors, pos, SK_ARRAY_COUNT(g1Colors), 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShader::kClamp_TileMode); 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fGr2 = SkGradientShader::MakeLinear( 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot g2Points, g2Colors, pos, SK_ARRAY_COUNT(g2Colors), 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkShader::kClamp_TileMode); 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("highcontrastfilter"); 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkISize::Make(600, 420); 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkHighContrastConfig configs[] = { 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { false, InvertStyle::kNoInvert, 0.0f }, 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { false, InvertStyle::kInvertBrightness, 0.0f }, 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { false, InvertStyle::kInvertLightness, 0.0f }, 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { false, InvertStyle::kInvertLightness, 0.2f }, 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { true, InvertStyle::kNoInvert, 0.0f }, 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { true, InvertStyle::kInvertBrightness, 0.0f }, 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { true, InvertStyle::kInvertLightness, 0.0f }, 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { true, InvertStyle::kInvertLightness, 0.2f }, 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t i = 0; i < SK_ARRAY_COUNT(configs); ++i) { 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar x = kSize * (i % 4); 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar y = kSize * (i / 4); 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(x, y); 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->scale(kSize, kSize); 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot draw_scene(canvas, configs[i]); 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot draw_label(canvas, configs[i]); 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkColorFilter> fFilter; 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkShader> fGr1, fGr2; 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef skiagm::GM INHERITED; 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new HighContrastFilterGM;) 145