180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "gm.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h" 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkGradientShader.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void intToScalars(SkScalar dst[], const int src[], int n) { 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < n; ++i) { 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru dst[i] = SkIntToScalar(src[i]); 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void drawGrad(SkCanvas* canvas, const SkScalar d0[], const SkScalar d1[]) { 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkRect bounds = SkRect::MakeXYWH(SkIntToScalar(-50), 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIntToScalar(-50), 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIntToScalar(200), 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIntToScalar(100)); 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint c0 = { d0[0], d0[1] }; 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar r0 = d0[2]; 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint c1 = { d1[0], d1[1] }; 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar r1 = d1[2]; 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkColor colors[] = { SK_ColorGREEN, SK_ColorRED }; 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setAntiAlias(true); 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString str; 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru str.printf("%g,%g,%g %g,%g,%g", 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalarToFloat(c0.fX), SkScalarToFloat(c0.fY), SkScalarToFloat(r0), 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalarToFloat(c1.fX), SkScalarToFloat(c1.fY), SkScalarToFloat(r1)); 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawText(str.c_str(), str.size(), 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bounds.fLeft, bounds.fTop - paint.getTextSize()/2, paint); 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setShader(SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru colors, NULL, 2, 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkShader::kClamp_TileMode))->unref(); 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawRect(bounds, paint); 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setShader(NULL); 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setColor(0x66000000); 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setStyle(SkPaint::kStroke_Style); 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawCircle(c0.fX, c0.fY, r0, paint); 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawCircle(c1.fX, c1.fY, r1, paint); 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawRect(bounds, paint); 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass TwoPointRadialGM : public skiagm::GM { 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru TwoPointRadialGM() {} 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString onShortName() { 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkString("twopointconical"); 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkISize onISize() { return skiagm::make_isize(480, 780); } 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void onDraw(SkCanvas* canvas) { 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (false) { 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setColor(SK_ColorBLUE); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawRect( 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect::MakeWH(SkIntToScalar(this->getISize().fWidth), 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkIntToScalar(this->getISize().fHeight)), 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const int R0 = 20; 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const int R1 = 40; 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar DX = SkIntToScalar(250); 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar DY = SkIntToScalar(130); 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(SkIntToScalar(60), SkIntToScalar(70)); 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static const int gData[] = { 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 0, 0, R0, 0, 0, R1, 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 0, 0, R0, 20, 0, R1, 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 0, 0, R0, 25, 0, R1, 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 0, 0, R0, 100, 0, R1, 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 0, 0, R0, 25, 0, R0, 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 0, 0, R0, 100, 0, R0, 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int count = SK_ARRAY_COUNT(gData) / 6; 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < count; ++i) { 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar data[6]; 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru intToScalars(data, &gData[i * 6], 6); 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int n = canvas->save(); 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru drawGrad(canvas, &data[0], &data[3]); 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(DX, 0); 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru drawGrad(canvas, &data[3], &data[0]); 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->restoreToCount(n); 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->translate(0, DY); 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru////////////////////////////////////////////////////////////////////////////// 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GM* F(void*) { return new TwoPointRadialGM; } 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic skiagm::GMRegistry gR(F); 112