| | Line | Source Code | Coverage | 
|---|
 | 1 | /* | - |  | 2 | * Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies) | - |  | 3 | * | - |  | 4 | * This is part of HarfBuzz, an OpenType Layout engine library. | - |  | 5 | * | - |  | 6 | * Permission is hereby granted, without written agreement and without | - |  | 7 | * license or royalty fees, to use, copy, modify, and distribute this | - |  | 8 | * software and its documentation for any purpose, provided that the | - |  | 9 | * above copyright notice and the following two paragraphs appear in | - |  | 10 | * all copies of this software. | - |  | 11 | * | - |  | 12 | * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR | - |  | 13 | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES | - |  | 14 | * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN | - |  | 15 | * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | - |  | 16 | * DAMAGE. | - |  | 17 | * | - |  | 18 | * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, | - |  | 19 | * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | - |  | 20 | * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS | - |  | 21 | * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO | - |  | 22 | * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | - |  | 23 | */ | - |  | 24 |  | - |  | 25 | #include "harfbuzz-shaper.h" | - |  | 26 | #include "harfbuzz-shaper-private.h" | - |  | 27 | #include <assert.h> | - |  | 28 |  | - |  | 29 | #ifndef NO_OPENTYPE | - |  | 30 | static const HB_OpenTypeFeature greek_features[] = { | - |  | 31 | { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, | - |  | 32 | { HB_MAKE_TAG('l', 'i', 'g', 'a'), CcmpProperty }, | - |  | 33 | { HB_MAKE_TAG('c', 'l', 'i', 'g'), CcmpProperty }, | - |  | 34 | {0, 0} | - |  | 35 | }; | - |  | 36 | #endif | - |  | 37 |  | - |  | 38 | /* | - |  | 39 | Greek decompositions | - |  | 40 | */ | - |  | 41 |  | - |  | 42 |  | - |  | 43 | typedef struct _hb_greek_decomposition { | - |  | 44 | HB_UChar16 composed; | - |  | 45 | HB_UChar16 base; | - |  | 46 | } hb_greek_decomposition; | - |  | 47 |  | - |  | 48 | static const hb_greek_decomposition decompose_0x300[] = { | - |  | 49 | { 0x1FBA, 0x0391 }, | - |  | 50 | { 0x1FC8, 0x0395 }, | - |  | 51 | { 0x1FCA, 0x0397 }, | - |  | 52 | { 0x1FDA, 0x0399 }, | - |  | 53 | { 0x1FF8, 0x039F }, | - |  | 54 | { 0x1FEA, 0x03A5 }, | - |  | 55 | { 0x1FFA, 0x03A9 }, | - |  | 56 | { 0x1F70, 0x03B1 }, | - |  | 57 | { 0x1F72, 0x03B5 }, | - |  | 58 | { 0x1F74, 0x03B7 }, | - |  | 59 | { 0x1F76, 0x03B9 }, | - |  | 60 | { 0x1F78, 0x03BF }, | - |  | 61 | { 0x1F7A, 0x03C5 }, | - |  | 62 | { 0x1F7C, 0x03C9 }, | - |  | 63 | { 0x1FD2, 0x03CA }, | - |  | 64 | { 0x1FE2, 0x03CB }, | - |  | 65 | { 0x1F02, 0x1F00 }, | - |  | 66 | { 0, 0 } | - |  | 67 | }; | - |  | 68 |  | - |  | 69 | static HB_UChar16 compose_0x300(HB_UChar16 base) | - |  | 70 | { | - |  | 71 | if ((base ^ 0x1f00) < 0x100) { never evaluated: (base ^ 0x1f00) < 0x100 | 0 |  | 72 | if (base <= 0x1f69 && !(base & 0x6)) never evaluated: base <= 0x1f69 never evaluated: !(base & 0x6) | 0 |  | 73 | return base + 2; never executed: return base + 2; | 0 |  | 74 | if (base == 0x1fbf) never evaluated: base == 0x1fbf | 0 |  | 75 | return 0x1fcd; never executed: return 0x1fcd; | 0 |  | 76 | if (base == 0x1ffe) never evaluated: base == 0x1ffe | 0 |  | 77 | return 0x1fdd; never executed: return 0x1fdd; | 0 |  | 78 | return 0; never executed: return 0; | 0 |  | 79 | } | - |  | 80 | { | - |  | 81 | const hb_greek_decomposition *d = decompose_0x300; never executed (the execution status of this line is deduced):  const hb_greek_decomposition *d = decompose_0x300; | - |  | 82 | while (d->base && d->base != base) never evaluated: d->base never evaluated: d->base != base | 0 |  | 83 | ++d; | 0 |  | 84 | return d->composed; never executed: return d->composed; | 0 |  | 85 | } | - |  | 86 | } | - |  | 87 |  | - |  | 88 | static const hb_greek_decomposition decompose_0x301[] = { | - |  | 89 | { 0x0386, 0x0391 }, | - |  | 90 | { 0x0388, 0x0395 }, | - |  | 91 | { 0x0389, 0x0397 }, | - |  | 92 | { 0x038A, 0x0399 }, | - |  | 93 | { 0x038C, 0x039F }, | - |  | 94 | { 0x038E, 0x03A5 }, | - |  | 95 | { 0x038F, 0x03A9 }, | - |  | 96 | { 0x03AC, 0x03B1 }, | - |  | 97 | { 0x03AD, 0x03B5 }, | - |  | 98 | { 0x03AE, 0x03B7 }, | - |  | 99 | { 0x03AF, 0x03B9 }, | - |  | 100 | { 0x03CC, 0x03BF }, | - |  | 101 | { 0x03CD, 0x03C5 }, | - |  | 102 | { 0x03CE, 0x03C9 }, | - |  | 103 | { 0x0390, 0x03CA }, | - |  | 104 | { 0x03B0, 0x03CB }, | - |  | 105 | { 0x03D3, 0x03D2 }, | - |  | 106 | { 0, 0 } | - |  | 107 | }; | - |  | 108 |  | - |  | 109 |  | - |  | 110 | static HB_UChar16 compose_0x301(HB_UChar16 base) | - |  | 111 | { | - |  | 112 | if ((base ^ 0x1f00) < 0x100) { never evaluated: (base ^ 0x1f00) < 0x100 | 0 |  | 113 | if (base <= 0x1f69 && !(base & 0x6)) never evaluated: base <= 0x1f69 never evaluated: !(base & 0x6) | 0 |  | 114 | return base + 4; never executed: return base + 4; | 0 |  | 115 | if (base == 0x1fbf) never evaluated: base == 0x1fbf | 0 |  | 116 | return 0x1fce; never executed: return 0x1fce; | 0 |  | 117 | if (base == 0x1ffe) never evaluated: base == 0x1ffe | 0 |  | 118 | return 0x1fde; never executed: return 0x1fde; | 0 |  | 119 | } | 0 |  | 120 | { | - |  | 121 | const hb_greek_decomposition *d = decompose_0x301; never executed (the execution status of this line is deduced):  const hb_greek_decomposition *d = decompose_0x301; | - |  | 122 | while (d->base && d->base != base) never evaluated: d->base never evaluated: d->base != base | 0 |  | 123 | ++d; | 0 |  | 124 | return d->composed; never executed: return d->composed; | 0 |  | 125 | } | - |  | 126 | } | - |  | 127 |  | - |  | 128 | static const hb_greek_decomposition decompose_0x304[] = { | - |  | 129 | { 0x1FB9, 0x0391 }, | - |  | 130 | { 0x1FD9, 0x0399 }, | - |  | 131 | { 0x1FE9, 0x03A5 }, | - |  | 132 | { 0x1FB1, 0x03B1 }, | - |  | 133 | { 0x1FD1, 0x03B9 }, | - |  | 134 | { 0x1FE1, 0x03C5 }, | - |  | 135 | { 0, 0 } | - |  | 136 | }; | - |  | 137 |  | - |  | 138 | static HB_UChar16 compose_0x304(HB_UChar16 base) | - |  | 139 | { | - |  | 140 | const hb_greek_decomposition *d = decompose_0x304; never executed (the execution status of this line is deduced):  const hb_greek_decomposition *d = decompose_0x304; | - |  | 141 | while (d->base && d->base != base) never evaluated: d->base never evaluated: d->base != base | 0 |  | 142 | ++d; | 0 |  | 143 | return d->composed; never executed: return d->composed; | 0 |  | 144 | } | - |  | 145 |  | - |  | 146 | static const hb_greek_decomposition decompose_0x306[] = { | - |  | 147 | { 0x1FB8, 0x0391 }, | - |  | 148 | { 0x1FD8, 0x0399 }, | - |  | 149 | { 0x1FE8, 0x03A5 }, | - |  | 150 | { 0x1FB0, 0x03B1 }, | - |  | 151 | { 0x1FD0, 0x03B9 }, | - |  | 152 | { 0x1FE0, 0x03C5 }, | - |  | 153 | { 0, 0 } | - |  | 154 | }; | - |  | 155 |  | - |  | 156 | static HB_UChar16 compose_0x306(HB_UChar16 base) | - |  | 157 | { | - |  | 158 | const hb_greek_decomposition *d = decompose_0x306; never executed (the execution status of this line is deduced):  const hb_greek_decomposition *d = decompose_0x306; | - |  | 159 | while (d->base && d->base != base) never evaluated: d->base never evaluated: d->base != base | 0 |  | 160 | ++d; | 0 |  | 161 | return d->composed; never executed: return d->composed; | 0 |  | 162 | } | - |  | 163 |  | - |  | 164 | static const hb_greek_decomposition decompose_0x308[] = { | - |  | 165 | { 0x03AA, 0x0399  }, | - |  | 166 | { 0x03AB, 0x03A5  }, | - |  | 167 | { 0x03CA, 0x03B9  }, | - |  | 168 | { 0x03CB, 0x03C5  }, | - |  | 169 | { 0x03D4, 0x03D2  }, | - |  | 170 | { 0, 0 } | - |  | 171 | }; | - |  | 172 |  | - |  | 173 | static HB_UChar16 compose_0x308(HB_UChar16 base) | - |  | 174 | { | - |  | 175 | const hb_greek_decomposition *d = decompose_0x308; never executed (the execution status of this line is deduced):  const hb_greek_decomposition *d = decompose_0x308; | - |  | 176 | while (d->base && d->base != base) never evaluated: d->base never evaluated: d->base != base | 0 |  | 177 | ++d; | 0 |  | 178 | return d->composed; never executed: return d->composed; | 0 |  | 179 | } | - |  | 180 |  | - |  | 181 |  | - |  | 182 | static const hb_greek_decomposition decompose_0x313[] = { | - |  | 183 | { 0x1F08, 0x0391 }, | - |  | 184 | { 0x1F18, 0x0395 }, | - |  | 185 | { 0x1F28, 0x0397 }, | - |  | 186 | { 0x1F38, 0x0399 }, | - |  | 187 | { 0x1F48, 0x039F }, | - |  | 188 | { 0x1F68, 0x03A9 }, | - |  | 189 | { 0x1F00, 0x03B1 }, | - |  | 190 | { 0x1F10, 0x03B5 }, | - |  | 191 | { 0x1F20, 0x03B7 }, | - |  | 192 | { 0x1F30, 0x03B9 }, | - |  | 193 | { 0x1F40, 0x03BF }, | - |  | 194 | { 0x1FE4, 0x03C1 }, | - |  | 195 | { 0x1F50, 0x03C5 }, | - |  | 196 | { 0x1F60, 0x03C9 }, | - |  | 197 | { 0, 0 } | - |  | 198 | }; | - |  | 199 |  | - |  | 200 | static HB_UChar16 compose_0x313(HB_UChar16 base) | - |  | 201 | { | - |  | 202 | const hb_greek_decomposition *d = decompose_0x313; never executed (the execution status of this line is deduced):  const hb_greek_decomposition *d = decompose_0x313; | - |  | 203 | while (d->base && d->base != base) never evaluated: d->base never evaluated: d->base != base | 0 |  | 204 | ++d; | 0 |  | 205 | return d->composed; never executed: return d->composed; | 0 |  | 206 | } | - |  | 207 |  | - |  | 208 | static const hb_greek_decomposition decompose_0x314[] = { | - |  | 209 | { 0x1F09, 0x0391 }, | - |  | 210 | { 0x1F19, 0x0395 }, | - |  | 211 | { 0x1F29, 0x0397 }, | - |  | 212 | { 0x1F39, 0x0399 }, | - |  | 213 | { 0x1F49, 0x039F }, | - |  | 214 | { 0x1FEC, 0x03A1 }, | - |  | 215 | { 0x1F59, 0x03A5 }, | - |  | 216 | { 0x1F69, 0x03A9 }, | - |  | 217 | { 0x1F01, 0x03B1 }, | - |  | 218 | { 0x1F11, 0x03B5 }, | - |  | 219 | { 0x1F21, 0x03B7 }, | - |  | 220 | { 0x1F31, 0x03B9 }, | - |  | 221 | { 0x1F41, 0x03BF }, | - |  | 222 | { 0x1FE5, 0x03C1 }, | - |  | 223 | { 0x1F51, 0x03C5 }, | - |  | 224 | { 0x1F61, 0x03C9 }, | - |  | 225 | { 0, 0 } | - |  | 226 | }; | - |  | 227 |  | - |  | 228 | static HB_UChar16 compose_0x314(HB_UChar16 base) | - |  | 229 | { | - |  | 230 | const hb_greek_decomposition *d = decompose_0x314; never executed (the execution status of this line is deduced):  const hb_greek_decomposition *d = decompose_0x314; | - |  | 231 | while (d->base && d->base != base) never evaluated: d->base never evaluated: d->base != base | 0 |  | 232 | ++d; | 0 |  | 233 | return d->composed; never executed: return d->composed; | 0 |  | 234 | } | - |  | 235 |  | - |  | 236 | static const hb_greek_decomposition decompose_0x342[] = { | - |  | 237 | { 0x1FB6, 0x03B1 }, | - |  | 238 | { 0x1FC6, 0x03B7 }, | - |  | 239 | { 0x1FD6, 0x03B9 }, | - |  | 240 | { 0x1FE6, 0x03C5 }, | - |  | 241 | { 0x1FF6, 0x03C9 }, | - |  | 242 | { 0x1FD7, 0x03CA }, | - |  | 243 | { 0x1FE7, 0x03CB }, | - |  | 244 | { 0x1F06, 0x1F00 }, | - |  | 245 | { 0x1F07, 0x1F01 }, | - |  | 246 | { 0x1F0E, 0x1F08 }, | - |  | 247 | { 0x1F0F, 0x1F09 }, | - |  | 248 | { 0x1F26, 0x1F20 }, | - |  | 249 | { 0x1F27, 0x1F21 }, | - |  | 250 | { 0x1F2E, 0x1F28 }, | - |  | 251 | { 0x1F2F, 0x1F29 }, | - |  | 252 | { 0x1F36, 0x1F30 }, | - |  | 253 | { 0x1F37, 0x1F31 }, | - |  | 254 | { 0x1F3E, 0x1F38 }, | - |  | 255 | { 0x1F3F, 0x1F39 }, | - |  | 256 | { 0x1F56, 0x1F50 }, | - |  | 257 | { 0x1F57, 0x1F51 }, | - |  | 258 | { 0x1F5F, 0x1F59 }, | - |  | 259 | { 0x1F66, 0x1F60 }, | - |  | 260 | { 0x1F67, 0x1F61 }, | - |  | 261 | { 0x1F6E, 0x1F68 }, | - |  | 262 | { 0x1F6F, 0x1F69 }, | - |  | 263 | { 0x1FCF, 0x1FBF }, | - |  | 264 | { 0x1FDF, 0x1FFE }, | - |  | 265 | { 0, 0 } | - |  | 266 | }; | - |  | 267 |  | - |  | 268 | static HB_UChar16 compose_0x342(HB_UChar16 base) | - |  | 269 | { | - |  | 270 | const hb_greek_decomposition *d = decompose_0x342; never executed (the execution status of this line is deduced):  const hb_greek_decomposition *d = decompose_0x342; | - |  | 271 | while (d->base && d->base != base) never evaluated: d->base never evaluated: d->base != base | 0 |  | 272 | ++d; | 0 |  | 273 | return d->composed; never executed: return d->composed; | 0 |  | 274 | } | - |  | 275 |  | - |  | 276 | static const hb_greek_decomposition decompose_0x345[] = { | - |  | 277 | { 0x1FBC, 0x0391 }, | - |  | 278 | { 0x1FCC, 0x0397 }, | - |  | 279 | { 0x1FFC, 0x03A9 }, | - |  | 280 | { 0x1FB4, 0x03AC }, | - |  | 281 | { 0x1FC4, 0x03AE }, | - |  | 282 | { 0x1FB3, 0x03B1 }, | - |  | 283 | { 0x1FC3, 0x03B7 }, | - |  | 284 | { 0x1FF3, 0x03C9 }, | - |  | 285 | { 0x1FF4, 0x03CE }, | - |  | 286 | { 0x1F80, 0x1F00 }, | - |  | 287 | { 0x1F81, 0x1F01 }, | - |  | 288 | { 0x1F82, 0x1F02 }, | - |  | 289 | { 0x1F83, 0x1F03 }, | - |  | 290 | { 0x1F84, 0x1F04 }, | - |  | 291 | { 0x1F85, 0x1F05 }, | - |  | 292 | { 0x1F86, 0x1F06 }, | - |  | 293 | { 0x1F87, 0x1F07 }, | - |  | 294 | { 0x1F88, 0x1F08 }, | - |  | 295 | { 0x1F89, 0x1F09 }, | - |  | 296 | { 0x1F8A, 0x1F0A }, | - |  | 297 | { 0x1F8B, 0x1F0B }, | - |  | 298 | { 0x1F8C, 0x1F0C }, | - |  | 299 | { 0x1F8D, 0x1F0D }, | - |  | 300 | { 0x1F8E, 0x1F0E }, | - |  | 301 | { 0x1F8F, 0x1F0F }, | - |  | 302 | { 0x1F90, 0x1F20 }, | - |  | 303 | { 0x1F91, 0x1F21 }, | - |  | 304 | { 0x1F92, 0x1F22 }, | - |  | 305 | { 0x1F93, 0x1F23 }, | - |  | 306 | { 0x1F94, 0x1F24 }, | - |  | 307 | { 0x1F95, 0x1F25 }, | - |  | 308 | { 0x1F96, 0x1F26 }, | - |  | 309 | { 0x1F97, 0x1F27 }, | - |  | 310 | { 0x1F98, 0x1F28 }, | - |  | 311 | { 0x1F99, 0x1F29 }, | - |  | 312 | { 0x1F9A, 0x1F2A }, | - |  | 313 | { 0x1F9B, 0x1F2B }, | - |  | 314 | { 0x1F9C, 0x1F2C }, | - |  | 315 | { 0x1F9D, 0x1F2D }, | - |  | 316 | { 0x1F9E, 0x1F2E }, | - |  | 317 | { 0x1F9F, 0x1F2F }, | - |  | 318 | { 0x1FA0, 0x1F60 }, | - |  | 319 | { 0x1FA1, 0x1F61 }, | - |  | 320 | { 0x1FA2, 0x1F62 }, | - |  | 321 | { 0x1FA3, 0x1F63 }, | - |  | 322 | { 0x1FA4, 0x1F64 }, | - |  | 323 | { 0x1FA5, 0x1F65 }, | - |  | 324 | { 0x1FA6, 0x1F66 }, | - |  | 325 | { 0x1FA7, 0x1F67 }, | - |  | 326 | { 0x1FA8, 0x1F68 }, | - |  | 327 | { 0x1FA9, 0x1F69 }, | - |  | 328 | { 0x1FAA, 0x1F6A }, | - |  | 329 | { 0x1FAB, 0x1F6B }, | - |  | 330 | { 0x1FAC, 0x1F6C }, | - |  | 331 | { 0x1FAD, 0x1F6D }, | - |  | 332 | { 0x1FAE, 0x1F6E }, | - |  | 333 | { 0x1FAF, 0x1F6F }, | - |  | 334 | { 0x1FB2, 0x1F70 }, | - |  | 335 | { 0x1FC2, 0x1F74 }, | - |  | 336 | { 0x1FF2, 0x1F7C }, | - |  | 337 | { 0x1FB7, 0x1FB6 }, | - |  | 338 | { 0x1FC7, 0x1FC6 }, | - |  | 339 | { 0x1FF7, 0x1FF6 }, | - |  | 340 | { 0, 0 } | - |  | 341 | }; | - |  | 342 |  | - |  | 343 | static HB_UChar16 compose_0x345(HB_UChar16 base) | - |  | 344 | { | - |  | 345 | const hb_greek_decomposition *d = decompose_0x345; never executed (the execution status of this line is deduced):  const hb_greek_decomposition *d = decompose_0x345; | - |  | 346 | while (d->base && d->base != base) never evaluated: d->base never evaluated: d->base != base | 0 |  | 347 | ++d; | 0 |  | 348 | return d->composed; never executed: return d->composed; | 0 |  | 349 | } | - |  | 350 |  | - |  | 351 | /* | - |  | 352 | Greek shaping. Heuristic positioning can't render polytonic greek correctly. We're a lot | - |  | 353 | better off mapping greek chars with diacritics to the characters in the extended greek | - |  | 354 | region in Unicode if possible. | - |  | 355 | */ | - |  | 356 | HB_Bool HB_GreekShape(HB_ShaperItem *shaper_item) | - |  | 357 | { | - |  | 358 | const int availableGlyphs = shaper_item->num_glyphs; executed (the execution status of this line is deduced):  const int availableGlyphs = shaper_item->num_glyphs; | - |  | 359 | const HB_UChar16 *uc = shaper_item->string + shaper_item->item.pos; executed (the execution status of this line is deduced):  const HB_UChar16 *uc = shaper_item->string + shaper_item->item.pos; | - |  | 360 | unsigned short *logClusters = shaper_item->log_clusters; executed (the execution status of this line is deduced):  unsigned short *logClusters = shaper_item->log_clusters; | - |  | 361 | HB_GlyphAttributes *attributes = shaper_item->attributes; executed (the execution status of this line is deduced):  HB_GlyphAttributes *attributes = shaper_item->attributes; | - |  | 362 |  | - |  | 363 | HB_Bool haveGlyphs; executed (the execution status of this line is deduced):  HB_Bool haveGlyphs; | - |  | 364 | int slen = 1; executed (the execution status of this line is deduced):  int slen = 1; | - |  | 365 | int cluster_start = 0; executed (the execution status of this line is deduced):  int cluster_start = 0; | - |  | 366 | hb_uint32 i; executed (the execution status of this line is deduced):  hb_uint32 i; | - |  | 367 |  | - |  | 368 | HB_STACKARRAY(HB_UChar16, shapedChars, 2 * shaper_item->item.length); never executed: shapedChars = (HB_UChar16 *)malloc((2 * shaper_item->item.length) * sizeof(HB_UChar16)); partially evaluated:  (2 * shaper_item->item.length) >= 512| no Evaluation Count:0 | yes Evaluation Count:38 | 
 | 0-38 |  | 369 |  | - |  | 370 | assert(shaper_item->item.script == HB_Script_Greek); executed (the execution status of this line is deduced):  ((shaper_item->item.script == HB_Script_Greek) ? static_cast<void> (0) : __assert_fail ("shaper_item->item.script == HB_Script_Greek", "../3rdparty/harfbuzz/src/harfbuzz-greek.c", 370, __PRETTY_FUNCTION__)); | - |  | 371 |  | - |  | 372 | *shapedChars = *uc; executed (the execution status of this line is deduced):  *shapedChars = *uc; | - |  | 373 | logClusters[0] = 0; executed (the execution status of this line is deduced):  logClusters[0] = 0; | - |  | 374 |  | - |  | 375 | attributes[0].mark = false; executed (the execution status of this line is deduced):  attributes[0].mark = false; | - |  | 376 | attributes[0].clusterStart = true; executed (the execution status of this line is deduced):  attributes[0].clusterStart = true; | - |  | 377 | attributes[0].dontPrint = false; executed (the execution status of this line is deduced):  attributes[0].dontPrint = false; | - |  | 378 |  | - |  | 379 | for (i = 1; i < shaper_item->item.length; ++i) { evaluated:  i < shaper_item->item.length| yes Evaluation Count:104 | yes Evaluation Count:38 | 
 | 38-104 |  | 380 | hb_uint16 base = shapedChars[slen-1]; executed (the execution status of this line is deduced):  hb_uint16 base = shapedChars[slen-1]; | - |  | 381 | hb_uint16 shaped = 0; executed (the execution status of this line is deduced):  hb_uint16 shaped = 0; | - |  | 382 | if (uc[i] == 0x300) partially evaluated:  uc[i] == 0x300| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 383 | shaped = compose_0x300(base); never executed: shaped = compose_0x300(base); | 0 |  | 384 | else if (uc[i] == 0x301) partially evaluated:  uc[i] == 0x301| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 385 | shaped = compose_0x301(base); never executed: shaped = compose_0x301(base); | 0 |  | 386 | else if (uc[i] == 0x304) partially evaluated:  uc[i] == 0x304| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 387 | shaped = compose_0x304(base); never executed: shaped = compose_0x304(base); | 0 |  | 388 | else if (uc[i] == 0x306) partially evaluated:  uc[i] == 0x306| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 389 | shaped = compose_0x306(base); never executed: shaped = compose_0x306(base); | 0 |  | 390 | else if (uc[i] == 0x308) partially evaluated:  uc[i] == 0x308| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 391 | shaped = compose_0x308(base); never executed: shaped = compose_0x308(base); | 0 |  | 392 | else if (uc[i] == 0x313) partially evaluated:  uc[i] == 0x313| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 393 | shaped = compose_0x313(base); never executed: shaped = compose_0x313(base); | 0 |  | 394 | else if (uc[i] == 0x314) partially evaluated:  uc[i] == 0x314| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 395 | shaped = compose_0x314(base); never executed: shaped = compose_0x314(base); | 0 |  | 396 | else if (uc[i] == 0x342) partially evaluated:  uc[i] == 0x342| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 397 | shaped = compose_0x342(base); never executed: shaped = compose_0x342(base); | 0 |  | 398 | else if (uc[i] == 0x345) partially evaluated:  uc[i] == 0x345| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 399 | shaped = compose_0x345(base); never executed: shaped = compose_0x345(base); | 0 |  | 400 |  | - |  | 401 | if (shaped) { partially evaluated:  shaped| no Evaluation Count:0 | yes Evaluation Count:104 | 
 | 0-104 |  | 402 | if (shaper_item->font->klass->canRender(shaper_item->font, (HB_UChar16 *)&shaped, 1)) { never evaluated: shaper_item->font->klass->canRender(shaper_item->font, (HB_UChar16 *)&shaped, 1) | 0 |  | 403 | shapedChars[slen-1] = shaped; never executed (the execution status of this line is deduced):  shapedChars[slen-1] = shaped; | - |  | 404 | } else { | 0 |  | 405 | shaped = 0; never executed (the execution status of this line is deduced):  shaped = 0; | - |  | 406 | } | 0 |  | 407 | } | - |  | 408 |  | - |  | 409 | if (!shaped) { partially evaluated:  !shaped| yes Evaluation Count:104 | no Evaluation Count:0 | 
 | 0-104 |  | 410 | HB_CharCategory category; executed (the execution status of this line is deduced):  HB_CharCategory category; | - |  | 411 | int cmb; executed (the execution status of this line is deduced):  int cmb; | - |  | 412 | shapedChars[slen] = uc[i]; executed (the execution status of this line is deduced):  shapedChars[slen] = uc[i]; | - |  | 413 | HB_GetUnicodeCharProperties(uc[i], &category, &cmb); executed (the execution status of this line is deduced):  HB_GetUnicodeCharProperties(uc[i], &category, &cmb); | - |  | 414 | if (category != HB_Mark_NonSpacing) { partially evaluated:  category != HB_Mark_NonSpacing| yes Evaluation Count:104 | no Evaluation Count:0 | 
 | 0-104 |  | 415 | attributes[slen].clusterStart = TRUE; executed (the execution status of this line is deduced):  attributes[slen].clusterStart = (!0); | - |  | 416 | attributes[slen].mark = FALSE; executed (the execution status of this line is deduced):  attributes[slen].mark = 0; | - |  | 417 | attributes[slen].combiningClass = 0; executed (the execution status of this line is deduced):  attributes[slen].combiningClass = 0; | - |  | 418 | attributes[slen].dontPrint = HB_IsControlChar(uc[i]); partially evaluated:  uc[i] >= 0x200b| no Evaluation Count:0 | yes Evaluation Count:104 | 
 never evaluated: uc[i] <= 0x200f partially evaluated:  uc[i] >= 0x2028| no Evaluation Count:0 | yes Evaluation Count:104 | 
 never evaluated: uc[i] <= 0x202f partially evaluated:  uc[i] >= 0x206a| no Evaluation Count:0 | yes Evaluation Count:104 | 
 never evaluated: uc[i] <= 0x206f | 0-104 |  | 419 | cluster_start = slen; executed (the execution status of this line is deduced):  cluster_start = slen; | - |  | 420 | } else { executed:  }Execution Count:104 | 104 |  | 421 | attributes[slen].clusterStart = FALSE; never executed (the execution status of this line is deduced):  attributes[slen].clusterStart = 0; | - |  | 422 | attributes[slen].mark = TRUE; never executed (the execution status of this line is deduced):  attributes[slen].mark = (!0); | - |  | 423 | attributes[slen].combiningClass = cmb; never executed (the execution status of this line is deduced):  attributes[slen].combiningClass = cmb; | - |  | 424 | } | 0 |  | 425 | ++slen; executed (the execution status of this line is deduced):  ++slen; | - |  | 426 | } executed:  }Execution Count:104 | 104 |  | 427 | logClusters[i] = cluster_start; executed (the execution status of this line is deduced):  logClusters[i] = cluster_start; | - |  | 428 | } executed:  }Execution Count:104 | 104 |  | 429 |  | - |  | 430 | haveGlyphs = shaper_item->font->klass executed (the execution status of this line is deduced):  haveGlyphs = shaper_item->font->klass | - |  | 431 | ->convertStringToGlyphIndices(shaper_item->font, executed (the execution status of this line is deduced):  ->convertStringToGlyphIndices(shaper_item->font, | - |  | 432 | shapedChars, slen, executed (the execution status of this line is deduced):  shapedChars, slen, | - |  | 433 | shaper_item->glyphs, &shaper_item->num_glyphs, executed (the execution status of this line is deduced):  shaper_item->glyphs, &shaper_item->num_glyphs, | - |  | 434 | shaper_item->item.bidiLevel % 2); executed (the execution status of this line is deduced):  shaper_item->item.bidiLevel % 2); | - |  | 435 |  | - |  | 436 | HB_FREE_STACKARRAY(shapedChars); never executed: free(shapedChars); partially evaluated:  stackshapedChars != shapedChars| no Evaluation Count:0 | yes Evaluation Count:38 | 
 | 0-38 |  | 437 |  | - |  | 438 | if (!haveGlyphs) partially evaluated:  !haveGlyphs| no Evaluation Count:0 | yes Evaluation Count:38 | 
 | 0-38 |  | 439 | return FALSE; never executed: return 0; | 0 |  | 440 |  | - |  | 441 | #ifndef NO_OPENTYPE | - |  | 442 | if (HB_SelectScript(shaper_item, greek_features)) { partially evaluated:  HB_SelectScript(shaper_item, greek_features)| yes Evaluation Count:38 | no Evaluation Count:0 | 
 | 0-38 |  | 443 | HB_OpenTypeShape(shaper_item, /*properties*/0); executed (the execution status of this line is deduced):  HB_OpenTypeShape(shaper_item, 0); | - |  | 444 | return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/TRUE); executed:  return HB_OpenTypePosition(shaper_item, availableGlyphs, (!0));Execution Count:38 | 38 |  | 445 | } | - |  | 446 | #endif | - |  | 447 | HB_HeuristicPosition(shaper_item); never executed (the execution status of this line is deduced):  HB_HeuristicPosition(shaper_item); | - |  | 448 |  | - |  | 449 | return TRUE; never executed: return (!0); | 0 |  | 450 | } | - |  | 451 |  | - |  | 452 |  | - |  |  |  |  | 
 |