experimental start to arcs

git-svn-id: http://skia.googlecode.com/svn/trunk@8665 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
reed@google.com 2013-04-12 19:11:10 +00:00
parent 318a059a0c
commit c518710d9a
2 changed files with 47 additions and 0 deletions

View File

@ -206,4 +206,18 @@ enum SkRotationDirection {
int SkBuildQuadArc(const SkVector& unitStart, const SkVector& unitStop,
SkRotationDirection, const SkMatrix*, SkPoint quadPoints[]);
// experimental
struct SkRationalQuad {
SkPoint fPts[3];
SkScalar fW;
void set(const SkPoint pts[3], SkScalar w) {
memcpy(fPts, pts, 3 * sizeof(SkPoint));
fW = w;
}
void evalAt(SkScalar t, SkPoint* pt) const;
void chopAt(SkScalar t, SkRationalQuad dst[2]) const;
};
#endif

View File

@ -1380,3 +1380,36 @@ int SkBuildQuadArc(const SkVector& uStart, const SkVector& uStop,
matrix.mapPoints(quadPoints, pointCount);
return pointCount;
}
///////////////////////////////////////////////////////////////////////////////
static SkScalar eval_ratquad(const SkScalar src[], SkScalar w, SkScalar t) {
SkASSERT(src);
SkASSERT(t >= 0 && t <= SK_Scalar1);
SkScalar src2w = SkScalarMul(src[2], w);
SkScalar C = src[0];
SkScalar A = src[4] - 2 * src2w + C;
SkScalar B = 2 * (src2w - C);
SkScalar numer = SkScalarMulAdd(SkScalarMulAdd(A, t, B), t, C);
B = 2 * (w - SK_Scalar1);
C = SK_Scalar1;
A = -B;
SkScalar denom = SkScalarMulAdd(SkScalarMulAdd(A, t, B), t, C);
return SkScalarDiv(numer, denom);
}
void SkRationalQuad::evalAt(SkScalar t, SkPoint* pt) const {
SkASSERT(t >= 0 && t <= SK_Scalar1);
if (pt) {
pt->set(eval_ratquad(&fPts[0].fX, fW, t),
eval_ratquad(&fPts[0].fY, fW, t));
}
}
void SkRationalQuad::chopAt(SkScalar t, SkRationalQuad dst[2]) const {
}