1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkPathOpsRect_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SkPathOpsRect_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsPoint.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/pathops/SkPathOpsTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm> 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker class SkTCurve; 17*c8dee2aaSAndroid Build Coastguard Worker struct SkDConic; 18*c8dee2aaSAndroid Build Coastguard Worker struct SkDCubic; 19*c8dee2aaSAndroid Build Coastguard Worker struct SkDQuad; 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker struct SkDRect { 22*c8dee2aaSAndroid Build Coastguard Worker double fLeft, fTop, fRight, fBottom; 23*c8dee2aaSAndroid Build Coastguard Worker addSkDRect24*c8dee2aaSAndroid Build Coastguard Worker void add(const SkDPoint& pt) { 25*c8dee2aaSAndroid Build Coastguard Worker fLeft = std::min(fLeft, pt.fX); 26*c8dee2aaSAndroid Build Coastguard Worker fTop = std::min(fTop, pt.fY); 27*c8dee2aaSAndroid Build Coastguard Worker fRight = std::max(fRight, pt.fX); 28*c8dee2aaSAndroid Build Coastguard Worker fBottom = std::max(fBottom, pt.fY); 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker containsSkDRect31*c8dee2aaSAndroid Build Coastguard Worker bool contains(const SkDPoint& pt) const { 32*c8dee2aaSAndroid Build Coastguard Worker return approximately_between(fLeft, pt.fX, fRight) 33*c8dee2aaSAndroid Build Coastguard Worker && approximately_between(fTop, pt.fY, fBottom); 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker void debugInit(); 37*c8dee2aaSAndroid Build Coastguard Worker intersectsSkDRect38*c8dee2aaSAndroid Build Coastguard Worker bool intersects(const SkDRect& r) const { 39*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fLeft <= fRight); 40*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fTop <= fBottom); 41*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(r.fLeft <= r.fRight); 42*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(r.fTop <= r.fBottom); 43*c8dee2aaSAndroid Build Coastguard Worker return r.fLeft <= fRight && fLeft <= r.fRight && r.fTop <= fBottom && fTop <= r.fBottom; 44*c8dee2aaSAndroid Build Coastguard Worker } 45*c8dee2aaSAndroid Build Coastguard Worker setSkDRect46*c8dee2aaSAndroid Build Coastguard Worker void set(const SkDPoint& pt) { 47*c8dee2aaSAndroid Build Coastguard Worker fLeft = fRight = pt.fX; 48*c8dee2aaSAndroid Build Coastguard Worker fTop = fBottom = pt.fY; 49*c8dee2aaSAndroid Build Coastguard Worker } 50*c8dee2aaSAndroid Build Coastguard Worker widthSkDRect51*c8dee2aaSAndroid Build Coastguard Worker double width() const { 52*c8dee2aaSAndroid Build Coastguard Worker return fRight - fLeft; 53*c8dee2aaSAndroid Build Coastguard Worker } 54*c8dee2aaSAndroid Build Coastguard Worker heightSkDRect55*c8dee2aaSAndroid Build Coastguard Worker double height() const { 56*c8dee2aaSAndroid Build Coastguard Worker return fBottom - fTop; 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker setBoundsSkDRect59*c8dee2aaSAndroid Build Coastguard Worker void setBounds(const SkDConic& curve) { 60*c8dee2aaSAndroid Build Coastguard Worker setBounds(curve, curve, 0, 1); 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker void setBounds(const SkDConic& curve, const SkDConic& sub, double tStart, double tEnd); 64*c8dee2aaSAndroid Build Coastguard Worker setBoundsSkDRect65*c8dee2aaSAndroid Build Coastguard Worker void setBounds(const SkDCubic& curve) { 66*c8dee2aaSAndroid Build Coastguard Worker setBounds(curve, curve, 0, 1); 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker void setBounds(const SkDCubic& curve, const SkDCubic& sub, double tStart, double tEnd); 70*c8dee2aaSAndroid Build Coastguard Worker setBoundsSkDRect71*c8dee2aaSAndroid Build Coastguard Worker void setBounds(const SkDQuad& curve) { 72*c8dee2aaSAndroid Build Coastguard Worker setBounds(curve, curve, 0, 1); 73*c8dee2aaSAndroid Build Coastguard Worker } 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker void setBounds(const SkDQuad& curve, const SkDQuad& sub, double tStart, double tEnd); 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker void setBounds(const SkTCurve& curve); 78*c8dee2aaSAndroid Build Coastguard Worker validSkDRect79*c8dee2aaSAndroid Build Coastguard Worker bool valid() const { 80*c8dee2aaSAndroid Build Coastguard Worker return fLeft <= fRight && fTop <= fBottom; 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker }; 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker #endif 85