Coverage Report

Created: 2025-07-07 10:01

/work/workdir/UnpackedTarball/harfbuzz/src/hb-ot-shaper-vowel-constraints.cc
Line
Count
Source (jump to first uncovered line)
1
/* == Start of generated functions == */
2
/*
3
 * The following functions are generated by running:
4
 *
5
 *   ./gen-vowel-constraints.py ms-use/IndicShapingInvalidCluster.txt Scripts.txt
6
 *
7
 * on files with these headers:
8
 *
9
 * # IndicShapingInvalidCluster.txt
10
 * # Date: 2015-03-12, 21:17:00 GMT [AG]
11
 * # Date: 2019-11-08, 23:22:00 GMT [AG]
12
 *
13
 * # Scripts-16.0.0.txt
14
 * # Date: 2024-04-30, 21:48:40 GMT
15
 */
16
17
#include "hb.hh"
18
19
#ifndef HB_NO_OT_SHAPE
20
21
#include "hb-ot-shaper-vowel-constraints.hh"
22
23
static void
24
_output_dotted_circle (hb_buffer_t *buffer)
25
0
{
26
0
  (void) buffer->output_glyph (0x25CCu);
27
0
  _hb_glyph_info_clear_continuation (&buffer->prev());
28
0
}
29
30
static void
31
_output_with_dotted_circle (hb_buffer_t *buffer)
32
0
{
33
0
  _output_dotted_circle (buffer);
34
0
  (void) buffer->next_glyph ();
35
0
}
36
37
void
38
_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
39
               hb_buffer_t              *buffer,
40
               hb_font_t                *font HB_UNUSED)
41
0
{
42
#ifdef HB_NO_OT_SHAPER_VOWEL_CONSTRAINTS
43
  return;
44
#endif
45
0
  if (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)
46
0
    return;
47
48
  /* UGLY UGLY UGLY business of adding dotted-circle in the middle of
49
   * vowel-sequences that look like another vowel.  Data for each script
50
   * collected from the USE script development spec.
51
   *
52
   * https://github.com/harfbuzz/harfbuzz/issues/1019
53
   */
54
0
  buffer->clear_output ();
55
0
  unsigned int count = buffer->len;
56
0
  switch ((unsigned) buffer->props.script)
57
0
  {
58
0
    case HB_SCRIPT_DEVANAGARI:
59
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
60
0
      {
61
0
  bool matched = false;
62
0
  switch (buffer->cur ().codepoint)
63
0
  {
64
0
    case 0x0905u:
65
0
      switch (buffer->cur (1).codepoint)
66
0
      {
67
0
        case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u:
68
0
        case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu:
69
0
        case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u:
70
0
    matched = true;
71
0
    break;
72
0
      }
73
0
      break;
74
0
    case 0x0906u:
75
0
      switch (buffer->cur (1).codepoint)
76
0
      {
77
0
        case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u:
78
0
        case 0x0948u:
79
0
    matched = true;
80
0
    break;
81
0
      }
82
0
      break;
83
0
    case 0x0909u:
84
0
      matched = 0x0941u == buffer->cur (1).codepoint;
85
0
      break;
86
0
    case 0x090Fu:
87
0
      switch (buffer->cur (1).codepoint)
88
0
      {
89
0
        case 0x0945u: case 0x0946u: case 0x0947u:
90
0
    matched = true;
91
0
    break;
92
0
      }
93
0
      break;
94
0
    case 0x0930u:
95
0
      if (0x094Du == buffer->cur (1).codepoint &&
96
0
    buffer->idx + 2 < count &&
97
0
    0x0907u == buffer->cur (2).codepoint)
98
0
      {
99
0
        (void) buffer->next_glyph ();
100
0
        matched = true;
101
0
      }
102
0
      break;
103
0
  }
104
0
  (void) buffer->next_glyph ();
105
0
  if (matched) _output_with_dotted_circle (buffer);
106
0
      }
107
0
      break;
108
109
0
    case HB_SCRIPT_BENGALI:
110
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
111
0
      {
112
0
  bool matched = false;
113
0
  switch (buffer->cur ().codepoint)
114
0
  {
115
0
    case 0x0985u:
116
0
      matched = 0x09BEu == buffer->cur (1).codepoint;
117
0
      break;
118
0
    case 0x098Bu:
119
0
      matched = 0x09C3u == buffer->cur (1).codepoint;
120
0
      break;
121
0
    case 0x098Cu:
122
0
      matched = 0x09E2u == buffer->cur (1).codepoint;
123
0
      break;
124
0
  }
125
0
  (void) buffer->next_glyph ();
126
0
  if (matched) _output_with_dotted_circle (buffer);
127
0
      }
128
0
      break;
129
130
0
    case HB_SCRIPT_GURMUKHI:
131
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
132
0
      {
133
0
  bool matched = false;
134
0
  switch (buffer->cur ().codepoint)
135
0
  {
136
0
    case 0x0A05u:
137
0
      switch (buffer->cur (1).codepoint)
138
0
      {
139
0
        case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu:
140
0
    matched = true;
141
0
    break;
142
0
      }
143
0
      break;
144
0
    case 0x0A72u:
145
0
      switch (buffer->cur (1).codepoint)
146
0
      {
147
0
        case 0x0A3Fu: case 0x0A40u: case 0x0A47u:
148
0
    matched = true;
149
0
    break;
150
0
      }
151
0
      break;
152
0
    case 0x0A73u:
153
0
      switch (buffer->cur (1).codepoint)
154
0
      {
155
0
        case 0x0A41u: case 0x0A42u: case 0x0A4Bu:
156
0
    matched = true;
157
0
    break;
158
0
      }
159
0
      break;
160
0
  }
161
0
  (void) buffer->next_glyph ();
162
0
  if (matched) _output_with_dotted_circle (buffer);
163
0
      }
164
0
      break;
165
166
0
    case HB_SCRIPT_GUJARATI:
167
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
168
0
      {
169
0
  bool matched = false;
170
0
  switch (buffer->cur ().codepoint)
171
0
  {
172
0
    case 0x0A85u:
173
0
      switch (buffer->cur (1).codepoint)
174
0
      {
175
0
        case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u:
176
0
        case 0x0AC9u: case 0x0ACBu: case 0x0ACCu:
177
0
    matched = true;
178
0
    break;
179
0
      }
180
0
      break;
181
0
    case 0x0AC5u:
182
0
      matched = 0x0ABEu == buffer->cur (1).codepoint;
183
0
      break;
184
0
  }
185
0
  (void) buffer->next_glyph ();
186
0
  if (matched) _output_with_dotted_circle (buffer);
187
0
      }
188
0
      break;
189
190
0
    case HB_SCRIPT_ORIYA:
191
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
192
0
      {
193
0
  bool matched = false;
194
0
  switch (buffer->cur ().codepoint)
195
0
  {
196
0
    case 0x0B05u:
197
0
      matched = 0x0B3Eu == buffer->cur (1).codepoint;
198
0
      break;
199
0
    case 0x0B0Fu: case 0x0B13u:
200
0
      matched = 0x0B57u == buffer->cur (1).codepoint;
201
0
      break;
202
0
  }
203
0
  (void) buffer->next_glyph ();
204
0
  if (matched) _output_with_dotted_circle (buffer);
205
0
      }
206
0
      break;
207
208
0
    case HB_SCRIPT_TAMIL:
209
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
210
0
      {
211
0
  bool matched = false;
212
0
  if (0x0B85u == buffer->cur ().codepoint &&
213
0
      0x0BC2u == buffer->cur (1).codepoint)
214
0
  {
215
0
    matched = true;
216
0
  }
217
0
  (void) buffer->next_glyph ();
218
0
  if (matched) _output_with_dotted_circle (buffer);
219
0
      }
220
0
      break;
221
222
0
    case HB_SCRIPT_TELUGU:
223
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
224
0
      {
225
0
  bool matched = false;
226
0
  switch (buffer->cur ().codepoint)
227
0
  {
228
0
    case 0x0C12u:
229
0
      switch (buffer->cur (1).codepoint)
230
0
      {
231
0
        case 0x0C4Cu: case 0x0C55u:
232
0
    matched = true;
233
0
    break;
234
0
      }
235
0
      break;
236
0
    case 0x0C3Fu: case 0x0C46u: case 0x0C4Au:
237
0
      matched = 0x0C55u == buffer->cur (1).codepoint;
238
0
      break;
239
0
  }
240
0
  (void) buffer->next_glyph ();
241
0
  if (matched) _output_with_dotted_circle (buffer);
242
0
      }
243
0
      break;
244
245
0
    case HB_SCRIPT_KANNADA:
246
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
247
0
      {
248
0
  bool matched = false;
249
0
  switch (buffer->cur ().codepoint)
250
0
  {
251
0
    case 0x0C89u: case 0x0C8Bu:
252
0
      matched = 0x0CBEu == buffer->cur (1).codepoint;
253
0
      break;
254
0
    case 0x0C92u:
255
0
      matched = 0x0CCCu == buffer->cur (1).codepoint;
256
0
      break;
257
0
  }
258
0
  (void) buffer->next_glyph ();
259
0
  if (matched) _output_with_dotted_circle (buffer);
260
0
      }
261
0
      break;
262
263
0
    case HB_SCRIPT_MALAYALAM:
264
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
265
0
      {
266
0
  bool matched = false;
267
0
  switch (buffer->cur ().codepoint)
268
0
  {
269
0
    case 0x0D07u: case 0x0D09u:
270
0
      matched = 0x0D57u == buffer->cur (1).codepoint;
271
0
      break;
272
0
    case 0x0D0Eu:
273
0
      matched = 0x0D46u == buffer->cur (1).codepoint;
274
0
      break;
275
0
    case 0x0D12u:
276
0
      switch (buffer->cur (1).codepoint)
277
0
      {
278
0
        case 0x0D3Eu: case 0x0D57u:
279
0
    matched = true;
280
0
    break;
281
0
      }
282
0
      break;
283
0
  }
284
0
  (void) buffer->next_glyph ();
285
0
  if (matched) _output_with_dotted_circle (buffer);
286
0
      }
287
0
      break;
288
289
0
    case HB_SCRIPT_SINHALA:
290
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
291
0
      {
292
0
  bool matched = false;
293
0
  switch (buffer->cur ().codepoint)
294
0
  {
295
0
    case 0x0D85u:
296
0
      switch (buffer->cur (1).codepoint)
297
0
      {
298
0
        case 0x0DCFu: case 0x0DD0u: case 0x0DD1u:
299
0
    matched = true;
300
0
    break;
301
0
      }
302
0
      break;
303
0
    case 0x0D8Bu: case 0x0D8Fu: case 0x0D94u:
304
0
      matched = 0x0DDFu == buffer->cur (1).codepoint;
305
0
      break;
306
0
    case 0x0D8Du:
307
0
      matched = 0x0DD8u == buffer->cur (1).codepoint;
308
0
      break;
309
0
    case 0x0D91u:
310
0
      switch (buffer->cur (1).codepoint)
311
0
      {
312
0
        case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
313
0
        case 0x0DDDu: case 0x0DDEu:
314
0
    matched = true;
315
0
    break;
316
0
      }
317
0
      break;
318
0
  }
319
0
  (void) buffer->next_glyph ();
320
0
  if (matched) _output_with_dotted_circle (buffer);
321
0
      }
322
0
      break;
323
324
0
    case HB_SCRIPT_BRAHMI:
325
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
326
0
      {
327
0
  bool matched = false;
328
0
  switch (buffer->cur ().codepoint)
329
0
  {
330
0
    case 0x11005u:
331
0
      matched = 0x11038u == buffer->cur (1).codepoint;
332
0
      break;
333
0
    case 0x1100Bu:
334
0
      matched = 0x1103Eu == buffer->cur (1).codepoint;
335
0
      break;
336
0
    case 0x1100Fu:
337
0
      matched = 0x11042u == buffer->cur (1).codepoint;
338
0
      break;
339
0
  }
340
0
  (void) buffer->next_glyph ();
341
0
  if (matched) _output_with_dotted_circle (buffer);
342
0
      }
343
0
      break;
344
345
0
    case HB_SCRIPT_KHOJKI:
346
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
347
0
      {
348
0
  bool matched = false;
349
0
  switch (buffer->cur ().codepoint)
350
0
  {
351
0
    case 0x11200u:
352
0
      switch (buffer->cur (1).codepoint)
353
0
      {
354
0
        case 0x1122Cu: case 0x11231u: case 0x11233u:
355
0
    matched = true;
356
0
    break;
357
0
      }
358
0
      break;
359
0
    case 0x11206u:
360
0
      matched = 0x1122Cu == buffer->cur (1).codepoint;
361
0
      break;
362
0
    case 0x1122Cu:
363
0
      switch (buffer->cur (1).codepoint)
364
0
      {
365
0
        case 0x11230u: case 0x11231u:
366
0
    matched = true;
367
0
    break;
368
0
      }
369
0
      break;
370
0
    case 0x11240u:
371
0
      matched = 0x1122Eu == buffer->cur (1).codepoint;
372
0
      break;
373
0
  }
374
0
  (void) buffer->next_glyph ();
375
0
  if (matched) _output_with_dotted_circle (buffer);
376
0
      }
377
0
      break;
378
379
0
    case HB_SCRIPT_KHUDAWADI:
380
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
381
0
      {
382
0
  bool matched = false;
383
0
  switch (buffer->cur ().codepoint)
384
0
  {
385
0
    case 0x112B0u:
386
0
      switch (buffer->cur (1).codepoint)
387
0
      {
388
0
        case 0x112E0u: case 0x112E5u: case 0x112E6u: case 0x112E7u:
389
0
        case 0x112E8u:
390
0
    matched = true;
391
0
    break;
392
0
      }
393
0
      break;
394
0
  }
395
0
  (void) buffer->next_glyph ();
396
0
  if (matched) _output_with_dotted_circle (buffer);
397
0
      }
398
0
      break;
399
400
0
    case HB_SCRIPT_TIRHUTA:
401
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
402
0
      {
403
0
  bool matched = false;
404
0
  switch (buffer->cur ().codepoint)
405
0
  {
406
0
    case 0x11481u:
407
0
      matched = 0x114B0u == buffer->cur (1).codepoint;
408
0
      break;
409
0
    case 0x1148Bu: case 0x1148Du:
410
0
      matched = 0x114BAu == buffer->cur (1).codepoint;
411
0
      break;
412
0
    case 0x114AAu:
413
0
      switch (buffer->cur (1).codepoint)
414
0
      {
415
0
        case 0x114B5u: case 0x114B6u:
416
0
    matched = true;
417
0
    break;
418
0
      }
419
0
      break;
420
0
  }
421
0
  (void) buffer->next_glyph ();
422
0
  if (matched) _output_with_dotted_circle (buffer);
423
0
      }
424
0
      break;
425
426
0
    case HB_SCRIPT_MODI:
427
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
428
0
      {
429
0
  bool matched = false;
430
0
  switch (buffer->cur ().codepoint)
431
0
  {
432
0
    case 0x11600u: case 0x11601u:
433
0
      switch (buffer->cur (1).codepoint)
434
0
      {
435
0
        case 0x11639u: case 0x1163Au:
436
0
    matched = true;
437
0
    break;
438
0
      }
439
0
      break;
440
0
  }
441
0
  (void) buffer->next_glyph ();
442
0
  if (matched) _output_with_dotted_circle (buffer);
443
0
      }
444
0
      break;
445
446
0
    case HB_SCRIPT_TAKRI:
447
0
      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
448
0
      {
449
0
  bool matched = false;
450
0
  switch (buffer->cur ().codepoint)
451
0
  {
452
0
    case 0x11680u:
453
0
      switch (buffer->cur (1).codepoint)
454
0
      {
455
0
        case 0x116ADu: case 0x116B4u: case 0x116B5u:
456
0
    matched = true;
457
0
    break;
458
0
      }
459
0
      break;
460
0
    case 0x11686u:
461
0
      matched = 0x116B2u == buffer->cur (1).codepoint;
462
0
      break;
463
0
  }
464
0
  (void) buffer->next_glyph ();
465
0
  if (matched) _output_with_dotted_circle (buffer);
466
0
      }
467
0
      break;
468
469
0
    default:
470
0
      break;
471
0
  }
472
0
  buffer->sync ();
473
0
}
474
475
476
#endif
477
/* == End of generated functions == */