1c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2009 The Android Open Source Project
3c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com */
7c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
9c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com#ifndef SkQuadClipper_DEFINED
10c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com#define SkQuadClipper_DEFINED
11c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com
1277f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com#include "SkPath.h"
13c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com
14c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com/** This class is initialized with a clip rectangle, and then can be fed quads,
15c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com    which must already be monotonic in Y.
16fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
17c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com    In the future, it might return a series of segments, allowing it to clip
18c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com    also in X, to ensure that all segments fit in a finite coordinate system.
19c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com */
20c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.comclass SkQuadClipper {
21c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.compublic:
22c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com    SkQuadClipper();
23fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
24c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com    void setClip(const SkIRect& clip);
25fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
2677f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    bool clipQuad(const SkPoint src[3], SkPoint dst[3]);
2777f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com
28c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.comprivate:
29c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com    SkRect      fClip;
30c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com};
31c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com
3277f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com/** Iterator that returns the clipped segements of a quad clipped to a rect.
3377f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    The segments will be either lines or quads (based on SkPath::Verb), and
3477f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    will all be monotonic in Y
3577f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com */
3677f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.comclass SkQuadClipper2 {
3777f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.compublic:
3877f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    bool clipQuad(const SkPoint pts[3], const SkRect& clip);
393a0cd7f0e80115a8cf525c9e0cf231df06d30a42reed@android.com    bool clipCubic(const SkPoint pts[4], const SkRect& clip);
4077f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com
4177f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    SkPath::Verb next(SkPoint pts[]);
42fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
4377f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.comprivate:
4477f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    SkPoint*        fCurrPoint;
4577f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    SkPath::Verb*   fCurrVerb;
46fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
4777f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    enum {
48bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com        kMaxVerbs = 13,
49bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com        kMaxPoints = 32
5077f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    };
5177f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    SkPoint         fPoints[kMaxPoints];
5277f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    SkPath::Verb    fVerbs[kMaxVerbs];
5377f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com
5477f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    void clipMonoQuad(const SkPoint srcPts[3], const SkRect& clip);
55bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com    void clipMonoCubic(const SkPoint srcPts[4], const SkRect& clip);
5677f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    void appendVLine(SkScalar x, SkScalar y0, SkScalar y1, bool reverse);
5777f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com    void appendQuad(const SkPoint pts[3], bool reverse);
583a0cd7f0e80115a8cf525c9e0cf231df06d30a42reed@android.com    void appendCubic(const SkPoint pts[4], bool reverse);
5977f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com};
6077f0ef726f1f8b6769ed2509171afce8bac00b23reed@android.com
61bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com#ifdef SK_DEBUG
62bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com    void sk_assert_monotonic_x(const SkPoint pts[], int count);
63bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com    void sk_assert_monotonic_y(const SkPoint pts[], int count);
64bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com#else
65bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com    #define sk_assert_monotonic_x(pts, count)
66bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com    #define sk_assert_monotonic_y(pts, count)
67bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com#endif
68bb13586591bd412a0372aeb85d44159d2fa3f947reed@android.com
69c07d23a6e220c0aff36e3e4e06c1b685a440108ereed@android.com#endif
70