/* * 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 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); }