blob: f958329d3fd68a25de66446d89b3dc655142065d [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
2 Copyright 2010 Google Inc.
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17
18#ifndef GrPath_DEFINED
19#define GrPath_DEFINED
20
21#include "GrPathSink.h"
22#include "GrPathIter.h"
23#include "GrTDArray.h"
24#include "GrPoint.h"
bsalomon@google.com06e17952011-04-27 21:13:04 +000025#include "GrRect.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000026
27class GrPath : public GrPathSink {
28public:
29 GrPath();
30 GrPath(const GrPath&);
31 explicit GrPath(GrPathIter&);
32 virtual ~GrPath();
33
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000034 GrConvexHint getConvexHint() const { return fConvexHint; }
35 void setConvexHint(GrConvexHint hint) { fConvexHint = hint; }
reed@google.comac10a2d2010-12-22 21:39:39 +000036
bsalomon@google.com06e17952011-04-27 21:13:04 +000037 const GrRect& getConservativeBounds() const { return fConservativeBounds; }
38
reed@google.comac10a2d2010-12-22 21:39:39 +000039 void resetFromIter(GrPathIter*);
40
bsalomon@google.comd302f142011-03-03 13:54:13 +000041 bool operator ==(const GrPath& path) const;
42 bool operator !=(const GrPath& path) const { return !(*this == path); }
reed@google.comac10a2d2010-12-22 21:39:39 +000043 // overrides from GrPathSink
44
45 virtual void moveTo(GrScalar x, GrScalar y);
46 virtual void lineTo(GrScalar x, GrScalar y);
47 virtual void quadTo(GrScalar x0, GrScalar y0, GrScalar x1, GrScalar y1);
48 virtual void cubicTo(GrScalar x0, GrScalar y0, GrScalar x1, GrScalar y1,
49 GrScalar x2, GrScalar y2);
50 virtual void close();
51
reed@google.com6f8f2922011-03-04 22:27:10 +000052 /**
53 * Offset the path by (tx, ty), adding tx to the horizontal position
54 * and adds ty to the vertical position of every point.
55 */
56 void offset(GrScalar tx, GrScalar ty);
57
reed@google.comac10a2d2010-12-22 21:39:39 +000058 class Iter : public GrPathIter {
59 public:
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000060 /**
61 * Creates an uninitialized iterator
62 */
63 Iter();
64
reed@google.comac10a2d2010-12-22 21:39:39 +000065 Iter(const GrPath& path);
66
67 // overrides from GrPathIter
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000068 virtual GrPathCmd next(GrPoint points[]);
69 virtual GrConvexHint convexHint() const;
70 virtual GrPathCmd next();
reed@google.comac10a2d2010-12-22 21:39:39 +000071 virtual void rewind();
bsalomon@google.com06e17952011-04-27 21:13:04 +000072 virtual bool getConservativeBounds(GrRect* rect) const;
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000073
74 /**
75 * Sets iterator to begining of path
76 */
77 void reset(const GrPath& path);
reed@google.comac10a2d2010-12-22 21:39:39 +000078 private:
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000079 const GrPath* fPath;
reed@google.comac10a2d2010-12-22 21:39:39 +000080 GrPoint fLastPt;
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000081 int fCmdIndex;
reed@google.comac10a2d2010-12-22 21:39:39 +000082 int fPtIndex;
83 };
84
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000085 static void ConvexUnitTest();
reed@google.comac10a2d2010-12-22 21:39:39 +000086
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000087private:
88
89 GrTDArray<GrPathCmd> fCmds;
reed@google.comac10a2d2010-12-22 21:39:39 +000090 GrTDArray<GrPoint> fPts;
bsalomon@google.com06e17952011-04-27 21:13:04 +000091 GrConvexHint fConvexHint;
92 GrRect fConservativeBounds;
reed@google.comac10a2d2010-12-22 21:39:39 +000093
94 // this ensures we have a moveTo at the start of each contour
95 inline void ensureMoveTo();
96
bsalomon@google.com5aaa69e2011-03-04 20:29:08 +000097 bool wasLastVerb(GrPathCmd cmd) const {
98 int count = fCmds.count();
99 return count > 0 && cmd == fCmds[count - 1];
reed@google.comac10a2d2010-12-22 21:39:39 +0000100 }
101
102 friend class Iter;
reed@google.comc9218432011-01-25 19:05:12 +0000103
104 typedef GrPathSink INHERITED;
reed@google.comac10a2d2010-12-22 21:39:39 +0000105};
106
107#endif
108