|  | /* | 
|  | * Copyright 2018 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "include/core/SkPath.h" | 
|  | #include "include/core/SkTextBlob.h" | 
|  | #include "include/utils/SkTextUtils.h" | 
|  | #include "src/core/SkFontPriv.h" | 
|  |  | 
|  | void SkTextUtils::Draw(SkCanvas* canvas, const void* text, size_t size, SkTextEncoding encoding, | 
|  | SkScalar x, SkScalar y, const SkFont& font, const SkPaint& paint, | 
|  | Align align) { | 
|  | if (align != kLeft_Align) { | 
|  | SkScalar width = font.measureText(text, size, encoding); | 
|  | if (align == kCenter_Align) { | 
|  | width *= 0.5f; | 
|  | } | 
|  | x -= width; | 
|  | } | 
|  |  | 
|  | canvas->drawTextBlob(SkTextBlob::MakeFromText(text, size, font, encoding), x, y, paint); | 
|  | } | 
|  |  | 
|  | void SkTextUtils::GetPath(const void* text, size_t length, SkTextEncoding encoding, | 
|  | SkScalar x, SkScalar y, const SkFont& font, SkPath* path) { | 
|  | SkAutoToGlyphs ag(font, text, length, encoding); | 
|  | SkAutoTArray<SkPoint> pos(ag.count()); | 
|  | font.getPos(ag.glyphs(), ag.count(), pos.get(), {x, y}); | 
|  |  | 
|  | struct Rec { | 
|  | SkPath* fDst; | 
|  | const SkPoint* fPos; | 
|  | } rec = { path, pos.get() }; | 
|  |  | 
|  | path->reset(); | 
|  | font.getPaths(ag.glyphs(), ag.count(), [](const SkPath* src, const SkMatrix& mx, void* ctx) { | 
|  | Rec* rec = (Rec*)ctx; | 
|  | if (src) { | 
|  | SkMatrix m(mx); | 
|  | m.postTranslate(rec->fPos->fX, rec->fPos->fY); | 
|  | rec->fDst->addPath(*src, m); | 
|  | } | 
|  | rec->fPos += 1; | 
|  | }, &rec); | 
|  | } | 
|  |  |