blob: 1644f720ac93f0928852ccb96f6e3dcc4ba68d3a [file] [log] [blame]
reed@android.com4408cca2009-10-27 02:24:03 +00001#include "SkBoundaryPatch.h"
2
3SkBoundaryPatch::SkBoundaryPatch() {
4 sk_bzero(fCurve, sizeof(fCurve));
5};
6
7SkBoundaryPatch::~SkBoundaryPatch() {
8 for (int i = 0; i < 4; i++) {
9 SkSafeUnref(fCurve[i]);
10 }
11}
12
13SkBoundaryCurve* SkBoundaryPatch::setCurve(Edge e, SkBoundaryCurve* curve) {
14 SkASSERT((unsigned)e < 4);
15
16 SkRefCnt_SafeAssign(fCurve[e], curve);
17 return curve;
18}
19
20static SkPoint SkMakePoint(SkScalar x, SkScalar y) {
21 SkPoint pt;
22 pt.set(x, y);
23 return pt;
24}
25
26static 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
31SkPoint 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
44SkPoint SkLineBoundaryCurve::evaluate(SkScalar t) {
45 return SkPointInterp(fPts[0], fPts[1], t);
46}
47
48SkPoint SkCubicBoundaryCurve::evaluate(SkScalar t) {
49 SkPoint loc;
50 SkEvalCubicAt(fPts, t, &loc, NULL, NULL);
51 return loc;
52}
53
54