blob: 1627654ffcb8a6eaefe7ac5eebefb48bd425b94d [file] [log] [blame]
egdaniel723b0502015-09-15 09:31:40 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8
halcanary9d524f22016-03-29 09:03:52 -07009/*
egdaniel723b0502015-09-15 09:31:40 -070010 * Tests text rendering with LCD and the various blend modes.
11 */
12
13#include "gm.h"
Mike Klein33d20552017-03-22 13:47:51 -040014#include "sk_tool_utils.h"
egdaniel723b0502015-09-15 09:31:40 -070015#include "SkCanvas.h"
16#include "SkGradientShader.h"
egdaniel27b63352015-09-15 13:13:50 -070017#include "SkSurface.h"
egdaniel723b0502015-09-15 09:31:40 -070018
19namespace skiagm {
20
mtkleindbfd7ab2016-09-01 11:24:54 -070021constexpr int kColWidth = 180;
22constexpr int kNumCols = 4;
23constexpr int kWidth = kColWidth * kNumCols;
24constexpr int kHeight = 750;
egdaniel723b0502015-09-15 09:31:40 -070025
reed1a9b9642016-03-13 14:13:58 -070026static sk_sp<SkShader> make_shader(const SkRect& bounds) {
egdaniel723b0502015-09-15 09:31:40 -070027 const SkPoint pts[] = {
28 { bounds.left(), bounds.top() },
29 { bounds.right(), bounds.bottom() },
30 };
31 const SkColor colors[] = {
32 SK_ColorRED, SK_ColorGREEN,
33 };
reed1a9b9642016-03-13 14:13:58 -070034 return SkGradientShader::MakeLinear(pts, colors, nullptr, SK_ARRAY_COUNT(colors),
35 SkShader::kRepeat_TileMode);
egdaniel723b0502015-09-15 09:31:40 -070036}
37
38class LcdBlendGM : public skiagm::GM {
39public:
40 LcdBlendGM() {
41 const int kPointSize = 25;
42 fTextHeight = SkIntToScalar(kPointSize);
43 }
halcanary9d524f22016-03-29 09:03:52 -070044
egdaniel723b0502015-09-15 09:31:40 -070045protected:
46 SkString onShortName() override {
egdaniel27b63352015-09-15 13:13:50 -070047 return SkString("lcdblendmodes");
48 }
49
50 void onOnceBeforeDraw() override {
reed8a21c9f2016-03-08 18:50:00 -080051 fCheckerboard = sk_tool_utils::create_checkerboard_shader(SK_ColorBLACK, SK_ColorWHITE, 4);
egdaniel723b0502015-09-15 09:31:40 -070052 }
halcanary9d524f22016-03-29 09:03:52 -070053
egdaniel723b0502015-09-15 09:31:40 -070054 SkISize onISize() override { return SkISize::Make(kWidth, kHeight); }
halcanary9d524f22016-03-29 09:03:52 -070055
egdaniel723b0502015-09-15 09:31:40 -070056 void onDraw(SkCanvas* canvas) override {
egdaniel27b63352015-09-15 13:13:50 -070057 SkPaint p;
58 p.setAntiAlias(false);
59 p.setStyle(SkPaint::kFill_Style);
60 p.setShader(fCheckerboard);
61 SkRect r = SkRect::MakeWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight));
62 canvas->drawRect(r, p);
63
64 SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight);
Mike Reed46596ae2018-01-02 15:40:29 -050065 auto surface(sk_tool_utils::makeSurface(canvas, info));
egdaniel27b63352015-09-15 13:13:50 -070066
67 SkCanvas* surfCanvas = surface->getCanvas();
68 this->drawColumn(surfCanvas, SK_ColorBLACK, SK_ColorWHITE, false);
69 surfCanvas->translate(SkIntToScalar(kColWidth), 0);
70 this->drawColumn(surfCanvas, SK_ColorWHITE, SK_ColorBLACK, false);
71 surfCanvas->translate(SkIntToScalar(kColWidth), 0);
72 this->drawColumn(surfCanvas, SK_ColorGREEN, SK_ColorMAGENTA, false);
73 surfCanvas->translate(SkIntToScalar(kColWidth), 0);
74 this->drawColumn(surfCanvas, SK_ColorCYAN, SK_ColorMAGENTA, true);
75
76 SkPaint surfPaint;
reed374772b2016-10-05 17:33:02 -070077 surfPaint.setBlendMode(SkBlendMode::kSrcOver);
egdaniel27b63352015-09-15 13:13:50 -070078 surface->draw(canvas, 0, 0, &surfPaint);
egdaniel723b0502015-09-15 09:31:40 -070079 }
80
81 void drawColumn(SkCanvas* canvas, SkColor backgroundColor, SkColor textColor, bool useGrad) {
Brian Osmand1e67e72017-03-15 12:19:37 -040082 const SkBlendMode gModes[] = {
83 SkBlendMode::kClear,
84 SkBlendMode::kSrc,
85 SkBlendMode::kDst,
86 SkBlendMode::kSrcOver,
87 SkBlendMode::kDstOver,
88 SkBlendMode::kSrcIn,
89 SkBlendMode::kDstIn,
90 SkBlendMode::kSrcOut,
91 SkBlendMode::kDstOut,
92 SkBlendMode::kSrcATop,
93 SkBlendMode::kDstATop,
94 SkBlendMode::kXor,
95 SkBlendMode::kPlus,
96 SkBlendMode::kModulate,
97 SkBlendMode::kScreen,
98 SkBlendMode::kOverlay,
99 SkBlendMode::kDarken,
100 SkBlendMode::kLighten,
101 SkBlendMode::kColorDodge,
102 SkBlendMode::kColorBurn,
103 SkBlendMode::kHardLight,
104 SkBlendMode::kSoftLight,
105 SkBlendMode::kDifference,
106 SkBlendMode::kExclusion,
107 SkBlendMode::kMultiply,
108 SkBlendMode::kHue,
109 SkBlendMode::kSaturation,
110 SkBlendMode::kColor,
111 SkBlendMode::kLuminosity,
egdaniel723b0502015-09-15 09:31:40 -0700112 };
113 // Draw background rect
114 SkPaint backgroundPaint;
115 backgroundPaint.setColor(backgroundColor);
Mike Reed3661bc92017-02-22 13:21:42 -0500116 canvas->drawRect(SkRect::MakeIWH(kColWidth, kHeight), backgroundPaint);
egdaniel723b0502015-09-15 09:31:40 -0700117 SkScalar y = fTextHeight;
118 for (size_t m = 0; m < SK_ARRAY_COUNT(gModes); m++) {
egdaniel723b0502015-09-15 09:31:40 -0700119 SkPaint paint;
120 paint.setColor(textColor);
121 paint.setAntiAlias(true);
122 paint.setSubpixelText(true);
123 paint.setLCDRenderText(true);
124 paint.setTextSize(fTextHeight);
Brian Osmand1e67e72017-03-15 12:19:37 -0400125 paint.setBlendMode(gModes[m]);
egdaniel723b0502015-09-15 09:31:40 -0700126 sk_tool_utils::set_portable_typeface(&paint);
127 if (useGrad) {
128 SkRect r;
129 r.setXYWH(0, y - fTextHeight, SkIntToScalar(kColWidth), fTextHeight);
reed1a9b9642016-03-13 14:13:58 -0700130 paint.setShader(make_shader(r));
egdaniel723b0502015-09-15 09:31:40 -0700131 }
Brian Osmand1e67e72017-03-15 12:19:37 -0400132 SkString string(SkBlendMode_Name(gModes[m]));
Cary Clark2a475ea2017-04-28 15:35:12 -0400133 canvas->drawString(string, 0, y, paint);
egdaniel723b0502015-09-15 09:31:40 -0700134 y+=fTextHeight;
135 }
136 }
halcanary9d524f22016-03-29 09:03:52 -0700137
egdaniel723b0502015-09-15 09:31:40 -0700138private:
139 SkScalar fTextHeight;
reed8a21c9f2016-03-08 18:50:00 -0800140 sk_sp<SkShader> fCheckerboard;
egdaniel723b0502015-09-15 09:31:40 -0700141 typedef skiagm::GM INHERITED;
142};
143
144//////////////////////////////////////////////////////////////////////////////
145
146DEF_GM( return new LcdBlendGM; )
147}