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