conicpaths.cpp revision 40c85e41b8be96f47f03a34bb2938696037afad4
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
12d1bd1d75a3b5902193b430a611f2eb46edf38435reedclass ConicPathsGM : public skiagm::GM {
13def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comprotected:
14def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
15d1bd1d75a3b5902193b430a611f2eb46edf38435reed    SkString onShortName() SK_OVERRIDE {
16def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        return SkString("conicpaths");
17def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    }
18def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
19d1bd1d75a3b5902193b430a611f2eb46edf38435reed    SkISize onISize() SK_OVERRIDE {
2040c85e41b8be96f47f03a34bb2938696037afad4reed        return SkISize::Make(920, 960);
21def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    }
22def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
23d1bd1d75a3b5902193b430a611f2eb46edf38435reed    void onOnceBeforeDraw() SK_OVERRIDE {
24def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
25d1bd1d75a3b5902193b430a611f2eb46edf38435reed            const SkScalar w = SkScalarSqrt(2)/2;
26def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* conicCirlce = &fPaths.push_back();
2740c85e41b8be96f47f03a34bb2938696037afad4reed            conicCirlce->moveTo(0, 0);
28d1bd1d75a3b5902193b430a611f2eb46edf38435reed            conicCirlce->conicTo(0, 50, 50, 50, w);
29d1bd1d75a3b5902193b430a611f2eb46edf38435reed            conicCirlce->rConicTo(50, 0, 50, -50, w);
30d1bd1d75a3b5902193b430a611f2eb46edf38435reed            conicCirlce->rConicTo(0, -50, -50, -50, w);
31d1bd1d75a3b5902193b430a611f2eb46edf38435reed            conicCirlce->rConicTo(-50, 0, -50, 50, w);
32def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
33def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
34def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
35def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* hyperbola = &fPaths.push_back();
3640c85e41b8be96f47f03a34bb2938696037afad4reed            hyperbola->moveTo(0, 0);
37d1bd1d75a3b5902193b430a611f2eb46edf38435reed            hyperbola->conicTo(0, 100, 100, 100, 2);
38def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
39def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
40def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* thinHyperbola = &fPaths.push_back();
4140c85e41b8be96f47f03a34bb2938696037afad4reed            thinHyperbola->moveTo(0, 0);
42d1bd1d75a3b5902193b430a611f2eb46edf38435reed            thinHyperbola->conicTo(100, 100, 5, 0, 2);
43def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
44def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
45def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* veryThinHyperbola = &fPaths.push_back();
4640c85e41b8be96f47f03a34bb2938696037afad4reed            veryThinHyperbola->moveTo(0, 0);
47d1bd1d75a3b5902193b430a611f2eb46edf38435reed            veryThinHyperbola->conicTo(100, 100, 1, 0, 2);
48def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
49def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
50def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* closedHyperbola = &fPaths.push_back();
5140c85e41b8be96f47f03a34bb2938696037afad4reed            closedHyperbola->moveTo(0, 0);
52d1bd1d75a3b5902193b430a611f2eb46edf38435reed            closedHyperbola->conicTo(100, 100, 0, 0, 2);
53def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
54def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
55def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            // using 1 as weight defaults to using quadTo
56def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* nearParabola = &fPaths.push_back();
5740c85e41b8be96f47f03a34bb2938696037afad4reed            nearParabola->moveTo(0, 0);
58d1bd1d75a3b5902193b430a611f2eb46edf38435reed            nearParabola->conicTo(0, 100, 100, 100, 0.999f);
59def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
60def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
61def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* thinEllipse = &fPaths.push_back();
6240c85e41b8be96f47f03a34bb2938696037afad4reed            thinEllipse->moveTo(0, 0);
63d1bd1d75a3b5902193b430a611f2eb46edf38435reed            thinEllipse->conicTo(100, 100, 5, 0, SK_ScalarHalf);
64def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
65def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
66def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* veryThinEllipse = &fPaths.push_back();
6740c85e41b8be96f47f03a34bb2938696037afad4reed            veryThinEllipse->moveTo(0, 0);
68d1bd1d75a3b5902193b430a611f2eb46edf38435reed            veryThinEllipse->conicTo(100, 100, 1, 0, SK_ScalarHalf);
69def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
70def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        {
71def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            SkPath* closedEllipse = &fPaths.push_back();
7240c85e41b8be96f47f03a34bb2938696037afad4reed            closedEllipse->moveTo(0,  0);
73d1bd1d75a3b5902193b430a611f2eb46edf38435reed            closedEllipse->conicTo(100, 100, 0, 0, SK_ScalarHalf);
74def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
75def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    }
76def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
77d1bd1d75a3b5902193b430a611f2eb46edf38435reed    void onDraw(SkCanvas* canvas) SK_OVERRIDE {
78d1bd1d75a3b5902193b430a611f2eb46edf38435reed        const SkAlpha kAlphaValue[] = { 0xFF, 0x40 };
79def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
80d1bd1d75a3b5902193b430a611f2eb46edf38435reed        const SkScalar margin = 15;
81d1bd1d75a3b5902193b430a611f2eb46edf38435reed        canvas->translate(margin, margin);
82def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
8340c85e41b8be96f47f03a34bb2938696037afad4reed        SkPaint paint;
84def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        for (int p = 0; p < fPaths.count(); ++p) {
8540c85e41b8be96f47f03a34bb2938696037afad4reed            canvas->save();
86def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            for (size_t a = 0; a < SK_ARRAY_COUNT(kAlphaValue); ++a) {
8740c85e41b8be96f47f03a34bb2938696037afad4reed                paint.setARGB(kAlphaValue[a], 0, 0, 0);
88def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                for (int aa = 0; aa < 2; ++aa) {
8940c85e41b8be96f47f03a34bb2938696037afad4reed                    paint.setAntiAlias(SkToBool(aa));
90def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                    for (int fh = 0; fh < 2; ++fh) {
9140c85e41b8be96f47f03a34bb2938696037afad4reed                        paint.setStyle(fh ? SkPaint::kStroke_Style : SkPaint::kFill_Style);
92def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
93def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        const SkRect& bounds = fPaths[p].getBounds();
94def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        canvas->save();
95def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        canvas->translate(-bounds.fLeft, -bounds.fTop);
96def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        canvas->drawPath(fPaths[p], paint);
97def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                        canvas->restore();
98def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
9940c85e41b8be96f47f03a34bb2938696037afad4reed                        canvas->translate(110, 0);
100def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                    }
101def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com                }
102def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com            }
10340c85e41b8be96f47f03a34bb2938696037afad4reed            canvas->restore();
10440c85e41b8be96f47f03a34bb2938696037afad4reed            canvas->translate(0, 110);
105def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        }
106def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com        canvas->restore();
107def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    }
108def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
109d1bd1d75a3b5902193b430a611f2eb46edf38435reed    uint32_t onGetFlags() const SK_OVERRIDE {
11040c85e41b8be96f47f03a34bb2938696037afad4reed        // tiling w/ non-antialias paths can cause off-by-1-pixels differences which are
11140c85e41b8be96f47f03a34bb2938696037afad4reed        // unavoidable (chopping in floats -vs- stepping in scan-converter).
11240c85e41b8be96f47f03a34bb2938696037afad4reed        return kSkipTiled_Flag;
113c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com    }
114c464cbd121f2add3401e8dfaf8679fcb1aec5177reed@google.com
115def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.comprivate:
116def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com    SkTArray<SkPath> fPaths;
117d1bd1d75a3b5902193b430a611f2eb46edf38435reed    typedef skiagm::GM INHERITED;
118def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com};
119d1bd1d75a3b5902193b430a611f2eb46edf38435reedDEF_GM( return SkNEW(ConicPathsGM); )
120def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
121def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com//////////////////////////////////////////////////////////////////////////////
122def9f6e3eb45bf1940b848e44871da73af0d7301egdaniel@google.com
123