blob: ec20e6efbe679a2aa5f5a33c92b0fa4f49adadb7 [file] [log] [blame]
reed@google.comf2de1e22013-05-28 15:29:25 +00001/*
2 * Copyright 2011 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#include "gm.h"
reed@google.comf2de1e22013-05-28 15:29:25 +00009
tfarinabcbc1782014-06-18 14:32:48 -070010#include "Resources.h"
11#include "SkGradientShader.h"
humper@google.com04db3162013-05-31 12:50:39 +000012#include "SkStream.h"
tfarinabcbc1782014-06-18 14:32:48 -070013#include "SkTypeface.h"
reed@google.com7b06ba42013-05-28 16:39:52 +000014
mbocee6a9912016-05-31 11:42:36 -070015static void setTypeface(SkPaint* paint, const char name[], SkFontStyle style) {
caryclark1818acb2015-07-24 12:09:25 -070016 sk_tool_utils::set_portable_typeface(paint, name, style);
reed@google.com7b06ba42013-05-28 16:39:52 +000017}
18
reed@google.comf2de1e22013-05-28 15:29:25 +000019static SkSize computeSize(const SkBitmap& bm, const SkMatrix& mat) {
reed@google.com98447b02013-05-28 15:42:21 +000020 SkRect bounds = SkRect::MakeWH(SkIntToScalar(bm.width()),
21 SkIntToScalar(bm.height()));
reed@google.comf2de1e22013-05-28 15:29:25 +000022 mat.mapRect(&bounds);
reed@google.com98447b02013-05-28 15:42:21 +000023 return SkSize::Make(bounds.width(), bounds.height());
reed@google.comf2de1e22013-05-28 15:29:25 +000024}
25
Florin Malitac54d8db2014-12-10 12:02:16 -050026static void draw_cell(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx,
reed93a12152015-03-16 10:08:34 -070027 SkFilterQuality lvl) {
reed@google.comf2de1e22013-05-28 15:29:25 +000028 SkPaint paint;
reed93a12152015-03-16 10:08:34 -070029 paint.setFilterQuality(lvl);
reed@google.comf2de1e22013-05-28 15:29:25 +000030
31 SkAutoCanvasRestore acr(canvas, true);
reed@google.comf2de1e22013-05-28 15:29:25 +000032 canvas->translate(dx, 0);
Florin Malitac54d8db2014-12-10 12:02:16 -050033 canvas->concat(mat);
34 canvas->drawBitmap(bm, 0, 0, &paint);
35}
reed@google.comf2de1e22013-05-28 15:29:25 +000036
Florin Malitac54d8db2014-12-10 12:02:16 -050037static void draw_row(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx) {
reed93a12152015-03-16 10:08:34 -070038 draw_cell(canvas, bm, mat, 0 * dx, kNone_SkFilterQuality);
39 draw_cell(canvas, bm, mat, 1 * dx, kLow_SkFilterQuality);
40 draw_cell(canvas, bm, mat, 2 * dx, kMedium_SkFilterQuality);
41 draw_cell(canvas, bm, mat, 3 * dx, kHigh_SkFilterQuality);
reed@google.comf2de1e22013-05-28 15:29:25 +000042}
43
44class FilterBitmapGM : public skiagm::GM {
mtklein36352bf2015-03-25 18:17:31 -070045 void onOnceBeforeDraw() override {
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +000046
commit-bot@chromium.org79b7eee2013-12-16 21:02:29 +000047 this->makeBitmap();
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +000048
reed@google.comf2de1e22013-05-28 15:29:25 +000049 SkScalar cx = SkScalarHalf(fBM.width());
50 SkScalar cy = SkScalarHalf(fBM.height());
commit-bot@chromium.org79b7eee2013-12-16 21:02:29 +000051 SkScalar scale = this->getScale();
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +000052
commit-bot@chromium.org79b7eee2013-12-16 21:02:29 +000053 // these two matrices use a scale factor configured by the subclass
reed@google.comf2de1e22013-05-28 15:29:25 +000054 fMatrix[0].setScale(scale, scale);
55 fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(scale, scale);
commit-bot@chromium.org79b7eee2013-12-16 21:02:29 +000056
57 // up/down scaling mix
58 fMatrix[2].setScale(0.7f, 1.05f);
reed@google.comf2de1e22013-05-28 15:29:25 +000059 }
60
61public:
62 SkBitmap fBM;
commit-bot@chromium.org79b7eee2013-12-16 21:02:29 +000063 SkMatrix fMatrix[3];
humper@google.com04db3162013-05-31 12:50:39 +000064 SkString fName;
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +000065
humper@google.com04db3162013-05-31 12:50:39 +000066 FilterBitmapGM()
67 {
caryclark65cdba62015-06-15 06:51:08 -070068 this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
reed@google.comf2de1e22013-05-28 15:29:25 +000069 }
70
71protected:
commit-bot@chromium.orga90c6802014-04-30 13:20:45 +000072
mtklein36352bf2015-03-25 18:17:31 -070073 SkString onShortName() override {
humper@google.com04db3162013-05-31 12:50:39 +000074 return fName;
reed@google.comf2de1e22013-05-28 15:29:25 +000075 }
76
mtklein36352bf2015-03-25 18:17:31 -070077 SkISize onISize() override {
commit-bot@chromium.org79b7eee2013-12-16 21:02:29 +000078 return SkISize::Make(1024, 768);
reed@google.comf2de1e22013-05-28 15:29:25 +000079 }
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +000080
commit-bot@chromium.org79b7eee2013-12-16 21:02:29 +000081 virtual void makeBitmap() = 0;
82 virtual SkScalar getScale() = 0;
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +000083
mtklein36352bf2015-03-25 18:17:31 -070084 void onDraw(SkCanvas* canvas) override {
reed@google.comf2de1e22013-05-28 15:29:25 +000085
86 canvas->translate(10, 10);
87 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrix); ++i) {
88 SkSize size = computeSize(fBM, fMatrix[i]);
89 size.fWidth += 20;
90 size.fHeight += 20;
91
commit-bot@chromium.org79b7eee2013-12-16 21:02:29 +000092 draw_row(canvas, fBM, fMatrix[i], size.fWidth);
reed@google.comf2de1e22013-05-28 15:29:25 +000093 canvas->translate(0, size.fHeight);
94 }
95 }
96
97private:
98 typedef skiagm::GM INHERITED;
99};
100
humper@google.com04db3162013-05-31 12:50:39 +0000101class FilterBitmapTextGM: public FilterBitmapGM {
102 public:
humper@google.comb0889472013-07-09 21:37:14 +0000103 FilterBitmapTextGM(float textSize)
104 : fTextSize(textSize)
humper@google.com04db3162013-05-31 12:50:39 +0000105 {
humper@google.come2cf8052013-07-25 19:14:37 +0000106 fName.printf("filterbitmap_text_%.2fpt", fTextSize);
humper@google.com04db3162013-05-31 12:50:39 +0000107 }
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000108
humper@google.com04db3162013-05-31 12:50:39 +0000109 protected:
110 float fTextSize;
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000111
mtklein36352bf2015-03-25 18:17:31 -0700112 SkScalar getScale() override {
humper@google.com04db3162013-05-31 12:50:39 +0000113 return 32.f/fTextSize;
114 }
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000115
mtklein36352bf2015-03-25 18:17:31 -0700116 void makeBitmap() override {
reed@google.comeb9a46c2014-01-25 16:46:20 +0000117 fBM.allocN32Pixels(int(fTextSize * 8), int(fTextSize * 6));
humper@google.com04db3162013-05-31 12:50:39 +0000118 SkCanvas canvas(fBM);
119 canvas.drawColor(SK_ColorWHITE);
120
121 SkPaint paint;
122 paint.setAntiAlias(true);
123 paint.setSubpixelText(true);
124 paint.setTextSize(fTextSize);
125
mbocee6a9912016-05-31 11:42:36 -0700126 setTypeface(&paint, "serif", SkFontStyle());
humper@google.com6dce1132013-05-31 12:58:29 +0000127 canvas.drawText("Hamburgefons", 12, fTextSize/2, 1.2f*fTextSize, paint);
mbocee6a9912016-05-31 11:42:36 -0700128 setTypeface(&paint, "serif", SkFontStyle::FromOldStyle(SkTypeface::kBold));
humper@google.com6dce1132013-05-31 12:58:29 +0000129 canvas.drawText("Hamburgefons", 12, fTextSize/2, 2.4f*fTextSize, paint);
mbocee6a9912016-05-31 11:42:36 -0700130 setTypeface(&paint, "serif", SkFontStyle::FromOldStyle(SkTypeface::kItalic));
humper@google.com6dce1132013-05-31 12:58:29 +0000131 canvas.drawText("Hamburgefons", 12, fTextSize/2, 3.6f*fTextSize, paint);
mbocee6a9912016-05-31 11:42:36 -0700132 setTypeface(&paint, "serif", SkFontStyle::FromOldStyle(SkTypeface::kBoldItalic));
humper@google.com6dce1132013-05-31 12:58:29 +0000133 canvas.drawText("Hamburgefons", 12, fTextSize/2, 4.8f*fTextSize, paint);
humper@google.com04db3162013-05-31 12:50:39 +0000134 }
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000135 private:
humper@google.com04db3162013-05-31 12:50:39 +0000136 typedef FilterBitmapGM INHERITED;
137};
138
139class FilterBitmapCheckerboardGM: public FilterBitmapGM {
reed0c9b1a82015-03-17 17:44:06 -0700140public:
141 FilterBitmapCheckerboardGM(int size, int num_checks, bool convertToG8 = false)
142 : fSize(size), fNumChecks(num_checks), fConvertToG8(convertToG8)
143 {
144 fName.printf("filterbitmap_checkerboard_%d_%d%s",
145 fSize, fNumChecks, convertToG8 ? "_g8" : "");
146 }
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000147
humper@google.com04db3162013-05-31 12:50:39 +0000148 protected:
149 int fSize;
150 int fNumChecks;
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000151
mtklein36352bf2015-03-25 18:17:31 -0700152 SkScalar getScale() override {
humper@google.com04db3162013-05-31 12:50:39 +0000153 return 192.f/fSize;
154 }
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000155
mtklein36352bf2015-03-25 18:17:31 -0700156 void makeBitmap() override {
reed@google.comeb9a46c2014-01-25 16:46:20 +0000157 fBM.allocN32Pixels(fSize, fSize);
humper@google.com04db3162013-05-31 12:50:39 +0000158 for (int y = 0; y < fSize; y ++) {
159 for (int x = 0; x < fSize; x ++) {
160 SkPMColor* s = fBM.getAddr32(x, y);
161 int cx = (x * fNumChecks) / fSize;
162 int cy = (y * fNumChecks) / fSize;
163 if ((cx+cy)%2) {
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000164 *s = 0xFFFFFFFF;
165 } else {
humper@google.com04db3162013-05-31 12:50:39 +0000166 *s = 0xFF000000;
167 }
168 }
169 }
reed0c9b1a82015-03-17 17:44:06 -0700170 if (fConvertToG8) {
171 SkBitmap tmp;
172 fBM.copyTo(&tmp, kGray_8_SkColorType);
173 fBM = tmp;
174 }
humper@google.com04db3162013-05-31 12:50:39 +0000175 }
reed0c9b1a82015-03-17 17:44:06 -0700176private:
177 const bool fConvertToG8;
178 typedef FilterBitmapGM INHERITED;
humper@google.com04db3162013-05-31 12:50:39 +0000179};
180
181class FilterBitmapImageGM: public FilterBitmapGM {
reed0c9b1a82015-03-17 17:44:06 -0700182public:
183 FilterBitmapImageGM(const char filename[], bool convertToG8 = false)
184 : fFilename(filename), fConvertToG8(convertToG8)
185 {
186 fName.printf("filterbitmap_image_%s%s", filename, convertToG8 ? "_g8" : "");
187 }
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000188
reed0c9b1a82015-03-17 17:44:06 -0700189protected:
humper@google.com04db3162013-05-31 12:50:39 +0000190 SkString fFilename;
191 int fSize;
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000192
mtklein36352bf2015-03-25 18:17:31 -0700193 SkScalar getScale() override {
humper@google.com04db3162013-05-31 12:50:39 +0000194 return 192.f/fSize;
195 }
skia.committer@gmail.com26da7f02013-06-01 07:01:39 +0000196
mtklein36352bf2015-03-25 18:17:31 -0700197 void makeBitmap() override {
msarette820dfe2016-03-18 12:13:47 -0700198 if (!GetResourceAsBitmap(fFilename.c_str(), &fBM)) {
199 fBM.allocN32Pixels(1, 1);
200 fBM.eraseARGB(255, 255, 0 , 0); // red == bad
201 }
202 fSize = fBM.height();
203
204 if (fConvertToG8) {
205 SkBitmap tmp;
206 fBM.copyTo(&tmp, kGray_8_SkColorType);
207 fBM = tmp;
208 }
humper@google.com04db3162013-05-31 12:50:39 +0000209 }
reed0c9b1a82015-03-17 17:44:06 -0700210private:
211 const bool fConvertToG8;
212 typedef FilterBitmapGM INHERITED;
humper@google.com04db3162013-05-31 12:50:39 +0000213};
214
reed@google.comf2de1e22013-05-28 15:29:25 +0000215//////////////////////////////////////////////////////////////////////////////
216
humper@google.com04db3162013-05-31 12:50:39 +0000217DEF_GM( return new FilterBitmapTextGM(3); )
218DEF_GM( return new FilterBitmapTextGM(7); )
219DEF_GM( return new FilterBitmapTextGM(10); )
220DEF_GM( return new FilterBitmapCheckerboardGM(4,4); )
221DEF_GM( return new FilterBitmapCheckerboardGM(32,32); )
reed0c9b1a82015-03-17 17:44:06 -0700222DEF_GM( return new FilterBitmapCheckerboardGM(32,32, true); )
humper@google.com04db3162013-05-31 12:50:39 +0000223DEF_GM( return new FilterBitmapCheckerboardGM(32,8); )
224DEF_GM( return new FilterBitmapCheckerboardGM(32,2); )
225DEF_GM( return new FilterBitmapCheckerboardGM(192,192); )
226DEF_GM( return new FilterBitmapImageGM("mandrill_16.png"); )
227DEF_GM( return new FilterBitmapImageGM("mandrill_32.png"); )
228DEF_GM( return new FilterBitmapImageGM("mandrill_64.png"); )
reed0c9b1a82015-03-17 17:44:06 -0700229DEF_GM( return new FilterBitmapImageGM("mandrill_64.png", true); )
humper@google.com04db3162013-05-31 12:50:39 +0000230DEF_GM( return new FilterBitmapImageGM("mandrill_128.png"); )
231DEF_GM( return new FilterBitmapImageGM("mandrill_256.png"); )
232DEF_GM( return new FilterBitmapImageGM("mandrill_512.png"); )
halcanarydffa3972014-10-27 10:32:18 -0700233DEF_GM( return new FilterBitmapImageGM("color_wheel.png"); )