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