Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
GlyphVector.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2022 Google LLC
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
9
12#include "src/core/SkGlyph.h"
14#include "src/core/SkStrike.h"
19
20#include <climits>
21#include <optional>
22#include <utility>
23
24class SkStrikeClient;
25
27
28namespace sktext::gpu {
29class Glyph;
30
31// -- GlyphVector ----------------------------------------------------------------------------------
33 : fStrikePromise{std::move(strikePromise)}
34 , fGlyphs{glyphs} {
35 SkASSERT(fGlyphs.size() > 0);
36}
37
40 SubRunAllocator* alloc) {
41 SkASSERT(packedIDs.size() > 0);
42 auto packedIDToVariant = [] (SkPackedGlyphID packedID) {
43 return Variant{packedID};
44 };
45
46 return GlyphVector{std::move(promise),
47 alloc->makePODArray<Variant>(packedIDs, packedIDToVariant)};
48}
49
51 const SkStrikeClient* client,
52 SubRunAllocator* alloc) {
53 std::optional<SkStrikePromise> promise =
55 if (!buffer.validate(promise.has_value())) {
56 return std::nullopt;
57 }
58
59 int32_t glyphCount = buffer.read32();
60 // Since the glyph count can never be zero. There was a buffer reading problem.
61 if (!buffer.validate(glyphCount > 0)) {
62 return std::nullopt;
63 }
64
65 // Make sure we can multiply without overflow in the check below.
66 static constexpr int kMaxCount = (int)(INT_MAX / sizeof(uint32_t));
67 if (!buffer.validate(glyphCount <= kMaxCount)) {
68 return std::nullopt;
69 }
70
71 // Check for enough bytes to populate the packedGlyphID array. If not enough something has
72 // gone wrong.
73 if (!buffer.validate(glyphCount * sizeof(uint32_t) <= buffer.available())) {
74 return std::nullopt;
75 }
76
77 Variant* variants = alloc->makePODArray<Variant>(glyphCount);
78 for (int i = 0; i < glyphCount; i++) {
79 variants[i].packedGlyphID = SkPackedGlyphID(buffer.readUInt());
80 }
81 return GlyphVector{std::move(promise.value()), SkSpan(variants, glyphCount)};
82}
83
85 // There should never be a glyph vector with zero glyphs.
86 SkASSERT(fGlyphs.size() != 0);
87 fStrikePromise.flatten(buffer);
88
89 // Write out the span of packedGlyphIDs.
90 buffer.write32(SkTo<int32_t>(fGlyphs.size()));
91 for (Variant variant : fGlyphs) {
92 buffer.writeUInt(variant.packedGlyphID.value());
93 }
94}
95
97 return SkSpan(reinterpret_cast<const Glyph**>(fGlyphs.data()), fGlyphs.size());
98}
99
100// packedGlyphIDToGlyph must be run in single-threaded mode.
101// If fSkStrike is not sk_sp<SkStrike> then the conversion to Glyph* has not happened.
103 if (fTextStrike == nullptr) {
104 SkStrike* strike = fStrikePromise.strike();
105 fTextStrike = cache->findOrCreateStrike(strike->strikeSpec());
106
107 // Get all the atlas locations for each glyph.
108 for (Variant& variant : fGlyphs) {
109 variant.glyph = fTextStrike->getGlyph(variant.packedGlyphID);
110 }
111
112 // This must be pinned for the Atlas filling to work.
113 strike->verifyPinnedStrike();
114
115 // Drop the ref to the strike so that it can be purged if needed.
116 fStrikePromise.resetStrike();
117 }
118}
119} // namespace sktext::gpu
uint16_t glyphs[5]
#define SkASSERT(cond)
Definition SkAssert.h:116
Type::kYUV Type::kRGBA() int(0.7 *637)
constexpr size_t size() const
Definition SkSpan_impl.h:95
static SkStrikeCache * GlobalStrikeCache()
void verifyPinnedStrike() const
Definition SkStrike.h:125
const SkStrikeSpec & strikeSpec() const
Definition SkStrike.h:121
static std::optional< SkStrikePromise > MakeFromBuffer(SkReadBuffer &buffer, const SkStrikeClient *client, SkStrikeCache *strikeCache)
void flatten(SkWriteBuffer &buffer) const
GlyphVector(SkStrikePromise &&strikePromise, SkSpan< Variant > glyphs)
static GlyphVector Make(SkStrikePromise &&promise, SkSpan< const SkPackedGlyphID > glyphs, SubRunAllocator *alloc)
void flatten(SkWriteBuffer &buffer) const
SkSpan< const Glyph * > glyphs() const
void packedGlyphIDToGlyph(StrikeCache *cache)
static std::optional< GlyphVector > MakeFromBuffer(SkReadBuffer &buffer, const SkStrikeClient *strikeClient, SubRunAllocator *alloc)
static const uint8_t buffer[]
Definition ref_ptr.h:256