blob: 313fd9336bed69185df9112a904455db58f7bca8 [file] [log] [blame]
bsalomon8cf1d952015-04-16 06:54:28 -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#include "gm.h"
Mike Klein33d20552017-03-22 13:47:51 -04009#include "sk_tool_utils.h"
bsalomon8cf1d952015-04-16 06:54:28 -070010
11#include "SkShader.h"
12
13// Inspired by svg/as-border-image/svg-as-border-image.html. Draws a four-color checker board bitmap
14// such that it is stretched and repeat tiled with different filter qualities. It is testing whether
15// the bmp filter respects the repeat mode at the tile seams.
16class BmpFilterQualityRepeat : public skiagm::GM {
17public:
caryclark65cdba62015-06-15 06:51:08 -070018 BmpFilterQualityRepeat() { this->setBGColor(sk_tool_utils::color_to_565(0xFFCCBBAA)); }
bsalomon8cf1d952015-04-16 06:54:28 -070019
20protected:
21
22 void onOnceBeforeDraw() override {
23 fBmp.allocN32Pixels(40, 40, true);
24 SkCanvas canvas(fBmp);
25 SkBitmap colorBmp;
26 colorBmp.allocN32Pixels(20, 20, true);
27 colorBmp.eraseColor(0xFFFF0000);
28 canvas.drawBitmap(colorBmp, 0, 0);
caryclark12596012015-07-29 05:27:47 -070029 colorBmp.eraseColor(sk_tool_utils::color_to_565(0xFF008200));
bsalomon8cf1d952015-04-16 06:54:28 -070030 canvas.drawBitmap(colorBmp, 20, 0);
caryclark12596012015-07-29 05:27:47 -070031 colorBmp.eraseColor(sk_tool_utils::color_to_565(0xFFFF9000));
bsalomon8cf1d952015-04-16 06:54:28 -070032 canvas.drawBitmap(colorBmp, 0, 20);
caryclark12596012015-07-29 05:27:47 -070033 colorBmp.eraseColor(sk_tool_utils::color_to_565(0xFF2000FF));
bsalomon8cf1d952015-04-16 06:54:28 -070034 canvas.drawBitmap(colorBmp, 20, 20);
35 }
36
37 SkString onShortName() override { return SkString("bmp_filter_quality_repeat"); }
38
fmalitab1c7f882016-11-03 11:42:49 -070039 SkISize onISize() override { return SkISize::Make(1000, 400); }
bsalomon8cf1d952015-04-16 06:54:28 -070040
41 void onDraw(SkCanvas* canvas) override {
fmalitab1c7f882016-11-03 11:42:49 -070042 this->drawAll(canvas, 2.5f);
43 canvas->translate(0, 250);
44 canvas->scale(0.5, 0.5);
45 this->drawAll(canvas, 1);
46 }
bsalomon8cf1d952015-04-16 06:54:28 -070047
fmalitab1c7f882016-11-03 11:42:49 -070048private:
49 void drawAll(SkCanvas* canvas, SkScalar scaleX) const {
mtkleindbfd7ab2016-09-01 11:24:54 -070050 constexpr struct {
bsalomon8cf1d952015-04-16 06:54:28 -070051 SkFilterQuality fQuality;
52 const char* fName;
53 } kQualities[] = {
54 {kNone_SkFilterQuality, "none"},
55 {kLow_SkFilterQuality, "low"},
56 {kMedium_SkFilterQuality, "medium"},
57 {kHigh_SkFilterQuality, "high"},
58 };
59
fmalitab1c7f882016-11-03 11:42:49 -070060 SkRect rect = SkRect::MakeLTRB(20, 60, 220, 210);
61 SkMatrix lm = SkMatrix::I();
62 lm.setScaleX(scaleX);
63 lm.setTranslateX(423);
64 lm.setTranslateY(330);
bsalomon8cf1d952015-04-16 06:54:28 -070065
fmalitab1c7f882016-11-03 11:42:49 -070066 SkPaint textPaint;
67 sk_tool_utils::set_portable_typeface(&textPaint);
68 textPaint.setAntiAlias(true);
69
70 SkPaint bmpPaint(textPaint);
71
72 SkAutoCanvasRestore acr(canvas, true);
73
74 for (size_t q = 0; q < SK_ARRAY_COUNT(kQualities); ++q) {
mtkleindbfd7ab2016-09-01 11:24:54 -070075 constexpr SkShader::TileMode kTM = SkShader::kRepeat_TileMode;
reed2ad1aa62016-03-09 09:50:50 -080076 bmpPaint.setShader(SkShader::MakeBitmapShader(fBmp, kTM, kTM, &lm));
fmalitab1c7f882016-11-03 11:42:49 -070077 bmpPaint.setFilterQuality(kQualities[q].fQuality);
bsalomon8cf1d952015-04-16 06:54:28 -070078 canvas->drawRect(rect, bmpPaint);
Cary Clark2a475ea2017-04-28 15:35:12 -040079 canvas->drawString(kQualities[q].fName, 20, 40, textPaint);
bsalomon8cf1d952015-04-16 06:54:28 -070080 canvas->translate(250, 0);
81 }
fmalitab1c7f882016-11-03 11:42:49 -070082
bsalomon8cf1d952015-04-16 06:54:28 -070083 }
84
bsalomon8cf1d952015-04-16 06:54:28 -070085 SkBitmap fBmp;
86
87 typedef skiagm::GM INHERITED;
88};
89
90//////////////////////////////////////////////////////////////////////////////
91
halcanary385fe4d2015-08-26 13:07:48 -070092DEF_GM(return new BmpFilterQualityRepeat;)