Index: src/core/SkDraw.cpp |
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp |
index 03b331108dc27226d5c761e303f4ba3bcc7d89ce..f40c1bbcb0ea94f3a402b7f51e2a98a07bf3d36e 100644 |
--- a/src/core/SkDraw.cpp |
+++ b/src/core/SkDraw.cpp |
@@ -1866,135 +1866,6 @@ void SkDraw::drawPosText(const char text[], size_t byteLength, |
/////////////////////////////////////////////////////////////////////////////// |
-#include "SkPathMeasure.h" |
- |
-static void morphpoints(SkPoint dst[], const SkPoint src[], int count, |
- SkPathMeasure& meas, const SkMatrix& matrix) { |
- SkMatrix::MapXYProc proc = matrix.getMapXYProc(); |
- |
- for (int i = 0; i < count; i++) { |
- SkPoint pos; |
- SkVector tangent; |
- |
- proc(matrix, src[i].fX, src[i].fY, &pos); |
- SkScalar sx = pos.fX; |
- SkScalar sy = pos.fY; |
- |
- if (!meas.getPosTan(sx, &pos, &tangent)) { |
- // set to 0 if the measure failed, so that we just set dst == pos |
- tangent.set(0, 0); |
- } |
- |
- /* This is the old way (that explains our approach but is way too slow |
- SkMatrix matrix; |
- SkPoint pt; |
- |
- pt.set(sx, sy); |
- matrix.setSinCos(tangent.fY, tangent.fX); |
- matrix.preTranslate(-sx, 0); |
- matrix.postTranslate(pos.fX, pos.fY); |
- matrix.mapPoints(&dst[i], &pt, 1); |
- */ |
- dst[i].set(pos.fX - SkScalarMul(tangent.fY, sy), |
- pos.fY + SkScalarMul(tangent.fX, sy)); |
- } |
-} |
- |
-/* TODO |
- |
- Need differentially more subdivisions when the follow-path is curvy. Not sure how to |
- determine that, but we need it. I guess a cheap answer is let the caller tell us, |
- but that seems like a cop-out. Another answer is to get Rob Johnson to figure it out. |
-*/ |
-static void morphpath(SkPath* dst, const SkPath& src, SkPathMeasure& meas, |
- const SkMatrix& matrix) { |
- SkPath::Iter iter(src, false); |
- SkPoint srcP[4], dstP[3]; |
- SkPath::Verb verb; |
- |
- while ((verb = iter.next(srcP)) != SkPath::kDone_Verb) { |
- switch (verb) { |
- case SkPath::kMove_Verb: |
- morphpoints(dstP, srcP, 1, meas, matrix); |
- dst->moveTo(dstP[0]); |
- break; |
- case SkPath::kLine_Verb: |
- // turn lines into quads to look bendy |
- srcP[0].fX = SkScalarAve(srcP[0].fX, srcP[1].fX); |
- srcP[0].fY = SkScalarAve(srcP[0].fY, srcP[1].fY); |
- morphpoints(dstP, srcP, 2, meas, matrix); |
- dst->quadTo(dstP[0], dstP[1]); |
- break; |
- case SkPath::kQuad_Verb: |
- morphpoints(dstP, &srcP[1], 2, meas, matrix); |
- dst->quadTo(dstP[0], dstP[1]); |
- break; |
- case SkPath::kCubic_Verb: |
- morphpoints(dstP, &srcP[1], 3, meas, matrix); |
- dst->cubicTo(dstP[0], dstP[1], dstP[2]); |
- break; |
- case SkPath::kClose_Verb: |
- dst->close(); |
- break; |
- default: |
- SkDEBUGFAIL("unknown verb"); |
- break; |
- } |
- } |
-} |
- |
-void SkDraw::drawTextOnPath(const char text[], size_t byteLength, |
- const SkPath& follow, const SkMatrix* matrix, |
- const SkPaint& paint) const { |
- SkASSERT(byteLength == 0 || text != NULL); |
- |
- // nothing to draw |
- if (text == NULL || byteLength == 0 || fRC->isEmpty()) { |
- return; |
- } |
- |
- SkTextToPathIter iter(text, byteLength, paint, true); |
- SkPathMeasure meas(follow, false); |
- SkScalar hOffset = 0; |
- |
- // need to measure first |
- if (paint.getTextAlign() != SkPaint::kLeft_Align) { |
- SkScalar pathLen = meas.getLength(); |
- if (paint.getTextAlign() == SkPaint::kCenter_Align) { |
- pathLen = SkScalarHalf(pathLen); |
- } |
- hOffset += pathLen; |
- } |
- |
- const SkPath* iterPath; |
- SkScalar xpos; |
- SkMatrix scaledMatrix; |
- SkScalar scale = iter.getPathScale(); |
- |
- scaledMatrix.setScale(scale, scale); |
- |
- while (iter.next(&iterPath, &xpos)) { |
- if (iterPath) { |
- SkPath tmp; |
- SkMatrix m(scaledMatrix); |
- |
- tmp.setIsVolatile(true); |
- m.postTranslate(xpos + hOffset, 0); |
- if (matrix) { |
- m.postConcat(*matrix); |
- } |
- morphpath(&tmp, *iterPath, meas, m); |
- if (fDevice) { |
- fDevice->drawPath(*this, tmp, iter.getPaint(), NULL, true); |
- } else { |
- this->drawPath(tmp, iter.getPaint(), NULL, true); |
- } |
- } |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
typedef void (*HairProc)(const SkPoint&, const SkPoint&, const SkRasterClip&, |
SkBlitter*); |