| Index: src/core/SkDraw.cpp
|
| ===================================================================
|
| --- src/core/SkDraw.cpp (revision 12664)
|
| +++ src/core/SkDraw.cpp (working copy)
|
| @@ -1841,19 +1841,16 @@
|
| // e.g. subpixel doesn't round
|
| typedef void (*AlignProc)(const SkPoint&, const SkGlyph&, SkIPoint*);
|
|
|
| -static void leftAlignProc(const SkPoint& loc, const SkGlyph& glyph,
|
| - SkIPoint* dst) {
|
| +static void leftAlignProc(const SkPoint& loc, const SkGlyph& glyph, SkIPoint* dst) {
|
| dst->set(SkScalarToFixed(loc.fX), SkScalarToFixed(loc.fY));
|
| }
|
|
|
| -static void centerAlignProc(const SkPoint& loc, const SkGlyph& glyph,
|
| - SkIPoint* dst) {
|
| +static void centerAlignProc(const SkPoint& loc, const SkGlyph& glyph, SkIPoint* dst) {
|
| dst->set(SkScalarToFixed(loc.fX) - (glyph.fAdvanceX >> 1),
|
| SkScalarToFixed(loc.fY) - (glyph.fAdvanceY >> 1));
|
| }
|
|
|
| -static void rightAlignProc(const SkPoint& loc, const SkGlyph& glyph,
|
| - SkIPoint* dst) {
|
| +static void rightAlignProc(const SkPoint& loc, const SkGlyph& glyph, SkIPoint* dst) {
|
| dst->set(SkScalarToFixed(loc.fX) - glyph.fAdvanceX,
|
| SkScalarToFixed(loc.fY) - glyph.fAdvanceY);
|
| }
|
| @@ -1868,6 +1865,32 @@
|
| return gProcs[align];
|
| }
|
|
|
| +typedef void (*AlignProc_scalar)(const SkPoint&, const SkGlyph&, SkPoint*);
|
| +
|
| +static void leftAlignProc_scalar(const SkPoint& loc, const SkGlyph& glyph, SkPoint* dst) {
|
| + dst->set(loc.fX, loc.fY);
|
| +}
|
| +
|
| +static void centerAlignProc_scalar(const SkPoint& loc, const SkGlyph& glyph, SkPoint* dst) {
|
| + dst->set(loc.fX - SkFixedToScalar(glyph.fAdvanceX >> 1),
|
| + loc.fY - SkFixedToScalar(glyph.fAdvanceY >> 1));
|
| +}
|
| +
|
| +static void rightAlignProc_scalar(const SkPoint& loc, const SkGlyph& glyph, SkPoint* dst) {
|
| + dst->set(loc.fX - SkFixedToScalar(glyph.fAdvanceX),
|
| + loc.fY - SkFixedToScalar(glyph.fAdvanceY));
|
| +}
|
| +
|
| +static AlignProc_scalar pick_align_proc_scalar(SkPaint::Align align) {
|
| + static const AlignProc_scalar gProcs[] = {
|
| + leftAlignProc_scalar, centerAlignProc_scalar, rightAlignProc_scalar
|
| + };
|
| +
|
| + SkASSERT((unsigned)align < SK_ARRAY_COUNT(gProcs));
|
| +
|
| + return gProcs[align];
|
| +}
|
| +
|
| class TextMapState {
|
| public:
|
| mutable SkPoint fLoc;
|
| @@ -1944,7 +1967,7 @@
|
| SkGlyphCache* cache = autoCache.getCache();
|
|
|
| const char* stop = text + byteLength;
|
| - AlignProc alignProc = pick_align_proc(paint.getTextAlign());
|
| + AlignProc_scalar alignProc = pick_align_proc_scalar(paint.getTextAlign());
|
| TextMapState tms(SkMatrix::I(), constY);
|
| TextMapState::Proc tmsProc = tms.pickProc(scalarsPerPosition);
|
|
|
| @@ -1954,11 +1977,11 @@
|
| const SkPath* path = cache->findPath(glyph);
|
| if (path) {
|
| tmsProc(tms, pos);
|
| - SkIPoint fixedLoc;
|
| - alignProc(tms.fLoc, glyph, &fixedLoc);
|
| + SkPoint loc;
|
| + alignProc(tms.fLoc, glyph, &loc);
|
|
|
| - matrix[SkMatrix::kMTransX] = SkFixedToScalar(fixedLoc.fX);
|
| - matrix[SkMatrix::kMTransY] = SkFixedToScalar(fixedLoc.fY);
|
| + matrix[SkMatrix::kMTransX] = loc.fX;
|
| + matrix[SkMatrix::kMTransY] = loc.fY;
|
| if (fDevice) {
|
| fDevice->drawPath(*this, *path, paint, &matrix, false);
|
| } else {
|
|
|