1def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com/*
2def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com * Copyright 2013 Google Inc.
3def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com *
4def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com * Use of this source code is governed by a BSD-style license that can be
5def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com * found in the LICENSE file.
6def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com */
7def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
8def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com#include "gm.h"
9def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com#include "SkCanvas.h"
10def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com#include "SkTArray.h"
11def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
12def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comnamespace skiagm {
13def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
14def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comclass ConicPathsGM : public GM {
15def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comprotected:
16def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
17def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    virtual SkString onShortName() SK_OVERRIDE {
18def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        return SkString("conicpaths");
19def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    }
20def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
2109ebe0be2696f43bb9ad169f09dfdfa8cc9b7521skia.committer@gmail.com    virtual SkISize onISize() SK_OVERRIDE {
2245a30714982e8b5b18539b2ad71f3aceab8ed075egdaniel@google.com        return SkISize::Make(1000, 1000);
23def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    }
24def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
25def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    virtual void onOnceBeforeDraw() SK_OVERRIDE {
26def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
27def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* conicCirlce = &fPaths.push_back();
28def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            conicCirlce->moveTo(0, -0);
29def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            conicCirlce->conicTo(SkIntToScalar(0), SkIntToScalar(50),
30def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(50), SkIntToScalar(50),
31def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkScalarHalf(SkScalarSqrt(2)));
32def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            conicCirlce->rConicTo(SkIntToScalar(50), SkIntToScalar(0),
33def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                         SkIntToScalar(50), SkIntToScalar(-50),
34def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                         SkScalarHalf(SkScalarSqrt(2)));
35def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            conicCirlce->rConicTo(SkIntToScalar(0), SkIntToScalar(-50),
36def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                         SkIntToScalar(-50), SkIntToScalar(-50),
37def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                         SkScalarHalf(SkScalarSqrt(2)));
38def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            conicCirlce->rConicTo(SkIntToScalar(-50), SkIntToScalar(0),
39def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                         SkIntToScalar(-50), SkIntToScalar(50),
40def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                         SkScalarHalf(SkScalarSqrt(2)));
41def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
42def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
43def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
44def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* hyperbola = &fPaths.push_back();
45def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            hyperbola->moveTo(0, -0);
46def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            hyperbola->conicTo(SkIntToScalar(0), SkIntToScalar(100),
47def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(100), SkIntToScalar(100),
48def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(2));
49def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
50def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
51def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* thinHyperbola = &fPaths.push_back();
52def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            thinHyperbola->moveTo(0, -0);
53def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            thinHyperbola->conicTo(SkIntToScalar(100), SkIntToScalar(100),
54def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(5), SkIntToScalar(0),
55def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(2));
56def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
57def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
58def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* veryThinHyperbola = &fPaths.push_back();
59def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            veryThinHyperbola->moveTo(0, -0);
60def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            veryThinHyperbola->conicTo(SkIntToScalar(100), SkIntToScalar(100),
61def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(1), SkIntToScalar(0),
62def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(2));
63def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
64def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
65def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* closedHyperbola = &fPaths.push_back();
66def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            closedHyperbola->moveTo(0, -0);
67def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            closedHyperbola->conicTo(SkIntToScalar(100), SkIntToScalar(100),
68def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(0), SkIntToScalar(0),
69def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(2));
70def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
71def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
72def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            // using 1 as weight defaults to using quadTo
73def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* nearParabola = &fPaths.push_back();
74def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            nearParabola->moveTo(0, -0);
75def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            nearParabola->conicTo(SkIntToScalar(0), SkIntToScalar(100),
76def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(100), SkIntToScalar(100),
77c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com                                        0.999f);
78def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
79def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
80def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* thinEllipse = &fPaths.push_back();
81def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            thinEllipse->moveTo(0, -0);
82def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            thinEllipse->conicTo(SkIntToScalar(100), SkIntToScalar(100),
83def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(5), SkIntToScalar(0),
84def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SK_ScalarHalf);
85def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
86def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
87def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* veryThinEllipse = &fPaths.push_back();
88def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            veryThinEllipse->moveTo(0, -0);
89def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            veryThinEllipse->conicTo(SkIntToScalar(100), SkIntToScalar(100),
90def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(1), SkIntToScalar(0),
91def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SK_ScalarHalf);
92def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
93def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
94def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* closedEllipse = &fPaths.push_back();
95def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            closedEllipse->moveTo(0, -0);
96def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            closedEllipse->conicTo(SkIntToScalar(100), SkIntToScalar(100),
97def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SkIntToScalar(0), SkIntToScalar(0),
98def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                                        SK_ScalarHalf);
99def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
100def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    }
101def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
102def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
103def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        static const SkAlpha kAlphaValue[] = { 0xFF, 0x40 };
104def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
105def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        enum {
106def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            kMargin = 15,
107def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        };
108def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        int wrapX = canvas->getDeviceSize().fWidth - kMargin;
109def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
110def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        SkScalar maxH = 0;
111def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        canvas->translate(SkIntToScalar(kMargin), SkIntToScalar(kMargin));
112def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        canvas->save();
113def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
114def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        SkScalar x = SkIntToScalar(kMargin);
115def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        for (int p = 0; p < fPaths.count(); ++p) {
116def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphaValue); ++a) {
117def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                for (int aa = 0; aa < 2; ++aa) {
118def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                    for (int fh = 0; fh < 2; ++fh) {
119def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
120def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        const SkRect& bounds = fPaths[p].getBounds();
121def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
122def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        if (x + bounds.width() > wrapX) {
123def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                            canvas->restore();
124def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                            canvas->translate(0, maxH + SkIntToScalar(kMargin));
125def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                            canvas->save();
126def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                            maxH = 0;
127def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                            x = SkIntToScalar(kMargin);
128def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        }
129def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
130def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        SkPaint paint;
131def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        paint.setARGB(kAlphaValue[a], 0, 0, 0);
132def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        paint.setAntiAlias(SkToBool(aa));
133def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        if (fh == 1) {
134def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                            paint.setStyle(SkPaint::kStroke_Style);
135def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                            paint.setStrokeWidth(0);
136def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        } else if (fh == 0) {
137def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                            paint.setStyle(SkPaint::kFill_Style);
138def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        }
139def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        canvas->save();
140def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        canvas->translate(-bounds.fLeft, -bounds.fTop);
141def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        canvas->drawPath(fPaths[p], paint);
142def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        canvas->restore();
143def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
144def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        maxH = SkMaxScalar(maxH, bounds.height());
145def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
146def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        SkScalar dx = bounds.width() + SkIntToScalar(kMargin);
147def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        x += dx;
148def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        canvas->translate(dx, 0);
149def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                    }
150def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                }
151def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            }
152def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
153def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        canvas->restore();
154def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    }
155def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
156c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com    virtual uint32_t onGetFlags() const SK_OVERRIDE {
157c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com        return  kSkipPDF_Flag;
158c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com    }
159c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com
160def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comprivate:
161def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    SkTArray<SkPath> fPaths;
162def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    typedef GM INHERITED;
163def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com};
164def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
165def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com//////////////////////////////////////////////////////////////////////////////
166def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
167def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comDEF_GM( return SkNEW(ConicPathsGM); )
168def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com}
169