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