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