1 /*
2 * Copyright 2021 Google LLC
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/gm.h"
9 #include "include/core/SkCanvas.h"
10 #include "include/core/SkImage.h"
11 #include "include/core/SkPaint.h"
12 #include "include/effects/SkGradientShader.h"
13 #include "tools/Resources.h"
14
15 namespace {
16
create_gradient_shader(SkRect r)17 sk_sp<SkShader> create_gradient_shader(SkRect r) {
18 // TODO: it seems like only the x-component of sk_FragCoord is making it to the shader!
19 SkPoint pts[2] = { {r.fLeft, r.fTop}, {r.fRight, r.fTop} };
20 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
21 float offsets[] = { 0.0f, 0.75f, 1.0f };
22
23 return SkGradientShader::MakeLinear(pts, colors, offsets, SK_ARRAY_COUNT(colors),
24 SkTileMode::kClamp);
25 }
26
create_image_shader()27 sk_sp<SkShader> create_image_shader() {
28 SkImageInfo ii = SkImageInfo::Make(100, 100, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
29 SkBitmap bitmap;
30
31 bitmap.allocPixels(ii);
32 bitmap.eraseColor(SK_ColorWHITE);
33
34 SkCanvas canvas(bitmap);
35
36 SkPaint redPaint;
37 redPaint.setColor(SK_ColorRED);
38 canvas.drawCircle(50, 50, 50, redPaint);
39
40 bitmap.setAlphaType(kOpaque_SkAlphaType);
41 bitmap.setImmutable();
42
43 sk_sp<SkImage> img = SkImage::MakeFromBitmap(bitmap);
44 // TODO: we'll need a 'makeTextureImage' call here
45
46 return img->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, SkSamplingOptions());
47 }
48
create_blend_shader(SkBlendMode bm)49 sk_sp<SkShader> create_blend_shader(SkBlendMode bm) {
50 constexpr SkColor4f kTransYellow = {1.0f, 1.0f, 0.0f, 0.5f};
51
52 sk_sp<SkShader> solid = SkShaders::Color(kTransYellow, nullptr);
53 return SkShaders::Blend(bm, std::move(solid), create_image_shader());
54 }
55
56 } // anonymous namespace
57
58 namespace skiagm {
59
60 // This is just for bootstrapping Graphite.
61 class GraphiteStartGM : public GM {
62 public:
GraphiteStartGM()63 GraphiteStartGM() {
64 this->setBGColor(0xFFCCCCCC);
65 GetResourceAsBitmap("images/color_wheel.gif", &fBitmap);
66 }
67
68 protected:
onShortName()69 SkString onShortName() override {
70 return SkString("graphitestart");
71 }
72
onISize()73 SkISize onISize() override {
74 return SkISize::Make(256, 384);
75 }
76
onDraw(SkCanvas * canvas)77 void onDraw(SkCanvas* canvas) override {
78
79 // UL corner
80 {
81 SkPaint p;
82 p.setColor(SK_ColorRED);
83 canvas->drawRect({2, 2, 127, 127}, p);
84 }
85
86 // UR corner
87 {
88 SkRect r{129, 2, 255, 127};
89 SkPaint p;
90 p.setShader(create_gradient_shader(r));
91 canvas->drawRect(r, p);
92 }
93
94 // LL corner
95 {
96 SkPaint p;
97 p.setShader(create_image_shader());
98 canvas->drawRect({2, 129, 127, 255}, p);
99 }
100
101 // LR corner
102 {
103 SkPaint p;
104 p.setShader(create_blend_shader(SkBlendMode::kDstOver));
105 canvas->drawRect({129, 129, 255, 255}, p);
106 }
107 #ifdef SK_GRAPHITE_ENABLED
108 // TODO: failing serialize test on Linux, not sure what's going on
109 canvas->writePixels(fBitmap, 0, 256);
110 #endif
111 }
112
113 SkBitmap fBitmap;
114 };
115
116 //////////////////////////////////////////////////////////////////////////////
117
118 DEF_GM(return new GraphiteStartGM;)
119
120 } // namespace skiagm
121