aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkDraw.cpp40
-rw-r--r--src/core/SkPaint.cpp33
-rw-r--r--src/core/SkTextToPathIter.h10
3 files changed, 53 insertions, 30 deletions
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
index 83cec4bc2e..9e8e9ef59c 100644
--- a/src/core/SkDraw.cpp
+++ b/src/core/SkDraw.cpp
@@ -1321,13 +1321,15 @@ void SkDraw::drawText_asPaths(const char text[], size_t byteLength,
const SkPath* iterPath;
SkScalar xpos, prevXPos = 0;
- while ((iterPath = iter.next(&xpos)) != NULL) {
+ while (iter.next(&iterPath, &xpos)) {
matrix.postTranslate(xpos - prevXPos, 0);
- const SkPaint& pnt = iter.getPaint();
- if (fDevice) {
- fDevice->drawPath(*this, *iterPath, pnt, &matrix, false);
- } else {
- this->drawPath(*iterPath, pnt, &matrix, false);
+ if (iterPath) {
+ const SkPaint& pnt = iter.getPaint();
+ if (fDevice) {
+ fDevice->drawPath(*this, *iterPath, pnt, &matrix, false);
+ } else {
+ this->drawPath(*iterPath, pnt, &matrix, false);
+ }
}
prevXPos = xpos;
}
@@ -1999,19 +2001,21 @@ void SkDraw::drawTextOnPath(const char text[], size_t byteLength,
scaledMatrix.setScale(scale, scale);
- while ((iterPath = iter.next(&xpos)) != NULL) {
- SkPath tmp;
- SkMatrix m(scaledMatrix);
+ while (iter.next(&iterPath, &xpos)) {
+ if (iterPath) {
+ SkPath tmp;
+ SkMatrix m(scaledMatrix);
- 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);
+ 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);
+ }
}
}
}
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 5fd42881e4..ae5d0b2561 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -1353,9 +1353,11 @@ void SkPaint::getTextPath(const void* textData, size_t length,
SkScalar xpos;
const SkPath* iterPath;
- while ((iterPath = iter.next(&xpos)) != NULL) {
+ while (iter.next(&iterPath, &xpos)) {
matrix.postTranslate(xpos - prevXPos, 0);
- path->addPath(*iterPath, matrix);
+ if (iterPath) {
+ path->addPath(*iterPath, matrix);
+ }
prevXPos = xpos;
}
}
@@ -1379,9 +1381,11 @@ void SkPaint::getPosTextPath(const void* textData, size_t length,
unsigned int i = 0;
const SkPath* iterPath;
- while ((iterPath = iter.next(NULL)) != NULL) {
+ while (iter.next(&iterPath, NULL)) {
matrix.postTranslate(pos[i].fX - prevPos.fX, pos[i].fY - prevPos.fY);
- path->addPath(*iterPath, matrix);
+ if (iterPath) {
+ path->addPath(*iterPath, matrix);
+ }
prevPos = pos[i];
i++;
}
@@ -2202,7 +2206,7 @@ SkTextToPathIter::SkTextToPathIter( const char text[], size_t length,
fText = text;
fStop = text + length;
-
+
fXYIndex = paint.isVerticalText() ? 1 : 0;
}
@@ -2210,21 +2214,28 @@ SkTextToPathIter::~SkTextToPathIter() {
SkGlyphCache::AttachCache(fCache);
}
-const SkPath* SkTextToPathIter::next(SkScalar* xpos) {
- while (fText < fStop) {
+bool SkTextToPathIter::next(const SkPath** path, SkScalar* xpos) {
+ if (fText < fStop) {
const SkGlyph& glyph = fGlyphCacheProc(fCache, &fText);
fXPos += SkScalarMul(SkFixedToScalar(fPrevAdvance + fAutoKern.adjust(glyph)), fScale);
fPrevAdvance = advance(glyph, fXYIndex); // + fPaint.getTextTracking();
if (glyph.fWidth) {
- if (xpos) {
- *xpos = fXPos;
+ if (path) {
+ *path = fCache->findPath(glyph);
+ }
+ } else {
+ if (path) {
+ *path = NULL;
}
- return fCache->findPath(glyph);
}
+ if (xpos) {
+ *xpos = fXPos;
+ }
+ return true;
}
- return NULL;
+ return false;
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/SkTextToPathIter.h b/src/core/SkTextToPathIter.h
index 0d8c4b25a3..73f27ed039 100644
--- a/src/core/SkTextToPathIter.h
+++ b/src/core/SkTextToPathIter.h
@@ -22,7 +22,15 @@ public:
const SkPaint& getPaint() const { return fPaint; }
SkScalar getPathScale() const { return fScale; }
- const SkPath* next(SkScalar* xpos); //!< returns nil when there are no more paths
+ struct Rec {
+ const SkPath* fPath; // may be null for "whitespace" glyphs
+ SkScalar fXPos;
+ };
+
+ /**
+ * Returns false when all of the text has been consumed
+ */
+ bool next(const SkPath** path, SkScalar* xpos);
private:
SkGlyphCache* fCache;