reed@android.com | 4408cca | 2009-10-27 02:24:03 +0000 | [diff] [blame] | 1 | #include "SkBoundaryPatch.h" |
| 2 | |
| 3 | SkBoundaryPatch::SkBoundaryPatch() { |
| 4 | sk_bzero(fCurve, sizeof(fCurve)); |
| 5 | }; |
| 6 | |
| 7 | SkBoundaryPatch::~SkBoundaryPatch() { |
| 8 | for (int i = 0; i < 4; i++) { |
| 9 | SkSafeUnref(fCurve[i]); |
| 10 | } |
| 11 | } |
| 12 | |
| 13 | SkBoundaryCurve* SkBoundaryPatch::setCurve(Edge e, SkBoundaryCurve* curve) { |
| 14 | SkASSERT((unsigned)e < 4); |
| 15 | |
| 16 | SkRefCnt_SafeAssign(fCurve[e], curve); |
| 17 | return curve; |
| 18 | } |
| 19 | |
| 20 | static SkPoint SkMakePoint(SkScalar x, SkScalar y) { |
| 21 | SkPoint pt; |
| 22 | pt.set(x, y); |
| 23 | return pt; |
| 24 | } |
| 25 | |
| 26 | static SkPoint SkPointInterp(const SkPoint& a, const SkPoint& b, SkScalar t) { |
| 27 | return SkMakePoint(SkScalarInterp(a.fX, b.fX, t), |
| 28 | SkScalarInterp(a.fY, b.fY, t)); |
| 29 | } |
| 30 | |
| 31 | SkPoint SkBoundaryPatch::evaluate(SkScalar unitU, SkScalar unitV) { |
| 32 | SkPoint u = SkPointInterp(fCurve[kLeft]->evaluate(unitV), |
| 33 | fCurve[kRight]->evaluate(unitV), unitU); |
| 34 | SkPoint v = SkPointInterp(fCurve[kTop]->evaluate(unitU), |
| 35 | fCurve[kBottom]->evaluate(unitU), unitV); |
| 36 | return SkMakePoint(SkScalarAve(u.fX, v.fX), |
| 37 | SkScalarAve(u.fY, v.fY)); |
| 38 | } |
| 39 | |
| 40 | //////////////////////////////////////////////////////////////////////// |
| 41 | |
| 42 | #include "SkGeometry.h" |
| 43 | |
| 44 | SkPoint SkLineBoundaryCurve::evaluate(SkScalar t) { |
| 45 | return SkPointInterp(fPts[0], fPts[1], t); |
| 46 | } |
| 47 | |
| 48 | SkPoint SkCubicBoundaryCurve::evaluate(SkScalar t) { |
| 49 | SkPoint loc; |
| 50 | SkEvalCubicAt(fPts, t, &loc, NULL, NULL); |
| 51 | return loc; |
| 52 | } |
| 53 | |
| 54 | |