blob: 98205d2146270c755f92057ae3a111a7ab41550f [file] [log] [blame]
commit-bot@chromium.org7842c812013-12-06 20:14:39 +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#include "gm.h"
Mike Klein33d20552017-03-22 13:47:51 -04008#include "sk_tool_utils.h"
commit-bot@chromium.org7842c812013-12-06 20:14:39 +00009
10#include "SkBitmap.h"
11#include "SkPaint.h"
12#include "SkShader.h"
Yuqian Lif3c1f092017-11-29 16:07:22 -050013#include "GrContext.h"
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000014
15namespace skiagm {
16
17static void draw_bm(SkBitmap* bm) {
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000018 SkPaint bluePaint;
19 bluePaint.setColor(SK_ColorBLUE);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000020
reed@google.comeb9a46c2014-01-25 16:46:20 +000021 bm->allocN32Pixels(20, 20);
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000022 bm->eraseColor(SK_ColorRED);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000023
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000024 SkCanvas canvas(*bm);
25 canvas.drawCircle(10, 10, 5, bluePaint);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000026}
27
28static void draw_mask(SkBitmap* bm) {
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000029 SkPaint circlePaint;
30 circlePaint.setColor(SK_ColorBLACK);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000031
commit-bot@chromium.orgdac52252014-02-17 21:21:46 +000032 bm->allocPixels(SkImageInfo::MakeA8(20, 20));
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000033 bm->eraseColor(SK_ColorTRANSPARENT);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000034
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000035 SkCanvas canvas(*bm);
36 canvas.drawCircle(10, 10, 10, circlePaint);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000037}
38
39class BitmapShaderGM : public GM {
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000040
caryclark63c684a2015-02-25 09:04:04 -080041protected:
mtklein36352bf2015-03-25 18:17:31 -070042 void onOnceBeforeDraw() override {
caryclarkf597c422015-07-28 10:37:53 -070043 this->setBGColor(sk_tool_utils::color_to_565(SK_ColorGRAY));
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000044 draw_bm(&fBitmap);
45 draw_mask(&fMask);
46 }
47
mtkleinf0599002015-07-13 06:18:39 -070048 SkString onShortName() override {
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000049 return SkString("bitmapshaders");
50 }
51
mtkleinf0599002015-07-13 06:18:39 -070052 SkISize onISize() override {
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000053 return SkISize::Make(150, 100);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000054 }
55
mtkleinf0599002015-07-13 06:18:39 -070056 void onDraw(SkCanvas* canvas) override {
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000057 SkPaint paint;
commit-bot@chromium.orge5957f62014-03-18 16:28:12 +000058
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000059 for (int i = 0; i < 2; i++) {
60 SkMatrix s;
61 s.reset();
62 if (1 == i) {
commit-bot@chromium.orga723fee2014-03-24 14:54:04 +000063 s.setScale(1.5f, 1.5f);
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000064 s.postTranslate(2, 2);
65 }
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000066
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000067 canvas->save();
reed8a21c9f2016-03-08 18:50:00 -080068 paint.setShader(SkShader::MakeBitmapShader(fBitmap, SkShader::kClamp_TileMode,
69 SkShader::kClamp_TileMode, &s));
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000070
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000071 // draw the shader with a bitmap mask
72 canvas->drawBitmap(fMask, 0, 0, &paint);
73 canvas->drawBitmap(fMask, 30, 0, &paint);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000074
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000075 canvas->translate(0, 25);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000076
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000077 canvas->drawCircle(10, 10, 10, paint);
78 canvas->drawCircle(40, 10, 10, paint); // no blue circle expected
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000079
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000080 canvas->translate(0, 25);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000081
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000082 // clear the shader, colorized by a solid color with a bitmap mask
halcanary96fcdcc2015-08-27 07:41:13 -070083 paint.setShader(nullptr);
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000084 paint.setColor(SK_ColorGREEN);
85 canvas->drawBitmap(fMask, 0, 0, &paint);
86 canvas->drawBitmap(fMask, 30, 0, &paint);
87
88 canvas->translate(0, 25);
89
reed8a21c9f2016-03-08 18:50:00 -080090 paint.setShader(SkShader::MakeBitmapShader(fMask, SkShader::kRepeat_TileMode,
91 SkShader::kRepeat_TileMode, &s));
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000092 paint.setColor(SK_ColorRED);
93
94 // draw the mask using the shader and a color
95 canvas->drawRect(SkRect::MakeXYWH(0, 0, 20, 20), paint);
96 canvas->drawRect(SkRect::MakeXYWH(30, 0, 20, 20), paint);
97 canvas->restore();
98 canvas->translate(60, 0);
99 }
commit-bot@chromium.org7842c812013-12-06 20:14:39 +0000100 }
101
102private:
103 SkBitmap fBitmap;
104 SkBitmap fMask;
105
106 typedef GM INHERITED;
107};
108
Yuqian Lif3c1f092017-11-29 16:07:22 -0500109DEF_SIMPLE_GM(hugebitmapshader, canvas, 100, 100) {
110 SkPaint paint;
111 SkBitmap bitmap;
112
113 // The huge height will exceed GL_MAX_TEXTURE_SIZE. We test that the GL backend will at least
114 // draw something with a default paint instead of drawing nothing.
115 //
116 // (See https://skia-review.googlesource.com/c/skia/+/73200)
117 int bitmapW = 1;
118 int bitmapH = 60000;
119 if (auto* ctx = canvas->getGrContext()) {
120 bitmapH = ctx->caps()->maxTextureSize() + 1;
121 }
122 bitmap.setInfo(SkImageInfo::MakeA8(bitmapW, bitmapH), bitmapW);
123 uint8_t* pixels = new uint8_t[bitmapH];
124 for(int i = 0; i < bitmapH; ++i) {
125 pixels[i] = i & 0xff;
126 }
127 bitmap.setPixels(pixels);
128
129 paint.setShader(SkShader::MakeBitmapShader(bitmap,
130 SkShader::kMirror_TileMode, SkShader::kMirror_TileMode));
131 paint.setColor(SK_ColorRED);
132 paint.setAntiAlias(true);
133 canvas->drawCircle(50, 50, 50, paint);
134 delete [] pixels;
135}
136
commit-bot@chromium.org7842c812013-12-06 20:14:39 +0000137//////////////////////////////////////////////////////////////////////////////
138
139static GM* MyFactory(void*) { return new BitmapShaderGM; }
140static GMRegistry reg(MyFactory);
141
142}