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