blob: ce226f2c596e1befa219ca936e79015ff8d83efb [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"
8
9#include "SkBitmap.h"
10#include "SkPaint.h"
11#include "SkShader.h"
Brian Salomonc7fe0f72018-05-11 10:14:21 -040012
Brian Salomonc7fe0f72018-05-11 10:14:21 -040013#include "GrCaps.h"
Yuqian Lif3c1f092017-11-29 16:07:22 -050014#include "GrContext.h"
Brian Salomonc7fe0f72018-05-11 10:14:21 -040015#include "GrContextPriv.h"
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000016
17namespace skiagm {
18
19static void draw_bm(SkBitmap* bm) {
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000020 SkPaint bluePaint;
21 bluePaint.setColor(SK_ColorBLUE);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000022
reed@google.comeb9a46c2014-01-25 16:46:20 +000023 bm->allocN32Pixels(20, 20);
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000024 bm->eraseColor(SK_ColorRED);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000025
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000026 SkCanvas canvas(*bm);
27 canvas.drawCircle(10, 10, 5, bluePaint);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000028}
29
30static void draw_mask(SkBitmap* bm) {
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000031 SkPaint circlePaint;
32 circlePaint.setColor(SK_ColorBLACK);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000033
commit-bot@chromium.orgdac52252014-02-17 21:21:46 +000034 bm->allocPixels(SkImageInfo::MakeA8(20, 20));
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000035 bm->eraseColor(SK_ColorTRANSPARENT);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000036
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000037 SkCanvas canvas(*bm);
38 canvas.drawCircle(10, 10, 10, circlePaint);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000039}
40
41class BitmapShaderGM : public GM {
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000042
caryclark63c684a2015-02-25 09:04:04 -080043protected:
mtklein36352bf2015-03-25 18:17:31 -070044 void onOnceBeforeDraw() override {
Mike Kleind46dce32018-08-16 10:17:03 -040045 this->setBGColor(SK_ColorGRAY);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000046 draw_bm(&fBitmap);
47 draw_mask(&fMask);
48 }
49
mtkleinf0599002015-07-13 06:18:39 -070050 SkString onShortName() override {
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000051 return SkString("bitmapshaders");
52 }
53
mtkleinf0599002015-07-13 06:18:39 -070054 SkISize onISize() override {
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000055 return SkISize::Make(150, 100);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000056 }
57
mtkleinf0599002015-07-13 06:18:39 -070058 void onDraw(SkCanvas* canvas) override {
skia.committer@gmail.com56710d12013-12-07 07:02:21 +000059 SkPaint paint;
commit-bot@chromium.orge5957f62014-03-18 16:28:12 +000060
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000061 for (int i = 0; i < 2; i++) {
62 SkMatrix s;
63 s.reset();
64 if (1 == i) {
commit-bot@chromium.orga723fee2014-03-24 14:54:04 +000065 s.setScale(1.5f, 1.5f);
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000066 s.postTranslate(2, 2);
67 }
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000068
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000069 canvas->save();
reed8a21c9f2016-03-08 18:50:00 -080070 paint.setShader(SkShader::MakeBitmapShader(fBitmap, SkShader::kClamp_TileMode,
71 SkShader::kClamp_TileMode, &s));
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000072
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000073 // draw the shader with a bitmap mask
74 canvas->drawBitmap(fMask, 0, 0, &paint);
Michael Ludwigb7d64b92019-02-11 11:09:15 -050075 // no blue circle expected (the bitmap shader's coordinates are aligned to CTM still)
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000076 canvas->drawBitmap(fMask, 30, 0, &paint);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000077
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000078 canvas->translate(0, 25);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000079
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000080 canvas->drawCircle(10, 10, 10, paint);
81 canvas->drawCircle(40, 10, 10, paint); // no blue circle expected
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000082
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000083 canvas->translate(0, 25);
commit-bot@chromium.org7842c812013-12-06 20:14:39 +000084
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000085 // clear the shader, colorized by a solid color with a bitmap mask
halcanary96fcdcc2015-08-27 07:41:13 -070086 paint.setShader(nullptr);
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000087 paint.setColor(SK_ColorGREEN);
88 canvas->drawBitmap(fMask, 0, 0, &paint);
89 canvas->drawBitmap(fMask, 30, 0, &paint);
90
91 canvas->translate(0, 25);
92
reed8a21c9f2016-03-08 18:50:00 -080093 paint.setShader(SkShader::MakeBitmapShader(fMask, SkShader::kRepeat_TileMode,
94 SkShader::kRepeat_TileMode, &s));
commit-bot@chromium.org08f6d862014-03-24 02:49:48 +000095 paint.setColor(SK_ColorRED);
96
97 // draw the mask using the shader and a color
98 canvas->drawRect(SkRect::MakeXYWH(0, 0, 20, 20), paint);
99 canvas->drawRect(SkRect::MakeXYWH(30, 0, 20, 20), paint);
100 canvas->restore();
101 canvas->translate(60, 0);
102 }
commit-bot@chromium.org7842c812013-12-06 20:14:39 +0000103 }
104
105private:
106 SkBitmap fBitmap;
107 SkBitmap fMask;
108
109 typedef GM INHERITED;
110};
111
Yuqian Lif3c1f092017-11-29 16:07:22 -0500112DEF_SIMPLE_GM(hugebitmapshader, canvas, 100, 100) {
113 SkPaint paint;
114 SkBitmap bitmap;
115
116 // The huge height will exceed GL_MAX_TEXTURE_SIZE. We test that the GL backend will at least
117 // draw something with a default paint instead of drawing nothing.
118 //
119 // (See https://skia-review.googlesource.com/c/skia/+/73200)
120 int bitmapW = 1;
121 int bitmapH = 60000;
122 if (auto* ctx = canvas->getGrContext()) {
Robert Phillips9da87e02019-02-04 13:26:26 -0500123 bitmapH = ctx->priv().caps()->maxTextureSize() + 1;
Yuqian Lif3c1f092017-11-29 16:07:22 -0500124 }
125 bitmap.setInfo(SkImageInfo::MakeA8(bitmapW, bitmapH), bitmapW);
126 uint8_t* pixels = new uint8_t[bitmapH];
127 for(int i = 0; i < bitmapH; ++i) {
128 pixels[i] = i & 0xff;
129 }
130 bitmap.setPixels(pixels);
131
132 paint.setShader(SkShader::MakeBitmapShader(bitmap,
133 SkShader::kMirror_TileMode, SkShader::kMirror_TileMode));
134 paint.setColor(SK_ColorRED);
135 paint.setAntiAlias(true);
136 canvas->drawCircle(50, 50, 50, paint);
137 delete [] pixels;
138}
139
commit-bot@chromium.org7842c812013-12-06 20:14:39 +0000140//////////////////////////////////////////////////////////////////////////////
141
Hal Canarye964c182019-01-23 10:22:01 -0500142DEF_GM( return new BitmapShaderGM; )
commit-bot@chromium.org7842c812013-12-06 20:14:39 +0000143
144}