1 /*
2  * Copyright 2009 The Android Open Source Project
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 
9 #ifndef SkQuadClipper_DEFINED
10 #define SkQuadClipper_DEFINED
11 
12 #include "SkPath.h"
13 
14 /** This class is initialized with a clip rectangle, and then can be fed quads,
15     which must already be monotonic in Y.
16 
17     In the future, it might return a series of segments, allowing it to clip
18     also in X, to ensure that all segments fit in a finite coordinate system.
19  */
20 class SkQuadClipper {
21 public:
22     SkQuadClipper();
23 
24     void setClip(const SkIRect& clip);
25 
26     bool clipQuad(const SkPoint src[3], SkPoint dst[3]);
27 
28 private:
29     SkRect      fClip;
30 };
31 
32 /** Iterator that returns the clipped segements of a quad clipped to a rect.
33     The segments will be either lines or quads (based on SkPath::Verb), and
34     will all be monotonic in Y
35  */
36 class SkQuadClipper2 {
37 public:
38     bool clipQuad(const SkPoint pts[3], const SkRect& clip);
39     bool clipCubic(const SkPoint pts[4], const SkRect& clip);
40 
41     SkPath::Verb next(SkPoint pts[]);
42 
43 private:
44     SkPoint*        fCurrPoint;
45     SkPath::Verb*   fCurrVerb;
46 
47     enum {
48         kMaxVerbs = 13,
49         kMaxPoints = 32
50     };
51     SkPoint         fPoints[kMaxPoints];
52     SkPath::Verb    fVerbs[kMaxVerbs];
53 
54     void clipMonoQuad(const SkPoint srcPts[3], const SkRect& clip);
55     void clipMonoCubic(const SkPoint srcPts[4], const SkRect& clip);
56     void appendVLine(SkScalar x, SkScalar y0, SkScalar y1, bool reverse);
57     void appendQuad(const SkPoint pts[3], bool reverse);
58     void appendCubic(const SkPoint pts[4], bool reverse);
59 };
60 
61 #ifdef SK_DEBUG
62     void sk_assert_monotonic_x(const SkPoint pts[], int count);
63     void sk_assert_monotonic_y(const SkPoint pts[], int count);
64 #else
65     #define sk_assert_monotonic_x(pts, count)
66     #define sk_assert_monotonic_y(pts, count)
67 #endif
68 
69 #endif
70