• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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