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 34 SkString str; 35 str.printf("%g,%g,%g %g,%g,%g", 36 SkScalarToFloat(c0.fX), SkScalarToFloat(c0.fY), SkScalarToFloat(r0), 37 SkScalarToFloat(c1.fX), SkScalarToFloat(c1.fY), SkScalarToFloat(r1)); 38 canvas->drawText(str.c_str(), str.size(), 39 bounds.fLeft, bounds.fTop - paint.getTextSize()/2, paint); 40 41 paint.setShader(SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, 42 colors, NULL, 2, 43 SkShader::kClamp_TileMode))->unref(); 44 canvas->drawRect(bounds, paint); 45 46 paint.setShader(NULL); 47 paint.setColor(0x66000000); 48 paint.setStyle(SkPaint::kStroke_Style); 49 canvas->drawCircle(c0.fX, c0.fY, r0, paint); 50 canvas->drawCircle(c1.fX, c1.fY, r1, paint); 51 canvas->drawRect(bounds, paint); 52 } 53 54 class TwoPointRadialGM : public skiagm::GM { 55 public: 56 TwoPointRadialGM() {} 57 58 protected: 59 virtual uint32_t onGetFlags() const SK_OVERRIDE { 60 return kSkipTiled_Flag; 61 } 62 63 SkString onShortName() { 64 return SkString("twopointconical"); 65 } 66 67 SkISize onISize() { return SkISize::Make(480, 780); } 68 69 virtual void onDraw(SkCanvas* canvas) { 70 if (false) { 71 SkPaint paint; 72 paint.setColor(SK_ColorBLUE); 73 canvas->drawRect( 74 SkRect::MakeWH(SkIntToScalar(this->getISize().fWidth), 75 SkIntToScalar(this->getISize().fHeight)), 76 paint); 77 } 78 SkPaint paint; 79 const int R0 = 20; 80 const int R1 = 40; 81 82 const SkScalar DX = SkIntToScalar(250); 83 const SkScalar DY = SkIntToScalar(130); 84 85 canvas->translate(SkIntToScalar(60), SkIntToScalar(70)); 86 87 static const int gData[] = { 88 0, 0, R0, 0, 0, R1, 89 0, 0, R0, 20, 0, R1, 90 0, 0, R0, 25, 0, R1, 91 0, 0, R0, 100, 0, R1, 92 0, 0, R0, 25, 0, R0, 93 0, 0, R0, 100, 0, R0, 94 }; 95 96 int count = SK_ARRAY_COUNT(gData) / 6; 97 for (int i = 0; i < count; ++i) { 98 SkScalar data[6]; 99 intToScalars(data, &gData[i * 6], 6); 100 101 int n = canvas->save(); 102 drawGrad(canvas, &data[0], &data[3]); 103 canvas->translate(DX, 0); 104 drawGrad(canvas, &data[3], &data[0]); 105 canvas->restoreToCount(n); 106 canvas->translate(0, DY); 107 } 108 } 109 }; 110 111 ////////////////////////////////////////////////////////////////////////////// 112 113 static skiagm::GM* F(void*) { return new TwoPointRadialGM; } 114 115 static skiagm::GMRegistry gR(F); 116