1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 9cb93a386Sopenharmony_ci#include "include/core/SkTextBlob.h" 10cb93a386Sopenharmony_ci#include "include/utils/SkTextUtils.h" 11cb93a386Sopenharmony_ci#include "src/core/SkFontPriv.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_civoid SkTextUtils::Draw(SkCanvas* canvas, const void* text, size_t size, SkTextEncoding encoding, 14cb93a386Sopenharmony_ci SkScalar x, SkScalar y, const SkFont& font, const SkPaint& paint, 15cb93a386Sopenharmony_ci Align align) { 16cb93a386Sopenharmony_ci if (align != kLeft_Align) { 17cb93a386Sopenharmony_ci SkScalar width = font.measureText(text, size, encoding); 18cb93a386Sopenharmony_ci if (align == kCenter_Align) { 19cb93a386Sopenharmony_ci width *= 0.5f; 20cb93a386Sopenharmony_ci } 21cb93a386Sopenharmony_ci x -= width; 22cb93a386Sopenharmony_ci } 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci canvas->drawTextBlob(SkTextBlob::MakeFromText(text, size, font, encoding), x, y, paint); 25cb93a386Sopenharmony_ci} 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_civoid SkTextUtils::GetPath(const void* text, size_t length, SkTextEncoding encoding, 28cb93a386Sopenharmony_ci SkScalar x, SkScalar y, const SkFont& font, SkPath* path) { 29cb93a386Sopenharmony_ci SkAutoToGlyphs ag(font, text, length, encoding); 30cb93a386Sopenharmony_ci SkAutoTArray<SkPoint> pos(ag.count()); 31cb93a386Sopenharmony_ci font.getPos(ag.glyphs(), ag.count(), pos.get(), {x, y}); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci struct Rec { 34cb93a386Sopenharmony_ci SkPath* fDst; 35cb93a386Sopenharmony_ci const SkPoint* fPos; 36cb93a386Sopenharmony_ci } rec = { path, pos.get() }; 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_ci path->reset(); 39cb93a386Sopenharmony_ci font.getPaths(ag.glyphs(), ag.count(), [](const SkPath* src, const SkMatrix& mx, void* ctx) { 40cb93a386Sopenharmony_ci Rec* rec = (Rec*)ctx; 41cb93a386Sopenharmony_ci if (src) { 42cb93a386Sopenharmony_ci SkMatrix m(mx); 43cb93a386Sopenharmony_ci m.postTranslate(rec->fPos->fX, rec->fPos->fY); 44cb93a386Sopenharmony_ci rec->fDst->addPath(*src, m); 45cb93a386Sopenharmony_ci } 46cb93a386Sopenharmony_ci rec->fPos += 1; 47cb93a386Sopenharmony_ci }, &rec); 48cb93a386Sopenharmony_ci} 49cb93a386Sopenharmony_ci 50