xref: /aosp_15_r20/external/skia/docs/examples/picture_shader.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2020 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fiddle/examples.h"
4*c8dee2aaSAndroid Build Coastguard Worker REG_FIDDLE(picture_shader, 256, 256, false, 5) {
draw_centered(const char * s,const SkFont & font,SkColor color,SkPoint xy,SkCanvas * c)5*c8dee2aaSAndroid Build Coastguard Worker static void draw_centered(
6*c8dee2aaSAndroid Build Coastguard Worker         const char* s, const SkFont& font, SkColor color, SkPoint xy, SkCanvas* c) {
7*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkTextBlob> b = SkTextBlob::MakeFromString(s, font);
8*c8dee2aaSAndroid Build Coastguard Worker     xy -= SkPoint{b->bounds().centerX(), b->bounds().centerY()};
9*c8dee2aaSAndroid Build Coastguard Worker     SkPaint p;
10*c8dee2aaSAndroid Build Coastguard Worker     p.setColor(color);
11*c8dee2aaSAndroid Build Coastguard Worker     c->drawTextBlob(b.get(), xy.x(), xy.y(), p);
12*c8dee2aaSAndroid Build Coastguard Worker }
13*c8dee2aaSAndroid Build Coastguard Worker 
from_polar_deg(float r,float d)14*c8dee2aaSAndroid Build Coastguard Worker SkPoint from_polar_deg(float r, float d) {
15*c8dee2aaSAndroid Build Coastguard Worker     float a = d * 0.017453292519943295;
16*c8dee2aaSAndroid Build Coastguard Worker     return {r * cosf(a), r * sinf(a)};
17*c8dee2aaSAndroid Build Coastguard Worker }
18*c8dee2aaSAndroid Build Coastguard Worker 
draw_wheel(SkCanvas * c)19*c8dee2aaSAndroid Build Coastguard Worker void draw_wheel(SkCanvas* c) {
20*c8dee2aaSAndroid Build Coastguard Worker     const SkScalar scale = 512;
21*c8dee2aaSAndroid Build Coastguard Worker     SkAutoCanvasRestore autoCanvasRestore(c, true);
22*c8dee2aaSAndroid Build Coastguard Worker     c->translate(0.5f * scale, 0.5f * scale);
23*c8dee2aaSAndroid Build Coastguard Worker     SkPaint p;
24*c8dee2aaSAndroid Build Coastguard Worker     p.setAntiAlias(true);
25*c8dee2aaSAndroid Build Coastguard Worker     p.setColor(SK_ColorWHITE);
26*c8dee2aaSAndroid Build Coastguard Worker     c->drawCircle(0.0f, 0.0f, scale * 0.475f, p);
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker     const SkColor sweep_colors[] = {SK_ColorRED,  SK_ColorYELLOW,  SK_ColorGREEN, SK_ColorCYAN,
29*c8dee2aaSAndroid Build Coastguard Worker                                     SK_ColorBLUE, SK_ColorMAGENTA, SK_ColorRED};
30*c8dee2aaSAndroid Build Coastguard Worker     SkMatrix rot;
31*c8dee2aaSAndroid Build Coastguard Worker     rot.setRotate(90.0f);
32*c8dee2aaSAndroid Build Coastguard Worker     p.setShader(SkGradientShader::MakeSweep(0, 0, sweep_colors, nullptr,
33*c8dee2aaSAndroid Build Coastguard Worker                                             std::size(sweep_colors), 0, &rot));
34*c8dee2aaSAndroid Build Coastguard Worker     p.setStrokeWidth(0.05f * scale);
35*c8dee2aaSAndroid Build Coastguard Worker     p.setStyle(SkPaint::kStroke_Style);
36*c8dee2aaSAndroid Build Coastguard Worker     c->drawCircle(0.0f, 0.0f, 0.475f * scale, p);
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     SkFont f(nullptr, 0.28125f * scale);
39*c8dee2aaSAndroid Build Coastguard Worker     draw_centered("K", f, SK_ColorBLACK, {0.0f, 0.0f}, c);
40*c8dee2aaSAndroid Build Coastguard Worker     draw_centered("R", f, SK_ColorRED, from_polar_deg(0.3f * scale, 90), c);
41*c8dee2aaSAndroid Build Coastguard Worker     draw_centered("G", f, SK_ColorGREEN, from_polar_deg(0.3f * scale, 210), c);
42*c8dee2aaSAndroid Build Coastguard Worker     draw_centered("B", f, SK_ColorBLUE, from_polar_deg(0.3f * scale, 330), c);
43*c8dee2aaSAndroid Build Coastguard Worker     draw_centered("C", f, SK_ColorCYAN, from_polar_deg(0.3f * scale, 270), c);
44*c8dee2aaSAndroid Build Coastguard Worker     draw_centered("M", f, SK_ColorMAGENTA, from_polar_deg(0.3f * scale, 30), c);
45*c8dee2aaSAndroid Build Coastguard Worker     draw_centered("Y", f, SK_ColorYELLOW, from_polar_deg(0.3f * scale, 150), c);
46*c8dee2aaSAndroid Build Coastguard Worker }
47*c8dee2aaSAndroid Build Coastguard Worker 
draw(SkCanvas * canvas)48*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) {
49*c8dee2aaSAndroid Build Coastguard Worker     canvas->clear(SK_ColorWHITE);
50*c8dee2aaSAndroid Build Coastguard Worker     SkMatrix matrix;
51*c8dee2aaSAndroid Build Coastguard Worker     matrix.setScale(0.25f, 0.25f);
52*c8dee2aaSAndroid Build Coastguard Worker     matrix.preRotate(30.0f);
53*c8dee2aaSAndroid Build Coastguard Worker     SkPaint paint;
54*c8dee2aaSAndroid Build Coastguard Worker     SkPictureRecorder rec;
55*c8dee2aaSAndroid Build Coastguard Worker     draw_wheel(rec.beginRecording(512, 512));
56*c8dee2aaSAndroid Build Coastguard Worker     paint.setShader(rec.finishRecordingAsPicture()->makeShader(
57*c8dee2aaSAndroid Build Coastguard Worker             SkTileMode::kRepeat, SkTileMode::kRepeat, SkFilterMode::kNearest, &matrix, nullptr));
58*c8dee2aaSAndroid Build Coastguard Worker     canvas->drawPaint(paint);
59*c8dee2aaSAndroid Build Coastguard Worker }
60*c8dee2aaSAndroid Build Coastguard Worker }  // END FIDDLE
61