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