59 int32_t* defaultAdvance) {
94 std::vector<SkGlyphID> glyphIDs;
96 glyphIDs.push_back(
SkToU16(index));
101 auto advances = std::unique_ptr<SkScalar[]>(
new SkScalar[
glyphs.size()]);
106 size_t numIntAdvances = 0;
109 if ((int32_t)currentAdvance == currentAdvance) {
110 advances[numIntAdvances++] = currentAdvance;
113 std::sort(advances.get(), advances.get() + numIntAdvances);
114 int32_t modeAdvance = (int32_t)find_mode_or_0(
SkSpan(advances.get(), numIntAdvances));
115 *defaultAdvance = modeAdvance;
118 for (
size_t i = 0; i <
glyphs.size(); ++i) {
122 for (
size_t i = 0; i <
glyphs.size(); ++i) {
126 if (advance == modeAdvance) {
133 for (; j <
glyphs.size(); ++j) {
134 SkScalar next_advance = advances[j];
135 if (advance != next_advance) {
142 result->appendScalar(advance);
151 advanceArray->appendScalar(advance);
153 for (; j <
glyphs.size(); ++j) {
154 advance = advances[j];
157 if (advance == modeAdvance) {
161 int dontCares =
glyphs[j]->getGlyphID() -
glyphs[j - 1]->getGlyphID() - 1;
163 if (dontCares >= 4) {
169 if (j + 1 <
glyphs.size()) {
170 next_advance = advances[j+1];
171 int next_dontCares =
glyphs[j+1]->getGlyphID() -
glyphs[j]->getGlyphID() - 1;
172 if (advance == next_advance && dontCares + next_dontCares >= 4) {
178 if (j + 2 <
glyphs.size() && advance == next_advance) {
179 next_advance = advances[j+2];
180 if (advance == next_advance) {
185 while (dontCares --> 0) {
186 advanceArray->appendScalar(0);
188 advanceArray->appendScalar(advance);
190 result->appendObject(std::move(advanceArray));