|  | // Copyright 2020 Google LLC. | 
|  | // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. | 
|  | #include "tools/fiddle/examples.h" | 
|  | REG_FIDDLE(picture_shader, 256, 256, false, 5) { | 
|  | static void draw_centered( | 
|  | const char* s, const SkFont& font, SkColor color, SkPoint xy, SkCanvas* c) { | 
|  | sk_sp<SkTextBlob> b = SkTextBlob::MakeFromString(s, font); | 
|  | xy -= SkPoint{b->bounds().centerX(), b->bounds().centerY()}; | 
|  | SkPaint p; | 
|  | p.setColor(color); | 
|  | c->drawTextBlob(b.get(), xy.x(), xy.y(), p); | 
|  | } | 
|  |  | 
|  | SkPoint from_polar_deg(float r, float d) { | 
|  | float a = d * 0.017453292519943295; | 
|  | return {r * cosf(a), r * sinf(a)}; | 
|  | } | 
|  |  | 
|  | void draw_wheel(SkCanvas* c) { | 
|  | const SkScalar scale = 512; | 
|  | SkAutoCanvasRestore autoCanvasRestore(c, true); | 
|  | c->translate(0.5f * scale, 0.5f * scale); | 
|  | SkPaint p; | 
|  | p.setAntiAlias(true); | 
|  | p.setColor(SK_ColorWHITE); | 
|  | c->drawCircle(0.0f, 0.0f, scale * 0.475f, p); | 
|  |  | 
|  | const SkColor sweep_colors[] = {SK_ColorRED,  SK_ColorYELLOW,  SK_ColorGREEN, SK_ColorCYAN, | 
|  | SK_ColorBLUE, SK_ColorMAGENTA, SK_ColorRED}; | 
|  | SkMatrix rot; | 
|  | rot.setRotate(90.0f); | 
|  | p.setShader(SkGradientShader::MakeSweep(0, 0, sweep_colors, nullptr, | 
|  | std::size(sweep_colors), 0, &rot)); | 
|  | p.setStrokeWidth(0.05f * scale); | 
|  | p.setStyle(SkPaint::kStroke_Style); | 
|  | c->drawCircle(0.0f, 0.0f, 0.475f * scale, p); | 
|  |  | 
|  | SkFont f(nullptr, 0.28125f * scale); | 
|  | draw_centered("K", f, SK_ColorBLACK, {0.0f, 0.0f}, c); | 
|  | draw_centered("R", f, SK_ColorRED, from_polar_deg(0.3f * scale, 90), c); | 
|  | draw_centered("G", f, SK_ColorGREEN, from_polar_deg(0.3f * scale, 210), c); | 
|  | draw_centered("B", f, SK_ColorBLUE, from_polar_deg(0.3f * scale, 330), c); | 
|  | draw_centered("C", f, SK_ColorCYAN, from_polar_deg(0.3f * scale, 270), c); | 
|  | draw_centered("M", f, SK_ColorMAGENTA, from_polar_deg(0.3f * scale, 30), c); | 
|  | draw_centered("Y", f, SK_ColorYELLOW, from_polar_deg(0.3f * scale, 150), c); | 
|  | } | 
|  |  | 
|  | void draw(SkCanvas* canvas) { | 
|  | canvas->clear(SK_ColorWHITE); | 
|  | SkMatrix matrix; | 
|  | matrix.setScale(0.25f, 0.25f); | 
|  | matrix.preRotate(30.0f); | 
|  | SkPaint paint; | 
|  | SkPictureRecorder rec; | 
|  | draw_wheel(rec.beginRecording(512, 512)); | 
|  | paint.setShader(rec.finishRecordingAsPicture()->makeShader( | 
|  | SkTileMode::kRepeat, SkTileMode::kRepeat, SkFilterMode::kNearest, &matrix, nullptr)); | 
|  | canvas->drawPaint(paint); | 
|  | } | 
|  | }  // END FIDDLE |