blob: ef5963f464f11504689f78d0d8a952f20d8b56e6 [file] [log] [blame]
humper@google.com9c96d4b2013-07-14 01:44:59 +00001/*
2 * Copyright 2013 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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -04009#include "include/core/SkBitmap.h"
10#include "include/core/SkCanvas.h"
11#include "include/core/SkColor.h"
12#include "include/core/SkFilterQuality.h"
13#include "include/core/SkFont.h"
14#include "include/core/SkFontStyle.h"
15#include "include/core/SkImageInfo.h"
16#include "include/core/SkMatrix.h"
17#include "include/core/SkPaint.h"
18#include "include/core/SkPixmap.h"
19#include "include/core/SkScalar.h"
20#include "include/core/SkSize.h"
21#include "include/core/SkString.h"
22#include "include/core/SkTypeface.h"
23#include "include/core/SkTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050024#include "tools/Resources.h"
25#include "tools/ToolUtils.h"
humper@google.com9c96d4b2013-07-14 01:44:59 +000026
Mike Klein5ed1ea82018-09-25 17:06:12 -040027static const char* kFilterQualityNames[] = { "none", "low", "medium", "high" };
humper@google.com9c96d4b2013-07-14 01:44:59 +000028
Mike Klein5ed1ea82018-09-25 17:06:12 -040029struct DownsampleBitmapGM : public skiagm::GM {
30 SkBitmap (*fMakeBitmap)(SkImageInfo);
31 SkString fName;
reed93a12152015-03-16 10:08:34 -070032 SkFilterQuality fFilterQuality;
humper@google.com9c96d4b2013-07-14 01:44:59 +000033
Mike Klein5ed1ea82018-09-25 17:06:12 -040034 DownsampleBitmapGM(SkBitmap (*fn)(SkImageInfo), const char* kind, SkFilterQuality fq)
35 : fMakeBitmap(fn)
36 , fName(SkStringPrintf("downsamplebitmap_%s_%s", kind, kFilterQualityNames[fq]))
37 , fFilterQuality(fq)
humper@google.com9c96d4b2013-07-14 01:44:59 +000038 {
Mike Kleind46dce32018-08-16 10:17:03 -040039 this->setBGColor(0xFFDDDDDD);
humper@google.com9c96d4b2013-07-14 01:44:59 +000040 }
41
Mike Klein5ed1ea82018-09-25 17:06:12 -040042 SkString onShortName() override { return fName; }
humper@google.com9c96d4b2013-07-14 01:44:59 +000043
mtklein36352bf2015-03-25 18:17:31 -070044 SkISize onISize() override {
Mike Klein5ed1ea82018-09-25 17:06:12 -040045 SkBitmap bm = fMakeBitmap(SkImageInfo::MakeN32Premul(1,1)/*whatever*/);
46 return SkISize::Make(bm.width(), 4 * bm.height());
humper@google.com9c96d4b2013-07-14 01:44:59 +000047 }
48
mtklein36352bf2015-03-25 18:17:31 -070049 void onDraw(SkCanvas* canvas) override {
Mike Klein5ed1ea82018-09-25 17:06:12 -040050 SkImageInfo info = canvas->imageInfo();
51 if (!info.colorType()) { info = info.makeColorType( kN32_SkColorType); }
52 if (!info.alphaType()) { info = info.makeAlphaType(kPremul_SkAlphaType); }
53
54 SkBitmap bm = fMakeBitmap(info);
humper@google.com9c96d4b2013-07-14 01:44:59 +000055
mtklein6a2f5fe2014-09-03 13:40:52 -070056 int curY = 0;
57 int curHeight;
humper@google.com9c96d4b2013-07-14 01:44:59 +000058 float curScale = 1;
59 do {
60
61 SkMatrix matrix;
62 matrix.setScale( curScale, curScale );
63
64 SkPaint paint;
reed93a12152015-03-16 10:08:34 -070065 paint.setFilterQuality(fFilterQuality);
humper@google.com9c96d4b2013-07-14 01:44:59 +000066
67 canvas->save();
Mike Klein5ed1ea82018-09-25 17:06:12 -040068 canvas->translate(0, (SkScalar)curY);
69 canvas->concat(matrix);
70 canvas->drawBitmap(bm, 0, 0, &paint);
humper@google.com9c96d4b2013-07-14 01:44:59 +000071 canvas->restore();
72
Mike Klein5ed1ea82018-09-25 17:06:12 -040073 curHeight = (int) (bm.height() * curScale + 2);
mtklein6a2f5fe2014-09-03 13:40:52 -070074 curY += curHeight;
humper@google.com9c96d4b2013-07-14 01:44:59 +000075 curScale *= 0.75f;
Mike Klein5ed1ea82018-09-25 17:06:12 -040076 } while (curHeight >= 2 && curY < 4*bm.height());
humper@google.com9c96d4b2013-07-14 01:44:59 +000077 }
humper@google.com9c96d4b2013-07-14 01:44:59 +000078};
79
Mike Klein5ed1ea82018-09-25 17:06:12 -040080static SkBitmap convert_bitmap_format(SkBitmap src, SkImageInfo info) {
81 SkBitmap dst;
Brian Salomon9241a6d2019-10-03 13:26:54 -040082 dst.allocPixels(info.makeDimensions(src.dimensions()));
Mike Klein5ed1ea82018-09-25 17:06:12 -040083
84 SkPixmap pm;
85 SkAssertResult(dst.peekPixels(&pm));
86 SkAssertResult(src.readPixels(pm));
87
88 return dst;
89}
90
91
92static SkBitmap make_text(SkImageInfo info) {
93 const SkScalar textSize = 72;
94
95 SkBitmap bm;
96 bm.allocPixels(info.makeWH(int(textSize * 8), int(textSize * 6)));
97 SkCanvas canvas(bm);
98 canvas.drawColor(SK_ColorWHITE);
99
100 SkPaint paint;
Mike Reedc4745d62019-01-07 09:31:58 -0500101 SkFont font;
102 font.setSubpixel(true);
103 font.setSize(textSize);
Mike Klein5ed1ea82018-09-25 17:06:12 -0400104
Mike Kleinea3f0142019-03-20 11:12:10 -0500105 font.setTypeface(ToolUtils::create_portable_typeface("serif", SkFontStyle()));
Mike Reedc4745d62019-01-07 09:31:58 -0500106 canvas.drawString("Hamburgefons", textSize/2, 1.2f*textSize, font, paint);
Mike Kleinea3f0142019-03-20 11:12:10 -0500107 font.setTypeface(ToolUtils::create_portable_typeface("serif", SkFontStyle::Bold()));
Mike Reedc4745d62019-01-07 09:31:58 -0500108 canvas.drawString("Hamburgefons", textSize/2, 2.4f*textSize, font, paint);
Mike Kleinea3f0142019-03-20 11:12:10 -0500109 font.setTypeface(ToolUtils::create_portable_typeface("serif", SkFontStyle::Italic()));
Mike Reedc4745d62019-01-07 09:31:58 -0500110 canvas.drawString("Hamburgefons", textSize/2, 3.6f*textSize, font, paint);
Mike Kleinea3f0142019-03-20 11:12:10 -0500111 font.setTypeface(ToolUtils::create_portable_typeface("serif", SkFontStyle::BoldItalic()));
Mike Reedc4745d62019-01-07 09:31:58 -0500112 canvas.drawString("Hamburgefons", textSize/2, 4.8f*textSize, font, paint);
Mike Klein5ed1ea82018-09-25 17:06:12 -0400113
114 return bm;
115}
116DEF_GM( return new DownsampleBitmapGM(make_text, "text", kHigh_SkFilterQuality); )
117DEF_GM( return new DownsampleBitmapGM(make_text, "text", kMedium_SkFilterQuality); )
118DEF_GM( return new DownsampleBitmapGM(make_text, "text", kLow_SkFilterQuality); )
119DEF_GM( return new DownsampleBitmapGM(make_text, "text", kNone_SkFilterQuality); )
120
121
122static SkBitmap make_checkerboard(SkImageInfo info) {
123 const auto size = 512;
124 const auto numChecks = 256;
125
126 SkBitmap bm;
127 bm.allocN32Pixels(size,size);
128 for (int y = 0; y < size; ++y) {
129 for (int x = 0; x < size; ++x) {
130 SkPMColor* s = bm.getAddr32(x, y);
131 int cx = (x * numChecks) / size;
132 int cy = (y * numChecks) / size;
133 if ((cx+cy)%2) {
134 *s = 0xFFFFFFFF;
135 } else {
136 *s = 0xFF000000;
137 }
humper@google.com9c96d4b2013-07-14 01:44:59 +0000138 }
Mike Klein5ed1ea82018-09-25 17:06:12 -0400139 }
140 return convert_bitmap_format(bm, info);
141}
142DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kHigh_SkFilterQuality); )
143DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kMedium_SkFilterQuality); )
144DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kLow_SkFilterQuality); )
145DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kNone_SkFilterQuality); )
humper@google.com9c96d4b2013-07-14 01:44:59 +0000146
humper@google.com9c96d4b2013-07-14 01:44:59 +0000147
Mike Klein5ed1ea82018-09-25 17:06:12 -0400148static SkBitmap make_image(SkImageInfo info) {
149 SkBitmap bm;
150 if (!GetResourceAsBitmap("images/mandrill_512.png", &bm)) {
151 bm.allocN32Pixels(1, 1);
152 bm.eraseARGB(255, 255, 0 , 0); // red == bad
153 }
154 return convert_bitmap_format(bm, info);
155}
156DEF_GM( return new DownsampleBitmapGM(make_image, "image", kHigh_SkFilterQuality); )
157DEF_GM( return new DownsampleBitmapGM(make_image, "image", kMedium_SkFilterQuality); )
158DEF_GM( return new DownsampleBitmapGM(make_image, "image", kLow_SkFilterQuality); )
159DEF_GM( return new DownsampleBitmapGM(make_image, "image", kNone_SkFilterQuality); )