14384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com/* 24384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com * Copyright 2012 Google Inc. 34384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com * 44384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com * Use of this source code is governed by a BSD-style license that can be 54384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com * found in the LICENSE file. 64384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com */ 74384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 84384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com#include "gm.h" 94384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com#include "SkCanvas.h" 104384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com#include "SkPaint.h" 114384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com#include "SkGradientShader.h" 124384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 134384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comstatic void intToScalars(SkScalar dst[], const int src[], int n) { 144384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com for (int i = 0; i < n; ++i) { 154384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com dst[i] = SkIntToScalar(src[i]); 164384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com } 174384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com} 184384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 194384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comstatic void drawGrad(SkCanvas* canvas, const SkScalar d0[], const SkScalar d1[]) { 20cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com const SkRect bounds = SkRect::MakeXYWH(SkIntToScalar(-50), 21cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com SkIntToScalar(-50), 22cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com SkIntToScalar(200), 23cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com SkIntToScalar(100)); 24cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com 254384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkPoint c0 = { d0[0], d0[1] }; 264384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkScalar r0 = d0[2]; 274384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkPoint c1 = { d1[0], d1[1] }; 284384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkScalar r1 = d1[2]; 294384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 304384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkColor colors[] = { SK_ColorGREEN, SK_ColorRED }; 314384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkPaint paint; 324384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com paint.setAntiAlias(true); 33ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 34cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com SkString str; 35cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com str.printf("%g,%g,%g %g,%g,%g", 36cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com SkScalarToFloat(c0.fX), SkScalarToFloat(c0.fY), SkScalarToFloat(r0), 37cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com SkScalarToFloat(c1.fX), SkScalarToFloat(c1.fY), SkScalarToFloat(r1)); 38cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com canvas->drawText(str.c_str(), str.size(), 39cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com bounds.fLeft, bounds.fTop - paint.getTextSize()/2, paint); 40ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 41cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com paint.setShader(SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1, 42cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com colors, NULL, 2, 43cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com SkShader::kClamp_TileMode))->unref(); 44cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com canvas->drawRect(bounds, paint); 45ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 464384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com paint.setShader(NULL); 47cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com paint.setColor(0x66000000); 484384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com paint.setStyle(SkPaint::kStroke_Style); 494384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com canvas->drawCircle(c0.fX, c0.fY, r0, paint); 504384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com canvas->drawCircle(c1.fX, c1.fY, r1, paint); 51cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com canvas->drawRect(bounds, paint); 524384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com} 534384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 544384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comclass TwoPointRadialGM : public skiagm::GM { 554384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.compublic: 564384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com TwoPointRadialGM() {} 574384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 584384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comprotected: 59a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 60a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 61a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 62a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 634384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkString onShortName() { 64cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com return SkString("twopointconical"); 654384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com } 664384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 67f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina SkISize onISize() { return SkISize::Make(480, 780); } 684384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 694384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com virtual void onDraw(SkCanvas* canvas) { 704384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com if (false) { 714384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkPaint paint; 724384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com paint.setColor(SK_ColorBLUE); 734bdfb8c9d6482a56c7212034a6f73046227ed023robertphillips@google.com canvas->drawRect( 74ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkRect::MakeWH(SkIntToScalar(this->getISize().fWidth), 75ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com SkIntToScalar(this->getISize().fHeight)), 764bdfb8c9d6482a56c7212034a6f73046227ed023robertphillips@google.com paint); 774384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com } 784384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkPaint paint; 794384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com const int R0 = 20; 804384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com const int R1 = 40; 81ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 824384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com const SkScalar DX = SkIntToScalar(250); 83cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com const SkScalar DY = SkIntToScalar(130); 844384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 85cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com canvas->translate(SkIntToScalar(60), SkIntToScalar(70)); 864384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 874384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com static const int gData[] = { 884384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 0, 0, R0, 0, 0, R1, 89cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com 0, 0, R0, 20, 0, R1, 904384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 0, 0, R0, 25, 0, R1, 914384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 0, 0, R0, 100, 0, R1, 924384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 0, 0, R0, 25, 0, R0, 934384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 0, 0, R0, 100, 0, R0, 944384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com }; 95ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 964384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com int count = SK_ARRAY_COUNT(gData) / 6; 974384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com for (int i = 0; i < count; ++i) { 984384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com SkScalar data[6]; 994384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com intToScalars(data, &gData[i * 6], 6); 100ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1014384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com int n = canvas->save(); 1024384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com drawGrad(canvas, &data[0], &data[3]); 1034384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com canvas->translate(DX, 0); 1044384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com drawGrad(canvas, &data[3], &data[0]); 1054384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com canvas->restoreToCount(n); 1064384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com canvas->translate(0, DY); 1074384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com } 1084384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com } 1094384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com}; 1104384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 1114384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com////////////////////////////////////////////////////////////////////////////// 1124384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 1134384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comstatic skiagm::GM* F(void*) { return new TwoPointRadialGM; } 1144384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com 1154384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comstatic skiagm::GMRegistry gR(F); 116