1 /*
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
8 #include "Resources.h"
9 #include "gm.h"
10 #include "sk_tool_utils.h"
11
12 static const char* kFilterQualityNames[] = { "none", "low", "medium", "high" };
13
14 struct DownsampleBitmapGM : public skiagm::GM {
15 SkBitmap (*fMakeBitmap)(SkImageInfo);
16 SkString fName;
17 SkFilterQuality fFilterQuality;
18
DownsampleBitmapGMDownsampleBitmapGM19 DownsampleBitmapGM(SkBitmap (*fn)(SkImageInfo), const char* kind, SkFilterQuality fq)
20 : fMakeBitmap(fn)
21 , fName(SkStringPrintf("downsamplebitmap_%s_%s", kind, kFilterQualityNames[fq]))
22 , fFilterQuality(fq)
23 {
24 this->setBGColor(0xFFDDDDDD);
25 }
26
onShortNameDownsampleBitmapGM27 SkString onShortName() override { return fName; }
28
onISizeDownsampleBitmapGM29 SkISize onISize() override {
30 SkBitmap bm = fMakeBitmap(SkImageInfo::MakeN32Premul(1,1)/*whatever*/);
31 return SkISize::Make(bm.width(), 4 * bm.height());
32 }
33
onDrawDownsampleBitmapGM34 void onDraw(SkCanvas* canvas) override {
35 SkImageInfo info = canvas->imageInfo();
36 if (!info.colorType()) { info = info.makeColorType( kN32_SkColorType); }
37 if (!info.alphaType()) { info = info.makeAlphaType(kPremul_SkAlphaType); }
38
39 SkBitmap bm = fMakeBitmap(info);
40
41 int curY = 0;
42 int curHeight;
43 float curScale = 1;
44 do {
45
46 SkMatrix matrix;
47 matrix.setScale( curScale, curScale );
48
49 SkPaint paint;
50 paint.setFilterQuality(fFilterQuality);
51
52 canvas->save();
53 canvas->translate(0, (SkScalar)curY);
54 canvas->concat(matrix);
55 canvas->drawBitmap(bm, 0, 0, &paint);
56 canvas->restore();
57
58 curHeight = (int) (bm.height() * curScale + 2);
59 curY += curHeight;
60 curScale *= 0.75f;
61 } while (curHeight >= 2 && curY < 4*bm.height());
62 }
63 };
64
convert_bitmap_format(SkBitmap src,SkImageInfo info)65 static SkBitmap convert_bitmap_format(SkBitmap src, SkImageInfo info) {
66 SkBitmap dst;
67 dst.allocPixels(info.makeWH(src.width(), src.height()));
68
69 SkPixmap pm;
70 SkAssertResult(dst.peekPixels(&pm));
71 SkAssertResult(src.readPixels(pm));
72
73 return dst;
74 }
75
76
make_text(SkImageInfo info)77 static SkBitmap make_text(SkImageInfo info) {
78 const SkScalar textSize = 72;
79
80 SkBitmap bm;
81 bm.allocPixels(info.makeWH(int(textSize * 8), int(textSize * 6)));
82 SkCanvas canvas(bm);
83 canvas.drawColor(SK_ColorWHITE);
84
85 SkPaint paint;
86 SkFont font;
87 font.setSubpixel(true);
88 font.setSize(textSize);
89
90 font.setTypeface(sk_tool_utils::create_portable_typeface("serif", SkFontStyle()));
91 canvas.drawString("Hamburgefons", textSize/2, 1.2f*textSize, font, paint);
92 font.setTypeface(sk_tool_utils::create_portable_typeface("serif", SkFontStyle::Bold()));
93 canvas.drawString("Hamburgefons", textSize/2, 2.4f*textSize, font, paint);
94 font.setTypeface(sk_tool_utils::create_portable_typeface("serif", SkFontStyle::Italic()));
95 canvas.drawString("Hamburgefons", textSize/2, 3.6f*textSize, font, paint);
96 font.setTypeface(sk_tool_utils::create_portable_typeface("serif", SkFontStyle::BoldItalic()));
97 canvas.drawString("Hamburgefons", textSize/2, 4.8f*textSize, font, paint);
98
99 return bm;
100 }
101 DEF_GM( return new DownsampleBitmapGM(make_text, "text", kHigh_SkFilterQuality); )
102 DEF_GM( return new DownsampleBitmapGM(make_text, "text", kMedium_SkFilterQuality); )
103 DEF_GM( return new DownsampleBitmapGM(make_text, "text", kLow_SkFilterQuality); )
104 DEF_GM( return new DownsampleBitmapGM(make_text, "text", kNone_SkFilterQuality); )
105
106
make_checkerboard(SkImageInfo info)107 static SkBitmap make_checkerboard(SkImageInfo info) {
108 const auto size = 512;
109 const auto numChecks = 256;
110
111 SkBitmap bm;
112 bm.allocN32Pixels(size,size);
113 for (int y = 0; y < size; ++y) {
114 for (int x = 0; x < size; ++x) {
115 SkPMColor* s = bm.getAddr32(x, y);
116 int cx = (x * numChecks) / size;
117 int cy = (y * numChecks) / size;
118 if ((cx+cy)%2) {
119 *s = 0xFFFFFFFF;
120 } else {
121 *s = 0xFF000000;
122 }
123 }
124 }
125 return convert_bitmap_format(bm, info);
126 }
127 DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kHigh_SkFilterQuality); )
128 DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kMedium_SkFilterQuality); )
129 DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kLow_SkFilterQuality); )
130 DEF_GM( return new DownsampleBitmapGM(make_checkerboard, "checkerboard", kNone_SkFilterQuality); )
131
132
make_image(SkImageInfo info)133 static SkBitmap make_image(SkImageInfo info) {
134 SkBitmap bm;
135 if (!GetResourceAsBitmap("images/mandrill_512.png", &bm)) {
136 bm.allocN32Pixels(1, 1);
137 bm.eraseARGB(255, 255, 0 , 0); // red == bad
138 }
139 return convert_bitmap_format(bm, info);
140 }
141 DEF_GM( return new DownsampleBitmapGM(make_image, "image", kHigh_SkFilterQuality); )
142 DEF_GM( return new DownsampleBitmapGM(make_image, "image", kMedium_SkFilterQuality); )
143 DEF_GM( return new DownsampleBitmapGM(make_image, "image", kLow_SkFilterQuality); )
144 DEF_GM( return new DownsampleBitmapGM(make_image, "image", kNone_SkFilterQuality); )
145