1 /* 2 * Copyright 2012 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 8 #include "gm.h" 9 #include "SkCanvas.h" 10 #include "SkPaint.h" 11 #include "SkGradientShader.h" 12 13 static void intToScalars(SkScalar dst[], const int src[], int n) { 14 for (int i = 0; i < n; ++i) { 15 dst[i] = SkIntToScalar(src[i]); 16 } 17 } 18 19 static void drawGrad(SkCanvas* canvas, const SkScalar d0[], const SkScalar d1[]) { 20 const SkRect bounds = SkRect::MakeXYWH(SkIntToScalar(-50), 21 SkIntToScalar(-50), 22 SkIntToScalar(200), 23 SkIntToScalar(100)); 24 25 SkPoint c0 = { d0[0], d0[1] }; 26 SkScalar r0 = d0[2]; 27 SkPoint c1 = { d1[0], d1[1] }; 28 SkScalar r1 = d1[2]; 29 30 SkColor colors[] = { SK_ColorGREEN, SK_ColorRED }; 31 SkPaint paint; 32 paint.setAntiAlias(true); 33 sk_tool_utils::set_portable_typeface(&paint); 34 35 SkString str; 36 str.printf("%g,%g,%g %g,%g,%g", 37 SkScalarToFloat(c0.fX), SkScalarToFloat(c0.fY), SkScalarToFloat(r0), 38 SkScalarToFloat(c1.fX), SkScalarToFloat(c1.fY), SkScalarToFloat(r1)); 39 canvas->drawText(str.c_str(), str.size(), 40 bounds.fLeft, bounds.fTop - paint.getTextSize()/2, paint); 41 42 paint.setShader(SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, 43 colors, NULL, 2, 44 SkShader::kClamp_TileMode))->unref(); 45 canvas->drawRect(bounds, paint); 46 47 paint.setShader(NULL); 48 paint.setColor(0x66000000); 49 paint.setStyle(SkPaint::kStroke_Style); 50 canvas->drawCircle(c0.fX, c0.fY, r0, paint); 51 canvas->drawCircle(c1.fX, c1.fY, r1, paint); 52 canvas->drawRect(bounds, paint); 53 } 54 55 class TwoPointRadialGM : public skiagm::GM { 56 public: 57 TwoPointRadialGM() {} 58 59 protected: 60 SkString onShortName() { 61 return SkString("twopointconical"); 62 } 63 64 SkISize onISize() { return SkISize::Make(480, 780); } 65 66 virtual void onDraw(SkCanvas* canvas) { 67 if (false) { 68 SkPaint paint; 69 paint.setColor(SK_ColorBLUE); 70 canvas->drawRect( 71 SkRect::MakeWH(SkIntToScalar(this->getISize().fWidth), 72 SkIntToScalar(this->getISize().fHeight)), 73 paint); 74 } 75 SkPaint paint; 76 const int R0 = 20; 77 const int R1 = 40; 78 79 const SkScalar DX = SkIntToScalar(250); 80 const SkScalar DY = SkIntToScalar(130); 81 82 canvas->translate(SkIntToScalar(60), SkIntToScalar(70)); 83 84 static const int gData[] = { 85 0, 0, R0, 0, 0, R1, 86 0, 0, R0, 20, 0, R1, 87 0, 0, R0, 25, 0, R1, 88 0, 0, R0, 100, 0, R1, 89 0, 0, R0, 25, 0, R0, 90 0, 0, R0, 100, 0, R0, 91 }; 92 93 int count = SK_ARRAY_COUNT(gData) / 6; 94 for (int i = 0; i < count; ++i) { 95 SkScalar data[6]; 96 intToScalars(data, &gData[i * 6], 6); 97 98 int n = canvas->save(); 99 drawGrad(canvas, &data[0], &data[3]); 100 canvas->translate(DX, 0); 101 drawGrad(canvas, &data[3], &data[0]); 102 canvas->restoreToCount(n); 103 canvas->translate(0, DY); 104 } 105 } 106 }; 107 108 ////////////////////////////////////////////////////////////////////////////// 109 110 static skiagm::GM* F(void*) { return new TwoPointRadialGM; } 111 112 static skiagm::GMRegistry gR(F); 113