59 {
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 int emSize;
91
93
94 std::vector<SkGlyphID> glyphIDs;
96 glyphIDs.push_back(
SkToU16(index));
97 });
99
100
101 auto advances = std::unique_ptr<SkScalar[]>(
new SkScalar[
glyphs.size()]);
102
103
104
105
106 size_t numIntAdvances = 0;
109 if ((int32_t)currentAdvance == currentAdvance) {
110 advances[numIntAdvances++] = currentAdvance;
111 }
112 }
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;
116
117
118 for (
size_t i = 0; i <
glyphs.size(); ++i) {
120 }
121
122 for (
size_t i = 0; i <
glyphs.size(); ++i) {
124
125
126 if (advance == modeAdvance) {
127 continue;
128 }
129
130
131 {
132 size_t j = i + 1;
133 for (; j <
glyphs.size(); ++j) {
134 SkScalar next_advance = advances[j];
135 if (advance != next_advance) {
136 break;
137 }
138 }
139 if (j - i >= 2) {
142 result->appendScalar(advance);
143 i = j - 1;
144 continue;
145 }
146 }
147
148 {
151 advanceArray->appendScalar(advance);
152 size_t j = i + 1;
153 for (; j <
glyphs.size(); ++j) {
154 advance = advances[j];
155
156
157 if (advance == modeAdvance) {
158 break;
159 }
160
161 int dontCares =
glyphs[j]->getGlyphID() -
glyphs[j - 1]->getGlyphID() - 1;
162
163 if (dontCares >= 4) {
164 break;
165 }
166
168
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) {
173 break;
174 }
175 }
176
177
178 if (j + 2 <
glyphs.size() && advance == next_advance) {
179 next_advance = advances[j+2];
180 if (advance == next_advance) {
181 break;
182 }
183 }
184
185 while (dontCares --> 0) {
186 advanceArray->appendScalar(0);
187 }
188 advanceArray->appendScalar(advance);
189 }
190 result->appendObject(std::move(advanceArray));
191 i = j - 1;
192 }
193 }
194
196}
static SkScalar from_font_units(SkScalar scaled, uint16_t emSize)
static std::unique_ptr< SkPDFArray > SkPDFMakeArray(Args... args)
constexpr uint16_t SkToU16(S x)
void getSetValues(FN f) const
static SkStrikeSpec MakePDFVector(const SkTypeface &typeface, int *size)