|  | /* | 
|  | * Copyright 2009 The Android Open Source Project | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  |  | 
|  | #ifndef SkQuadClipper_DEFINED | 
|  | #define SkQuadClipper_DEFINED | 
|  |  | 
|  | #include "SkPath.h" | 
|  |  | 
|  | /** This class is initialized with a clip rectangle, and then can be fed quads, | 
|  | which must already be monotonic in Y. | 
|  |  | 
|  | In the future, it might return a series of segments, allowing it to clip | 
|  | also in X, to ensure that all segments fit in a finite coordinate system. | 
|  | */ | 
|  | class SkQuadClipper { | 
|  | public: | 
|  | SkQuadClipper(); | 
|  |  | 
|  | void setClip(const SkIRect& clip); | 
|  |  | 
|  | bool clipQuad(const SkPoint src[3], SkPoint dst[3]); | 
|  |  | 
|  | private: | 
|  | SkRect      fClip; | 
|  | }; | 
|  |  | 
|  | /** Iterator that returns the clipped segements of a quad clipped to a rect. | 
|  | The segments will be either lines or quads (based on SkPath::Verb), and | 
|  | will all be monotonic in Y | 
|  | */ | 
|  | class SkQuadClipper2 { | 
|  | public: | 
|  | bool clipQuad(const SkPoint pts[3], const SkRect& clip); | 
|  | bool clipCubic(const SkPoint pts[4], const SkRect& clip); | 
|  |  | 
|  | SkPath::Verb next(SkPoint pts[]); | 
|  |  | 
|  | private: | 
|  | SkPoint*        fCurrPoint; | 
|  | SkPath::Verb*   fCurrVerb; | 
|  |  | 
|  | enum { | 
|  | kMaxVerbs = 13, | 
|  | kMaxPoints = 32 | 
|  | }; | 
|  | SkPoint         fPoints[kMaxPoints]; | 
|  | SkPath::Verb    fVerbs[kMaxVerbs]; | 
|  |  | 
|  | void clipMonoQuad(const SkPoint srcPts[3], const SkRect& clip); | 
|  | void clipMonoCubic(const SkPoint srcPts[4], const SkRect& clip); | 
|  | void appendVLine(SkScalar x, SkScalar y0, SkScalar y1, bool reverse); | 
|  | void appendQuad(const SkPoint pts[3], bool reverse); | 
|  | void appendCubic(const SkPoint pts[4], bool reverse); | 
|  | }; | 
|  |  | 
|  | #ifdef SK_DEBUG | 
|  | void sk_assert_monotonic_x(const SkPoint pts[], int count); | 
|  | void sk_assert_monotonic_y(const SkPoint pts[], int count); | 
|  | #else | 
|  | #define sk_assert_monotonic_x(pts, count) | 
|  | #define sk_assert_monotonic_y(pts, count) | 
|  | #endif | 
|  |  | 
|  | #endif |