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 "include/core/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 */
20class SkQuadClipper {
21public:
22 SkQuadClipper();
23
24 void setClip(const SkIRect& clip);
25
26 bool clipQuad(const SkPoint src[3], SkPoint dst[3]);
27
28private:
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 */
36class SkQuadClipper2 {
37public:
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
43private:
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