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);
33992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    sk_tool_utils::set_portable_typeface(&paint);
34ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
35cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com    SkString str;
36cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com    str.printf("%g,%g,%g  %g,%g,%g",
37cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com               SkScalarToFloat(c0.fX), SkScalarToFloat(c0.fY), SkScalarToFloat(r0),
38cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com               SkScalarToFloat(c1.fX), SkScalarToFloat(c1.fY), SkScalarToFloat(r1));
39cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com    canvas->drawText(str.c_str(), str.size(),
40cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com                     bounds.fLeft, bounds.fTop - paint.getTextSize()/2, paint);
41ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
42cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com    paint.setShader(SkGradientShader::CreateTwoPointConical(c0, r0, c1, r1,
43cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com                                                            colors, NULL, 2,
44cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com                                                            SkShader::kClamp_TileMode))->unref();
45cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com    canvas->drawRect(bounds, paint);
46ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
474384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com    paint.setShader(NULL);
48cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com    paint.setColor(0x66000000);
494384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com    paint.setStyle(SkPaint::kStroke_Style);
504384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com    canvas->drawCircle(c0.fX, c0.fY, r0, paint);
514384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com    canvas->drawCircle(c1.fX, c1.fY, r1, paint);
52cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com    canvas->drawRect(bounds, paint);
534384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com}
544384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com
554384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comclass TwoPointRadialGM : public skiagm::GM {
564384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.compublic:
574384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com    TwoPointRadialGM() {}
584384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com
594384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comprotected:
604384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com    SkString onShortName() {
61cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com        return SkString("twopointconical");
624384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com    }
634384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com
64f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina    SkISize onISize() { return SkISize::Make(480, 780); }
654384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com
664384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com    virtual void onDraw(SkCanvas* canvas) {
674384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        if (false) {
684384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            SkPaint paint;
694384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            paint.setColor(SK_ColorBLUE);
704bdfb8c9d6482a56c7212034a6f73046227ed023robertphillips@google.com            canvas->drawRect(
71ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                    SkRect::MakeWH(SkIntToScalar(this->getISize().fWidth),
72ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                                   SkIntToScalar(this->getISize().fHeight)),
734bdfb8c9d6482a56c7212034a6f73046227ed023robertphillips@google.com                    paint);
744384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        }
754384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        SkPaint paint;
764384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        const int R0 = 20;
774384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        const int R1 = 40;
78ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
794384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        const SkScalar DX = SkIntToScalar(250);
80cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com        const SkScalar DY = SkIntToScalar(130);
814384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com
82cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com        canvas->translate(SkIntToScalar(60), SkIntToScalar(70));
834384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com
844384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        static const int gData[] = {
854384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            0, 0, R0,       0, 0, R1,
86cb7be694c31f833c00a0dfb3529aaead3a4db62dreed@google.com            0, 0, R0,       20, 0, R1,
874384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            0, 0, R0,       25, 0, R1,
884384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            0, 0, R0,       100, 0, R1,
894384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            0, 0, R0,       25, 0, R0,
904384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            0, 0, R0,       100, 0, R0,
914384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        };
92ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
934384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        int count = SK_ARRAY_COUNT(gData) / 6;
944384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        for (int i = 0; i < count; ++i) {
954384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            SkScalar data[6];
964384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            intToScalars(data, &gData[i * 6], 6);
97ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
984384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            int n = canvas->save();
994384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            drawGrad(canvas, &data[0], &data[3]);
1004384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            canvas->translate(DX, 0);
1014384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            drawGrad(canvas, &data[3], &data[0]);
1024384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            canvas->restoreToCount(n);
1034384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com            canvas->translate(0, DY);
1044384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com        }
1054384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com    }
1064384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com};
1074384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com
1084384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com//////////////////////////////////////////////////////////////////////////////
1094384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com
1104384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comstatic skiagm::GM* F(void*) { return new TwoPointRadialGM; }
1114384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.com
1124384fabab41b26c7cf8f357a22181e7ba23e7822reed@google.comstatic skiagm::GMRegistry gR(F);
113