msg_callback:
   61|   215k|{
   62|       |#if ASS_FUZZMODE == FUZZMODE_STANDALONE
   63|       |    if (level > 6) return;
   64|       |    printf("libass: ");
   65|       |    vprintf(fmt, va);
   66|       |    printf("\n");
   67|       |#else
   68|       |    // still check for type-mismatches even when not printing
   69|       |    // (seems to be cheap enough from some simple perormance tests)
   70|   215k|    char msg[2048];
   71|   215k|    int l = vsnprintf(msg, sizeof(msg), fmt, va) - 1;
   72|   215k|    l = l >= sizeof(msg) ? sizeof(msg) - 1 : l;
  ------------------
  |  Branch (72:9): [True: 18, False: 215k]
  ------------------
   73|   215k|    l = l < 0 ? 0 : l;
  ------------------
  |  Branch (73:9): [True: 0, False: 215k]
  ------------------
   74|   215k|    hval ^= *(msg + l);
   75|   215k|#endif
   76|   215k|}
LLVMFuzzerTestOneInput:
  286|     33|{
  287|     33|    ASS_Track *track = NULL;
  288|       |
  289|       |    // All return values but zero are reserved
  290|     33|    if (!init())
  ------------------
  |  Branch (290:9): [True: 0, False: 33]
  ------------------
  291|      0|        return 0;
  292|       |
  293|     33|    track = ass_read_memory(ass_library, (char *)data, size, NULL);
  294|     33|    if (track) {
  ------------------
  |  Branch (294:9): [True: 11, False: 22]
  ------------------
  295|     11|        consume_track(ass_renderer, track);
  296|     11|        ass_free_track(track);
  297|     11|    }
  298|       |
  299|     33|    ass_renderer_done(ass_renderer);
  300|     33|    ass_library_done(ass_library);
  301|     33|    ass_renderer = NULL;
  302|     33|    ass_library = NULL;
  303|       |
  304|     33|    return 0;
  305|     33|}
fuzz.c:init:
   99|     33|{
  100|     33|    ass_library = ass_library_init();
  101|     33|    if (!ass_library) {
  ------------------
  |  Branch (101:9): [True: 0, False: 33]
  ------------------
  102|      0|        printf("ass_library_init failed!\n");
  103|      0|        return false;
  104|      0|    }
  105|       |
  106|     33|    ass_set_message_cb(ass_library, msg_callback, NULL);
  107|       |
  108|     33|    if (!init_renderer()) {
  ------------------
  |  Branch (108:9): [True: 0, False: 33]
  ------------------
  109|      0|        ass_library_done(ass_library);
  110|      0|        ass_library = NULL;
  111|      0|        printf("ass_renderer_init failed!\n");
  112|      0|        return false;
  113|      0|    }
  114|       |
  115|     33|    return true;
  116|     33|}
fuzz.c:init_renderer:
   82|     33|{
   83|     33|    if (ass_renderer)
  ------------------
  |  Branch (83:9): [True: 0, False: 33]
  ------------------
   84|      0|        return true;
   85|       |
   86|     33|    ass_renderer = ass_renderer_init(ass_library);
   87|     33|    if (!ass_renderer)
  ------------------
  |  Branch (87:9): [True: 0, False: 33]
  ------------------
   88|      0|        return false;
   89|       |
   90|     33|    ass_set_fonts(ass_renderer, NULL, "sans-serif",
   91|     33|                  ASS_FONTPROVIDER_AUTODETECT, NULL, 1);
   92|     33|    ass_set_frame_size(ass_renderer, RWIDTH, RHEIGHT);
   93|     33|    ass_set_storage_size(ass_renderer, RWIDTH, RHEIGHT);
   94|       |
   95|     33|    return true;
   96|     33|}
fuzz.c:consume_track:
  142|     11|{
  143|  51.1k|    for (int n = 0; n < track->n_events; ++n) {
  ------------------
  |  Branch (143:21): [True: 51.1k, False: 11]
  ------------------
  144|  51.1k|        int change;
  145|  51.1k|        ASS_Event event = track->events[n];
  146|  51.1k|        process_image(ass_render_frame(ass_renderer, track, event.Start, &change));
  147|  51.1k|        if (event.Duration > 1) {
  ------------------
  |  Branch (147:13): [True: 28, False: 51.1k]
  ------------------
  148|     28|            process_image(ass_render_frame(ass_renderer, track, event.Start + event.Duration/2, &change));
  149|     28|            process_image(ass_render_frame(ass_renderer, track, event.Start + event.Duration-1, &change));
  150|     28|        }
  151|  51.1k|    }
  152|     11|}
fuzz.c:process_image:
  120|  51.2k|{
  121|   358k|    for (; imgs; imgs = imgs->next) {
  ------------------
  |  Branch (121:12): [True: 307k, False: 51.2k]
  ------------------
  122|   307k|        assert(imgs->w >= 0 && imgs->h >= 0 &&
  123|   307k|               imgs->dst_x >= 0 && imgs->dst_y >= 0 &&
  124|   307k|               imgs->dst_x + imgs->w <= RWIDTH &&
  125|   307k|               imgs->dst_y + imgs->h <= RHEIGHT &&
  126|   307k|               imgs->stride >= imgs->w);
  127|   307k|#if !ASSFUZZ_HASH_WHOLEBITMAP
  128|       |        // Check last pixel to probe for out-of-bounds errors
  129|   307k|        if (imgs->w && imgs->h)
  ------------------
  |  Branch (129:13): [True: 307k, False: 0]
  |  Branch (129:24): [True: 307k, False: 0]
  ------------------
  130|   307k|            hval ^= *(imgs->bitmap + imgs->stride * (imgs->h - 1) + imgs->w - 1);
  131|       |#else
  132|       |        unsigned char *src = imgs->bitmap;
  133|       |        for (int y = 0; y < imgs->h; ++y) {
  134|       |            hash(src, imgs->w);
  135|       |            src += imgs->stride;
  136|       |        }
  137|       |#endif
  138|   307k|    }
  139|  51.2k|}

ass_free_track:
   68|     33|{
   69|     33|    int i;
   70|       |
   71|     33|    if (!track)
  ------------------
  |  Branch (71:9): [True: 0, False: 33]
  ------------------
   72|      0|        return;
   73|       |
   74|     33|    if (track->parser_priv) {
  ------------------
  |  Branch (74:9): [True: 33, False: 0]
  ------------------
   75|     33|        free(track->parser_priv->read_order_bitmap);
   76|     33|        free(track->parser_priv->fontname);
   77|     33|        free(track->parser_priv->fontdata);
   78|     33|        free(track->parser_priv);
   79|     33|    }
   80|     33|    free(track->style_format);
   81|     33|    free(track->event_format);
   82|     33|    free(track->Language);
   83|     33|    if (track->styles) {
  ------------------
  |  Branch (83:9): [True: 33, False: 0]
  ------------------
   84|     69|        for (i = 0; i < track->n_styles; ++i)
  ------------------
  |  Branch (84:21): [True: 36, False: 33]
  ------------------
   85|     36|            ass_free_style(track, i);
   86|     33|    }
   87|     33|    free(track->styles);
   88|     33|    if (track->events) {
  ------------------
  |  Branch (88:9): [True: 14, False: 19]
  ------------------
   89|   182k|        for (i = 0; i < track->n_events; ++i)
  ------------------
  |  Branch (89:21): [True: 182k, False: 14]
  ------------------
   90|   182k|            ass_free_event(track, i);
   91|     14|    }
   92|     33|    free(track->events);
   93|     33|    free(track->name);
   94|     33|    free(track);
   95|     33|}
ass_alloc_style:
  101|     36|{
  102|     36|    int sid;
  103|       |
  104|     36|    assert(track->n_styles <= track->max_styles);
  105|       |
  106|     36|    if (track->n_styles == track->max_styles) {
  ------------------
  |  Branch (106:9): [True: 33, False: 3]
  ------------------
  107|     33|        if (track->max_styles >= FFMIN(SIZE_MAX, INT_MAX) - ASS_STYLES_ALLOC)
  ------------------
  |  |   47|     33|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [Folded - Ignored]
  |  |  ------------------
  ------------------
                      if (track->max_styles >= FFMIN(SIZE_MAX, INT_MAX) - ASS_STYLES_ALLOC)
  ------------------
  |  |   60|     33|#define ASS_STYLES_ALLOC 20
  ------------------
  |  Branch (107:13): [True: 0, False: 33]
  ------------------
  108|      0|            return -1;
  109|     33|        int new_max = track->max_styles + ASS_STYLES_ALLOC;
  ------------------
  |  |   60|     33|#define ASS_STYLES_ALLOC 20
  ------------------
  110|     33|        if (!ASS_REALLOC_ARRAY(track->styles, new_max))
  ------------------
  |  |   91|     33|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (110:13): [True: 0, False: 33]
  ------------------
  111|      0|            return -1;
  112|     33|        track->max_styles = new_max;
  113|     33|    }
  114|       |
  115|     36|    sid = track->n_styles++;
  116|     36|    memset(track->styles + sid, 0, sizeof(ASS_Style));
  117|     36|    return sid;
  118|     36|}
ass_alloc_event:
  124|   468k|{
  125|   468k|    int eid;
  126|       |
  127|   468k|    assert(track->n_events <= track->max_events);
  128|       |
  129|   468k|    if (track->n_events == track->max_events) {
  ------------------
  |  Branch (129:9): [True: 67, False: 468k]
  ------------------
  130|     67|        if (track->max_events >= FFMIN(SIZE_MAX, INT_MAX) / 2)
  ------------------
  |  |   47|     67|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [Folded - Ignored]
  |  |  ------------------
  ------------------
  |  Branch (130:13): [True: 0, False: 67]
  ------------------
  131|      0|            return -1;
  132|     67|        int new_max = track->max_events * 2 + 1;
  133|     67|        if (!ASS_REALLOC_ARRAY(track->events, new_max))
  ------------------
  |  |   91|     67|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (133:13): [True: 0, False: 67]
  ------------------
  134|      0|            return -1;
  135|     67|        track->max_events = new_max;
  136|     67|    }
  137|       |
  138|   468k|    eid = track->n_events++;
  139|   468k|    memset(track->events + eid, 0, sizeof(ASS_Event));
  140|   468k|    return eid;
  141|   468k|}
ass_free_event:
  144|   468k|{
  145|   468k|    ASS_Event *event = track->events + eid;
  146|       |
  147|   468k|    free(event->Name);
  148|   468k|    free(event->Effect);
  149|   468k|    free(event->Text);
  150|   468k|    free(event->render_priv);
  151|   468k|}
ass_free_style:
  154|     36|{
  155|     36|    ASS_Style *style = track->styles + sid;
  156|       |
  157|     36|    free(style->Name);
  158|     36|    free(style->FontName);
  159|     36|}
ass_process_force_style:
  529|     11|{
  530|     11|    char **fs, *eq, *dt, *style, *tname, *token;
  531|     11|    ASS_Style *target;
  532|     11|    int sid;
  533|     11|    char **list = track->library->style_overrides;
  534|       |
  535|     11|    if (!list)
  ------------------
  |  Branch (535:9): [True: 11, False: 0]
  ------------------
  536|     11|        return;
  537|       |
  538|      0|    for (fs = list; *fs; ++fs) {
  ------------------
  |  Branch (538:21): [True: 0, False: 0]
  ------------------
  539|      0|        eq = strrchr(*fs, '=');
  540|      0|        if (!eq)
  ------------------
  |  Branch (540:13): [True: 0, False: 0]
  ------------------
  541|      0|            continue;
  542|      0|        *eq = '\0';
  543|      0|        token = eq + 1;
  544|       |
  545|      0|        if (!ass_strcasecmp(*fs, "PlayResX"))
  ------------------
  |  Branch (545:13): [True: 0, False: 0]
  ------------------
  546|      0|            track->PlayResX = parse_int_header(token);
  547|      0|        else if (!ass_strcasecmp(*fs, "PlayResY"))
  ------------------
  |  Branch (547:18): [True: 0, False: 0]
  ------------------
  548|      0|            track->PlayResY = parse_int_header(token);
  549|      0|        else if (!ass_strcasecmp(*fs, "LayoutResX"))
  ------------------
  |  Branch (549:18): [True: 0, False: 0]
  ------------------
  550|      0|            track->LayoutResX = parse_int_header(token);
  551|      0|        else if (!ass_strcasecmp(*fs, "LayoutResY"))
  ------------------
  |  Branch (551:18): [True: 0, False: 0]
  ------------------
  552|      0|            track->LayoutResY = parse_int_header(token);
  553|      0|        else if (!ass_strcasecmp(*fs, "Timer"))
  ------------------
  |  Branch (553:18): [True: 0, False: 0]
  ------------------
  554|      0|            track->Timer = ass_atof(token);
  ------------------
  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  ------------------
  555|      0|        else if (!ass_strcasecmp(*fs, "WrapStyle"))
  ------------------
  |  Branch (555:18): [True: 0, False: 0]
  ------------------
  556|      0|            track->WrapStyle = parse_int_header(token);
  557|      0|        else if (!ass_strcasecmp(*fs, "ScaledBorderAndShadow"))
  ------------------
  |  Branch (557:18): [True: 0, False: 0]
  ------------------
  558|      0|            track->ScaledBorderAndShadow = parse_bool(token);
  559|      0|        else if (!ass_strcasecmp(*fs, "Kerning"))
  ------------------
  |  Branch (559:18): [True: 0, False: 0]
  ------------------
  560|      0|            track->Kerning = parse_bool(token);
  561|      0|        else if (!ass_strcasecmp(*fs, "YCbCr Matrix"))
  ------------------
  |  Branch (561:18): [True: 0, False: 0]
  ------------------
  562|      0|            track->YCbCrMatrix = parse_ycbcr_matrix(token);
  563|       |
  564|      0|        dt = strrchr(*fs, '.');
  565|      0|        if (dt) {
  ------------------
  |  Branch (565:13): [True: 0, False: 0]
  ------------------
  566|      0|            *dt = '\0';
  567|      0|            style = *fs;
  568|      0|            tname = dt + 1;
  569|      0|        } else {
  570|      0|            style = NULL;
  571|      0|            tname = *fs;
  572|      0|        }
  573|      0|        for (sid = 0; sid < track->n_styles; ++sid) {
  ------------------
  |  Branch (573:23): [True: 0, False: 0]
  ------------------
  574|      0|            if (style == NULL
  ------------------
  |  Branch (574:17): [True: 0, False: 0]
  ------------------
  575|      0|                || ass_strcasecmp(track->styles[sid].Name, style) == 0) {
  ------------------
  |  Branch (575:20): [True: 0, False: 0]
  ------------------
  576|      0|                target = track->styles + sid;
  577|      0|                PARSE_START
  ------------------
  |  |  389|      0|#define PARSE_START if (0) {
  |  |  ------------------
  |  |  |  Branch (389:25): [Folded - Ignored]
  |  |  ------------------
  ------------------
  578|      0|                    STRVAL(FontName)
  ------------------
  |  |  397|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  ------------------
  |  |  |  Branch (397:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  398|      0|        char *new_str = strdup(token); \
  |  |  399|      0|        if (new_str) { \
  |  |  ------------------
  |  |  |  Branch (399:13): [True: 0, False: 0]
  |  |  ------------------
  |  |  400|      0|            free(target->name); \
  |  |  401|      0|            target->name = new_str; \
  |  |  402|      0|        }
  ------------------
  579|      0|                    COLORVAL(PrimaryColour)
  ------------------
  |  |  413|      0|#define COLORVAL(name) ANYVAL(name,parse_color_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  580|      0|                    COLORVAL(SecondaryColour)
  ------------------
  |  |  413|      0|#define COLORVAL(name) ANYVAL(name,parse_color_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  581|      0|                    COLORVAL(OutlineColour)
  ------------------
  |  |  413|      0|#define COLORVAL(name) ANYVAL(name,parse_color_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  582|      0|                    COLORVAL(BackColour)
  ------------------
  |  |  413|      0|#define COLORVAL(name) ANYVAL(name,parse_color_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  583|      0|                    } else if (ass_strcasecmp(tname, "AlphaLevel") == 0) {
  ------------------
  |  Branch (583:32): [True: 0, False: 0]
  ------------------
  584|      0|                        int32_t alpha = parse_int_header(token);
  585|      0|                        set_style_alpha(target, alpha, alpha);
  586|      0|                    FPVAL(FontSize)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  587|      0|                    INTVAL(Bold)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  588|      0|                    INTVAL(Italic)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  589|      0|                    INTVAL(Underline)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  590|      0|                    INTVAL(StrikeOut)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  591|      0|                    FPVAL(Spacing)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  592|      0|                    FPVAL(Angle)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  593|      0|                    INTVAL(BorderStyle)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  594|      0|                    INTVAL(Alignment)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  595|      0|                    INTVAL(Justify)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  596|      0|                    INTVAL(MarginL)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  597|      0|                    INTVAL(MarginR)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  598|      0|                    INTVAL(MarginV)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  599|      0|                    INTVAL(Encoding)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  600|      0|                    FPVAL(ScaleX)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  601|      0|                    FPVAL(ScaleY)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  602|      0|                    FPVAL(Outline)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  603|      0|                    FPVAL(Shadow)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  604|      0|                    FPVAL(Blur)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  605|      0|                PARSE_END
  ------------------
  |  |  390|      0|#define PARSE_END   }
  ------------------
  606|      0|            }
  607|      0|        }
  608|      0|        *eq = '=';
  609|      0|        if (dt)
  ------------------
  |  Branch (609:13): [True: 0, False: 0]
  ------------------
  610|      0|            *dt = '.';
  611|      0|    }
  612|      0|}
ass_read_memory:
 1529|     33|{
 1530|     33|    ASS_Track *track;
 1531|     33|    int copied = 0;
 1532|       |
 1533|     33|    if (!buf)
  ------------------
  |  Branch (1533:9): [True: 0, False: 33]
  ------------------
 1534|      0|        return 0;
 1535|       |
 1536|     33|#ifdef CONFIG_ICONV
 1537|     33|    if (codepage) {
  ------------------
  |  Branch (1537:9): [True: 0, False: 33]
  ------------------
 1538|      0|        buf = sub_recode(library, buf, bufsize, codepage);
 1539|      0|        if (!buf)
  ------------------
  |  Branch (1539:13): [True: 0, False: 0]
  ------------------
 1540|      0|            return 0;
 1541|      0|        else
 1542|      0|            copied = 1;
 1543|      0|    }
 1544|     33|#endif
 1545|     33|    if (!copied) {
  ------------------
  |  Branch (1545:9): [True: 33, False: 0]
  ------------------
 1546|     33|        char *newbuf = malloc(bufsize + 1);
 1547|     33|        if (!newbuf)
  ------------------
  |  Branch (1547:13): [True: 0, False: 33]
  ------------------
 1548|      0|            return 0;
 1549|     33|        memcpy(newbuf, buf, bufsize);
 1550|     33|        newbuf[bufsize] = '\0';
 1551|     33|        buf = newbuf;
 1552|     33|    }
 1553|     33|    track = parse_memory(library, buf);
 1554|     33|    free(buf);
 1555|     33|    if (!track)
  ------------------
  |  Branch (1555:9): [True: 22, False: 11]
  ------------------
 1556|     22|        return 0;
 1557|       |
 1558|     11|    ass_msg(library, MSGL_INFO, "Added subtitle file: "
  ------------------
  |  |   42|     11|#define MSGL_INFO 4
  ------------------
 1559|     11|            "<memory> (%d styles, %d events)",
 1560|     11|            track->n_styles, track->n_events);
 1561|     11|    return track;
 1562|     33|}
ass_new_track:
 1700|     33|{
 1701|     33|    int def_sid = -1;
 1702|     33|    ASS_Track *track = calloc(1, sizeof(ASS_Track));
 1703|     33|    if (!track)
  ------------------
  |  Branch (1703:9): [True: 0, False: 33]
  ------------------
 1704|      0|        goto fail;
 1705|     33|    track->library = library;
 1706|     33|    track->ScaledBorderAndShadow = 0;
 1707|     33|    track->parser_priv = calloc(1, sizeof(ASS_ParserPriv));
 1708|     33|    if (!track->parser_priv)
  ------------------
  |  Branch (1708:9): [True: 0, False: 33]
  ------------------
 1709|      0|        goto fail;
 1710|     33|    def_sid = ass_alloc_style(track);
 1711|     33|    if (def_sid < 0)
  ------------------
  |  Branch (1711:9): [True: 0, False: 33]
  ------------------
 1712|      0|        goto fail;
 1713|     33|    set_default_style(track->styles + def_sid);
 1714|     33|    track->default_style = def_sid;
 1715|     33|    if (!track->styles[def_sid].Name || !track->styles[def_sid].FontName)
  ------------------
  |  Branch (1715:9): [True: 0, False: 33]
  |  Branch (1715:41): [True: 0, False: 33]
  ------------------
 1716|      0|        goto fail;
 1717|     33|    track->parser_priv->check_readorder = 1;
 1718|     33|    return track;
 1719|       |
 1720|      0|fail:
 1721|      0|    if (track) {
  ------------------
  |  Branch (1721:9): [True: 0, False: 0]
  ------------------
 1722|      0|        if (def_sid >= 0)
  ------------------
  |  Branch (1722:13): [True: 0, False: 0]
  ------------------
 1723|      0|            ass_free_style(track, def_sid);
 1724|      0|        free(track->parser_priv);
 1725|      0|        free(track);
 1726|      0|    }
 1727|      0|    return NULL;
 1728|     33|}
ass_lazy_track_init:
 1769|  51.2k|{
 1770|  51.2k|    if (track->PlayResX > 0 && track->PlayResY > 0)
  ------------------
  |  Branch (1770:9): [True: 51.2k, False: 10]
  |  Branch (1770:32): [True: 51.2k, False: 0]
  ------------------
 1771|  51.2k|        return;
 1772|     10|    if (track->PlayResX <= 0 && track->PlayResY <= 0) {
  ------------------
  |  Branch (1772:9): [True: 10, False: 0]
  |  Branch (1772:33): [True: 10, False: 0]
  ------------------
 1773|     10|        ass_msg(lib, MSGL_WARN,
  ------------------
  |  |   41|     10|#define MSGL_WARN 2
  ------------------
 1774|     10|               "Neither PlayResX nor PlayResY defined. Assuming 384x288");
 1775|     10|        track->PlayResX = 384;
 1776|     10|        track->PlayResY = 288;
 1777|     10|    } else {
 1778|      0|        if (track->PlayResY <= 0 && track->PlayResX == 1280) {
  ------------------
  |  Branch (1778:13): [True: 0, False: 0]
  |  Branch (1778:37): [True: 0, False: 0]
  ------------------
 1779|      0|            track->PlayResY = 1024;
 1780|      0|            ass_msg(lib, MSGL_WARN,
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 1781|      0|                   "PlayResY undefined, setting to %d", track->PlayResY);
 1782|      0|        } else if (track->PlayResY <= 0) {
  ------------------
  |  Branch (1782:20): [True: 0, False: 0]
  ------------------
 1783|      0|            track->PlayResY = FFMAX(1, track->PlayResX * 3LL / 4);
  ------------------
  |  |   46|      0|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1784|      0|            ass_msg(lib, MSGL_WARN,
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 1785|      0|                   "PlayResY undefined, setting to %d", track->PlayResY);
 1786|      0|        } else if (track->PlayResX <= 0 && track->PlayResY == 1024) {
  ------------------
  |  Branch (1786:20): [True: 0, False: 0]
  |  Branch (1786:44): [True: 0, False: 0]
  ------------------
 1787|      0|            track->PlayResX = 1280;
 1788|      0|            ass_msg(lib, MSGL_WARN,
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 1789|      0|                   "PlayResX undefined, setting to %d", track->PlayResX);
 1790|      0|        } else if (track->PlayResX <= 0) {
  ------------------
  |  Branch (1790:20): [True: 0, False: 0]
  ------------------
 1791|      0|            track->PlayResX = FFMAX(1, track->PlayResY * 4LL / 3);
  ------------------
  |  |   46|      0|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1792|      0|            ass_msg(lib, MSGL_WARN,
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 1793|      0|                   "PlayResX undefined, setting to %d", track->PlayResX);
 1794|      0|        }
 1795|      0|    }
 1796|     10|}
ass.c:parse_int_header:
  304|    302|{
  305|    302|    uint32_t val = 0;
  306|    302|    unsigned base;
  307|       |
  308|    302|    if (!ass_strncasecmp(str, "&h", 2) || !ass_strncasecmp(str, "0x", 2)) {
  ------------------
  |  Branch (308:9): [True: 0, False: 302]
  |  Branch (308:43): [True: 0, False: 302]
  ------------------
  309|      0|        str += 2;
  310|      0|        base = 16;
  311|      0|    } else
  312|    302|        base = 10;
  313|       |
  314|    302|    mystrtou32_modulo(&str, base, &val);
  315|    302|    return val;
  316|    302|}
ass.c:mystrtou32_modulo:
  273|    302|{
  274|       |    // This emulates scanf with %d or %x format as it works on
  275|       |    // Windows, because that's what is used by VSFilter. In practice,
  276|       |    // scanf works the same way on other platforms too, but
  277|       |    // the standard leaves its behavior on overflow undefined.
  278|       |
  279|       |    // Unlike scanf and like strtoul, produce 0 for invalid inputs.
  280|       |
  281|    302|    char *start = *p;
  282|    302|    int sign = 1;
  283|       |
  284|    302|    skip_spaces(p);
  285|       |
  286|    302|    if (**p == '+')
  ------------------
  |  Branch (286:9): [True: 0, False: 302]
  ------------------
  287|      0|        ++*p;
  288|    302|    else if (**p == '-')
  ------------------
  |  Branch (288:14): [True: 0, False: 302]
  ------------------
  289|      0|        sign = -1, ++*p;
  290|       |
  291|    302|    if (base == 16 && !ass_strncasecmp(*p, "0x", 2))
  ------------------
  |  Branch (291:9): [True: 0, False: 302]
  |  Branch (291:23): [True: 0, False: 0]
  ------------------
  292|      0|        *p += 2;
  293|       |
  294|    302|    if (read_digits(p, base, res)) {
  ------------------
  |  Branch (294:9): [True: 0, False: 302]
  ------------------
  295|      0|        *res *= sign;
  296|      0|        return 1;
  297|    302|    } else {
  298|    302|        *p = start;
  299|    302|        return 0;
  300|    302|    }
  301|    302|}
ass.c:read_digits:
  243|    302|{
  244|    302|    char *p = *str;
  245|    302|    char *start = p;
  246|    302|    uint32_t val = 0;
  247|       |
  248|    302|    while (1) {
  ------------------
  |  Branch (248:12): [Folded - Ignored]
  ------------------
  249|    302|        unsigned digit;
  250|    302|        if (*p >= '0' && *p < FFMIN(base, 10) + '0')
  ------------------
  |  |   47|     48|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 0, False: 48]
  |  |  ------------------
  ------------------
  |  Branch (250:13): [True: 48, False: 254]
  |  Branch (250:26): [True: 0, False: 48]
  ------------------
  251|      0|            digit = *p - '0';
  252|    302|        else if (*p >= 'a' && *p < base - 10 + 'a')
  ------------------
  |  Branch (252:18): [True: 28, False: 274]
  |  Branch (252:31): [True: 0, False: 28]
  ------------------
  253|      0|            digit = *p - 'a' + 10;
  254|    302|        else if (*p >= 'A' && *p < base - 10 + 'A')
  ------------------
  |  Branch (254:18): [True: 39, False: 263]
  |  Branch (254:31): [True: 0, False: 39]
  ------------------
  255|      0|            digit = *p - 'A' + 10;
  256|    302|        else
  257|    302|            break;
  258|      0|        val = val * base + digit;
  259|      0|        ++p;
  260|      0|    }
  261|       |
  262|    302|    *res = val;
  263|    302|    *str = p;
  264|    302|    return p != start;
  265|    302|}
ass.c:set_style_alpha:
  514|      3|{
  515|      3|        front_alpha  = FFMAX(FFMIN(front_alpha, 0xFF), 0);
  ------------------
  |  |   46|      6|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 3]
  |  |  |  Branch (46:22): [True: 0, False: 3]
  |  |  |  Branch (46:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  516|      3|        back_alpha = FFMAX(FFMIN(back_alpha, 0xFF), 0);
  ------------------
  |  |   46|      6|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 3, False: 0]
  |  |  |  Branch (46:22): [True: 0, False: 3]
  |  |  |  Branch (46:34): [True: 0, False: 3]
  |  |  ------------------
  ------------------
  517|      3|        style->PrimaryColour   = (style->PrimaryColour   & 0xFFFFFF00) | front_alpha;
  518|      3|        style->SecondaryColour = (style->SecondaryColour & 0xFFFFFF00) | front_alpha;
  519|      3|        style->OutlineColour   = (style->OutlineColour   & 0xFFFFFF00) | front_alpha;
  520|      3|        style->BackColour      = (style->BackColour      & 0xFFFFFF00) | back_alpha;
  521|      3|}
ass.c:process_text:
 1180|     33|{
 1181|     33|    char *p = str;
 1182|   478k|    while (1) {
  ------------------
  |  Branch (1182:12): [Folded - Ignored]
  ------------------
 1183|   478k|        char *q;
 1184|   478k|        while (1) {
  ------------------
  |  Branch (1184:16): [Folded - Ignored]
  ------------------
 1185|   478k|            if ((*p == '\r') || (*p == '\n'))
  ------------------
  |  Branch (1185:17): [True: 0, False: 478k]
  |  Branch (1185:33): [True: 23, False: 478k]
  ------------------
 1186|     23|                ++p;
 1187|   478k|            else if (p[0] == '\xef' && p[1] == '\xbb' && p[2] == '\xbf')
  ------------------
  |  Branch (1187:22): [True: 0, False: 478k]
  |  Branch (1187:40): [True: 0, False: 0]
  |  Branch (1187:58): [True: 0, False: 0]
  ------------------
 1188|      0|                p += 3;         // U+FFFE (BOM)
 1189|   478k|            else
 1190|   478k|                break;
 1191|   478k|        }
 1192|  23.1M|        for (q = p; ((*q != '\0') && (*q != '\r') && (*q != '\n')); ++q) {
  ------------------
  |  Branch (1192:22): [True: 23.1M, False: 33]
  |  Branch (1192:38): [True: 23.1M, False: 30]
  |  Branch (1192:54): [True: 22.7M, False: 478k]
  ------------------
 1193|  22.7M|        };
 1194|   478k|        if (q == p)
  ------------------
  |  Branch (1194:13): [True: 0, False: 478k]
  ------------------
 1195|      0|            break;
 1196|   478k|        if (*q != '\0')
  ------------------
  |  Branch (1196:13): [True: 478k, False: 33]
  ------------------
 1197|   478k|            *(q++) = '\0';
 1198|   478k|        process_line(track, p);
 1199|   478k|        if (*q == '\0')
  ------------------
  |  Branch (1199:13): [True: 33, False: 478k]
  ------------------
 1200|     33|            break;
 1201|   478k|        p = q;
 1202|   478k|    }
 1203|       |    // there is no explicit end-of-font marker in ssa/ass
 1204|     33|    if (track->parser_priv->fontname)
  ------------------
  |  Branch (1204:9): [True: 6, False: 27]
  ------------------
 1205|      6|        decode_font(track);
 1206|     33|    return 0;
 1207|     33|}
ass.c:process_line:
 1144|   478k|{
 1145|   478k|    skip_spaces(&str);
 1146|   478k|    if (!ass_strncasecmp(str, "[Script Info]", 13)) {
  ------------------
  |  Branch (1146:9): [True: 11, False: 478k]
  ------------------
 1147|     11|        track->parser_priv->state = PST_INFO;
 1148|   478k|    } else if (!ass_strncasecmp(str, "[V4 Styles]", 11)) {
  ------------------
  |  Branch (1148:16): [True: 16, False: 478k]
  ------------------
 1149|     16|        track->parser_priv->state = PST_STYLES;
 1150|     16|        track->track_type = TRACK_TYPE_SSA;
 1151|   478k|    } else if (!ass_strncasecmp(str, "[V4+ Styles]", 12)) {
  ------------------
  |  Branch (1151:16): [True: 0, False: 478k]
  ------------------
 1152|      0|        track->parser_priv->state = PST_STYLES;
 1153|      0|        track->track_type = TRACK_TYPE_ASS;
 1154|   478k|    } else if (!ass_strncasecmp(str, "[Events]", 8)) {
  ------------------
  |  Branch (1154:16): [True: 124, False: 477k]
  ------------------
 1155|    124|        track->parser_priv->state = PST_EVENTS;
 1156|   477k|    } else if (!ass_strncasecmp(str, "[Fonts]", 7)) {
  ------------------
  |  Branch (1156:16): [True: 6, False: 477k]
  ------------------
 1157|      6|        track->parser_priv->state = PST_FONTS;
 1158|   477k|    } else {
 1159|   477k|        switch (track->parser_priv->state) {
 1160|     11|        case PST_INFO:
  ------------------
  |  Branch (1160:9): [True: 11, False: 477k]
  ------------------
 1161|     11|            process_info_line(track, str);
 1162|     11|            break;
 1163|      3|        case PST_STYLES:
  ------------------
  |  Branch (1163:9): [True: 3, False: 477k]
  ------------------
 1164|      3|            process_styles_line(track, str);
 1165|      3|            break;
 1166|   477k|        case PST_EVENTS:
  ------------------
  |  Branch (1166:9): [True: 477k, False: 334]
  ------------------
 1167|   477k|            process_events_line(track, str);
 1168|   477k|            break;
 1169|    316|        case PST_FONTS:
  ------------------
  |  Branch (1169:9): [True: 316, False: 477k]
  ------------------
 1170|    316|            process_fonts_line(track, str);
 1171|    316|            break;
 1172|      4|        default:
  ------------------
  |  Branch (1172:9): [True: 4, False: 477k]
  ------------------
 1173|      4|            break;
 1174|   477k|        }
 1175|   477k|    }
 1176|   478k|    return 0;
 1177|   478k|}
ass.c:process_info_line:
  853|     11|{
  854|     11|    if (!strncmp(str, "PlayResX:", 9)) {
  ------------------
  |  Branch (854:9): [True: 0, False: 11]
  ------------------
  855|      0|        check_duplicate_info_line(track, SINFO_PLAYRESX, "PlayResX");
  856|      0|        track->PlayResX = parse_int_header(str + 9);
  857|     11|    } else if (!strncmp(str, "PlayResY:", 9)) {
  ------------------
  |  Branch (857:16): [True: 0, False: 11]
  ------------------
  858|      0|        check_duplicate_info_line(track, SINFO_PLAYRESY, "PlayResY");
  859|      0|        track->PlayResY = parse_int_header(str + 9);
  860|     11|    } else if (!strncmp(str, "LayoutResX:", 11)) {
  ------------------
  |  Branch (860:16): [True: 0, False: 11]
  ------------------
  861|      0|        check_duplicate_info_line(track, SINFO_LAYOUTRESX, "LayoutResX");
  862|      0|        track->LayoutResX = parse_int_header(str + 11);
  863|     11|    } else if (!strncmp(str, "LayoutResY:", 11)) {
  ------------------
  |  Branch (863:16): [True: 0, False: 11]
  ------------------
  864|      0|        check_duplicate_info_line(track, SINFO_LAYOUTRESY, "LayoutResY");
  865|      0|        track->LayoutResY = parse_int_header(str + 11);
  866|     11|    } else if (!strncmp(str, "Timer:", 6)) {
  ------------------
  |  Branch (866:16): [True: 11, False: 0]
  ------------------
  867|     11|        check_duplicate_info_line(track, SINFO_TIMER, "Timer");
  868|     11|        track->Timer = ass_atof(str + 6);
  ------------------
  |  |   42|     11|#define ass_atof(STR) (ass_strtod((STR),NULL))
  ------------------
  869|     11|    } else if (!strncmp(str, "WrapStyle:", 10)) {
  ------------------
  |  Branch (869:16): [True: 0, False: 0]
  ------------------
  870|      0|        check_duplicate_info_line(track, SINFO_WRAPSTYLE, "WrapStyle");
  871|      0|        track->WrapStyle = parse_int_header(str + 10);
  872|      0|    } else if (!strncmp(str, "ScaledBorderAndShadow:", 22)) {
  ------------------
  |  Branch (872:16): [True: 0, False: 0]
  ------------------
  873|      0|        check_duplicate_info_line(track, SINFO_SCALEDBORDER,
  874|      0|                                    "ScaledBorderAndShadow");
  875|      0|        track->ScaledBorderAndShadow = parse_bool(str + 22);
  876|      0|    } else if (!strncmp(str, "Kerning:", 8)) {
  ------------------
  |  Branch (876:16): [True: 0, False: 0]
  ------------------
  877|      0|        check_duplicate_info_line(track, SINFO_KERNING, "Kerning");
  878|      0|        track->Kerning = parse_bool(str + 8);
  879|      0|    } else if (!strncmp(str, "YCbCr Matrix:", 13)) {
  ------------------
  |  Branch (879:16): [True: 0, False: 0]
  ------------------
  880|      0|        check_duplicate_info_line(track, SINFO_COLOURMATRIX, "YCbCr Matrix");
  881|      0|        track->YCbCrMatrix = parse_ycbcr_matrix(str + 13);
  882|      0|    } else if (!strncmp(str, "Language:", 9)) {
  ------------------
  |  Branch (882:16): [True: 0, False: 0]
  ------------------
  883|      0|        check_duplicate_info_line(track, SINFO_LANGUAGE, "Language");
  884|      0|        char *p = str + 9;
  885|      0|        while (*p && ass_isspace(*p)) p++;
  ------------------
  |  Branch (885:16): [True: 0, False: 0]
  |  Branch (885:22): [True: 0, False: 0]
  ------------------
  886|      0|        free(track->Language);
  887|      0|        track->Language = strndup(p, 2);
  888|      0|    } else if (!strncmp(str, "ScriptType:", 11)) {
  ------------------
  |  Branch (888:16): [True: 0, False: 0]
  ------------------
  889|      0|        check_duplicate_info_line(track, SINFO_SCRIPTTYPE, "ScriptType");
  890|      0|        parse_script_type(track, str + 11);
  891|      0|    } else if (!strncmp(str, "; Script generated by ", 22)) {
  ------------------
  |  Branch (891:16): [True: 0, False: 0]
  ------------------
  892|      0|        if (!strncmp(str + 22,"FFmpeg/Lavc", 11))
  ------------------
  |  Branch (892:13): [True: 0, False: 0]
  ------------------
  893|      0|            track->parser_priv->header_flags |= GENBY_FFMPEG;
  894|      0|    }
  895|     11|    return 0;
  896|     11|}
ass.c:check_duplicate_info_line:
  843|     11|{
  844|     11|    if (track->parser_priv->header_flags & si)
  ------------------
  |  Branch (844:9): [True: 0, False: 11]
  ------------------
  845|      0|        ass_msg(track->library, MSGL_WARN,
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  846|      0|            "Duplicate Script Info Header '%s'. Previous value overwritten!",
  847|      0|            name);
  848|     11|    else
  849|     11|        track->parser_priv->header_flags |= si;
  850|     11|}
ass.c:process_styles_line:
  797|      3|{
  798|      3|    int ret = 0;
  799|      3|    if (!strncmp(str, "Format:", 7)) {
  ------------------
  |  Branch (799:9): [True: 0, False: 3]
  ------------------
  800|      0|        char *p = str + 7;
  801|      0|        skip_spaces(&p);
  802|      0|        free(track->style_format);
  803|      0|        track->style_format = strdup(p);
  804|      0|        if (!track->style_format)
  ------------------
  |  Branch (804:13): [True: 0, False: 0]
  ------------------
  805|      0|            return -1;
  806|      0|        ass_msg(track->library, MSGL_DBG2, "Style format: %s",
  ------------------
  |  |   44|      0|#define MSGL_DBG2 7
  ------------------
  807|      0|               track->style_format);
  808|      0|        if (track->track_type == TRACK_TYPE_ASS)
  ------------------
  |  Branch (808:13): [True: 0, False: 0]
  ------------------
  809|      0|            custom_format_line_compatibility(track, p, ass_style_format);
  810|      0|        else
  811|      0|            custom_format_line_compatibility(track, p, ssa_style_format);
  812|      3|    } else if (!strncmp(str, "Style:", 6)) {
  ------------------
  |  Branch (812:16): [True: 3, False: 0]
  ------------------
  813|      3|        char *p = str + 6;
  814|      3|        skip_spaces(&p);
  815|      3|        ret = process_style(track, p);
  816|      3|    }
  817|      3|    return ret;
  818|      3|}
ass.c:custom_format_line_compatibility:
  786|     32|{
  787|     32|    if (!(track->parser_priv->header_flags & SINFO_SCALEDBORDER)
  ------------------
  |  Branch (787:9): [True: 32, False: 0]
  ------------------
  788|     32|        && !format_line_compare(fmt, std)) {
  ------------------
  |  Branch (788:12): [True: 32, False: 0]
  ------------------
  789|     32|        ass_msg(track->library, MSGL_INFO,
  ------------------
  |  |   42|     32|#define MSGL_INFO 4
  ------------------
  790|     32|               "Track has custom format line(s). "
  791|     32|                "'ScaledBorderAndShadow' will default to 'yes'.");
  792|     32|        track->ScaledBorderAndShadow = 1;
  793|     32|    }
  794|     32|}
ass.c:format_line_compare:
  736|     32|{
  737|     32|#define TOKEN_ALIAS1(token, name, alias) \
  738|     32|    if (token ## _end - token ## _start == sizeof( #alias ) - 1 &&     \
  739|     32|            !strncmp(token ## _start, #alias, sizeof( #alias ) - 1)) { \
  740|     32|        token ## _start = #name;                                       \
  741|     32|        token ## _end = token ## _start + sizeof( #name ) - 1;         \
  742|     32|    }
  743|     32|#define TOKEN_ALIAS(name, alias) TOKEN_ALIAS1(tk1, name, alias) TOKEN_ALIAS1(tk2, name, alias)
  744|       |
  745|     32|    while (true) {
  746|     32|        const char *tk1_start, *tk2_start;
  747|     32|        const char *tk1_end, *tk2_end;
  748|       |
  749|     32|        skip_spaces((char**)&fmt1);
  750|     32|        skip_spaces((char**)&fmt2);
  751|     32|        if (!*fmt1 || !*fmt2)
  ------------------
  |  Branch (751:13): [True: 0, False: 32]
  |  Branch (751:23): [True: 0, False: 32]
  ------------------
  752|      0|            break;
  753|       |
  754|     32|        advance_token_pos(&fmt1, &tk1_start, &tk1_end);
  755|     32|        advance_token_pos(&fmt2, &tk2_start, &tk2_end);
  756|     32|        rskip_spaces((char**)&tk1_end, (char*)tk1_start);
  757|     32|        rskip_spaces((char**)&tk2_end, (char*)tk2_start);
  758|       |
  759|     32|        TOKEN_ALIAS(Name, Actor)
  ------------------
  |  |  743|     32|#define TOKEN_ALIAS(name, alias) TOKEN_ALIAS1(tk1, name, alias) TOKEN_ALIAS1(tk2, name, alias)
  |  |  ------------------
  |  |  |  |  738|     32|    if (token ## _end - token ## _start == sizeof( #alias ) - 1 &&     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (738:9): [True: 0, False: 32]
  |  |  |  |  ------------------
  |  |  |  |  739|     32|            !strncmp(token ## _start, #alias, sizeof( #alias ) - 1)) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (739:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  740|      0|        token ## _start = #name;                                       \
  |  |  |  |  741|      0|        token ## _end = token ## _start + sizeof( #name ) - 1;         \
  |  |  |  |  742|      0|    }
  |  |  ------------------
  |  |               #define TOKEN_ALIAS(name, alias) TOKEN_ALIAS1(tk1, name, alias) TOKEN_ALIAS1(tk2, name, alias)
  |  |  ------------------
  |  |  |  |  738|     32|    if (token ## _end - token ## _start == sizeof( #alias ) - 1 &&     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (738:9): [True: 0, False: 32]
  |  |  |  |  ------------------
  |  |  |  |  739|     32|            !strncmp(token ## _start, #alias, sizeof( #alias ) - 1)) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (739:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  740|      0|        token ## _start = #name;                                       \
  |  |  |  |  741|      0|        token ## _end = token ## _start + sizeof( #name ) - 1;         \
  |  |  |  |  742|      0|    }
  |  |  ------------------
  ------------------
  760|     32|        if ((tk1_end-tk1_start) != (tk2_end-tk2_start))
  ------------------
  |  Branch (760:13): [True: 32, False: 0]
  ------------------
  761|     32|            return false;
  762|      0|        if (ass_strncasecmp(tk1_start, tk2_start, tk1_end-tk1_start))
  ------------------
  |  Branch (762:13): [True: 0, False: 0]
  ------------------
  763|      0|            return false;
  764|      0|    }
  765|      0|    return *fmt1 == *fmt2;
  766|       |
  767|     32|#undef TOKEN_ALIAS
  768|     32|#undef TOKEN_ALIAS1
  769|     32|}
ass.c:advance_token_pos:
  428|   470k|{
  429|   470k|    *start = *str;
  430|   470k|    *end   = *start;
  431|  4.44M|    while (**end != '\0' && **end != ',') ++*end;
  ------------------
  |  Branch (431:12): [True: 4.26M, False: 182k]
  |  Branch (431:29): [True: 3.97M, False: 287k]
  ------------------
  432|   470k|    *str = *end + (**end == ',');
  433|   470k|}
ass.c:process_style:
  621|      3|{
  622|       |
  623|      3|    char *token;
  624|      3|    char *tname;
  625|      3|    char *p = str;
  626|      3|    char *format;
  627|      3|    char *q;                    // format scanning pointer
  628|      3|    int sid;
  629|      3|    ASS_Style *style;
  630|      3|    ASS_Style *target;
  631|       |
  632|      3|    if (!track->style_format) {
  ------------------
  |  Branch (632:9): [True: 2, False: 1]
  ------------------
  633|       |        // no style format header
  634|       |        // probably an ancient script version
  635|      2|        if (track->track_type == TRACK_TYPE_SSA)
  ------------------
  |  Branch (635:13): [True: 2, False: 0]
  ------------------
  636|      2|            track->style_format = strdup(ssa_style_format);
  637|      0|        else
  638|      0|            track->style_format = strdup(ass_style_format);
  639|      2|        if (!track->style_format)
  ------------------
  |  Branch (639:13): [True: 0, False: 2]
  ------------------
  640|      0|            return -1;
  641|      2|    }
  642|       |
  643|      3|    q = format = strdup(track->style_format);
  644|      3|    if (!q)
  ------------------
  |  Branch (644:9): [True: 0, False: 3]
  ------------------
  645|      0|        return -1;
  646|       |
  647|      3|    ass_msg(track->library, MSGL_V, "[%p] Style: %s", track, str);
  ------------------
  |  |   43|      3|#define MSGL_V 6
  ------------------
  648|       |
  649|      3|    sid = ass_alloc_style(track);
  650|      3|    if (sid < 0) {
  ------------------
  |  Branch (650:9): [True: 0, False: 3]
  ------------------
  651|      0|        free(format);
  652|      0|        return -1;
  653|      0|    }
  654|       |
  655|      3|    style = track->styles + sid;
  656|      3|    target = style;
  657|       |
  658|       |    // fill style with some default values
  659|      3|    style->ScaleX = 100.;
  660|      3|    style->ScaleY = 100.;
  661|       |
  662|      3|    int32_t ssa_alpha = 0;
  663|       |
  664|      7|    while (1) {
  ------------------
  |  Branch (664:12): [Folded - Ignored]
  ------------------
  665|      7|        NEXTNAME(q, tname);
  ------------------
  |  |  372|      7|#define NEXTNAME(str,token) NEXT(str, token, true)
  |  |  ------------------
  |  |  |  |  370|      7|    token = next_token(&str, rtrim); \
  |  |  |  |  371|      7|    if (!token) break;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (371:9): [True: 0, False: 7]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  666|      7|        NEXTVAL(p, token);
  ------------------
  |  |  373|      7|#define NEXTVAL(str,token) NEXT(str, token, false)
  |  |  ------------------
  |  |  |  |  370|      7|    token = next_token(&str, rtrim); \
  |  |  |  |  371|      7|    if (!token) break;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (371:9): [True: 3, False: 4]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  667|       |
  668|      4|        PARSE_START
  ------------------
  |  |  389|      4|#define PARSE_START if (0) {
  |  |  ------------------
  |  |  |  Branch (389:25): [Folded - Ignored]
  |  |  ------------------
  ------------------
  669|      3|            STARREDSTRVAL(Name)
  ------------------
  |  |  405|      4|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  ------------------
  |  |  |  Branch (405:16): [True: 3, False: 1]
  |  |  ------------------
  |  |  406|      3|        while (*token == '*') ++token; \
  |  |  ------------------
  |  |  |  Branch (406:16): [True: 0, False: 3]
  |  |  ------------------
  |  |  407|      3|        char *new_str = strdup(token); \
  |  |  408|      3|        if (new_str) { \
  |  |  ------------------
  |  |  |  Branch (408:13): [True: 3, False: 0]
  |  |  ------------------
  |  |  409|      3|            free(target->name); \
  |  |  410|      3|            target->name = new_str; \
  |  |  411|      3|        }
  ------------------
  670|      3|            STRVAL(FontName)
  ------------------
  |  |  397|      3|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  ------------------
  |  |  |  Branch (397:16): [True: 1, False: 0]
  |  |  ------------------
  |  |  398|      1|        char *new_str = strdup(token); \
  |  |  399|      1|        if (new_str) { \
  |  |  ------------------
  |  |  |  Branch (399:13): [True: 1, False: 0]
  |  |  ------------------
  |  |  400|      1|            free(target->name); \
  |  |  401|      1|            target->name = new_str; \
  |  |  402|      1|        }
  ------------------
  671|      1|            COLORVAL(PrimaryColour)
  ------------------
  |  |  413|      1|#define COLORVAL(name) ANYVAL(name,parse_color_header)
  |  |  ------------------
  |  |  |  |  393|      1|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  672|      0|            COLORVAL(SecondaryColour)
  ------------------
  |  |  413|      0|#define COLORVAL(name) ANYVAL(name,parse_color_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  673|       |            COLORVAL(OutlineColour) // TertiaryColor
  ------------------
  |  |  413|      0|#define COLORVAL(name) ANYVAL(name,parse_color_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  674|      0|            COLORVAL(BackColour)
  ------------------
  |  |  413|      0|#define COLORVAL(name) ANYVAL(name,parse_color_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  675|       |                // SSA uses BackColour for both outline and shadow
  676|       |                // this will destroy SSA's TertiaryColour, but i'm not going to use it anyway
  677|      0|                if (track->track_type == TRACK_TYPE_SSA)
  ------------------
  |  Branch (677:21): [True: 0, False: 0]
  ------------------
  678|      0|                    target->OutlineColour = target->BackColour;
  679|      0|            } else if (ass_strcasecmp(tname, "AlphaLevel") == 0) {
  ------------------
  |  Branch (679:24): [True: 0, False: 0]
  ------------------
  680|      0|                ssa_alpha = parse_int_header(token);
  681|      0|            FPVAL(FontSize)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  682|      0|            INTVAL(Bold)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  683|      0|            INTVAL(Italic)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  684|      0|            INTVAL(Underline)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  685|      0|            INTVAL(StrikeOut)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  686|      0|            FPVAL(Spacing)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  687|      0|            FPVAL(Angle)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  688|      0|            INTVAL(BorderStyle)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  689|      0|            INTVAL(Alignment)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  690|      0|                if (track->track_type == TRACK_TYPE_ASS)
  ------------------
  |  Branch (690:21): [True: 0, False: 0]
  ------------------
  691|      0|                    target->Alignment = numpad2align(target->Alignment);
  692|       |                // VSFilter compatibility
  693|      0|                else if (target->Alignment == 8)
  ------------------
  |  Branch (693:26): [True: 0, False: 0]
  ------------------
  694|      0|                    target->Alignment = 3;
  695|      0|                else if (target->Alignment == 4)
  ------------------
  |  Branch (695:26): [True: 0, False: 0]
  ------------------
  696|      0|                    target->Alignment = 11;
  697|      0|            INTVAL(MarginL)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  698|      0|            INTVAL(MarginR)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  699|      0|            INTVAL(MarginV)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  700|      0|            INTVAL(Encoding)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  ------------------
  ------------------
  701|      0|            FPVAL(ScaleX)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  702|      0|            FPVAL(ScaleY)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  703|      0|            FPVAL(Outline)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  704|      0|            FPVAL(Shadow)
  ------------------
  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  ------------------
  |  |  |  |  393|      0|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  394|      0|        target->name = func(token);
  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|#define FPVAL(name) ANYVAL(name,ass_atof)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   42|      0|#define ass_atof(STR) (ass_strtod((STR),NULL))
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  705|      0|        PARSE_END
  ------------------
  |  |  390|      0|#define PARSE_END   }
  ------------------
  706|      4|    }
  707|      3|    free(format);
  708|       |    // VSF compat: always set BackColour Alpha to 0x80 in SSA
  709|      3|    if (track->track_type == TRACK_TYPE_SSA)
  ------------------
  |  Branch (709:9): [True: 3, False: 0]
  ------------------
  710|      3|        set_style_alpha(style, ssa_alpha, 0x80);
  711|      3|    style->ScaleX = FFMAX(style->ScaleX, 0.) / 100.;
  ------------------
  |  |   46|      3|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 3, False: 0]
  |  |  ------------------
  ------------------
  712|      3|    style->ScaleY = FFMAX(style->ScaleY, 0.) / 100.;
  ------------------
  |  |   46|      3|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 3, False: 0]
  |  |  ------------------
  ------------------
  713|      3|    style->Spacing = FFMAX(style->Spacing, 0.);
  ------------------
  |  |   46|      3|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 3]
  |  |  ------------------
  ------------------
  714|      3|    style->Outline = FFMAX(style->Outline, 0.);
  ------------------
  |  |   46|      3|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 3]
  |  |  ------------------
  ------------------
  715|      3|    style->Shadow = FFMAX(style->Shadow, 0.);
  ------------------
  |  |   46|      3|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 3]
  |  |  ------------------
  ------------------
  716|      3|    style->Bold = !!style->Bold;
  717|      3|    style->Italic = !!style->Italic;
  718|      3|    style->Underline = !!style->Underline;
  719|      3|    style->StrikeOut = !!style->StrikeOut;
  720|      3|    if (!style->Name)
  ------------------
  |  Branch (720:9): [True: 0, False: 3]
  ------------------
  721|      0|        style->Name = strdup("Default");
  722|      3|    if (!style->FontName)
  ------------------
  |  Branch (722:9): [True: 2, False: 1]
  ------------------
  723|      2|        style->FontName = strdup("Arial");
  724|      3|    if (!style->Name || !style->FontName) {
  ------------------
  |  Branch (724:9): [True: 0, False: 3]
  |  Branch (724:25): [True: 0, False: 3]
  ------------------
  725|      0|        ass_free_style(track, sid);
  726|      0|        track->n_styles--;
  727|      0|        return -1;
  728|      0|    }
  729|      3|    if (strcmp(target->Name, "Default") == 0)
  ------------------
  |  Branch (729:9): [True: 0, False: 3]
  ------------------
  730|      0|        track->default_style = sid;
  731|      3|    return 0;
  732|       |
  733|      3|}
ass.c:process_events_line:
  966|   477k|{
  967|   477k|    if (!strncmp(str, "Format:", 7)) {
  ------------------
  |  Branch (967:9): [True: 32, False: 477k]
  ------------------
  968|     32|        char *p = str + 7;
  969|     32|        skip_spaces(&p);
  970|     32|        free(track->event_format);
  971|     32|        track->event_format = strdup(p);
  972|     32|        if (!track->event_format)
  ------------------
  |  Branch (972:13): [True: 0, False: 32]
  ------------------
  973|      0|            return -1;
  974|     32|        ass_msg(track->library, MSGL_DBG2, "Event format: %s", track->event_format);
  ------------------
  |  |   44|     32|#define MSGL_DBG2 7
  ------------------
  975|     32|        if (track->track_type == TRACK_TYPE_ASS)
  ------------------
  |  Branch (975:13): [True: 0, False: 32]
  ------------------
  976|      0|            custom_format_line_compatibility(track, p, ass_event_format);
  977|     32|        else
  978|     32|            custom_format_line_compatibility(track, p, ssa_event_format);
  979|       |
  980|       |        // Guess if we are dealing with legacy ffmpeg subs and change accordingly
  981|       |        // If file has no event format it was probably not created by ffmpeg/libav
  982|     32|        if (detect_legacy_conv_subs(track)) {
  ------------------
  |  Branch (982:13): [True: 0, False: 32]
  ------------------
  983|      0|            track->ScaledBorderAndShadow = 1;
  984|      0|            ass_msg(track->library, MSGL_INFO,
  ------------------
  |  |   42|      0|#define MSGL_INFO 4
  ------------------
  985|      0|                    "Track treated as legacy ffmpeg sub.");
  986|      0|        }
  987|   477k|    } else if (!strncmp(str, "Dialogue:", 9)) {
  ------------------
  |  Branch (987:16): [True: 468k, False: 9.01k]
  ------------------
  988|       |        // This should never be reached for embedded subtitles.
  989|       |        // They have slightly different format and are parsed in ass_process_chunk,
  990|       |        // called directly from demuxer
  991|   468k|        int eid;
  992|   468k|        ASS_Event *event;
  993|       |
  994|       |        // We can't parse events without event_format
  995|   468k|        if (!track->event_format) {
  ------------------
  |  Branch (995:13): [True: 14, False: 468k]
  ------------------
  996|     14|            event_format_fallback(track);
  997|     14|            if (!track->event_format)
  ------------------
  |  Branch (997:17): [True: 0, False: 14]
  ------------------
  998|      0|                return -1;
  999|     14|        }
 1000|       |
 1001|   468k|        str += 9;
 1002|   468k|        skip_spaces(&str);
 1003|       |
 1004|   468k|        eid = ass_alloc_event(track);
 1005|   468k|        if (eid < 0)
  ------------------
  |  Branch (1005:13): [True: 0, False: 468k]
  ------------------
 1006|      0|            return -1;
 1007|   468k|        event = track->events + eid;
 1008|       |
 1009|   468k|        int ret = process_event_tail(track, event, str, 0);
 1010|   468k|        if (!ret)
  ------------------
  |  Branch (1010:13): [True: 182k, False: 286k]
  ------------------
 1011|   182k|            return 0;
 1012|       |        // If something went wrong, discard the useless Event
 1013|   286k|        ass_free_event(track, eid);
 1014|   286k|        track->n_events--;
 1015|   286k|        return ret;
 1016|   468k|    } else {
 1017|  9.01k|        ass_msg(track->library, MSGL_V, "Not understood: '%.30s'", str);
  ------------------
  |  |   43|  9.01k|#define MSGL_V 6
  ------------------
 1018|  9.01k|    }
 1019|  9.04k|    return 0;
 1020|   477k|}
ass.c:detect_legacy_conv_subs:
  914|     32|{
  915|       |    /*
  916|       |     * FFmpeg and libav convert srt subtitles to ass.
  917|       |     * In legacy versions, they did not set the 'ScaledBorderAndShadow' header,
  918|       |     * but expected it to default to yes (which libass did).
  919|       |     * To avoid breaking them, we try to detect these
  920|       |     * converted subs by common properties of ffmpeg/libav's converted subs.
  921|       |     * Since files with custom format lines (-2014.10.11) default to SBAS=1
  922|       |     * regardless of being ffmpeg generated or not, we are only concerned with
  923|       |     * post-signature and pre-SBAS ffmpeg-files (2014.10.11-2020.04.17).
  924|       |     * We want to avoid matching modified ffmpeg files though.
  925|       |     *
  926|       |     * Relevant ffmpeg commits are:
  927|       |     *  2c77c90684e24ef16f7e7c4462e011434cee6a98  2010.12.29
  928|       |     *    Initial conversion format.
  929|       |     *    Style "Format:" line is mix of SSA and ASS
  930|       |     *    Event "Format:" line
  931|       |     *     "Format: Layer, Start, End, Text\r\n"
  932|       |     *    Only Header in ScriptInfo is "ScriptType: v4.00+"
  933|       |     *  0e7782c08ec77739edb0b98ba5d896b45e98235f  2012.06.15
  934|       |     *    Adds 'Style' to Event "Format:" line
  935|       |     *  5039aadf68deb9ad6dd0737ea11259fe53d3727b  2014.06.18
  936|       |     *    Adds PlayerRes(X|Y) (384x288)
  937|       |     *    (moved below ScriptType: a few minutes later)
  938|       |     *  40b9f28641b696c6bb73ce49dc97c2ce2700cbdb  2014.10.11 14:31:23 +0200
  939|       |     *    Regular full ASS Event and Style "Format:" lines
  940|       |     *  52b0a0ecaa02e17f7e01bead8c3f215f1cfd48dc  2014.10.11 18:37:43 +0200 <==
  941|       |     *    Signature comment
  942|       |     *  56bc0a6736cdc7edab837ff8f304661fd16de0e4  2015.02.08
  943|       |     *    Allow custom PlayRes(X|Y)
  944|       |     *  a8ba2a2c1294a330a0e79ae7f0d3a203a7599166  2020.04.17
  945|       |     *    Set 'ScaledBorderAndShadow: yes'
  946|       |     *
  947|       |     * libav outputs initial ffmpeg format. (no longer maintained)
  948|       |     */
  949|       |
  950|       |    // GENBY_FFMPEG and exact ffmpeg headers required
  951|     32|    if (track->parser_priv->header_flags
  ------------------
  |  Branch (951:9): [True: 32, False: 0]
  ------------------
  952|     32|            != (SINFO_SCRIPTTYPE | SINFO_PLAYRESX | SINFO_PLAYRESY | GENBY_FFMPEG))
  953|     32|        return false;
  954|       |
  955|       |    // Legacy ffmpeg only ever has one style
  956|       |    // Check 2 not 1 because libass also adds a def style
  957|      0|    if (track->n_styles != 2
  ------------------
  |  Branch (957:9): [True: 0, False: 0]
  ------------------
  958|      0|        || strncmp(track->styles[1].Name, "Default", 7))
  ------------------
  |  Branch (958:12): [True: 0, False: 0]
  ------------------
  959|      0|        return false;
  960|       |
  961|      0|    return true;
  962|      0|}
ass.c:process_fonts_line:
 1091|    316|{
 1092|    316|    size_t len;
 1093|       |
 1094|    316|    if (!strncmp(str, "fontname:", 9)) {
  ------------------
  |  Branch (1094:9): [True: 8, False: 308]
  ------------------
 1095|      8|        char *p = str + 9;
 1096|      8|        skip_spaces(&p);
 1097|      8|        if (track->parser_priv->fontname) {
  ------------------
  |  Branch (1097:13): [True: 2, False: 6]
  ------------------
 1098|      2|            decode_font(track);
 1099|      2|        }
 1100|      8|        track->parser_priv->fontname = strdup(p);
 1101|      8|        if (!track->parser_priv->fontname)
  ------------------
  |  Branch (1101:13): [True: 0, False: 8]
  ------------------
 1102|      0|            return -1;
 1103|      8|        ass_msg(track->library, MSGL_V, "Fontname: %s",
  ------------------
  |  |   43|      8|#define MSGL_V 6
  ------------------
 1104|      8|                track->parser_priv->fontname);
 1105|      8|        return 0;
 1106|      8|    }
 1107|       |
 1108|    308|    if (!track->parser_priv->fontname) {
  ------------------
  |  Branch (1108:9): [True: 0, False: 308]
  ------------------
 1109|      0|        ass_msg(track->library, MSGL_V, "Not understood: '%s'", str);
  ------------------
  |  |   43|      0|#define MSGL_V 6
  ------------------
 1110|      0|        return 1;
 1111|      0|    }
 1112|       |
 1113|    308|    len = strlen(str);
 1114|    308|    if (track->parser_priv->fontdata_used >=
  ------------------
  |  Branch (1114:9): [True: 0, False: 308]
  ------------------
 1115|    308|        SIZE_MAX - FFMAX(len, 100 * 1024)) {
  ------------------
  |  |   46|    308|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 23, False: 285]
  |  |  ------------------
  ------------------
 1116|      0|        goto mem_fail;
 1117|    308|    } else if (track->parser_priv->fontdata_used + len >
  ------------------
  |  Branch (1117:16): [True: 31, False: 277]
  ------------------
 1118|    308|               track->parser_priv->fontdata_size) {
 1119|     31|        size_t new_size =
 1120|     31|                track->parser_priv->fontdata_size + FFMAX(len, 100 * 1024);
  ------------------
  |  |   46|     31|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 23, False: 8]
  |  |  ------------------
  ------------------
 1121|     31|        if (!ASS_REALLOC_ARRAY(track->parser_priv->fontdata, new_size))
  ------------------
  |  |   91|     31|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (1121:13): [True: 0, False: 31]
  ------------------
 1122|      0|            goto mem_fail;
 1123|     31|        track->parser_priv->fontdata_size = new_size;
 1124|     31|    }
 1125|    308|    if (!track->parser_priv->fontdata)
  ------------------
  |  Branch (1125:9): [True: 0, False: 308]
  ------------------
 1126|      0|        return 0;
 1127|    308|    memcpy(track->parser_priv->fontdata + track->parser_priv->fontdata_used,
 1128|    308|           str, len);
 1129|    308|    track->parser_priv->fontdata_used += len;
 1130|       |
 1131|    308|    return 0;
 1132|       |
 1133|      0|mem_fail:
 1134|      0|    reset_embedded_font_parsing(track->parser_priv);
 1135|      0|    return -1;
 1136|    308|}
ass.c:reset_embedded_font_parsing:
 1038|      8|{
 1039|      8|    free(parser_priv->fontname);
 1040|      8|    free(parser_priv->fontdata);
 1041|      8|    parser_priv->fontname = NULL;
 1042|      8|    parser_priv->fontdata = NULL;
 1043|      8|    parser_priv->fontdata_size = 0;
 1044|      8|    parser_priv->fontdata_used = 0;
 1045|      8|}
ass.c:decode_font:
 1048|      8|{
 1049|      8|    unsigned char *p;
 1050|      8|    unsigned char *q;
 1051|      8|    size_t i;
 1052|      8|    size_t size;                   // original size
 1053|      8|    size_t dsize;                  // decoded size
 1054|      8|    unsigned char *buf = 0;
 1055|       |
 1056|      8|    ass_msg(track->library, MSGL_V, "Font: %zu bytes encoded data",
  ------------------
  |  |   43|      8|#define MSGL_V 6
  ------------------
 1057|      8|            track->parser_priv->fontdata_used);
 1058|      8|    size = track->parser_priv->fontdata_used;
 1059|      8|    if (size % 4 == 1) {
  ------------------
  |  Branch (1059:9): [True: 1, False: 7]
  ------------------
 1060|      1|        ass_msg(track->library, MSGL_ERR, "Bad encoded data size");
  ------------------
  |  |   40|      1|#define MSGL_ERR 1
  ------------------
 1061|      1|        goto error_decode_font;
 1062|      1|    }
 1063|      7|    buf = malloc(size / 4 * 3 + FFMAX(size % 4, 1) - 1);
  ------------------
  |  |   46|      7|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 5, False: 2]
  |  |  ------------------
  ------------------
 1064|      7|    if (!buf)
  ------------------
  |  Branch (1064:9): [True: 0, False: 7]
  ------------------
 1065|      0|        goto error_decode_font;
 1066|      7|    q = buf;
 1067|      7|    for (i = 0, p = (unsigned char *) track->parser_priv->fontdata;
 1068|  1.26M|         i < size / 4; i++, p += 4) {
  ------------------
  |  Branch (1068:10): [True: 1.26M, False: 7]
  ------------------
 1069|  1.26M|        q = decode_chars(p, q, 4);
 1070|  1.26M|    }
 1071|      7|    if (size % 4 == 2) {
  ------------------
  |  Branch (1071:9): [True: 2, False: 5]
  ------------------
 1072|      2|        q = decode_chars(p, q, 2);
 1073|      5|    } else if (size % 4 == 3) {
  ------------------
  |  Branch (1073:16): [True: 3, False: 2]
  ------------------
 1074|      3|        q = decode_chars(p, q, 3);
 1075|      3|    }
 1076|      7|    dsize = q - buf;
 1077|      7|    assert(dsize == size / 4 * 3 + FFMAX(size % 4, 1) - 1);
 1078|       |
 1079|      7|    if (track->library->extract_fonts) {
  ------------------
  |  Branch (1079:9): [True: 0, False: 7]
  ------------------
 1080|      0|        ass_add_font(track->library, track->parser_priv->fontname,
 1081|      0|                     (char *) buf, dsize);
 1082|      0|    }
 1083|       |
 1084|      8|error_decode_font:
 1085|      8|    free(buf);
 1086|      8|    reset_embedded_font_parsing(track->parser_priv);
 1087|      8|    return 0;
 1088|      7|}
ass.c:decode_chars:
 1024|  1.26M|{
 1025|  1.26M|    uint32_t value = 0;
 1026|  6.34M|    for (size_t i = 0; i < cnt_in; i++)
  ------------------
  |  Branch (1026:24): [True: 5.07M, False: 1.26M]
  ------------------
 1027|  5.07M|        value |= (uint32_t) ((src[i] - 33u) & 63) << 6 * (3 - i);
 1028|       |
 1029|  1.26M|    *dst++ = value >> 16;
 1030|  1.26M|    if (cnt_in >= 3)
  ------------------
  |  Branch (1030:9): [True: 1.26M, False: 2]
  ------------------
 1031|  1.26M|        *dst++ = value >> 8 & 0xff;
 1032|  1.26M|    if (cnt_in >= 4)
  ------------------
  |  Branch (1032:9): [True: 1.26M, False: 5]
  ------------------
 1033|  1.26M|        *dst++ = value & 0xff;
 1034|  1.26M|    return dst;
 1035|  1.26M|}
ass.c:event_format_fallback:
  899|     14|{
  900|     14|    track->parser_priv->state = PST_EVENTS;
  901|     14|    if (track->track_type == TRACK_TYPE_SSA)
  ------------------
  |  Branch (901:9): [True: 10, False: 4]
  ------------------
  902|     10|        track->event_format = strdup(ssa_event_format);
  903|      4|    else
  904|      4|        track->event_format = strdup(ass_event_format);
  905|     14|    ass_msg(track->library, MSGL_V,
  ------------------
  |  |   43|     14|#define MSGL_V 6
  ------------------
  906|     14|            "No event format found, using fallback");
  907|     14|}
ass.c:next_token:
  436|   756k|{
  437|   756k|    char *p;
  438|   756k|    char *start;
  439|   756k|    skip_spaces(str);
  440|   756k|    if (**str == '\0') {
  ------------------
  |  Branch (440:9): [True: 286k, False: 470k]
  ------------------
  441|   286k|        return 0;
  442|   286k|    }
  443|       |
  444|   470k|    advance_token_pos((const char**)str,
  445|   470k|                      (const char**)&start,
  446|   470k|                      (const char**)&p);
  447|       |
  448|   470k|    if (rtrim)
  ------------------
  |  Branch (448:9): [True: 469k, False: 995]
  ------------------
  449|   469k|        rskip_spaces(&p, start);
  450|   470k|    *p = '\0';
  451|   470k|    return start;
  452|   756k|}
ass.c:process_event_tail:
  463|   468k|{
  464|   468k|    char *token;
  465|   468k|    char *tname;
  466|   468k|    char *p = str;
  467|   468k|    int i;
  468|   468k|    ASS_Event *target = event;
  469|       |
  470|   468k|    char *format = strdup(track->event_format);
  471|   468k|    if (!format)
  ------------------
  |  Branch (471:9): [True: 0, False: 468k]
  ------------------
  472|      0|        return -1;
  473|   468k|    char *q = format;           // format scanning pointer
  474|       |
  475|   468k|    for (i = 0; i < n_ignored; ++i) {
  ------------------
  |  Branch (475:17): [True: 0, False: 468k]
  ------------------
  476|      0|        NEXTVAL(q, tname);
  ------------------
  |  |  373|      0|#define NEXTVAL(str,token) NEXT(str, token, false)
  |  |  ------------------
  |  |  |  |  370|      0|    token = next_token(&str, rtrim); \
  |  |  |  |  371|      0|    if (!token) break;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (371:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  477|      0|    }
  478|       |
  479|   469k|    while (1) {
  ------------------
  |  Branch (479:12): [Folded - Ignored]
  ------------------
  480|   469k|        NEXTNAME(q, tname);
  ------------------
  |  |  372|   469k|#define NEXTNAME(str,token) NEXT(str, token, true)
  |  |  ------------------
  |  |  |  |  370|   469k|    token = next_token(&str, rtrim); \
  |  |  |  |  371|   469k|    if (!token) break;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (371:9): [True: 0, False: 469k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  481|   469k|        if (ass_strcasecmp(tname, "Text") == 0) {
  ------------------
  |  Branch (481:13): [True: 182k, False: 287k]
  ------------------
  482|   182k|            event->Text = strdup(p);
  483|   182k|            if (event->Text && *event->Text != 0) {
  ------------------
  |  Branch (483:17): [True: 182k, False: 0]
  |  Branch (483:32): [True: 805, False: 181k]
  ------------------
  484|    805|                char *end = event->Text + strlen(event->Text);
  485|    823|                while (end > event->Text &&
  ------------------
  |  Branch (485:24): [True: 823, False: 0]
  ------------------
  486|    823|                       (end[-1] == '\r' || end[-1] == '\t' || end[-1] == ' '))
  ------------------
  |  Branch (486:25): [True: 0, False: 823]
  |  Branch (486:44): [True: 18, False: 805]
  |  Branch (486:63): [True: 0, False: 805]
  ------------------
  487|     18|                    *--end = 0;
  488|    805|            }
  489|   182k|            event->Duration -= event->Start;
  490|   182k|            free(format);
  491|   182k|            return event->Text ? 0 : -1;           // "Text" is always the last
  ------------------
  |  Branch (491:20): [True: 182k, False: 0]
  ------------------
  492|   182k|        }
  493|   287k|        NEXTVAL(p, token);
  ------------------
  |  |  373|   287k|#define NEXTVAL(str,token) NEXT(str, token, false)
  |  |  ------------------
  |  |  |  |  370|   287k|    token = next_token(&str, rtrim); \
  |  |  |  |  371|   287k|    if (!token) break;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (371:9): [True: 286k, False: 991]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  494|       |
  495|       |        ALIAS(End, Duration)    // temporarily store end timecode in event->Duration
  ------------------
  |  |  377|    991|        if (ass_strcasecmp(tname, #alias) == 0) {tname = #name;}
  |  |  ------------------
  |  |  |  Branch (377:13): [True: 62, False: 929]
  |  |  ------------------
  ------------------
  496|       |        ALIAS(Actor, Name)      // both variants are used in files
  ------------------
  |  |  377|    991|        if (ass_strcasecmp(tname, #alias) == 0) {tname = #name;}
  |  |  ------------------
  |  |  |  Branch (377:13): [True: 0, False: 991]
  |  |  ------------------
  ------------------
  497|    991|        PARSE_START
  ------------------
  |  |  389|    991|#define PARSE_START if (0) {
  |  |  ------------------
  |  |  |  Branch (389:25): [Folded - Ignored]
  |  |  ------------------
  ------------------
  498|    155|            INTVAL(Layer)
  ------------------
  |  |  414|      0|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|    991|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 155, False: 836]
  |  |  |  |  ------------------
  |  |  |  |  394|    155|        target->name = func(token);
  |  |  ------------------
  ------------------
  499|    155|            STYLEVAL(Style)
  ------------------
  |  |  421|    836|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  ------------------
  |  |  |  Branch (421:16): [True: 52, False: 784]
  |  |  ------------------
  |  |  422|     52|        target->name = ass_lookup_style(track, token);
  ------------------
  500|     52|            STRVAL(Name)
  ------------------
  |  |  397|    784|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  ------------------
  |  |  |  Branch (397:16): [True: 49, False: 735]
  |  |  ------------------
  |  |  398|     49|        char *new_str = strdup(token); \
  |  |  399|     49|        if (new_str) { \
  |  |  ------------------
  |  |  |  Branch (399:13): [True: 49, False: 0]
  |  |  ------------------
  |  |  400|     49|            free(target->name); \
  |  |  401|     49|            target->name = new_str; \
  |  |  402|     49|        }
  ------------------
  501|     49|            STRVAL(Effect)
  ------------------
  |  |  397|    735|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  ------------------
  |  |  |  Branch (397:16): [True: 49, False: 686]
  |  |  ------------------
  |  |  398|     49|        char *new_str = strdup(token); \
  |  |  399|     49|        if (new_str) { \
  |  |  ------------------
  |  |  |  Branch (399:13): [True: 49, False: 0]
  |  |  ------------------
  |  |  400|     49|            free(target->name); \
  |  |  401|     49|            target->name = new_str; \
  |  |  402|     49|        }
  ------------------
  502|     49|            INTVAL(MarginL)
  ------------------
  |  |  414|     49|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|    686|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 49, False: 637]
  |  |  |  |  ------------------
  |  |  |  |  394|     49|        target->name = func(token);
  |  |  ------------------
  ------------------
  503|     49|            INTVAL(MarginR)
  ------------------
  |  |  414|     49|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|    637|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 49, False: 588]
  |  |  |  |  ------------------
  |  |  |  |  394|     49|        target->name = func(token);
  |  |  ------------------
  ------------------
  504|     49|            INTVAL(MarginV)
  ------------------
  |  |  414|     49|#define INTVAL(name) ANYVAL(name,parse_int_header)
  |  |  ------------------
  |  |  |  |  393|    588|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (393:16): [True: 49, False: 539]
  |  |  |  |  ------------------
  |  |  |  |  394|     49|        target->name = func(token);
  |  |  ------------------
  ------------------
  505|     65|            TIMEVAL(Start)
  ------------------
  |  |  417|    539|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  ------------------
  |  |  |  Branch (417:16): [True: 65, False: 474]
  |  |  ------------------
  |  |  418|     65|        target->name = string2timecode(track->library, token);
  ------------------
  506|    536|            TIMEVAL(Duration)
  ------------------
  |  |  417|    474|    } else if (ass_strcasecmp(tname, #name) == 0) { \
  |  |  ------------------
  |  |  |  Branch (417:16): [True: 62, False: 412]
  |  |  ------------------
  |  |  418|     62|        target->name = string2timecode(track->library, token);
  ------------------
  507|    536|        PARSE_END
  ------------------
  |  |  390|     62|#define PARSE_END   }
  ------------------
  508|    991|    }
  509|   286k|    free(format);
  510|   286k|    return 1;
  511|   468k|}
ass.c:string2timecode:
  230|    127|{
  231|    127|    int h, m, s, ms;
  232|    127|    long long tm;
  233|    127|    int res = sscanf(p, "%d:%d:%d.%d", &h, &m, &s, &ms);
  234|    127|    if (res < 4) {
  ------------------
  |  Branch (234:9): [True: 71, False: 56]
  ------------------
  235|     71|        ass_msg(library, MSGL_WARN, "Bad timestamp");
  ------------------
  |  |   41|     71|#define MSGL_WARN 2
  ------------------
  236|     71|        return 0;
  237|     71|    }
  238|     56|    tm = ((h * 60LL + m) * 60 + s) * 1000 + ms * 10LL;
  239|     56|    return tm;
  240|    127|}
ass.c:parse_memory:
 1494|     33|{
 1495|     33|    ASS_Track *track;
 1496|     33|    int i;
 1497|       |
 1498|     33|    track = ass_new_track(library);
 1499|     33|    if (!track)
  ------------------
  |  Branch (1499:9): [True: 0, False: 33]
  ------------------
 1500|      0|        return NULL;
 1501|       |
 1502|       |    // process header
 1503|     33|    process_text(track, buf);
 1504|       |
 1505|       |    // external SSA/ASS subs does not have ReadOrder field
 1506|   182k|    for (i = 0; i < track->n_events; ++i)
  ------------------
  |  Branch (1506:17): [True: 182k, False: 33]
  ------------------
 1507|   182k|        track->events[i].ReadOrder = i;
 1508|       |
 1509|     33|    if (track->track_type == TRACK_TYPE_UNKNOWN) {
  ------------------
  |  Branch (1509:9): [True: 22, False: 11]
  ------------------
 1510|     22|        ass_free_track(track);
 1511|     22|        return 0;
 1512|     22|    }
 1513|       |
 1514|     11|    ass_process_force_style(track);
 1515|       |
 1516|     11|    return track;
 1517|     33|}
ass.c:set_default_style:
  210|     33|{
  211|     33|    style->Name             = strdup("Default");
  212|     33|    style->FontName         = strdup("Arial");
  213|     33|    style->FontSize         = 18;
  214|     33|    style->PrimaryColour    = 0xffffff00;
  215|     33|    style->SecondaryColour  = 0x00ffff00;
  216|     33|    style->OutlineColour    = 0x00000000;
  217|     33|    style->BackColour       = 0x00000080;
  218|     33|    style->Bold             = 200;
  219|     33|    style->ScaleX           = 1.0;
  220|     33|    style->ScaleY           = 1.0;
  221|     33|    style->Spacing          = 0;
  222|     33|    style->BorderStyle      = 1;
  223|     33|    style->Outline          = 2;
  224|     33|    style->Shadow           = 3;
  225|     33|    style->Alignment        = 2;
  226|     33|    style->MarginL = style->MarginR = style->MarginV = 20;
  227|     33|}

ass_synth_blur:
   70|     18|{
   71|     18|    if (!bm->buffer)
  ------------------
  |  Branch (71:9): [True: 0, False: 18]
  ------------------
   72|      0|        return;
   73|       |
   74|       |    // Apply gaussian blur
   75|     18|    if (blur_r2x > 0.001 || blur_r2y > 0.001)
  ------------------
  |  Branch (75:9): [True: 0, False: 18]
  |  Branch (75:29): [True: 0, False: 18]
  ------------------
   76|      0|        ass_gaussian_blur(engine, bm, blur_r2x, blur_r2y);
   77|       |
   78|     18|    if (!be)
  ------------------
  |  Branch (78:9): [True: 18, False: 0]
  ------------------
   79|     18|        return;
   80|       |
   81|       |    // Apply box blur (multiple passes, if requested)
   82|      0|    unsigned align = 1 << engine->align_order;
   83|      0|    size_t size = sizeof(uint16_t) * bm->stride * 2;
   84|      0|    uint16_t *tmp = ass_aligned_alloc(align, size, false);
   85|      0|    if (!tmp)
  ------------------
  |  Branch (85:9): [True: 0, False: 0]
  ------------------
   86|      0|        return;
   87|       |
   88|      0|    int32_t w = bm->w;
   89|      0|    int32_t h = bm->h;
   90|      0|    ptrdiff_t stride = bm->stride;
   91|      0|    uint8_t *buf = bm->buffer;
   92|      0|    if (--be) {
  ------------------
  |  Branch (92:9): [True: 0, False: 0]
  ------------------
   93|      0|        be_blur_pre(buf, stride, w, h);
   94|      0|        do {
   95|      0|            engine->be_blur(buf, stride, w, h, tmp);
   96|      0|        } while (--be);
  ------------------
  |  Branch (96:18): [True: 0, False: 0]
  ------------------
   97|      0|        be_blur_post(buf, stride, w, h);
   98|      0|    }
   99|      0|    engine->be_blur(buf, stride, w, h, tmp);
  100|      0|    ass_aligned_free(tmp);
  101|      0|}
ass_alloc_bitmap:
  105|    654|{
  106|    654|    unsigned align = 1 << engine->align_order;
  107|    654|    size_t s = ass_align(align, w);
  108|       |    // Too often we use ints as offset for bitmaps => use INT_MAX.
  109|    654|    if (s > (INT_MAX - align) / FFMAX(h, 1))
  ------------------
  |  |   46|    654|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 654, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (109:9): [True: 0, False: 654]
  ------------------
  110|      0|        return false;
  111|    654|    uint8_t *buf = ass_aligned_alloc(align, s * h + align, zero);
  112|    654|    if (!buf)
  ------------------
  |  Branch (112:9): [True: 0, False: 654]
  ------------------
  113|      0|        return false;
  114|    654|    bm->w = w;
  115|    654|    bm->h = h;
  116|    654|    bm->stride = s;
  117|    654|    bm->buffer = buf;
  118|    654|    return true;
  119|    654|}
ass_free_bitmap:
  131|    660|{
  132|    660|    ass_aligned_free(bm->buffer);
  133|    660|}
ass_copy_bitmap:
  136|     18|{
  137|     18|    if (!src->buffer) {
  ------------------
  |  Branch (137:9): [True: 0, False: 18]
  ------------------
  138|      0|        memset(dst, 0, sizeof(*dst));
  139|      0|        return true;
  140|      0|    }
  141|     18|    if (!ass_alloc_bitmap(engine, dst, src->w, src->h, false))
  ------------------
  |  Branch (141:9): [True: 0, False: 18]
  ------------------
  142|      0|        return false;
  143|     18|    dst->left = src->left;
  144|     18|    dst->top  = src->top;
  145|     18|    memcpy(dst->buffer, src->buffer, src->stride * src->h);
  146|     18|    return true;
  147|     18|}
ass_outline_to_bitmap:
  151|    606|{
  152|    606|    ASS_Renderer *render_priv = state->renderer;
  153|    606|    RasterizerData *rst = &state->rasterizer;
  154|    606|    if (outline1 && !ass_rasterizer_set_outline(rst, outline1, false)) {
  ------------------
  |  Branch (154:9): [True: 606, False: 0]
  |  Branch (154:21): [True: 0, False: 606]
  ------------------
  155|      0|        ass_msg(render_priv->library, MSGL_WARN, "Failed to process glyph outline!\n");
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  156|      0|        return false;
  157|      0|    }
  158|    606|    if (outline2 && !ass_rasterizer_set_outline(rst, outline2, !!outline1)) {
  ------------------
  |  Branch (158:9): [True: 606, False: 0]
  |  Branch (158:21): [True: 0, False: 606]
  ------------------
  159|      0|        ass_msg(render_priv->library, MSGL_WARN, "Failed to process glyph outline!\n");
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  160|      0|        return false;
  161|      0|    }
  162|    606|    if (rst->bbox.x_min > rst->bbox.x_max || rst->bbox.y_min > rst->bbox.y_max)
  ------------------
  |  Branch (162:9): [True: 6, False: 600]
  |  Branch (162:46): [True: 0, False: 600]
  ------------------
  163|      6|        return false;
  164|       |
  165|       |    // enlarge by 1/64th of pixel to bypass slow rasterizer path, add 1 pixel for shift_bitmap
  166|    600|    int32_t x_min = (rst->bbox.x_min -   1) >> 6;
  167|    600|    int32_t y_min = (rst->bbox.y_min -   1) >> 6;
  168|    600|    int32_t x_max = (rst->bbox.x_max + 127) >> 6;
  169|    600|    int32_t y_max = (rst->bbox.y_max + 127) >> 6;
  170|    600|    int32_t w = x_max - x_min;
  171|    600|    int32_t h = y_max - y_min;
  172|       |
  173|    600|    int mask = (1 << render_priv->engine.tile_order) - 1;
  174|       |
  175|       |    // XXX: is that possible to trigger at all?
  176|    600|    if (w < 0 || h < 0 || w > INT_MAX - mask || h > INT_MAX - mask) {
  ------------------
  |  Branch (176:9): [True: 0, False: 600]
  |  Branch (176:18): [True: 0, False: 600]
  |  Branch (176:27): [True: 0, False: 600]
  |  Branch (176:49): [True: 0, False: 600]
  ------------------
  177|      0|        ass_msg(render_priv->library, MSGL_WARN,
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  178|      0|                "Glyph bounding box too large: %dx%dpx", w, h);
  179|      0|        return false;
  180|      0|    }
  181|       |
  182|    600|    int32_t tile_w = (w + mask) & ~mask;
  183|    600|    int32_t tile_h = (h + mask) & ~mask;
  184|    600|    if (!ass_alloc_bitmap(&render_priv->engine, bm, tile_w, tile_h, false))
  ------------------
  |  Branch (184:9): [True: 0, False: 600]
  ------------------
  185|      0|        return false;
  186|    600|    bm->left = x_min;
  187|    600|    bm->top  = y_min;
  188|       |
  189|    600|    if (!ass_rasterizer_fill(&render_priv->engine, rst, bm->buffer,
  ------------------
  |  Branch (189:9): [True: 0, False: 600]
  ------------------
  190|    600|                             x_min, y_min, bm->stride, tile_h, bm->stride)) {
  191|      0|        ass_msg(render_priv->library, MSGL_WARN, "Failed to rasterize glyph!\n");
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  192|      0|        ass_free_bitmap(bm);
  193|      0|        return false;
  194|      0|    }
  195|       |
  196|    600|    return true;
  197|    600|}
ass_shift_bitmap:
  231|     18|{
  232|     18|    assert((shift_x & ~63) == 0 && (shift_y & ~63) == 0);
  233|       |
  234|     18|    if (!bm->buffer)
  ------------------
  |  Branch (234:9): [True: 0, False: 18]
  ------------------
  235|      0|        return;
  236|       |
  237|     18|    int32_t w = bm->w, h = bm->h;
  238|     18|    ptrdiff_t s = bm->stride;
  239|     18|    uint8_t *buf = bm->buffer;
  240|       |
  241|       |    // Shift in x direction
  242|     18|    if (shift_x)
  ------------------
  |  Branch (242:9): [True: 2, False: 16]
  ------------------
  243|     44|        for (int32_t y = 0; y < h; y++) {
  ------------------
  |  Branch (243:29): [True: 42, False: 2]
  ------------------
  244|  2.10k|            for (int32_t x = w - 1; x > 0; x--) {
  ------------------
  |  Branch (244:37): [True: 2.05k, False: 42]
  ------------------
  245|  2.05k|                uint8_t b = buf[x + y * s - 1] * shift_x >> 6;
  246|  2.05k|                buf[x + y * s - 1] -= b;
  247|  2.05k|                buf[x + y * s] += b;
  248|  2.05k|            }
  249|     42|        }
  250|       |
  251|       |    // Shift in y direction
  252|     18|    if (shift_y)
  ------------------
  |  Branch (252:9): [True: 0, False: 18]
  ------------------
  253|      0|        for (int32_t x = 0; x < w; x++) {
  ------------------
  |  Branch (253:29): [True: 0, False: 0]
  ------------------
  254|      0|            for (int32_t y = h - 1; y > 0; y--) {
  ------------------
  |  Branch (254:37): [True: 0, False: 0]
  ------------------
  255|      0|                uint8_t b = buf[x + y * s - s] * shift_y >> 6;
  256|      0|                buf[x + y * s - s] -= b;
  257|      0|                buf[x + y * s] += b;
  258|      0|            }
  259|      0|        }
  260|     18|}

ass_bitmap_engine_init:
  164|     33|{
  165|     33|    ALL_PROTOTYPES(16, c)
  ------------------
  |  |  102|     33|    RASTERIZER_PROTOTYPES(16, suffix) \
  |  |  ------------------
  |  |  |  |   29|     33|    FillSolidTileFunc     ass_fill_solid_tile     ## tile_size ## _ ## suffix; \
  |  |  |  |   30|     33|    FillHalfplaneTileFunc ass_fill_halfplane_tile ## tile_size ## _ ## suffix; \
  |  |  |  |   31|     33|    FillGenericTileFunc   ass_fill_generic_tile   ## tile_size ## _ ## suffix; \
  |  |  |  |   32|     33|    MergeTileFunc         ass_merge_tile          ## tile_size ## _ ## suffix;
  |  |  ------------------
  |  |  103|     33|    RASTERIZER_PROTOTYPES(32, suffix) \
  |  |  ------------------
  |  |  |  |   29|     33|    FillSolidTileFunc     ass_fill_solid_tile     ## tile_size ## _ ## suffix; \
  |  |  |  |   30|     33|    FillHalfplaneTileFunc ass_fill_halfplane_tile ## tile_size ## _ ## suffix; \
  |  |  |  |   31|     33|    FillGenericTileFunc   ass_fill_generic_tile   ## tile_size ## _ ## suffix; \
  |  |  |  |   32|     33|    MergeTileFunc         ass_merge_tile          ## tile_size ## _ ## suffix;
  |  |  ------------------
  |  |  104|     33|    GENERIC_PROTOTYPES(suffix) \
  |  |  ------------------
  |  |  |  |   47|     33|    BitmapBlendFunc ass_add_bitmaps_  ## suffix; \
  |  |  |  |   48|     33|    BitmapBlendFunc ass_imul_bitmaps_ ## suffix; \
  |  |  |  |   49|     33|    BitmapMulFunc   ass_mul_bitmaps_  ## suffix; \
  |  |  |  |   50|     33|    BeBlurFunc      ass_be_blur_      ## suffix;
  |  |  ------------------
  |  |  105|     33|    BLUR_PROTOTYPES(alignment, suffix)
  |  |  ------------------
  |  |  |  |   70|     33|    Convert8to16Func ass_stripe_unpack  ## stripe_width ## _ ## suffix; \
  |  |  |  |   71|     33|    Convert16to8Func ass_stripe_pack    ## stripe_width ## _ ## suffix; \
  |  |  |  |   72|     33|    FilterFunc       ass_shrink_horz    ## stripe_width ## _ ## suffix; \
  |  |  |  |   73|     33|    FilterFunc       ass_shrink_vert    ## stripe_width ## _ ## suffix; \
  |  |  |  |   74|     33|    FilterFunc       ass_expand_horz    ## stripe_width ## _ ## suffix; \
  |  |  |  |   75|     33|    FilterFunc       ass_expand_vert    ## stripe_width ## _ ## suffix; \
  |  |  |  |   76|     33|    ParamFilterFunc PARAM_BLUR_SET(horz ## stripe_width ## _ ## suffix); \
  |  |  |  |   77|     33|    ParamFilterFunc PARAM_BLUR_SET(vert ## stripe_width ## _ ## suffix);
  |  |  ------------------
  ------------------
  166|     33|    BLUR_PROTOTYPES(32, c)
  ------------------
  |  |   70|     33|    Convert8to16Func ass_stripe_unpack  ## stripe_width ## _ ## suffix; \
  |  |   71|     33|    Convert16to8Func ass_stripe_pack    ## stripe_width ## _ ## suffix; \
  |  |   72|     33|    FilterFunc       ass_shrink_horz    ## stripe_width ## _ ## suffix; \
  |  |   73|     33|    FilterFunc       ass_shrink_vert    ## stripe_width ## _ ## suffix; \
  |  |   74|     33|    FilterFunc       ass_expand_horz    ## stripe_width ## _ ## suffix; \
  |  |   75|     33|    FilterFunc       ass_expand_vert    ## stripe_width ## _ ## suffix; \
  |  |   76|     33|    ParamFilterFunc PARAM_BLUR_SET(horz ## stripe_width ## _ ## suffix); \
  |  |   77|     33|    ParamFilterFunc PARAM_BLUR_SET(vert ## stripe_width ## _ ## suffix);
  ------------------
  167|     33|    BitmapEngine engine = {0};
  168|     33|    engine.tile_order = mask & ASS_FLAG_LARGE_TILES ? 5 : 4;
  ------------------
  |  Branch (168:25): [True: 0, False: 33]
  ------------------
  169|       |
  170|       |#if CONFIG_ASM
  171|       |    unsigned flags = ass_get_cpu_flags(mask);
  172|       |#if ARCH_X86
  173|       |    if (flags & ASS_CPU_FLAG_X86_AVX2) {
  174|       |        ALL_PROTOTYPES(32, avx2)
  175|       |        ALL_FUNCTIONS(5, 32, avx2)
  176|       |        return engine;
  177|       |    } else if (flags & ASS_CPU_FLAG_X86_SSE2) {
  178|       |        ALL_PROTOTYPES(16, sse2)
  179|       |        ALL_FUNCTIONS(4, 16, sse2)
  180|       |        if (flags & ASS_CPU_FLAG_X86_SSSE3) {
  181|       |            ALL_PROTOTYPES(16, ssse3)
  182|       |            RASTERIZER_FUNCTION(fill_generic, ssse3)
  183|       |            GENERIC_FUNCTION(be_blur, ssse3)
  184|       |            BLUR_FUNCTION(shrink_horz, 16, ssse3)
  185|       |            BLUR_FUNCTION(expand_horz, 16, ssse3)
  186|       |            PARAM_BLUR_FUNCTION(horz, 16, ssse3)
  187|       |        }
  188|       |        return engine;
  189|       |    }
  190|       |#elif ARCH_AARCH64
  191|       |    if (flags & ASS_CPU_FLAG_ARM_NEON) {
  192|       |        ALL_PROTOTYPES(16, neon)
  193|       |        ALL_FUNCTIONS(4, 16, neon)
  194|       |        return engine;
  195|       |    }
  196|       |#endif
  197|       |#endif
  198|       |
  199|     33|    ALL_FUNCTIONS(4, 16, c)
  ------------------
  |  |  108|     33|    RASTERIZER_FUNCTIONS(suffix) \
  |  |  ------------------
  |  |  |  |   40|     33|    RASTERIZER_FUNCTION(fill_solid,     suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   35|     33|    engine.name = mask & ASS_FLAG_LARGE_TILES ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (35:19): [True: 0, False: 33]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   36|     33|        ass_ ## name ## _tile32_ ## suffix : \
  |  |  |  |  |  |   37|     33|        ass_ ## name ## _tile16_ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   41|     33|    RASTERIZER_FUNCTION(fill_halfplane, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   35|     33|    engine.name = mask & ASS_FLAG_LARGE_TILES ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (35:19): [True: 0, False: 33]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   36|     33|        ass_ ## name ## _tile32_ ## suffix : \
  |  |  |  |  |  |   37|     33|        ass_ ## name ## _tile16_ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   42|     33|    RASTERIZER_FUNCTION(fill_generic,   suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   35|     33|    engine.name = mask & ASS_FLAG_LARGE_TILES ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (35:19): [True: 0, False: 33]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   36|     33|        ass_ ## name ## _tile32_ ## suffix : \
  |  |  |  |  |  |   37|     33|        ass_ ## name ## _tile16_ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   43|     33|    RASTERIZER_FUNCTION(merge,          suffix)
  |  |  |  |  ------------------
  |  |  |  |  |  |   35|     33|    engine.name = mask & ASS_FLAG_LARGE_TILES ? \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (35:19): [True: 0, False: 33]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   36|     33|        ass_ ## name ## _tile32_ ## suffix : \
  |  |  |  |  |  |   37|     33|        ass_ ## name ## _tile16_ ## suffix;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  109|     33|    GENERIC_FUNCTIONS(suffix) \
  |  |  ------------------
  |  |  |  |   56|     33|    GENERIC_FUNCTION(add_bitmaps,  suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     33|    engine.name = ass_ ## name ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   57|     33|    GENERIC_FUNCTION(imul_bitmaps, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     33|    engine.name = ass_ ## name ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   58|     33|    GENERIC_FUNCTION(mul_bitmaps,  suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     33|    engine.name = ass_ ## name ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   59|     33|    GENERIC_FUNCTION(be_blur,      suffix)
  |  |  |  |  ------------------
  |  |  |  |  |  |   53|     33|    engine.name = ass_ ## name ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  110|     33|    BLUR_FUNCTIONS(align_order_, alignment, suffix)
  |  |  ------------------
  |  |  |  |   90|     33|    BLUR_FUNCTION(stripe_unpack, alignment, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   80|     33|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   91|     33|    BLUR_FUNCTION(stripe_pack,   alignment, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   80|     33|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   92|     33|    BLUR_FUNCTION(shrink_horz,   alignment, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   80|     33|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   93|     33|    BLUR_FUNCTION(shrink_vert,   alignment, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   80|     33|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   94|     33|    BLUR_FUNCTION(expand_horz,   alignment, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   80|     33|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   95|     33|    BLUR_FUNCTION(expand_vert,   alignment, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   80|     33|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   96|     33|    PARAM_BLUR_FUNCTION(horz, alignment, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   83|     33|    engine.blur_ ## dir[0] = ass_blur4_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |  |  |   84|     33|    engine.blur_ ## dir[1] = ass_blur5_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |  |  |   85|     33|    engine.blur_ ## dir[2] = ass_blur6_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |  |  |   86|     33|    engine.blur_ ## dir[3] = ass_blur7_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |  |  |   87|     33|    engine.blur_ ## dir[4] = ass_blur8_ ## dir ## alignment ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   97|     33|    PARAM_BLUR_FUNCTION(vert, alignment, suffix) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   83|     33|    engine.blur_ ## dir[0] = ass_blur4_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |  |  |   84|     33|    engine.blur_ ## dir[1] = ass_blur5_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |  |  |   85|     33|    engine.blur_ ## dir[2] = ass_blur6_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |  |  |   86|     33|    engine.blur_ ## dir[3] = ass_blur7_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |  |  |   87|     33|    engine.blur_ ## dir[4] = ass_blur8_ ## dir ## alignment ## _ ## suffix;
  |  |  |  |  ------------------
  |  |  |  |   98|     33|    engine.align_order = align_order_;
  |  |  ------------------
  ------------------
  200|     33|    if (mask & ASS_FLAG_WIDE_STRIPE) {
  ------------------
  |  Branch (200:9): [True: 0, False: 33]
  ------------------
  201|      0|        BLUR_FUNCTIONS(5, 32, c)
  ------------------
  |  |   90|      0|    BLUR_FUNCTION(stripe_unpack, alignment, suffix) \
  |  |  ------------------
  |  |  |  |   80|      0|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  ------------------
  |  |   91|      0|    BLUR_FUNCTION(stripe_pack,   alignment, suffix) \
  |  |  ------------------
  |  |  |  |   80|      0|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  ------------------
  |  |   92|      0|    BLUR_FUNCTION(shrink_horz,   alignment, suffix) \
  |  |  ------------------
  |  |  |  |   80|      0|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  ------------------
  |  |   93|      0|    BLUR_FUNCTION(shrink_vert,   alignment, suffix) \
  |  |  ------------------
  |  |  |  |   80|      0|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  ------------------
  |  |   94|      0|    BLUR_FUNCTION(expand_horz,   alignment, suffix) \
  |  |  ------------------
  |  |  |  |   80|      0|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  ------------------
  |  |   95|      0|    BLUR_FUNCTION(expand_vert,   alignment, suffix) \
  |  |  ------------------
  |  |  |  |   80|      0|    engine.name = ass_ ## name ## alignment ## _ ## suffix;
  |  |  ------------------
  |  |   96|      0|    PARAM_BLUR_FUNCTION(horz, alignment, suffix) \
  |  |  ------------------
  |  |  |  |   83|      0|    engine.blur_ ## dir[0] = ass_blur4_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |   84|      0|    engine.blur_ ## dir[1] = ass_blur5_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |   85|      0|    engine.blur_ ## dir[2] = ass_blur6_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |   86|      0|    engine.blur_ ## dir[3] = ass_blur7_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |   87|      0|    engine.blur_ ## dir[4] = ass_blur8_ ## dir ## alignment ## _ ## suffix;
  |  |  ------------------
  |  |   97|      0|    PARAM_BLUR_FUNCTION(vert, alignment, suffix) \
  |  |  ------------------
  |  |  |  |   83|      0|    engine.blur_ ## dir[0] = ass_blur4_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |   84|      0|    engine.blur_ ## dir[1] = ass_blur5_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |   85|      0|    engine.blur_ ## dir[2] = ass_blur6_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |   86|      0|    engine.blur_ ## dir[3] = ass_blur7_ ## dir ## alignment ## _ ## suffix; \
  |  |  |  |   87|      0|    engine.blur_ ## dir[4] = ass_blur8_ ## dir ## alignment ## _ ## suffix;
  |  |  ------------------
  |  |   98|      0|    engine.align_order = align_order_;
  ------------------
  202|      0|    }
  203|     33|    return engine;
  204|     33|}

ass_cache_create:
  337|    165|{
  338|    165|    Cache *cache = calloc(1, sizeof(*cache));
  339|    165|    if (!cache)
  ------------------
  |  Branch (339:9): [True: 0, False: 165]
  ------------------
  340|      0|        return NULL;
  341|    165|    cache->buckets = 0xFFFF;
  342|    165|    cache->queue_last = &cache->queue_first;
  343|    165|    cache->desc = desc;
  344|    165|    cache->map = calloc(cache->buckets, sizeof(CacheItem *));
  345|    165|    if (!cache->map) {
  ------------------
  |  Branch (345:9): [True: 0, False: 165]
  ------------------
  346|      0|        free(cache);
  347|      0|        return NULL;
  348|      0|    }
  349|       |
  350|    165|    return cache;
  351|    165|}
ass_cache_get:
  354|  14.4M|{
  355|  14.4M|    const CacheDesc *desc = cache->desc;
  356|  14.4M|    size_t key_offs = CACHE_ITEM_SIZE + align_cache(desc->value_size);
  ------------------
  |  |  322|  14.4M|#define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  14.4M|#define CACHE_ALIGN 8
  |  |  ------------------
  |  |               #define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  14.4M|#define CACHE_ALIGN 8
  |  |  ------------------
  ------------------
  357|  14.4M|    unsigned bucket = desc->hash_func(key, ASS_HASH_INIT) % cache->buckets;
  ------------------
  |  |   38|  14.4M|#define ASS_HASH_INIT 0xb3e46a540bd36cd4ULL
  ------------------
  358|  14.4M|    CacheItem *item = cache->map[bucket];
  359|  14.4M|    while (item) {
  ------------------
  |  Branch (359:12): [True: 14.4M, False: 1.31k]
  ------------------
  360|  14.4M|        if (desc->compare_func(key, (char *) item + key_offs)) {
  ------------------
  |  Branch (360:13): [True: 14.4M, False: 57]
  ------------------
  361|  14.4M|            assert(item->size);
  362|  14.4M|            if (!item->queue_prev || item->queue_next) {
  ------------------
  |  Branch (362:17): [True: 0, False: 14.4M]
  |  Branch (362:38): [True: 7.02M, False: 7.43M]
  ------------------
  363|  7.02M|                if (item->queue_prev) {
  ------------------
  |  Branch (363:21): [True: 7.02M, False: 0]
  ------------------
  364|  7.02M|                    item->queue_next->queue_prev = item->queue_prev;
  365|  7.02M|                    *item->queue_prev = item->queue_next;
  366|  7.02M|                } else
  367|      0|                    item->ref_count++;
  368|  7.02M|                *cache->queue_last = item;
  369|  7.02M|                item->queue_prev = cache->queue_last;
  370|  7.02M|                cache->queue_last = &item->queue_next;
  371|  7.02M|                item->queue_next = NULL;
  372|  7.02M|            }
  373|  14.4M|            cache->hits++;
  374|  14.4M|            desc->key_move_func(NULL, key);
  375|  14.4M|            item->ref_count++;
  376|  14.4M|            return (char *) item + CACHE_ITEM_SIZE;
  ------------------
  |  |  322|  14.4M|#define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  14.4M|#define CACHE_ALIGN 8
  |  |  ------------------
  |  |               #define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  14.4M|#define CACHE_ALIGN 8
  |  |  ------------------
  ------------------
  377|  14.4M|        }
  378|     57|        item = item->next;
  379|     57|    }
  380|  1.31k|    cache->misses++;
  381|       |
  382|  1.31k|    item = malloc(key_offs + desc->key_size);
  383|  1.31k|    if (!item) {
  ------------------
  |  Branch (383:9): [True: 0, False: 1.31k]
  ------------------
  384|      0|        desc->key_move_func(NULL, key);
  385|      0|        return NULL;
  386|      0|    }
  387|  1.31k|    item->cache = cache;
  388|  1.31k|    item->desc = desc;
  389|  1.31k|    void *new_key = (char *) item + key_offs;
  390|  1.31k|    if (!desc->key_move_func(new_key, key)) {
  ------------------
  |  Branch (390:9): [True: 0, False: 1.31k]
  ------------------
  391|      0|        free(item);
  392|      0|        return NULL;
  393|      0|    }
  394|  1.31k|    void *value = (char *) item + CACHE_ITEM_SIZE;
  ------------------
  |  |  322|  1.31k|#define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  1.31k|#define CACHE_ALIGN 8
  |  |  ------------------
  |  |               #define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  1.31k|#define CACHE_ALIGN 8
  |  |  ------------------
  ------------------
  395|  1.31k|    item->size = desc->construct_func(new_key, value, priv);
  396|  1.31k|    assert(item->size);
  397|       |
  398|  1.31k|    CacheItem **bucketptr = &cache->map[bucket];
  399|  1.31k|    if (*bucketptr)
  ------------------
  |  Branch (399:9): [True: 5, False: 1.30k]
  ------------------
  400|      5|        (*bucketptr)->prev = &item->next;
  401|  1.31k|    item->prev = bucketptr;
  402|  1.31k|    item->next = *bucketptr;
  403|  1.31k|    *bucketptr = item;
  404|       |
  405|  1.31k|    *cache->queue_last = item;
  406|  1.31k|    item->queue_prev = cache->queue_last;
  407|  1.31k|    cache->queue_last = &item->queue_next;
  408|  1.31k|    item->queue_next = NULL;
  409|  1.31k|    item->ref_count = 2;
  410|       |
  411|  1.31k|    cache->cache_size += item->size + (item->size == 1 ? 0 : CACHE_ITEM_SIZE);
  ------------------
  |  |  322|    624|#define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|    624|#define CACHE_ALIGN 8
  |  |  ------------------
  |  |               #define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|    624|#define CACHE_ALIGN 8
  |  |  ------------------
  ------------------
  |  Branch (411:40): [True: 690, False: 624]
  ------------------
  412|  1.31k|    cache->items++;
  413|  1.31k|    return value;
  414|  1.31k|}
ass_cache_inc_ref:
  431|  3.24M|{
  432|  3.24M|    if (!value)
  ------------------
  |  Branch (432:9): [True: 0, False: 3.24M]
  ------------------
  433|      0|        return;
  434|  3.24M|    CacheItem *item = value_to_item(value);
  435|  3.24M|    assert(item->size && item->ref_count);
  436|  3.24M|    item->ref_count++;
  437|  3.24M|}
ass_cache_dec_ref:
  440|  20.4M|{
  441|  20.4M|    if (!value)
  ------------------
  |  Branch (441:9): [True: 2.79M, False: 17.6M]
  ------------------
  442|  2.79M|        return;
  443|  17.6M|    CacheItem *item = value_to_item(value);
  444|  17.6M|    assert(item->size && item->ref_count);
  445|  17.6M|    if (--item->ref_count)
  ------------------
  |  Branch (445:9): [True: 17.6M, False: 63]
  ------------------
  446|  17.6M|        return;
  447|       |
  448|     63|    Cache *cache = item->cache;
  449|     63|    if (cache) {
  ------------------
  |  Branch (449:9): [True: 0, False: 63]
  ------------------
  450|      0|        if (item->next)
  ------------------
  |  Branch (450:13): [True: 0, False: 0]
  ------------------
  451|      0|            item->next->prev = item->prev;
  452|      0|        *item->prev = item->next;
  453|       |
  454|      0|        cache->items--;
  455|      0|        cache->cache_size -= item->size + (item->size == 1 ? 0 : CACHE_ITEM_SIZE);
  ------------------
  |  |  322|      0|#define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|      0|#define CACHE_ALIGN 8
  |  |  ------------------
  |  |               #define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|      0|#define CACHE_ALIGN 8
  |  |  ------------------
  ------------------
  |  Branch (455:44): [True: 0, False: 0]
  ------------------
  456|      0|    }
  457|     63|    destroy_item(item->desc, item);
  458|     63|}
ass_cache_cut:
  461|   153k|{
  462|   153k|    if (cache->cache_size <= max_size)
  ------------------
  |  Branch (462:9): [True: 153k, False: 0]
  ------------------
  463|   153k|        return;
  464|       |
  465|      0|    do {
  466|      0|        CacheItem *item = cache->queue_first;
  467|      0|        if (!item)
  ------------------
  |  Branch (467:13): [True: 0, False: 0]
  ------------------
  468|      0|            break;
  469|      0|        assert(item->size);
  470|       |
  471|      0|        cache->queue_first = item->queue_next;
  472|      0|        if (--item->ref_count) {
  ------------------
  |  Branch (472:13): [True: 0, False: 0]
  ------------------
  473|      0|            item->queue_prev = NULL;
  474|      0|            continue;
  475|      0|        }
  476|       |
  477|      0|        if (item->next)
  ------------------
  |  Branch (477:13): [True: 0, False: 0]
  ------------------
  478|      0|            item->next->prev = item->prev;
  479|      0|        *item->prev = item->next;
  480|       |
  481|      0|        cache->items--;
  482|      0|        cache->cache_size -= item->size + (item->size == 1 ? 0 : CACHE_ITEM_SIZE);
  ------------------
  |  |  322|      0|#define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|      0|#define CACHE_ALIGN 8
  |  |  ------------------
  |  |               #define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|      0|#define CACHE_ALIGN 8
  |  |  ------------------
  ------------------
  |  Branch (482:44): [True: 0, False: 0]
  ------------------
  483|      0|        destroy_item(cache->desc, item);
  484|      0|    } while (cache->cache_size > max_size);
  ------------------
  |  Branch (484:14): [True: 0, False: 0]
  ------------------
  485|      0|    if (cache->queue_first)
  ------------------
  |  Branch (485:9): [True: 0, False: 0]
  ------------------
  486|      0|        cache->queue_first->queue_prev = &cache->queue_first;
  487|      0|    else
  488|      0|        cache->queue_last = &cache->queue_first;
  489|      0|}
ass_cache_empty:
  505|    528|{
  506|  34.6M|    for (int i = 0; i < cache->buckets; i++) {
  ------------------
  |  Branch (506:21): [True: 34.6M, False: 528]
  ------------------
  507|  34.6M|        CacheItem *item = cache->map[i];
  508|  34.6M|        while (item) {
  ------------------
  |  Branch (508:16): [True: 1.31k, False: 34.6M]
  ------------------
  509|  1.31k|            assert(item->size);
  510|  1.31k|            CacheItem *next = item->next;
  511|  1.31k|            if (item->queue_prev)
  ------------------
  |  Branch (511:17): [True: 1.31k, False: 0]
  ------------------
  512|  1.31k|                item->ref_count--;
  513|  1.31k|            if (item->ref_count)
  ------------------
  |  Branch (513:17): [True: 63, False: 1.25k]
  ------------------
  514|     63|                item->cache = NULL;
  515|  1.25k|            else
  516|  1.25k|                destroy_item(cache->desc, item);
  517|  1.31k|            item = next;
  518|  1.31k|        }
  519|  34.6M|        cache->map[i] = NULL;
  520|  34.6M|    }
  521|       |
  522|    528|    cache->queue_first = NULL;
  523|    528|    cache->queue_last = &cache->queue_first;
  524|    528|    cache->items = cache->hits = cache->misses = cache->cache_size = 0;
  525|    528|}
ass_cache_done:
  528|    165|{
  529|    165|    ass_cache_empty(cache);
  530|    165|    free(cache->map);
  531|    165|    free(cache);
  532|    165|}
ass_font_cache_create:
  536|     33|{
  537|     33|    return ass_cache_create(&font_cache_desc);
  538|     33|}
ass_outline_cache_create:
  541|     33|{
  542|     33|    return ass_cache_create(&outline_cache_desc);
  543|     33|}
ass_glyph_metrics_cache_create:
  546|     33|{
  547|     33|    return ass_cache_create(&glyph_metrics_cache_desc);
  548|     33|}
ass_bitmap_cache_create:
  551|     33|{
  552|     33|    return ass_cache_create(&bitmap_cache_desc);
  553|     33|}
ass_composite_cache_create:
  556|     33|{
  557|     33|    return ass_cache_create(&composite_cache_desc);
  558|     33|}
ass_cache.c:ass_hash_buf:
   41|  98.1M|{
   42|  98.1M|    return wyhash(buf, len, hval, _wyp);
   43|  98.1M|}
ass_cache.c:font_key_move:
   54|   512k|{
   55|   512k|    ASS_FontDesc *d = dst, *s = src;
   56|   512k|    if (!d)
  ------------------
  |  Branch (56:9): [True: 512k, False: 201]
  ------------------
   57|   512k|        return true;
   58|       |
   59|    201|    *d = *s;
   60|    201|    d->family.str = ass_copy_string(s->family);
   61|    201|    return d->family.str;
   62|   512k|}
ass_cache.c:font_destruct:
   65|    201|{
   66|    201|    ass_font_clear(value);
   67|    201|}
ass_cache.c:bitmap_key_move:
   84|  3.68M|{
   85|  3.68M|    BitmapHashKey *d = dst, *s = src;
   86|  3.68M|    if (d)
  ------------------
  |  Branch (86:9): [True: 606, False: 3.68M]
  ------------------
   87|    606|        *d = *s;
   88|  3.68M|    else
   89|  3.68M|        ass_cache_dec_ref(s->outline);
   90|  3.68M|    return true;
   91|  3.68M|}
ass_cache.c:bitmap_destruct:
   94|    606|{
   95|    606|    BitmapHashKey *k = key;
   96|    606|    ass_free_bitmap(value);
   97|    606|    ass_cache_dec_ref(k->outline);
   98|    606|}
ass_cache.c:composite_hash:
  115|   102k|{
  116|   102k|    CompositeHashKey *k = key;
  117|   102k|    hval = filter_hash(&k->filter, hval);
  118|  1.94M|    for (size_t i = 0; i < k->bitmap_count; i++)
  ------------------
  |  Branch (118:24): [True: 1.84M, False: 102k]
  ------------------
  119|  1.84M|        hval = bitmap_ref_hash(&k->bitmaps[i], hval);
  120|   102k|    return hval;
  121|   102k|}
ass_cache.c:composite_compare:
  124|   102k|{
  125|   102k|    CompositeHashKey *ak = a;
  126|   102k|    CompositeHashKey *bk = b;
  127|   102k|    if (!filter_compare(&ak->filter, &bk->filter))
  ------------------
  |  Branch (127:9): [True: 0, False: 102k]
  ------------------
  128|      0|        return false;
  129|   102k|    if (ak->bitmap_count != bk->bitmap_count)
  ------------------
  |  Branch (129:9): [True: 0, False: 102k]
  ------------------
  130|      0|        return false;
  131|  1.72M|    for (size_t i = 0; i < ak->bitmap_count; i++)
  ------------------
  |  Branch (131:24): [True: 1.62M, False: 102k]
  ------------------
  132|  1.62M|        if (!bitmap_ref_compare(&ak->bitmaps[i], &bk->bitmaps[i]))
  ------------------
  |  Branch (132:13): [True: 0, False: 1.62M]
  ------------------
  133|      0|            return false;
  134|   102k|    return true;
  135|   102k|}
ass_cache.c:composite_key_move:
  138|   102k|{
  139|   102k|    CompositeHashKey *d = dst, *s = src;
  140|   102k|    if (d) {
  ------------------
  |  Branch (140:9): [True: 18, False: 102k]
  ------------------
  141|     18|        *d = *s;
  142|     18|        return true;
  143|     18|    }
  144|       |
  145|  1.72M|    for (size_t i = 0; i < s->bitmap_count; i++) {
  ------------------
  |  Branch (145:24): [True: 1.62M, False: 102k]
  ------------------
  146|  1.62M|        ass_cache_dec_ref(s->bitmaps[i].bm);
  147|  1.62M|        ass_cache_dec_ref(s->bitmaps[i].bm_o);
  148|  1.62M|    }
  149|   102k|    free(s->bitmaps);
  150|   102k|    return true;
  151|   102k|}
ass_cache.c:composite_destruct:
  154|     18|{
  155|     18|    CompositeHashValue *v = value;
  156|     18|    CompositeHashKey *k = key;
  157|     18|    ass_free_bitmap(&v->bm);
  158|     18|    ass_free_bitmap(&v->bm_o);
  159|     18|    ass_free_bitmap(&v->bm_s);
  160|   221k|    for (size_t i = 0; i < k->bitmap_count; i++) {
  ------------------
  |  Branch (160:24): [True: 221k, False: 18]
  ------------------
  161|   221k|        ass_cache_dec_ref(k->bitmaps[i].bm);
  162|   221k|        ass_cache_dec_ref(k->bitmaps[i].bm_o);
  163|   221k|    }
  164|     18|    free(k->bitmaps);
  165|     18|}
ass_cache.c:outline_hash:
  182|  4.77M|{
  183|  4.77M|    OutlineHashKey *k = key;
  184|  4.77M|    switch (k->type) {
  185|  2.93M|    case OUTLINE_GLYPH:
  ------------------
  |  Branch (185:5): [True: 2.93M, False: 1.84M]
  ------------------
  186|  2.93M|        return glyph_hash(&k->u, hval);
  187|      0|    case OUTLINE_DRAWING:
  ------------------
  |  Branch (187:5): [True: 0, False: 4.77M]
  ------------------
  188|      0|        return drawing_hash(&k->u, hval);
  189|  1.84M|    case OUTLINE_BORDER:
  ------------------
  |  Branch (189:5): [True: 1.84M, False: 2.93M]
  ------------------
  190|  1.84M|        return border_hash(&k->u, hval);
  191|      0|    default:  // OUTLINE_BOX
  ------------------
  |  Branch (191:5): [True: 0, False: 4.77M]
  ------------------
  192|      0|        return hval;
  193|  4.77M|    }
  194|  4.77M|}
ass_cache.c:outline_compare:
  197|  4.77M|{
  198|  4.77M|    OutlineHashKey *ak = a;
  199|  4.77M|    OutlineHashKey *bk = b;
  200|  4.77M|    if (ak->type != bk->type)
  ------------------
  |  Branch (200:9): [True: 0, False: 4.77M]
  ------------------
  201|      0|        return false;
  202|  4.77M|    switch (ak->type) {
  203|  2.93M|    case OUTLINE_GLYPH:
  ------------------
  |  Branch (203:5): [True: 2.93M, False: 1.84M]
  ------------------
  204|  2.93M|        return glyph_compare(&ak->u, &bk->u);
  205|      0|    case OUTLINE_DRAWING:
  ------------------
  |  Branch (205:5): [True: 0, False: 4.77M]
  ------------------
  206|      0|        return drawing_compare(&ak->u, &bk->u);
  207|  1.84M|    case OUTLINE_BORDER:
  ------------------
  |  Branch (207:5): [True: 1.84M, False: 2.93M]
  ------------------
  208|  1.84M|        return border_compare(&ak->u, &bk->u);
  209|      0|    default:  // OUTLINE_BOX
  ------------------
  |  Branch (209:5): [True: 0, False: 4.77M]
  ------------------
  210|      0|        return true;
  211|  4.77M|    }
  212|  4.77M|}
ass_cache.c:outline_key_move:
  215|  4.77M|{
  216|  4.77M|    OutlineHashKey *d = dst, *s = src;
  217|  4.77M|    if (!d) {
  ------------------
  |  Branch (217:9): [True: 4.77M, False: 309]
  ------------------
  218|  4.77M|        if (s->type == OUTLINE_GLYPH)
  ------------------
  |  Branch (218:13): [True: 2.93M, False: 1.84M]
  ------------------
  219|  2.93M|            ass_cache_dec_ref(s->u.glyph.font);
  220|  4.77M|        return true;
  221|  4.77M|    }
  222|       |
  223|    309|    *d = *s;
  224|    309|    if (s->type == OUTLINE_DRAWING) {
  ------------------
  |  Branch (224:9): [True: 0, False: 309]
  ------------------
  225|      0|        d->u.drawing.text.str = ass_copy_string(s->u.drawing.text);
  226|      0|        return d->u.drawing.text.str;
  227|      0|    }
  228|    309|    if (s->type == OUTLINE_BORDER)
  ------------------
  |  Branch (228:9): [True: 129, False: 180]
  ------------------
  229|    129|        ass_cache_inc_ref(s->u.border.outline);
  230|    309|    return true;
  231|    309|}
ass_cache.c:outline_destruct:
  234|    309|{
  235|    309|    OutlineHashValue *v = value;
  236|    309|    OutlineHashKey *k = key;
  237|    309|    ass_outline_free(&v->outline[0]);
  238|    309|    ass_outline_free(&v->outline[1]);
  239|    309|    switch (k->type) {
  240|    180|    case OUTLINE_GLYPH:
  ------------------
  |  Branch (240:5): [True: 180, False: 129]
  ------------------
  241|    180|        ass_cache_dec_ref(k->u.glyph.font);
  242|    180|        break;
  243|      0|    case OUTLINE_DRAWING:
  ------------------
  |  Branch (243:5): [True: 0, False: 309]
  ------------------
  244|      0|        free((char *) k->u.drawing.text.str);
  245|      0|        break;
  246|    129|    case OUTLINE_BORDER:
  ------------------
  |  Branch (246:5): [True: 129, False: 180]
  ------------------
  247|    129|        ass_cache_dec_ref(k->u.border.outline);
  248|    129|        break;
  249|      0|    default:  // OUTLINE_BOX
  ------------------
  |  Branch (249:5): [True: 0, False: 309]
  ------------------
  250|      0|        break;
  251|    309|    }
  252|    309|}
ass_cache.c:glyph_metrics_key_move:
  269|  5.37M|{
  270|  5.37M|    GlyphMetricsHashKey *d = dst, *s = src;
  271|  5.37M|    if (!d)
  ------------------
  |  Branch (271:9): [True: 5.37M, False: 180]
  ------------------
  272|  5.37M|        return true;
  273|       |
  274|    180|    *d = *s;
  275|    180|    ass_cache_inc_ref(s->font);
  276|    180|    return true;
  277|  5.37M|}
ass_cache.c:glyph_metrics_destruct:
  280|    180|{
  281|    180|    GlyphMetricsHashKey *k = key;
  282|    180|    ass_cache_dec_ref(k->font);
  283|    180|}
ass_cache.c:align_cache:
  325|  14.4M|{
  326|  14.4M|    return (size + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1);
  ------------------
  |  |  321|  14.4M|#define CACHE_ALIGN 8
  ------------------
                  return (size + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1);
  ------------------
  |  |  321|  14.4M|#define CACHE_ALIGN 8
  ------------------
  327|  14.4M|}
ass_cache.c:value_to_item:
  330|  20.9M|{
  331|  20.9M|    return (CacheItem *) ((char *) value - CACHE_ITEM_SIZE);
  ------------------
  |  |  322|  20.9M|#define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  20.9M|#define CACHE_ALIGN 8
  |  |  ------------------
  |  |               #define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  20.9M|#define CACHE_ALIGN 8
  |  |  ------------------
  ------------------
  332|  20.9M|}
ass_cache.c:destroy_item:
  423|  1.31k|{
  424|  1.31k|    assert(item->desc == desc);
  425|  1.31k|    char *value = (char *) item + CACHE_ITEM_SIZE;
  ------------------
  |  |  322|  1.31k|#define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  1.31k|#define CACHE_ALIGN 8
  |  |  ------------------
  |  |               #define CACHE_ITEM_SIZE ((sizeof(CacheItem) + (CACHE_ALIGN - 1)) & ~(CACHE_ALIGN - 1))
  |  |  ------------------
  |  |  |  |  321|  1.31k|#define CACHE_ALIGN 8
  |  |  ------------------
  ------------------
  426|  1.31k|    desc->destruct_func(value + align_cache(desc->value_size), value);
  427|  1.31k|    free(item);
  428|  1.31k|}

ass_cache.c:font_hash:
   53|   512k|START(font, ass_font_desc )
  ------------------
  |  |   36|   512k|    { \
  |  |   37|   512k|        struct structname *p = buf;
  ------------------
   54|   512k|    STRING(family)
  ------------------
  |  |   41|   512k|        hval = ass_hash_buf(p->member.str, p->member.len, hval);
  ------------------
   55|   512k|    GENERIC(unsigned, bold)
  ------------------
  |  |   39|   512k|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   56|   512k|    GENERIC(unsigned, italic)
  ------------------
  |  |   39|   512k|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   57|       |    GENERIC(int, vertical)  // @font vertical layout
  ------------------
  |  |   39|   512k|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   58|   512k|END(ASS_FontDesc)
  ------------------
  |  |   44|   512k|        return hval; \
  |  |   45|   512k|    }
  ------------------
ass_cache.c:font_compare:
   53|   512k|START(font, ass_font_desc )
  ------------------
  |  |   17|   512k|    static bool funcname##_compare(void *key1, void *key2) \
  |  |   18|   512k|    { \
  |  |   19|   512k|        struct structname *a = key1; \
  |  |   20|   512k|        struct structname *b = key2; \
  |  |   21|   512k|        return // conditions follow
  ------------------
   54|   512k|    STRING(family)
  ------------------
  |  |   25|   512k|            ass_string_equal(a->member, b->member) &&
  |  |  ------------------
  |  |  |  Branch (25:13): [True: 512k, False: 15]
  |  |  ------------------
  ------------------
   55|   512k|    GENERIC(unsigned, bold)
  ------------------
  |  |   23|   512k|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 512k, False: 0]
  |  |  ------------------
  ------------------
   56|   512k|    GENERIC(unsigned, italic)
  ------------------
  |  |   23|   512k|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 512k, False: 0]
  |  |  ------------------
  ------------------
   57|       |    GENERIC(int, vertical)  // @font vertical layout
  ------------------
  |  |   23|   512k|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 512k, False: 0]
  |  |  ------------------
  ------------------
   58|   512k|END(ASS_FontDesc)
  ------------------
  |  |   29|   512k|            true; \
  |  |   30|   512k|    }
  ------------------
ass_cache.c:bitmap_hash:
   61|  3.68M|START(bitmap, bitmap_hash_key)
  ------------------
  |  |   36|  3.68M|    { \
  |  |   37|  3.68M|        struct structname *p = buf;
  ------------------
   62|  3.68M|    GENERIC(OutlineHashValue *, outline)
  ------------------
  |  |   39|  3.68M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   63|       |    // quantized transform matrix
   64|  3.68M|    VECTOR(offset)
  ------------------
  |  |   42|  3.68M|#define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  3.68M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  |  |               #define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  3.68M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  ------------------
   65|  3.68M|    VECTOR(matrix_x)
  ------------------
  |  |   42|  3.68M|#define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  3.68M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  |  |               #define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  3.68M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  ------------------
   66|  3.68M|    VECTOR(matrix_y)
  ------------------
  |  |   42|  3.68M|#define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  3.68M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  |  |               #define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  3.68M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  ------------------
   67|  3.68M|    VECTOR(matrix_z)
  ------------------
  |  |   42|  3.68M|#define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  3.68M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  |  |               #define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  3.68M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  ------------------
   68|  3.68M|END(BitmapHashKey)
  ------------------
  |  |   44|  3.68M|        return hval; \
  |  |   45|  3.68M|    }
  ------------------
ass_cache.c:bitmap_compare:
   61|  3.68M|START(bitmap, bitmap_hash_key)
  ------------------
  |  |   17|  3.68M|    static bool funcname##_compare(void *key1, void *key2) \
  |  |   18|  3.68M|    { \
  |  |   19|  3.68M|        struct structname *a = key1; \
  |  |   20|  3.68M|        struct structname *b = key2; \
  |  |   21|  3.68M|        return // conditions follow
  ------------------
   62|  7.37M|    GENERIC(OutlineHashValue *, outline)
  ------------------
  |  |   23|  3.68M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 3.68M, False: 42]
  |  |  ------------------
  ------------------
   63|       |    // quantized transform matrix
   64|  7.37M|    VECTOR(offset)
  ------------------
  |  |   27|  3.68M|            a->member.x == b->member.x && a->member.y == b->member.y &&
  |  |  ------------------
  |  |  |  Branch (27:13): [True: 3.68M, False: 0]
  |  |  |  Branch (27:43): [True: 3.68M, False: 0]
  |  |  ------------------
  ------------------
   65|  7.37M|    VECTOR(matrix_x)
  ------------------
  |  |   27|  3.68M|            a->member.x == b->member.x && a->member.y == b->member.y &&
  |  |  ------------------
  |  |  |  Branch (27:13): [True: 3.68M, False: 0]
  |  |  |  Branch (27:43): [True: 3.68M, False: 0]
  |  |  ------------------
  ------------------
   66|  7.37M|    VECTOR(matrix_y)
  ------------------
  |  |   27|  3.68M|            a->member.x == b->member.x && a->member.y == b->member.y &&
  |  |  ------------------
  |  |  |  Branch (27:13): [True: 3.68M, False: 0]
  |  |  |  Branch (27:43): [True: 3.68M, False: 0]
  |  |  ------------------
  ------------------
   67|  7.37M|    VECTOR(matrix_z)
  ------------------
  |  |   27|  3.68M|            a->member.x == b->member.x && a->member.y == b->member.y &&
  |  |  ------------------
  |  |  |  Branch (27:13): [True: 3.68M, False: 0]
  |  |  |  Branch (27:43): [True: 3.68M, False: 0]
  |  |  ------------------
  ------------------
   68|  3.68M|END(BitmapHashKey)
  ------------------
  |  |   29|  3.68M|            true; \
  |  |   30|  3.68M|    }
  ------------------
ass_cache.c:filter_hash:
  104|   102k|START(filter, filter_desc)
  ------------------
  |  |   36|   102k|    { \
  |  |   37|   102k|        struct structname *p = buf;
  ------------------
  105|   102k|    GENERIC(int, flags)
  ------------------
  |  |   39|   102k|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
  106|   102k|    GENERIC(int, be)
  ------------------
  |  |   39|   102k|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
  107|   102k|    GENERIC(int, blur_x)
  ------------------
  |  |   39|   102k|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
  108|   102k|    GENERIC(int, blur_y)
  ------------------
  |  |   39|   102k|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
  109|   102k|    VECTOR(shadow)
  ------------------
  |  |   42|   102k|#define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|   102k|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  |  |               #define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|   102k|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  ------------------
  110|   102k|END(FilterDesc)
  ------------------
  |  |   44|   102k|        return hval; \
  |  |   45|   102k|    }
  ------------------
ass_cache.c:bitmap_ref_hash:
  113|  1.84M|START(bitmap_ref, bitmap_ref_key)
  ------------------
  |  |   36|  1.84M|    { \
  |  |   37|  1.84M|        struct structname *p = buf;
  ------------------
  114|  1.84M|    GENERIC(Bitmap *, bm)
  ------------------
  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
  115|  1.84M|    GENERIC(Bitmap *, bm_o)
  ------------------
  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
  116|  1.84M|    VECTOR(pos)
  ------------------
  |  |   42|  1.84M|#define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  |  |               #define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  ------------------
  117|  1.84M|    VECTOR(pos_o)
  ------------------
  |  |   42|  1.84M|#define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  |  |               #define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  ------------------
  118|  1.84M|END(BitmapRef)
  ------------------
  |  |   44|  1.84M|        return hval; \
  |  |   45|  1.84M|    }
  ------------------
ass_cache.c:filter_compare:
  104|   102k|START(filter, filter_desc)
  ------------------
  |  |   17|   102k|    static bool funcname##_compare(void *key1, void *key2) \
  |  |   18|   102k|    { \
  |  |   19|   102k|        struct structname *a = key1; \
  |  |   20|   102k|        struct structname *b = key2; \
  |  |   21|   102k|        return // conditions follow
  ------------------
  105|   102k|    GENERIC(int, flags)
  ------------------
  |  |   23|   102k|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 102k, False: 0]
  |  |  ------------------
  ------------------
  106|   102k|    GENERIC(int, be)
  ------------------
  |  |   23|   102k|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 102k, False: 0]
  |  |  ------------------
  ------------------
  107|   102k|    GENERIC(int, blur_x)
  ------------------
  |  |   23|   102k|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 102k, False: 0]
  |  |  ------------------
  ------------------
  108|   102k|    GENERIC(int, blur_y)
  ------------------
  |  |   23|   102k|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 102k, False: 0]
  |  |  ------------------
  ------------------
  109|   204k|    VECTOR(shadow)
  ------------------
  |  |   27|   102k|            a->member.x == b->member.x && a->member.y == b->member.y &&
  |  |  ------------------
  |  |  |  Branch (27:13): [True: 102k, False: 0]
  |  |  |  Branch (27:43): [True: 102k, False: 0]
  |  |  ------------------
  ------------------
  110|   102k|END(FilterDesc)
  ------------------
  |  |   29|   102k|            true; \
  |  |   30|   102k|    }
  ------------------
ass_cache.c:bitmap_ref_compare:
  113|  1.62M|START(bitmap_ref, bitmap_ref_key)
  ------------------
  |  |   17|  1.62M|    static bool funcname##_compare(void *key1, void *key2) \
  |  |   18|  1.62M|    { \
  |  |   19|  1.62M|        struct structname *a = key1; \
  |  |   20|  1.62M|        struct structname *b = key2; \
  |  |   21|  1.62M|        return // conditions follow
  ------------------
  114|  1.62M|    GENERIC(Bitmap *, bm)
  ------------------
  |  |   23|  1.62M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 1.62M, False: 0]
  |  |  ------------------
  ------------------
  115|  1.62M|    GENERIC(Bitmap *, bm_o)
  ------------------
  |  |   23|  1.62M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 1.62M, False: 0]
  |  |  ------------------
  ------------------
  116|  3.24M|    VECTOR(pos)
  ------------------
  |  |   27|  1.62M|            a->member.x == b->member.x && a->member.y == b->member.y &&
  |  |  ------------------
  |  |  |  Branch (27:13): [True: 1.62M, False: 0]
  |  |  |  Branch (27:43): [True: 1.62M, False: 0]
  |  |  ------------------
  ------------------
  117|  3.24M|    VECTOR(pos_o)
  ------------------
  |  |   27|  1.62M|            a->member.x == b->member.x && a->member.y == b->member.y &&
  |  |  ------------------
  |  |  |  Branch (27:13): [True: 1.62M, False: 0]
  |  |  |  Branch (27:43): [True: 1.62M, False: 0]
  |  |  ------------------
  ------------------
  118|  1.62M|END(BitmapRef)
  ------------------
  |  |   29|  1.62M|            true; \
  |  |   30|  1.62M|    }
  ------------------
ass_cache.c:glyph_hash:
   78|  2.93M|START(glyph, glyph_hash_key)
  ------------------
  |  |   36|  2.93M|    { \
  |  |   37|  2.93M|        struct structname *p = buf;
  ------------------
   79|  2.93M|    GENERIC(ASS_Font *, font)
  ------------------
  |  |   39|  2.93M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   80|       |    GENERIC(double, size) // font size
  ------------------
  |  |   39|  2.93M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   81|  2.93M|    GENERIC(int, face_index)
  ------------------
  |  |   39|  2.93M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   82|  2.93M|    GENERIC(int, glyph_index)
  ------------------
  |  |   39|  2.93M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   83|  2.93M|    GENERIC(int, bold)
  ------------------
  |  |   39|  2.93M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   84|  2.93M|    GENERIC(int, italic)
  ------------------
  |  |   39|  2.93M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   85|       |    GENERIC(unsigned, flags) // glyph decoration flags
  ------------------
  |  |   39|  2.93M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   86|  2.93M|END(GlyphHashKey)
  ------------------
  |  |   44|  2.93M|        return hval; \
  |  |   45|  2.93M|    }
  ------------------
ass_cache.c:border_hash:
   94|  1.84M|START(border, border_hash_key)
  ------------------
  |  |   36|  1.84M|    { \
  |  |   37|  1.84M|        struct structname *p = buf;
  ------------------
   95|  1.84M|    GENERIC(OutlineHashValue *, outline)
  ------------------
  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   96|       |    // outline is scaled by 2^scale_ord_x|y before stroking
   97|       |    // to keep stoker error in allowable range
   98|  1.84M|    GENERIC(int, scale_ord_x)
  ------------------
  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   99|  1.84M|    GENERIC(int, scale_ord_y)
  ------------------
  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
  100|       |    VECTOR(border)  // border size in STROKER_ACCURACY units
  ------------------
  |  |   42|  1.84M|#define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  |  |               #define VECTOR(member) GENERIC(, member.x); GENERIC(, member.y);
  |  |  ------------------
  |  |  |  |   39|  1.84M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  |  |  ------------------
  ------------------
  101|  1.84M|END(BorderHashKey)
  ------------------
  |  |   44|  1.84M|        return hval; \
  |  |   45|  1.84M|    }
  ------------------
ass_cache.c:glyph_compare:
   78|  2.93M|START(glyph, glyph_hash_key)
  ------------------
  |  |   17|  2.93M|    static bool funcname##_compare(void *key1, void *key2) \
  |  |   18|  2.93M|    { \
  |  |   19|  2.93M|        struct structname *a = key1; \
  |  |   20|  2.93M|        struct structname *b = key2; \
  |  |   21|  2.93M|        return // conditions follow
  ------------------
   79|  2.93M|    GENERIC(ASS_Font *, font)
  ------------------
  |  |   23|  2.93M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 2.93M, False: 0]
  |  |  ------------------
  ------------------
   80|       |    GENERIC(double, size) // font size
  ------------------
  |  |   23|  2.93M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 2.93M, False: 0]
  |  |  ------------------
  ------------------
   81|  2.93M|    GENERIC(int, face_index)
  ------------------
  |  |   23|  2.93M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 2.93M, False: 0]
  |  |  ------------------
  ------------------
   82|  2.93M|    GENERIC(int, glyph_index)
  ------------------
  |  |   23|  2.93M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 2.93M, False: 0]
  |  |  ------------------
  ------------------
   83|  2.93M|    GENERIC(int, bold)
  ------------------
  |  |   23|  2.93M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 2.93M, False: 0]
  |  |  ------------------
  ------------------
   84|  2.93M|    GENERIC(int, italic)
  ------------------
  |  |   23|  2.93M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 2.93M, False: 0]
  |  |  ------------------
  ------------------
   85|       |    GENERIC(unsigned, flags) // glyph decoration flags
  ------------------
  |  |   23|  2.93M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 2.93M, False: 0]
  |  |  ------------------
  ------------------
   86|  2.93M|END(GlyphHashKey)
  ------------------
  |  |   29|  2.93M|            true; \
  |  |   30|  2.93M|    }
  ------------------
ass_cache.c:border_compare:
   94|  1.84M|START(border, border_hash_key)
  ------------------
  |  |   17|  1.84M|    static bool funcname##_compare(void *key1, void *key2) \
  |  |   18|  1.84M|    { \
  |  |   19|  1.84M|        struct structname *a = key1; \
  |  |   20|  1.84M|        struct structname *b = key2; \
  |  |   21|  1.84M|        return // conditions follow
  ------------------
   95|  1.84M|    GENERIC(OutlineHashValue *, outline)
  ------------------
  |  |   23|  1.84M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 1.84M, False: 0]
  |  |  ------------------
  ------------------
   96|       |    // outline is scaled by 2^scale_ord_x|y before stroking
   97|       |    // to keep stoker error in allowable range
   98|  1.84M|    GENERIC(int, scale_ord_x)
  ------------------
  |  |   23|  1.84M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 1.84M, False: 0]
  |  |  ------------------
  ------------------
   99|  1.84M|    GENERIC(int, scale_ord_y)
  ------------------
  |  |   23|  1.84M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 1.84M, False: 0]
  |  |  ------------------
  ------------------
  100|       |    VECTOR(border)  // border size in STROKER_ACCURACY units
  ------------------
  |  |   27|  1.84M|            a->member.x == b->member.x && a->member.y == b->member.y &&
  |  |  ------------------
  |  |  |  Branch (27:13): [True: 1.84M, False: 0]
  |  |  |  Branch (27:43): [True: 1.84M, False: 0]
  |  |  ------------------
  ------------------
  101|  1.84M|END(BorderHashKey)
  ------------------
  |  |   29|  1.84M|            true; \
  |  |   30|  1.84M|    }
  ------------------
ass_cache.c:glyph_metrics_hash:
   70|  5.37M|START(glyph_metrics, glyph_metrics_hash_key)
  ------------------
  |  |   36|  5.37M|    { \
  |  |   37|  5.37M|        struct structname *p = buf;
  ------------------
   71|  5.37M|    GENERIC(ASS_Font *, font)
  ------------------
  |  |   39|  5.37M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   72|  5.37M|    GENERIC(double, size)
  ------------------
  |  |   39|  5.37M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   73|  5.37M|    GENERIC(int, face_index)
  ------------------
  |  |   39|  5.37M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   74|  5.37M|    GENERIC(int, glyph_index)
  ------------------
  |  |   39|  5.37M|        hval = ass_hash_buf(&p->member, sizeof(p->member), hval);
  ------------------
   75|  5.37M|END(GlyphMetricsHashKey)
  ------------------
  |  |   44|  5.37M|        return hval; \
  |  |   45|  5.37M|    }
  ------------------
ass_cache.c:glyph_metrics_compare:
   70|  5.37M|START(glyph_metrics, glyph_metrics_hash_key)
  ------------------
  |  |   17|  5.37M|    static bool funcname##_compare(void *key1, void *key2) \
  |  |   18|  5.37M|    { \
  |  |   19|  5.37M|        struct structname *a = key1; \
  |  |   20|  5.37M|        struct structname *b = key2; \
  |  |   21|  5.37M|        return // conditions follow
  ------------------
   71|  5.37M|    GENERIC(ASS_Font *, font)
  ------------------
  |  |   23|  5.37M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 5.37M, False: 0]
  |  |  ------------------
  ------------------
   72|  5.37M|    GENERIC(double, size)
  ------------------
  |  |   23|  5.37M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 5.37M, False: 0]
  |  |  ------------------
  ------------------
   73|  5.37M|    GENERIC(int, face_index)
  ------------------
  |  |   23|  5.37M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 5.37M, False: 0]
  |  |  ------------------
  ------------------
   74|  5.37M|    GENERIC(int, glyph_index)
  ------------------
  |  |   23|  5.37M|            a->member == b->member &&
  |  |  ------------------
  |  |  |  Branch (23:13): [True: 5.37M, False: 0]
  |  |  ------------------
  ------------------
   75|  5.37M|END(GlyphMetricsHashKey)
  ------------------
  |  |   29|  5.37M|            true; \
  |  |   30|  5.37M|    }
  ------------------

ass_charmap_magic:
  200|    202|{
  201|    202|    int i;
  202|    202|    int ms_cmap = -1;
  203|       |
  204|       |    // Search for a Microsoft Unicode cmap
  205|    807|    for (i = 0; i < face->num_charmaps; ++i) {
  ------------------
  |  Branch (205:17): [True: 807, False: 0]
  ------------------
  206|    807|        FT_CharMap cmap = face->charmaps[i];
  207|    807|        unsigned pid = cmap->platform_id;
  208|    807|        unsigned eid = cmap->encoding_id;
  209|    807|        if (pid == 3 /*microsoft */
  ------------------
  |  Branch (209:13): [True: 202, False: 605]
  ------------------
  210|    807|            && (eid == 1 /*unicode bmp */
  ------------------
  |  Branch (210:17): [True: 202, False: 0]
  ------------------
  211|    202|                || eid == 10 /*full unicode */ )) {
  ------------------
  |  Branch (211:20): [True: 0, False: 0]
  ------------------
  212|    202|            FT_Set_Charmap(face, cmap);
  213|    202|            return;
  214|    605|        } else if (pid == 3 && ms_cmap < 0)
  ------------------
  |  Branch (214:20): [True: 0, False: 605]
  |  Branch (214:32): [True: 0, False: 0]
  ------------------
  215|      0|            ms_cmap = i;
  216|    807|    }
  217|       |
  218|       |    // Try the first Microsoft cmap if no Microsoft Unicode cmap was found
  219|      0|    if (ms_cmap >= 0) {
  ------------------
  |  Branch (219:9): [True: 0, False: 0]
  ------------------
  220|      0|        FT_CharMap cmap = face->charmaps[ms_cmap];
  221|      0|        FT_Set_Charmap(face, cmap);
  222|      0|        return;
  223|      0|    }
  224|       |
  225|      0|    if (!face->charmap) {
  ------------------
  |  Branch (225:9): [True: 0, False: 0]
  ------------------
  226|      0|        if (face->num_charmaps == 0) {
  ------------------
  |  Branch (226:13): [True: 0, False: 0]
  ------------------
  227|      0|            ass_msg(library, MSGL_WARN, "Font face with no charmaps");
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  228|      0|            return;
  229|      0|        }
  230|      0|        ass_msg(library, MSGL_WARN,
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  231|      0|                "No charmap autodetected, trying the first one");
  232|      0|        FT_Set_Charmap(face, face->charmaps[0]);
  233|      0|        return;
  234|      0|    }
  235|      0|}
ass_font_index_magic:
  243|  5.38M|{
  244|  5.38M|    if (!face->charmap)
  ------------------
  |  Branch (244:9): [True: 0, False: 5.38M]
  ------------------
  245|      0|        return symbol;
  246|       |
  247|  5.38M|    if (face->charmap->platform_id == TT_PLATFORM_MICROSOFT) {
  ------------------
  |  |   90|  5.38M|#define TT_PLATFORM_MICROSOFT      3
  ------------------
  |  Branch (247:9): [True: 5.38M, False: 0]
  ------------------
  248|  5.38M|        switch (face->charmap->encoding) {
  249|      0|        case FT_ENCODING_MS_SYMBOL:
  ------------------
  |  Branch (249:9): [True: 0, False: 5.38M]
  ------------------
  250|      0|            return 0xF000 | symbol;
  251|      0|        case FT_ENCODING_MS_SJIS:
  ------------------
  |  Branch (251:9): [True: 0, False: 5.38M]
  ------------------
  252|      0|        case FT_ENCODING_MS_GB2312:
  ------------------
  |  Branch (252:9): [True: 0, False: 5.38M]
  ------------------
  253|      0|        case FT_ENCODING_MS_BIG5:
  ------------------
  |  Branch (253:9): [True: 0, False: 5.38M]
  ------------------
  254|      0|        case FT_ENCODING_MS_WANSUNG:
  ------------------
  |  Branch (254:9): [True: 0, False: 5.38M]
  ------------------
  255|      0|        case FT_ENCODING_MS_JOHAB:
  ------------------
  |  Branch (255:9): [True: 0, False: 5.38M]
  ------------------
  256|      0|            return convert_unicode_to_mb(face->charmap->encoding, symbol);
  257|  5.38M|        default:
  ------------------
  |  Branch (257:9): [True: 5.38M, False: 0]
  ------------------
  258|  5.38M|            return symbol;
  259|  5.38M|        }
  260|  5.38M|    }
  261|       |
  262|      0|    return symbol;
  263|  5.38M|}
ass_face_open:
  302|    202|{
  303|    202|    FT_Face face;
  304|    202|    int error = FT_New_Face(ftlib, path, index, &face);
  305|    202|    if (error) {
  ------------------
  |  Branch (305:9): [True: 0, False: 202]
  ------------------
  306|      0|        ass_msg(lib, MSGL_WARN, "Error opening font: '%s', %d", path, index);
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  307|      0|        return NULL;
  308|      0|    }
  309|       |
  310|    202|    if (index >= 0) {
  ------------------
  |  Branch (310:9): [True: 202, False: 0]
  ------------------
  311|    202|        return face;
  312|    202|    } else {
  313|       |        // The font provider gave us a postscript name and is not sure
  314|       |        // about the face index.. so use the postscript name to find the
  315|       |        // correct face_index in the collection!
  316|      0|        for (int i = 0; i < face->num_faces; i++) {
  ------------------
  |  Branch (316:25): [True: 0, False: 0]
  ------------------
  317|      0|            FT_Done_Face(face);
  318|      0|            error = FT_New_Face(ftlib, path, i, &face);
  319|      0|            if (error) {
  ------------------
  |  Branch (319:17): [True: 0, False: 0]
  ------------------
  320|      0|                ass_msg(lib, MSGL_WARN, "Error opening font: '%s', %d", path, i);
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  321|      0|                return NULL;
  322|      0|            }
  323|       |
  324|       |            // If there is only one face, don't bother checking the name.
  325|       |            // The font might not even *have* a valid PostScript name.
  326|      0|            if (!i && face->num_faces == 1)
  ------------------
  |  Branch (326:17): [True: 0, False: 0]
  |  Branch (326:23): [True: 0, False: 0]
  ------------------
  327|      0|                return face;
  328|       |
  329|       |            // Otherwise, we really need a name to search for.
  330|      0|            if (!postscript_name) {
  ------------------
  |  Branch (330:17): [True: 0, False: 0]
  ------------------
  331|      0|                FT_Done_Face(face);
  332|      0|                return NULL;
  333|      0|            }
  334|       |
  335|      0|            const char *face_psname = FT_Get_Postscript_Name(face);
  336|      0|            if (face_psname != NULL &&
  ------------------
  |  Branch (336:17): [True: 0, False: 0]
  ------------------
  337|      0|                strcmp(face_psname, postscript_name) == 0)
  ------------------
  |  Branch (337:17): [True: 0, False: 0]
  ------------------
  338|      0|                return face;
  339|      0|        }
  340|       |
  341|      0|        FT_Done_Face(face);
  342|      0|        ass_msg(lib, MSGL_WARN, "Failed to find font '%s' in file: '%s'",
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  343|      0|                postscript_name, path);
  344|      0|        return NULL;
  345|      0|    }
  346|    202|}
ass_font_new:
  457|   512k|{
  458|   512k|    ASS_Font *font = ass_cache_get(render_priv->cache.font_cache, desc, render_priv);
  459|   512k|    if (!font)
  ------------------
  |  Branch (459:9): [True: 0, False: 512k]
  ------------------
  460|      0|        return NULL;
  461|   512k|    if (font->library)
  ------------------
  |  Branch (461:9): [True: 512k, False: 0]
  ------------------
  462|   512k|        return font;
  463|      0|    ass_cache_dec_ref(font);
  464|      0|    return NULL;
  465|   512k|}
ass_font_construct:
  468|    201|{
  469|    201|    ASS_Renderer *render_priv = priv;
  470|    201|    ASS_FontDesc *desc = key;
  471|    201|    ASS_Font *font = value;
  472|       |
  473|    201|    font->library = render_priv->library;
  474|    201|    font->ftlibrary = render_priv->ftlibrary;
  475|    201|    font->shaper_priv = NULL;
  476|    201|    font->n_faces = 0;
  477|    201|    font->desc.family = desc->family;
  478|    201|    font->desc.bold = desc->bold;
  479|    201|    font->desc.italic = desc->italic;
  480|    201|    font->desc.vertical = desc->vertical;
  481|       |
  482|    201|    font->size = 0.;
  483|       |
  484|    201|    int error = add_face(render_priv->fontselect, font, 0);
  485|    201|    if (error == -1)
  ------------------
  |  Branch (485:9): [True: 0, False: 201]
  ------------------
  486|      0|        font->library = NULL;
  487|    201|    return 1;
  488|    201|}
ass_face_set_size:
  491|   205k|{
  492|   205k|    FT_Size_RequestRec rq;
  493|   205k|    memset(&rq, 0, sizeof(rq));
  494|   205k|    rq.type = FT_SIZE_REQUEST_TYPE_REAL_DIM;
  495|   205k|    rq.width = 0;
  496|   205k|    rq.height = double_to_d6(size);
  497|   205k|    rq.horiResolution = rq.vertResolution = 0;
  498|   205k|    FT_Request_Size(face, &rq);
  499|   205k|}
ass_face_get_weight:
  505|    176|{
  506|    176|    TT_OS2 *os2 = FT_Get_Sfnt_Table(face, FT_SFNT_OS2);
  507|    176|    FT_UShort os2Weight = os2 ? os2->usWeightClass : 0;
  ------------------
  |  Branch (507:27): [True: 176, False: 0]
  ------------------
  508|    176|    switch (os2Weight) {
  509|      0|    case 0:
  ------------------
  |  Branch (509:5): [True: 0, False: 176]
  ------------------
  510|      0|        return 300 * !!(face->style_flags & FT_STYLE_FLAG_BOLD) + 400;
  ------------------
  |  | 1489|      0|#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )
  ------------------
  511|      0|    case 1:
  ------------------
  |  Branch (511:5): [True: 0, False: 176]
  ------------------
  512|      0|        return 100;
  513|      0|    case 2:
  ------------------
  |  Branch (513:5): [True: 0, False: 176]
  ------------------
  514|      0|        return 200;
  515|      0|    case 3:
  ------------------
  |  Branch (515:5): [True: 0, False: 176]
  ------------------
  516|      0|        return 300;
  517|      0|    case 4:
  ------------------
  |  Branch (517:5): [True: 0, False: 176]
  ------------------
  518|      0|        return 350;
  519|      0|    case 5:
  ------------------
  |  Branch (519:5): [True: 0, False: 176]
  ------------------
  520|      0|        return 400;
  521|      0|    case 6:
  ------------------
  |  Branch (521:5): [True: 0, False: 176]
  ------------------
  522|      0|        return 600;
  523|      0|    case 7:
  ------------------
  |  Branch (523:5): [True: 0, False: 176]
  ------------------
  524|      0|        return 700;
  525|      0|    case 8:
  ------------------
  |  Branch (525:5): [True: 0, False: 176]
  ------------------
  526|      0|        return 800;
  527|      0|    case 9:
  ------------------
  |  Branch (527:5): [True: 0, False: 176]
  ------------------
  528|      0|        return 900;
  529|    176|    default:
  ------------------
  |  Branch (529:5): [True: 176, False: 0]
  ------------------
  530|    176|        return os2Weight;
  531|    176|    }
  532|    176|}
ass_font_get_asc_desc:
  539|    176|{
  540|    176|    FT_Face face = font->faces[face_index];
  541|    176|    int y_scale = face->size->metrics.y_scale;
  542|    176|    *asc  = FT_MulFix(face->ascender, y_scale);
  543|    176|    *desc = FT_MulFix(-face->descender, y_scale);
  544|    176|}
ass_font_get_index:
  584|  2.93M|{
  585|  2.93M|    int index = 0;
  586|  2.93M|    int i;
  587|  2.93M|    FT_Face face = 0;
  588|       |
  589|  2.93M|    *glyph_index = 0;
  590|       |
  591|  2.93M|    if (symbol < 0x20) {
  ------------------
  |  Branch (591:9): [True: 485k, False: 2.44M]
  ------------------
  592|   485k|        *face_index = 0;
  593|   485k|        return 0;
  594|   485k|    }
  595|  2.44M|    if (font->n_faces == 0) {
  ------------------
  |  Branch (595:9): [True: 0, False: 2.44M]
  ------------------
  596|      0|        *face_index = 0;
  597|      0|        return 0;
  598|      0|    }
  599|       |
  600|  4.89M|    for (i = 0; i < font->n_faces && index == 0; ++i) {
  ------------------
  |  Branch (600:17): [True: 3.42M, False: 1.46M]
  |  Branch (600:38): [True: 2.44M, False: 981k]
  ------------------
  601|  2.44M|        face = font->faces[i];
  602|  2.44M|        index = ass_font_index_magic(face, symbol);
  603|  2.44M|        if (index)
  ------------------
  |  Branch (603:13): [True: 2.44M, False: 0]
  ------------------
  604|  2.44M|            index = FT_Get_Char_Index(face, index);
  605|  2.44M|        if (index)
  ------------------
  |  Branch (605:13): [True: 2.44M, False: 833]
  ------------------
  606|  2.44M|            *face_index = i;
  607|  2.44M|    }
  608|       |
  609|  2.44M|    if (index == 0) {
  ------------------
  |  Branch (609:9): [True: 412, False: 2.44M]
  ------------------
  610|    412|        int face_idx;
  611|    412|        ass_msg(font->library, MSGL_INFO,
  ------------------
  |  |   42|    412|#define MSGL_INFO 4
  ------------------
  612|    412|                "Glyph 0x%X not found, selecting one more "
  613|    412|                "font for (%.*s, %d, %d)", symbol, (int) font->desc.family.len, font->desc.family.str,
  614|    412|                font->desc.bold, font->desc.italic);
  615|    412|        face_idx = *face_index = add_face(fontsel, font, symbol);
  616|    412|        if (face_idx >= 0) {
  ------------------
  |  Branch (616:13): [True: 1, False: 411]
  ------------------
  617|      1|            face = font->faces[face_idx];
  618|      1|            index = ass_font_index_magic(face, symbol);
  619|      1|            if (index)
  ------------------
  |  Branch (619:17): [True: 1, False: 0]
  ------------------
  620|      1|                index = FT_Get_Char_Index(face, index);
  621|      1|            if (index == 0 && face->num_charmaps > 0) {
  ------------------
  |  Branch (621:17): [True: 0, False: 1]
  |  Branch (621:31): [True: 0, False: 0]
  ------------------
  622|      0|                int i;
  623|      0|                ass_msg(font->library, MSGL_WARN,
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  624|      0|                    "Glyph 0x%X not found, broken font? Trying all charmaps", symbol);
  625|      0|                for (i = 0; i < face->num_charmaps; i++) {
  ------------------
  |  Branch (625:29): [True: 0, False: 0]
  ------------------
  626|      0|                    FT_Set_Charmap(face, face->charmaps[i]);
  627|      0|                    index = ass_font_index_magic(face, symbol);
  628|      0|                    if (index)
  ------------------
  |  Branch (628:25): [True: 0, False: 0]
  ------------------
  629|      0|                        index = FT_Get_Char_Index(face, index);
  630|      0|                    if (index) break;
  ------------------
  |  Branch (630:25): [True: 0, False: 0]
  ------------------
  631|      0|                }
  632|      0|            }
  633|      1|            if (index == 0) {
  ------------------
  |  Branch (633:17): [True: 0, False: 1]
  ------------------
  634|      0|                ass_msg(font->library, MSGL_ERR,
  ------------------
  |  |   40|      0|#define MSGL_ERR 1
  ------------------
  635|      0|                        "Glyph 0x%X not found in font for (%.*s, %d, %d)",
  636|      0|                        symbol, (int) font->desc.family.len, font->desc.family.str, font->desc.bold,
  637|      0|                        font->desc.italic);
  638|      0|            }
  639|      1|        }
  640|    412|    }
  641|       |
  642|       |    // FIXME: make sure we have a valid face_index. this is a HACK.
  643|  2.44M|    *face_index  = FFMAX(*face_index, 0);
  ------------------
  |  |   46|  2.44M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 147, False: 2.44M]
  |  |  ------------------
  ------------------
  644|  2.44M|    *glyph_index = index;
  645|       |
  646|  2.44M|    return 1;
  647|  2.44M|}
ass_font_get_glyph:
  655|    180|{
  656|    180|    FT_Int32 flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
  ------------------
  |  | 3037|    180|#define FT_LOAD_NO_BITMAP                    ( 1L << 3 )
  ------------------
                  FT_Int32 flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
  ------------------
  |  | 3042|    180|#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  ( 1L << 9 )
  ------------------
  657|    180|            | FT_LOAD_IGNORE_TRANSFORM;
  ------------------
  |  | 3044|    180|#define FT_LOAD_IGNORE_TRANSFORM             ( 1L << 11 )
  ------------------
  658|    180|    switch (hinting) {
  ------------------
  |  Branch (658:13): [True: 0, False: 180]
  ------------------
  659|    180|    case ASS_HINTING_NONE:
  ------------------
  |  Branch (659:5): [True: 180, False: 0]
  ------------------
  660|    180|        flags |= FT_LOAD_NO_HINTING;
  ------------------
  |  | 3035|    180|#define FT_LOAD_NO_HINTING                   ( 1L << 1 )
  ------------------
  661|    180|        break;
  662|      0|    case ASS_HINTING_LIGHT:
  ------------------
  |  Branch (662:5): [True: 0, False: 180]
  ------------------
  663|      0|        flags |= FT_LOAD_FORCE_AUTOHINT | FT_LOAD_TARGET_LIGHT;
  ------------------
  |  | 3039|      0|#define FT_LOAD_FORCE_AUTOHINT               ( 1L << 5 )
  ------------------
                      flags |= FT_LOAD_FORCE_AUTOHINT | FT_LOAD_TARGET_LIGHT;
  ------------------
  |  | 3150|      0|#define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )
  |  |  ------------------
  |  |  |  | 3147|      0|#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )
  |  |  ------------------
  ------------------
  664|      0|        break;
  665|      0|    case ASS_HINTING_NORMAL:
  ------------------
  |  Branch (665:5): [True: 0, False: 180]
  ------------------
  666|      0|        flags |= FT_LOAD_FORCE_AUTOHINT;
  ------------------
  |  | 3039|      0|#define FT_LOAD_FORCE_AUTOHINT               ( 1L << 5 )
  ------------------
  667|      0|        break;
  668|      0|    case ASS_HINTING_NATIVE:
  ------------------
  |  Branch (668:5): [True: 0, False: 180]
  ------------------
  669|      0|        break;
  670|    180|    }
  671|       |
  672|    180|    FT_Face face = font->faces[face_index];
  673|    180|    FT_Error error = FT_Load_Glyph(face, index, flags);
  674|    180|    if (error) {
  ------------------
  |  Branch (674:9): [True: 4, False: 176]
  ------------------
  675|      4|        ass_msg(font->library, MSGL_WARN, "Error loading glyph, index %d",
  ------------------
  |  |   41|      4|#define MSGL_WARN 2
  ------------------
  676|      4|                index);
  677|      4|        return false;
  678|      4|    }
  679|    176|    if (!(face->style_flags & FT_STYLE_FLAG_ITALIC) && (font->desc.italic > 55))
  ------------------
  |  | 1488|    176|#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )
  ------------------
  |  Branch (679:9): [True: 176, False: 0]
  |  Branch (679:56): [True: 0, False: 176]
  ------------------
  680|      0|        ass_glyph_italicize(face->glyph);
  681|    176|    if (font->desc.bold > ass_face_get_weight(face) + 150)
  ------------------
  |  Branch (681:9): [True: 0, False: 176]
  ------------------
  682|      0|        ass_glyph_embolden(face->glyph);
  683|    176|    return true;
  684|    180|}
ass_font_clear:
  690|    201|{
  691|    201|    int i;
  692|    201|    if (font->shaper_priv)
  ------------------
  |  Branch (692:9): [True: 10, False: 191]
  ------------------
  693|     10|        ass_shaper_font_data_free(font->shaper_priv);
  694|    403|    for (i = 0; i < font->n_faces; ++i) {
  ------------------
  |  Branch (694:17): [True: 202, False: 201]
  ------------------
  695|    202|        if (font->faces[i])
  ------------------
  |  Branch (695:13): [True: 202, False: 0]
  ------------------
  696|    202|            FT_Done_Face(font->faces[i]);
  697|    202|    }
  698|    201|    free((char *) font->desc.family.str);
  699|    201|}
ass_get_glyph_outline:
  706|    176|{
  707|    176|    int32_t y_scale = face->size->metrics.y_scale;
  708|    176|    int32_t adv = face->glyph->advance.x;
  709|    176|    if (flags & DECO_ROTATE)
  ------------------
  |  |   39|    176|#define DECO_ROTATE        4
  ------------------
  |  Branch (709:9): [True: 0, False: 176]
  ------------------
  710|      0|        adv = d16_to_d6(face->glyph->linearVertAdvance);
  711|    176|    *advance = adv;
  712|       |
  713|    176|    int n_lines = 0;
  714|    176|    int32_t line_y[2][2];
  715|    176|    if (adv > 0 && (flags & DECO_UNDERLINE)) {
  ------------------
  |  |   37|    176|#define DECO_UNDERLINE     1
  ------------------
  |  Branch (715:9): [True: 176, False: 0]
  |  Branch (715:20): [True: 0, False: 176]
  ------------------
  716|      0|        TT_Postscript *ps = FT_Get_Sfnt_Table(face, ft_sfnt_post);
  ------------------
  |  |  642|      0|#define ft_sfnt_post  FT_SFNT_POST
  ------------------
  717|      0|        if (ps && ps->underlinePosition <= 0 && ps->underlineThickness > 0) {
  ------------------
  |  Branch (717:13): [True: 0, False: 0]
  |  Branch (717:19): [True: 0, False: 0]
  |  Branch (717:49): [True: 0, False: 0]
  ------------------
  718|      0|            int64_t pos  = ((int64_t) ps->underlinePosition  * y_scale + 0x8000) >> 16;
  719|      0|            int64_t size = ((int64_t) ps->underlineThickness * y_scale + 0x8000) >> 16;
  720|      0|            pos = -pos - (size >> 1);
  721|      0|            if (pos >= -OUTLINE_MAX && pos + size <= OUTLINE_MAX) {
  ------------------
  |  |   87|      0|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
                          if (pos >= -OUTLINE_MAX && pos + size <= OUTLINE_MAX) {
  ------------------
  |  |   87|      0|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  |  Branch (721:17): [True: 0, False: 0]
  |  Branch (721:40): [True: 0, False: 0]
  ------------------
  722|      0|                line_y[n_lines][0] = pos;
  723|      0|                line_y[n_lines][1] = pos + size;
  724|      0|                n_lines++;
  725|      0|            }
  726|      0|        }
  727|      0|    }
  728|    176|    if (adv > 0 && (flags & DECO_STRIKETHROUGH)) {
  ------------------
  |  |   38|    176|#define DECO_STRIKETHROUGH 2
  ------------------
  |  Branch (728:9): [True: 176, False: 0]
  |  Branch (728:20): [True: 0, False: 176]
  ------------------
  729|      0|        TT_OS2 *os2 = FT_Get_Sfnt_Table(face, FT_SFNT_OS2);
  730|      0|        if (os2 && os2->yStrikeoutPosition >= 0 && os2->yStrikeoutSize > 0) {
  ------------------
  |  Branch (730:13): [True: 0, False: 0]
  |  Branch (730:20): [True: 0, False: 0]
  |  Branch (730:52): [True: 0, False: 0]
  ------------------
  731|      0|            int64_t pos  = ((int64_t) os2->yStrikeoutPosition * y_scale + 0x8000) >> 16;
  732|      0|            int64_t size = ((int64_t) os2->yStrikeoutSize     * y_scale + 0x8000) >> 16;
  733|      0|            pos = -pos - (size >> 1);
  734|      0|            if (pos >= -OUTLINE_MAX && pos + size <= OUTLINE_MAX) {
  ------------------
  |  |   87|      0|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
                          if (pos >= -OUTLINE_MAX && pos + size <= OUTLINE_MAX) {
  ------------------
  |  |   87|      0|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  |  Branch (734:17): [True: 0, False: 0]
  |  Branch (734:40): [True: 0, False: 0]
  ------------------
  735|      0|                line_y[n_lines][0] = pos;
  736|      0|                line_y[n_lines][1] = pos + size;
  737|      0|                n_lines++;
  738|      0|            }
  739|      0|        }
  740|      0|    }
  741|       |
  742|    176|    assert(face->glyph->format == FT_GLYPH_FORMAT_OUTLINE);
  743|    176|    FT_Outline *source = &face->glyph->outline;
  744|    176|    if (!source->n_points && !n_lines) {
  ------------------
  |  Branch (744:9): [True: 4, False: 172]
  |  Branch (744:30): [True: 4, False: 0]
  ------------------
  745|      4|        ass_outline_clear(outline);
  746|      4|        return true;
  747|      4|    }
  748|       |
  749|    172|    size_t max_points = 2 * source->n_points + 4 * n_lines;
  750|    172|    size_t max_segments = source->n_points + 4 * n_lines;
  751|    172|    if (!ass_outline_alloc(outline, max_points, max_segments))
  ------------------
  |  Branch (751:9): [True: 0, False: 172]
  ------------------
  752|      0|        return false;
  753|       |
  754|    172|    if (!ass_outline_convert(outline, source))
  ------------------
  |  Branch (754:9): [True: 0, False: 172]
  ------------------
  755|      0|        goto fail;
  756|       |
  757|    172|    if (flags & DECO_ROTATE) {
  ------------------
  |  |   39|    172|#define DECO_ROTATE        4
  ------------------
  |  Branch (757:9): [True: 0, False: 172]
  ------------------
  758|      0|        TT_OS2 *os2 = FT_Get_Sfnt_Table(face, FT_SFNT_OS2);
  759|      0|        int64_t desc = 0;
  760|      0|        if (os2) {
  ------------------
  |  Branch (760:13): [True: 0, False: 0]
  ------------------
  761|      0|            desc = ((int64_t) os2->sTypoDescender * y_scale + 0x8000) >> 16;
  762|      0|            if (llabs(desc) > 2 * OUTLINE_MAX)
  ------------------
  |  |   87|      0|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  |  Branch (762:17): [True: 0, False: 0]
  ------------------
  763|      0|                goto fail;
  764|      0|        }
  765|      0|        int64_t dv = face->glyph->metrics.vertAdvance + desc;
  766|      0|        if (llabs(dv) > 2 * OUTLINE_MAX)
  ------------------
  |  |   87|      0|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  |  Branch (766:13): [True: 0, False: 0]
  ------------------
  767|      0|            goto fail;
  768|      0|        ASS_Vector offs = { dv, -desc };
  769|      0|        if (!ass_outline_rotate_90(outline, offs))
  ------------------
  |  Branch (769:13): [True: 0, False: 0]
  ------------------
  770|      0|            goto fail;
  771|      0|    }
  772|       |
  773|    172|    if (!n_lines)
  ------------------
  |  Branch (773:9): [True: 172, False: 0]
  ------------------
  774|    172|        return true;
  775|      0|    FT_Orientation dir = FT_Outline_Get_Orientation(source);
  776|      0|    int iy = (dir == FT_ORIENTATION_TRUETYPE ? 0 : 1);
  ------------------
  |  Branch (776:15): [True: 0, False: 0]
  ------------------
  777|      0|    for (int i = 0; i < n_lines; i++)
  ------------------
  |  Branch (777:21): [True: 0, False: 0]
  ------------------
  778|      0|        ass_outline_add_rect(outline, 0, line_y[i][iy], adv, line_y[i][iy ^ 1]);
  779|      0|    return true;
  780|       |
  781|      0|fail:
  782|      0|    ass_outline_free(outline);
  783|      0|    return false;
  784|    172|}
ass_font.c:add_face:
  409|    613|{
  410|    613|    char *path;
  411|    613|    char *postscript_name = NULL;
  412|    613|    int i, index, uid;
  413|    613|    ASS_FontStream stream = { NULL, NULL };
  414|    613|    FT_Face face;
  415|       |
  416|    613|    if (font->n_faces == ASS_FONT_MAX_FACES)
  ------------------
  |  |   36|    613|#define ASS_FONT_MAX_FACES 10
  ------------------
  |  Branch (416:9): [True: 0, False: 613]
  ------------------
  417|      0|        return -1;
  418|       |
  419|    613|    path = ass_font_select(fontsel, font, &index,
  420|    613|            &postscript_name, &uid, &stream, ch);
  421|       |
  422|    613|    if (!path)
  ------------------
  |  Branch (422:9): [True: 411, False: 202]
  ------------------
  423|    411|        return -1;
  424|       |
  425|    203|    for (i = 0; i < font->n_faces; i++) {
  ------------------
  |  Branch (425:17): [True: 1, False: 202]
  ------------------
  426|      1|        if (font->faces_uid[i] == uid) {
  ------------------
  |  Branch (426:13): [True: 0, False: 1]
  ------------------
  427|      0|            ass_msg(font->library, MSGL_INFO,
  ------------------
  |  |   42|      0|#define MSGL_INFO 4
  ------------------
  428|      0|                    "Got a font face that already is available! Skipping.");
  429|      0|            return i;
  430|      0|        }
  431|      1|    }
  432|       |
  433|    202|    if (stream.func) {
  ------------------
  |  Branch (433:9): [True: 0, False: 202]
  ------------------
  434|      0|        face = ass_face_stream(font->library, font->ftlibrary, path,
  435|      0|                               &stream, index);
  436|    202|    } else {
  437|    202|        face = ass_face_open(font->library, font->ftlibrary, path,
  438|    202|                             postscript_name, index);
  439|    202|    }
  440|       |
  441|    202|    if (!face)
  ------------------
  |  Branch (441:9): [True: 0, False: 202]
  ------------------
  442|      0|        return -1;
  443|       |
  444|    202|    ass_charmap_magic(font->library, face);
  445|    202|    set_font_metrics(face);
  446|       |
  447|    202|    font->faces[font->n_faces] = face;
  448|    202|    font->faces_uid[font->n_faces++] = uid;
  449|    202|    ass_face_set_size(face, font->size);
  450|    202|    return font->n_faces - 1;
  451|    202|}
ass_font.c:set_font_metrics:
  266|    202|{
  267|       |    // Mimicking GDI's behavior for asc/desc/height.
  268|       |    // These fields are (apparently) sometimes used for signed values,
  269|       |    // despite being unsigned in the spec.
  270|    202|    TT_OS2 *os2 = FT_Get_Sfnt_Table(face, FT_SFNT_OS2);
  271|    202|    if (os2 && ((short)os2->usWinAscent + (short)os2->usWinDescent != 0)) {
  ------------------
  |  Branch (271:9): [True: 202, False: 0]
  |  Branch (271:16): [True: 202, False: 0]
  ------------------
  272|    202|        face->ascender  =  (short)os2->usWinAscent;
  273|    202|        face->descender = -(short)os2->usWinDescent;
  274|    202|        face->height    = face->ascender - face->descender;
  275|    202|    }
  276|       |
  277|       |    // If we didn't have usable Win values in the OS/2 table,
  278|       |    // then the values from FreeType will still be in these fields.
  279|       |    // It'll use either the OS/2 typo metrics or the hhea ones.
  280|       |    // If the font has typo metrics but FreeType didn't use them
  281|       |    // (either old FT or USE_TYPO_METRICS not set), we'll try those.
  282|       |    // In the case of a very broken font that has none of those options,
  283|       |    // we fall back on using face.bbox.
  284|       |    // Anything without valid OS/2 Win values isn't supported by VSFilter,
  285|       |    // so at this point compatibility's out the window and we're just
  286|       |    // trying to render _something_ readable.
  287|    202|    if (face->ascender - face->descender == 0 || face->height == 0) {
  ------------------
  |  Branch (287:9): [True: 0, False: 202]
  |  Branch (287:50): [True: 0, False: 202]
  ------------------
  288|      0|        if (os2 && (os2->sTypoAscender - os2->sTypoDescender) != 0) {
  ------------------
  |  Branch (288:13): [True: 0, False: 0]
  |  Branch (288:20): [True: 0, False: 0]
  ------------------
  289|      0|            face->ascender = os2->sTypoAscender;
  290|      0|            face->descender = os2->sTypoDescender;
  291|      0|            face->height = face->ascender - face->descender;
  292|      0|        } else {
  293|      0|            face->ascender = face->bbox.yMax;
  294|      0|            face->descender = face->bbox.yMin;
  295|      0|            face->height = face->ascender - face->descender;
  296|      0|        }
  297|      0|    }
  298|    202|}

ass_fontconfig_add_provider:
  322|     33|{
  323|     33|    int rc;
  324|     33|    ProviderPrivate *fc = NULL;
  325|     33|    ASS_FontProvider *provider = NULL;
  326|       |
  327|     33|    fc = calloc(1, sizeof(ProviderPrivate));
  328|     33|    if (fc == NULL)
  ------------------
  |  Branch (328:9): [True: 0, False: 33]
  ------------------
  329|      0|        return NULL;
  330|       |
  331|       |    // build and load fontconfig configuration
  332|     33|    fc->config = FcConfigCreate();
  333|     33|    rc = FcConfigParseAndLoad(fc->config, (unsigned char *) config, FcTrue);
  334|     33|    if (!rc) {
  ------------------
  |  Branch (334:9): [True: 33, False: 0]
  ------------------
  335|     33|        ass_msg(lib, MSGL_WARN, "No usable fontconfig configuration "
  ------------------
  |  |   41|     33|#define MSGL_WARN 2
  ------------------
  336|     33|                "file found, using fallback.");
  337|     33|        FcConfigDestroy(fc->config);
  338|     33|        fc->config = FcInitLoadConfig();
  339|     33|    }
  340|     33|    if (fc->config)
  ------------------
  |  Branch (340:9): [True: 33, False: 0]
  ------------------
  341|     33|        rc = FcConfigBuildFonts(fc->config);
  342|       |
  343|     33|    if (!rc || !fc->config) {
  ------------------
  |  Branch (343:9): [True: 0, False: 33]
  |  Branch (343:16): [True: 0, False: 33]
  ------------------
  344|      0|        ass_msg(lib, MSGL_FATAL,
  ------------------
  |  |   39|      0|#define MSGL_FATAL 0
  ------------------
  345|      0|                "No valid fontconfig configuration found!");
  346|      0|        FcConfigDestroy(fc->config);
  347|      0|        free(fc);
  348|      0|        return NULL;
  349|      0|    }
  350|       |
  351|       |    // create font provider
  352|     33|    provider = ass_font_provider_new(selector, &fontconfig_callbacks, fc);
  353|       |
  354|       |    // build database from system fonts
  355|     33|    scan_fonts(fc->config, provider);
  356|       |
  357|     33|    return provider;
  358|     33|}
ass_fontconfig.c:check_glyph:
   56|    203|{
   57|    203|    FcPattern *pat = (FcPattern *)priv;
   58|    203|    FcCharSet *charset;
   59|       |
   60|    203|    if (!pat)
  ------------------
  |  Branch (60:9): [True: 0, False: 203]
  ------------------
   61|      0|        return true;
   62|       |
   63|    203|    if (code == 0)
  ------------------
  |  Branch (63:9): [True: 201, False: 2]
  ------------------
   64|    201|        return true;
   65|       |
   66|      2|    FcResult result = FcPatternGetCharSet(pat, FC_CHARSET, 0, &charset);
   67|      2|    if (result != FcResultMatch)
  ------------------
  |  Branch (67:9): [True: 0, False: 2]
  ------------------
   68|      0|        return false;
   69|      2|    if (FcCharSetHasChar(charset, code) == FcTrue)
  ------------------
  |  Branch (69:9): [True: 2, False: 0]
  ------------------
   70|      2|        return true;
   71|      0|    return false;
   72|      2|}
ass_fontconfig.c:destroy:
   75|     33|{
   76|     33|    ProviderPrivate *fc = (ProviderPrivate *)priv;
   77|       |
   78|     33|    if (fc->fallback_chars)
  ------------------
  |  Branch (78:9): [True: 10, False: 23]
  ------------------
   79|     10|        FcCharSetDestroy(fc->fallback_chars);
   80|     33|    if (fc->fallbacks)
  ------------------
  |  Branch (80:9): [True: 10, False: 23]
  ------------------
   81|     10|        FcFontSetDestroy(fc->fallbacks);
   82|     33|    FcConfigDestroy(fc->config);
   83|     33|    free(fc);
   84|     33|}
ass_fontconfig.c:get_substitutions:
  276|  1.42k|{
  277|  1.42k|    ProviderPrivate *fc = (ProviderPrivate *)priv;
  278|       |
  279|  1.42k|    FcPattern *pat = FcPatternCreate();
  280|  1.42k|    if (!pat)
  ------------------
  |  Branch (280:9): [True: 0, False: 1.42k]
  ------------------
  281|      0|        return;
  282|       |
  283|  1.42k|    FcPatternAddString(pat, FC_FAMILY, (FcChar8 *)name);
  284|  1.42k|    FcPatternAddString(pat, FC_FAMILY, (FcChar8 *)"__libass_delimiter");
  285|  1.42k|    FcPatternAddBool(pat, FC_OUTLINE, FcTrue);
  286|  1.42k|    if (!FcConfigSubstitute(fc->config, pat, FcMatchPattern))
  ------------------
  |  Branch (286:9): [True: 0, False: 1.42k]
  ------------------
  287|      0|        goto cleanup;
  288|       |
  289|       |    // read and strdup fullnames
  290|  1.42k|    meta->n_fullname = 0;
  291|  1.42k|    meta->fullnames = calloc(MAX_NAME, sizeof(char *));
  ------------------
  |  |   33|  1.42k|#define MAX_NAME 100
  ------------------
  292|  1.42k|    if (!meta->fullnames)
  ------------------
  |  Branch (292:9): [True: 0, False: 1.42k]
  ------------------
  293|      0|        goto cleanup;
  294|       |
  295|  1.42k|    char *alias = NULL;
  296|  2.85k|    while (FcPatternGetString(pat, FC_FAMILY, meta->n_fullname,
  ------------------
  |  Branch (296:12): [True: 2.85k, False: 0]
  ------------------
  297|  2.85k|                (FcChar8 **)&alias) == FcResultMatch
  298|  2.85k|                && meta->n_fullname < MAX_NAME
  ------------------
  |  |   33|  5.71k|#define MAX_NAME 100
  ------------------
  |  Branch (298:20): [True: 2.85k, False: 0]
  ------------------
  299|  2.85k|                && strcmp(alias, "__libass_delimiter") != 0) {
  ------------------
  |  Branch (299:20): [True: 1.42k, False: 1.42k]
  ------------------
  300|  1.42k|        alias = strdup(alias);
  301|  1.42k|        if (!alias)
  ------------------
  |  Branch (301:13): [True: 0, False: 1.42k]
  ------------------
  302|      0|            goto cleanup;
  303|  1.42k|        meta->fullnames[meta->n_fullname] = alias;
  304|  1.42k|        meta->n_fullname++;
  305|  1.42k|    }
  306|       |
  307|  1.42k|cleanup:
  308|  1.42k|    FcPatternDestroy(pat);
  309|  1.42k|}
ass_fontconfig.c:get_fallback:
  225|    613|{
  226|    613|    ProviderPrivate *fc = (ProviderPrivate *)priv;
  227|    613|    FcResult result;
  228|       |
  229|    613|    cache_fallbacks(fc);
  230|       |
  231|    613|    if (!fc->fallbacks || fc->fallbacks->nfont == 0)
  ------------------
  |  Branch (231:9): [True: 0, False: 613]
  |  Branch (231:27): [True: 0, False: 613]
  ------------------
  232|      0|        return NULL;
  233|       |
  234|    613|    if (codepoint == 0) {
  ------------------
  |  Branch (234:9): [True: 201, False: 412]
  ------------------
  235|    201|        char *family = NULL;
  236|    201|        result = FcPatternGetString(fc->fallbacks->fonts[0], FC_FAMILY, 0,
  237|    201|                (FcChar8 **)&family);
  238|    201|        if (result == FcResultMatch) {
  ------------------
  |  Branch (238:13): [True: 201, False: 0]
  ------------------
  239|    201|            return strdup(family);
  240|    201|        } else {
  241|      0|            return NULL;
  242|      0|        }
  243|    201|    }
  244|       |
  245|       |    // fallback_chars is the union of all available charsets, so
  246|       |    // if we can't find the glyph in there, the system does not
  247|       |    // have any font to render this glyph.
  248|    412|    if (FcCharSetHasChar(fc->fallback_chars, codepoint) == FcFalse)
  ------------------
  |  Branch (248:9): [True: 411, False: 1]
  ------------------
  249|    411|        return NULL;
  250|       |
  251|      2|    for (int j = 0; j < fc->fallbacks->nfont; j++) {
  ------------------
  |  Branch (251:21): [True: 2, False: 0]
  ------------------
  252|      2|        FcPattern *pattern = fc->fallbacks->fonts[j];
  253|       |
  254|      2|        FcCharSet *charset;
  255|      2|        result = FcPatternGetCharSet(pattern, FC_CHARSET, 0, &charset);
  256|       |
  257|      2|        if (result == FcResultMatch && FcCharSetHasChar(charset,
  ------------------
  |  Branch (257:13): [True: 2, False: 0]
  |  Branch (257:40): [True: 1, False: 1]
  ------------------
  258|      2|                    codepoint)) {
  259|      1|            char *family = NULL;
  260|      1|            result = FcPatternGetString(pattern, FC_FAMILY, 0,
  261|      1|                    (FcChar8 **)&family);
  262|      1|            if (result == FcResultMatch) {
  ------------------
  |  Branch (262:17): [True: 1, False: 0]
  ------------------
  263|      1|                return strdup(family);
  264|      1|            } else {
  265|      0|                return NULL;
  266|      0|            }
  267|      1|        }
  268|      2|    }
  269|       |
  270|       |    // we shouldn't get here
  271|      0|    return NULL;
  272|      1|}
ass_fontconfig.c:cache_fallbacks:
  194|    613|{
  195|    613|    FcResult result;
  196|       |
  197|    613|    if (fc->fallbacks)
  ------------------
  |  Branch (197:9): [True: 603, False: 10]
  ------------------
  198|    603|        return;
  199|       |
  200|       |    // Create a suitable pattern
  201|     10|    FcPattern *pat = FcPatternCreate();
  202|     10|    FcPatternAddString(pat, FC_FAMILY, (FcChar8 *)"sans-serif");
  203|     10|    FcPatternAddBool(pat, FC_OUTLINE, FcTrue);
  204|     10|    FcConfigSubstitute (fc->config, pat, FcMatchPattern);
  205|     10|    FcDefaultSubstitute (pat);
  206|       |
  207|       |    // FC_LANG is automatically set according to locale, but this results
  208|       |    // in strange sorting sometimes, so remove the attribute completely.
  209|     10|    FcPatternDel(pat, FC_LANG);
  210|       |
  211|       |    // Sort installed fonts and eliminate duplicates; this can be very
  212|       |    // expensive.
  213|     10|    fc->fallbacks = FcFontSort(fc->config, pat, FcTrue, &fc->fallback_chars,
  214|     10|            &result);
  215|       |
  216|       |    // If this fails, just add an empty set
  217|     10|    if (result != FcResultMatch)
  ------------------
  |  Branch (217:9): [True: 0, False: 10]
  ------------------
  218|      0|        fc->fallbacks = FcFontSetCreate();
  219|       |
  220|     10|    FcPatternDestroy(pat);
  221|     10|}
ass_fontconfig.c:scan_fonts:
   87|     33|{
   88|     33|    int i;
   89|     33|    FcFontSet *fonts;
   90|     33|    ASS_FontProviderMetaData meta = {0};
   91|       |
   92|       |    // get list of fonts
   93|     33|    fonts = FcConfigGetFonts(config, FcSetSystem);
   94|       |
   95|       |    // fill font_info list
   96|    759|    for (i = 0; i < fonts->nfont; i++) {
  ------------------
  |  Branch (96:17): [True: 726, False: 33]
  ------------------
   97|    726|        FcPattern *pat = fonts->fonts[i];
   98|    726|        FcBool outline;
   99|    726|        int index;
  100|    726|        double weight;
  101|    726|        char *path;
  102|    726|        char *fullnames[MAX_NAME];
  103|    726|        char *families[MAX_NAME];
  104|       |
  105|       |        // skip non-outline fonts
  106|    726|        FcResult result = FcPatternGetBool(pat, FC_OUTLINE, 0, &outline);
  107|    726|        if (result != FcResultMatch || outline != FcTrue)
  ------------------
  |  Branch (107:13): [True: 0, False: 726]
  |  Branch (107:40): [True: 0, False: 726]
  ------------------
  108|      0|            continue;
  109|       |
  110|       |        // simple types
  111|    726|        result  = FcPatternGetInteger(pat, FC_SLANT, 0, &meta.slant);
  112|    726|        result |= FcPatternGetInteger(pat, FC_WIDTH, 0, &meta.width);
  113|    726|        result |= FcPatternGetDouble(pat, FC_WEIGHT, 0, &weight);
  114|    726|        result |= FcPatternGetInteger(pat, FC_INDEX, 0, &index);
  115|    726|        if (result != FcResultMatch)
  ------------------
  |  Branch (115:13): [True: 0, False: 726]
  ------------------
  116|      0|            continue;
  117|       |
  118|       |        // fontconfig uses its own weight scale, apparently derived
  119|       |        // from typographical weight. we're using truetype weights, so
  120|       |        // convert appropriately.
  121|    726|#if FC_VERSION >= 21292
  122|    726|        meta.weight = FcWeightToOpenTypeDouble(weight) + 0.5;
  123|       |#elif FC_VERSION >= 21191
  124|       |        // Versions prior to 2.12.92 only had integer precision.
  125|       |        meta.weight = FcWeightToOpenType(weight + 0.5) + 0.5;
  126|       |#else
  127|       |        // On older fontconfig, FcWeightToOpenType is unavailable, and its inverse was
  128|       |        // implemented more simply, using an if/else ladder instead of linear interpolation.
  129|       |        // We implement an inverse of that ladder here.
  130|       |        // We don't expect actual FC caches from these versions to have intermediate
  131|       |        // values, so the average checks are only for completeness.
  132|       |#define AVG(x, y) (((double)x + y) / 2)
  133|       |#ifndef FC_WEIGHT_SEMILIGHT
  134|       |#define FC_WEIGHT_SEMILIGHT 55
  135|       |#endif
  136|       |        if (weight < AVG(FC_WEIGHT_THIN, FC_WEIGHT_EXTRALIGHT))
  137|       |            meta.weight = 100;
  138|       |        else if (weight < AVG(FC_WEIGHT_EXTRALIGHT, FC_WEIGHT_LIGHT))
  139|       |            meta.weight = 200;
  140|       |        else if (weight < AVG(FC_WEIGHT_LIGHT, FC_WEIGHT_SEMILIGHT))
  141|       |            meta.weight = 300;
  142|       |        else if (weight < AVG(FC_WEIGHT_SEMILIGHT, FC_WEIGHT_BOOK))
  143|       |            meta.weight = 350;
  144|       |        else if (weight < AVG(FC_WEIGHT_BOOK, FC_WEIGHT_REGULAR))
  145|       |            meta.weight = 380;
  146|       |        else if (weight < AVG(FC_WEIGHT_REGULAR, FC_WEIGHT_MEDIUM))
  147|       |            meta.weight = 400;
  148|       |        else if (weight < AVG(FC_WEIGHT_MEDIUM, FC_WEIGHT_SEMIBOLD))
  149|       |            meta.weight = 500;
  150|       |        else if (weight < AVG(FC_WEIGHT_SEMIBOLD, FC_WEIGHT_BOLD))
  151|       |            meta.weight = 600;
  152|       |        else if (weight < AVG(FC_WEIGHT_BOLD, FC_WEIGHT_EXTRABOLD))
  153|       |            meta.weight = 700;
  154|       |        else if (weight < AVG(FC_WEIGHT_EXTRABOLD, FC_WEIGHT_BLACK))
  155|       |            meta.weight = 800;
  156|       |        else if (weight < AVG(FC_WEIGHT_BLACK, FC_WEIGHT_EXTRABLACK))
  157|       |            meta.weight = 900;
  158|       |        else
  159|       |            meta.weight = 1000;
  160|       |#endif
  161|       |
  162|       |        // path
  163|    726|        result = FcPatternGetString(pat, FC_FILE, 0, (FcChar8 **)&path);
  164|    726|        if (result != FcResultMatch)
  ------------------
  |  Branch (164:13): [True: 0, False: 726]
  ------------------
  165|      0|            continue;
  166|       |
  167|       |        // read family names
  168|    726|        meta.n_family = 0;
  169|  1.74k|        while (meta.n_family < MAX_NAME &&
  ------------------
  |  |   33|  3.49k|#define MAX_NAME 100
  ------------------
  |  Branch (169:16): [True: 1.74k, False: 0]
  ------------------
  170|  1.74k|                FcPatternGetString(pat, FC_FAMILY, meta.n_family,
  ------------------
  |  Branch (170:17): [True: 1.02k, False: 726]
  ------------------
  171|  1.74k|                    (FcChar8 **)&families[meta.n_family]) == FcResultMatch)
  172|  1.02k|            meta.n_family++;
  173|    726|        meta.families = families;
  174|       |
  175|       |        // read fullnames
  176|    726|        meta.n_fullname = 0;
  177|  1.45k|        while (meta.n_fullname < MAX_NAME &&
  ------------------
  |  |   33|  2.90k|#define MAX_NAME 100
  ------------------
  |  Branch (177:16): [True: 1.45k, False: 0]
  ------------------
  178|  1.45k|                FcPatternGetString(pat, FC_FULLNAME, meta.n_fullname,
  ------------------
  |  Branch (178:17): [True: 726, False: 726]
  ------------------
  179|  1.45k|                    (FcChar8 **)&fullnames[meta.n_fullname]) == FcResultMatch)
  180|    726|            meta.n_fullname++;
  181|    726|        meta.fullnames = fullnames;
  182|       |
  183|       |        // read PostScript name
  184|    726|        result = FcPatternGetString(pat, FC_POSTSCRIPT_NAME, 0,
  185|    726|                (FcChar8 **)&meta.postscript_name);
  186|    726|        if (result != FcResultMatch)
  ------------------
  |  Branch (186:13): [True: 0, False: 726]
  ------------------
  187|      0|            meta.postscript_name = NULL;
  188|       |
  189|    726|        ass_font_provider_add_font(provider, &meta, path, index, (void *)pat);
  190|    726|    }
  191|     33|}

ass_font_provider_new:
  199|     66|{
  200|     66|    ASS_FontProvider *provider = calloc(1, sizeof(ASS_FontProvider));
  201|     66|    if (provider == NULL)
  ------------------
  |  Branch (201:9): [True: 0, False: 66]
  ------------------
  202|      0|        return NULL;
  203|       |
  204|     66|    provider->parent   = selector;
  205|     66|    provider->funcs    = *funcs;
  206|     66|    provider->priv     = data;
  207|       |
  208|     66|    return provider;
  209|     66|}
ass_font_provider_add_font:
  392|    726|{
  393|    726|    int i;
  394|    726|    int weight, slant, width;
  395|    726|    ASS_FontSelector *selector = provider->parent;
  396|    726|    ASS_FontInfo *info = NULL;
  397|    726|    ASS_FontProviderMetaData implicit_meta = {0};
  398|       |
  399|    726|    if (!meta->n_family) {
  ------------------
  |  Branch (399:9): [True: 0, False: 726]
  ------------------
  400|      0|        FT_Face face;
  401|      0|        if (provider->funcs.get_font_index)
  ------------------
  |  Branch (401:13): [True: 0, False: 0]
  ------------------
  402|      0|            index = provider->funcs.get_font_index(data);
  403|      0|        if (!path) {
  ------------------
  |  Branch (403:13): [True: 0, False: 0]
  ------------------
  404|      0|            ASS_FontStream stream = {
  405|      0|                .func = provider->funcs.get_data,
  406|      0|                .priv = data,
  407|      0|            };
  408|       |            // This name is only used in an error message, so use
  409|       |            // our best name but don't panic if we don't have any.
  410|       |            // Prefer PostScript name because it is unique.
  411|      0|            const char *name = meta->postscript_name ?
  ------------------
  |  Branch (411:32): [True: 0, False: 0]
  ------------------
  412|      0|                meta->postscript_name : meta->extended_family;
  413|      0|            face = ass_face_stream(selector->library, selector->ftlibrary,
  414|      0|                                   name, &stream, index);
  415|      0|        } else {
  416|      0|            face = ass_face_open(selector->library, selector->ftlibrary,
  417|      0|                                 path, meta->postscript_name, index);
  418|      0|        }
  419|      0|        if (!face)
  ------------------
  |  Branch (419:13): [True: 0, False: 0]
  ------------------
  420|      0|            goto error;
  421|      0|        if (!get_font_info(selector->ftlibrary, face, meta->extended_family,
  ------------------
  |  Branch (421:13): [True: 0, False: 0]
  ------------------
  422|      0|                           &implicit_meta)) {
  423|      0|            FT_Done_Face(face);
  424|      0|            goto error;
  425|      0|        }
  426|      0|        if (implicit_meta.postscript_name) {
  ------------------
  |  Branch (426:13): [True: 0, False: 0]
  ------------------
  427|      0|            implicit_meta.postscript_name =
  428|      0|                strdup(implicit_meta.postscript_name);
  429|      0|            if (!implicit_meta.postscript_name) {
  ------------------
  |  Branch (429:17): [True: 0, False: 0]
  ------------------
  430|      0|                FT_Done_Face(face);
  431|      0|                goto error;
  432|      0|            }
  433|      0|        }
  434|      0|        FT_Done_Face(face);
  435|      0|        implicit_meta.extended_family = meta->extended_family;
  436|      0|        meta = &implicit_meta;
  437|      0|    }
  438|       |
  439|       |#if 0
  440|       |    int j;
  441|       |    printf("new font:\n");
  442|       |    printf("  families: ");
  443|       |    for (j = 0; j < meta->n_family; j++)
  444|       |        printf("'%s' ", meta->families[j]);
  445|       |    printf("\n");
  446|       |    printf("  fullnames: ");
  447|       |    for (j = 0; j < meta->n_fullname; j++)
  448|       |        printf("'%s' ", meta->fullnames[j]);
  449|       |    printf("\n");
  450|       |    printf("  slant: %d\n", meta->slant);
  451|       |    printf("  weight: %d\n", meta->weight);
  452|       |    printf("  width: %d\n", meta->width);
  453|       |    printf("  path: %s\n", path);
  454|       |    printf("  index: %d\n", index);
  455|       |#endif
  456|       |
  457|    726|    weight = meta->weight;
  458|    726|    slant  = meta->slant;
  459|    726|    width  = meta->width;
  460|       |
  461|       |    // check slant/weight for validity, use defaults if they're invalid
  462|    726|    if (weight < 100 || weight > 900)
  ------------------
  |  Branch (462:9): [True: 0, False: 726]
  |  Branch (462:25): [True: 0, False: 726]
  ------------------
  463|      0|        weight = 400;
  464|    726|    if (slant < 0 || slant > 110)
  ------------------
  |  Branch (464:9): [True: 0, False: 726]
  |  Branch (464:22): [True: 0, False: 726]
  ------------------
  465|      0|        slant = 0;
  466|    726|    if (width < 50 || width > 200)
  ------------------
  |  Branch (466:9): [True: 0, False: 726]
  |  Branch (466:23): [True: 0, False: 726]
  ------------------
  467|      0|        width = 100;
  468|       |
  469|       |    // check size
  470|    726|    if (selector->n_font >= selector->alloc_font) {
  ------------------
  |  Branch (470:9): [True: 198, False: 528]
  ------------------
  471|    198|        selector->alloc_font = FFMAX(1, 2 * selector->alloc_font);
  ------------------
  |  |   46|    198|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 33, False: 165]
  |  |  ------------------
  ------------------
  472|    198|        selector->font_infos = realloc(selector->font_infos,
  473|    198|                selector->alloc_font * sizeof(ASS_FontInfo));
  474|    198|    }
  475|       |
  476|       |    // copy over metadata
  477|    726|    info = selector->font_infos + selector->n_font;
  478|    726|    memset(info, 0, sizeof(ASS_FontInfo));
  479|       |
  480|       |    // set uid
  481|    726|    info->uid = selector->uid++;
  482|       |
  483|    726|    info->slant         = slant;
  484|    726|    info->weight        = weight;
  485|    726|    info->width         = width;
  486|    726|    info->n_fullname    = meta->n_fullname;
  487|    726|    info->n_family      = meta->n_family;
  488|    726|    info->is_postscript = meta->is_postscript;
  489|       |
  490|    726|    info->families = calloc(meta->n_family, sizeof(char *));
  491|    726|    if (info->families == NULL)
  ------------------
  |  Branch (491:9): [True: 0, False: 726]
  ------------------
  492|      0|        goto error;
  493|       |
  494|    726|    if (meta->n_fullname) {
  ------------------
  |  Branch (494:9): [True: 726, False: 0]
  ------------------
  495|    726|        info->fullnames = calloc(meta->n_fullname, sizeof(char *));
  496|    726|        if (info->fullnames == NULL)
  ------------------
  |  Branch (496:13): [True: 0, False: 726]
  ------------------
  497|      0|            goto error;
  498|    726|    }
  499|       |
  500|  1.74k|    for (i = 0; i < info->n_family; i++) {
  ------------------
  |  Branch (500:17): [True: 1.02k, False: 726]
  ------------------
  501|  1.02k|        info->families[i] = strdup(meta->families[i]);
  502|  1.02k|        if (info->families[i] == NULL)
  ------------------
  |  Branch (502:13): [True: 0, False: 1.02k]
  ------------------
  503|      0|            goto error;
  504|  1.02k|    }
  505|       |
  506|  1.45k|    for (i = 0; i < info->n_fullname; i++) {
  ------------------
  |  Branch (506:17): [True: 726, False: 726]
  ------------------
  507|    726|        info->fullnames[i] = strdup(meta->fullnames[i]);
  508|    726|        if (info->fullnames[i] == NULL)
  ------------------
  |  Branch (508:13): [True: 0, False: 726]
  ------------------
  509|      0|            goto error;
  510|    726|    }
  511|       |
  512|    726|    if (meta->postscript_name) {
  ------------------
  |  Branch (512:9): [True: 726, False: 0]
  ------------------
  513|    726|        info->postscript_name = strdup(meta->postscript_name);
  514|    726|        if (info->postscript_name == NULL)
  ------------------
  |  Branch (514:13): [True: 0, False: 726]
  ------------------
  515|      0|            goto error;
  516|    726|    }
  517|       |
  518|    726|    if (meta->extended_family) {
  ------------------
  |  Branch (518:9): [True: 0, False: 726]
  ------------------
  519|      0|        info->extended_family = strdup(meta->extended_family);
  520|      0|        if (info->extended_family == NULL)
  ------------------
  |  Branch (520:13): [True: 0, False: 0]
  ------------------
  521|      0|            goto error;
  522|      0|    }
  523|       |
  524|    726|    if (path) {
  ------------------
  |  Branch (524:9): [True: 726, False: 0]
  ------------------
  525|    726|        info->path = strdup(path);
  526|    726|        if (info->path == NULL)
  ------------------
  |  Branch (526:13): [True: 0, False: 726]
  ------------------
  527|      0|            goto error;
  528|    726|    }
  529|       |
  530|    726|    info->index = index;
  531|    726|    info->priv  = data;
  532|    726|    info->provider = provider;
  533|       |
  534|    726|    selector->n_font++;
  535|       |
  536|    726|    free_font_info(&implicit_meta);
  537|    726|    free(implicit_meta.postscript_name);
  538|       |
  539|    726|    return true;
  540|       |
  541|      0|error:
  542|      0|    if (info)
  ------------------
  |  Branch (542:9): [True: 0, False: 0]
  ------------------
  543|      0|        ass_font_provider_free_fontinfo(info);
  544|       |
  545|      0|    free_font_info(&implicit_meta);
  546|      0|    free(implicit_meta.postscript_name);
  547|       |
  548|      0|    if (provider->funcs.destroy_font)
  ------------------
  |  Branch (548:9): [True: 0, False: 0]
  ------------------
  549|      0|        provider->funcs.destroy_font(data);
  550|       |
  551|      0|    return false;
  552|    726|}
ass_font_provider_free:
  581|     66|{
  582|     66|    int i;
  583|     66|    ASS_FontSelector *selector = provider->parent;
  584|       |
  585|       |    // free all fonts and mark their entries
  586|    792|    for (i = 0; i < selector->n_font; i++) {
  ------------------
  |  Branch (586:17): [True: 726, False: 66]
  ------------------
  587|    726|        ASS_FontInfo *info = selector->font_infos + i;
  588|       |
  589|    726|        if (info->provider == provider) {
  ------------------
  |  Branch (589:13): [True: 726, False: 0]
  ------------------
  590|    726|            ass_font_provider_free_fontinfo(info);
  591|       |
  592|    726|            if (info->provider->funcs.destroy_font)
  ------------------
  |  Branch (592:17): [True: 0, False: 726]
  ------------------
  593|      0|                info->provider->funcs.destroy_font(info->priv);
  594|       |
  595|    726|            info->provider = NULL;
  596|    726|        }
  597|       |
  598|    726|    }
  599|       |
  600|       |    // delete marked entries
  601|     66|    ass_fontselect_cleanup(selector);
  602|       |
  603|       |    // free private data of the provider
  604|     66|    if (provider->funcs.destroy_provider)
  ------------------
  |  Branch (604:9): [True: 33, False: 33]
  ------------------
  605|     33|        provider->funcs.destroy_provider(provider->priv);
  606|       |
  607|     66|    free(provider);
  608|     66|}
ass_font_select:
  901|    613|{
  902|    613|    char *res = 0;
  903|    613|    const char *family = font->desc.family.str;  // always zero-terminated
  904|    613|    unsigned bold = font->desc.bold;
  905|    613|    unsigned italic = font->desc.italic;
  906|    613|    ASS_FontProvider *default_provider = priv->default_provider;
  907|       |
  908|    613|    if (family && *family)
  ------------------
  |  Branch (908:9): [True: 613, False: 0]
  |  Branch (908:19): [True: 613, False: 0]
  ------------------
  909|    613|        res = select_font(priv, family, false, bold, italic, index,
  910|    613|                postscript_name, uid, data, code);
  911|       |
  912|    613|    if (!res && priv->family_default) {
  ------------------
  |  Branch (912:9): [True: 613, False: 0]
  |  Branch (912:17): [True: 613, False: 0]
  ------------------
  913|    613|        res = select_font(priv, priv->family_default, false, bold,
  914|    613|                italic, index, postscript_name, uid, data, code);
  915|    613|        if (res)
  ------------------
  |  Branch (915:13): [True: 0, False: 613]
  ------------------
  916|      0|            ass_msg(priv->library, MSGL_WARN, "fontselect: Using default "
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  917|      0|                    "font family: (%s, %d, %d) -> %s, %d, %s",
  918|      0|                    family, bold, italic, res, *index,
  919|      0|                    *postscript_name ? *postscript_name : "(none)");
  ------------------
  |  Branch (919:21): [True: 0, False: 0]
  ------------------
  920|    613|    }
  921|       |
  922|    613|    if (!res && default_provider && default_provider->funcs.get_fallback) {
  ------------------
  |  Branch (922:9): [True: 613, False: 0]
  |  Branch (922:17): [True: 613, False: 0]
  |  Branch (922:37): [True: 613, False: 0]
  ------------------
  923|    613|        const char *search_family = family;
  924|    613|        if (!search_family || !*search_family)
  ------------------
  |  Branch (924:13): [True: 0, False: 613]
  |  Branch (924:31): [True: 0, False: 613]
  ------------------
  925|      0|            search_family = "Arial";
  926|    613|        char *fallback_family = default_provider->funcs.get_fallback(
  927|    613|                default_provider->priv, priv->library, search_family, code);
  928|       |
  929|    613|        if (fallback_family) {
  ------------------
  |  Branch (929:13): [True: 202, False: 411]
  ------------------
  930|    202|            res = select_font(priv, fallback_family, true, bold, italic,
  931|    202|                    index, postscript_name, uid, data, code);
  932|    202|            free(fallback_family);
  933|    202|        }
  934|    613|    }
  935|       |
  936|    613|    if (!res && priv->path_default) {
  ------------------
  |  Branch (936:9): [True: 411, False: 202]
  |  Branch (936:17): [True: 0, False: 411]
  ------------------
  937|      0|        res = priv->path_default;
  938|      0|        *index = priv->index_default;
  939|      0|        ass_msg(priv->library, MSGL_WARN, "fontselect: Using default font: "
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
  940|      0|                "(%s, %d, %d) -> %s, %d, %s", family, bold, italic,
  941|      0|                priv->path_default, *index,
  942|      0|                *postscript_name ? *postscript_name : "(none)");
  ------------------
  |  Branch (942:17): [True: 0, False: 0]
  ------------------
  943|      0|    }
  944|       |
  945|    613|    if (res)
  ------------------
  |  Branch (945:9): [True: 202, False: 411]
  ------------------
  946|    202|        ass_msg(priv->library, MSGL_INFO,
  ------------------
  |  |   42|    202|#define MSGL_INFO 4
  ------------------
  947|    202|                "fontselect: (%s, %d, %d) -> %s, %d, %s", family, bold,
  948|    202|                italic, res, *index, *postscript_name ? *postscript_name : "(none)");
  ------------------
  |  Branch (948:38): [True: 202, False: 0]
  ------------------
  949|    411|    else
  950|    411|        ass_msg(priv->library, MSGL_WARN,
  ------------------
  |  |   41|    411|#define MSGL_WARN 2
  ------------------
  951|    411|                "fontselect: failed to find any fallback with glyph 0x%X for font: "
  952|    411|                "(%s, %d, %d)", code, family, bold, italic);
  953|       |
  954|    613|    return res;
  955|    613|}
ass_fontselect_init:
 1088|     33|{
 1089|     33|    ASS_FontSelector *priv = calloc(1, sizeof(ASS_FontSelector));
 1090|     33|    if (priv == NULL)
  ------------------
  |  Branch (1090:9): [True: 0, False: 33]
  ------------------
 1091|      0|        return NULL;
 1092|       |
 1093|     33|    priv->library = library;
 1094|     33|    priv->ftlibrary = ftlibrary;
 1095|     33|    priv->uid = 1;
 1096|     33|    priv->family_default = family ? strdup(family) : NULL;
  ------------------
  |  Branch (1096:28): [True: 33, False: 0]
  ------------------
 1097|     33|    priv->path_default = path ? strdup(path) : NULL;
  ------------------
  |  Branch (1097:26): [True: 0, False: 33]
  ------------------
 1098|     33|    priv->index_default = 0;
 1099|       |
 1100|     33|    if (family && !priv->family_default)
  ------------------
  |  Branch (1100:9): [True: 33, False: 0]
  |  Branch (1100:19): [True: 0, False: 33]
  ------------------
 1101|      0|        goto fail;
 1102|     33|    if (path && !priv->path_default)
  ------------------
  |  Branch (1102:9): [True: 0, False: 33]
  |  Branch (1102:17): [True: 0, False: 0]
  ------------------
 1103|      0|        goto fail;
 1104|       |
 1105|     33|    priv->embedded_provider = ass_embedded_fonts_add_provider(priv, num_emfonts);
 1106|       |
 1107|     33|    if (priv->embedded_provider == NULL) {
  ------------------
  |  Branch (1107:9): [True: 0, False: 33]
  ------------------
 1108|      0|        ass_msg(library, MSGL_WARN, "failed to create embedded font provider");
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 1109|      0|        goto fail;
 1110|      0|    }
 1111|       |
 1112|     33|    if (dfp >= ASS_FONTPROVIDER_AUTODETECT) {
  ------------------
  |  Branch (1112:9): [True: 33, False: 0]
  ------------------
 1113|     33|        for (int i = 0; font_constructors[i].constructor; i++ )
  ------------------
  |  Branch (1113:25): [True: 33, False: 0]
  ------------------
 1114|     33|            if (dfp == font_constructors[i].id ||
  ------------------
  |  Branch (1114:17): [True: 0, False: 33]
  ------------------
 1115|     33|                dfp == ASS_FONTPROVIDER_AUTODETECT) {
  ------------------
  |  Branch (1115:17): [True: 33, False: 0]
  ------------------
 1116|     33|                priv->default_provider =
 1117|     33|                    font_constructors[i].constructor(library, priv,
 1118|     33|                                                     config, ftlibrary);
 1119|     33|                if (priv->default_provider) {
  ------------------
  |  Branch (1119:21): [True: 33, False: 0]
  ------------------
 1120|     33|                    ass_msg(library, MSGL_INFO, "Using font provider %s",
  ------------------
  |  |   42|     33|#define MSGL_INFO 4
  ------------------
 1121|     33|                            font_constructors[i].name);
 1122|     33|                    break;
 1123|     33|                }
 1124|     33|            }
 1125|       |
 1126|     33|        if (!priv->default_provider)
  ------------------
  |  Branch (1126:13): [True: 0, False: 33]
  ------------------
 1127|      0|            ass_msg(library, MSGL_WARN, "can't find selected font provider");
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 1128|       |
 1129|     33|    }
 1130|       |
 1131|     33|    return priv;
 1132|       |
 1133|      0|fail:
 1134|      0|    if (priv->default_provider)
  ------------------
  |  Branch (1134:9): [True: 0, False: 0]
  ------------------
 1135|      0|        ass_font_provider_free(priv->default_provider);
 1136|      0|    if (priv->embedded_provider)
  ------------------
  |  Branch (1136:9): [True: 0, False: 0]
  ------------------
 1137|      0|        ass_font_provider_free(priv->embedded_provider);
 1138|       |
 1139|      0|    free(priv->family_default);
 1140|      0|    free(priv->path_default);
 1141|       |
 1142|      0|    free(priv);
 1143|       |
 1144|      0|    return NULL;
 1145|     33|}
ass_fontselect_free:
 1176|     33|{
 1177|     33|    if (priv->default_provider)
  ------------------
  |  Branch (1177:9): [True: 33, False: 0]
  ------------------
 1178|     33|        ass_font_provider_free(priv->default_provider);
 1179|     33|    if (priv->embedded_provider)
  ------------------
  |  Branch (1179:9): [True: 33, False: 0]
  ------------------
 1180|     33|        ass_font_provider_free(priv->embedded_provider);
 1181|       |
 1182|     33|    free(priv->font_infos);
 1183|     33|    free(priv->path_default);
 1184|     33|    free(priv->family_default);
 1185|       |
 1186|     33|    free(priv);
 1187|     33|}
ass_fontselect.c:free_font_info:
  365|    726|{
  366|    726|    if (meta->families) {
  ------------------
  |  Branch (366:9): [True: 0, False: 726]
  ------------------
  367|      0|        for (int i = 0; i < meta->n_family; i++)
  ------------------
  |  Branch (367:25): [True: 0, False: 0]
  ------------------
  368|      0|            free(meta->families[i]);
  369|      0|        free(meta->families);
  370|      0|    }
  371|       |
  372|    726|    if (meta->fullnames) {
  ------------------
  |  Branch (372:9): [True: 0, False: 726]
  ------------------
  373|      0|        for (int i = 0; i < meta->n_fullname; i++)
  ------------------
  |  Branch (373:25): [True: 0, False: 0]
  ------------------
  374|      0|            free(meta->fullnames[i]);
  375|      0|        free(meta->fullnames);
  376|      0|    }
  377|    726|}
ass_fontselect.c:ass_font_provider_free_fontinfo:
  218|    726|{
  219|    726|    int j;
  220|       |
  221|    726|    if (info->fullnames) {
  ------------------
  |  Branch (221:9): [True: 726, False: 0]
  ------------------
  222|  1.45k|        for (j = 0; j < info->n_fullname; j++)
  ------------------
  |  Branch (222:21): [True: 726, False: 726]
  ------------------
  223|    726|            free(info->fullnames[j]);
  224|    726|        free(info->fullnames);
  225|    726|    }
  226|       |
  227|    726|    if (info->families) {
  ------------------
  |  Branch (227:9): [True: 726, False: 0]
  ------------------
  228|  1.74k|        for (j = 0; j < info->n_family; j++)
  ------------------
  |  Branch (228:21): [True: 1.02k, False: 726]
  ------------------
  229|  1.02k|            free(info->families[j]);
  230|    726|        free(info->families);
  231|    726|    }
  232|       |
  233|    726|    if (info->path)
  ------------------
  |  Branch (233:9): [True: 726, False: 0]
  ------------------
  234|    726|        free(info->path);
  235|       |
  236|    726|    if (info->postscript_name)
  ------------------
  |  Branch (236:9): [True: 726, False: 0]
  ------------------
  237|    726|        free(info->postscript_name);
  238|       |
  239|    726|    if (info->extended_family)
  ------------------
  |  Branch (239:9): [True: 0, False: 726]
  ------------------
  240|      0|        free(info->extended_family);
  241|    726|}
ass_fontselect.c:ass_fontselect_cleanup:
  560|     66|{
  561|     66|    int i, w;
  562|       |
  563|    792|    for (i = 0, w = 0; i < selector->n_font; i++) {
  ------------------
  |  Branch (563:24): [True: 726, False: 66]
  ------------------
  564|    726|        ASS_FontInfo *info = selector->font_infos + i;
  565|       |
  566|       |        // update write pointer
  567|    726|        if (info->provider != NULL) {
  ------------------
  |  Branch (567:13): [True: 0, False: 726]
  ------------------
  568|       |            // rewrite, if needed
  569|      0|            if (w != i)
  ------------------
  |  Branch (569:17): [True: 0, False: 0]
  ------------------
  570|      0|                memcpy(selector->font_infos + w, selector->font_infos + i,
  571|      0|                        sizeof(ASS_FontInfo));
  572|      0|            w++;
  573|      0|        }
  574|       |
  575|    726|    }
  576|       |
  577|     66|    selector->n_font = w;
  578|     66|}
ass_fontselect.c:select_font:
  831|  1.42k|{
  832|  1.42k|    ASS_FontProvider *default_provider = priv->default_provider;
  833|  1.42k|    ASS_FontProviderMetaData meta = {0};
  834|  1.42k|    char *result = NULL;
  835|  1.42k|    bool name_match = false;
  836|       |
  837|  1.42k|    if (family == NULL)
  ------------------
  |  Branch (837:9): [True: 0, False: 1.42k]
  ------------------
  838|      0|        return NULL;
  839|       |
  840|  1.42k|    ASS_FontProviderMetaData default_meta = {
  841|  1.42k|        .n_fullname = 1,
  842|  1.42k|        .fullnames  = (char **)&family,
  843|  1.42k|    };
  844|       |
  845|       |    // Get a list of substitutes if applicable, and use it for matching.
  846|  1.42k|    if (default_provider && default_provider->funcs.get_substitutions) {
  ------------------
  |  Branch (846:9): [True: 1.42k, False: 0]
  |  Branch (846:29): [True: 1.42k, False: 0]
  ------------------
  847|  1.42k|        default_provider->funcs.get_substitutions(default_provider->priv,
  848|  1.42k|                                                  family, &meta);
  849|  1.42k|    }
  850|       |
  851|  1.42k|    if (!meta.n_fullname) {
  ------------------
  |  Branch (851:9): [True: 0, False: 1.42k]
  ------------------
  852|      0|        free(meta.fullnames);
  853|      0|        meta = default_meta;
  854|      0|    }
  855|       |
  856|  1.42k|    result = find_font(priv, meta, match_extended_family,
  857|  1.42k|                       bold, italic, index, postscript_name, uid,
  858|  1.42k|                       stream, code, &name_match);
  859|       |
  860|       |    // If no matching font was found, it might not exist in the font list
  861|       |    // yet. Call the match_fonts callback to fill in the missing fonts
  862|       |    // on demand, and retry the search for a match.
  863|  1.42k|    if (result == NULL && name_match == false && default_provider &&
  ------------------
  |  Branch (863:9): [True: 1.22k, False: 202]
  |  Branch (863:27): [True: 1.22k, False: 0]
  |  Branch (863:50): [True: 1.22k, False: 0]
  ------------------
  864|  1.42k|            default_provider->funcs.match_fonts) {
  ------------------
  |  Branch (864:13): [True: 0, False: 1.22k]
  ------------------
  865|       |        // TODO: consider changing the API to make more efficient
  866|       |        // implementations possible.
  867|      0|        for (int i = 0; i < meta.n_fullname; i++) {
  ------------------
  |  Branch (867:25): [True: 0, False: 0]
  ------------------
  868|      0|            default_provider->funcs.match_fonts(default_provider->priv,
  869|      0|                                                priv->library, default_provider,
  870|      0|                                                meta.fullnames[i]);
  871|      0|        }
  872|      0|        result = find_font(priv, meta, match_extended_family,
  873|      0|                           bold, italic, index, postscript_name, uid,
  874|      0|                           stream, code, &name_match);
  875|      0|    }
  876|       |
  877|       |    // cleanup
  878|  1.42k|    if (meta.fullnames != default_meta.fullnames) {
  ------------------
  |  Branch (878:9): [True: 1.42k, False: 0]
  ------------------
  879|  2.85k|        for (int i = 0; i < meta.n_fullname; i++)
  ------------------
  |  Branch (879:25): [True: 1.42k, False: 1.42k]
  ------------------
  880|  1.42k|            free(meta.fullnames[i]);
  881|  1.42k|        free(meta.fullnames);
  882|  1.42k|    }
  883|       |
  884|  1.42k|    return result;
  885|  1.42k|}
ass_fontselect.c:find_font:
  727|  1.42k|{
  728|  1.42k|    ASS_FontInfo req = {0};
  729|  1.42k|    ASS_FontInfo *selected = NULL;
  730|       |
  731|       |    // do we actually have any fonts?
  732|  1.42k|    if (!priv->n_font)
  ------------------
  |  Branch (732:9): [True: 0, False: 1.42k]
  ------------------
  733|      0|        return NULL;
  734|       |
  735|       |    // fill font request
  736|  1.42k|    req.slant   = italic;
  737|  1.42k|    req.weight  = bold;
  738|  1.42k|    req.width   = 100;
  739|       |
  740|       |    // Match font family name against font list
  741|  1.42k|    unsigned score_min = UINT_MAX;
  742|  2.65k|    for (int i = 0; i < meta.n_fullname; i++) {
  ------------------
  |  Branch (742:21): [True: 1.42k, False: 1.22k]
  ------------------
  743|  1.42k|        const char *fullname = meta.fullnames[i];
  744|       |
  745|  32.7k|        for (int x = 0; x < priv->n_font; x++) {
  ------------------
  |  Branch (745:25): [True: 31.3k, False: 1.42k]
  ------------------
  746|  31.3k|            ASS_FontInfo *font = &priv->font_infos[x];
  747|  31.3k|            unsigned score = UINT_MAX;
  748|       |
  749|  31.3k|            if (matches_family_name(font, fullname, match_extended_family)) {
  ------------------
  |  Branch (749:17): [True: 204, False: 31.1k]
  ------------------
  750|       |                // If there's a family match, compare font attributes
  751|       |                // to determine best match in that particular family
  752|    204|                score = font_attributes_similarity(font, &req);
  753|    204|                *name_match = true;
  754|  31.1k|            } else if (matches_full_or_postscript_name(font, fullname)) {
  ------------------
  |  Branch (754:24): [True: 0, False: 31.1k]
  ------------------
  755|       |                // If we don't have any match, compare fullnames against request
  756|       |                // if there is a match now, assign lowest score possible. This means
  757|       |                // the font should be chosen instantly, without further search.
  758|      0|                score = 0;
  759|      0|                *name_match = true;
  760|      0|            }
  761|       |
  762|       |            // Consider updating idx if score is better than current minimum
  763|  31.3k|            if (score < score_min) {
  ------------------
  |  Branch (763:17): [True: 203, False: 31.1k]
  ------------------
  764|       |                // Check if the font has the requested glyph.
  765|       |                // We are doing this here, for every font face, because
  766|       |                // coverage might differ between the variants of a font
  767|       |                // family. In practice, it is common that the regular
  768|       |                // style has the best coverage while bold/italic/etc
  769|       |                // variants cover less (e.g. FreeSans family).
  770|       |                // We want to be able to match even if the closest variant
  771|       |                // does not have the requested glyph, but another member
  772|       |                // of the family has the glyph.
  773|    203|                if (!check_glyph(font, code))
  ------------------
  |  Branch (773:21): [True: 0, False: 203]
  ------------------
  774|      0|                    continue;
  775|       |
  776|    203|                score_min = score;
  777|    203|                selected = font;
  778|    203|            }
  779|       |
  780|       |            // Lowest possible score instantly matches; this is typical
  781|       |            // for fullname matches, but can also occur with family matches.
  782|  31.3k|            if (score == 0)
  ------------------
  |  Branch (782:17): [True: 3, False: 31.3k]
  ------------------
  783|      3|                break;
  784|  31.3k|        }
  785|       |
  786|       |        // The list of names is sorted by priority. If we matched anything,
  787|       |        // we can and should stop.
  788|  1.42k|        if (selected != NULL)
  ------------------
  |  Branch (788:13): [True: 202, False: 1.22k]
  ------------------
  789|    202|            break;
  790|  1.42k|    }
  791|       |
  792|       |    // found anything?
  793|  1.42k|    char *result = NULL;
  794|  1.42k|    if (selected) {
  ------------------
  |  Branch (794:9): [True: 202, False: 1.22k]
  ------------------
  795|    202|        ASS_FontProvider *provider = selected->provider;
  796|       |
  797|       |        // successfully matched, set up return values
  798|    202|        *postscript_name = selected->postscript_name;
  799|    202|        *uid   = selected->uid;
  800|       |
  801|       |        // use lazy evaluation for index if applicable
  802|    202|        if (provider->funcs.get_font_index) {
  ------------------
  |  Branch (802:13): [True: 0, False: 202]
  ------------------
  803|      0|            *index = provider->funcs.get_font_index(selected->priv);
  804|      0|        } else
  805|    202|            *index = selected->index;
  806|       |
  807|       |        // set up memory stream if there is no path
  808|    202|        if (selected->path == NULL) {
  ------------------
  |  Branch (808:13): [True: 0, False: 202]
  ------------------
  809|      0|            stream->func = provider->funcs.get_data;
  810|      0|            stream->priv = selected->priv;
  811|       |            // Prefer PostScript name because it is unique. This is only
  812|       |            // used for display purposes so it doesn't matter that much,
  813|       |            // though.
  814|      0|            if (selected->postscript_name)
  ------------------
  |  Branch (814:17): [True: 0, False: 0]
  ------------------
  815|      0|                result = selected->postscript_name;
  816|      0|            else
  817|      0|                result = selected->families[0];
  818|      0|        } else
  819|    202|            result = selected->path;
  820|       |
  821|    202|    }
  822|       |
  823|  1.42k|    return result;
  824|  1.42k|}
ass_fontselect.c:matches_family_name:
  626|  31.3k|{
  627|  75.3k|    for (int i = 0; i < f->n_family; i++) {
  ------------------
  |  Branch (627:21): [True: 44.1k, False: 31.1k]
  ------------------
  628|  44.1k|        if (ass_strcasecmp(f->families[i], family) == 0)
  ------------------
  |  Branch (628:13): [True: 204, False: 43.9k]
  ------------------
  629|    204|            return true;
  630|  44.1k|    }
  631|  31.1k|    if (match_extended_family && f->extended_family) {
  ------------------
  |  Branch (631:9): [True: 4.18k, False: 26.9k]
  |  Branch (631:34): [True: 0, False: 4.18k]
  ------------------
  632|      0|        if (ass_strcasecmp(f->extended_family, family) == 0)
  ------------------
  |  Branch (632:13): [True: 0, False: 0]
  ------------------
  633|      0|            return true;
  634|      0|    }
  635|  31.1k|    return false;
  636|  31.1k|}
ass_fontselect.c:font_attributes_similarity:
  677|    204|{
  678|    204|    unsigned similarity = 0;
  679|    204|    similarity += ABS(a->weight - req->weight);
  ------------------
  |  |   50|    204|#define ABS(x) ((x) < 0 ? -(x) : (x))
  |  |  ------------------
  |  |  |  Branch (50:17): [True: 64, False: 140]
  |  |  ------------------
  ------------------
  680|    204|    similarity += ABS(a->slant - req->slant);
  ------------------
  |  |   50|    204|#define ABS(x) ((x) < 0 ? -(x) : (x))
  |  |  ------------------
  |  |  |  Branch (50:17): [True: 0, False: 204]
  |  |  ------------------
  ------------------
  681|    204|    similarity += ABS(a->width - req->width);
  ------------------
  |  |   50|    204|#define ABS(x) ((x) < 0 ? -(x) : (x))
  |  |  ------------------
  |  |  |  Branch (50:17): [True: 0, False: 204]
  |  |  ------------------
  ------------------
  682|       |
  683|    204|    return similarity;
  684|    204|}
ass_fontselect.c:matches_full_or_postscript_name:
  644|  31.1k|{
  645|  31.1k|    bool matches_fullname = false;
  646|  31.1k|    bool matches_postscript_name = false;
  647|       |
  648|  62.3k|    for (int i = 0; i < f->n_fullname; i++) {
  ------------------
  |  Branch (648:21): [True: 31.1k, False: 31.1k]
  ------------------
  649|  31.1k|        if (ass_strcasecmp(f->fullnames[i], fullname) == 0) {
  ------------------
  |  Branch (649:13): [True: 0, False: 31.1k]
  ------------------
  650|      0|            matches_fullname = true;
  651|      0|            break;
  652|      0|        }
  653|  31.1k|    }
  654|       |
  655|  31.1k|    if (f->postscript_name != NULL &&
  ------------------
  |  Branch (655:9): [True: 31.1k, False: 0]
  ------------------
  656|  31.1k|        ass_strcasecmp(f->postscript_name, fullname) == 0)
  ------------------
  |  Branch (656:9): [True: 0, False: 31.1k]
  ------------------
  657|      0|        matches_postscript_name = true;
  658|       |
  659|  31.1k|    if (matches_fullname == matches_postscript_name)
  ------------------
  |  Branch (659:9): [True: 31.1k, False: 0]
  ------------------
  660|  31.1k|        return matches_fullname;
  661|       |
  662|      0|    if (check_postscript(f))
  ------------------
  |  Branch (662:9): [True: 0, False: 0]
  ------------------
  663|      0|        return matches_postscript_name;
  664|      0|    else
  665|      0|        return matches_fullname;
  666|      0|}
ass_fontselect.c:check_glyph:
  714|    203|{
  715|    203|    ASS_FontProvider *provider = fi->provider;
  716|    203|    assert(provider && provider->funcs.check_glyph);
  717|       |
  718|    203|    return provider->funcs.check_glyph(fi->priv, code);
  719|    203|}
ass_fontselect.c:ass_embedded_fonts_add_provider:
 1032|     33|{
 1033|     33|    ASS_FontProvider *priv = ass_font_provider_new(selector, &ft_funcs, NULL);
 1034|     33|    if (priv == NULL)
  ------------------
  |  Branch (1034:9): [True: 0, False: 33]
  ------------------
 1035|      0|        return NULL;
 1036|       |
 1037|     33|    ASS_Library *lib = selector->library;
 1038|       |
 1039|     33|    if (lib->fonts_dir && lib->fonts_dir[0]) {
  ------------------
  |  Branch (1039:9): [True: 0, False: 33]
  |  Branch (1039:27): [True: 0, False: 0]
  ------------------
 1040|      0|        load_fonts_from_dir(lib, lib->fonts_dir);
 1041|      0|    }
 1042|       |
 1043|     33|    for (size_t i = 0; i < lib->num_fontdata; i++)
  ------------------
  |  Branch (1043:24): [True: 0, False: 33]
  ------------------
 1044|      0|        process_fontdata(priv, i);
 1045|     33|    *num_emfonts = lib->num_fontdata;
 1046|       |
 1047|     33|    return priv;
 1048|     33|}

ass_library_init:
   46|     33|{
   47|     33|    ASS_Library* lib = calloc(1, sizeof(*lib));
   48|     33|    if (lib)
  ------------------
  |  Branch (48:9): [True: 33, False: 0]
  ------------------
   49|     33|        lib->msg_callback = ass_msg_handler;
   50|       |    #ifdef CONFIG_UNIBREAK
   51|       |    // libunibreak works without, but its docs suggest this improves performance
   52|       |    init_linebreak();
   53|       |    #endif
   54|     33|    return lib;
   55|     33|}
ass_library_done:
   58|     33|{
   59|     33|    if (priv) {
  ------------------
  |  Branch (59:9): [True: 33, False: 0]
  ------------------
   60|     33|        ass_set_fonts_dir(priv, NULL);
   61|     33|        ass_set_style_overrides(priv, NULL);
   62|     33|        ass_clear_fonts(priv);
   63|     33|        free(priv);
   64|     33|    }
   65|     33|}
ass_set_fonts_dir:
   68|     33|{
   69|     33|    free(priv->fonts_dir);
   70|       |
   71|     33|    priv->fonts_dir = fonts_dir ? strdup(fonts_dir) : 0;
  ------------------
  |  Branch (71:23): [True: 0, False: 33]
  ------------------
   72|     33|}
ass_set_style_overrides:
   80|     33|{
   81|     33|    char **p;
   82|     33|    char **q;
   83|     33|    int cnt;
   84|       |
   85|     33|    if (priv->style_overrides) {
  ------------------
  |  Branch (85:9): [True: 0, False: 33]
  ------------------
   86|      0|        for (p = priv->style_overrides; *p; ++p)
  ------------------
  |  Branch (86:41): [True: 0, False: 0]
  ------------------
   87|      0|            free(*p);
   88|      0|    }
   89|     33|    free(priv->style_overrides);
   90|     33|    priv->style_overrides = NULL;
   91|       |
   92|     33|    if (!list)
  ------------------
  |  Branch (92:9): [True: 33, False: 0]
  ------------------
   93|     33|        return;
   94|       |
   95|      0|    for (p = list, cnt = 0; *p; ++p, ++cnt) {
  ------------------
  |  Branch (95:29): [True: 0, False: 0]
  ------------------
   96|      0|    }
   97|       |
   98|      0|    priv->style_overrides = calloc(cnt + 1, sizeof(char *));
   99|      0|    if (!priv->style_overrides)
  ------------------
  |  Branch (99:9): [True: 0, False: 0]
  ------------------
  100|      0|        return;
  101|      0|    for (p = list, q = priv->style_overrides; *p; ++p, ++q)
  ------------------
  |  Branch (101:47): [True: 0, False: 0]
  ------------------
  102|      0|        *q = strdup(*p);
  103|      0|}
ass_clear_fonts:
  133|     33|{
  134|     33|    for (size_t i = 0; i < priv->num_fontdata; i++) {
  ------------------
  |  Branch (134:24): [True: 0, False: 33]
  ------------------
  135|      0|        free(priv->fontdata[i].name);
  136|      0|        free(priv->fontdata[i].data);
  137|      0|    }
  138|     33|    free(priv->fontdata);
  139|     33|    priv->fontdata = NULL;
  140|     33|    priv->num_fontdata = 0;
  141|     33|}
ass_set_message_cb:
  154|     33|{
  155|     33|    if (msg_cb) {
  ------------------
  |  Branch (155:9): [True: 33, False: 0]
  ------------------
  156|     33|        priv->msg_callback = msg_cb;
  157|     33|        priv->msg_callback_data = data;
  158|     33|    }
  159|     33|}

ass_outline_clear:
   32|  2.27k|{
   33|  2.27k|    outline->points = NULL;
   34|  2.27k|    outline->segments = NULL;
   35|       |
   36|  2.27k|    outline->n_points = outline->max_points = 0;
   37|  2.27k|    outline->n_segments = outline->max_segments = 0;
   38|  2.27k|}
ass_outline_alloc:
   44|  1.45k|{
   45|  1.45k|    assert(max_points && max_segments);
   46|  1.45k|    if (max_points > SIZE_MAX / sizeof(ASS_Vector)) {
  ------------------
  |  Branch (46:9): [True: 0, False: 1.45k]
  ------------------
   47|      0|        ass_outline_clear(outline);
   48|      0|        return false;
   49|      0|    }
   50|  1.45k|    outline->points = malloc(sizeof(ASS_Vector) * max_points);
   51|  1.45k|    outline->segments = malloc(max_segments);
   52|  1.45k|    if (!outline->points || !outline->segments) {
  ------------------
  |  Branch (52:9): [True: 0, False: 1.45k]
  |  Branch (52:29): [True: 0, False: 1.45k]
  ------------------
   53|      0|        ass_outline_free(outline);
   54|      0|        return false;
   55|      0|    }
   56|       |
   57|  1.45k|    outline->max_points = max_points;
   58|  1.45k|    outline->max_segments = max_segments;
   59|  1.45k|    outline->n_points = outline->n_segments = 0;
   60|  1.45k|    return true;
   61|  1.45k|}
ass_outline_free:
   69|  1.95k|{
   70|  1.95k|    if (!outline)
  ------------------
  |  Branch (70:9): [True: 0, False: 1.95k]
  ------------------
   71|      0|        return;
   72|       |
   73|  1.95k|    free(outline->points);
   74|  1.95k|    free(outline->segments);
   75|       |
   76|  1.95k|    ass_outline_clear(outline);
   77|  1.95k|}
ass_outline_convert:
   90|    172|{
   91|    172|    enum Status {
   92|    172|        S_ON, S_Q, S_C1, S_C2
   93|    172|    };
   94|       |
   95|    454|    for (int i = 0, j = 0; i < source->n_contours; i++) {
  ------------------
  |  Branch (95:28): [True: 282, False: 172]
  ------------------
   96|    282|        ASS_Vector pt;
   97|    282|        int skip_last = 0;
   98|    282|        enum Status st;
   99|    282|        char seg;
  100|       |
  101|    282|        int last = source->contours[i];
  102|    282|        if (j > last || last >= source->n_points)
  ------------------
  |  Branch (102:13): [True: 0, False: 282]
  |  Branch (102:25): [True: 0, False: 282]
  ------------------
  103|      0|            return false;
  104|       |
  105|       |        // skip degenerate 2-point contours from broken fonts
  106|    282|        if (last - j < 2) {
  ------------------
  |  Branch (106:13): [True: 0, False: 282]
  ------------------
  107|      0|            j = last + 1;
  108|      0|            continue;
  109|      0|        }
  110|       |
  111|    282|        if (!valid_point(source->points + j))
  ------------------
  |  Branch (111:13): [True: 0, False: 282]
  ------------------
  112|      0|            return false;
  113|    282|        switch (FT_CURVE_TAG(source->tags[j])) {
  ------------------
  |  |  452|    282|#define FT_CURVE_TAG( flag )  ( flag & 0x03 )
  ------------------
  114|    237|        case FT_CURVE_TAG_ON:
  ------------------
  |  |  455|    237|#define FT_CURVE_TAG_ON            0x01
  ------------------
  |  Branch (114:9): [True: 237, False: 45]
  ------------------
  115|    237|            st = S_ON;
  116|    237|            break;
  117|       |
  118|     45|        case FT_CURVE_TAG_CONIC:
  ------------------
  |  |  456|     45|#define FT_CURVE_TAG_CONIC         0x00
  ------------------
  |  Branch (118:9): [True: 45, False: 237]
  ------------------
  119|     45|            if (!valid_point(source->points + last))
  ------------------
  |  Branch (119:17): [True: 0, False: 45]
  ------------------
  120|      0|                return false;
  121|     45|            pt.x =  source->points[last].x;
  122|     45|            pt.y = -source->points[last].y;
  123|     45|            switch (FT_CURVE_TAG(source->tags[last])) {
  ------------------
  |  |  452|     45|#define FT_CURVE_TAG( flag )  ( flag & 0x03 )
  ------------------
  124|     28|            case FT_CURVE_TAG_ON:
  ------------------
  |  |  455|     28|#define FT_CURVE_TAG_ON            0x01
  ------------------
  |  Branch (124:13): [True: 28, False: 17]
  ------------------
  125|     28|                skip_last = 1;
  126|     28|                last--;
  127|     28|                break;
  128|       |
  129|     17|            case FT_CURVE_TAG_CONIC:
  ------------------
  |  |  456|     17|#define FT_CURVE_TAG_CONIC         0x00
  ------------------
  |  Branch (129:13): [True: 17, False: 28]
  ------------------
  130|     17|                pt.x = (pt.x + source->points[j].x) >> 1;
  131|     17|                pt.y = (pt.y - source->points[j].y) >> 1;
  132|     17|                break;
  133|       |
  134|      0|            default:
  ------------------
  |  Branch (134:13): [True: 0, False: 45]
  ------------------
  135|      0|                return false;
  136|     45|            }
  137|     45|            assert(outline->n_points < outline->max_points);
  138|     45|            outline->points[outline->n_points++] = pt;
  139|     45|            st = S_Q;
  140|     45|            break;
  141|       |
  142|      0|        default:
  ------------------
  |  Branch (142:9): [True: 0, False: 282]
  ------------------
  143|      0|            return false;
  144|    282|        }
  145|    282|        pt.x =  source->points[j].x;
  146|    282|        pt.y = -source->points[j].y;
  147|    282|        assert(outline->n_points < outline->max_points);
  148|    282|        outline->points[outline->n_points++] = pt;
  149|       |
  150|  5.21k|        for (j++; j <= last; j++) {
  ------------------
  |  Branch (150:19): [True: 4.93k, False: 282]
  ------------------
  151|  4.93k|            if (!valid_point(source->points + j))
  ------------------
  |  Branch (151:17): [True: 0, False: 4.93k]
  ------------------
  152|      0|                return false;
  153|  4.93k|            switch (FT_CURVE_TAG(source->tags[j])) {
  ------------------
  |  |  452|  4.93k|#define FT_CURVE_TAG( flag )  ( flag & 0x03 )
  ------------------
  154|  2.97k|            case FT_CURVE_TAG_ON:
  ------------------
  |  |  455|  2.97k|#define FT_CURVE_TAG_ON            0x01
  ------------------
  |  Branch (154:13): [True: 2.97k, False: 1.95k]
  ------------------
  155|  2.97k|                switch (st) {
  156|  1.47k|                case S_ON:
  ------------------
  |  Branch (156:17): [True: 1.47k, False: 1.50k]
  ------------------
  157|  1.47k|                    seg = OUTLINE_LINE_SEGMENT;
  158|  1.47k|                    break;
  159|       |
  160|  1.50k|                case S_Q:
  ------------------
  |  Branch (160:17): [True: 1.50k, False: 1.47k]
  ------------------
  161|  1.50k|                    seg = OUTLINE_QUADRATIC_SPLINE;
  162|  1.50k|                    break;
  163|       |
  164|      0|                case S_C2:
  ------------------
  |  Branch (164:17): [True: 0, False: 2.97k]
  ------------------
  165|      0|                    seg = OUTLINE_CUBIC_SPLINE;
  166|      0|                    break;
  167|       |
  168|      0|                default:
  ------------------
  |  Branch (168:17): [True: 0, False: 2.97k]
  ------------------
  169|      0|                    return false;
  170|  2.97k|                }
  171|  2.97k|                assert(outline->n_segments < outline->max_segments);
  172|  2.97k|                outline->segments[outline->n_segments++] = seg;
  173|  2.97k|                st = S_ON;
  174|  2.97k|                break;
  175|       |
  176|  1.95k|            case FT_CURVE_TAG_CONIC:
  ------------------
  |  |  456|  1.95k|#define FT_CURVE_TAG_CONIC         0x00
  ------------------
  |  Branch (176:13): [True: 1.95k, False: 2.97k]
  ------------------
  177|  1.95k|                switch (st) {
  178|  1.59k|                case S_ON:
  ------------------
  |  Branch (178:17): [True: 1.59k, False: 353]
  ------------------
  179|  1.59k|                    st = S_Q;
  180|  1.59k|                    break;
  181|       |
  182|    353|                case S_Q:
  ------------------
  |  Branch (182:17): [True: 353, False: 1.59k]
  ------------------
  183|    353|                    assert(outline->n_segments < outline->max_segments);
  184|    353|                    outline->segments[outline->n_segments++] = OUTLINE_QUADRATIC_SPLINE;
  185|    353|                    pt.x = (pt.x + source->points[j].x) >> 1;
  186|    353|                    pt.y = (pt.y - source->points[j].y) >> 1;
  187|    353|                    assert(outline->n_points < outline->max_points);
  188|    353|                    outline->points[outline->n_points++] = pt;
  189|    353|                    break;
  190|       |
  191|      0|                default:
  ------------------
  |  Branch (191:17): [True: 0, False: 1.95k]
  ------------------
  192|      0|                    return false;
  193|  1.95k|                }
  194|  1.95k|                break;
  195|       |
  196|  1.95k|            case FT_CURVE_TAG_CUBIC:
  ------------------
  |  |  457|      0|#define FT_CURVE_TAG_CUBIC         0x02
  ------------------
  |  Branch (196:13): [True: 0, False: 4.93k]
  ------------------
  197|      0|                switch (st) {
  198|      0|                case S_ON:
  ------------------
  |  Branch (198:17): [True: 0, False: 0]
  ------------------
  199|      0|                    st = S_C1;
  200|      0|                    break;
  201|       |
  202|      0|                case S_C1:
  ------------------
  |  Branch (202:17): [True: 0, False: 0]
  ------------------
  203|      0|                    st = S_C2;
  204|      0|                    break;
  205|       |
  206|      0|                default:
  ------------------
  |  Branch (206:17): [True: 0, False: 0]
  ------------------
  207|      0|                    return false;
  208|      0|                }
  209|      0|                break;
  210|       |
  211|      0|            default:
  ------------------
  |  Branch (211:13): [True: 0, False: 4.93k]
  ------------------
  212|      0|                return false;
  213|  4.93k|            }
  214|  4.93k|            pt.x =  source->points[j].x;
  215|  4.93k|            pt.y = -source->points[j].y;
  216|  4.93k|            assert(outline->n_points < outline->max_points);
  217|  4.93k|            outline->points[outline->n_points++] = pt;
  218|  4.93k|        }
  219|       |
  220|    282|        switch (st) {
  221|    145|        case S_ON:
  ------------------
  |  Branch (221:9): [True: 145, False: 137]
  ------------------
  222|    145|            seg = OUTLINE_LINE_SEGMENT | OUTLINE_CONTOUR_END;
  223|    145|            break;
  224|       |
  225|    137|        case S_Q:
  ------------------
  |  Branch (225:9): [True: 137, False: 145]
  ------------------
  226|    137|            seg = OUTLINE_QUADRATIC_SPLINE | OUTLINE_CONTOUR_END;
  227|    137|            break;
  228|       |
  229|      0|        case S_C2:
  ------------------
  |  Branch (229:9): [True: 0, False: 282]
  ------------------
  230|      0|            seg = OUTLINE_CUBIC_SPLINE | OUTLINE_CONTOUR_END;
  231|      0|            break;
  232|       |
  233|      0|        default:
  ------------------
  |  Branch (233:9): [True: 0, False: 282]
  ------------------
  234|      0|            return false;
  235|    282|        }
  236|    282|        assert(outline->n_segments < outline->max_segments);
  237|    282|        outline->segments[outline->n_segments++] = seg;
  238|    282|        j += skip_last;
  239|    282|    }
  240|    172|    return true;
  241|    172|}
ass_outline_add_point:
  280|  13.5k|{
  281|  13.5k|    assert(outline->max_points);
  282|  13.5k|    if (abs(pt.x) > OUTLINE_MAX || abs(pt.y) > OUTLINE_MAX)
  ------------------
  |  |   87|  27.1k|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
                  if (abs(pt.x) > OUTLINE_MAX || abs(pt.y) > OUTLINE_MAX)
  ------------------
  |  |   87|  13.5k|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  |  Branch (282:9): [True: 0, False: 13.5k]
  |  Branch (282:36): [True: 0, False: 13.5k]
  ------------------
  283|      0|        return false;
  284|       |
  285|  13.5k|    if (outline->n_points >= outline->max_points) {
  ------------------
  |  Branch (285:9): [True: 121, False: 13.4k]
  ------------------
  286|    121|        size_t new_size = 2 * outline->max_points;
  287|    121|        if (!ASS_REALLOC_ARRAY(outline->points, new_size))
  ------------------
  |  |   91|    121|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (287:13): [True: 0, False: 121]
  ------------------
  288|      0|            return false;
  289|    121|        outline->max_points = new_size;
  290|    121|    }
  291|  13.5k|    outline->points[outline->n_points] = pt;
  292|  13.5k|    outline->n_points++;
  293|       |
  294|  13.5k|    return !segment || ass_outline_add_segment(outline, segment);
  ------------------
  |  Branch (294:12): [True: 3.92k, False: 9.67k]
  |  Branch (294:24): [True: 9.67k, False: 0]
  ------------------
  295|  13.5k|}
ass_outline_add_segment:
  302|  9.67k|{
  303|  9.67k|    assert(outline->max_segments);
  304|  9.67k|    if (outline->n_segments >= outline->max_segments) {
  ------------------
  |  Branch (304:9): [True: 119, False: 9.55k]
  ------------------
  305|    119|        size_t new_size = 2 * outline->max_segments;
  306|    119|        if (!ASS_REALLOC_ARRAY(outline->segments, new_size))
  ------------------
  |  |   91|    119|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (306:13): [True: 0, False: 119]
  ------------------
  307|      0|            return false;
  308|    119|        outline->max_segments = new_size;
  309|    119|    }
  310|  9.67k|    outline->segments[outline->n_segments] = segment;
  311|  9.67k|    outline->n_segments++;
  312|  9.67k|    return true;
  313|  9.67k|}
ass_outline_close_contour:
  319|    408|{
  320|    408|    assert(outline->n_segments);
  321|    408|    assert(!(outline->segments[outline->n_segments - 1] & ~OUTLINE_COUNT_MASK));
  322|    408|    outline->segments[outline->n_segments - 1] |= OUTLINE_CONTOUR_END;
  323|    408|}
ass_outline_scale_pow2:
  350|    127|{
  351|    127|    if (!source || !source->n_points) {
  ------------------
  |  Branch (351:9): [True: 0, False: 127]
  |  Branch (351:20): [True: 0, False: 127]
  ------------------
  352|      0|        ass_outline_clear(outline);
  353|      0|        return true;
  354|      0|    }
  355|       |
  356|    127|    int32_t lim_x = OUTLINE_MAX;
  ------------------
  |  |   87|    127|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  357|    127|    if (scale_ord_x > 0)
  ------------------
  |  Branch (357:9): [True: 0, False: 127]
  ------------------
  358|      0|        lim_x = scale_ord_x < 32 ? lim_x >> scale_ord_x : 0;
  ------------------
  |  Branch (358:17): [True: 0, False: 0]
  ------------------
  359|    127|    else
  360|    127|        scale_ord_x = FFMAX(scale_ord_x, -32);
  ------------------
  |  |   46|    127|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 127, False: 0]
  |  |  ------------------
  ------------------
  361|       |
  362|    127|    int32_t lim_y = OUTLINE_MAX;
  ------------------
  |  |   87|    127|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  363|    127|    if (scale_ord_y > 0)
  ------------------
  |  Branch (363:9): [True: 0, False: 127]
  ------------------
  364|      0|        lim_y = scale_ord_y < 32 ? lim_y >> scale_ord_y : 0;
  ------------------
  |  Branch (364:17): [True: 0, False: 0]
  ------------------
  365|    127|    else
  366|    127|        scale_ord_y = FFMAX(scale_ord_y, -32);
  ------------------
  |  |   46|    127|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 127, False: 0]
  |  |  ------------------
  ------------------
  367|       |
  368|    127|    if (!lim_x || !lim_y) {
  ------------------
  |  Branch (368:9): [True: 0, False: 127]
  |  Branch (368:19): [True: 0, False: 127]
  ------------------
  369|      0|        ass_outline_clear(outline);
  370|      0|        return false;
  371|      0|    }
  372|       |
  373|    127|    if (!ass_outline_alloc(outline, source->n_points, source->n_segments))
  ------------------
  |  Branch (373:9): [True: 0, False: 127]
  ------------------
  374|      0|        return false;
  375|       |
  376|    127|    int sx = scale_ord_x + 32;
  377|    127|    int sy = scale_ord_y + 32;
  378|    127|    const ASS_Vector *pt = source->points;
  379|  4.15k|    for (size_t i = 0; i < source->n_points; i++) {
  ------------------
  |  Branch (379:24): [True: 4.02k, False: 127]
  ------------------
  380|  4.02k|        if (abs(pt[i].x) > lim_x || abs(pt[i].y) > lim_y) {
  ------------------
  |  Branch (380:13): [True: 0, False: 4.02k]
  |  Branch (380:37): [True: 0, False: 4.02k]
  ------------------
  381|      0|            ass_outline_free(outline);
  382|      0|            return false;
  383|      0|        }
  384|       |        // that's equivalent to pt[i].x << scale_ord_x,
  385|       |        // but works even for negative coordinate and/or shift amount
  386|  4.02k|        outline->points[i].x = pt[i].x * ((int64_t) 1 << sx) >> 32;
  387|  4.02k|        outline->points[i].y = pt[i].y * ((int64_t) 1 << sy) >> 32;
  388|  4.02k|    }
  389|    127|    memcpy(outline->segments, source->segments, source->n_segments);
  390|    127|    outline->n_points = source->n_points;
  391|    127|    outline->n_segments = source->n_segments;
  392|    127|    return true;
  393|    127|}
ass_outline_transform_2d:
  402|  1.21k|{
  403|  1.21k|    if (!source || !source->n_points) {
  ------------------
  |  Branch (403:9): [True: 0, False: 1.21k]
  |  Branch (403:20): [True: 315, False: 897]
  ------------------
  404|    315|        ass_outline_clear(outline);
  405|    315|        return true;
  406|    315|    }
  407|       |
  408|    897|    if (!ass_outline_alloc(outline, source->n_points, source->n_segments))
  ------------------
  |  Branch (408:9): [True: 0, False: 897]
  ------------------
  409|      0|        return false;
  410|       |
  411|    897|    const ASS_Vector *pt = source->points;
  412|  40.2k|    for (size_t i = 0; i < source->n_points; i++) {
  ------------------
  |  Branch (412:24): [True: 39.3k, False: 897]
  ------------------
  413|  39.3k|        double v[2];
  414|   118k|        for (int k = 0; k < 2; k++)
  ------------------
  |  Branch (414:25): [True: 78.7k, False: 39.3k]
  ------------------
  415|  78.7k|            v[k] = m[k][0] * pt[i].x + m[k][1] * pt[i].y + m[k][2];
  416|       |
  417|  39.3k|        if (!(fabs(v[0]) < OUTLINE_MAX && fabs(v[1]) < OUTLINE_MAX)) {
  ------------------
  |  |   87|  78.7k|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
                      if (!(fabs(v[0]) < OUTLINE_MAX && fabs(v[1]) < OUTLINE_MAX)) {
  ------------------
  |  |   87|  39.3k|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  |  Branch (417:15): [True: 39.3k, False: 0]
  |  Branch (417:43): [True: 39.3k, False: 0]
  ------------------
  418|      0|            ass_outline_free(outline);
  419|      0|            return false;
  420|      0|        }
  421|  39.3k|        outline->points[i].x = lrint(v[0]);
  422|  39.3k|        outline->points[i].y = lrint(v[1]);
  423|  39.3k|    }
  424|    897|    memcpy(outline->segments, source->segments, source->n_segments);
  425|    897|    outline->n_points = source->n_points;
  426|    897|    outline->n_segments = source->n_segments;
  427|    897|    return true;
  428|    897|}
ass_outline_update_cbox:
  490|    610|{
  491|  19.8k|    for (size_t i = 0; i < outline->n_points; i++)
  ------------------
  |  Branch (491:24): [True: 19.2k, False: 610]
  ------------------
  492|  19.2k|        rectangle_update(cbox,
  493|  19.2k|                         outline->points[i].x, outline->points[i].y,
  494|  19.2k|                         outline->points[i].x, outline->points[i].y);
  495|    610|}
ass_outline_stroke:
 1490|    127|{
 1491|    127|    ass_outline_alloc(result,  2 * path->n_points, 2 * path->n_segments);
 1492|    127|    ass_outline_alloc(result1, 2 * path->n_points, 2 * path->n_segments);
 1493|    127|    if (!result->max_points || !result1->max_points)
  ------------------
  |  Branch (1493:9): [True: 0, False: 127]
  |  Branch (1493:32): [True: 0, False: 127]
  ------------------
 1494|      0|        return false;
 1495|       |
 1496|    127|    const int dir = 3;
 1497|    127|    int rad = FFMAX(xbord, ybord);
  ------------------
  |  |   46|    127|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 8, False: 119]
  |  |  ------------------
  ------------------
 1498|    127|    assert(rad >= eps && rad <= OUTLINE_MAX);
 1499|       |
 1500|    127|    StrokerState str;
 1501|    127|    str.result[0] = result;
 1502|    127|    str.result[1] = result1;
 1503|    127|    str.contour_first[0] = 0;
 1504|    127|    str.contour_first[1] = 0;
 1505|    127|    str.xbord = xbord;
 1506|    127|    str.ybord = ybord;
 1507|    127|    str.xscale = 1.0 / FFMAX(eps, xbord);
  ------------------
  |  |   46|    127|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 127]
  |  |  ------------------
  ------------------
 1508|    127|    str.yscale = 1.0 / FFMAX(eps, ybord);
  ------------------
  |  |   46|    127|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 127]
  |  |  ------------------
  ------------------
 1509|    127|    str.eps = eps;
 1510|       |
 1511|    127|    str.contour_start = true;
 1512|    127|    double rel_err = (double) eps / rad;
 1513|    127|    str.merge_cos = 1 - rel_err;
 1514|    127|    double e = sqrt(2 * rel_err);
 1515|    127|    str.split_cos = 1 + 8 * rel_err - 4 * (1 + rel_err) * e;
 1516|    127|    str.min_len = rel_err / 4;
 1517|    127|    str.err_q = 8 * (1 + rel_err) * (1 + rel_err);
 1518|    127|    str.err_c = 390 * rel_err * rel_err;
 1519|    127|    str.err_a = e;
 1520|       |
 1521|    127|#ifndef NDEBUG
 1522|  4.15k|    for (size_t i = 0; i < path->n_points; i++)
  ------------------
  |  Branch (1522:24): [True: 4.02k, False: 127]
  ------------------
 1523|  4.02k|        assert(abs(path->points[i].x) <= OUTLINE_MAX && abs(path->points[i].y) <= OUTLINE_MAX);
 1524|    127|#endif
 1525|       |
 1526|    127|    ASS_Vector *start = path->points, *cur = start;
 1527|  2.66k|    for (size_t i = 0; i < path->n_segments; i++) {
  ------------------
  |  Branch (1527:24): [True: 2.53k, False: 127]
  ------------------
 1528|  2.53k|        if (start == cur)
  ------------------
  |  Branch (1528:13): [True: 204, False: 2.33k]
  ------------------
 1529|    204|            str.last_point = *start;
 1530|       |
 1531|  2.53k|        int n = path->segments[i] & OUTLINE_COUNT_MASK;
 1532|  2.53k|        cur += n;
 1533|       |
 1534|  2.53k|        ASS_Vector *end = cur;
 1535|  2.53k|        if (path->segments[i] & OUTLINE_CONTOUR_END) {
  ------------------
  |  Branch (1535:13): [True: 204, False: 2.33k]
  ------------------
 1536|    204|            end = start;
 1537|    204|            start = cur;
 1538|    204|        }
 1539|       |
 1540|  2.53k|        switch (n) {
 1541|  1.04k|        case OUTLINE_LINE_SEGMENT:
  ------------------
  |  Branch (1541:9): [True: 1.04k, False: 1.49k]
  ------------------
 1542|  1.04k|            if (!add_line(&str, *end, dir))
  ------------------
  |  Branch (1542:17): [True: 0, False: 1.04k]
  ------------------
 1543|      0|                return false;
 1544|  1.04k|            break;
 1545|       |
 1546|  1.49k|        case OUTLINE_QUADRATIC_SPLINE:
  ------------------
  |  Branch (1546:9): [True: 1.49k, False: 1.04k]
  ------------------
 1547|  1.49k|            if (!add_quadratic(&str, cur[-1], *end, dir))
  ------------------
  |  Branch (1547:17): [True: 0, False: 1.49k]
  ------------------
 1548|      0|                return false;
 1549|  1.49k|            break;
 1550|       |
 1551|  1.49k|        case OUTLINE_CUBIC_SPLINE:
  ------------------
  |  Branch (1551:9): [True: 0, False: 2.53k]
  ------------------
 1552|      0|            if (!add_cubic(&str, cur[-2], cur[-1], *end, dir))
  ------------------
  |  Branch (1552:17): [True: 0, False: 0]
  ------------------
 1553|      0|                return false;
 1554|      0|            break;
 1555|       |
 1556|      0|        default:
  ------------------
  |  Branch (1556:9): [True: 0, False: 2.53k]
  ------------------
 1557|      0|            return false;
 1558|  2.53k|        }
 1559|       |
 1560|  2.53k|        if (start == cur && !close_contour(&str, dir))
  ------------------
  |  Branch (1560:13): [True: 204, False: 2.33k]
  |  Branch (1560:29): [True: 0, False: 204]
  ------------------
 1561|      0|            return false;
 1562|  2.53k|    }
 1563|    127|    assert(start == cur && cur == path->points + path->n_points);
 1564|    127|    return true;
 1565|    127|}
ass_outline.c:valid_point:
   81|  5.25k|{
   82|  5.25k|    return labs(pt->x) <= OUTLINE_MAX && labs(pt->y) <= OUTLINE_MAX;
  ------------------
  |  |   87|  10.5k|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
                  return labs(pt->x) <= OUTLINE_MAX && labs(pt->y) <= OUTLINE_MAX;
  ------------------
  |  |   87|  10.5k|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  |  Branch (82:12): [True: 5.25k, False: 0]
  |  Branch (82:42): [True: 5.25k, False: 0]
  ------------------
   83|  5.25k|}
ass_outline.c:add_line:
  835|  1.27k|{
  836|  1.27k|    int32_t dx = pt1.x - str->last_point.x;
  837|  1.27k|    int32_t dy = pt1.y - str->last_point.y;
  838|  1.27k|    if (dx > -str->eps && dx < str->eps && dy > -str->eps && dy < str->eps)
  ------------------
  |  Branch (838:9): [True: 1.00k, False: 269]
  |  Branch (838:27): [True: 709, False: 295]
  |  Branch (838:44): [True: 427, False: 282]
  |  Branch (838:62): [True: 212, False: 215]
  ------------------
  839|    212|        return true;
  840|       |
  841|  1.06k|    ASS_DVector deriv = { dy * str->yscale, -dx * str->xscale };
  842|  1.06k|    double scale = 1 / vec_len(deriv);
  843|  1.06k|    ASS_DVector normal = { deriv.x * scale, deriv.y * scale };
  844|  1.06k|    if (!start_segment(str, str->last_point, normal, dir))
  ------------------
  |  Branch (844:9): [True: 0, False: 1.06k]
  ------------------
  845|      0|        return false;
  846|  1.06k|    if (!emit_first_point(str, str->last_point, OUTLINE_LINE_SEGMENT, dir))
  ------------------
  |  Branch (846:9): [True: 0, False: 1.06k]
  ------------------
  847|      0|        return false;
  848|  1.06k|    str->last_normal = normal;
  849|  1.06k|    str->last_point = pt1;
  850|  1.06k|    return true;
  851|  1.06k|}
ass_outline.c:vec_len:
  603|  4.15k|{
  604|  4.15k|    return sqrt(vec.x * vec.x + vec.y * vec.y);
  605|  4.15k|}
ass_outline.c:start_segment:
  765|  2.73k|{
  766|  2.73k|    if (str->contour_start) {
  ------------------
  |  Branch (766:9): [True: 204, False: 2.52k]
  ------------------
  767|    204|        str->contour_start = false;
  768|    204|        str->first_skip = str->last_skip = 0;
  769|    204|        str->first_normal = str->last_normal = normal;
  770|    204|        str->first_point = pt;
  771|    204|        return true;
  772|    204|    }
  773|       |
  774|  2.52k|    ASS_DVector prev = str->last_normal;
  775|  2.52k|    double c = vec_dot(prev, normal);
  776|  2.52k|    if (c > str->merge_cos) {  // merge without cap
  ------------------
  |  Branch (776:9): [True: 1.43k, False: 1.09k]
  ------------------
  777|  1.43k|        double mul = 1 / (1 + c);
  778|  1.43k|        str->last_normal.x = (str->last_normal.x + normal.x) * mul;
  779|  1.43k|        str->last_normal.y = (str->last_normal.y + normal.y) * mul;
  780|  1.43k|        return true;
  781|  1.43k|    }
  782|  1.09k|    str->last_normal = normal;
  783|       |
  784|       |    // check for negative curvature
  785|  1.09k|    double s = vec_crs(prev, normal);
  786|  1.09k|    int skip_dir = s < 0 ? 1 : 2;
  ------------------
  |  Branch (786:20): [True: 335, False: 758]
  ------------------
  787|  1.09k|    if (dir & skip_dir) {
  ------------------
  |  Branch (787:9): [True: 1.09k, False: 0]
  ------------------
  788|  1.09k|        if (!emit_point(str, pt, prev, OUTLINE_LINE_SEGMENT, ~str->last_skip & skip_dir))
  ------------------
  |  Branch (788:13): [True: 0, False: 1.09k]
  ------------------
  789|      0|            return false;
  790|  1.09k|        ASS_DVector zero_normal = {0, 0};
  791|  1.09k|        if (!emit_point(str, pt, zero_normal, OUTLINE_LINE_SEGMENT, skip_dir))
  ------------------
  |  Branch (791:13): [True: 0, False: 1.09k]
  ------------------
  792|      0|            return false;
  793|  1.09k|    }
  794|  1.09k|    str->last_skip = skip_dir;
  795|       |
  796|  1.09k|    dir &= ~skip_dir;
  797|  1.09k|    return !dir || draw_arc(str, pt, prev, normal, c, dir);
  ------------------
  |  Branch (797:12): [True: 0, False: 1.09k]
  |  Branch (797:20): [True: 1.09k, False: 0]
  ------------------
  798|  1.09k|}
ass_outline.c:vec_dot:
  587|  4.31k|{
  588|  4.31k|    return vec1.x * vec2.x + vec1.y * vec2.y;
  589|  4.31k|}
ass_outline.c:vec_crs:
  595|  2.87k|{
  596|  2.87k|    return vec1.x * vec2.y - vec1.y * vec2.x;
  597|  2.87k|}
ass_outline.c:emit_point:
  619|  13.0k|{
  620|  13.0k|    int32_t dx = (int32_t) (str->xbord * offs.x);
  621|  13.0k|    int32_t dy = (int32_t) (str->ybord * offs.y);
  622|       |
  623|  13.0k|    if (dir & 1) {
  ------------------
  |  Branch (623:9): [True: 7.19k, False: 5.81k]
  ------------------
  624|  7.19k|        ASS_Vector res = { pt.x + dx, pt.y + dy };
  625|  7.19k|        if (!ass_outline_add_point(str->result[0], res, segment))
  ------------------
  |  Branch (625:13): [True: 0, False: 7.19k]
  ------------------
  626|      0|            return false;
  627|  7.19k|    }
  628|  13.0k|    if (dir & 2) {
  ------------------
  |  Branch (628:9): [True: 6.40k, False: 6.60k]
  ------------------
  629|  6.40k|        ASS_Vector res = { pt.x - dx, pt.y - dy };
  630|  6.40k|        if (!ass_outline_add_point(str->result[1], res, segment))
  ------------------
  |  Branch (630:13): [True: 0, False: 6.40k]
  ------------------
  631|      0|            return false;
  632|  6.40k|    }
  633|  13.0k|    return true;
  634|  13.0k|}
ass_outline.c:draw_arc:
  698|  1.09k|{
  699|  1.09k|    enum { max_subdiv = 15 };
  700|  1.09k|    double mul[max_subdiv + 1];
  701|       |
  702|  1.09k|    ASS_DVector center;
  703|  1.09k|    bool small_angle = true;
  704|  1.09k|    if (c < 0) {
  ------------------
  |  Branch (704:9): [True: 156, False: 937]
  ------------------
  705|    156|        double mul = dir & 2 ? -sqrt(0.5) : sqrt(0.5);
  ------------------
  |  Branch (705:22): [True: 105, False: 51]
  ------------------
  706|    156|        mul /= sqrt(1 - c);
  707|    156|        center.x = (normal1.y - normal0.y) * mul;
  708|    156|        center.y = (normal0.x - normal1.x) * mul;
  709|    156|        c = sqrt(FFMAX(0, 0.5 + 0.5 * c));
  ------------------
  |  |   46|    156|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 156]
  |  |  ------------------
  ------------------
  710|    156|        small_angle = false;
  711|    156|    }
  712|       |
  713|  1.09k|    int pos = max_subdiv;
  714|  1.84k|    while (c < str->split_cos && pos) {
  ------------------
  |  Branch (714:12): [True: 750, False: 1.09k]
  |  Branch (714:34): [True: 750, False: 0]
  ------------------
  715|    750|        mul[pos] = sqrt(0.5) / sqrt(1 + c);
  716|    750|        c = (1 + c) * mul[pos];
  717|    750|        pos--;
  718|    750|    }
  719|  1.09k|    mul[pos] = 1 / (1 + c);
  720|  1.09k|    return small_angle ?
  ------------------
  |  Branch (720:12): [True: 937, False: 156]
  ------------------
  721|    937|        process_arc(str, pt, normal0, normal1, mul + pos, max_subdiv - pos, dir) :
  722|  1.09k|        process_arc(str, pt, normal0, center,  mul + pos, max_subdiv - pos, dir) &&
  ------------------
  |  Branch (722:9): [True: 156, False: 0]
  ------------------
  723|    156|        process_arc(str, pt, center,  normal1, mul + pos, max_subdiv - pos, dir);
  ------------------
  |  Branch (723:9): [True: 156, False: 0]
  ------------------
  724|  1.09k|}
ass_outline.c:process_arc:
  675|  2.75k|{
  676|  2.75k|    ASS_DVector center;
  677|  2.75k|    center.x = (normal0.x + normal1.x) * mul[level];
  678|  2.75k|    center.y = (normal0.y + normal1.y) * mul[level];
  679|  2.75k|    if (level)
  ------------------
  |  Branch (679:9): [True: 753, False: 2.00k]
  ------------------
  680|    753|        return process_arc(str, pt, normal0, center, mul, level - 1, dir) &&
  ------------------
  |  Branch (680:16): [True: 753, False: 0]
  ------------------
  681|    753|               process_arc(str, pt, center, normal1, mul, level - 1, dir);
  ------------------
  |  Branch (681:16): [True: 753, False: 0]
  ------------------
  682|  2.00k|    return emit_point(str, pt, normal0, OUTLINE_QUADRATIC_SPLINE, dir) &&
  ------------------
  |  Branch (682:12): [True: 2.00k, False: 0]
  ------------------
  683|  2.00k|           emit_point(str, pt, center, 0, dir);
  ------------------
  |  Branch (683:12): [True: 2.00k, False: 0]
  ------------------
  684|  2.75k|}
ass_outline.c:emit_first_point:
  804|  2.68k|{
  805|  2.68k|    str->last_skip &= ~dir;
  806|  2.68k|    return emit_point(str, pt, str->last_normal, segment, dir);
  807|  2.68k|}
ass_outline.c:add_quadratic:
  998|  1.49k|{
  999|  1.49k|    int32_t dx0 = pt1.x - str->last_point.x;
 1000|  1.49k|    int32_t dy0 = pt1.y - str->last_point.y;
 1001|  1.49k|    if (dx0 > -str->eps && dx0 < str->eps && dy0 > -str->eps && dy0 < str->eps)
  ------------------
  |  Branch (1001:9): [True: 917, False: 574]
  |  Branch (1001:28): [True: 366, False: 551]
  |  Branch (1001:46): [True: 196, False: 170]
  |  Branch (1001:65): [True: 9, False: 187]
  ------------------
 1002|      9|        return add_line(str, pt2, dir);
 1003|       |
 1004|  1.48k|    int32_t dx1 = pt2.x - pt1.x;
 1005|  1.48k|    int32_t dy1 = pt2.y - pt1.y;
 1006|  1.48k|    if (dx1 > -str->eps && dx1 < str->eps && dy1 > -str->eps && dy1 < str->eps)
  ------------------
  |  Branch (1006:9): [True: 928, False: 554]
  |  Branch (1006:28): [True: 365, False: 563]
  |  Branch (1006:46): [True: 175, False: 190]
  |  Branch (1006:65): [True: 14, False: 161]
  ------------------
 1007|     14|        return add_line(str, pt2, dir);
 1008|       |
 1009|  1.46k|    ASS_Vector pt[3] = { str->last_point, pt1, pt2 };
 1010|  1.46k|    str->last_point = pt2;
 1011|       |
 1012|  1.46k|    ASS_DVector deriv[2] = {
 1013|  1.46k|        { dy0 * str->yscale, -dx0 * str->xscale },
 1014|  1.46k|        { dy1 * str->yscale, -dx1 * str->xscale }
 1015|  1.46k|    };
 1016|  1.46k|    double len0 = vec_len(deriv[0]), scale0 = 1 / len0;
 1017|  1.46k|    double len1 = vec_len(deriv[1]), scale1 = 1 / len1;
 1018|  1.46k|    Normal normal[2] = {
 1019|  1.46k|        { { deriv[0].x * scale0, deriv[0].y * scale0 }, len0 },
 1020|  1.46k|        { { deriv[1].x * scale1, deriv[1].y * scale1 }, len1 }
 1021|  1.46k|    };
 1022|       |
 1023|  1.46k|    bool first = str->contour_start;
 1024|  1.46k|    return start_segment(str, pt[0], normal[0].v, dir) &&
  ------------------
  |  Branch (1024:12): [True: 1.46k, False: 0]
  ------------------
 1025|  1.46k|        process_quadratic(str, pt, deriv, normal, dir, first);
  ------------------
  |  Branch (1025:9): [True: 1.46k, False: 0]
  ------------------
 1026|  1.48k|}
ass_outline.c:process_quadratic:
  896|  1.78k|{
  897|  1.78k|    double c = vec_dot(normal[0].v, normal[1].v);
  898|  1.78k|    double s = vec_crs(normal[0].v, normal[1].v);
  899|  1.78k|    int check_dir = dir, skip_dir = s < 0 ? 1 : 2;
  ------------------
  |  Branch (899:37): [True: 818, False: 966]
  ------------------
  900|  1.78k|    if (dir & skip_dir) {
  ------------------
  |  Branch (900:9): [True: 1.73k, False: 48]
  ------------------
  901|  1.73k|        double abs_s = fabs(s);
  902|  1.73k|        double f0 = normal[0].len * c + normal[1].len;
  903|  1.73k|        double f1 = normal[1].len * c + normal[0].len;
  904|  1.73k|        double g0 = normal[0].len * abs_s;
  905|  1.73k|        double g1 = normal[1].len * abs_s;
  906|       |        // check for self-intersection
  907|  1.73k|        if (f0 < abs_s && f1 < abs_s) {
  ------------------
  |  Branch (907:13): [True: 1.30k, False: 427]
  |  Branch (907:27): [True: 1.30k, False: 3]
  ------------------
  908|  1.30k|            double d2 = (f0 * normal[1].len + f1 * normal[0].len) / 2;
  909|  1.30k|            if (d2 < g0 && d2 < g1) {
  ------------------
  |  Branch (909:17): [True: 1.22k, False: 82]
  |  Branch (909:28): [True: 1.17k, False: 52]
  ------------------
  910|  1.17k|                if (!prepare_skip(str, pt[0], skip_dir, first))
  ------------------
  |  Branch (910:21): [True: 0, False: 1.17k]
  ------------------
  911|      0|                    return false;
  912|  1.17k|                if (f0 < 0 || f1 < 0) {
  ------------------
  |  Branch (912:21): [True: 0, False: 1.17k]
  |  Branch (912:31): [True: 0, False: 1.17k]
  ------------------
  913|      0|                    ASS_DVector zero_normal = {0, 0};
  914|      0|                    if (!emit_point(str, pt[0], zero_normal, OUTLINE_LINE_SEGMENT, skip_dir) ||
  ------------------
  |  Branch (914:25): [True: 0, False: 0]
  ------------------
  915|      0|                        !emit_point(str, pt[2], zero_normal, OUTLINE_LINE_SEGMENT, skip_dir))
  ------------------
  |  Branch (915:25): [True: 0, False: 0]
  ------------------
  916|      0|                        return false;
  917|  1.17k|                } else {
  918|  1.17k|                    double mul = f0 / abs_s;
  919|  1.17k|                    ASS_DVector offs = { normal[0].v.x * mul, normal[0].v.y * mul };
  920|  1.17k|                    if (!emit_point(str, pt[0], offs, OUTLINE_LINE_SEGMENT, skip_dir))
  ------------------
  |  Branch (920:25): [True: 0, False: 1.17k]
  ------------------
  921|      0|                        return false;
  922|  1.17k|                }
  923|  1.17k|                dir &= ~skip_dir;
  924|  1.17k|                if (!dir) {
  ------------------
  |  Branch (924:21): [True: 134, False: 1.03k]
  ------------------
  925|    134|                    str->last_normal = normal[1].v;
  926|    134|                    return true;
  927|    134|                }
  928|  1.17k|            }
  929|  1.17k|            check_dir ^= skip_dir;
  930|  1.17k|        } else if (c + g0 < 1 && c + g1 < 1)
  ------------------
  |  Branch (930:20): [True: 129, False: 301]
  |  Branch (930:34): [True: 0, False: 129]
  ------------------
  931|      0|            check_dir ^= skip_dir;
  932|  1.73k|    }
  933|       |
  934|  1.65k|    ASS_DVector result;
  935|  1.65k|    if (check_dir && estimate_quadratic_error(str, c, s, normal, &result)) {
  ------------------
  |  Branch (935:9): [True: 1.65k, False: 0]
  |  Branch (935:22): [True: 1.62k, False: 24]
  ------------------
  936|  1.62k|        if (!emit_first_point(str, pt[0], OUTLINE_QUADRATIC_SPLINE, check_dir))
  ------------------
  |  Branch (936:13): [True: 0, False: 1.62k]
  ------------------
  937|      0|            return false;
  938|  1.62k|        if (!emit_point(str, pt[1], result, 0, check_dir))
  ------------------
  |  Branch (938:13): [True: 0, False: 1.62k]
  ------------------
  939|      0|            return false;
  940|  1.62k|        dir &= ~check_dir;
  941|  1.62k|        if (!dir) {
  ------------------
  |  Branch (941:13): [True: 1.49k, False: 134]
  ------------------
  942|  1.49k|            str->last_normal = normal[1].v;
  943|  1.49k|            return true;
  944|  1.49k|        }
  945|  1.62k|    }
  946|       |
  947|    158|    ASS_Vector next[5];
  948|    158|    next[1].x = pt[0].x + pt[1].x;
  949|    158|    next[1].y = pt[0].y + pt[1].y;
  950|    158|    next[3].x = pt[1].x + pt[2].x;
  951|    158|    next[3].y = pt[1].y + pt[2].y;
  952|    158|    next[2].x = (next[1].x + next[3].x + 2) >> 2;
  953|    158|    next[2].y = (next[1].y + next[3].y + 2) >> 2;
  954|    158|    next[1].x >>= 1;
  955|    158|    next[1].y >>= 1;
  956|    158|    next[3].x >>= 1;
  957|    158|    next[3].y >>= 1;
  958|    158|    next[0] = pt[0];
  959|    158|    next[4] = pt[2];
  960|       |
  961|    158|    ASS_DVector next_deriv[3];
  962|    158|    next_deriv[0].x = deriv[0].x / 2;
  963|    158|    next_deriv[0].y = deriv[0].y / 2;
  964|    158|    next_deriv[2].x = deriv[1].x / 2;
  965|    158|    next_deriv[2].y = deriv[1].y / 2;
  966|    158|    next_deriv[1].x = (next_deriv[0].x + next_deriv[2].x) / 2;
  967|    158|    next_deriv[1].y = (next_deriv[0].y + next_deriv[2].y) / 2;
  968|       |
  969|    158|    double len = vec_len(next_deriv[1]);
  970|    158|    if (len < str->min_len) {  // check degenerate case
  ------------------
  |  Branch (970:9): [True: 0, False: 158]
  ------------------
  971|      0|        if (!emit_first_point(str, next[0], OUTLINE_LINE_SEGMENT, dir))
  ------------------
  |  Branch (971:13): [True: 0, False: 0]
  ------------------
  972|      0|            return false;
  973|      0|        if (!start_segment(str, next[2], normal[1].v, dir))
  ------------------
  |  Branch (973:13): [True: 0, False: 0]
  ------------------
  974|      0|            return false;
  975|      0|        str->last_skip &= ~dir;
  976|      0|        return emit_point(str, next[2], normal[1].v, OUTLINE_LINE_SEGMENT, dir);
  977|      0|    }
  978|       |
  979|    158|    double scale = 1 / len;
  980|    158|    Normal next_normal[3] = {
  981|    158|        { normal[0].v, normal[0].len / 2 },
  982|    158|        { { next_deriv[1].x * scale, next_deriv[1].y * scale }, len },
  983|    158|        { normal[1].v, normal[1].len / 2 }
  984|    158|    };
  985|    158|    return process_quadratic(str, next + 0, next_deriv + 0, next_normal + 0, dir, first) &&
  ------------------
  |  Branch (985:12): [True: 158, False: 0]
  ------------------
  986|    158|           process_quadratic(str, next + 2, next_deriv + 1, next_normal + 1, dir, false);
  ------------------
  |  Branch (986:12): [True: 158, False: 0]
  ------------------
  987|    158|}
ass_outline.c:prepare_skip:
  818|  1.17k|{
  819|  1.17k|    if (first)
  ------------------
  |  Branch (819:9): [True: 45, False: 1.12k]
  ------------------
  820|     45|        str->first_skip |= dir;
  821|  1.12k|    else if (!emit_point(str, pt, str->last_normal, OUTLINE_LINE_SEGMENT, ~str->last_skip & dir))
  ------------------
  |  Branch (821:14): [True: 0, False: 1.12k]
  ------------------
  822|      0|        return false;
  823|  1.17k|    str->last_skip |= dir;
  824|  1.17k|    return true;
  825|  1.17k|}
ass_outline.c:estimate_quadratic_error:
  865|  1.65k|{
  866|       |    // check radial error
  867|  1.65k|    if (!((3 + c) * (3 + c) < str->err_q * (1 + c)))
  ------------------
  |  Branch (867:9): [True: 24, False: 1.62k]
  ------------------
  868|     24|        return false;
  869|       |
  870|  1.62k|    double mul = 1 / (1 + c);
  871|  1.62k|    double l0 = 2 * normal[0].len, l1 = 2 * normal[1].len;
  872|  1.62k|    double dot0 = l0 + normal[1].len * c, crs0 = (l0 * mul - normal[1].len) * s;
  873|  1.62k|    double dot1 = l1 + normal[0].len * c, crs1 = (l1 * mul - normal[0].len) * s;
  874|       |    // check angular error
  875|  1.62k|    if (!(fabs(crs0) < str->err_a * dot0 && fabs(crs1) < str->err_a * dot1))
  ------------------
  |  Branch (875:11): [True: 1.62k, False: 0]
  |  Branch (875:45): [True: 1.62k, False: 0]
  ------------------
  876|      0|        return false;
  877|       |
  878|  1.62k|    result->x = (normal[0].v.x + normal[1].v.x) * mul;
  879|  1.62k|    result->y = (normal[0].v.y + normal[1].v.y) * mul;
  880|  1.62k|    return true;
  881|  1.62k|}
ass_outline.c:close_contour:
 1448|    204|{
 1449|    204|    if (str->contour_start) {
  ------------------
  |  Branch (1449:9): [True: 0, False: 204]
  ------------------
 1450|      0|        if ((dir & 3) == 3)
  ------------------
  |  Branch (1450:13): [True: 0, False: 0]
  ------------------
 1451|      0|            dir = 1;
 1452|      0|        if (!draw_circle(str, str->last_point, dir))
  ------------------
  |  Branch (1452:13): [True: 0, False: 0]
  ------------------
 1453|      0|            return false;
 1454|    204|    } else {
 1455|    204|        if (!add_line(str, str->first_point, dir))
  ------------------
  |  Branch (1455:13): [True: 0, False: 204]
  ------------------
 1456|      0|            return false;
 1457|    204|        if (!start_segment(str, str->first_point, str->first_normal, dir))
  ------------------
  |  Branch (1457:13): [True: 0, False: 204]
  ------------------
 1458|      0|            return false;
 1459|    204|        if (!emit_point(str, str->first_point, str->first_normal, OUTLINE_LINE_SEGMENT,
  ------------------
  |  Branch (1459:13): [True: 0, False: 204]
  ------------------
 1460|    204|                       ~str->last_skip & dir & str->first_skip))
 1461|      0|            return false;
 1462|    204|        if (str->last_normal.x != str->first_normal.x ||
  ------------------
  |  Branch (1462:13): [True: 38, False: 166]
  ------------------
 1463|    204|            str->last_normal.y != str->first_normal.y)
  ------------------
  |  Branch (1463:13): [True: 0, False: 166]
  ------------------
 1464|     38|            fix_first_point(str, str->first_point, str->last_normal,
 1465|     38|                           ~str->last_skip & dir & ~str->first_skip);
 1466|    204|        str->contour_start = true;
 1467|    204|    }
 1468|    204|    if (dir & 1)
  ------------------
  |  Branch (1468:9): [True: 204, False: 0]
  ------------------
 1469|    204|        ass_outline_close_contour(str->result[0]);
 1470|    204|    if (dir & 2)
  ------------------
  |  Branch (1470:9): [True: 204, False: 0]
  ------------------
 1471|    204|        ass_outline_close_contour(str->result[1]);
 1472|    204|    str->contour_first[0] = str->result[0]->n_points;
 1473|    204|    str->contour_first[1] = str->result[1]->n_points;
 1474|    204|    return true;
 1475|    204|}
ass_outline.c:fix_first_point:
  645|     38|{
  646|     38|    int32_t dx = (int32_t) (str->xbord * offs.x);
  647|     38|    int32_t dy = (int32_t) (str->ybord * offs.y);
  648|       |
  649|     38|    if (dir & 1) {
  ------------------
  |  Branch (649:9): [True: 27, False: 11]
  ------------------
  650|     27|        ASS_Vector res = { pt.x + dx, pt.y + dy };
  651|     27|        ASS_Outline *ol = str->result[0];
  652|     27|        ol->points[str->contour_first[0]] = res;
  653|     27|    }
  654|     38|    if (dir & 2) {
  ------------------
  |  Branch (654:9): [True: 15, False: 23]
  ------------------
  655|     15|        ASS_Vector res = { pt.x - dx, pt.y - dy };
  656|     15|        ASS_Outline *ol = str->result[1];
  657|     15|        ol->points[str->contour_first[1]] = res;
  658|     15|    }
  659|     38|}

ass_render.c:rectangle_reset:
   47|    341|{
   48|    341|    rect->x_min = rect->y_min = INT32_MAX;
   49|    341|    rect->x_max = rect->y_max = INT32_MIN;
   50|    341|}
ass_render.c:rectangle_update:
   54|   443k|{
   55|   443k|    rect->x_min = FFMIN(rect->x_min, x_min);
  ------------------
  |  |   47|   443k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 36, False: 443k]
  |  |  ------------------
  ------------------
   56|   443k|    rect->y_min = FFMIN(rect->y_min, y_min);
  ------------------
  |  |   47|   443k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 55, False: 443k]
  |  |  ------------------
  ------------------
   57|   443k|    rect->x_max = FFMAX(rect->x_max, x_max);
  ------------------
  |  |   46|   443k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 443k]
  |  |  ------------------
  ------------------
   58|   443k|    rect->y_max = FFMAX(rect->y_max, y_max);
  ------------------
  |  |   46|   443k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 213k, False: 230k]
  |  |  ------------------
  ------------------
   59|   443k|}
ass_outline.c:rectangle_update:
   54|  19.2k|{
   55|  19.2k|    rect->x_min = FFMIN(rect->x_min, x_min);
  ------------------
  |  |   47|  19.2k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 2.07k, False: 17.1k]
  |  |  ------------------
  ------------------
   56|  19.2k|    rect->y_min = FFMIN(rect->y_min, y_min);
  ------------------
  |  |   47|  19.2k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 2.15k, False: 17.0k]
  |  |  ------------------
  ------------------
   57|  19.2k|    rect->x_max = FFMAX(rect->x_max, x_max);
  ------------------
  |  |   46|  19.2k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 17.6k, False: 1.57k]
  |  |  ------------------
  ------------------
   58|  19.2k|    rect->y_max = FFMAX(rect->y_max, y_max);
  ------------------
  |  |   46|  19.2k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 17.1k, False: 2.03k]
  |  |  ------------------
  ------------------
   59|  19.2k|}
ass_rasterizer.c:rectangle_reset:
   47|    606|{
   48|    606|    rect->x_min = rect->y_min = INT32_MAX;
   49|    606|    rect->x_max = rect->y_max = INT32_MIN;
   50|    606|}
ass_rasterizer.c:rectangle_update:
   54|  35.9k|{
   55|  35.9k|    rect->x_min = FFMIN(rect->x_min, x_min);
  ------------------
  |  |   47|  35.9k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 3.68k, False: 32.2k]
  |  |  ------------------
  ------------------
   56|  35.9k|    rect->y_min = FFMIN(rect->y_min, y_min);
  ------------------
  |  |   47|  35.9k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 4.23k, False: 31.6k]
  |  |  ------------------
  ------------------
   57|  35.9k|    rect->x_max = FFMAX(rect->x_max, x_max);
  ------------------
  |  |   46|  35.9k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 32.7k, False: 3.20k]
  |  |  ------------------
  ------------------
   58|  35.9k|    rect->y_max = FFMAX(rect->y_max, y_max);
  ------------------
  |  |   46|  35.9k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 32.5k, False: 3.41k]
  |  |  ------------------
  ------------------
   59|  35.9k|}

ass_update_font:
   84|   512k|{
   85|   512k|    unsigned val;
   86|   512k|    ASS_FontDesc desc;
   87|       |
   88|   512k|    desc.family = state->family;
   89|   512k|    if (!desc.family.str)
  ------------------
  |  Branch (89:9): [True: 0, False: 512k]
  ------------------
   90|      0|        return;
   91|   512k|    if (desc.family.len && desc.family.str[0] == '@') {
  ------------------
  |  Branch (91:9): [True: 512k, False: 0]
  |  Branch (91:28): [True: 0, False: 512k]
  ------------------
   92|      0|        desc.vertical = 1;
   93|      0|        desc.family.str++;
   94|      0|        desc.family.len--;
   95|   512k|    } else {
   96|   512k|        desc.vertical = 0;
   97|   512k|    }
   98|       |
   99|   512k|    val = state->bold;
  100|       |    // 0 = normal, 1 = bold, >1 = exact weight
  101|   512k|    if (val == 1 || val == -1)
  ------------------
  |  Branch (101:9): [True: 0, False: 512k]
  |  Branch (101:21): [True: 0, False: 512k]
  ------------------
  102|      0|        val = 700;               // bold
  103|   512k|    else if (val <= 0)
  ------------------
  |  Branch (103:14): [True: 126, False: 512k]
  ------------------
  104|    126|        val = 400;               // normal
  105|   512k|    desc.bold = val;
  106|       |
  107|   512k|    val = state->italic;
  108|   512k|    if (val == 1)
  ------------------
  |  Branch (108:9): [True: 0, False: 512k]
  ------------------
  109|      0|        val = 100;              // italic
  110|   512k|    else if (val <= 0)
  ------------------
  |  Branch (110:14): [True: 512k, False: 0]
  ------------------
  111|   512k|        val = 0;                // normal
  112|   512k|    desc.italic = val;
  113|       |
  114|   512k|    ass_cache_dec_ref(state->font);
  115|   512k|    state->font = ass_font_new(state->renderer, &desc);
  116|   512k|}
ass_apply_fade:
  175|  11.7M|{
  176|       |    // VSFilter compatibility: apply fade only when it's positive
  177|  11.7M|    if (fade > 0)
  ------------------
  |  Branch (177:9): [True: 0, False: 11.7M]
  ------------------
  178|      0|        change_alpha(clr, mult_alpha(_a(*clr), fade), 1);
  ------------------
  |  |   29|      0|#define _a(c)   ((c) & 0xFF)
  ------------------
  179|  11.7M|}
ass_parse_tags:
  285|   256k|{
  286|   256k|    ASS_Renderer *render_priv = state->renderer;
  287|  3.73M|    for (char *q; p < end; p = q) {
  ------------------
  |  Branch (287:19): [True: 3.48M, False: 256k]
  ------------------
  288|  3.89M|        while (*p != '\\' && p != end)
  ------------------
  |  Branch (288:16): [True: 409k, False: 3.48M]
  |  Branch (288:30): [True: 409k, False: 0]
  ------------------
  289|   409k|            ++p;
  290|  3.48M|        if (*p != '\\')
  ------------------
  |  Branch (290:13): [True: 0, False: 3.48M]
  ------------------
  291|      0|            break;
  292|  3.48M|        ++p;
  293|  3.48M|        if (p != end)
  ------------------
  |  Branch (293:13): [True: 3.48M, False: 0]
  ------------------
  294|  3.48M|            skip_spaces(&p);
  295|       |
  296|  3.48M|        q = p;
  297|  26.4M|        while (*q != '(' && *q != '\\' && q != end)
  ------------------
  |  Branch (297:16): [True: 26.1M, False: 255k]
  |  Branch (297:29): [True: 23.2M, False: 2.96M]
  |  Branch (297:43): [True: 22.9M, False: 255k]
  ------------------
  298|  22.9M|            ++q;
  299|  3.48M|        if (q == p)
  ------------------
  |  Branch (299:13): [True: 204k, False: 3.27M]
  ------------------
  300|   204k|            continue;
  301|       |
  302|  3.27M|        char *name_end = q;
  303|       |
  304|       |        // Store one extra element to be able to detect excess arguments
  305|  3.27M|        struct arg args[MAX_VALID_NARGS + 1];
  306|  3.27M|        int nargs = 0;
  307|  3.27M|        bool has_backslash_arg = false;
  308|  29.4M|        for (int i = 0; i <= MAX_VALID_NARGS; ++i)
  ------------------
  |  |   31|  29.4M|#define MAX_VALID_NARGS 7
  ------------------
  |  Branch (308:25): [True: 26.2M, False: 3.27M]
  ------------------
  309|  26.2M|            args[i].start = args[i].end = "";
  310|       |
  311|       |        // Split parenthesized arguments. Do this for all tags and before
  312|       |        // any non-parenthesized argument because that's what VSFilter does.
  313|  3.27M|        if (*q == '(') {
  ------------------
  |  Branch (313:13): [True: 255k, False: 3.02M]
  ------------------
  314|   255k|            ++q;
  315|   460k|            while (1) {
  ------------------
  |  Branch (315:20): [Folded - Ignored]
  ------------------
  316|   460k|                if (q != end)
  ------------------
  |  Branch (316:21): [True: 460k, False: 0]
  ------------------
  317|   460k|                    skip_spaces(&q);
  318|       |
  319|       |                // Split on commas. If there is a backslash, ignore any
  320|       |                // commas following it and lump everything starting from
  321|       |                // the last comma, through the backslash and all the way
  322|       |                // to the end of the argument string into a single argument.
  323|       |
  324|   460k|                char *r = q;
  325|  1.22M|                while (*r != ',' && *r != '\\' && *r != ')' && r != end)
  ------------------
  |  Branch (325:24): [True: 1.02M, False: 205k]
  |  Branch (325:37): [True: 768k, False: 255k]
  |  Branch (325:51): [True: 768k, False: 0]
  |  Branch (325:64): [True: 768k, False: 78]
  ------------------
  326|   768k|                    ++r;
  327|       |
  328|   460k|                if (*r == ',') {
  ------------------
  |  Branch (328:21): [True: 205k, False: 255k]
  ------------------
  329|   205k|                    push_arg(args, &nargs, q, r);
  330|   205k|                    q = r + 1;
  331|   255k|                } else {
  332|       |                    // Swallow the rest of the parenthesized string. This could
  333|       |                    // be either a backslash-argument or simply the last argument.
  334|   255k|                    if (*r == '\\') {
  ------------------
  |  Branch (334:25): [True: 255k, False: 78]
  ------------------
  335|   255k|                        has_backslash_arg = true;
  336|  25.9M|                        while (*r != ')' && r != end)
  ------------------
  |  Branch (336:32): [True: 25.9M, False: 0]
  |  Branch (336:45): [True: 25.6M, False: 255k]
  ------------------
  337|  25.6M|                            ++r;
  338|   255k|                    }
  339|   255k|                    push_arg(args, &nargs, q, r);
  340|   255k|                    q = r;
  341|       |                    // The closing parenthesis could be missing.
  342|   255k|                    if (q != end)
  ------------------
  |  Branch (342:25): [True: 0, False: 255k]
  ------------------
  343|      0|                        ++q;
  344|   255k|                    break;
  345|   255k|                }
  346|   460k|            }
  347|   255k|        }
  348|       |
  349|  3.27M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  350|  3.27M|#define complex_tag(name) mystrcmp(&p, (name))
  351|       |
  352|       |        // New tags introduced in vsfilter 2.39
  353|  3.27M|        if (tag("xbord")) {
  ------------------
  |  |  349|  3.27M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 136, False: 3.27M]
  |  |  |  Branch (349:44): [True: 136, False: 0]
  |  |  ------------------
  ------------------
  354|    136|            double val;
  355|    136|            if (nargs) {
  ------------------
  |  Branch (355:17): [True: 136, False: 0]
  ------------------
  356|    136|                val = argtod(*args);
  357|    136|                val = state->border_x * (1 - pwr) + val * pwr;
  358|    136|                val = (val < 0) ? 0 : val;
  ------------------
  |  Branch (358:23): [True: 136, False: 0]
  ------------------
  359|    136|            } else
  360|      0|                val = state->style->Outline;
  361|    136|            state->border_x = val;
  362|  3.27M|        } else if (tag("ybord")) {
  ------------------
  |  |  349|  3.27M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 204k, False: 3.07M]
  |  |  |  Branch (349:44): [True: 204k, False: 0]
  |  |  ------------------
  ------------------
  363|   204k|            double val;
  364|   204k|            if (nargs) {
  ------------------
  |  Branch (364:17): [True: 0, False: 204k]
  ------------------
  365|      0|                val = argtod(*args);
  366|      0|                val = state->border_y * (1 - pwr) + val * pwr;
  367|      0|                val = (val < 0) ? 0 : val;
  ------------------
  |  Branch (367:23): [True: 0, False: 0]
  ------------------
  368|      0|            } else
  369|   204k|                val = state->style->Outline;
  370|   204k|            state->border_y = val;
  371|  3.07M|        } else if (tag("xshad")) {
  ------------------
  |  |  349|  3.07M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 3.07M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  372|      0|            double val;
  373|      0|            if (nargs) {
  ------------------
  |  Branch (373:17): [True: 0, False: 0]
  ------------------
  374|      0|                val = argtod(*args);
  375|      0|                val = state->shadow_x * (1 - pwr) + val * pwr;
  376|      0|            } else
  377|      0|                val = state->style->Shadow;
  378|      0|            state->shadow_x = val;
  379|  3.07M|        } else if (tag("yshad")) {
  ------------------
  |  |  349|  3.07M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 3.07M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  380|      0|            double val;
  381|      0|            if (nargs) {
  ------------------
  |  Branch (381:17): [True: 0, False: 0]
  ------------------
  382|      0|                val = argtod(*args);
  383|      0|                val = state->shadow_y * (1 - pwr) + val * pwr;
  384|      0|            } else
  385|      0|                val = state->style->Shadow;
  386|      0|            state->shadow_y = val;
  387|  3.07M|        } else if (tag("fax")) {
  ------------------
  |  |  349|  3.07M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 3.07M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  388|      0|            double val;
  389|      0|            if (nargs) {
  ------------------
  |  Branch (389:17): [True: 0, False: 0]
  ------------------
  390|      0|                val = argtod(*args);
  391|      0|                state->fax =
  392|      0|                    val * pwr + state->fax * (1 - pwr);
  393|      0|            } else
  394|      0|                state->fax = 0.;
  395|  3.07M|        } else if (tag("fay")) {
  ------------------
  |  |  349|  3.07M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 3.07M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  396|      0|            double val;
  397|      0|            if (nargs) {
  ------------------
  |  Branch (397:17): [True: 0, False: 0]
  ------------------
  398|      0|                val = argtod(*args);
  399|      0|                state->fay =
  400|      0|                    val * pwr + state->fay * (1 - pwr);
  401|      0|            } else
  402|      0|                state->fay = 0.;
  403|  3.07M|        } else if (complex_tag("iclip")) {
  ------------------
  |  |  350|  3.07M|#define complex_tag(name) mystrcmp(&p, (name))
  |  |  ------------------
  |  |  |  Branch (350:27): [True: 0, False: 3.07M]
  |  |  ------------------
  ------------------
  404|      0|            if (nargs == 4) {
  ------------------
  |  Branch (404:17): [True: 0, False: 0]
  ------------------
  405|      0|                int32_t x0, y0, x1, y1;
  406|      0|                x0 = argtoi32(args[0]);
  407|      0|                y0 = argtoi32(args[1]);
  408|      0|                x1 = argtoi32(args[2]);
  409|      0|                y1 = argtoi32(args[3]);
  410|      0|                state->clip_x0 =
  411|      0|                    state->clip_x0 * (1 - pwr) + x0 * pwr;
  412|      0|                state->clip_x1 =
  413|      0|                    state->clip_x1 * (1 - pwr) + x1 * pwr;
  414|      0|                state->clip_y0 =
  415|      0|                    state->clip_y0 * (1 - pwr) + y0 * pwr;
  416|      0|                state->clip_y1 =
  417|      0|                    state->clip_y1 * (1 - pwr) + y1 * pwr;
  418|      0|                state->clip_mode = 1;
  419|      0|            } else if (!state->clip_drawing_text.str) {
  ------------------
  |  Branch (419:24): [True: 0, False: 0]
  ------------------
  420|      0|                if (parse_vector_clip(state, args, nargs))
  ------------------
  |  Branch (420:21): [True: 0, False: 0]
  ------------------
  421|      0|                    state->clip_drawing_mode = 1;
  422|      0|            }
  423|  3.07M|        } else if (tag("blur")) {
  ------------------
  |  |  349|  3.07M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 3.07M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  424|      0|            double val;
  425|      0|            if (nargs) {
  ------------------
  |  Branch (425:17): [True: 0, False: 0]
  ------------------
  426|      0|                val = argtod(*args);
  427|      0|                val = state->blur * (1 - pwr) + val * pwr;
  428|      0|                val = (val < 0) ? 0 : val;
  ------------------
  |  Branch (428:23): [True: 0, False: 0]
  ------------------
  429|      0|                val = (val > BLUR_MAX_RADIUS) ? BLUR_MAX_RADIUS : val;
  ------------------
  |  |   24|      0|#define BLUR_MAX_RADIUS 100.0
  ------------------
                              val = (val > BLUR_MAX_RADIUS) ? BLUR_MAX_RADIUS : val;
  ------------------
  |  |   24|      0|#define BLUR_MAX_RADIUS 100.0
  ------------------
  |  Branch (429:23): [True: 0, False: 0]
  ------------------
  430|      0|                state->blur = val;
  431|      0|            } else
  432|      0|                state->blur = 0.0;
  433|       |            // ASS standard tags
  434|  3.07M|        } else if (tag("fscx")) {
  ------------------
  |  |  349|  3.07M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 3.07M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  435|      0|            double val;
  436|      0|            if (nargs) {
  ------------------
  |  Branch (436:17): [True: 0, False: 0]
  ------------------
  437|      0|                val = argtod(*args) / 100;
  438|      0|                val = state->scale_x * (1 - pwr) + val * pwr;
  439|      0|                val = (val < 0) ? 0 : val;
  ------------------
  |  Branch (439:23): [True: 0, False: 0]
  ------------------
  440|      0|            } else
  441|      0|                val = state->style->ScaleX;
  442|      0|            state->scale_x = val;
  443|  3.07M|        } else if (tag("fscy")) {
  ------------------
  |  |  349|  3.07M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 3.07M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  444|      0|            double val;
  445|      0|            if (nargs) {
  ------------------
  |  Branch (445:17): [True: 0, False: 0]
  ------------------
  446|      0|                val = argtod(*args) / 100;
  447|      0|                val = state->scale_y * (1 - pwr) + val * pwr;
  448|      0|                val = (val < 0) ? 0 : val;
  ------------------
  |  Branch (448:23): [True: 0, False: 0]
  ------------------
  449|      0|            } else
  450|      0|                val = state->style->ScaleY;
  451|      0|            state->scale_y = val;
  452|  3.07M|        } else if (tag("fsc")) {
  ------------------
  |  |  349|  3.07M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 3.07M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  453|      0|            state->scale_x = state->style->ScaleX;
  454|      0|            state->scale_y = state->style->ScaleY;
  455|  3.07M|        } else if (tag("fsp")) {
  ------------------
  |  |  349|  3.07M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 102k, False: 2.96M]
  |  |  |  Branch (349:44): [True: 102k, False: 0]
  |  |  ------------------
  ------------------
  456|   102k|            double val;
  457|   102k|            if (nargs) {
  ------------------
  |  Branch (457:17): [True: 51.1k, False: 51.1k]
  ------------------
  458|  51.1k|                val = argtod(*args);
  459|  51.1k|                state->hspacing =
  460|  51.1k|                    state->hspacing * (1 - pwr) + val * pwr;
  461|  51.1k|            } else
  462|  51.1k|                state->hspacing = state->style->Spacing;
  463|  2.96M|        } else if (tag("fs")) {
  ------------------
  |  |  349|  2.96M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 2.96M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  464|      0|            double val = 0;
  465|      0|            if (nargs) {
  ------------------
  |  Branch (465:17): [True: 0, False: 0]
  ------------------
  466|      0|                val = argtod(*args);
  467|      0|                if (*args->start == '+' || *args->start == '-')
  ------------------
  |  Branch (467:21): [True: 0, False: 0]
  |  Branch (467:44): [True: 0, False: 0]
  ------------------
  468|      0|                    val = state->font_size * (1 + pwr * val / 10);
  469|      0|                else
  470|      0|                    val = state->font_size * (1 - pwr) + val * pwr;
  471|      0|            }
  472|      0|            if (val <= 0)
  ------------------
  |  Branch (472:17): [True: 0, False: 0]
  ------------------
  473|      0|                val = state->style->FontSize;
  474|      0|            state->font_size = val;
  475|  2.96M|        } else if (tag("bord")) {
  ------------------
  |  |  349|  2.96M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 2.96M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  476|      0|            double val, xval, yval;
  477|      0|            if (nargs) {
  ------------------
  |  Branch (477:17): [True: 0, False: 0]
  ------------------
  478|      0|                val = argtod(*args);
  479|      0|                xval = state->border_x * (1 - pwr) + val * pwr;
  480|      0|                yval = state->border_y * (1 - pwr) + val * pwr;
  481|      0|                xval = (xval < 0) ? 0 : xval;
  ------------------
  |  Branch (481:24): [True: 0, False: 0]
  ------------------
  482|      0|                yval = (yval < 0) ? 0 : yval;
  ------------------
  |  Branch (482:24): [True: 0, False: 0]
  ------------------
  483|      0|            } else
  484|      0|                xval = yval = state->style->Outline;
  485|      0|            state->border_x = xval;
  486|      0|            state->border_y = yval;
  487|  2.96M|        } else if (complex_tag("move")) {
  ------------------
  |  |  350|  2.96M|#define complex_tag(name) mystrcmp(&p, (name))
  |  |  ------------------
  |  |  |  Branch (350:27): [True: 78, False: 2.96M]
  |  |  ------------------
  ------------------
  488|     78|            double x1, x2, y1, y2;
  489|     78|            int32_t t1, t2, delta_t, t;
  490|     78|            double x, y;
  491|     78|            double k;
  492|     78|            if (nargs == 4 || nargs == 6) {
  ------------------
  |  Branch (492:17): [True: 0, False: 78]
  |  Branch (492:31): [True: 78, False: 0]
  ------------------
  493|     78|                x1 = argtod(args[0]);
  494|     78|                y1 = argtod(args[1]);
  495|     78|                x2 = argtod(args[2]);
  496|     78|                y2 = argtod(args[3]);
  497|     78|                t1 = t2 = 0;
  498|     78|                if (nargs == 6) {
  ------------------
  |  Branch (498:21): [True: 78, False: 0]
  ------------------
  499|     78|                    t1 = argtoi32(args[4]);
  500|     78|                    t2 = argtoi32(args[5]);
  501|     78|                    if (t1 > t2) {
  ------------------
  |  Branch (501:25): [True: 78, False: 0]
  ------------------
  502|     78|                        long long tmp = t2;
  503|     78|                        t2 = t1;
  504|     78|                        t1 = tmp;
  505|     78|                    }
  506|     78|                }
  507|     78|            } else
  508|      0|                continue;
  509|     78|            if (t1 <= 0 && t2 <= 0) {
  ------------------
  |  Branch (509:17): [True: 78, False: 0]
  |  Branch (509:28): [True: 0, False: 78]
  ------------------
  510|      0|                t1 = 0;
  511|      0|                t2 = state->event->Duration;
  512|      0|            }
  513|     78|            delta_t = (uint32_t) t2 - t1;
  514|     78|            t = render_priv->time - state->event->Start;
  515|     78|            if (t <= t1)
  ------------------
  |  Branch (515:17): [True: 0, False: 78]
  ------------------
  516|      0|                k = 0.;
  517|     78|            else if (t >= t2)
  ------------------
  |  Branch (517:22): [True: 48, False: 30]
  ------------------
  518|     48|                k = 1.;
  519|     30|            else
  520|     30|                k = ((double) (int32_t) ((uint32_t) t - t1)) / delta_t;
  521|     78|            x = k * (x2 - x1) + x1;
  522|     78|            y = k * (y2 - y1) + y1;
  523|     78|            if (!(state->evt_type & EVENT_POSITIONED)) {
  ------------------
  |  Branch (523:17): [True: 52, False: 26]
  ------------------
  524|     52|                state->pos_x = x;
  525|     52|                state->pos_y = y;
  526|     52|                state->detect_collisions = 0;
  527|     52|                state->evt_type |= EVENT_POSITIONED;
  528|     52|            }
  529|  2.96M|        } else if (tag("frx")) {
  ------------------
  |  |  349|  2.96M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 2.96M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  530|      0|            double val;
  531|      0|            if (nargs) {
  ------------------
  |  Branch (531:17): [True: 0, False: 0]
  ------------------
  532|      0|                val = argtod(*args);
  533|      0|                state->frx =
  534|      0|                    val * pwr + state->frx * (1 - pwr);
  535|      0|            } else
  536|      0|                state->frx = 0.;
  537|  2.96M|        } else if (tag("fry")) {
  ------------------
  |  |  349|  2.96M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 2.96M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  538|      0|            double val;
  539|      0|            if (nargs) {
  ------------------
  |  Branch (539:17): [True: 0, False: 0]
  ------------------
  540|      0|                val = argtod(*args);
  541|      0|                state->fry =
  542|      0|                    val * pwr + state->fry * (1 - pwr);
  543|      0|            } else
  544|      0|                state->fry = 0.;
  545|  2.96M|        } else if (tag("frz") || tag("fr")) {
  ------------------
  |  |  349|  5.93M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 2.96M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                      } else if (tag("frz") || tag("fr")) {
  ------------------
  |  |  349|  2.96M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 2.96M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  546|      0|            double val;
  547|      0|            if (nargs) {
  ------------------
  |  Branch (547:17): [True: 0, False: 0]
  ------------------
  548|      0|                val = argtod(*args);
  549|      0|                state->frz =
  550|      0|                    val * pwr + state->frz * (1 - pwr);
  551|      0|            } else
  552|      0|                state->frz =
  553|      0|                    state->style->Angle;
  554|  2.96M|        } else if (tag("fn")) {
  ------------------
  |  |  349|  2.96M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 84, False: 2.96M]
  |  |  |  Branch (349:44): [True: 84, False: 0]
  |  |  ------------------
  ------------------
  555|     84|            char *start = args->start;
  556|     84|            if (nargs && strncmp(start, "0", args->end - start)) {
  ------------------
  |  Branch (556:17): [True: 84, False: 0]
  |  Branch (556:26): [True: 84, False: 0]
  ------------------
  557|     84|                skip_spaces(&start);
  558|     84|                state->family.str = start;
  559|     84|                state->family.len = args->end - start;
  560|     84|            } else {
  561|      0|                state->family.str = state->style->FontName;
  562|      0|                state->family.len = strlen(state->style->FontName);
  563|      0|            }
  564|     84|            ass_update_font(state);
  565|  2.96M|        } else if (tag("alpha")) {
  ------------------
  |  |  349|  2.96M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 2.96M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  566|      0|            int i;
  567|      0|            if (nargs) {
  ------------------
  |  Branch (567:17): [True: 0, False: 0]
  ------------------
  568|      0|                int32_t a = parse_alpha_tag(args->start);
  569|      0|                for (i = 0; i < 4; ++i)
  ------------------
  |  Branch (569:29): [True: 0, False: 0]
  ------------------
  570|      0|                    change_alpha(&state->c[i], a, pwr);
  571|      0|            } else {
  572|      0|                change_alpha(&state->c[0],
  573|      0|                             _a(state->style->PrimaryColour), 1);
  ------------------
  |  |   29|      0|#define _a(c)   ((c) & 0xFF)
  ------------------
  574|      0|                change_alpha(&state->c[1],
  575|      0|                             _a(state->style->SecondaryColour), 1);
  ------------------
  |  |   29|      0|#define _a(c)   ((c) & 0xFF)
  ------------------
  576|      0|                change_alpha(&state->c[2],
  577|      0|                             _a(state->style->OutlineColour), 1);
  ------------------
  |  |   29|      0|#define _a(c)   ((c) & 0xFF)
  ------------------
  578|      0|                change_alpha(&state->c[3],
  579|      0|                             _a(state->style->BackColour), 1);
  ------------------
  |  |   29|      0|#define _a(c)   ((c) & 0xFF)
  ------------------
  580|      0|            }
  581|       |            // FIXME: simplify
  582|  2.96M|        } else if (tag("an")) {
  ------------------
  |  |  349|  2.96M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 2.96M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  583|      0|            int32_t val = argtoi32(*args);
  584|      0|            if ((state->parsed_tags & PARSED_A) == 0) {
  ------------------
  |  |   50|      0|#define PARSED_A    (1<<1)
  ------------------
  |  Branch (584:17): [True: 0, False: 0]
  ------------------
  585|      0|                if (val >= 1 && val <= 9)
  ------------------
  |  Branch (585:21): [True: 0, False: 0]
  |  Branch (585:33): [True: 0, False: 0]
  ------------------
  586|      0|                    state->alignment = numpad2align(val);
  587|      0|                else
  588|      0|                    state->alignment =
  589|      0|                        state->style->Alignment;
  590|      0|                state->parsed_tags |= PARSED_A;
  ------------------
  |  |   50|      0|#define PARSED_A    (1<<1)
  ------------------
  591|      0|            }
  592|  2.96M|        } else if (tag("a")) {
  ------------------
  |  |  349|  2.96M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 2.96M]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  593|      0|            int32_t val = argtoi32(*args);
  594|      0|            if ((state->parsed_tags & PARSED_A) == 0) {
  ------------------
  |  |   50|      0|#define PARSED_A    (1<<1)
  ------------------
  |  Branch (594:17): [True: 0, False: 0]
  ------------------
  595|      0|                if (val >= 1 && val <= 11)
  ------------------
  |  Branch (595:21): [True: 0, False: 0]
  |  Branch (595:33): [True: 0, False: 0]
  ------------------
  596|       |                    // take care of a vsfilter quirk:
  597|       |                    // handle illegal \a8 and \a4 like \a5
  598|      0|                    state->alignment = ((val & 3) == 0) ? 5 : val;
  ------------------
  |  Branch (598:40): [True: 0, False: 0]
  ------------------
  599|      0|                else
  600|      0|                    state->alignment =
  601|      0|                        state->style->Alignment;
  602|      0|                state->parsed_tags |= PARSED_A;
  ------------------
  |  |   50|      0|#define PARSED_A    (1<<1)
  ------------------
  603|      0|            }
  604|  2.96M|        } else if (complex_tag("pos")) {
  ------------------
  |  |  350|  2.96M|#define complex_tag(name) mystrcmp(&p, (name))
  |  |  ------------------
  |  |  |  Branch (350:27): [True: 0, False: 2.96M]
  |  |  ------------------
  ------------------
  605|      0|            double v1, v2;
  606|      0|            if (nargs == 2) {
  ------------------
  |  Branch (606:17): [True: 0, False: 0]
  ------------------
  607|      0|                v1 = argtod(args[0]);
  608|      0|                v2 = argtod(args[1]);
  609|      0|            } else
  610|      0|                continue;
  611|      0|            if (state->evt_type & EVENT_POSITIONED) {
  ------------------
  |  Branch (611:17): [True: 0, False: 0]
  ------------------
  612|      0|                ass_msg(render_priv->library, MSGL_V, "Subtitle has a new \\pos "
  ------------------
  |  |   43|      0|#define MSGL_V 6
  ------------------
  613|      0|                       "after \\move or \\pos, ignoring");
  614|      0|            } else {
  615|      0|                state->evt_type |= EVENT_POSITIONED;
  616|      0|                state->detect_collisions = 0;
  617|      0|                state->pos_x = v1;
  618|      0|                state->pos_y = v2;
  619|      0|            }
  620|  2.96M|        } else if (complex_tag("fade") || complex_tag("fad")) {
  ------------------
  |  |  350|  5.93M|#define complex_tag(name) mystrcmp(&p, (name))
  |  |  ------------------
  |  |  |  Branch (350:27): [True: 54, False: 2.96M]
  |  |  ------------------
  ------------------
                      } else if (complex_tag("fade") || complex_tag("fad")) {
  ------------------
  |  |  350|  2.96M|#define complex_tag(name) mystrcmp(&p, (name))
  |  |  ------------------
  |  |  |  Branch (350:27): [True: 0, False: 2.96M]
  |  |  ------------------
  ------------------
  621|     54|            int32_t a1, a2, a3;
  622|     54|            int32_t t1, t2, t3, t4;
  623|     54|            if (nargs == 2) {
  ------------------
  |  Branch (623:17): [True: 0, False: 54]
  ------------------
  624|       |                // 2-argument version (\fad, according to specs)
  625|      0|                a1 = 0xFF;
  626|      0|                a2 = 0;
  627|      0|                a3 = 0xFF;
  628|      0|                t1 = -1;
  629|      0|                t2 = argtoi32(args[0]);
  630|      0|                t3 = argtoi32(args[1]);
  631|      0|                t4 = -1;
  632|     54|            } else if (nargs == 7) {
  ------------------
  |  Branch (632:24): [True: 0, False: 54]
  ------------------
  633|       |                // 7-argument version (\fade)
  634|      0|                a1 = argtoi32(args[0]);
  635|      0|                a2 = argtoi32(args[1]);
  636|      0|                a3 = argtoi32(args[2]);
  637|      0|                t1 = argtoi32(args[3]);
  638|      0|                t2 = argtoi32(args[4]);
  639|      0|                t3 = argtoi32(args[5]);
  640|      0|                t4 = argtoi32(args[6]);
  641|      0|            } else
  642|     54|                continue;
  643|      0|            if (t1 == -1 && t4 == -1) {
  ------------------
  |  Branch (643:17): [True: 0, False: 0]
  |  Branch (643:29): [True: 0, False: 0]
  ------------------
  644|      0|                t1 = 0;
  645|      0|                t4 = state->event->Duration;
  646|      0|                t3 = (uint32_t) t4 - t3;
  647|      0|            }
  648|      0|            if ((state->parsed_tags & PARSED_FADE) == 0) {
  ------------------
  |  |   49|      0|#define PARSED_FADE (1<<0)
  ------------------
  |  Branch (648:17): [True: 0, False: 0]
  ------------------
  649|      0|                state->fade =
  650|      0|                    interpolate_alpha(render_priv->time -
  651|      0|                            state->event->Start, t1, t2,
  652|      0|                            t3, t4, a1, a2, a3);
  653|      0|                state->parsed_tags |= PARSED_FADE;
  ------------------
  |  |   49|      0|#define PARSED_FADE (1<<0)
  ------------------
  654|      0|            }
  655|  2.96M|        } else if (complex_tag("org")) {
  ------------------
  |  |  350|  2.96M|#define complex_tag(name) mystrcmp(&p, (name))
  |  |  ------------------
  |  |  |  Branch (350:27): [True: 0, False: 2.96M]
  |  |  ------------------
  ------------------
  656|      0|            double v1, v2;
  657|      0|            if (nargs == 2) {
  ------------------
  |  Branch (657:17): [True: 0, False: 0]
  ------------------
  658|      0|                v1 = argtod(args[0]);
  659|      0|                v2 = argtod(args[1]);
  660|      0|            } else
  661|      0|                continue;
  662|      0|            if (!state->have_origin) {
  ------------------
  |  Branch (662:17): [True: 0, False: 0]
  ------------------
  663|      0|                state->org_x = v1;
  664|      0|                state->org_y = v2;
  665|      0|                state->have_origin = 1;
  666|      0|                state->detect_collisions = 0;
  667|      0|            }
  668|  2.96M|        } else if (complex_tag("t")) {
  ------------------
  |  |  350|  2.96M|#define complex_tag(name) mystrcmp(&p, (name))
  |  |  ------------------
  |  |  |  Branch (350:27): [True: 255k, False: 2.71M]
  |  |  ------------------
  ------------------
  669|   255k|            double accel;
  670|   255k|            int cnt = nargs - 1;
  671|   255k|            int32_t t1, t2, t, delta_t;
  672|   255k|            double k;
  673|       |            // VSFilter compatibility (because we can): parse the
  674|       |            // timestamps differently depending on argument count.
  675|   255k|            if (cnt == 3) {
  ------------------
  |  Branch (675:17): [True: 0, False: 255k]
  ------------------
  676|      0|                t1 = argtoi32(args[0]);
  677|      0|                t2 = argtoi32(args[1]);
  678|      0|                accel = argtod(args[2]);
  679|   255k|            } else if (cnt == 2) {
  ------------------
  |  Branch (679:24): [True: 0, False: 255k]
  ------------------
  680|      0|                t1 = dtoi32(argtod(args[0]));
  681|      0|                t2 = dtoi32(argtod(args[1]));
  682|      0|                accel = 1.;
  683|   255k|            } else if (cnt == 1) {
  ------------------
  |  Branch (683:24): [True: 204k, False: 51.1k]
  ------------------
  684|   204k|                t1 = 0;
  685|   204k|                t2 = 0;
  686|   204k|                accel = argtod(args[0]);
  687|   204k|            } else {
  688|  51.1k|                t1 = 0;
  689|  51.1k|                t2 = 0;
  690|  51.1k|                accel = 1.;
  691|  51.1k|            }
  692|   255k|            state->detect_collisions = 0;
  693|   255k|            if (t2 == 0)
  ------------------
  |  Branch (693:17): [True: 255k, False: 0]
  ------------------
  694|   255k|                t2 = state->event->Duration;
  695|   255k|            delta_t = (uint32_t) t2 - t1;
  696|   255k|            t = render_priv->time - state->event->Start;        // FIXME: move to render_context
  697|   255k|            if (t < t1)
  ------------------
  |  Branch (697:17): [True: 0, False: 255k]
  ------------------
  698|      0|                k = 0.;
  699|   255k|            else if (t >= t2)
  ------------------
  |  Branch (699:22): [True: 0, False: 255k]
  ------------------
  700|      0|                k = 1.;
  701|   255k|            else {
  702|   255k|                assert(delta_t != 0.);
  703|   255k|                k = pow((double) (int32_t) ((uint32_t) t - t1) / delta_t, accel);
  704|   255k|            }
  705|   255k|            if (nested)
  ------------------
  |  Branch (705:17): [True: 51.1k, False: 204k]
  ------------------
  706|  51.1k|                pwr = k;
  707|   255k|            if (cnt < 0 || cnt > 3)
  ------------------
  |  Branch (707:17): [True: 0, False: 255k]
  |  Branch (707:28): [True: 0, False: 255k]
  ------------------
  708|      0|                continue;
  709|       |            // If there's no backslash in the arguments, there are no
  710|       |            // override tags, so it's pointless to try to parse them.
  711|   255k|            if (!has_backslash_arg)
  ------------------
  |  Branch (711:17): [True: 0, False: 255k]
  ------------------
  712|      0|                continue;
  713|   255k|            p = args[cnt].start;
  714|   255k|            if (args[cnt].end < end) {
  ------------------
  |  Branch (714:17): [True: 0, False: 255k]
  ------------------
  715|      0|                assert(!nested);
  716|      0|                p = ass_parse_tags(state, p, args[cnt].end, k, true);
  717|   255k|            } else {
  718|   255k|                assert(q == end);
  719|       |                // No other tags can possibly follow this \t tag,
  720|       |                // so we don't need to restore pwr after parsing \t.
  721|       |                // The recursive call is now essentially a tail call,
  722|       |                // so optimize it away.
  723|   255k|                pwr = k;
  724|   255k|                nested = true;
  725|   255k|                q = p;
  726|   255k|            }
  727|  2.71M|        } else if (complex_tag("clip")) {
  ------------------
  |  |  350|  2.71M|#define complex_tag(name) mystrcmp(&p, (name))
  |  |  ------------------
  |  |  |  Branch (350:27): [True: 0, False: 2.71M]
  |  |  ------------------
  ------------------
  728|      0|            if (nargs == 4) {
  ------------------
  |  Branch (728:17): [True: 0, False: 0]
  ------------------
  729|      0|                int32_t x0, y0, x1, y1;
  730|      0|                x0 = argtoi32(args[0]);
  731|      0|                y0 = argtoi32(args[1]);
  732|      0|                x1 = argtoi32(args[2]);
  733|      0|                y1 = argtoi32(args[3]);
  734|      0|                state->clip_x0 =
  735|      0|                    state->clip_x0 * (1 - pwr) + x0 * pwr;
  736|      0|                state->clip_x1 =
  737|      0|                    state->clip_x1 * (1 - pwr) + x1 * pwr;
  738|      0|                state->clip_y0 =
  739|      0|                    state->clip_y0 * (1 - pwr) + y0 * pwr;
  740|      0|                state->clip_y1 =
  741|      0|                    state->clip_y1 * (1 - pwr) + y1 * pwr;
  742|      0|                state->clip_mode = 0;
  743|      0|            } else if (!state->clip_drawing_text.str) {
  ------------------
  |  Branch (743:24): [True: 0, False: 0]
  ------------------
  744|      0|                if (parse_vector_clip(state, args, nargs))
  ------------------
  |  Branch (744:21): [True: 0, False: 0]
  ------------------
  745|      0|                    state->clip_drawing_mode = 0;
  746|      0|            }
  747|  2.71M|        } else if (tag("c") || tag("1c")) {
  ------------------
  |  |  349|  5.42M|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 2.55M, False: 154k]
  |  |  |  Branch (349:44): [True: 2.55M, False: 0]
  |  |  ------------------
  ------------------
                      } else if (tag("c") || tag("1c")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 154k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  748|  2.55M|            if (nargs) {
  ------------------
  |  Branch (748:17): [True: 1.48M, False: 1.07M]
  ------------------
  749|  1.48M|                uint32_t val = parse_color_tag(args->start);
  750|  1.48M|                change_color(&state->c[0], val, pwr);
  751|  1.48M|            } else
  752|  1.07M|                change_color(&state->c[0],
  753|  1.07M|                             state->style->PrimaryColour, 1);
  754|  2.55M|        } else if (tag("2c")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 18, False: 154k]
  |  |  |  Branch (349:44): [True: 18, False: 0]
  |  |  ------------------
  ------------------
  755|     18|            if (nargs) {
  ------------------
  |  Branch (755:17): [True: 18, False: 0]
  ------------------
  756|     18|                uint32_t val = parse_color_tag(args->start);
  757|     18|                change_color(&state->c[1], val, pwr);
  758|     18|            } else
  759|      0|                change_color(&state->c[1],
  760|      0|                             state->style->SecondaryColour, 1);
  761|   154k|        } else if (tag("3c")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 154k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  762|      0|            if (nargs) {
  ------------------
  |  Branch (762:17): [True: 0, False: 0]
  ------------------
  763|      0|                uint32_t val = parse_color_tag(args->start);
  764|      0|                change_color(&state->c[2], val, pwr);
  765|      0|            } else
  766|      0|                change_color(&state->c[2],
  767|      0|                             state->style->OutlineColour, 1);
  768|   154k|        } else if (tag("4c")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 4, False: 154k]
  |  |  |  Branch (349:44): [True: 4, False: 0]
  |  |  ------------------
  ------------------
  769|      4|            if (nargs) {
  ------------------
  |  Branch (769:17): [True: 4, False: 0]
  ------------------
  770|      4|                uint32_t val = parse_color_tag(args->start);
  771|      4|                change_color(&state->c[3], val, pwr);
  772|      4|            } else
  773|      0|                change_color(&state->c[3],
  774|      0|                             state->style->BackColour, 1);
  775|   154k|        } else if (tag("1a")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 154k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  776|      0|            if (nargs) {
  ------------------
  |  Branch (776:17): [True: 0, False: 0]
  ------------------
  777|      0|                uint32_t val = parse_alpha_tag(args->start);
  778|      0|                change_alpha(&state->c[0], val, pwr);
  779|      0|            } else
  780|      0|                change_alpha(&state->c[0],
  781|      0|                             _a(state->style->PrimaryColour), 1);
  ------------------
  |  |   29|      0|#define _a(c)   ((c) & 0xFF)
  ------------------
  782|   154k|        } else if (tag("2a")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 154k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  783|      0|            if (nargs) {
  ------------------
  |  Branch (783:17): [True: 0, False: 0]
  ------------------
  784|      0|                uint32_t val = parse_alpha_tag(args->start);
  785|      0|                change_alpha(&state->c[1], val, pwr);
  786|      0|            } else
  787|      0|                change_alpha(&state->c[1],
  788|      0|                             _a(state->style->SecondaryColour), 1);
  ------------------
  |  |   29|      0|#define _a(c)   ((c) & 0xFF)
  ------------------
  789|   154k|        } else if (tag("3a")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 154k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  790|      0|            if (nargs) {
  ------------------
  |  Branch (790:17): [True: 0, False: 0]
  ------------------
  791|      0|                uint32_t val = parse_alpha_tag(args->start);
  792|      0|                change_alpha(&state->c[2], val, pwr);
  793|      0|            } else
  794|      0|                change_alpha(&state->c[2],
  795|      0|                             _a(state->style->OutlineColour), 1);
  ------------------
  |  |   29|      0|#define _a(c)   ((c) & 0xFF)
  ------------------
  796|   154k|        } else if (tag("4a")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 154k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  797|      0|            if (nargs) {
  ------------------
  |  Branch (797:17): [True: 0, False: 0]
  ------------------
  798|      0|                uint32_t val = parse_alpha_tag(args->start);
  799|      0|                change_alpha(&state->c[3], val, pwr);
  800|      0|            } else
  801|      0|                change_alpha(&state->c[3],
  802|      0|                             _a(state->style->BackColour), 1);
  ------------------
  |  |   29|      0|#define _a(c)   ((c) & 0xFF)
  ------------------
  803|   154k|        } else if (tag("r")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 80, False: 154k]
  |  |  |  Branch (349:44): [True: 80, False: 0]
  |  |  ------------------
  ------------------
  804|     80|            if (nargs) {
  ------------------
  |  Branch (804:17): [True: 16, False: 64]
  ------------------
  805|     16|                int len = args->end - args->start;
  806|     16|                ass_reset_render_context(state,
  807|     16|                        lookup_style_strict(render_priv->track, args->start, len));
  808|     16|            } else
  809|     64|                ass_reset_render_context(state, NULL);
  810|   154k|        } else if (tag("be")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 154k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  811|      0|            double dval;
  812|      0|            if (nargs) {
  ------------------
  |  Branch (812:17): [True: 0, False: 0]
  ------------------
  813|      0|                int32_t val;
  814|      0|                dval = argtod(*args);
  815|       |                // VSFilter always adds +0.5, even if the value is negative
  816|      0|                val = dtoi32(state->be * (1 - pwr) + dval * pwr + 0.5);
  817|       |                // Clamp to a safe upper limit, since high values need excessive CPU
  818|      0|                val = (val < 0) ? 0 : val;
  ------------------
  |  Branch (818:23): [True: 0, False: 0]
  ------------------
  819|      0|                val = (val > MAX_BE) ? MAX_BE : val;
  ------------------
  |  |   32|      0|#define MAX_BE 127
  ------------------
                              val = (val > MAX_BE) ? MAX_BE : val;
  ------------------
  |  |   32|      0|#define MAX_BE 127
  ------------------
  |  Branch (819:23): [True: 0, False: 0]
  ------------------
  820|      0|                state->be = val;
  821|      0|            } else
  822|      0|                state->be = 0;
  823|   154k|        } else if (tag("b")) {
  ------------------
  |  |  349|   154k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 780, False: 153k]
  |  |  |  Branch (349:44): [True: 780, False: 0]
  |  |  ------------------
  ------------------
  824|    780|            int32_t val = argtoi32(*args);
  825|    780|            if (!nargs || !(val == 0 || val == 1 || val >= 100))
  ------------------
  |  Branch (825:17): [True: 90, False: 690]
  |  Branch (825:29): [True: 6, False: 684]
  |  Branch (825:41): [True: 0, False: 684]
  |  Branch (825:53): [True: 684, False: 0]
  ------------------
  826|     90|                val = state->style->Bold;
  827|    780|            state->bold = val;
  828|    780|            ass_update_font(state);
  829|   153k|        } else if (tag("i")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 84, False: 153k]
  |  |  |  Branch (349:44): [True: 84, False: 0]
  |  |  ------------------
  ------------------
  830|     84|            int32_t val = argtoi32(*args);
  831|     84|            if (!nargs || !(val == 0 || val == 1))
  ------------------
  |  Branch (831:17): [True: 0, False: 84]
  |  Branch (831:29): [True: 84, False: 0]
  |  Branch (831:41): [True: 0, False: 0]
  ------------------
  832|      0|                val = state->style->Italic;
  833|     84|            state->italic = val;
  834|     84|            ass_update_font(state);
  835|   153k|        } else if (tag("kt")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  836|       |            // v4++
  837|      0|            double val = 0;
  838|      0|            if (nargs)
  ------------------
  |  Branch (838:17): [True: 0, False: 0]
  ------------------
  839|      0|                val = argtod(*args) * 10;
  840|      0|            state->effect_skip_timing = dtoi32(val);
  841|      0|            state->effect_timing = 0;
  842|      0|            state->reset_effect = true;
  843|   153k|        } else if (tag("kf") || tag("K")) {
  ------------------
  |  |  349|   307k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                      } else if (tag("kf") || tag("K")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  844|      0|            double val = 100;
  845|      0|            if (nargs)
  ------------------
  |  Branch (845:17): [True: 0, False: 0]
  ------------------
  846|      0|                val = argtod(*args);
  847|      0|            state->effect_type = EF_KARAOKE_KF;
  848|      0|            state->effect_skip_timing +=
  849|      0|                    (uint32_t) state->effect_timing;
  850|      0|            state->effect_timing = dtoi32(val * 10);
  851|   153k|        } else if (tag("ko")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  852|      0|            double val = 100;
  853|      0|            if (nargs)
  ------------------
  |  Branch (853:17): [True: 0, False: 0]
  ------------------
  854|      0|                val = argtod(*args);
  855|      0|            state->effect_type = EF_KARAOKE_KO;
  856|      0|            state->effect_skip_timing +=
  857|      0|                    (uint32_t) state->effect_timing;
  858|      0|            state->effect_timing = dtoi32(val * 10);
  859|   153k|        } else if (tag("k")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  860|      0|            double val = 100;
  861|      0|            if (nargs)
  ------------------
  |  Branch (861:17): [True: 0, False: 0]
  ------------------
  862|      0|                val = argtod(*args);
  863|      0|            state->effect_type = EF_KARAOKE;
  864|      0|            state->effect_skip_timing +=
  865|      0|                    (uint32_t) state->effect_timing;
  866|      0|            state->effect_timing = dtoi32(val * 10);
  867|   153k|        } else if (tag("shad")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  868|      0|            double val, xval, yval;
  869|      0|            if (nargs) {
  ------------------
  |  Branch (869:17): [True: 0, False: 0]
  ------------------
  870|      0|                val = argtod(*args);
  871|      0|                xval = state->shadow_x * (1 - pwr) + val * pwr;
  872|      0|                yval = state->shadow_y * (1 - pwr) + val * pwr;
  873|       |                // VSFilter compatibility: clip for \shad but not for \[xy]shad
  874|      0|                xval = (xval < 0) ? 0 : xval;
  ------------------
  |  Branch (874:24): [True: 0, False: 0]
  ------------------
  875|      0|                yval = (yval < 0) ? 0 : yval;
  ------------------
  |  Branch (875:24): [True: 0, False: 0]
  ------------------
  876|      0|            } else
  877|      0|                xval = yval = state->style->Shadow;
  878|      0|            state->shadow_x = xval;
  879|      0|            state->shadow_y = yval;
  880|   153k|        } else if (tag("s")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  881|      0|            int32_t val = argtoi32(*args);
  882|      0|            if (!nargs || !(val == 0 || val == 1))
  ------------------
  |  Branch (882:17): [True: 0, False: 0]
  |  Branch (882:29): [True: 0, False: 0]
  |  Branch (882:41): [True: 0, False: 0]
  ------------------
  883|      0|                val = state->style->StrikeOut;
  884|      0|            if (val)
  ------------------
  |  Branch (884:17): [True: 0, False: 0]
  ------------------
  885|      0|                state->flags |= DECO_STRIKETHROUGH;
  ------------------
  |  |   38|      0|#define DECO_STRIKETHROUGH 2
  ------------------
  886|      0|            else
  887|      0|                state->flags &= ~DECO_STRIKETHROUGH;
  ------------------
  |  |   38|      0|#define DECO_STRIKETHROUGH 2
  ------------------
  888|   153k|        } else if (tag("u")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 72, False: 153k]
  |  |  |  Branch (349:44): [True: 72, False: 0]
  |  |  ------------------
  ------------------
  889|     72|            int32_t val = argtoi32(*args);
  890|     72|            if (!nargs || !(val == 0 || val == 1))
  ------------------
  |  Branch (890:17): [True: 0, False: 72]
  |  Branch (890:29): [True: 36, False: 36]
  |  Branch (890:41): [True: 0, False: 36]
  ------------------
  891|     36|                val = state->style->Underline;
  892|     72|            if (val)
  ------------------
  |  Branch (892:17): [True: 0, False: 72]
  ------------------
  893|      0|                state->flags |= DECO_UNDERLINE;
  ------------------
  |  |   37|      0|#define DECO_UNDERLINE     1
  ------------------
  894|     72|            else
  895|     72|                state->flags &= ~DECO_UNDERLINE;
  ------------------
  |  |   37|     72|#define DECO_UNDERLINE     1
  ------------------
  896|   153k|        } else if (tag("pbo")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  897|      0|            double val = argtod(*args);
  898|      0|            state->pbo = val;
  899|   153k|        } else if (tag("p")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  900|      0|            int32_t val = argtoi32(*args);
  901|      0|            val = (val < 0) ? 0 : val;
  ------------------
  |  Branch (901:19): [True: 0, False: 0]
  ------------------
  902|      0|            state->drawing_scale = val;
  903|   153k|        } else if (tag("q")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  904|      0|            int32_t val = argtoi32(*args);
  905|      0|            if (!nargs || !(val >= 0 && val <= 3))
  ------------------
  |  Branch (905:17): [True: 0, False: 0]
  |  Branch (905:29): [True: 0, False: 0]
  |  Branch (905:41): [True: 0, False: 0]
  ------------------
  906|      0|                val = render_priv->track->WrapStyle;
  907|      0|            state->wrap_style = val;
  908|   153k|        } else if (tag("fe")) {
  ------------------
  |  |  349|   153k|#define tag(name) (mystrcmp(&p, (name)) && (push_arg(args, &nargs, p, name_end), 1))
  |  |  ------------------
  |  |  |  Branch (349:20): [True: 0, False: 153k]
  |  |  |  Branch (349:44): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  909|      0|            int32_t val;
  910|      0|            if (nargs)
  ------------------
  |  Branch (910:17): [True: 0, False: 0]
  ------------------
  911|      0|                val = argtoi32(*args);
  912|      0|            else
  913|      0|                val = state->style->Encoding;
  914|      0|            state->font_encoding = val;
  915|      0|        }
  916|  3.27M|    }
  917|       |
  918|   256k|    return p;
  919|   256k|}
ass_apply_transition_effects:
  922|   511k|{
  923|   511k|    ASS_Renderer *render_priv = state->renderer;
  924|   511k|    int v[4];
  925|   511k|    int cnt;
  926|   511k|    ASS_Event *event = state->event;
  927|   511k|    char *p = event->Effect;
  928|       |
  929|   511k|    if (!p || !*p)
  ------------------
  |  Branch (929:9): [True: 0, False: 511k]
  |  Branch (929:15): [True: 307k, False: 204k]
  ------------------
  930|   307k|        return;
  931|       |
  932|   204k|    cnt = 0;
  933|   204k|    while (cnt < 4 && (p = strchr(p, ';'))) {
  ------------------
  |  Branch (933:12): [True: 204k, False: 0]
  |  Branch (933:23): [True: 0, False: 204k]
  ------------------
  934|      0|        v[cnt++] = atoi(++p);
  935|      0|    }
  936|       |
  937|   204k|    ASS_Vector layout_res = ass_layout_res(render_priv);
  938|   204k|    if (strncmp(event->Effect, "Banner;", 7) == 0) {
  ------------------
  |  Branch (938:9): [True: 0, False: 204k]
  ------------------
  939|      0|        double delay;
  940|      0|        if (cnt < 1) {
  ------------------
  |  Branch (940:13): [True: 0, False: 0]
  ------------------
  941|      0|            ass_msg(render_priv->library, MSGL_V,
  ------------------
  |  |   43|      0|#define MSGL_V 6
  ------------------
  942|      0|                    "Error parsing effect: '%s'", event->Effect);
  943|      0|            return;
  944|      0|        }
  945|      0|        if (cnt >= 2 && v[1])   // left-to-right
  ------------------
  |  Branch (945:13): [True: 0, False: 0]
  |  Branch (945:25): [True: 0, False: 0]
  ------------------
  946|      0|            state->scroll_direction = SCROLL_LR;
  947|      0|        else                    // right-to-left
  948|      0|            state->scroll_direction = SCROLL_RL;
  949|       |
  950|      0|        delay = v[0];
  951|       |        // VSF works in storage coordinates, but scales delay to PlayRes canvas
  952|       |        // before applying max(scaled_ delay, 1). This means, if scaled_delay < 1
  953|       |        // (esp. delay=0) we end up with 1 ms per _storage pixel_ without any
  954|       |        // PlayRes scaling.
  955|       |        // The way libass deals with delay, it is automatically relative to the
  956|       |        // PlayRes canvas, so we only want to "unscale" the small delay values.
  957|       |        //
  958|       |        // VSF also casts the scaled delay to int, which if not emulated leads to
  959|       |        // easily noticeable deviations from VSFilter as the effect goes on.
  960|       |        // To achieve both we need to keep our Playres-relative delay with high precision,
  961|       |        // but must temporarily convert to storage-relative and truncate and take the
  962|       |        // maxuimum there, before converting back.
  963|      0|        double scale_x = ((double) layout_res.x) / render_priv->track->PlayResX;
  964|      0|        delay = ((int) FFMAX(delay / scale_x, 1)) * scale_x;
  ------------------
  |  |   46|      0|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  965|      0|        state->scroll_shift =
  966|      0|            (render_priv->time - event->Start) / delay;
  967|      0|        state->evt_type |= EVENT_HSCROLL;
  968|      0|        state->detect_collisions = 0;
  969|      0|        state->wrap_style = 2;
  970|      0|        return;
  971|      0|    }
  972|       |
  973|   204k|    if (strncmp(event->Effect, "Scroll up;", 10) == 0) {
  ------------------
  |  Branch (973:9): [True: 0, False: 204k]
  ------------------
  974|      0|        state->scroll_direction = SCROLL_BT;
  975|   204k|    } else if (strncmp(event->Effect, "Scroll down;", 12) == 0) {
  ------------------
  |  Branch (975:16): [True: 0, False: 204k]
  ------------------
  976|      0|        state->scroll_direction = SCROLL_TB;
  977|   204k|    } else {
  978|   204k|        ass_msg(render_priv->library, MSGL_DBG2,
  ------------------
  |  |   44|   204k|#define MSGL_DBG2 7
  ------------------
  979|   204k|                "Unknown transition effect: '%s'", event->Effect);
  980|   204k|        return;
  981|   204k|    }
  982|       |    // parse scroll up/down parameters
  983|      0|    {
  984|      0|        double delay;
  985|      0|        int y0, y1;
  986|      0|        if (cnt < 3) {
  ------------------
  |  Branch (986:13): [True: 0, False: 0]
  ------------------
  987|      0|            ass_msg(render_priv->library, MSGL_V,
  ------------------
  |  |   43|      0|#define MSGL_V 6
  ------------------
  988|      0|                    "Error parsing effect: '%s'", event->Effect);
  989|      0|            return;
  990|      0|        }
  991|      0|        delay = v[2];
  992|       |        // See explanation for Banner
  993|      0|        double scale_y = ((double) layout_res.y) / render_priv->track->PlayResY;
  994|      0|        delay = ((int) FFMAX(delay / scale_y, 1)) * scale_y;
  ------------------
  |  |   46|      0|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  995|      0|        state->scroll_shift =
  996|      0|            (render_priv->time - event->Start) / delay;
  997|      0|        if (v[0] < v[1]) {
  ------------------
  |  Branch (997:13): [True: 0, False: 0]
  ------------------
  998|      0|            y0 = v[0];
  999|      0|            y1 = v[1];
 1000|      0|        } else {
 1001|      0|            y0 = v[1];
 1002|      0|            y1 = v[0];
 1003|      0|        }
 1004|      0|        state->scroll_y0 = y0;
 1005|      0|        state->scroll_y1 = y1;
 1006|      0|        state->evt_type |= EVENT_VSCROLL;
 1007|      0|        state->detect_collisions = 0;
 1008|      0|    }
 1009|       |
 1010|      0|}
ass_process_karaoke_effects:
 1024|   204k|{
 1025|   204k|    TextInfo *text_info = state->text_info;
 1026|   204k|    long long tm_current = state->renderer->time - state->event->Start;
 1027|       |
 1028|   204k|    int32_t timing = 0, skip_timing = 0;
 1029|   204k|    Effect effect_type = EF_NONE;
 1030|   204k|    GlyphInfo *last_boundary = NULL;
 1031|   204k|    bool has_reset = false;
 1032|  3.34M|    for (int i = 0; i <= text_info->length; i++) {
  ------------------
  |  Branch (1032:21): [True: 3.13M, False: 204k]
  ------------------
 1033|  3.13M|        if (i < text_info->length &&
  ------------------
  |  Branch (1033:13): [True: 2.93M, False: 204k]
  ------------------
 1034|  3.13M|            !text_info->glyphs[i].starts_new_run) {
  ------------------
  |  Branch (1034:13): [True: 2.72M, False: 204k]
  ------------------
 1035|       |
 1036|  2.72M|            if (text_info->glyphs[i].reset_effect) {
  ------------------
  |  Branch (1036:17): [True: 0, False: 2.72M]
  ------------------
 1037|      0|                has_reset = true;
 1038|      0|                skip_timing = 0;
 1039|      0|            }
 1040|       |
 1041|       |            // VSFilter compatibility: if we have \k12345\k0 without a run
 1042|       |            // break, subsequent text is still part of the same karaoke word,
 1043|       |            // the current word's starting and ending time stay unchanged,
 1044|       |            // but the starting time of the next karaoke word is advanced.
 1045|  2.72M|            skip_timing += (uint32_t) text_info->glyphs[i].effect_skip_timing;
 1046|  2.72M|            continue;
 1047|  2.72M|        }
 1048|       |
 1049|   409k|        GlyphInfo *start = last_boundary;
 1050|   409k|        GlyphInfo *end = text_info->glyphs + i;
 1051|   409k|        last_boundary = end;
 1052|   409k|        if (!start)
  ------------------
  |  Branch (1052:13): [True: 204k, False: 204k]
  ------------------
 1053|   204k|            continue;
 1054|       |
 1055|   204k|        if (start->effect_type != EF_NONE)
  ------------------
  |  Branch (1055:13): [True: 0, False: 204k]
  ------------------
 1056|      0|            effect_type = start->effect_type;
 1057|   204k|        if (effect_type == EF_NONE)
  ------------------
  |  Branch (1057:13): [True: 204k, False: 0]
  ------------------
 1058|   204k|            continue;
 1059|       |
 1060|      0|        if (start->reset_effect)
  ------------------
  |  Branch (1060:13): [True: 0, False: 0]
  ------------------
 1061|      0|            timing = 0;
 1062|       |
 1063|      0|        long long tm_start = timing + start->effect_skip_timing;
 1064|      0|        long long tm_end = tm_start + start->effect_timing;
 1065|      0|        timing = !has_reset * tm_end + skip_timing;
 1066|      0|        skip_timing = 0;
 1067|      0|        has_reset = false;
 1068|       |
 1069|      0|        if (effect_type != EF_KARAOKE_KF)
  ------------------
  |  Branch (1069:13): [True: 0, False: 0]
  ------------------
 1070|      0|            tm_end = tm_start;
 1071|       |
 1072|      0|        int x;
 1073|      0|        if (tm_current < tm_start)
  ------------------
  |  Branch (1073:13): [True: 0, False: 0]
  ------------------
 1074|      0|            x = -100000000;
 1075|      0|        else if (tm_current >= tm_end)
  ------------------
  |  Branch (1075:18): [True: 0, False: 0]
  ------------------
 1076|      0|            x = 100000000;
 1077|      0|        else {
 1078|      0|            GlyphInfo *first_visible = start, *last_visible = end - 1;
 1079|      0|            while (first_visible < last_visible && first_visible->skip)
  ------------------
  |  Branch (1079:20): [True: 0, False: 0]
  |  Branch (1079:52): [True: 0, False: 0]
  ------------------
 1080|      0|                ++first_visible;
 1081|      0|            while (first_visible < last_visible && last_visible->skip)
  ------------------
  |  Branch (1081:20): [True: 0, False: 0]
  |  Branch (1081:52): [True: 0, False: 0]
  ------------------
 1082|      0|                --last_visible;
 1083|       |
 1084|      0|            int x_start = first_visible->pos.x;
 1085|      0|            int x_end = last_visible->pos.x + last_visible->advance.x;
 1086|      0|            double dt = (double) (tm_current - tm_start) / (tm_end - tm_start);
 1087|      0|            double frz = fmod(start->frz, 360);
 1088|      0|            if (frz > 90 && frz < 270) {
  ------------------
  |  Branch (1088:17): [True: 0, False: 0]
  |  Branch (1088:29): [True: 0, False: 0]
  ------------------
 1089|       |                // Fill from right to left
 1090|      0|                dt = 1 - dt;
 1091|      0|                for (GlyphInfo *info = start; info < end; info++) {
  ------------------
  |  Branch (1091:47): [True: 0, False: 0]
  ------------------
 1092|      0|                    uint32_t tmp = info->c[0];
 1093|      0|                    info->c[0] = info->c[1];
 1094|      0|                    info->c[1] = tmp;
 1095|      0|                }
 1096|      0|            }
 1097|      0|            x = x_start + lrint((x_end - x_start) * dt);
 1098|      0|        }
 1099|       |
 1100|      0|        for (GlyphInfo *info = start; info < end; info++) {
  ------------------
  |  Branch (1100:39): [True: 0, False: 0]
  ------------------
 1101|      0|            info->effect_type = effect_type;
 1102|      0|            info->effect_timing = x - info->pos.x;
 1103|      0|        }
 1104|      0|    }
 1105|   204k|}
ass_get_next_char:
 1115|  2.93M|{
 1116|  2.93M|    char *p = *str;
 1117|  2.93M|    unsigned chr;
 1118|  2.93M|    if (*p == '\t') {
  ------------------
  |  Branch (1118:9): [True: 0, False: 2.93M]
  ------------------
 1119|      0|        ++p;
 1120|      0|        *str = p;
 1121|      0|        return ' ';
 1122|      0|    }
 1123|  2.93M|    if (*p == '\\') {
  ------------------
  |  Branch (1123:9): [True: 205k, False: 2.72M]
  ------------------
 1124|   205k|        if ((p[1] == 'N') || ((p[1] == 'n') &&
  ------------------
  |  Branch (1124:13): [True: 0, False: 205k]
  |  Branch (1124:31): [True: 204k, False: 615]
  ------------------
 1125|   205k|                              (state->wrap_style == 2))) {
  ------------------
  |  Branch (1125:31): [True: 0, False: 204k]
  ------------------
 1126|      0|            p += 2;
 1127|      0|            *str = p;
 1128|      0|            return '\n';
 1129|   205k|        } else if (p[1] == 'n') {
  ------------------
  |  Branch (1129:20): [True: 204k, False: 615]
  ------------------
 1130|   204k|            p += 2;
 1131|   204k|            *str = p;
 1132|   204k|            return ' ';
 1133|   204k|        } else if (p[1] == 'h') {
  ------------------
  |  Branch (1133:20): [True: 0, False: 615]
  ------------------
 1134|      0|            p += 2;
 1135|      0|            *str = p;
 1136|      0|            return NBSP;
  ------------------
  |  |   33|      0|#define NBSP 0xa0   // unicode non-breaking space character
  ------------------
 1137|    615|        } else if (p[1] == '{') {
  ------------------
  |  Branch (1137:20): [True: 0, False: 615]
  ------------------
 1138|      0|            p += 2;
 1139|      0|            *str = p;
 1140|      0|            return '{';
 1141|    615|        } else if (p[1] == '}') {
  ------------------
  |  Branch (1141:20): [True: 0, False: 615]
  ------------------
 1142|      0|            p += 2;
 1143|      0|            *str = p;
 1144|      0|            return '}';
 1145|      0|        }
 1146|   205k|    }
 1147|  2.72M|    chr = ass_utf8_get_char((char **) &p);
 1148|  2.72M|    *str = p;
 1149|  2.72M|    return chr;
 1150|  2.93M|}
ass_event_has_hard_overrides:
 1155|   511k|{
 1156|       |    // look for \pos and \move tags inside {...}
 1157|       |    // mirrors ass_get_next_char, but is faster and doesn't change any global state
 1158|  1.68M|    while (*str) {
  ------------------
  |  Branch (1158:12): [True: 1.17M, False: 511k]
  ------------------
 1159|  1.17M|        if (str[0] == '\\' && str[1] != '\0') {
  ------------------
  |  Branch (1159:13): [True: 153k, False: 1.02M]
  |  Branch (1159:31): [True: 153k, False: 0]
  ------------------
 1160|   153k|            str += 2;
 1161|  1.02M|        } else if (str[0] == '{') {
  ------------------
  |  Branch (1161:20): [True: 307k, False: 717k]
  ------------------
 1162|   307k|            str++;
 1163|  30.2M|            while (*str && *str != '}') {
  ------------------
  |  Branch (1163:20): [True: 30.2M, False: 51.1k]
  |  Branch (1163:28): [True: 29.9M, False: 255k]
  ------------------
 1164|  29.9M|                if (*str == '\\') {
  ------------------
  |  Branch (1164:21): [True: 3.53M, False: 26.4M]
  ------------------
 1165|  3.53M|                    char *p = str + 1;
 1166|  3.53M|                    if (mystrcmp(&p, "pos") || mystrcmp(&p, "move") ||
  ------------------
  |  Branch (1166:25): [True: 0, False: 3.53M]
  |  Branch (1166:48): [True: 52, False: 3.53M]
  ------------------
 1167|  3.53M|                        mystrcmp(&p, "clip") || mystrcmp(&p, "iclip") ||
  ------------------
  |  Branch (1167:25): [True: 0, False: 3.53M]
  |  Branch (1167:49): [True: 0, False: 3.53M]
  ------------------
 1168|  3.53M|                        mystrcmp(&p, "org") || mystrcmp(&p, "pbo") ||
  ------------------
  |  Branch (1168:25): [True: 0, False: 3.53M]
  |  Branch (1168:48): [True: 0, False: 3.53M]
  ------------------
 1169|  3.53M|                        mystrcmp(&p, "p"))
  ------------------
  |  Branch (1169:25): [True: 0, False: 3.53M]
  ------------------
 1170|     52|                        return 1;
 1171|  3.53M|                }
 1172|  29.9M|                str++;
 1173|  29.9M|            }
 1174|   717k|        } else {
 1175|   717k|            str++;
 1176|   717k|        }
 1177|  1.17M|    }
 1178|   511k|    return 0;
 1179|   511k|}
ass_parse.c:calc_anim_int32:
  135|  7.67M|{
  136|  7.67M|    return dtoi32(calc_anim(new, old, pwr));
  137|  7.67M|}
ass_parse.c:calc_anim:
  130|  7.67M|{
  131|  7.67M|   return (1 - pwr) * old + new * pwr;
  132|  7.67M|}
ass_parse.c:push_arg:
   54|  3.32M|{
   55|  3.32M|    if (*nargs <= MAX_VALID_NARGS) {
  ------------------
  |  |   31|  3.32M|#define MAX_VALID_NARGS 7
  ------------------
  |  Branch (55:9): [True: 3.32M, False: 0]
  ------------------
   56|  3.32M|        rskip_spaces(&end, start);
   57|  3.32M|        if (end > start) {
  ------------------
  |  Branch (57:13): [True: 1.99M, False: 1.33M]
  ------------------
   58|  1.99M|            args[*nargs] = (struct arg) {start, end};
   59|  1.99M|            ++*nargs;
   60|  1.99M|        }
   61|  3.32M|    }
   62|  3.32M|}
ass_parse.c:mystrcmp:
   69|   118M|{
   70|   118M|    char *p2;
   71|   128M|    for (p2 = *p; *sample != 0 && *p2 == *sample; p2++, sample++)
  ------------------
  |  Branch (71:19): [True: 125M, False: 3.12M]
  |  Branch (71:35): [True: 10.0M, False: 115M]
  ------------------
   72|  10.0M|        ;
   73|   118M|    if (*sample == 0) {
  ------------------
  |  Branch (73:9): [True: 3.12M, False: 115M]
  ------------------
   74|  3.12M|        *p = p2;
   75|  3.12M|        return 1;
   76|  3.12M|    }
   77|   115M|    return 0;
   78|   118M|}
ass_parse.c:argtod:
   47|   256k|{
   48|   256k|    double value;
   49|   256k|    mystrtod(&arg.start, &value);
   50|   256k|    return value;
   51|   256k|}
ass_parse.c:argtoi32:
   40|  1.09k|{
   41|  1.09k|    int32_t value;
   42|  1.09k|    mystrtoi32(&arg.start, 10, &value);
   43|  1.09k|    return value;
   44|  1.09k|}
ass_parse.c:dtoi32:
  123|  7.67M|{
  124|  7.67M|    if (isnan(val) || val <= INT32_MIN || val >= INT32_MAX + 1LL)
  ------------------
  |  Branch (124:23): [True: 537, False: 3.37M]
  |  Branch (124:43): [True: 8, False: 3.37M]
  ------------------
  125|  4.29M|        return INT32_MIN;
  126|  3.37M|    return val;
  127|  7.67M|}
ass_parse.c:parse_color_tag:
  244|  1.48M|{
  245|  1.48M|    int32_t color = 0;
  246|       |
  247|  1.48M|    while (*str == '&' || *str == 'H')
  ------------------
  |  Branch (247:12): [True: 0, False: 1.48M]
  |  Branch (247:27): [True: 18, False: 1.48M]
  ------------------
  248|     18|        ++str;
  249|       |
  250|  1.48M|    mystrtoi32(&str, 16, &color);
  251|  1.48M|    return ass_bswap32((uint32_t) color);
  252|  1.48M|}
ass_parse.c:change_color:
  144|  2.55M|{
  145|  2.55M|    uint32_t co = ass_bswap32(*var);
  146|  2.55M|    uint32_t cn = ass_bswap32(new);
  147|       |
  148|  2.55M|    uint32_t cc = (calc_anim_int32(cn & 0xff0000, co & 0xff0000, pwr) & 0xff0000) |
  149|  2.55M|                  (calc_anim_int32(cn & 0x00ff00, co & 0x00ff00, pwr) & 0x00ff00) |
  150|  2.55M|                  (calc_anim_int32(cn & 0x0000ff, co & 0x0000ff, pwr) & 0x0000ff);
  151|       |
  152|  2.55M|    (*var) = (ass_bswap32(cc & 0xffffff)) | _a(*var);
  ------------------
  |  |   29|  2.55M|#define _a(c)   ((c) & 0xFF)
  ------------------
  153|  2.55M|}
ass_parse.c:lookup_style_strict:
  263|     16|{
  264|     16|    int i;
  265|     48|    for (i = track->n_styles - 1; i >= 0; --i) {
  ------------------
  |  Branch (265:35): [True: 32, False: 16]
  ------------------
  266|     32|        if (strncmp(track->styles[i].Name, name, len) == 0 &&
  ------------------
  |  Branch (266:13): [True: 0, False: 32]
  ------------------
  267|     32|            track->styles[i].Name[len] == '\0')
  ------------------
  |  Branch (267:13): [True: 0, False: 0]
  ------------------
  268|      0|            return track->styles + i;
  269|     32|    }
  270|     16|    ass_msg(track->library, MSGL_WARN,
  ------------------
  |  |   41|     16|#define MSGL_WARN 2
  ------------------
  271|     16|            "[%p]: Warning: no style named '%.*s' found",
  272|     16|            track, (int) len, name);
  273|     16|    return NULL;
  274|     16|}

ass_rasterizer_init:
   55|     33|{
   56|     33|    rst->outline_error = outline_error;
   57|     33|    rst->linebuf[0] = rst->linebuf[1] = NULL;
   58|     33|    rst->size[0] = rst->capacity[0] = 0;
   59|     33|    rst->size[1] = rst->capacity[1] = 0;
   60|     33|    rst->n_first = 0;
   61|       |
   62|     33|    unsigned align = 1 << engine->align_order;
   63|     33|    unsigned size = 1 << (2 * engine->tile_order);
   64|     33|    rst->tile = ass_aligned_alloc(align, size, false);
   65|     33|    return rst->tile;
   66|     33|}
ass_rasterizer_done:
   93|     33|{
   94|     33|    free(rst->linebuf[0]);
   95|     33|    free(rst->linebuf[1]);
   96|       |
   97|     33|    ass_aligned_free(rst->tile);
   98|     33|}
ass_rasterizer_set_outline:
  267|  1.21k|{
  268|  1.21k|    if (!extra) {
  ------------------
  |  Branch (268:9): [True: 606, False: 606]
  ------------------
  269|    606|        rectangle_reset(&rst->bbox);
  270|    606|        rst->n_first = 0;
  271|    606|    }
  272|  1.21k|    rst->size[0] = rst->n_first;
  273|       |
  274|  1.21k|#ifndef NDEBUG
  275|  40.6k|    for (size_t i = 0; i < path->n_points; i++)
  ------------------
  |  Branch (275:24): [True: 39.3k, False: 1.21k]
  ------------------
  276|  39.3k|        assert(abs(path->points[i].x) <= OUTLINE_MAX && abs(path->points[i].y) <= OUTLINE_MAX);
  277|  1.21k|#endif
  278|       |
  279|  1.21k|    ASS_Vector *start = path->points, *cur = start;
  280|  28.4k|    for (size_t i = 0; i < path->n_segments; i++) {
  ------------------
  |  Branch (280:24): [True: 27.2k, False: 1.21k]
  ------------------
  281|  27.2k|        int n = path->segments[i] & OUTLINE_COUNT_MASK;
  282|  27.2k|        cur += n;
  283|       |
  284|  27.2k|        ASS_Vector *end = cur, p[4];
  285|  27.2k|        if (path->segments[i] & OUTLINE_CONTOUR_END) {
  ------------------
  |  Branch (285:13): [True: 1.52k, False: 25.7k]
  ------------------
  286|  1.52k|            end = start;
  287|  1.52k|            start = cur;
  288|  1.52k|        }
  289|       |
  290|  27.2k|        switch (n) {
  291|  15.0k|        case OUTLINE_LINE_SEGMENT:
  ------------------
  |  Branch (291:9): [True: 15.0k, False: 12.1k]
  ------------------
  292|  15.0k|            if (!add_line(rst, cur[-1], *end))
  ------------------
  |  Branch (292:17): [True: 0, False: 15.0k]
  ------------------
  293|      0|                return false;
  294|  15.0k|            break;
  295|       |
  296|  15.0k|        case OUTLINE_QUADRATIC_SPLINE:
  ------------------
  |  Branch (296:9): [True: 12.1k, False: 15.0k]
  ------------------
  297|  12.1k|            p[0] = cur[-2];
  298|  12.1k|            p[1] = cur[-1];
  299|  12.1k|            p[2] = *end;
  300|  12.1k|            if (!add_quadratic(rst, p))
  ------------------
  |  Branch (300:17): [True: 0, False: 12.1k]
  ------------------
  301|      0|                return false;
  302|  12.1k|            break;
  303|       |
  304|  12.1k|        case OUTLINE_CUBIC_SPLINE:
  ------------------
  |  Branch (304:9): [True: 0, False: 27.2k]
  ------------------
  305|      0|            p[0] = cur[-3];
  306|      0|            p[1] = cur[-2];
  307|      0|            p[2] = cur[-1];
  308|      0|            p[3] = *end;
  309|      0|            if (!add_cubic(rst, p))
  ------------------
  |  Branch (309:17): [True: 0, False: 0]
  ------------------
  310|      0|                return false;
  311|      0|            break;
  312|       |
  313|      0|        default:
  ------------------
  |  Branch (313:9): [True: 0, False: 27.2k]
  ------------------
  314|      0|            return false;
  315|  27.2k|        }
  316|  27.2k|    }
  317|  1.21k|    assert(start == cur && (!cur || cur == path->points + path->n_points));
  318|       |
  319|  37.1k|    for (size_t k = rst->n_first; k < rst->size[0]; k++) {
  ------------------
  |  Branch (319:35): [True: 35.9k, False: 1.21k]
  ------------------
  320|  35.9k|        struct segment *line = &rst->linebuf[0][k];
  321|  35.9k|        rectangle_update(&rst->bbox,
  322|  35.9k|                         line->x_min, line->y_min,
  323|  35.9k|                         line->x_max, line->y_max);
  324|  35.9k|    }
  325|  1.21k|    if (!extra)
  ------------------
  |  Branch (325:9): [True: 606, False: 606]
  ------------------
  326|    606|        rst->n_first = rst->size[0];
  327|  1.21k|    return true;
  328|  1.21k|}
ass_rasterizer_fill:
  725|    600|{
  726|    600|    assert(width > 0 && height > 0);
  727|    600|    assert(!(width  & ((1 << engine->tile_order) - 1)));
  728|    600|    assert(!(height & ((1 << engine->tile_order) - 1)));
  729|    600|    x0 *= 1 << 6;  y0 *= 1 << 6;
  730|       |
  731|    600|    struct segment *line = rst->linebuf[0];
  732|    600|    struct segment *end = line + rst->size[0];
  733|  36.5k|    for (; line != end; line++) {
  ------------------
  |  Branch (733:12): [True: 35.9k, False: 600]
  ------------------
  734|  35.9k|        line->x_min -= x0;
  735|  35.9k|        line->x_max -= x0;
  736|  35.9k|        line->y_min -= y0;
  737|  35.9k|        line->y_max -= y0;
  738|  35.9k|        line->c -= line->a * (int64_t) x0 + line->b * (int64_t) y0;
  739|  35.9k|    }
  740|    600|    rst->bbox.x_min -= x0;
  741|    600|    rst->bbox.x_max -= x0;
  742|    600|    rst->bbox.y_min -= y0;
  743|    600|    rst->bbox.y_max -= y0;
  744|       |
  745|    600|    if (!check_capacity(rst, 1, rst->size[0]))
  ------------------
  |  Branch (745:9): [True: 0, False: 600]
  ------------------
  746|      0|        return false;
  747|       |
  748|    600|    size_t n_unused[2];
  749|    600|    size_t n_lines[2] = { rst->n_first, rst->size[0] - rst->n_first };
  750|    600|    int winding[2] = { 0, 0 };
  751|       |
  752|    600|    int32_t size_x = (int32_t) width << 6;
  753|    600|    int32_t size_y = (int32_t) height << 6;
  754|    600|    if (rst->bbox.x_max >= size_x) {
  ------------------
  |  Branch (754:9): [True: 0, False: 600]
  ------------------
  755|      0|        polyline_split_horz(rst->linebuf[0], n_lines,
  756|      0|                            rst->linebuf[0], n_lines,
  757|      0|                            rst->linebuf[1], n_unused,
  758|      0|                            winding, size_x);
  759|      0|        winding[0] = winding[1] = 0;
  760|      0|    }
  761|    600|    if (rst->bbox.y_max >= size_y) {
  ------------------
  |  Branch (761:9): [True: 0, False: 600]
  ------------------
  762|      0|        polyline_split_vert(rst->linebuf[0], n_lines,
  763|      0|                            rst->linebuf[0], n_lines,
  764|      0|                            rst->linebuf[1], n_unused,
  765|      0|                            winding, size_y);
  766|      0|        winding[0] = winding[1] = 0;
  767|      0|    }
  768|    600|    if (rst->bbox.x_min <= 0) {
  ------------------
  |  Branch (768:9): [True: 0, False: 600]
  ------------------
  769|      0|        polyline_split_horz(rst->linebuf[0], n_lines,
  770|      0|                            rst->linebuf[1], n_unused,
  771|      0|                            rst->linebuf[0], n_lines,
  772|      0|                            winding, 0);
  773|      0|    }
  774|    600|    if (rst->bbox.y_min <= 0) {
  ------------------
  |  Branch (774:9): [True: 0, False: 600]
  ------------------
  775|      0|        polyline_split_vert(rst->linebuf[0], n_lines,
  776|      0|                            rst->linebuf[1], n_unused,
  777|      0|                            rst->linebuf[0], n_lines,
  778|      0|                            winding, 0);
  779|      0|    }
  780|    600|    rst->size[0] = n_lines[0] + n_lines[1];
  781|    600|    rst->size[1] = 0;
  782|    600|    return rasterizer_fill_level(engine, rst,
  783|    600|                                 buf, width, height, stride,
  784|    600|                                 0, n_lines, winding);
  785|    600|}
ass_rasterizer.c:add_line:
  158|  36.2k|{
  159|  36.2k|    int32_t x = pt1.x - pt0.x;
  160|  36.2k|    int32_t y = pt1.y - pt0.y;
  161|  36.2k|    if (!x && !y)
  ------------------
  |  Branch (161:9): [True: 5.89k, False: 30.3k]
  |  Branch (161:15): [True: 307, False: 5.58k]
  ------------------
  162|    307|        return true;
  163|       |
  164|  35.9k|    if (!check_capacity(rst, 0, 1))
  ------------------
  |  Branch (164:9): [True: 0, False: 35.9k]
  ------------------
  165|      0|        return false;
  166|  35.9k|    struct segment *line = rst->linebuf[0] + rst->size[0];
  167|  35.9k|    rst->size[0]++;
  168|       |
  169|  35.9k|    line->flags = SEGFLAG_EXACT_LEFT | SEGFLAG_EXACT_RIGHT |
  170|  35.9k|                  SEGFLAG_EXACT_TOP | SEGFLAG_EXACT_BOTTOM;
  171|  35.9k|    if (x < 0)
  ------------------
  |  Branch (171:9): [True: 14.9k, False: 20.9k]
  ------------------
  172|  14.9k|        line->flags ^= SEGFLAG_UL_DR;
  173|  35.9k|    if (y >= 0)
  ------------------
  |  Branch (173:9): [True: 20.0k, False: 15.8k]
  ------------------
  174|  20.0k|        line->flags ^= SEGFLAG_DN | SEGFLAG_UL_DR;
  175|       |
  176|  35.9k|    line->x_min = FFMIN(pt0.x, pt1.x);
  ------------------
  |  |   47|  35.9k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 14.9k, False: 20.9k]
  |  |  ------------------
  ------------------
  177|  35.9k|    line->x_max = FFMAX(pt0.x, pt1.x);
  ------------------
  |  |   46|  35.9k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 14.9k, False: 20.9k]
  |  |  ------------------
  ------------------
  178|  35.9k|    line->y_min = FFMIN(pt0.y, pt1.y);
  ------------------
  |  |   47|  35.9k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 15.8k, False: 20.0k]
  |  |  ------------------
  ------------------
  179|  35.9k|    line->y_max = FFMAX(pt0.y, pt1.y);
  ------------------
  |  |   46|  35.9k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 15.8k, False: 20.0k]
  |  |  ------------------
  ------------------
  180|       |
  181|  35.9k|    line->a = y;
  182|  35.9k|    line->b = -x;
  183|  35.9k|    line->c = y * (int64_t) pt0.x - x * (int64_t) pt0.y;
  184|       |
  185|       |    // halfplane normalization
  186|  35.9k|    int32_t abs_x = x < 0 ? -x : x;
  ------------------
  |  Branch (186:21): [True: 14.9k, False: 20.9k]
  ------------------
  187|  35.9k|    int32_t abs_y = y < 0 ? -y : y;
  ------------------
  |  Branch (187:21): [True: 15.8k, False: 20.0k]
  ------------------
  188|  35.9k|    uint32_t max_ab = (abs_x > abs_y ? abs_x : abs_y);
  ------------------
  |  Branch (188:24): [True: 17.9k, False: 17.9k]
  ------------------
  189|  35.9k|    int shift = 30 - ilog2(max_ab);
  190|  35.9k|    max_ab <<= shift + 1;
  191|  35.9k|    line->a *= 1 << shift;
  192|  35.9k|    line->b *= 1 << shift;
  193|  35.9k|    line->c *= 1 << shift;
  194|  35.9k|    line->scale = (uint64_t) 0x53333333 * (uint32_t) (max_ab * (uint64_t) max_ab >> 32) >> 32;
  195|  35.9k|    line->scale += 0x8810624D - (0xBBC6A7EF * (uint64_t) max_ab >> 32);
  196|       |    //line->scale = ((uint64_t) 1 << 61) / max_ab;
  197|  35.9k|    return true;
  198|  35.9k|}
ass_rasterizer.c:ilog2:
   35|  35.9k|{
   36|  35.9k|#ifdef __GNUC__
   37|  35.9k|    return __builtin_clz(n) ^ 31;
   38|       |#elif defined(_MSC_VER)
   39|       |    int res;
   40|       |    _BitScanReverse(&res, n);
   41|       |    return res;
   42|       |#else
   43|       |    int res = 0;
   44|       |    for (int ord = 16; ord; ord /= 2)
   45|       |        if (n >= ((uint32_t) 1 << ord)) {
   46|       |            res += ord;
   47|       |            n >>= ord;
   48|       |        }
   49|       |    return res;
   50|       |#endif
   51|  35.9k|}
ass_rasterizer.c:add_quadratic:
  205|  30.1k|{
  206|  30.1k|    OutlineSegment seg;
  207|  30.1k|    segment_init(&seg, pt[0], pt[2], rst->outline_error);
  208|  30.1k|    if (!segment_subdivide(&seg, pt[0], pt[1]))
  ------------------
  |  Branch (208:9): [True: 21.1k, False: 8.98k]
  ------------------
  209|  21.1k|        return add_line(rst, pt[0], pt[2]);
  210|       |
  211|  8.98k|    ASS_Vector next[5];
  212|  8.98k|    next[1].x = pt[0].x + pt[1].x;
  213|  8.98k|    next[1].y = pt[0].y + pt[1].y;
  214|  8.98k|    next[3].x = pt[1].x + pt[2].x;
  215|  8.98k|    next[3].y = pt[1].y + pt[2].y;
  216|  8.98k|    next[2].x = (next[1].x + next[3].x + 2) >> 2;
  217|  8.98k|    next[2].y = (next[1].y + next[3].y + 2) >> 2;
  218|  8.98k|    next[1].x >>= 1;
  219|  8.98k|    next[1].y >>= 1;
  220|  8.98k|    next[3].x >>= 1;
  221|  8.98k|    next[3].y >>= 1;
  222|  8.98k|    next[0] = pt[0];
  223|  8.98k|    next[4] = pt[2];
  224|  8.98k|    return add_quadratic(rst, next) && add_quadratic(rst, next + 2);
  ------------------
  |  Branch (224:12): [True: 8.98k, False: 0]
  |  Branch (224:40): [True: 8.98k, False: 0]
  ------------------
  225|  30.1k|}
ass_rasterizer.c:segment_init:
  131|  30.1k|{
  132|  30.1k|    int32_t x = end.x - beg.x;
  133|  30.1k|    int32_t y = end.y - beg.y;
  134|  30.1k|    int32_t abs_x = x < 0 ? -x : x;
  ------------------
  |  Branch (134:21): [True: 14.7k, False: 15.4k]
  ------------------
  135|  30.1k|    int32_t abs_y = y < 0 ? -y : y;
  ------------------
  |  Branch (135:21): [True: 15.2k, False: 14.8k]
  ------------------
  136|       |
  137|  30.1k|    seg->r.x = x;
  138|  30.1k|    seg->r.y = y;
  139|  30.1k|    seg->r2 = x * (int64_t) x + y * (int64_t) y;
  140|  30.1k|    seg->er = outline_error * (int64_t) FFMAX(abs_x, abs_y);
  ------------------
  |  |   46|  30.1k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 15.2k, False: 14.9k]
  |  |  ------------------
  ------------------
  141|  30.1k|}
ass_rasterizer.c:segment_subdivide:
  145|  30.1k|{
  146|  30.1k|    int32_t x = pt.x - beg.x;
  147|  30.1k|    int32_t y = pt.y - beg.y;
  148|  30.1k|    int64_t pdr = seg->r.x * (int64_t) x + seg->r.y * (int64_t) y;
  149|  30.1k|    int64_t pcr = seg->r.x * (int64_t) y - seg->r.y * (int64_t) x;
  150|  30.1k|    return pdr < -seg->er || pdr > seg->r2 + seg->er ||
  ------------------
  |  Branch (150:12): [True: 0, False: 30.1k]
  |  Branch (150:30): [True: 0, False: 30.1k]
  ------------------
  151|  30.1k|        (pcr < 0 ? -pcr : pcr) > seg->er;
  ------------------
  |  Branch (151:9): [True: 8.98k, False: 21.1k]
  |  Branch (151:10): [True: 18.8k, False: 11.2k]
  ------------------
  152|  30.1k|}
ass_rasterizer.c:check_capacity:
   75|  36.5k|{
   76|  36.5k|    delta += rst->size[index];
   77|  36.5k|    if (rst->capacity[index] >= delta)
  ------------------
  |  Branch (77:9): [True: 36.4k, False: 47]
  ------------------
   78|  36.4k|        return true;
   79|       |
   80|     47|    size_t capacity = FFMAX(2 * rst->capacity[index], 64);
  ------------------
  |  |   46|     47|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 31, False: 16]
  |  |  ------------------
  ------------------
   81|     48|    while (capacity < delta)
  ------------------
  |  Branch (81:12): [True: 1, False: 47]
  ------------------
   82|      1|        capacity *= 2;
   83|     47|    void *ptr = realloc(rst->linebuf[index], sizeof(struct segment) * capacity);
   84|     47|    if (!ptr)
  ------------------
  |  Branch (84:9): [True: 0, False: 47]
  ------------------
   85|      0|        return false;
   86|       |
   87|     47|    rst->linebuf[index] = (struct segment *) ptr;
   88|     47|    rst->capacity[index] = capacity;
   89|     47|    return true;
   90|     47|}
ass_rasterizer.c:rasterizer_fill_level:
  633|    600|{
  634|    600|    assert(width > 0 && height > 0);
  635|    600|    assert((unsigned) index < 2u && n_lines[0] + n_lines[1] <= rst->size[index]);
  636|    600|    assert(!(width  & ((1 << engine->tile_order) - 1)));
  637|    600|    assert(!(height & ((1 << engine->tile_order) - 1)));
  638|       |
  639|    600|    size_t offs = rst->size[index] - n_lines[0] - n_lines[1];
  640|    600|    struct segment *line = rst->linebuf[index] + offs, *line1 = line + n_lines[0];
  641|    600|    int flags0 = get_fill_flags(line,  n_lines[0], winding[0]);
  642|    600|    int flags1 = get_fill_flags(line1, n_lines[1], winding[1]);
  643|    600|    int flags = (flags0 | flags1) ^ FLAG_COMPLEX;
  644|    600|    if (flags & (FLAG_SOLID | FLAG_COMPLEX)) {
  ------------------
  |  Branch (644:9): [True: 0, False: 600]
  ------------------
  645|      0|        rasterizer_fill_solid(engine, buf, width, height, stride, flags & FLAG_SOLID);
  646|      0|        rst->size[index] = offs;
  647|      0|        return true;
  648|      0|    }
  649|    600|    if (!(flags & FLAG_GENERIC) && ((flags0 ^ flags1) & FLAG_COMPLEX)) {
  ------------------
  |  Branch (649:9): [True: 0, False: 600]
  |  Branch (649:36): [True: 0, False: 0]
  ------------------
  650|      0|        if (flags1 & FLAG_COMPLEX)
  ------------------
  |  Branch (650:13): [True: 0, False: 0]
  ------------------
  651|      0|            line = line1;
  652|      0|        rasterizer_fill_halfplane(engine, buf, width, height, stride,
  653|      0|                                  line->a, line->b, line->c,
  654|      0|                                  flags & FLAG_REVERSE ? -line->scale : line->scale);
  ------------------
  |  Branch (654:35): [True: 0, False: 0]
  ------------------
  655|      0|        rst->size[index] = offs;
  656|      0|        return true;
  657|      0|    }
  658|    600|    if (width == 1 << engine->tile_order && height == 1 << engine->tile_order) {
  ------------------
  |  Branch (658:9): [True: 600, False: 0]
  |  Branch (658:45): [True: 600, False: 0]
  ------------------
  659|    600|        if (!(flags1 & FLAG_COMPLEX)) {
  ------------------
  |  Branch (659:13): [True: 303, False: 297]
  ------------------
  660|    303|            engine->fill_generic(buf, stride, line, n_lines[0], winding[0]);
  661|    303|            rst->size[index] = offs;
  662|    303|            return true;
  663|    303|        }
  664|    297|        if (!(flags0 & FLAG_COMPLEX)) {
  ------------------
  |  Branch (664:13): [True: 0, False: 297]
  ------------------
  665|      0|            engine->fill_generic(buf, stride, line1, n_lines[1], winding[1]);
  666|      0|            rst->size[index] = offs;
  667|      0|            return true;
  668|      0|        }
  669|    297|        if (flags0 & FLAG_GENERIC)
  ------------------
  |  Branch (669:13): [True: 297, False: 0]
  ------------------
  670|    297|            engine->fill_generic(buf, stride, line, n_lines[0], winding[0]);
  671|      0|        else
  672|      0|            engine->fill_halfplane(buf, stride, line->a, line->b, line->c,
  673|      0|                                   flags0 & FLAG_REVERSE ? -line->scale : line->scale);
  ------------------
  |  Branch (673:36): [True: 0, False: 0]
  ------------------
  674|    297|        if (flags1 & FLAG_GENERIC)
  ------------------
  |  Branch (674:13): [True: 297, False: 0]
  ------------------
  675|    297|            engine->fill_generic(rst->tile, width, line1, n_lines[1], winding[1]);
  676|      0|        else
  677|      0|            engine->fill_halfplane(rst->tile, width, line1->a, line1->b, line1->c,
  678|      0|                                   flags1 & FLAG_REVERSE ? -line1->scale : line1->scale);
  ------------------
  |  Branch (678:36): [True: 0, False: 0]
  ------------------
  679|    297|        engine->merge(buf, stride, rst->tile);
  680|    297|        rst->size[index] = offs;
  681|    297|        return true;
  682|    297|    }
  683|       |
  684|      0|    size_t offs1 = rst->size[index ^ 1];
  685|      0|    if (!check_capacity(rst, index ^ 1, n_lines[0] + n_lines[1]))
  ------------------
  |  Branch (685:9): [True: 0, False: 0]
  ------------------
  686|      0|        return false;
  687|      0|    struct segment *dst0 = line;
  688|      0|    struct segment *dst1 = rst->linebuf[index ^ 1] + offs1;
  689|       |
  690|      0|    uint8_t *buf1 = buf;
  691|      0|    int width1  = width;
  692|      0|    int height1 = height;
  693|      0|    size_t n_next0[2], n_next1[2];
  694|      0|    int winding1[2] = { winding[0], winding[1] };
  695|      0|    if (width > height) {
  ------------------
  |  Branch (695:9): [True: 0, False: 0]
  ------------------
  696|      0|        width = 1 << ilog2(width - 1);
  697|      0|        width1 -= width;
  698|      0|        buf1 += width;
  699|      0|        polyline_split_horz(line, n_lines,
  700|      0|                            dst0, n_next0, dst1, n_next1,
  701|      0|                            winding1, (int32_t) width << 6);
  702|      0|    } else {
  703|      0|        height = 1 << ilog2(height - 1);
  704|      0|        height1 -= height;
  705|      0|        buf1 += height * stride;
  706|      0|        polyline_split_vert(line, n_lines,
  707|      0|                            dst0, n_next0, dst1, n_next1,
  708|      0|                            winding1, (int32_t) height << 6);
  709|      0|    }
  710|      0|    rst->size[index ^ 0] = offs  + n_next0[0] + n_next0[1];
  711|      0|    rst->size[index ^ 1] = offs1 + n_next1[0] + n_next1[1];
  712|       |
  713|      0|    if (!rasterizer_fill_level(engine, rst, buf,  width,  height,  stride, index ^ 0, n_next0,  winding))
  ------------------
  |  Branch (713:9): [True: 0, False: 0]
  ------------------
  714|      0|        return false;
  715|      0|    assert(rst->size[index ^ 0] == offs);
  716|      0|    if (!rasterizer_fill_level(engine, rst, buf1, width1, height1, stride, index ^ 1, n_next1, winding1))
  ------------------
  |  Branch (716:9): [True: 0, False: 0]
  ------------------
  717|      0|        return false;
  718|      0|    assert(rst->size[index ^ 1] == offs1);
  719|      0|    return true;
  720|      0|}
ass_rasterizer.c:get_fill_flags:
  601|  1.20k|{
  602|  1.20k|    if (!n_lines)
  ------------------
  |  Branch (602:9): [True: 303, False: 897]
  ------------------
  603|    303|        return winding ? FLAG_SOLID : 0;
  ------------------
  |  Branch (603:16): [True: 0, False: 303]
  ------------------
  604|    897|    if (n_lines > 1)
  ------------------
  |  Branch (604:9): [True: 897, False: 0]
  ------------------
  605|    897|        return FLAG_COMPLEX | FLAG_GENERIC;
  606|       |
  607|      0|    static const int test = SEGFLAG_UL_DR | SEGFLAG_EXACT_LEFT;
  608|      0|    if (((line->flags & test) != test) == !(line->flags & SEGFLAG_DN))
  ------------------
  |  Branch (608:9): [True: 0, False: 0]
  ------------------
  609|      0|        winding++;
  610|       |
  611|      0|    switch (winding) {
  612|      0|    case 0:
  ------------------
  |  Branch (612:5): [True: 0, False: 0]
  ------------------
  613|      0|        return FLAG_COMPLEX | FLAG_REVERSE;
  614|      0|    case 1:
  ------------------
  |  Branch (614:5): [True: 0, False: 0]
  ------------------
  615|      0|        return FLAG_COMPLEX;
  616|      0|    default:
  ------------------
  |  Branch (616:5): [True: 0, False: 0]
  ------------------
  617|      0|        return FLAG_SOLID;
  618|      0|    }
  619|      0|}

ass_renderer_init:
   80|     33|{
   81|     33|    int error;
   82|     33|    FT_Library ft;
   83|     33|    ASS_Renderer *priv = 0;
   84|     33|    int vmajor, vminor, vpatch;
   85|       |
   86|     33|    ass_msg(library, MSGL_INFO, "libass API version: 0x%X", LIBASS_VERSION);
  ------------------
  |  |   42|     33|#define MSGL_INFO 4
  ------------------
                  ass_msg(library, MSGL_INFO, "libass API version: 0x%X", LIBASS_VERSION);
  ------------------
  |  |   27|     33|#define LIBASS_VERSION 0x01701000
  ------------------
   87|     33|    ass_msg(library, MSGL_INFO, "libass source: %s", CONFIG_SOURCEVERSION);
  ------------------
  |  |   42|     33|#define MSGL_INFO 4
  ------------------
                  ass_msg(library, MSGL_INFO, "libass source: %s", CONFIG_SOURCEVERSION);
  ------------------
  |  |   44|     33|#define CONFIG_SOURCEVERSION "commit: 5c15c883a4783641f7e71a6a1f440209965eb64f-dirty"
  ------------------
   88|       |
   89|     33|    error = FT_Init_FreeType(&ft);
   90|     33|    if (error) {
  ------------------
  |  Branch (90:9): [True: 0, False: 33]
  ------------------
   91|      0|        ass_msg(library, MSGL_FATAL, "%s failed", "FT_Init_FreeType");
  ------------------
  |  |   39|      0|#define MSGL_FATAL 0
  ------------------
   92|      0|        goto fail;
   93|      0|    }
   94|       |
   95|     33|    FT_Library_Version(ft, &vmajor, &vminor, &vpatch);
   96|     33|    ass_msg(library, MSGL_V, "Raster: FreeType %d.%d.%d",
  ------------------
  |  |   43|     33|#define MSGL_V 6
  ------------------
   97|     33|           vmajor, vminor, vpatch);
   98|       |
   99|     33|    priv = calloc(1, sizeof(ASS_Renderer));
  100|     33|    if (!priv) {
  ------------------
  |  Branch (100:9): [True: 0, False: 33]
  ------------------
  101|      0|        FT_Done_FreeType(ft);
  102|      0|        goto fail;
  103|      0|    }
  104|       |
  105|     33|    priv->library = library;
  106|     33|    priv->ftlibrary = ft;
  107|       |    // images_root and related stuff is zero-filled in calloc
  108|       |
  109|     33|    unsigned flags = ASS_CPU_FLAG_ALL;
  110|       |#if CONFIG_LARGE_TILES
  111|       |    flags |= ASS_FLAG_LARGE_TILES;
  112|       |#endif
  113|     33|    priv->engine = ass_bitmap_engine_init(flags);
  114|       |
  115|     33|    if (!ass_rasterizer_init(&priv->engine, &priv->state.rasterizer, RASTERIZER_PRECISION))
  ------------------
  |  |   44|     33|#define RASTERIZER_PRECISION 16  // rasterizer spline approximation error in 1/64 pixel units
  ------------------
  |  Branch (115:9): [True: 0, False: 33]
  ------------------
  116|      0|        goto fail;
  117|       |
  118|     33|    priv->cache.font_cache = ass_font_cache_create();
  119|     33|    priv->cache.bitmap_cache = ass_bitmap_cache_create();
  120|     33|    priv->cache.composite_cache = ass_composite_cache_create();
  121|     33|    priv->cache.outline_cache = ass_outline_cache_create();
  122|     33|    priv->cache.metrics_cache = ass_glyph_metrics_cache_create();
  123|     33|    if (!priv->cache.font_cache || !priv->cache.bitmap_cache || !priv->cache.composite_cache || !priv->cache.outline_cache || !priv->cache.metrics_cache)
  ------------------
  |  Branch (123:9): [True: 0, False: 33]
  |  Branch (123:36): [True: 0, False: 33]
  |  Branch (123:65): [True: 0, False: 33]
  |  Branch (123:97): [True: 0, False: 33]
  |  Branch (123:127): [True: 0, False: 33]
  ------------------
  124|      0|        goto fail;
  125|       |
  126|     33|    priv->cache.glyph_max = GLYPH_CACHE_MAX;
  ------------------
  |  |   43|     33|#define GLYPH_CACHE_MAX 10000
  ------------------
  127|     33|    priv->cache.bitmap_max_size = BITMAP_CACHE_MAX_SIZE;
  ------------------
  |  |   45|     33|#define BITMAP_CACHE_MAX_SIZE (128 * MEGABYTE)
  |  |  ------------------
  |  |  |  |   44|     33|#define MEGABYTE (1024 * 1024)
  |  |  ------------------
  ------------------
  128|     33|    priv->cache.composite_max_size = COMPOSITE_CACHE_MAX_SIZE;
  ------------------
  |  |   47|     33|#define COMPOSITE_CACHE_MAX_SIZE (BITMAP_CACHE_MAX_SIZE / COMPOSITE_CACHE_RATIO)
  |  |  ------------------
  |  |  |  |   45|     33|#define BITMAP_CACHE_MAX_SIZE (128 * MEGABYTE)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|     33|#define MEGABYTE (1024 * 1024)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |               #define COMPOSITE_CACHE_MAX_SIZE (BITMAP_CACHE_MAX_SIZE / COMPOSITE_CACHE_RATIO)
  |  |  ------------------
  |  |  |  |   46|     33|#define COMPOSITE_CACHE_RATIO 2
  |  |  ------------------
  ------------------
  129|       |
  130|     33|    if (!text_info_init(&priv->text_info))
  ------------------
  |  Branch (130:9): [True: 0, False: 33]
  ------------------
  131|      0|        goto fail;
  132|       |
  133|     33|    priv->user_override_style.Name = "OverrideStyle"; // name insignificant
  134|       |
  135|     33|    priv->state.renderer = priv;
  136|     33|    priv->state.text_info = &priv->text_info;
  137|       |
  138|     33|    priv->settings.font_size_coeff = 1.;
  139|     33|    priv->settings.selective_style_overrides = ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE;
  140|       |
  141|     33|    if (!(priv->state.shaper = ass_shaper_new(priv->cache.metrics_cache)))
  ------------------
  |  Branch (141:9): [True: 0, False: 33]
  ------------------
  142|      0|        goto fail;
  143|       |
  144|     33|    ass_shaper_info(library);
  145|     33|    priv->settings.shaper = ASS_SHAPING_COMPLEX;
  146|       |
  147|     33|    ass_msg(library, MSGL_V, "Initialized");
  ------------------
  |  |   43|     33|#define MSGL_V 6
  ------------------
  148|       |
  149|     33|    return priv;
  150|       |
  151|      0|fail:
  152|      0|    ass_msg(library, MSGL_ERR, "Initialization failed");
  ------------------
  |  |   40|      0|#define MSGL_ERR 1
  ------------------
  153|      0|    ass_renderer_done(priv);
  154|       |
  155|      0|    return NULL;
  156|     33|}
ass_renderer_done:
  159|     33|{
  160|     33|    if (!render_priv)
  ------------------
  |  Branch (160:9): [True: 0, False: 33]
  ------------------
  161|      0|        return;
  162|       |
  163|     33|    ass_frame_unref(render_priv->images_root);
  164|     33|    ass_frame_unref(render_priv->prev_images_root);
  165|       |
  166|     33|    ass_cache_done(render_priv->cache.composite_cache);
  167|     33|    ass_cache_done(render_priv->cache.bitmap_cache);
  168|     33|    ass_cache_done(render_priv->cache.outline_cache);
  169|     33|    ass_cache_done(render_priv->cache.metrics_cache);
  170|     33|    ass_shaper_free(render_priv->state.shaper);
  171|     33|    ass_cache_done(render_priv->cache.font_cache);
  172|       |
  173|     33|    ass_rasterizer_done(&render_priv->state.rasterizer);
  174|       |
  175|     33|    if (render_priv->fontselect)
  ------------------
  |  Branch (175:9): [True: 33, False: 0]
  ------------------
  176|     33|        ass_fontselect_free(render_priv->fontselect);
  177|     33|    if (render_priv->ftlibrary)
  ------------------
  |  Branch (177:9): [True: 33, False: 0]
  ------------------
  178|     33|        FT_Done_FreeType(render_priv->ftlibrary);
  179|     33|    free(render_priv->eimg);
  180|       |
  181|     33|    text_info_done(&render_priv->text_info);
  182|       |
  183|     33|    free(render_priv->settings.default_font);
  184|     33|    free(render_priv->settings.default_family);
  185|       |
  186|     33|    free(render_priv->user_override_style.FontName);
  187|       |
  188|     33|    free(render_priv);
  189|     33|}
ass_layout_res:
  997|   767k|{
  998|   767k|    ASS_Track *track = render_priv->track;
  999|   767k|    if (track->LayoutResX > 0 && track->LayoutResY > 0)
  ------------------
  |  Branch (999:9): [True: 0, False: 767k]
  |  Branch (999:34): [True: 0, False: 0]
  ------------------
 1000|      0|        return (ASS_Vector) { track->LayoutResX, track->LayoutResY };
 1001|       |
 1002|   767k|    ASS_Settings *settings = &render_priv->settings;
 1003|   767k|    if (settings->storage_width > 0 && settings->storage_height > 0)
  ------------------
  |  Branch (1003:9): [True: 767k, False: 0]
  |  Branch (1003:40): [True: 767k, False: 0]
  ------------------
 1004|   767k|        return (ASS_Vector) { settings->storage_width, settings->storage_height };
 1005|       |
 1006|      0|    if (settings->par <= 0 || settings->par == 1 ||
  ------------------
  |  Branch (1006:9): [True: 0, False: 0]
  |  Branch (1006:31): [True: 0, False: 0]
  ------------------
 1007|      0|            !render_priv->frame_content_width || !render_priv->frame_content_height)
  ------------------
  |  Branch (1007:13): [True: 0, False: 0]
  |  Branch (1007:50): [True: 0, False: 0]
  ------------------
 1008|      0|        return (ASS_Vector) { track->PlayResX, track->PlayResY };
 1009|      0|    if (settings->par > 1)
  ------------------
  |  Branch (1009:9): [True: 0, False: 0]
  ------------------
 1010|      0|        return (ASS_Vector) {
 1011|      0|            FFMAX(1, lround(track->PlayResY * render_priv->frame_content_width
  ------------------
  |  |   46|      0|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1012|      0|                    / render_priv->frame_content_height / settings->par)),
 1013|      0|            track->PlayResY
 1014|      0|        };
 1015|      0|    else
 1016|      0|        return (ASS_Vector) {
 1017|      0|            track->PlayResX,
 1018|      0|            FFMAX(1, lround(track->PlayResX * render_priv->frame_content_height
  ------------------
  |  |   46|      0|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1019|      0|                    / render_priv->frame_content_width * settings->par))
 1020|      0|        };
 1021|      0|}
ass_reset_render_context:
 1064|   511k|{
 1065|   511k|    style = handle_selective_style_overrides(state, style);
 1066|       |
 1067|   511k|    init_font_scale(state);
 1068|       |
 1069|   511k|    state->c[0] = style->PrimaryColour;
 1070|   511k|    state->c[1] = style->SecondaryColour;
 1071|   511k|    state->c[2] = style->OutlineColour;
 1072|   511k|    state->c[3] = style->BackColour;
 1073|   511k|    state->flags =
 1074|   511k|        (style->Underline ? DECO_UNDERLINE : 0) |
  ------------------
  |  |   37|      0|#define DECO_UNDERLINE     1
  ------------------
  |  Branch (1074:10): [True: 0, False: 511k]
  ------------------
 1075|   511k|        (style->StrikeOut ? DECO_STRIKETHROUGH : 0);
  ------------------
  |  |   38|      0|#define DECO_STRIKETHROUGH 2
  ------------------
  |  Branch (1075:10): [True: 0, False: 511k]
  ------------------
 1076|   511k|    state->font_size = style->FontSize;
 1077|       |
 1078|   511k|    state->family.str = style->FontName;
 1079|   511k|    state->family.len = strlen(style->FontName);
 1080|   511k|    state->treat_family_as_pattern = style->treat_fontname_as_pattern;
 1081|   511k|    state->bold = style->Bold;
 1082|   511k|    state->italic = style->Italic;
 1083|   511k|    ass_update_font(state);
 1084|       |
 1085|   511k|    state->border_style = style->BorderStyle;
 1086|   511k|    state->border_x = style->Outline;
 1087|   511k|    state->border_y = style->Outline;
 1088|   511k|    state->scale_x = style->ScaleX;
 1089|   511k|    state->scale_y = style->ScaleY;
 1090|   511k|    state->hspacing = style->Spacing;
 1091|   511k|    state->be = 0;
 1092|   511k|    state->blur = style->Blur;
 1093|   511k|    state->shadow_x = style->Shadow;
 1094|   511k|    state->shadow_y = style->Shadow;
 1095|   511k|    state->frx = state->fry = 0.;
 1096|   511k|    state->frz = style->Angle;
 1097|   511k|    state->fax = state->fay = 0.;
 1098|   511k|    state->font_encoding = style->Encoding;
 1099|   511k|}
ass_outline_construct:
 1231|    309|{
 1232|    309|    ASS_Renderer *render_priv = priv;
 1233|    309|    OutlineHashKey *outline_key = key;
 1234|    309|    OutlineHashValue *v = value;
 1235|    309|    memset(v, 0, sizeof(*v));
 1236|       |
 1237|    309|    switch (outline_key->type) {
 1238|    180|    case OUTLINE_GLYPH:
  ------------------
  |  Branch (1238:5): [True: 180, False: 129]
  ------------------
 1239|    180|        {
 1240|    180|            GlyphHashKey *k = &outline_key->u.glyph;
 1241|    180|            ass_face_set_size(k->font->faces[k->face_index], k->size);
 1242|    180|            if (!ass_font_get_glyph(k->font, k->face_index, k->glyph_index,
  ------------------
  |  Branch (1242:17): [True: 4, False: 176]
  ------------------
 1243|    180|                                    render_priv->settings.hinting))
 1244|      4|                return 1;
 1245|    176|            if (!ass_get_glyph_outline(&v->outline[0], &v->advance,
  ------------------
  |  Branch (1245:17): [True: 0, False: 176]
  ------------------
 1246|    176|                                       k->font->faces[k->face_index],
 1247|    176|                                       k->flags))
 1248|      0|                return 1;
 1249|    176|            ass_font_get_asc_desc(k->font, k->face_index,
 1250|    176|                                  &v->asc, &v->desc);
 1251|    176|            break;
 1252|    176|        }
 1253|      0|    case OUTLINE_DRAWING:
  ------------------
  |  Branch (1253:5): [True: 0, False: 309]
  ------------------
 1254|      0|        {
 1255|      0|            ASS_Rect bbox;
 1256|      0|            const char *text = outline_key->u.drawing.text.str;  // always zero-terminated
 1257|      0|            if (!ass_drawing_parse(&v->outline[0], &bbox, text, render_priv->library))
  ------------------
  |  Branch (1257:17): [True: 0, False: 0]
  ------------------
 1258|      0|                return 1;
 1259|       |
 1260|      0|            v->advance = bbox.x_max - bbox.x_min;
 1261|      0|            v->asc = bbox.y_max - bbox.y_min;
 1262|      0|            v->desc = 0;
 1263|      0|            break;
 1264|      0|        }
 1265|    129|    case OUTLINE_BORDER:
  ------------------
  |  Branch (1265:5): [True: 129, False: 180]
  ------------------
 1266|    129|        {
 1267|    129|            BorderHashKey *k = &outline_key->u.border;
 1268|    129|            if (!k->border.x && !k->border.y)
  ------------------
  |  Branch (1268:17): [True: 0, False: 129]
  |  Branch (1268:33): [True: 0, False: 0]
  ------------------
 1269|      0|                break;
 1270|    129|            if (!k->outline->outline[0].n_points)
  ------------------
  |  Branch (1270:17): [True: 2, False: 127]
  ------------------
 1271|      2|                break;
 1272|       |
 1273|    127|            ASS_Outline src;
 1274|    127|            if (!ass_outline_scale_pow2(&src, &k->outline->outline[0],
  ------------------
  |  Branch (1274:17): [True: 0, False: 127]
  ------------------
 1275|    127|                                        k->scale_ord_x, k->scale_ord_y))
 1276|      0|                return 1;
 1277|    127|            if (!ass_outline_stroke(&v->outline[0], &v->outline[1], &src,
  ------------------
  |  Branch (1277:17): [True: 0, False: 127]
  ------------------
 1278|    127|                                    k->border.x * STROKER_PRECISION,
  ------------------
  |  |   43|    127|#define STROKER_PRECISION 16     // stroker error in integer units, unrelated to final accuracy
  ------------------
 1279|    127|                                    k->border.y * STROKER_PRECISION,
  ------------------
  |  |   43|    127|#define STROKER_PRECISION 16     // stroker error in integer units, unrelated to final accuracy
  ------------------
 1280|    127|                                    STROKER_PRECISION)) {
  ------------------
  |  |   43|    127|#define STROKER_PRECISION 16     // stroker error in integer units, unrelated to final accuracy
  ------------------
 1281|      0|                ass_msg(render_priv->library, MSGL_WARN, "Cannot stroke outline");
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 1282|      0|                ass_outline_free(&v->outline[0]);
 1283|      0|                ass_outline_free(&v->outline[1]);
 1284|      0|                ass_outline_free(&src);
 1285|      0|                return 1;
 1286|      0|            }
 1287|    127|            ass_outline_free(&src);
 1288|    127|            break;
 1289|    127|        }
 1290|      0|    case OUTLINE_BOX:
  ------------------
  |  Branch (1290:5): [True: 0, False: 309]
  ------------------
 1291|      0|        {
 1292|      0|            ASS_Outline *ol = &v->outline[0];
 1293|      0|            if (!ass_outline_alloc(ol, 4, 4))
  ------------------
  |  Branch (1293:17): [True: 0, False: 0]
  ------------------
 1294|      0|                return 1;
 1295|      0|            ol->points[0].x = ol->points[3].x = 0;
 1296|      0|            ol->points[1].x = ol->points[2].x = 64;
 1297|      0|            ol->points[0].y = ol->points[1].y = 0;
 1298|      0|            ol->points[2].y = ol->points[3].y = 64;
 1299|      0|            ol->segments[0] = OUTLINE_LINE_SEGMENT;
 1300|      0|            ol->segments[1] = OUTLINE_LINE_SEGMENT;
 1301|      0|            ol->segments[2] = OUTLINE_LINE_SEGMENT;
 1302|      0|            ol->segments[3] = OUTLINE_LINE_SEGMENT | OUTLINE_CONTOUR_END;
 1303|      0|            ol->n_points = ol->n_segments = 4;
 1304|      0|            break;
 1305|      0|        }
 1306|      0|    default:
  ------------------
  |  Branch (1306:5): [True: 0, False: 309]
  ------------------
 1307|      0|        return 1;
 1308|    309|    }
 1309|       |
 1310|    305|    rectangle_reset(&v->cbox);
 1311|    305|    ass_outline_update_cbox(&v->outline[0], &v->cbox);
 1312|    305|    ass_outline_update_cbox(&v->outline[1], &v->cbox);
 1313|    305|    if (v->cbox.x_min > v->cbox.x_max || v->cbox.y_min > v->cbox.y_max)
  ------------------
  |  Branch (1313:9): [True: 6, False: 299]
  |  Branch (1313:42): [True: 0, False: 299]
  ------------------
 1314|      6|        v->cbox.x_min = v->cbox.y_min = v->cbox.x_max = v->cbox.y_max = 0;
 1315|    305|    v->valid = true;
 1316|    305|    return 1;
 1317|    309|}
ass_bitmap_construct:
 1553|    606|{
 1554|    606|    RenderContext *state = priv;
 1555|    606|    BitmapHashKey *k = key;
 1556|    606|    Bitmap *bm = value;
 1557|       |
 1558|    606|    double m[3][3];
 1559|    606|    restore_transform(m, k);
 1560|       |
 1561|    606|    ASS_Outline outline[2];
 1562|    606|    if (k->matrix_z.x || k->matrix_z.y) {
  ------------------
  |  Branch (1562:9): [True: 0, False: 606]
  |  Branch (1562:26): [True: 0, False: 606]
  ------------------
 1563|      0|        ass_outline_transform_3d(&outline[0], &k->outline->outline[0], m);
 1564|      0|        ass_outline_transform_3d(&outline[1], &k->outline->outline[1], m);
 1565|    606|    } else {
 1566|    606|        ass_outline_transform_2d(&outline[0], &k->outline->outline[0], m);
 1567|    606|        ass_outline_transform_2d(&outline[1], &k->outline->outline[1], m);
 1568|    606|    }
 1569|       |
 1570|    606|    if (!ass_outline_to_bitmap(state, bm, &outline[0], &outline[1]))
  ------------------
  |  Branch (1570:9): [True: 6, False: 600]
  ------------------
 1571|      6|        memset(bm, 0, sizeof(*bm));
 1572|    606|    ass_outline_free(&outline[0]);
 1573|    606|    ass_outline_free(&outline[1]);
 1574|       |
 1575|    606|    return sizeof(BitmapHashKey) + sizeof(Bitmap) + bitmap_size(bm) +
 1576|    606|           sizeof(OutlineHashValue) + outline_size(&k->outline->outline[0]) + outline_size(&k->outline->outline[1]);
 1577|    606|}
ass_be_padding:
 2673|     18|{
 2674|     18|    if (be <= 3)
  ------------------
  |  Branch (2674:9): [True: 18, False: 0]
  ------------------
 2675|     18|        return be;
 2676|      0|    if (be <= 7)
  ------------------
  |  Branch (2676:9): [True: 0, False: 0]
  ------------------
 2677|      0|        return 4;
 2678|      0|    return 5;
 2679|      0|}
ass_composite_construct:
 2683|     18|{
 2684|     18|    ASS_Renderer *render_priv = priv;
 2685|     18|    CompositeHashKey *k = key;
 2686|     18|    CompositeHashValue *v = value;
 2687|     18|    memset(v, 0, sizeof(*v));
 2688|       |
 2689|     18|    ASS_Rect rect, rect_o;
 2690|     18|    rectangle_reset(&rect);
 2691|     18|    rectangle_reset(&rect_o);
 2692|       |
 2693|     18|    size_t n_bm = 0, n_bm_o = 0;
 2694|     18|    BitmapRef *last = NULL, *last_o = NULL;
 2695|   221k|    for (int i = 0; i < k->bitmap_count; i++) {
  ------------------
  |  Branch (2695:21): [True: 221k, False: 18]
  ------------------
 2696|   221k|        BitmapRef *ref = &k->bitmaps[i];
 2697|   221k|        if (ref->bm) {
  ------------------
  |  Branch (2697:13): [True: 221k, False: 0]
  ------------------
 2698|   221k|            rectangle_combine(&rect, ref->bm, ref->pos);
 2699|   221k|            last = ref;
 2700|   221k|            n_bm++;
 2701|   221k|        }
 2702|   221k|        if (ref->bm_o) {
  ------------------
  |  Branch (2702:13): [True: 221k, False: 0]
  ------------------
 2703|   221k|            rectangle_combine(&rect_o, ref->bm_o, ref->pos_o);
 2704|   221k|            last_o = ref;
 2705|   221k|            n_bm_o++;
 2706|   221k|        }
 2707|   221k|    }
 2708|       |
 2709|     18|    int bord = ass_be_padding(k->filter.be);
 2710|     18|    if (!bord && n_bm == 1) {
  ------------------
  |  Branch (2710:9): [True: 18, False: 0]
  |  Branch (2710:18): [True: 0, False: 18]
  ------------------
 2711|      0|        ass_copy_bitmap(&render_priv->engine, &v->bm, last->bm);
 2712|      0|        v->bm.left += last->pos.x;
 2713|      0|        v->bm.top  += last->pos.y;
 2714|     18|    } else if (n_bm && ass_alloc_bitmap(&render_priv->engine, &v->bm,
  ------------------
  |  Branch (2714:16): [True: 18, False: 0]
  |  Branch (2714:24): [True: 18, False: 0]
  ------------------
 2715|     18|                                        rect.x_max - rect.x_min + 2 * bord,
 2716|     18|                                        rect.y_max - rect.y_min + 2 * bord,
 2717|     18|                                        true)) {
 2718|     18|        Bitmap *dst = &v->bm;
 2719|     18|        dst->left = rect.x_min - bord;
 2720|     18|        dst->top  = rect.y_min - bord;
 2721|   221k|        for (int i = 0; i < k->bitmap_count; i++) {
  ------------------
  |  Branch (2721:25): [True: 221k, False: 18]
  ------------------
 2722|   221k|            Bitmap *src = k->bitmaps[i].bm;
 2723|   221k|            if (!src)
  ------------------
  |  Branch (2723:17): [True: 0, False: 221k]
  ------------------
 2724|      0|                continue;
 2725|   221k|            int x = k->bitmaps[i].pos.x + src->left - dst->left;
 2726|   221k|            int y = k->bitmaps[i].pos.y + src->top  - dst->top;
 2727|   221k|            assert(x >= 0 && x + src->w <= dst->w);
 2728|   221k|            assert(y >= 0 && y + src->h <= dst->h);
 2729|   221k|            unsigned char *buf = dst->buffer + y * dst->stride + x;
 2730|   221k|            render_priv->engine.add_bitmaps(buf, dst->stride,
 2731|   221k|                                            src->buffer, src->stride,
 2732|   221k|                                            src->w, src->h);
 2733|   221k|        }
 2734|     18|    }
 2735|     18|    if (!bord && n_bm_o == 1) {
  ------------------
  |  Branch (2735:9): [True: 18, False: 0]
  |  Branch (2735:18): [True: 0, False: 18]
  ------------------
 2736|      0|        ass_copy_bitmap(&render_priv->engine, &v->bm_o, last_o->bm_o);
 2737|      0|        v->bm_o.left += last_o->pos_o.x;
 2738|      0|        v->bm_o.top  += last_o->pos_o.y;
 2739|     18|    } else if (n_bm_o && ass_alloc_bitmap(&render_priv->engine, &v->bm_o,
  ------------------
  |  Branch (2739:16): [True: 18, False: 0]
  |  Branch (2739:26): [True: 18, False: 0]
  ------------------
 2740|     18|                                          rect_o.x_max - rect_o.x_min + 2 * bord,
 2741|     18|                                          rect_o.y_max - rect_o.y_min + 2 * bord,
 2742|     18|                                          true)) {
 2743|     18|        Bitmap *dst = &v->bm_o;
 2744|     18|        dst->left = rect_o.x_min - bord;
 2745|     18|        dst->top  = rect_o.y_min - bord;
 2746|   221k|        for (int i = 0; i < k->bitmap_count; i++) {
  ------------------
  |  Branch (2746:25): [True: 221k, False: 18]
  ------------------
 2747|   221k|            Bitmap *src = k->bitmaps[i].bm_o;
 2748|   221k|            if (!src)
  ------------------
  |  Branch (2748:17): [True: 0, False: 221k]
  ------------------
 2749|      0|                continue;
 2750|   221k|            int x = k->bitmaps[i].pos_o.x + src->left - dst->left;
 2751|   221k|            int y = k->bitmaps[i].pos_o.y + src->top  - dst->top;
 2752|   221k|            assert(x >= 0 && x + src->w <= dst->w);
 2753|   221k|            assert(y >= 0 && y + src->h <= dst->h);
 2754|   221k|            unsigned char *buf = dst->buffer + y * dst->stride + x;
 2755|   221k|            render_priv->engine.add_bitmaps(buf, dst->stride,
 2756|   221k|                                            src->buffer, src->stride,
 2757|   221k|                                            src->w, src->h);
 2758|   221k|        }
 2759|     18|    }
 2760|       |
 2761|     18|    int flags = k->filter.flags;
 2762|     18|    double r2x = restore_blur(k->filter.blur_x);
 2763|     18|    double r2y = restore_blur(k->filter.blur_y);
 2764|     18|    if (!(flags & FILTER_NONZERO_BORDER) || (flags & FILTER_BORDER_STYLE_3))
  ------------------
  |  Branch (2764:9): [True: 0, False: 18]
  |  Branch (2764:45): [True: 0, False: 18]
  ------------------
 2765|      0|        ass_synth_blur(&render_priv->engine, &v->bm, k->filter.be, r2x, r2y);
 2766|     18|    ass_synth_blur(&render_priv->engine, &v->bm_o, k->filter.be, r2x, r2y);
 2767|       |
 2768|     18|    if (!(flags & FILTER_FILL_IN_BORDER) && !(flags & FILTER_FILL_IN_SHADOW))
  ------------------
  |  Branch (2768:9): [True: 0, False: 18]
  |  Branch (2768:45): [True: 0, False: 0]
  ------------------
 2769|      0|        ass_fix_outline(&v->bm, &v->bm_o);
 2770|       |
 2771|     18|    if (flags & FILTER_NONZERO_SHADOW) {
  ------------------
  |  Branch (2771:9): [True: 18, False: 0]
  ------------------
 2772|     18|        if (flags & FILTER_NONZERO_BORDER) {
  ------------------
  |  Branch (2772:13): [True: 18, False: 0]
  ------------------
 2773|     18|            ass_copy_bitmap(&render_priv->engine, &v->bm_s, &v->bm_o);
 2774|     18|            if ((flags & FILTER_FILL_IN_BORDER) && !(flags & FILTER_FILL_IN_SHADOW))
  ------------------
  |  Branch (2774:17): [True: 18, False: 0]
  |  Branch (2774:52): [True: 0, False: 18]
  ------------------
 2775|      0|                ass_fix_outline(&v->bm, &v->bm_s);
 2776|     18|        } else if (flags & FILTER_BORDER_STYLE_3) {
  ------------------
  |  Branch (2776:20): [True: 0, False: 0]
  ------------------
 2777|      0|            v->bm_s = v->bm_o;
 2778|      0|            memset(&v->bm_o, 0, sizeof(v->bm_o));
 2779|      0|        } else {
 2780|      0|            ass_copy_bitmap(&render_priv->engine, &v->bm_s, &v->bm);
 2781|      0|        }
 2782|       |
 2783|       |        // Works right even for negative offsets
 2784|       |        // '>>' rounds toward negative infinity, '&' returns correct remainder
 2785|     18|        v->bm_s.left += k->filter.shadow.x >> 6;
 2786|     18|        v->bm_s.top  += k->filter.shadow.y >> 6;
 2787|     18|        ass_shift_bitmap(&v->bm_s, k->filter.shadow.x & SUBPIXEL_MASK, k->filter.shadow.y & SUBPIXEL_MASK);
  ------------------
  |  |   42|     18|#define SUBPIXEL_MASK 63
  ------------------
                      ass_shift_bitmap(&v->bm_s, k->filter.shadow.x & SUBPIXEL_MASK, k->filter.shadow.y & SUBPIXEL_MASK);
  ------------------
  |  |   42|     18|#define SUBPIXEL_MASK 63
  ------------------
 2788|     18|    }
 2789|       |
 2790|     18|    if ((flags & FILTER_FILL_IN_SHADOW) && !(flags & FILTER_FILL_IN_BORDER))
  ------------------
  |  Branch (2790:9): [True: 18, False: 0]
  |  Branch (2790:44): [True: 0, False: 18]
  ------------------
 2791|      0|        ass_fix_outline(&v->bm, &v->bm_o);
 2792|       |
 2793|     18|    return sizeof(CompositeHashKey) + sizeof(CompositeHashValue) +
 2794|     18|        k->bitmap_count * sizeof(BitmapRef) +
 2795|     18|        bitmap_size(&v->bm) + bitmap_size(&v->bm_o) + bitmap_size(&v->bm_s);
 2796|     18|}
ass_render_frame:
 3390|  51.2k|{
 3391|       |    // init frame
 3392|  51.2k|    if (!ass_start_frame(priv, track, now)) {
  ------------------
  |  Branch (3392:9): [True: 0, False: 51.2k]
  ------------------
 3393|      0|        if (detect_change)
  ------------------
  |  Branch (3393:13): [True: 0, False: 0]
  ------------------
 3394|      0|            *detect_change = 2;
 3395|      0|        return NULL;
 3396|      0|    }
 3397|       |
 3398|       |    // render events separately
 3399|  51.2k|    int cnt = 0;
 3400|  2.61G|    for (int i = 0; i < track->n_events; i++) {
  ------------------
  |  Branch (3400:21): [True: 2.61G, False: 51.2k]
  ------------------
 3401|  2.61G|        ASS_Event *event = track->events + i;
 3402|  2.61G|        if ((event->Start <= now)
  ------------------
  |  Branch (3402:13): [True: 2.61G, False: 0]
  ------------------
 3403|  2.61G|            && (now < (event->Start + event->Duration))) {
  ------------------
  |  Branch (3403:16): [True: 511k, False: 2.61G]
  ------------------
 3404|   511k|            if (cnt >= priv->eimg_size) {
  ------------------
  |  Branch (3404:17): [True: 10, False: 511k]
  ------------------
 3405|     10|                priv->eimg_size += 100;
 3406|     10|                priv->eimg =
 3407|     10|                    realloc(priv->eimg,
 3408|     10|                            priv->eimg_size * sizeof(EventImages));
 3409|     10|            }
 3410|   511k|            if (ass_render_event(&priv->state, event, priv->eimg + cnt))
  ------------------
  |  Branch (3410:17): [True: 204k, False: 307k]
  ------------------
 3411|   204k|                cnt++;
 3412|   511k|        }
 3413|  2.61G|    }
 3414|       |
 3415|       |    // sort by layer
 3416|  51.2k|    if (cnt > 0)
  ------------------
  |  Branch (3416:9): [True: 51.2k, False: 13]
  ------------------
 3417|  51.2k|        qsort(priv->eimg, cnt, sizeof(EventImages), cmp_event_layer);
 3418|       |
 3419|       |    // call fix_collisions for each group of events with the same layer
 3420|  51.2k|    EventImages *last = priv->eimg;
 3421|   204k|    for (int i = 1; i < cnt; i++)
  ------------------
  |  Branch (3421:21): [True: 153k, False: 51.2k]
  ------------------
 3422|   153k|        if (last->event->Layer != priv->eimg[i].event->Layer) {
  ------------------
  |  Branch (3422:13): [True: 0, False: 153k]
  ------------------
 3423|      0|            fix_collisions(priv, last, priv->eimg + i - last);
 3424|      0|            last = priv->eimg + i;
 3425|      0|        }
 3426|  51.2k|    if (cnt > 0)
  ------------------
  |  Branch (3426:9): [True: 51.2k, False: 13]
  ------------------
 3427|  51.2k|        fix_collisions(priv, last, priv->eimg + cnt - last);
 3428|       |
 3429|       |    // concat lists
 3430|  51.2k|    ASS_Image **tail = &priv->images_root;
 3431|   255k|    for (int i = 0; i < cnt; i++) {
  ------------------
  |  Branch (3431:21): [True: 204k, False: 51.2k]
  ------------------
 3432|   204k|        ASS_Image *cur = priv->eimg[i].imgs;
 3433|   512k|        while (cur) {
  ------------------
  |  Branch (3433:16): [True: 307k, False: 204k]
  ------------------
 3434|   307k|            *tail = cur;
 3435|   307k|            tail = &cur->next;
 3436|   307k|            cur = cur->next;
 3437|   307k|        }
 3438|   204k|    }
 3439|  51.2k|    ass_frame_ref(priv->images_root);
 3440|       |
 3441|  51.2k|    if (detect_change)
  ------------------
  |  Branch (3441:9): [True: 51.2k, False: 0]
  ------------------
 3442|  51.2k|        *detect_change = ass_detect_change(priv);
 3443|       |
 3444|       |    // free the previous image list
 3445|  51.2k|    ass_frame_unref(priv->prev_images_root);
 3446|  51.2k|    priv->prev_images_root = NULL;
 3447|       |
 3448|  51.2k|    return priv->images_root;
 3449|  51.2k|}
ass_frame_ref:
 3456|  51.2k|{
 3457|  51.2k|    if (!img)
  ------------------
  |  Branch (3457:9): [True: 24, False: 51.2k]
  ------------------
 3458|     24|        return;
 3459|  51.2k|    ((ASS_ImagePriv *) img)->ref_count++;
 3460|  51.2k|}
ass_frame_unref:
 3467|  51.2k|{
 3468|  51.2k|    if (!img || --((ASS_ImagePriv *) img)->ref_count)
  ------------------
  |  Branch (3468:9): [True: 90, False: 51.2k]
  |  Branch (3468:17): [True: 0, False: 51.2k]
  ------------------
 3469|     90|        return;
 3470|   307k|    do {
 3471|   307k|        ASS_ImagePriv *priv = (ASS_ImagePriv *) img;
 3472|   307k|        img = img->next;
 3473|   307k|        ass_cache_dec_ref(priv->source);
 3474|   307k|        ass_aligned_free(priv->buffer);
 3475|   307k|        free(priv);
 3476|   307k|    } while (img);
  ------------------
  |  Branch (3476:14): [True: 256k, False: 51.2k]
  ------------------
 3477|  51.2k|}
ass_render.c:text_info_init:
   52|     33|{
   53|     33|    text_info->max_bitmaps = MAX_BITMAPS_INITIAL;
  ------------------
  |  |   40|     33|#define MAX_BITMAPS_INITIAL 16
  ------------------
   54|     33|    text_info->max_glyphs = MAX_GLYPHS_INITIAL;
  ------------------
  |  |   38|     33|#define MAX_GLYPHS_INITIAL 1024
  ------------------
   55|     33|    text_info->max_lines = MAX_LINES_INITIAL;
  ------------------
  |  |   39|     33|#define MAX_LINES_INITIAL 64
  ------------------
   56|     33|    text_info->n_bitmaps = 0;
   57|     33|    text_info->combined_bitmaps = calloc(MAX_BITMAPS_INITIAL, sizeof(CombinedBitmapInfo));
  ------------------
  |  |   40|     33|#define MAX_BITMAPS_INITIAL 16
  ------------------
   58|     33|    text_info->glyphs = calloc(MAX_GLYPHS_INITIAL, sizeof(GlyphInfo));
  ------------------
  |  |   38|     33|#define MAX_GLYPHS_INITIAL 1024
  ------------------
   59|     33|    text_info->event_text = calloc(MAX_GLYPHS_INITIAL, sizeof(FriBidiChar));
  ------------------
  |  |   38|     33|#define MAX_GLYPHS_INITIAL 1024
  ------------------
   60|     33|    text_info->breaks = malloc(MAX_GLYPHS_INITIAL);
  ------------------
  |  |   38|     33|#define MAX_GLYPHS_INITIAL 1024
  ------------------
   61|     33|    text_info->lines = calloc(MAX_LINES_INITIAL, sizeof(LineInfo));
  ------------------
  |  |   39|     33|#define MAX_LINES_INITIAL 64
  ------------------
   62|       |
   63|     33|    if (!text_info->combined_bitmaps || !text_info->glyphs || !text_info->lines ||
  ------------------
  |  Branch (63:9): [True: 0, False: 33]
  |  Branch (63:41): [True: 0, False: 33]
  |  Branch (63:63): [True: 0, False: 33]
  ------------------
   64|     33|        !text_info->breaks || !text_info->event_text)
  ------------------
  |  Branch (64:9): [True: 0, False: 33]
  |  Branch (64:31): [True: 0, False: 33]
  ------------------
   65|      0|        return false;
   66|       |
   67|     33|    return true;
   68|     33|}
ass_render.c:text_info_done:
   71|     33|{
   72|     33|    free(text_info->glyphs);
   73|     33|    free(text_info->event_text);
   74|     33|    free(text_info->breaks);
   75|     33|    free(text_info->lines);
   76|     33|    free(text_info->combined_bitmaps);
   77|     33|}
ass_render.c:handle_selective_style_overrides:
  899|   511k|{
  900|       |    // The script style is the one the event was declared with.
  901|   511k|    ASS_Renderer *render_priv = state->renderer;
  902|   511k|    ASS_Style *script = render_priv->track->styles +
  903|   511k|                        state->event->Style;
  904|       |    // The user style was set with ass_set_selective_style_override().
  905|   511k|    ASS_Style *user = &render_priv->user_override_style;
  906|   511k|    ASS_Style *new = &state->override_style_temp_storage;
  907|   511k|    int explicit = state->explicit;
  908|   511k|    int requested = render_priv->settings.selective_style_overrides;
  909|   511k|    double scale;
  910|       |
  911|       |    // Either the event's style, or the style forced with a \r tag.
  912|   511k|    if (!rstyle)
  ------------------
  |  Branch (912:9): [True: 511k, False: 0]
  ------------------
  913|   511k|        rstyle = script;
  914|       |
  915|       |    // Create a new style that contains a mix of the original style and
  916|       |    // user_style (the user's override style). Copy only fields from the
  917|       |    // script's style that are deemed necessary.
  918|   511k|    *new = *rstyle;
  919|       |
  920|   511k|    state->apply_font_scale =
  921|   511k|        !explicit || !(requested & ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE);
  ------------------
  |  Branch (921:9): [True: 511k, False: 52]
  |  Branch (921:22): [True: 0, False: 52]
  ------------------
  922|       |
  923|       |    // On positioned events, do not apply most overrides.
  924|   511k|    if (explicit)
  ------------------
  |  Branch (924:9): [True: 52, False: 511k]
  ------------------
  925|     52|        requested = 0;
  926|       |
  927|   511k|    if (requested & ASS_OVERRIDE_BIT_STYLE)
  ------------------
  |  Branch (927:9): [True: 0, False: 511k]
  ------------------
  928|      0|        requested |= ASS_OVERRIDE_BIT_FONT_NAME |
  929|      0|                     ASS_OVERRIDE_BIT_FONT_SIZE_FIELDS |
  930|      0|                     ASS_OVERRIDE_BIT_COLORS |
  931|      0|                     ASS_OVERRIDE_BIT_BORDER |
  932|      0|                     ASS_OVERRIDE_BIT_ATTRIBUTES;
  933|       |
  934|       |    // Copies fields even not covered by any of the other bits.
  935|   511k|    if (requested & ASS_OVERRIDE_FULL_STYLE)
  ------------------
  |  Branch (935:9): [True: 0, False: 511k]
  ------------------
  936|      0|        *new = *user;
  937|       |
  938|       |    // The user style is supposed to be independent of the script resolution.
  939|       |    // Treat the user style's values as if they were specified for a script with
  940|       |    // PlayResY=288, and rescale the values to the current script.
  941|   511k|    scale = render_priv->track->PlayResY / 288.0;
  942|       |
  943|   511k|    if (requested & ASS_OVERRIDE_BIT_FONT_SIZE_FIELDS) {
  ------------------
  |  Branch (943:9): [True: 0, False: 511k]
  ------------------
  944|      0|        new->FontSize = user->FontSize * scale;
  945|      0|        new->Spacing = user->Spacing * scale;
  946|      0|        new->ScaleX = user->ScaleX;
  947|      0|        new->ScaleY = user->ScaleY;
  948|      0|    }
  949|       |
  950|   511k|    if (requested & ASS_OVERRIDE_BIT_FONT_NAME) {
  ------------------
  |  Branch (950:9): [True: 0, False: 511k]
  ------------------
  951|      0|        new->FontName = user->FontName;
  952|      0|        new->treat_fontname_as_pattern = user->treat_fontname_as_pattern;
  953|      0|    }
  954|       |
  955|   511k|    if (requested & ASS_OVERRIDE_BIT_COLORS) {
  ------------------
  |  Branch (955:9): [True: 0, False: 511k]
  ------------------
  956|      0|        new->PrimaryColour = user->PrimaryColour;
  957|      0|        new->SecondaryColour = user->SecondaryColour;
  958|      0|        new->OutlineColour = user->OutlineColour;
  959|      0|        new->BackColour = user->BackColour;
  960|      0|    }
  961|       |
  962|   511k|    if (requested & ASS_OVERRIDE_BIT_ATTRIBUTES) {
  ------------------
  |  Branch (962:9): [True: 0, False: 511k]
  ------------------
  963|      0|        new->Bold = user->Bold;
  964|      0|        new->Italic = user->Italic;
  965|      0|        new->Underline = user->Underline;
  966|      0|        new->StrikeOut = user->StrikeOut;
  967|      0|    }
  968|       |
  969|   511k|    if (requested & ASS_OVERRIDE_BIT_BORDER) {
  ------------------
  |  Branch (969:9): [True: 0, False: 511k]
  ------------------
  970|      0|        new->BorderStyle = user->BorderStyle;
  971|      0|        new->Outline = user->Outline * scale;
  972|      0|        new->Shadow = user->Shadow * scale;
  973|      0|    }
  974|       |
  975|   511k|    if (requested & ASS_OVERRIDE_BIT_ALIGNMENT)
  ------------------
  |  Branch (975:9): [True: 0, False: 511k]
  ------------------
  976|      0|        new->Alignment = user->Alignment;
  977|       |
  978|   511k|    if (requested & ASS_OVERRIDE_BIT_JUSTIFY)
  ------------------
  |  Branch (978:9): [True: 0, False: 511k]
  ------------------
  979|      0|        new->Justify = user->Justify;
  980|       |
  981|   511k|    if (requested & ASS_OVERRIDE_BIT_MARGINS) {
  ------------------
  |  Branch (981:9): [True: 0, False: 511k]
  ------------------
  982|      0|        new->MarginL = user->MarginL;
  983|      0|        new->MarginR = user->MarginR;
  984|      0|        new->MarginV = user->MarginV;
  985|      0|    }
  986|       |
  987|   511k|    if (!new->FontName)
  ------------------
  |  Branch (987:9): [True: 0, False: 511k]
  ------------------
  988|      0|        new->FontName = rstyle->FontName;
  989|       |
  990|   511k|    state->style = new;
  991|   511k|    state->overrides = requested;
  992|       |
  993|   511k|    return new;
  994|   511k|}
ass_render.c:init_font_scale:
 1024|   511k|{
 1025|   511k|    ASS_Renderer *render_priv = state->renderer;
 1026|   511k|    ASS_Settings *settings_priv = &render_priv->settings;
 1027|       |
 1028|   511k|    double font_scr_w = render_priv->frame_content_width;
 1029|   511k|    double font_scr_h = render_priv->frame_content_height;
 1030|   511k|    if (!state->explicit && render_priv->settings.use_margins) {
  ------------------
  |  Branch (1030:9): [True: 511k, False: 52]
  |  Branch (1030:29): [True: 0, False: 511k]
  ------------------
 1031|      0|        font_scr_w = render_priv->fit_width;
 1032|      0|        font_scr_h = render_priv->fit_height;
 1033|      0|    }
 1034|       |
 1035|   511k|    state->screen_scale_x = font_scr_w / render_priv->track->PlayResX;
 1036|   511k|    state->screen_scale_y = font_scr_h / render_priv->track->PlayResY;
 1037|       |
 1038|   511k|    ASS_Vector layout_res = ass_layout_res(render_priv);
 1039|   511k|    state->blur_scale_x = font_scr_w / layout_res.x;
 1040|   511k|    state->blur_scale_y = font_scr_h / layout_res.y;
 1041|   511k|    if (render_priv->track->ScaledBorderAndShadow) {
  ------------------
  |  Branch (1041:9): [True: 511k, False: 222]
  ------------------
 1042|   511k|        state->border_scale_x = state->screen_scale_x;
 1043|   511k|        state->border_scale_y = state->screen_scale_y;
 1044|   511k|    } else {
 1045|    222|        state->border_scale_x = state->blur_scale_x;
 1046|    222|        state->border_scale_y = state->blur_scale_y;
 1047|    222|    }
 1048|       |
 1049|   511k|    if (state->apply_font_scale) {
  ------------------
  |  Branch (1049:9): [True: 511k, False: 52]
  ------------------
 1050|   511k|        state->screen_scale_x *= settings_priv->font_size_coeff;
 1051|   511k|        state->screen_scale_y *= settings_priv->font_size_coeff;
 1052|   511k|        state->border_scale_x *= settings_priv->font_size_coeff;
 1053|   511k|        state->border_scale_y *= settings_priv->font_size_coeff;
 1054|   511k|        state->blur_scale_x *= settings_priv->font_size_coeff;
 1055|   511k|        state->blur_scale_y *= settings_priv->font_size_coeff;
 1056|   511k|    }
 1057|   511k|}
ass_render.c:restore_transform:
  637|    606|{
  638|    606|    const ASS_Rect *bbox = &key->outline->cbox;
  639|    606|    double x0 = (bbox->x_min + bbox->x_max) / 2.0;
  640|    606|    double y0 = (bbox->y_min + bbox->y_max) / 2.0;
  641|    606|    double dx = (bbox->x_max - bbox->x_min) / 2.0 + 64;
  642|    606|    double dy = (bbox->y_max - bbox->y_min) / 2.0 + 64;
  643|       |
  644|       |    // Arbitrary scale has chosen so that z0 = 1
  645|    606|    double q_x = POSITION_PRECISION / dx;
  ------------------
  |  |   45|    606|#define POSITION_PRECISION 8.0   // rough estimate of transform error in 1/64 pixel units
  ------------------
  646|    606|    double q_y = POSITION_PRECISION / dy;
  ------------------
  |  |   45|    606|#define POSITION_PRECISION 8.0   // rough estimate of transform error in 1/64 pixel units
  ------------------
  647|    606|    m[0][0] = key->matrix_x.x * q_x;
  648|    606|    m[0][1] = key->matrix_x.y * q_y;
  649|    606|    m[1][0] = key->matrix_y.x * q_x;
  650|    606|    m[1][1] = key->matrix_y.y * q_y;
  651|       |
  652|    606|    int32_t qmx = abs(key->matrix_x.x) + abs(key->matrix_x.y);
  653|    606|    int32_t qmy = abs(key->matrix_y.x) + abs(key->matrix_y.y);
  654|    606|    double scale_z = 1.0 / POSITION_PRECISION / FFMAX(qmx, qmy);
  ------------------
  |  |   45|    606|#define POSITION_PRECISION 8.0   // rough estimate of transform error in 1/64 pixel units
  ------------------
                  double scale_z = 1.0 / POSITION_PRECISION / FFMAX(qmx, qmy);
  ------------------
  |  |   46|    606|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 57, False: 549]
  |  |  ------------------
  ------------------
  655|    606|    m[2][0] = key->matrix_z.x * q_x * scale_z;  // qm_zx * q_zx
  656|    606|    m[2][1] = key->matrix_z.y * q_y * scale_z;  // qm_zy * q_zy
  657|       |
  658|    606|    m[0][2] = m[1][2] = 0;
  659|    606|    m[2][2] = 1 + fabs(m[2][0]) * dx + fabs(m[2][1]) * dy;
  660|    606|    m[2][2] = FFMIN(m[2][2], MAX_PERSP_SCALE);
  ------------------
  |  |   47|    606|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 0, False: 606]
  |  |  ------------------
  ------------------
  661|       |
  662|    606|    double center[2] = {
  663|    606|        key->offset.x * (64 >> SUBPIXEL_ORDER),
  ------------------
  |  |   47|    606|#define SUBPIXEL_ORDER 3  // ~ log2(64 / POSITION_PRECISION)
  ------------------
  664|    606|        key->offset.y * (64 >> SUBPIXEL_ORDER),
  ------------------
  |  |   47|    606|#define SUBPIXEL_ORDER 3  // ~ log2(64 / POSITION_PRECISION)
  ------------------
  665|    606|    };
  666|  1.81k|    for (int i = 0; i < 2; i++)
  ------------------
  |  Branch (666:21): [True: 1.21k, False: 606]
  ------------------
  667|  4.84k|        for (int j = 0; j < 3; j++)
  ------------------
  |  Branch (667:25): [True: 3.63k, False: 1.21k]
  ------------------
  668|  3.63k|            m[i][j] += m[2][j] * center[i];
  669|       |
  670|  2.42k|    for (int i = 0; i < 3; i++)
  ------------------
  |  Branch (670:21): [True: 1.81k, False: 606]
  ------------------
  671|  1.81k|        m[i][2] -= m[i][0] * x0 + m[i][1] * y0;
  672|    606|}
ass_render.c:bitmap_size:
  676|    660|{
  677|    660|    return bm->stride * bm->h;
  678|    660|}
ass_render.c:outline_size:
 1548|  1.21k|{
 1549|  1.21k|    return sizeof(ASS_Vector) * outline->n_points + outline->n_segments;
 1550|  1.21k|}
ass_render.c:rectangle_combine:
 2648|   443k|{
 2649|   443k|    pos.x += bm->left;
 2650|   443k|    pos.y += bm->top;
 2651|   443k|    rectangle_update(rect, pos.x, pos.y, pos.x + bm->w, pos.y + bm->h);
 2652|   443k|}
ass_render.c:restore_blur:
 2473|     36|{
 2474|     36|    const double scale = 64 * BLUR_PRECISION / POSITION_PRECISION;
  ------------------
  |  |   48|     36|#define BLUR_PRECISION (1.0 / 256)  // blur error as fraction of full input range
  ------------------
                  const double scale = 64 * BLUR_PRECISION / POSITION_PRECISION;
  ------------------
  |  |   45|     36|#define POSITION_PRECISION 8.0   // rough estimate of transform error in 1/64 pixel units
  ------------------
 2475|     36|    double sigma = expm1(BLUR_PRECISION * qblur) / scale;
  ------------------
  |  |   48|     36|#define BLUR_PRECISION (1.0 / 256)  // blur error as fraction of full input range
  ------------------
 2476|     36|    return sigma * sigma;
 2477|     36|}
ass_render.c:ass_start_frame:
 3086|  51.2k|{
 3087|  51.2k|    if (!render_priv->settings.frame_width
  ------------------
  |  Branch (3087:9): [True: 0, False: 51.2k]
  ------------------
 3088|  51.2k|        && !render_priv->settings.frame_height)
  ------------------
  |  Branch (3088:12): [True: 0, False: 0]
  ------------------
 3089|      0|        return false;               // library not initialized
 3090|       |
 3091|  51.2k|    if (!render_priv->fontselect)
  ------------------
  |  Branch (3091:9): [True: 0, False: 51.2k]
  ------------------
 3092|      0|        return false;
 3093|       |
 3094|  51.2k|    if (render_priv->library != track->library)
  ------------------
  |  Branch (3094:9): [True: 0, False: 51.2k]
  ------------------
 3095|      0|        return false;
 3096|       |
 3097|  51.2k|    if (track->n_events == 0)
  ------------------
  |  Branch (3097:9): [True: 0, False: 51.2k]
  ------------------
 3098|      0|        return false;               // nothing to do
 3099|       |
 3100|  51.2k|    render_priv->track = track;
 3101|  51.2k|    render_priv->time = now;
 3102|       |
 3103|  51.2k|    ass_lazy_track_init(render_priv->library, render_priv->track);
 3104|       |
 3105|  51.2k|    if (render_priv->library->num_fontdata != render_priv->num_emfonts) {
  ------------------
  |  Branch (3105:9): [True: 0, False: 51.2k]
  ------------------
 3106|      0|        assert(render_priv->library->num_fontdata > render_priv->num_emfonts);
 3107|      0|        render_priv->num_emfonts = ass_update_embedded_fonts(
 3108|      0|            render_priv->fontselect, render_priv->num_emfonts);
 3109|      0|    }
 3110|       |
 3111|  51.2k|    setup_shaper(render_priv->state.shaper, render_priv);
 3112|       |
 3113|       |    // PAR correction
 3114|  51.2k|    double par = render_priv->settings.par;
 3115|  51.2k|    bool lr_track = track->LayoutResX > 0 && track->LayoutResY > 0;
  ------------------
  |  Branch (3115:21): [True: 0, False: 51.2k]
  |  Branch (3115:46): [True: 0, False: 0]
  ------------------
 3116|  51.2k|    if (par == 0. || lr_track) {
  ------------------
  |  Branch (3116:9): [True: 51.2k, False: 0]
  |  Branch (3116:22): [True: 0, False: 0]
  ------------------
 3117|  51.2k|        if (render_priv->frame_content_width && render_priv->frame_content_height && (lr_track ||
  ------------------
  |  Branch (3117:13): [True: 51.2k, False: 0]
  |  Branch (3117:49): [True: 51.2k, False: 0]
  |  Branch (3117:87): [True: 0, False: 51.2k]
  ------------------
 3118|  51.2k|                (render_priv->settings.storage_width && render_priv->settings.storage_height))) {
  ------------------
  |  Branch (3118:18): [True: 51.2k, False: 0]
  |  Branch (3118:57): [True: 51.2k, False: 0]
  ------------------
 3119|  51.2k|            double dar = ((double) render_priv->frame_content_width) /
 3120|  51.2k|                         render_priv->frame_content_height;
 3121|  51.2k|            ASS_Vector layout_res = ass_layout_res(render_priv);
 3122|  51.2k|            double sar = ((double) layout_res.x) / layout_res.y;
 3123|  51.2k|            par = dar / sar;
 3124|  51.2k|        } else
 3125|      0|            par = 1.0;
 3126|  51.2k|    }
 3127|  51.2k|    render_priv->par_scale_x = par;
 3128|       |
 3129|  51.2k|    render_priv->prev_images_root = render_priv->images_root;
 3130|  51.2k|    render_priv->images_root = NULL;
 3131|       |
 3132|  51.2k|    check_cache_limits(render_priv, &render_priv->cache);
 3133|       |
 3134|  51.2k|    return true;
 3135|  51.2k|}
ass_render.c:setup_shaper:
 3066|  51.2k|{
 3067|  51.2k|    ASS_Track *track = render_priv->track;
 3068|       |
 3069|  51.2k|    ass_shaper_set_kerning(shaper, track->Kerning);
 3070|  51.2k|    ass_shaper_set_language(shaper, track->Language);
 3071|  51.2k|    ass_shaper_set_level(shaper, render_priv->settings.shaper);
 3072|  51.2k|#ifdef USE_FRIBIDI_EX_API
 3073|  51.2k|    ass_shaper_set_bidi_brackets(shaper,
 3074|  51.2k|            track->parser_priv->feature_flags & FEATURE_MASK(ASS_FEATURE_BIDI_BRACKETS));
  ------------------
  |  |   52|  51.2k|#define FEATURE_MASK(feat) (((uint32_t) 1) << (feat))
  ------------------
 3075|  51.2k|#endif
 3076|  51.2k|    ass_shaper_set_whole_text_layout(shaper,
 3077|  51.2k|            track->parser_priv->feature_flags & FEATURE_MASK(ASS_FEATURE_WHOLE_TEXT_LAYOUT));
  ------------------
  |  |   52|  51.2k|#define FEATURE_MASK(feat) (((uint32_t) 1) << (feat))
  ------------------
 3078|  51.2k|}
ass_render.c:check_cache_limits:
 3059|  51.2k|{
 3060|  51.2k|    ass_cache_cut(cache->composite_cache, cache->composite_max_size);
 3061|  51.2k|    ass_cache_cut(cache->bitmap_cache, cache->bitmap_max_size);
 3062|  51.2k|    ass_cache_cut(cache->outline_cache, cache->glyph_max);
 3063|  51.2k|}
ass_render.c:ass_render_event:
 2838|   511k|{
 2839|   511k|    ASS_Renderer *render_priv = state->renderer;
 2840|   511k|    if (event->Style >= render_priv->track->n_styles) {
  ------------------
  |  Branch (2840:9): [True: 0, False: 511k]
  ------------------
 2841|      0|        ass_msg(render_priv->library, MSGL_WARN, "No style found");
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 2842|      0|        return false;
 2843|      0|    }
 2844|   511k|    if (!event->Text) {
  ------------------
  |  Branch (2844:9): [True: 0, False: 511k]
  ------------------
 2845|      0|        ass_msg(render_priv->library, MSGL_WARN, "Empty event");
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 2846|      0|        return false;
 2847|      0|    }
 2848|       |
 2849|   511k|    free_render_context(state);
 2850|   511k|    init_render_context(state, event);
 2851|       |
 2852|   511k|    if (!parse_events(state, event))
  ------------------
  |  Branch (2852:9): [True: 0, False: 511k]
  ------------------
 2853|      0|        return false;
 2854|       |
 2855|   511k|    TextInfo *text_info = state->text_info;
 2856|   511k|    if (text_info->length == 0) {
  ------------------
  |  Branch (2856:9): [True: 307k, False: 204k]
  ------------------
 2857|       |        // no valid symbols in the event; this can be smth like {comment}
 2858|   307k|        free_render_context(state);
 2859|   307k|        return false;
 2860|   307k|    }
 2861|       |
 2862|   204k|    split_style_runs(state);
 2863|       |
 2864|       |    // Find shape runs and shape text
 2865|   204k|    ass_shaper_set_base_direction(state->shaper,
 2866|   204k|            ass_resolve_base_direction(state->font_encoding));
 2867|   204k|    ass_shaper_find_runs(state->shaper, render_priv, text_info->glyphs,
 2868|   204k|            text_info->length);
 2869|   204k|    if (!ass_shaper_shape(state->shaper, text_info)) {
  ------------------
  |  Branch (2869:9): [True: 0, False: 204k]
  ------------------
 2870|      0|        ass_msg(render_priv->library, MSGL_ERR, "Failed to shape text");
  ------------------
  |  |   40|      0|#define MSGL_ERR 1
  ------------------
 2871|      0|        free_render_context(state);
 2872|      0|        return false;
 2873|      0|    }
 2874|       |
 2875|   204k|    retrieve_glyphs(state);
 2876|       |
 2877|   204k|    preliminary_layout(state);
 2878|       |
 2879|   204k|    int valign = state->alignment & 12;
 2880|       |
 2881|   204k|    int MarginL =
 2882|   204k|        (event->MarginL) ? event->MarginL : state->style->MarginL;
  ------------------
  |  Branch (2882:9): [True: 0, False: 204k]
  ------------------
 2883|   204k|    int MarginR =
 2884|   204k|        (event->MarginR) ? event->MarginR : state->style->MarginR;
  ------------------
  |  Branch (2884:9): [True: 0, False: 204k]
  ------------------
 2885|   204k|    int MarginV =
 2886|   204k|        (event->MarginV) ? event->MarginV : state->style->MarginV;
  ------------------
  |  Branch (2886:9): [True: 0, False: 204k]
  ------------------
 2887|       |
 2888|       |    // calculate max length of a line
 2889|   204k|    double max_text_width =
 2890|   204k|        x2scr_right(state, render_priv->track->PlayResX - MarginR) -
 2891|   204k|        x2scr_left(state, MarginL);
 2892|       |
 2893|       |    // wrap lines
 2894|   204k|    wrap_lines_smart(state, max_text_width);
 2895|       |
 2896|       |    // depends on glyph x coordinates being monotonous within runs, so it should be done before reorder
 2897|   204k|    ass_process_karaoke_effects(state);
 2898|       |
 2899|   204k|    reorder_text(state);
 2900|       |
 2901|   204k|    align_lines(state, max_text_width);
 2902|       |
 2903|       |    // determing text bounding box
 2904|   204k|    ASS_DRect bbox;
 2905|   204k|    compute_string_bbox(text_info, &bbox);
 2906|       |
 2907|   204k|    apply_baseline_shear(state);
 2908|       |
 2909|       |    // determine device coordinates for text
 2910|   204k|    double device_x = 0;
 2911|   204k|    double device_y = 0;
 2912|       |
 2913|       |    // handle positioned events first: an event can be both positioned and
 2914|       |    // scrolling, and the scrolling effect overrides the position on one axis
 2915|   204k|    if (state->evt_type & EVENT_POSITIONED) {
  ------------------
  |  Branch (2915:9): [True: 52, False: 204k]
  ------------------
 2916|     52|        double base_x = 0;
 2917|     52|        double base_y = 0;
 2918|     52|        get_base_point(&bbox, state->alignment, &base_x, &base_y);
 2919|     52|        device_x =
 2920|     52|            x2scr_pos(render_priv, state->pos_x) - base_x;
 2921|     52|        device_y =
 2922|     52|            y2scr_pos(render_priv, state->pos_y) - base_y;
 2923|     52|    }
 2924|       |
 2925|       |    // x coordinate
 2926|   204k|    if (state->evt_type & EVENT_HSCROLL) {
  ------------------
  |  Branch (2926:9): [True: 0, False: 204k]
  ------------------
 2927|      0|        if (state->scroll_direction == SCROLL_RL)
  ------------------
  |  Branch (2927:13): [True: 0, False: 0]
  ------------------
 2928|      0|            device_x =
 2929|      0|                x2scr_pos(render_priv,
 2930|      0|                      render_priv->track->PlayResX -
 2931|      0|                      state->scroll_shift);
 2932|      0|        else if (state->scroll_direction == SCROLL_LR)
  ------------------
  |  Branch (2932:18): [True: 0, False: 0]
  ------------------
 2933|      0|            device_x =
 2934|      0|                x2scr_pos(render_priv, state->scroll_shift) -
 2935|      0|                (bbox.x_max - bbox.x_min);
 2936|   204k|    } else if (!(state->evt_type & EVENT_POSITIONED)) {
  ------------------
  |  Branch (2936:16): [True: 204k, False: 52]
  ------------------
 2937|   204k|        device_x = x2scr_left(state, MarginL);
 2938|   204k|    }
 2939|       |
 2940|       |    // y coordinate
 2941|   204k|    if (state->evt_type & EVENT_VSCROLL) {
  ------------------
  |  Branch (2941:9): [True: 0, False: 204k]
  ------------------
 2942|      0|        if (state->scroll_direction == SCROLL_TB)
  ------------------
  |  Branch (2942:13): [True: 0, False: 0]
  ------------------
 2943|      0|            device_y =
 2944|      0|                y2scr(state,
 2945|      0|                      state->scroll_y0 +
 2946|      0|                      state->scroll_shift) -
 2947|      0|                bbox.y_max;
 2948|      0|        else if (state->scroll_direction == SCROLL_BT)
  ------------------
  |  Branch (2948:18): [True: 0, False: 0]
  ------------------
 2949|      0|            device_y =
 2950|      0|                y2scr(state,
 2951|      0|                      state->scroll_y1 -
 2952|      0|                      state->scroll_shift) -
 2953|      0|                bbox.y_min;
 2954|   204k|    } else if (!(state->evt_type & EVENT_POSITIONED)) {
  ------------------
  |  Branch (2954:16): [True: 204k, False: 52]
  ------------------
 2955|   204k|        if (valign == VALIGN_TOP) {     // toptitle
  ------------------
  |  |   74|   204k|#define VALIGN_TOP 4
  ------------------
  |  Branch (2955:13): [True: 0, False: 204k]
  ------------------
 2956|      0|            device_y =
 2957|      0|                y2scr_top(state,
 2958|      0|                          MarginV) + text_info->lines[0].asc;
 2959|   204k|        } else if (valign == VALIGN_CENTER) {   // midtitle
  ------------------
  |  |   73|   204k|#define VALIGN_CENTER 8
  ------------------
  |  Branch (2959:20): [True: 0, False: 204k]
  ------------------
 2960|      0|            double scr_y =
 2961|      0|                y2scr(state, render_priv->track->PlayResY / 2.0);
 2962|      0|            device_y = scr_y - (bbox.y_max + bbox.y_min) / 2.0;
 2963|   204k|        } else {                // subtitle
 2964|   204k|            double line_pos = state->explicit ?
  ------------------
  |  Branch (2964:31): [True: 0, False: 204k]
  ------------------
 2965|   204k|                0 : render_priv->settings.line_position;
 2966|   204k|            double scr_top, scr_bottom, scr_y0;
 2967|   204k|            if (valign != VALIGN_SUB)
  ------------------
  |  |   72|   204k|#define VALIGN_SUB 0
  ------------------
  |  Branch (2967:17): [True: 0, False: 204k]
  ------------------
 2968|      0|                ass_msg(render_priv->library, MSGL_V,
  ------------------
  |  |   43|      0|#define MSGL_V 6
  ------------------
 2969|      0|                       "Invalid valign, assuming 0 (subtitle)");
 2970|   204k|            scr_bottom =
 2971|   204k|                y2scr_sub(state,
 2972|   204k|                          render_priv->track->PlayResY - MarginV);
 2973|   204k|            scr_top = y2scr_top(state, 0); //xxx not always 0?
 2974|   204k|            device_y = scr_bottom + (scr_top - scr_bottom) * line_pos / 100.0;
 2975|   204k|            device_y -= text_info->height;
 2976|   204k|            device_y += text_info->lines[0].asc;
 2977|       |            // clip to top to avoid confusion if line_position is very high,
 2978|       |            // turning the subtitle into a toptitle
 2979|       |            // also, don't change behavior if line_position is not used
 2980|   204k|            scr_y0 = scr_top + text_info->lines[0].asc;
 2981|   204k|            if (device_y < scr_y0 && line_pos > 0) {
  ------------------
  |  Branch (2981:17): [True: 0, False: 204k]
  |  Branch (2981:38): [True: 0, False: 0]
  ------------------
 2982|      0|                device_y = scr_y0;
 2983|      0|            }
 2984|   204k|        }
 2985|   204k|    }
 2986|       |
 2987|       |    // fix clip coordinates
 2988|   204k|    if (state->explicit || !render_priv->settings.use_margins) {
  ------------------
  |  Branch (2988:9): [True: 52, False: 204k]
  |  Branch (2988:28): [True: 204k, False: 0]
  ------------------
 2989|   204k|        state->clip_x0 =
 2990|   204k|            lround(x2scr_pos_scaled(render_priv, state->clip_x0));
 2991|   204k|        state->clip_x1 =
 2992|   204k|            lround(x2scr_pos_scaled(render_priv, state->clip_x1));
 2993|   204k|        state->clip_y0 =
 2994|   204k|            lround(y2scr_pos(render_priv, state->clip_y0));
 2995|   204k|        state->clip_y1 =
 2996|   204k|            lround(y2scr_pos(render_priv, state->clip_y1));
 2997|       |
 2998|   204k|        if (state->explicit) {
  ------------------
  |  Branch (2998:13): [True: 52, False: 204k]
  ------------------
 2999|       |            // we still need to clip against screen boundaries
 3000|     52|            int zx = render_priv->settings.left_margin;
 3001|     52|            int zy = render_priv->settings.top_margin;
 3002|     52|            int sx = zx + render_priv->frame_content_width;
 3003|     52|            int sy = zy + render_priv->frame_content_height;
 3004|       |
 3005|     52|            state->clip_x0 = FFMAX(state->clip_x0, zx);
  ------------------
  |  |   46|     52|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 52]
  |  |  ------------------
  ------------------
 3006|     52|            state->clip_y0 = FFMAX(state->clip_y0, zy);
  ------------------
  |  |   46|     52|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 52]
  |  |  ------------------
  ------------------
 3007|     52|            state->clip_x1 = FFMIN(state->clip_x1, sx);
  ------------------
  |  |   47|     52|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 0, False: 52]
  |  |  ------------------
  ------------------
 3008|     52|            state->clip_y1 = FFMIN(state->clip_y1, sy);
  ------------------
  |  |   47|     52|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 0, False: 52]
  |  |  ------------------
  ------------------
 3009|     52|        }
 3010|   204k|    } else {
 3011|       |        // no \clip (explicit==0) and use_margins => only clip to screen with margins
 3012|      0|        state->clip_x0 = 0;
 3013|      0|        state->clip_y0 = 0;
 3014|      0|        state->clip_x1 = render_priv->settings.frame_width;
 3015|      0|        state->clip_y1 = render_priv->settings.frame_height;
 3016|      0|    }
 3017|       |
 3018|   204k|    if (state->evt_type & EVENT_VSCROLL) {
  ------------------
  |  Branch (3018:9): [True: 0, False: 204k]
  ------------------
 3019|      0|        int y0 = lround(y2scr_pos(render_priv, state->scroll_y0));
 3020|      0|        int y1 = lround(y2scr_pos(render_priv, state->scroll_y1));
 3021|       |
 3022|      0|        state->clip_y0 = FFMAX(state->clip_y0, y0);
  ------------------
  |  |   46|      0|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3023|      0|        state->clip_y1 = FFMIN(state->clip_y1, y1);
  ------------------
  |  |   47|      0|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3024|      0|    }
 3025|       |
 3026|   204k|    calculate_rotation_params(state, &bbox, device_x, device_y);
 3027|       |
 3028|   204k|    render_and_combine_glyphs(state, device_x, device_y);
 3029|       |
 3030|   204k|    memset(event_images, 0, sizeof(*event_images));
 3031|       |    // VSFilter does *not* shift lines with a border > margin to be within the
 3032|       |    // frame, so negative values for top and left may occur
 3033|   204k|    event_images->top = device_y - text_info->lines[0].asc - text_info->border_top;
 3034|   204k|    event_images->height =
 3035|   204k|        text_info->height + text_info->border_bottom + text_info->border_top;
 3036|   204k|    event_images->left =
 3037|   204k|        (device_x + bbox.x_min) * render_priv->par_scale_x - text_info->border_x + 0.5;
 3038|   204k|    event_images->width =
 3039|   204k|        (bbox.x_max - bbox.x_min) * render_priv->par_scale_x
 3040|   204k|        + 2 * text_info->border_x + 0.5;
 3041|   204k|    event_images->detect_collisions = state->detect_collisions;
 3042|   204k|    event_images->shift_direction = (valign == VALIGN_SUB) ? -1 : 1;
  ------------------
  |  |   72|   204k|#define VALIGN_SUB 0
  ------------------
  |  Branch (3042:37): [True: 204k, False: 0]
  ------------------
 3043|   204k|    event_images->event = event;
 3044|   204k|    event_images->imgs = render_text(state);
 3045|       |
 3046|   204k|    if (state->border_style == 4)
  ------------------
  |  Branch (3046:9): [True: 0, False: 204k]
  ------------------
 3047|      0|        add_background(state, event_images);
 3048|       |
 3049|   204k|    ass_shaper_cleanup(state->shaper, text_info);
 3050|   204k|    free_render_context(state);
 3051|       |
 3052|   204k|    return true;
 3053|   204k|}
ass_render.c:free_render_context:
 1144|  1.02M|{
 1145|  1.02M|    ass_cache_dec_ref(state->font);
 1146|       |
 1147|  1.02M|    state->font = NULL;
 1148|  1.02M|    state->family.str = NULL;
 1149|  1.02M|    state->family.len = 0;
 1150|  1.02M|    state->clip_drawing_text.str = NULL;
 1151|  1.02M|    state->clip_drawing_text.len = 0;
 1152|       |
 1153|  1.02M|    if (state->text_info)
  ------------------
  |  Branch (1153:9): [True: 1.02M, False: 0]
  ------------------
 1154|  1.02M|        state->text_info->length = 0;
 1155|  1.02M|}
ass_render.c:init_render_context:
 1106|   511k|{
 1107|   511k|    ASS_Renderer *render_priv = state->renderer;
 1108|       |
 1109|   511k|    state->event = event;
 1110|   511k|    state->parsed_tags = 0;
 1111|   511k|    state->evt_type = EVENT_NORMAL;
 1112|       |
 1113|   511k|    state->wrap_style = render_priv->track->WrapStyle;
 1114|       |
 1115|   511k|    state->pos_x = 0;
 1116|   511k|    state->pos_y = 0;
 1117|   511k|    state->org_x = 0;
 1118|   511k|    state->org_y = 0;
 1119|   511k|    state->have_origin = 0;
 1120|   511k|    state->clip_x0 = 0;
 1121|   511k|    state->clip_y0 = 0;
 1122|   511k|    state->clip_x1 = render_priv->track->PlayResX;
 1123|   511k|    state->clip_y1 = render_priv->track->PlayResY;
 1124|   511k|    state->clip_mode = 0;
 1125|   511k|    state->detect_collisions = 1;
 1126|   511k|    state->fade = 0;
 1127|   511k|    state->drawing_scale = 0;
 1128|   511k|    state->pbo = 0;
 1129|   511k|    state->effect_type = EF_NONE;
 1130|   511k|    state->effect_timing = 0;
 1131|   511k|    state->effect_skip_timing = 0;
 1132|   511k|    state->reset_effect = false;
 1133|       |
 1134|   511k|    ass_apply_transition_effects(state);
 1135|   511k|    state->explicit = state->evt_type != EVENT_NORMAL ||
  ------------------
  |  Branch (1135:23): [True: 0, False: 511k]
  ------------------
 1136|   511k|                      ass_event_has_hard_overrides(event->Text);
  ------------------
  |  Branch (1136:23): [True: 52, False: 511k]
  ------------------
 1137|       |
 1138|   511k|    ass_reset_render_context(state, NULL);
 1139|   511k|    state->alignment = state->style->Alignment;
 1140|   511k|    state->justify = state->style->Justify;
 1141|   511k|}
ass_render.c:parse_events:
 2081|   511k|{
 2082|   511k|    TextInfo *text_info = state->text_info;
 2083|   511k|    ASS_Renderer *render_priv = state->renderer;
 2084|       |
 2085|   511k|    char *p = event->Text, *q;
 2086|       |
 2087|       |    // Event parsing.
 2088|  3.44M|    while (true) {
 2089|  3.44M|        ASS_StringView drawing_text = {NULL, 0};
 2090|       |
 2091|       |        // get next char, executing style override
 2092|       |        // this affects render_context
 2093|  3.44M|        unsigned code = 0;
 2094|  3.70M|        while (*p) {
  ------------------
  |  Branch (2094:16): [True: 3.18M, False: 511k]
  ------------------
 2095|  3.18M|            if ((*p == '{') && (q = strchr(p, '}'))) {
  ------------------
  |  Branch (2095:17): [True: 307k, False: 2.88M]
  |  Branch (2095:32): [True: 256k, False: 51.2k]
  ------------------
 2096|   256k|                p = ass_parse_tags(state, p, q, 1., false);
 2097|   256k|                assert(*p == '}');
 2098|   256k|                p++;
 2099|  2.93M|            } else if (state->drawing_scale) {
  ------------------
  |  Branch (2099:24): [True: 0, False: 2.93M]
  ------------------
 2100|      0|                q = p;
 2101|      0|                if (*p == '{')
  ------------------
  |  Branch (2101:21): [True: 0, False: 0]
  ------------------
 2102|      0|                    q++;
 2103|      0|                while ((*q != '{') && (*q != 0))
  ------------------
  |  Branch (2103:24): [True: 0, False: 0]
  |  Branch (2103:39): [True: 0, False: 0]
  ------------------
 2104|      0|                    q++;
 2105|      0|                drawing_text.str = p;
 2106|      0|                drawing_text.len = q - p;
 2107|      0|                code = 0xfffc; // object replacement character
 2108|      0|                p = q;
 2109|      0|                break;
 2110|  2.93M|            } else {
 2111|  2.93M|                code = ass_get_next_char(state, &p);
 2112|  2.93M|                break;
 2113|  2.93M|            }
 2114|  3.18M|        }
 2115|       |
 2116|  3.44M|        if (code == 0)
  ------------------
  |  Branch (2116:13): [True: 511k, False: 2.93M]
  ------------------
 2117|   511k|            break;
 2118|       |
 2119|       |        // face could have been changed in get_next_char
 2120|  2.93M|        if (!state->font)
  ------------------
  |  Branch (2120:13): [True: 0, False: 2.93M]
  ------------------
 2121|      0|            goto fail;
 2122|       |
 2123|  2.93M|        if (text_info->length >= text_info->max_glyphs) {
  ------------------
  |  Branch (2123:13): [True: 9, False: 2.93M]
  ------------------
 2124|       |            // Raise maximum number of glyphs
 2125|      9|            int new_max = 2 * FFMIN(FFMAX(text_info->max_glyphs, text_info->length / 2 + 1),
  ------------------
  |  |   47|     18|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 0, False: 9]
  |  |  |  Branch (47:22): [True: 9, False: 0]
  |  |  |  Branch (47:40): [True: 9, False: 0]
  |  |  ------------------
  ------------------
 2126|      9|                                    INT_MAX / 2);
 2127|      9|            if (text_info->length >= new_max)
  ------------------
  |  Branch (2127:17): [True: 0, False: 9]
  ------------------
 2128|      0|                goto fail;
 2129|      9|            if (!ASS_REALLOC_ARRAY(text_info->glyphs, new_max) ||
  ------------------
  |  |   91|     18|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (2129:17): [True: 0, False: 9]
  ------------------
 2130|      9|                    !ASS_REALLOC_ARRAY(text_info->event_text, new_max) ||
  ------------------
  |  |   91|     18|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (2130:21): [True: 0, False: 9]
  ------------------
 2131|      9|                    !ASS_REALLOC_ARRAY(text_info->breaks, new_max))
  ------------------
  |  |   91|      9|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (2131:21): [True: 0, False: 9]
  ------------------
 2132|      0|                goto fail;
 2133|      9|            text_info->max_glyphs = new_max;
 2134|      9|        }
 2135|       |
 2136|  2.93M|        GlyphInfo *info = &text_info->glyphs[text_info->length];
 2137|       |
 2138|       |        // Clear current GlyphInfo
 2139|  2.93M|        memset(info, 0, sizeof(GlyphInfo));
 2140|       |
 2141|       |        // Parse drawing
 2142|  2.93M|        if (drawing_text.str) {
  ------------------
  |  Branch (2142:13): [True: 0, False: 2.93M]
  ------------------
 2143|      0|            info->drawing_text = drawing_text;
 2144|      0|            info->drawing_scale = state->drawing_scale;
 2145|      0|            info->drawing_pbo = state->pbo;
 2146|      0|        }
 2147|       |
 2148|       |        // Fill glyph information
 2149|  2.93M|        info->symbol = code;
 2150|  2.93M|        info->font = state->font;
 2151|  2.93M|        if (!drawing_text.str)
  ------------------
  |  Branch (2151:13): [True: 2.93M, False: 0]
  ------------------
 2152|  2.93M|            ass_cache_inc_ref(info->font);
 2153|  14.6M|        for (int i = 0; i < 4; i++) {
  ------------------
  |  Branch (2153:25): [True: 11.7M, False: 2.93M]
  ------------------
 2154|  11.7M|            uint32_t clr = state->c[i];
 2155|  11.7M|            info->a_pre_fade[i] = _a(clr);
  ------------------
  |  |   29|  11.7M|#define _a(c)   ((c) & 0xFF)
  ------------------
 2156|  11.7M|            ass_apply_fade(&clr, state->fade);
 2157|  11.7M|            info->c[i] = clr;
 2158|  11.7M|        }
 2159|       |
 2160|  2.93M|        info->effect_type = state->effect_type;
 2161|  2.93M|        info->effect_timing = state->effect_timing;
 2162|  2.93M|        info->effect_skip_timing = state->effect_skip_timing;
 2163|  2.93M|        info->reset_effect = state->reset_effect;
 2164|       |        // VSFilter compatibility: font glyphs use PlayResY scaling in both dimensions
 2165|  2.93M|        info->font_size =
 2166|  2.93M|            fabs(state->font_size * state->screen_scale_y);
 2167|  2.93M|        info->be = state->be;
 2168|  2.93M|        info->blur = state->blur;
 2169|  2.93M|        info->shadow_x = state->shadow_x;
 2170|  2.93M|        info->shadow_y = state->shadow_y;
 2171|  2.93M|        info->scale_x = state->scale_x;
 2172|  2.93M|        info->scale_y = state->scale_y;
 2173|  2.93M|        info->border_style = state->border_style;
 2174|  2.93M|        info->border_x = state->border_x;
 2175|  2.93M|        info->border_y = state->border_y;
 2176|  2.93M|        info->hspacing = state->hspacing;
 2177|  2.93M|        info->bold = state->bold;
 2178|  2.93M|        info->italic = state->italic;
 2179|  2.93M|        info->flags = state->flags;
 2180|  2.93M|        if (info->font->desc.vertical && code >= VERTICAL_LOWER_BOUND)
  ------------------
  |  |   34|      0|#define VERTICAL_LOWER_BOUND 0x02f1
  ------------------
  |  Branch (2180:13): [True: 0, False: 2.93M]
  |  Branch (2180:42): [True: 0, False: 0]
  ------------------
 2181|      0|            info->flags |= DECO_ROTATE;
  ------------------
  |  |   39|      0|#define DECO_ROTATE        4
  ------------------
 2182|  2.93M|        info->frx = state->frx;
 2183|  2.93M|        info->fry = state->fry;
 2184|  2.93M|        info->frz = state->frz;
 2185|  2.93M|        info->fax = state->fax;
 2186|  2.93M|        info->fay = state->fay;
 2187|  2.93M|        info->fade = state->fade;
 2188|       |
 2189|  2.93M|        info->hspacing_scaled = 0;
 2190|  2.93M|        info->scale_fix = 1;
 2191|       |
 2192|  2.93M|        if (!drawing_text.str) {
  ------------------
  |  Branch (2192:13): [True: 2.93M, False: 0]
  ------------------
 2193|  2.93M|            info->hspacing_scaled = double_to_d6(info->hspacing *
 2194|  2.93M|                    state->screen_scale_x / render_priv->par_scale_x *
 2195|  2.93M|                    info->scale_x);
 2196|  2.93M|            fix_glyph_scaling(render_priv, info);
 2197|  2.93M|        }
 2198|       |
 2199|  2.93M|        text_info->length++;
 2200|       |
 2201|  2.93M|        state->effect_type = EF_NONE;
 2202|  2.93M|        state->effect_timing = 0;
 2203|  2.93M|        state->effect_skip_timing = 0;
 2204|  2.93M|        state->reset_effect = false;
 2205|  2.93M|    }
 2206|       |
 2207|   511k|    return true;
 2208|       |
 2209|      0|fail:
 2210|      0|    free_render_context(state);
 2211|      0|    return false;
 2212|   511k|}
ass_render.c:fix_glyph_scaling:
 2011|  2.93M|{
 2012|  2.93M|    double ft_size;
 2013|  2.93M|    if (priv->settings.hinting == ASS_HINTING_NONE) {
  ------------------
  |  Branch (2013:9): [True: 2.93M, False: 0]
  ------------------
 2014|       |        // arbitrary, not too small to prevent grid fitting rounding effects
 2015|       |        // XXX: this is a rather crude hack
 2016|  2.93M|        ft_size = 256.0;
 2017|  2.93M|    } else {
 2018|       |        // If hinting is enabled, we want to pass the real font size
 2019|       |        // to freetype. Normalize scale_y to 1.0.
 2020|      0|        ft_size = glyph->scale_y * glyph->font_size;
 2021|      0|    }
 2022|       |
 2023|  2.93M|    if (!ft_size || !glyph->font_size)
  ------------------
  |  Branch (2023:9): [True: 0, False: 2.93M]
  |  Branch (2023:21): [True: 64, False: 2.93M]
  ------------------
 2024|     64|        return;
 2025|       |
 2026|  2.93M|    double mul = glyph->font_size / ft_size;
 2027|  2.93M|    glyph->scale_fix = 1 / mul;
 2028|  2.93M|    glyph->scale_x *= mul;
 2029|  2.93M|    glyph->scale_y *= mul;
 2030|  2.93M|    glyph->font_size = ft_size;
 2031|  2.93M|}
ass_render.c:split_style_runs:
 2035|   204k|{
 2036|   204k|    TextInfo *text_info = state->text_info;
 2037|   204k|    Effect last_effect_type = text_info->glyphs[0].effect_type;
 2038|   204k|    text_info->glyphs[0].starts_new_run = true;
 2039|  2.93M|    for (int i = 1; i < text_info->length; i++) {
  ------------------
  |  Branch (2039:21): [True: 2.72M, False: 204k]
  ------------------
 2040|  2.72M|        GlyphInfo *info = text_info->glyphs + i;
 2041|  2.72M|        GlyphInfo *last = text_info->glyphs + (i - 1);
 2042|  2.72M|        Effect effect_type = info->effect_type;
 2043|  2.72M|        info->starts_new_run =
 2044|  2.72M|            info->effect_timing ||  // but ignore effect_skip_timing
  ------------------
  |  Branch (2044:13): [True: 0, False: 2.72M]
  ------------------
 2045|  2.72M|            (effect_type != EF_NONE && effect_type != last_effect_type) ||
  ------------------
  |  Branch (2045:14): [True: 0, False: 2.72M]
  |  Branch (2045:40): [True: 0, False: 0]
  ------------------
 2046|  2.72M|            info->drawing_text.str ||
  ------------------
  |  Branch (2046:13): [True: 0, False: 2.72M]
  ------------------
 2047|  2.72M|            last->drawing_text.str ||
  ------------------
  |  Branch (2047:13): [True: 0, False: 2.72M]
  ------------------
 2048|  2.72M|            !ass_string_equal(last->font->desc.family, info->font->desc.family) ||
  ------------------
  |  Branch (2048:13): [True: 0, False: 2.72M]
  ------------------
 2049|  2.72M|            last->font->desc.vertical != info->font->desc.vertical ||
  ------------------
  |  Branch (2049:13): [True: 0, False: 2.72M]
  ------------------
 2050|  2.72M|            last->font_size != info->font_size ||
  ------------------
  |  Branch (2050:13): [True: 0, False: 2.72M]
  ------------------
 2051|  2.72M|            last->c[0] != info->c[0] ||
  ------------------
  |  Branch (2051:13): [True: 0, False: 2.72M]
  ------------------
 2052|  2.72M|            last->c[1] != info->c[1] ||
  ------------------
  |  Branch (2052:13): [True: 0, False: 2.72M]
  ------------------
 2053|  2.72M|            last->c[2] != info->c[2] ||
  ------------------
  |  Branch (2053:13): [True: 0, False: 2.72M]
  ------------------
 2054|  2.72M|            last->c[3] != info->c[3] ||
  ------------------
  |  Branch (2054:13): [True: 0, False: 2.72M]
  ------------------
 2055|  2.72M|            last->be != info->be ||
  ------------------
  |  Branch (2055:13): [True: 0, False: 2.72M]
  ------------------
 2056|  2.72M|            last->blur != info->blur ||
  ------------------
  |  Branch (2056:13): [True: 0, False: 2.72M]
  ------------------
 2057|  2.72M|            last->shadow_x != info->shadow_x ||
  ------------------
  |  Branch (2057:13): [True: 0, False: 2.72M]
  ------------------
 2058|  2.72M|            last->shadow_y != info->shadow_y ||
  ------------------
  |  Branch (2058:13): [True: 0, False: 2.72M]
  ------------------
 2059|  2.72M|            last->frx != info->frx ||
  ------------------
  |  Branch (2059:13): [True: 0, False: 2.72M]
  ------------------
 2060|  2.72M|            last->fry != info->fry ||
  ------------------
  |  Branch (2060:13): [True: 0, False: 2.72M]
  ------------------
 2061|  2.72M|            last->frz != info->frz ||
  ------------------
  |  Branch (2061:13): [True: 0, False: 2.72M]
  ------------------
 2062|  2.72M|            last->fax != info->fax ||
  ------------------
  |  Branch (2062:13): [True: 0, False: 2.72M]
  ------------------
 2063|  2.72M|            last->fay != info->fay ||
  ------------------
  |  Branch (2063:13): [True: 0, False: 2.72M]
  ------------------
 2064|  2.72M|            last->scale_x != info->scale_x ||
  ------------------
  |  Branch (2064:13): [True: 0, False: 2.72M]
  ------------------
 2065|  2.72M|            last->scale_y != info->scale_y ||
  ------------------
  |  Branch (2065:13): [True: 0, False: 2.72M]
  ------------------
 2066|  2.72M|            last->border_style != info->border_style ||
  ------------------
  |  Branch (2066:13): [True: 0, False: 2.72M]
  ------------------
 2067|  2.72M|            last->border_x != info->border_x ||
  ------------------
  |  Branch (2067:13): [True: 0, False: 2.72M]
  ------------------
 2068|  2.72M|            last->border_y != info->border_y ||
  ------------------
  |  Branch (2068:13): [True: 0, False: 2.72M]
  ------------------
 2069|  2.72M|            last->hspacing != info->hspacing ||
  ------------------
  |  Branch (2069:13): [True: 0, False: 2.72M]
  ------------------
 2070|  2.72M|            last->italic != info->italic ||
  ------------------
  |  Branch (2070:13): [True: 0, False: 2.72M]
  ------------------
 2071|  2.72M|            last->bold != info->bold ||
  ------------------
  |  Branch (2071:13): [True: 0, False: 2.72M]
  ------------------
 2072|  2.72M|            ((last->flags ^ info->flags) & ~DECO_ROTATE);
  ------------------
  |  |   39|  2.72M|#define DECO_ROTATE        4
  ------------------
  |  Branch (2072:13): [True: 0, False: 2.72M]
  ------------------
 2073|  2.72M|        if (effect_type != EF_NONE)
  ------------------
  |  Branch (2073:13): [True: 0, False: 2.72M]
  ------------------
 2074|      0|            last_effect_type = effect_type;
 2075|  2.72M|    }
 2076|   204k|}
ass_render.c:retrieve_glyphs:
 2216|   204k|{
 2217|   204k|    GlyphInfo *glyphs = state->text_info->glyphs;
 2218|   204k|    int i;
 2219|       |
 2220|  3.13M|    for (i = 0; i < state->text_info->length; i++) {
  ------------------
  |  Branch (2220:17): [True: 2.93M, False: 204k]
  ------------------
 2221|  2.93M|        GlyphInfo *info = glyphs + i;
 2222|  2.93M|        do {
 2223|  2.93M|            get_outline_glyph(state, info);
 2224|  2.93M|            info = info->next;
 2225|  2.93M|        } while (info);
  ------------------
  |  Branch (2225:18): [True: 3, False: 2.93M]
  ------------------
 2226|  2.93M|        info = glyphs + i;
 2227|       |
 2228|       |        // Add additional space after italic to non-italic style changes
 2229|  2.93M|        if (i && glyphs[i - 1].italic && !info->italic) {
  ------------------
  |  Branch (2229:13): [True: 2.72M, False: 204k]
  |  Branch (2229:18): [True: 0, False: 2.72M]
  |  Branch (2229:42): [True: 0, False: 0]
  ------------------
 2230|      0|            int back = i - 1;
 2231|      0|            GlyphInfo *og = &glyphs[back];
 2232|      0|            while (back && og->bbox.x_max - og->bbox.x_min == 0
  ------------------
  |  Branch (2232:20): [True: 0, False: 0]
  |  Branch (2232:28): [True: 0, False: 0]
  ------------------
 2233|      0|                    && og->italic)
  ------------------
  |  Branch (2233:24): [True: 0, False: 0]
  ------------------
 2234|      0|                og = &glyphs[--back];
 2235|      0|            if (og->bbox.x_max > og->cluster_advance.x)
  ------------------
  |  Branch (2235:17): [True: 0, False: 0]
  ------------------
 2236|      0|                og->cluster_advance.x = og->bbox.x_max;
 2237|      0|        }
 2238|       |
 2239|       |        // add horizontal letter spacing
 2240|  2.93M|        info->cluster_advance.x += info->hspacing_scaled;
 2241|  2.93M|    }
 2242|   204k|}
ass_render.c:get_outline_glyph:
 1166|  2.93M|{
 1167|  2.93M|    ASS_Renderer *priv = state->renderer;
 1168|  2.93M|    OutlineHashValue *val;
 1169|  2.93M|    ASS_DVector scale, offset = {0};
 1170|       |
 1171|  2.93M|    int32_t asc, desc;
 1172|  2.93M|    OutlineHashKey key;
 1173|  2.93M|    if (info->drawing_text.str) {
  ------------------
  |  Branch (1173:9): [True: 0, False: 2.93M]
  ------------------
 1174|      0|        key.type = OUTLINE_DRAWING;
 1175|      0|        key.u.drawing.text = info->drawing_text;
 1176|      0|        val = ass_cache_get(priv->cache.outline_cache, &key, priv);
 1177|      0|        if (!val || !val->valid) {
  ------------------
  |  Branch (1177:13): [True: 0, False: 0]
  |  Branch (1177:21): [True: 0, False: 0]
  ------------------
 1178|      0|            ass_cache_dec_ref(val);
 1179|      0|            return;
 1180|      0|        }
 1181|       |
 1182|      0|        int32_t scale_base = lshiftwrapi(1, info->drawing_scale - 1);
 1183|      0|        double w = scale_base > 0 ? (1.0 / scale_base) : 0;
  ------------------
  |  Branch (1183:20): [True: 0, False: 0]
  ------------------
 1184|      0|        scale.x = info->scale_x * w * state->screen_scale_x / priv->par_scale_x;
 1185|      0|        scale.y = info->scale_y * w * state->screen_scale_y;
 1186|      0|        desc = 64 * info->drawing_pbo;
 1187|      0|        asc = val->asc - desc;
 1188|       |
 1189|      0|        offset.y = -asc * scale.y;
 1190|  2.93M|    } else {
 1191|  2.93M|        key.type = OUTLINE_GLYPH;
 1192|  2.93M|        GlyphHashKey *k = &key.u.glyph;
 1193|  2.93M|        k->font = info->font;
 1194|  2.93M|        k->size = info->font_size;
 1195|  2.93M|        k->face_index = info->face_index;
 1196|  2.93M|        k->glyph_index = info->glyph_index;
 1197|  2.93M|        k->bold = info->bold;
 1198|  2.93M|        k->italic = info->italic;
 1199|  2.93M|        k->flags = info->flags;
 1200|       |
 1201|  2.93M|        val = ass_cache_get(priv->cache.outline_cache, &key, priv);
 1202|  2.93M|        if (!val || !val->valid) {
  ------------------
  |  Branch (1202:13): [True: 0, False: 2.93M]
  |  Branch (1202:21): [True: 64, False: 2.93M]
  ------------------
 1203|     64|            ass_cache_dec_ref(val);
 1204|     64|            return;
 1205|     64|        }
 1206|       |
 1207|  2.93M|        scale.x = info->scale_x;
 1208|  2.93M|        scale.y = info->scale_y;
 1209|  2.93M|        asc  = val->asc;
 1210|  2.93M|        desc = val->desc;
 1211|  2.93M|    }
 1212|       |
 1213|  2.93M|    info->outline = val;
 1214|  2.93M|    info->transform.scale = scale;
 1215|  2.93M|    info->transform.offset = offset;
 1216|       |
 1217|  2.93M|    info->bbox.x_min = lrint(val->cbox.x_min * scale.x + offset.x);
 1218|  2.93M|    info->bbox.y_min = lrint(val->cbox.y_min * scale.y + offset.y);
 1219|  2.93M|    info->bbox.x_max = lrint(val->cbox.x_max * scale.x + offset.x);
 1220|  2.93M|    info->bbox.y_max = lrint(val->cbox.y_max * scale.y + offset.y);
 1221|       |
 1222|  2.93M|    if (info->drawing_text.str || priv->settings.shaper == ASS_SHAPING_SIMPLE) {
  ------------------
  |  Branch (1222:9): [True: 0, False: 2.93M]
  |  Branch (1222:35): [True: 0, False: 2.93M]
  ------------------
 1223|      0|        info->cluster_advance.x = info->advance.x = lrint(val->advance * scale.x);
 1224|      0|        info->cluster_advance.y = info->advance.y = 0;
 1225|      0|    }
 1226|  2.93M|    info->asc  = lrint(asc  * scale.y);
 1227|  2.93M|    info->desc = lrint(desc * scale.y);
 1228|  2.93M|}
ass_render.c:preliminary_layout:
 2246|   204k|{
 2247|   204k|    ASS_Vector pen = { 0, 0 };
 2248|  3.13M|    for (int i = 0; i < state->text_info->length; i++) {
  ------------------
  |  Branch (2248:21): [True: 2.93M, False: 204k]
  ------------------
 2249|  2.93M|        GlyphInfo *info = state->text_info->glyphs + i;
 2250|  2.93M|        ASS_Vector cluster_pen = pen;
 2251|  2.93M|        do {
 2252|  2.93M|            info->pos.x = cluster_pen.x;
 2253|  2.93M|            info->pos.y = cluster_pen.y;
 2254|       |
 2255|  2.93M|            cluster_pen.x += info->advance.x;
 2256|  2.93M|            cluster_pen.y += info->advance.y;
 2257|       |
 2258|  2.93M|            info = info->next;
 2259|  2.93M|        } while (info);
  ------------------
  |  Branch (2259:18): [True: 3, False: 2.93M]
  ------------------
 2260|  2.93M|        info = state->text_info->glyphs + i;
 2261|  2.93M|        pen.x += info->cluster_advance.x;
 2262|  2.93M|        pen.y += info->cluster_advance.y;
 2263|  2.93M|    }
 2264|   204k|}
ass_render.c:x2scr_right:
  240|   204k|{
  241|   204k|    ASS_Renderer *render_priv = state->renderer;
  242|   204k|    if (state->explicit || !render_priv->settings.use_margins)
  ------------------
  |  Branch (242:9): [True: 52, False: 204k]
  |  Branch (242:28): [True: 204k, False: 0]
  ------------------
  243|   204k|        return x2scr_pos(render_priv, x);
  244|      0|    return x * render_priv->fit_width / render_priv->par_scale_x /
  245|      0|        render_priv->track->PlayResX +
  246|      0|        (render_priv->width - render_priv->fit_width);
  247|   204k|}
ass_render.c:x2scr_left:
  232|   409k|{
  233|   409k|    ASS_Renderer *render_priv = state->renderer;
  234|   409k|    if (state->explicit || !render_priv->settings.use_margins)
  ------------------
  |  Branch (234:9): [True: 52, False: 409k]
  |  Branch (234:28): [True: 409k, False: 0]
  ------------------
  235|   409k|        return x2scr_pos(render_priv, x);
  236|      0|    return x * render_priv->fit_width / render_priv->par_scale_x /
  237|      0|        render_priv->track->PlayResX;
  238|   409k|}
ass_render.c:wrap_lines_smart:
 1931|   204k|{
 1932|   204k|    char *unibrks = NULL;
 1933|       |
 1934|       |#ifdef CONFIG_UNIBREAK
 1935|       |    ASS_Renderer *render_priv = state->renderer;
 1936|       |    TextInfo *text_info = state->text_info;
 1937|       |    if (render_priv->track->parser_priv->feature_flags & FEATURE_MASK(ASS_FEATURE_WRAP_UNICODE)) {
 1938|       |        unibrks = text_info->breaks;
 1939|       |        set_linebreaks_utf32(
 1940|       |            text_info->event_text, text_info->length,
 1941|       |            render_priv->track->Language, unibrks);
 1942|       |#if UNIBREAK_VERSION < 0x0500UL
 1943|       |        // Prior to 5.0 libunibreaks always ended text with LINE_BREAKMUSTBREAK, matching
 1944|       |        // Unicode spec, but messing with our text-overflow detection.
 1945|       |        // Thus reevaluate the last char in a different context.
 1946|       |        // (Later versions set either MUSTBREAK or the newly added INDETERMINATE)
 1947|       |        unibrks[text_info->length - 1] = is_line_breakable(
 1948|       |            text_info->event_text[text_info->length - 1],
 1949|       |            ' ',
 1950|       |            render_priv->track->Language
 1951|       |        );
 1952|       |#endif
 1953|       |    }
 1954|       |#endif
 1955|       |
 1956|   204k|    wrap_lines_naive(state, max_text_width, unibrks);
 1957|   204k|    wrap_lines_rebalance(state, max_text_width, unibrks);
 1958|       |
 1959|   204k|    trim_whitespace(state);
 1960|   204k|    measure_text(state);
 1961|   204k|    wrap_lines_measure(state, unibrks);
 1962|   204k|}
ass_render.c:wrap_lines_naive:
 1733|   204k|{
 1734|   204k|    ASS_Renderer *render_priv = state->renderer;
 1735|   204k|    TextInfo *text_info = state->text_info;
 1736|   204k|    GlyphInfo *s1  = text_info->glyphs; // current line start
 1737|   204k|    int last_breakable = -1;
 1738|   204k|    int break_type = 0;
 1739|       |
 1740|   204k|    text_info->n_lines = 1;
 1741|  3.13M|    for (int i = 0; i < text_info->length; ++i) {
  ------------------
  |  Branch (1741:21): [True: 2.93M, False: 204k]
  ------------------
 1742|  2.93M|        GlyphInfo *cur = text_info->glyphs + i;
 1743|  2.93M|        int break_at = -1;
 1744|  2.93M|        double s_offset = d6_to_double(s1->bbox.x_min + s1->pos.x);
 1745|  2.93M|        double len = d6_to_double(cur->bbox.x_max + cur->pos.x) - s_offset;
 1746|       |
 1747|  2.93M|        if (FORCEBREAK(cur->symbol, i)) {
  ------------------
  |  | 1725|  2.93M|    #define FORCEBREAK(glyph, index) (glyph == '\n')
  |  |  ------------------
  |  |  |  Branch (1725:38): [True: 0, False: 2.93M]
  |  |  ------------------
  ------------------
 1748|      0|            break_type = 2;
 1749|      0|            break_at = i;
 1750|      0|            ass_msg(render_priv->library, MSGL_DBG2,
  ------------------
  |  |   44|      0|#define MSGL_DBG2 7
  ------------------
 1751|      0|                    "forced line break at %d", break_at);
 1752|  2.93M|        } else if (len >= max_text_width &&
  ------------------
  |  Branch (1752:20): [True: 1.54M, False: 1.38M]
  ------------------
 1753|  2.93M|                   cur->symbol != ' ' /* get trimmed */ &&
  ------------------
  |  Branch (1753:20): [True: 1.54M, False: 9]
  ------------------
 1754|  2.93M|                   (state->wrap_style != 2)) {
  ------------------
  |  Branch (1754:20): [True: 1.54M, False: 0]
  ------------------
 1755|  1.54M|            break_type = 1;
 1756|  1.54M|            break_at = last_breakable;
 1757|  1.54M|            if (break_at >= 0)
  ------------------
  |  Branch (1757:17): [True: 12, False: 1.54M]
  ------------------
 1758|     12|                ass_msg(render_priv->library, MSGL_DBG2, "line break at %d",
  ------------------
  |  |   44|     12|#define MSGL_DBG2 7
  ------------------
 1759|     12|                        break_at);
 1760|  1.54M|        }
 1761|  2.93M|        if (ALLOWBREAK(cur->symbol, i)) {
  ------------------
  |  | 1724|  2.93M|    #define ALLOWBREAK(glyph, index) (glyph == ' ')
  |  |  ------------------
  |  |  |  Branch (1724:38): [True: 204k, False: 2.72M]
  |  |  ------------------
  ------------------
 1762|   204k|            last_breakable = i;
 1763|   204k|        }
 1764|       |
 1765|  2.93M|        if (break_at != -1) {
  ------------------
  |  Branch (1765:13): [True: 12, False: 2.93M]
  ------------------
 1766|       |            // need to use one more line
 1767|       |            // marking break_at+1 as start of a new line
 1768|     12|            int lead = break_at + 1;    // the first symbol of the new line
 1769|     12|            if (text_info->n_lines >= text_info->max_lines) {
  ------------------
  |  Branch (1769:17): [True: 0, False: 12]
  ------------------
 1770|       |                // Try to raise the maximum number of lines
 1771|      0|                bool success = false;
 1772|      0|                if (text_info->max_lines <= INT_MAX / 2) {
  ------------------
  |  Branch (1772:21): [True: 0, False: 0]
  ------------------
 1773|      0|                    text_info->max_lines *= 2;
 1774|      0|                    success = ASS_REALLOC_ARRAY(text_info->lines, text_info->max_lines);
  ------------------
  |  |   91|      0|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
 1775|      0|                }
 1776|       |                // If realloc fails it's screwed and due to error-info not propagating (FIXME),
 1777|       |                // the best we can do is to avoid UB by discarding the previous break
 1778|      0|                if (!success) {
  ------------------
  |  Branch (1778:21): [True: 0, False: 0]
  ------------------
 1779|      0|                    s1->linebreak = 0;
 1780|      0|                    text_info->n_lines--;
 1781|      0|                }
 1782|      0|            }
 1783|     12|            if (lead < text_info->length) {
  ------------------
  |  Branch (1783:17): [True: 12, False: 0]
  ------------------
 1784|     12|                text_info->glyphs[lead].linebreak = break_type;
 1785|     12|                last_breakable = -1;
 1786|     12|                s1 = text_info->glyphs + lead;
 1787|     12|                text_info->n_lines++;
 1788|     12|            }
 1789|     12|        }
 1790|  2.93M|    }
 1791|   204k|}
ass_render.c:wrap_lines_rebalance:
 1814|   204k|{
 1815|   204k|    TextInfo *text_info = state->text_info;
 1816|   204k|    int exit = 0;
 1817|       |
 1818|   204k|#define DIFF(x,y) (((x) < (y)) ? (y - x) : (x - y))
 1819|   409k|    while (!exit && state->wrap_style != 1) {
  ------------------
  |  Branch (1819:12): [True: 204k, False: 204k]
  |  Branch (1819:21): [True: 204k, False: 0]
  ------------------
 1820|   204k|        exit = 1;
 1821|   204k|        GlyphInfo  *s1, *s2, *s3;
 1822|   204k|        s3 = text_info->glyphs;
 1823|   204k|        s1 = s2 = 0;
 1824|  3.13M|        for (int i = 0; i <= text_info->length; ++i) {
  ------------------
  |  Branch (1824:25): [True: 3.13M, False: 3]
  ------------------
 1825|  3.13M|            GlyphInfo *cur = text_info->glyphs + i;
 1826|  3.13M|            if ((i == text_info->length) || cur->linebreak) {
  ------------------
  |  Branch (1826:17): [True: 204k, False: 2.93M]
  |  Branch (1826:45): [True: 12, False: 2.93M]
  ------------------
 1827|   204k|                s1 = s2;
 1828|   204k|                s2 = s3;
 1829|   204k|                s3 = cur;
 1830|   204k|                if (s1 && (s2->linebreak == 1)) {       // have at least 2 lines, and linebreak is 'soft'
  ------------------
  |  Branch (1830:21): [True: 12, False: 204k]
  |  Branch (1830:27): [True: 12, False: 0]
  ------------------
 1831|     12|                    double l1, l2, l1_new, l2_new;
 1832|       |
 1833|       |                    // Find last word of line and trim surrounding whitespace before measuring
 1834|       |                    // (whitespace ' ' will also get trimmed in rendering)
 1835|     12|                    GlyphInfo *w = rewind_trailing_spaces(s1, s2);
 1836|     12|                    GlyphInfo *e1_old = w;
 1837|   963k|                    while ((w > s1) && (!ALLOWBREAK(w->symbol, w - text_info->glyphs))) {
  ------------------
  |  | 1724|   963k|    #define ALLOWBREAK(glyph, index) (glyph == ' ')
  ------------------
  |  Branch (1837:28): [True: 963k, False: 12]
  |  Branch (1837:40): [True: 963k, False: 0]
  ------------------
 1838|   963k|                        --w;
 1839|   963k|                    }
 1840|     12|                    GlyphInfo *e1 = w;
 1841|     12|                    while ((e1 > s1) && (e1->symbol == ' ')) {
  ------------------
  |  Branch (1841:28): [True: 0, False: 12]
  |  Branch (1841:41): [True: 0, False: 0]
  ------------------
 1842|      0|                        --e1;
 1843|      0|                    }
 1844|     12|                    if (w->symbol == ' ')
  ------------------
  |  Branch (1844:25): [True: 0, False: 12]
  ------------------
 1845|      0|                        ++w;
 1846|     12|                    if (w == s1)
  ------------------
  |  Branch (1846:25): [True: 12, False: 0]
  ------------------
 1847|     12|                        continue; // Merging linebreaks is never beneficial
 1848|       |
 1849|      0|                    GlyphInfo *e2 = rewind_trailing_spaces(s2, s3);
 1850|       |
 1851|      0|                    l1 = d6_to_double(
 1852|      0|                        (e1_old->bbox.x_max + e1_old->pos.x) -
 1853|      0|                        (s1->bbox.x_min + s1->pos.x));
 1854|      0|                    l2 = d6_to_double(
 1855|      0|                        (e2->bbox.x_max + e2->pos.x) -
 1856|      0|                        (s2->bbox.x_min + s2->pos.x));
 1857|      0|                    l1_new = d6_to_double(
 1858|      0|                        (e1->bbox.x_max + e1->pos.x) -
 1859|      0|                        (s1->bbox.x_min + s1->pos.x));
 1860|      0|                    l2_new = d6_to_double(
 1861|      0|                        (e2->bbox.x_max + e2->pos.x) -
 1862|      0|                        (w->bbox.x_min + w->pos.x));
 1863|       |
 1864|      0|                    if (DIFF(l1_new, l2_new) < DIFF(l1, l2)) {
  ------------------
  |  | 1818|      0|#define DIFF(x,y) (((x) < (y)) ? (y - x) : (x - y))
  |  |  ------------------
  |  |  |  Branch (1818:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
                                  if (DIFF(l1_new, l2_new) < DIFF(l1, l2)) {
  ------------------
  |  | 1818|      0|#define DIFF(x,y) (((x) < (y)) ? (y - x) : (x - y))
  |  |  ------------------
  |  |  |  Branch (1818:20): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1864:25): [True: 0, False: 0]
  ------------------
 1865|      0|                        w->linebreak = 1;
 1866|      0|                        s2->linebreak = 0;
 1867|      0|                        s2 = w;
 1868|      0|                        exit = 0;
 1869|      0|                    }
 1870|      0|                }
 1871|   204k|            }
 1872|  3.13M|            if (i == text_info->length)
  ------------------
  |  Branch (1872:17): [True: 204k, False: 2.93M]
  ------------------
 1873|   204k|                break;
 1874|  3.13M|        }
 1875|       |
 1876|   204k|    }
 1877|   204k|    assert(text_info->n_lines >= 1);
 1878|   204k|#undef DIFF
 1879|   204k|}
ass_render.c:rewind_trailing_spaces:
 1799|     12|{
 1800|     12|    GlyphInfo *g = start2;
 1801|     24|    do {
 1802|     24|        --g;
 1803|     24|    } while ((g > start1) && (g->symbol == ' '));
  ------------------
  |  Branch (1803:14): [True: 24, False: 0]
  |  Branch (1803:30): [True: 12, False: 12]
  ------------------
 1804|     12|    return g;
 1805|     12|}
ass_render.c:trim_whitespace:
 1661|   204k|{
 1662|   204k|    int i, j;
 1663|   204k|    GlyphInfo *cur;
 1664|   204k|    TextInfo *ti = state->text_info;
 1665|       |
 1666|       |    // Mark trailing spaces
 1667|   204k|    i = ti->length - 1;
 1668|   204k|    cur = ti->glyphs + i;
 1669|   307k|    while (i && IS_WHITESPACE(cur)) {
  ------------------
  |  | 1658|   204k|#define IS_WHITESPACE(x) ((x->symbol == ' ' || x->symbol == '\n') \
  |  |  ------------------
  |  |  |  Branch (1658:28): [True: 102k, False: 102k]
  |  |  |  Branch (1658:48): [True: 0, False: 102k]
  |  |  ------------------
  |  | 1659|   204k|                          && !x->linebreak)
  |  |  ------------------
  |  |  |  Branch (1659:30): [True: 102k, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1669:12): [True: 204k, False: 102k]
  ------------------
 1670|   102k|        cur->skip = true;
 1671|   102k|        cur->is_trimmed_whitespace = true;
 1672|   102k|        cur = ti->glyphs + --i;
 1673|   102k|    }
 1674|       |
 1675|       |    // Mark leading whitespace
 1676|   204k|    i = 0;
 1677|   204k|    cur = ti->glyphs;
 1678|   307k|    while (i < ti->length && IS_WHITESPACE(cur)) {
  ------------------
  |  | 1658|   204k|#define IS_WHITESPACE(x) ((x->symbol == ' ' || x->symbol == '\n') \
  |  |  ------------------
  |  |  |  Branch (1658:28): [True: 102k, False: 102k]
  |  |  |  Branch (1658:48): [True: 0, False: 102k]
  |  |  ------------------
  |  | 1659|   204k|                          && !x->linebreak)
  |  |  ------------------
  |  |  |  Branch (1659:30): [True: 102k, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1678:12): [True: 204k, False: 102k]
  ------------------
 1679|   102k|        cur->skip = true;
 1680|   102k|        cur->is_trimmed_whitespace = true;
 1681|   102k|        cur = ti->glyphs + ++i;
 1682|   102k|    }
 1683|   204k|    if (i < ti->length)
  ------------------
  |  Branch (1683:9): [True: 102k, False: 102k]
  ------------------
 1684|   102k|        cur->starts_new_run = true;
 1685|       |
 1686|       |    // Mark all extraneous whitespace inbetween
 1687|  3.13M|    for (i = 0; i < ti->length; ++i) {
  ------------------
  |  Branch (1687:17): [True: 2.93M, False: 204k]
  ------------------
 1688|  2.93M|        cur = ti->glyphs + i;
 1689|  2.93M|        if (cur->linebreak) {
  ------------------
  |  Branch (1689:13): [True: 12, False: 2.93M]
  ------------------
 1690|       |            // Mark whitespace before
 1691|     12|            j = i - 1;
 1692|     12|            cur = ti->glyphs + j;
 1693|     24|            while (j && IS_WHITESPACE(cur)) {
  ------------------
  |  | 1658|     24|#define IS_WHITESPACE(x) ((x->symbol == ' ' || x->symbol == '\n') \
  |  |  ------------------
  |  |  |  Branch (1658:28): [True: 12, False: 12]
  |  |  |  Branch (1658:48): [True: 0, False: 12]
  |  |  ------------------
  |  | 1659|     24|                          && !x->linebreak)
  |  |  ------------------
  |  |  |  Branch (1659:30): [True: 12, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1693:20): [True: 24, False: 0]
  ------------------
 1694|     12|                cur->skip = true;
 1695|     12|                cur->is_trimmed_whitespace = true;
 1696|     12|                cur = ti->glyphs + --j;
 1697|     12|            }
 1698|       |            // A break itself can contain a whitespace, too
 1699|     12|            cur = ti->glyphs + i;
 1700|     12|            if (cur->symbol == ' ' || cur->symbol == '\n') {
  ------------------
  |  Branch (1700:17): [True: 0, False: 12]
  |  Branch (1700:39): [True: 0, False: 12]
  ------------------
 1701|      0|                cur->skip = true;
 1702|      0|                cur->is_trimmed_whitespace = true;
 1703|       |                // Mark whitespace after
 1704|      0|                j = i + 1;
 1705|      0|                cur = ti->glyphs + j;
 1706|      0|                while (j < ti->length && IS_WHITESPACE(cur)) {
  ------------------
  |  | 1658|      0|#define IS_WHITESPACE(x) ((x->symbol == ' ' || x->symbol == '\n') \
  |  |  ------------------
  |  |  |  Branch (1658:28): [True: 0, False: 0]
  |  |  |  Branch (1658:48): [True: 0, False: 0]
  |  |  ------------------
  |  | 1659|      0|                          && !x->linebreak)
  |  |  ------------------
  |  |  |  Branch (1659:30): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (1706:24): [True: 0, False: 0]
  ------------------
 1707|      0|                    cur->skip = true;
 1708|      0|                    cur->is_trimmed_whitespace = true;
 1709|      0|                    cur = ti->glyphs + ++j;
 1710|      0|                }
 1711|      0|                i = j - 1;
 1712|      0|            }
 1713|     12|            if (cur < ti->glyphs + ti->length)
  ------------------
  |  Branch (1713:17): [True: 12, False: 0]
  ------------------
 1714|     12|                cur->starts_new_run = true;
 1715|     12|        }
 1716|  2.93M|    }
 1717|   204k|}
ass_render.c:measure_text:
 1609|   204k|{
 1610|   204k|    ASS_Renderer *render_priv = state->renderer;
 1611|   204k|    TextInfo *text_info = state->text_info;
 1612|   204k|    text_info->height = 0;
 1613|   204k|    text_info->border_x = 0;
 1614|       |
 1615|   204k|    int cur_line = 0;
 1616|   204k|    double scale = 0.5 / 64;
 1617|   204k|    int max_asc = 0, max_desc = 0;
 1618|   204k|    double max_border_y = 0, max_border_x = 0;
 1619|   204k|    bool empty_trimmed_line = true;
 1620|  3.13M|    for (int i = 0; i < text_info->length; i++) {
  ------------------
  |  Branch (1620:21): [True: 2.93M, False: 204k]
  ------------------
 1621|  2.93M|        if (text_info->glyphs[i].linebreak) {
  ------------------
  |  Branch (1621:13): [True: 12, False: 2.93M]
  ------------------
 1622|     12|            measure_text_on_eol(state, scale, cur_line,
 1623|     12|                    max_asc, max_desc, max_border_x, max_border_y);
 1624|     12|            empty_trimmed_line = true;
 1625|     12|            max_asc = max_desc = 0;
 1626|     12|            max_border_y = max_border_x = 0;
 1627|     12|            scale = 0.5 / 64;
 1628|     12|            cur_line++;
 1629|     12|        }
 1630|  2.93M|        GlyphInfo *cur = text_info->glyphs + i;
 1631|       |        // VSFilter ignores metrics of line-leading/trailing (trimmed)
 1632|       |        // whitespace, except when the line becomes empty after trimming
 1633|  2.93M|        if (empty_trimmed_line && !cur->is_trimmed_whitespace) {
  ------------------
  |  Branch (1633:13): [True: 204k, False: 2.72M]
  |  Branch (1633:35): [True: 102k, False: 102k]
  ------------------
 1634|   102k|            empty_trimmed_line = false;
 1635|       |            // Forget metrics of line-leading whitespace
 1636|   102k|            max_asc = max_desc = 0;
 1637|   102k|            max_border_y = max_border_x = 0;
 1638|  2.83M|        } else if (!empty_trimmed_line && cur->is_trimmed_whitespace) {
  ------------------
  |  Branch (1638:20): [True: 2.72M, False: 102k]
  |  Branch (1638:43): [True: 102k, False: 2.62M]
  ------------------
 1639|       |            // Ignore metrics of line-trailing whitespace
 1640|   102k|            continue;
 1641|   102k|        }
 1642|  2.83M|        max_asc  = FFMAX(max_asc,  cur->asc);
  ------------------
  |  |   46|  2.83M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 900k, False: 1.93M]
  |  |  ------------------
  ------------------
 1643|  2.83M|        max_desc = FFMAX(max_desc, cur->desc);
  ------------------
  |  |   46|  2.83M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 147, False: 2.83M]
  |  |  ------------------
  ------------------
 1644|  2.83M|        max_border_y = FFMAX(max_border_y, cur->border_y);
  ------------------
  |  |   46|  2.83M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 2.83M]
  |  |  ------------------
  ------------------
 1645|  2.83M|        max_border_x = FFMAX(max_border_x, cur->border_x);
  ------------------
  |  |   46|  2.83M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 2.83M]
  |  |  ------------------
  ------------------
 1646|  2.83M|        if (cur->symbol != '\n')
  ------------------
  |  Branch (1646:13): [True: 2.83M, False: 0]
  ------------------
 1647|  2.83M|            scale = 1.0 / 64;
 1648|  2.83M|    }
 1649|   204k|    assert(cur_line == text_info->n_lines - 1);
 1650|   204k|    measure_text_on_eol(state, scale, cur_line,
 1651|   204k|            max_asc, max_desc, max_border_x, max_border_y);
 1652|   204k|    text_info->height += cur_line * render_priv->settings.line_spacing;
 1653|   204k|}
ass_render.c:measure_text_on_eol:
 1582|   204k|{
 1583|   204k|    TextInfo *text_info = state->text_info;
 1584|   204k|    text_info->lines[cur_line].asc  = scale * max_asc;
 1585|   204k|    text_info->lines[cur_line].desc = scale * max_desc;
 1586|   204k|    text_info->height += scale * max_asc + scale * max_desc;
 1587|       |    // For *VSFilter compatibility do biased rounding on max_border*
 1588|       |    // https://github.com/Cyberbeing/xy-VSFilter/blob/xy_sub_filter_rc4@%7B2020-05-17%7D/src/subtitles/RTS.cpp#L1465
 1589|   204k|    text_info->border_bottom = (int) (state->border_scale_y * max_border_y + 0.5);
 1590|   204k|    if (cur_line == 0)
  ------------------
  |  Branch (1590:9): [True: 204k, False: 12]
  ------------------
 1591|   204k|        text_info->border_top = text_info->border_bottom;
 1592|       |    // VSFilter takes max \bordx into account for collision, even if far from edge
 1593|   204k|    text_info->border_x = FFMAX(text_info->border_x,
  ------------------
  |  |   46|   204k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
 1594|   204k|            (int) (state->border_scale_x * max_border_x + 0.5));
 1595|   204k|}
ass_render.c:wrap_lines_measure:
 1883|   204k|{
 1884|   204k|    TextInfo *text_info = state->text_info;
 1885|   204k|    int cur_line = 1;
 1886|   204k|    int i = 0;
 1887|       |
 1888|   307k|    while (i < text_info->length && text_info->glyphs[i].skip)
  ------------------
  |  Branch (1888:12): [True: 204k, False: 102k]
  |  Branch (1888:37): [True: 102k, False: 102k]
  ------------------
 1889|   102k|        ++i;
 1890|   204k|    double pen_shift_x = d6_to_double(-text_info->glyphs[i].pos.x);
 1891|   204k|    double pen_shift_y = 0.;
 1892|       |
 1893|  3.13M|    for (i = 0; i < text_info->length; ++i) {
  ------------------
  |  Branch (1893:17): [True: 2.93M, False: 204k]
  ------------------
 1894|  2.93M|        GlyphInfo *cur = text_info->glyphs + i;
 1895|  2.93M|        if (cur->linebreak) {
  ------------------
  |  Branch (1895:13): [True: 12, False: 2.93M]
  ------------------
 1896|     12|            while (i < text_info->length && cur->skip && !FORCEBREAK(cur->symbol, i))
  ------------------
  |  | 1725|      0|    #define FORCEBREAK(glyph, index) (glyph == '\n')
  ------------------
  |  Branch (1896:20): [True: 12, False: 0]
  |  Branch (1896:45): [True: 0, False: 12]
  |  Branch (1896:58): [True: 0, False: 0]
  ------------------
 1897|      0|                cur = text_info->glyphs + ++i;
 1898|     12|            double height =
 1899|     12|                text_info->lines[cur_line - 1].desc +
 1900|     12|                text_info->lines[cur_line].asc;
 1901|     12|            text_info->lines[cur_line - 1].len = i -
 1902|     12|                text_info->lines[cur_line - 1].offset;
 1903|     12|            text_info->lines[cur_line].offset = i;
 1904|     12|            cur_line++;
 1905|     12|            pen_shift_x = d6_to_double(-cur->pos.x);
 1906|     12|            pen_shift_y += height + state->renderer->settings.line_spacing;
 1907|     12|        }
 1908|  2.93M|        cur->pos.x += double_to_d6(pen_shift_x);
 1909|  2.93M|        cur->pos.y += double_to_d6(pen_shift_y);
 1910|  2.93M|    }
 1911|   204k|    text_info->lines[cur_line - 1].len =
 1912|   204k|        text_info->length - text_info->lines[cur_line - 1].offset;
 1913|   204k|}
ass_render.c:reorder_text:
 2268|   204k|{
 2269|   204k|    ASS_Renderer *render_priv = state->renderer;
 2270|   204k|    TextInfo *text_info = state->text_info;
 2271|   204k|    FriBidiStrIndex *cmap = ass_shaper_reorder(state->shaper, text_info);
 2272|   204k|    if (!cmap) {
  ------------------
  |  Branch (2272:9): [True: 0, False: 204k]
  ------------------
 2273|      0|        ass_msg(render_priv->library, MSGL_ERR, "Failed to reorder text");
  ------------------
  |  |   40|      0|#define MSGL_ERR 1
  ------------------
 2274|      0|        ass_shaper_cleanup(state->shaper, text_info);
 2275|      0|        free_render_context(state);
 2276|      0|        return;
 2277|      0|    }
 2278|       |
 2279|       |    // Reposition according to the map
 2280|   204k|    ASS_Vector pen = { 0, 0 };
 2281|   204k|    int lineno = 1;
 2282|  3.13M|    for (int i = 0; i < text_info->length; i++) {
  ------------------
  |  Branch (2282:21): [True: 2.93M, False: 204k]
  ------------------
 2283|  2.93M|        GlyphInfo *info = text_info->glyphs + cmap[i];
 2284|  2.93M|        if (text_info->glyphs[i].linebreak) {
  ------------------
  |  Branch (2284:13): [True: 12, False: 2.93M]
  ------------------
 2285|     12|            pen.x = 0;
 2286|     12|            pen.y += double_to_d6(text_info->lines[lineno-1].desc);
 2287|     12|            pen.y += double_to_d6(text_info->lines[lineno].asc);
 2288|     12|            pen.y += double_to_d6(render_priv->settings.line_spacing);
 2289|     12|            lineno++;
 2290|     12|        }
 2291|  2.93M|        if (info->skip)
  ------------------
  |  Branch (2291:13): [True: 204k, False: 2.72M]
  ------------------
 2292|   204k|            continue;
 2293|  2.72M|        ASS_Vector cluster_pen = pen;
 2294|  2.72M|        pen.x += info->cluster_advance.x;
 2295|  2.72M|        pen.y += info->cluster_advance.y;
 2296|  5.45M|        while (info) {
  ------------------
  |  Branch (2296:16): [True: 2.72M, False: 2.72M]
  ------------------
 2297|  2.72M|            info->pos.x = info->offset.x + cluster_pen.x;
 2298|  2.72M|            info->pos.y = info->offset.y + cluster_pen.y;
 2299|  2.72M|            cluster_pen.x += info->advance.x;
 2300|  2.72M|            cluster_pen.y += info->advance.y;
 2301|  2.72M|            info = info->next;
 2302|  2.72M|        }
 2303|  2.72M|    }
 2304|   204k|}
ass_render.c:align_lines:
 2331|   204k|{
 2332|   204k|    TextInfo *text_info = state->text_info;
 2333|   204k|    GlyphInfo *glyphs = text_info->glyphs;
 2334|   204k|    int i, j;
 2335|   204k|    double width = 0;
 2336|   204k|    int last_break = -1;
 2337|   204k|    int halign = state->alignment & 3;
 2338|   204k|    int justify = state->justify;
 2339|   204k|    double max_width = 0;
 2340|       |
 2341|   204k|    if (state->evt_type & EVENT_HSCROLL) {
  ------------------
  |  Branch (2341:9): [True: 0, False: 204k]
  ------------------
 2342|      0|        justify = halign;
 2343|      0|        halign = HALIGN_LEFT;
  ------------------
  |  |   75|      0|#define HALIGN_LEFT 1
  ------------------
 2344|      0|    }
 2345|       |
 2346|  3.34M|    for (i = 0; i <= text_info->length; ++i) {   // (text_info->length + 1) is the end of the last line
  ------------------
  |  Branch (2346:17): [True: 3.13M, False: 204k]
  ------------------
 2347|  3.13M|        if ((i == text_info->length) || glyphs[i].linebreak) {
  ------------------
  |  Branch (2347:13): [True: 204k, False: 2.93M]
  |  Branch (2347:41): [True: 12, False: 2.93M]
  ------------------
 2348|   204k|            max_width = FFMAX(max_width,width);
  ------------------
  |  |   46|   204k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 6, False: 204k]
  |  |  ------------------
  ------------------
 2349|   204k|            width = 0;
 2350|   204k|        }
 2351|  3.13M|        if (i < text_info->length && !glyphs[i].skip &&
  ------------------
  |  Branch (2351:13): [True: 2.93M, False: 204k]
  |  Branch (2351:38): [True: 2.72M, False: 204k]
  ------------------
 2352|  3.13M|                glyphs[i].symbol != '\n' && glyphs[i].symbol != 0) {
  ------------------
  |  Branch (2352:17): [True: 2.72M, False: 0]
  |  Branch (2352:45): [True: 2.72M, False: 0]
  ------------------
 2353|  2.72M|            width += d6_to_double(glyphs[i].cluster_advance.x);
 2354|  2.72M|        }
 2355|  3.13M|    }
 2356|  3.34M|    for (i = 0; i <= text_info->length; ++i) {   // (text_info->length + 1) is the end of the last line
  ------------------
  |  Branch (2356:17): [True: 3.13M, False: 204k]
  ------------------
 2357|  3.13M|        if ((i == text_info->length) || glyphs[i].linebreak) {
  ------------------
  |  Branch (2357:13): [True: 204k, False: 2.93M]
  |  Branch (2357:41): [True: 12, False: 2.93M]
  ------------------
 2358|   204k|            double shift = 0;
 2359|   204k|            if (halign == HALIGN_LEFT) {    // left aligned, no action
  ------------------
  |  |   75|   204k|#define HALIGN_LEFT 1
  ------------------
  |  Branch (2359:17): [True: 0, False: 204k]
  ------------------
 2360|      0|                if (justify == ASS_JUSTIFY_RIGHT) {
  ------------------
  |  |   81|      0|#define ASS_JUSTIFY_RIGHT 3
  ------------------
  |  Branch (2360:21): [True: 0, False: 0]
  ------------------
 2361|      0|                    shift = max_width - width;
 2362|      0|                } else if (justify == ASS_JUSTIFY_CENTER) {
  ------------------
  |  |   80|      0|#define ASS_JUSTIFY_CENTER 2
  ------------------
  |  Branch (2362:28): [True: 0, False: 0]
  ------------------
 2363|      0|                    shift = (max_width - width) / 2.0;
 2364|      0|                } else {
 2365|      0|                    shift = 0;
 2366|      0|                }
 2367|   204k|            } else if (halign == HALIGN_RIGHT) {    // right aligned
  ------------------
  |  |   77|   204k|#define HALIGN_RIGHT 3
  ------------------
  |  Branch (2367:24): [True: 0, False: 204k]
  ------------------
 2368|      0|                if (justify == ASS_JUSTIFY_LEFT) {
  ------------------
  |  |   79|      0|#define ASS_JUSTIFY_LEFT 1
  ------------------
  |  Branch (2368:21): [True: 0, False: 0]
  ------------------
 2369|      0|                    shift = max_text_width - max_width;
 2370|      0|                } else if (justify == ASS_JUSTIFY_CENTER) {
  ------------------
  |  |   80|      0|#define ASS_JUSTIFY_CENTER 2
  ------------------
  |  Branch (2370:28): [True: 0, False: 0]
  ------------------
 2371|      0|                    shift = max_text_width - max_width + (max_width - width) / 2.0;
 2372|      0|                } else {
 2373|      0|                    shift = max_text_width - width;
 2374|      0|                }
 2375|   204k|            } else if (halign == HALIGN_CENTER) {   // centered
  ------------------
  |  |   76|   204k|#define HALIGN_CENTER 2
  ------------------
  |  Branch (2375:24): [True: 204k, False: 8]
  ------------------
 2376|   204k|                if (justify == ASS_JUSTIFY_LEFT) {
  ------------------
  |  |   79|   204k|#define ASS_JUSTIFY_LEFT 1
  ------------------
  |  Branch (2376:21): [True: 0, False: 204k]
  ------------------
 2377|      0|                    shift = (max_text_width - max_width) / 2.0;
 2378|   204k|                } else if (justify == ASS_JUSTIFY_RIGHT) {
  ------------------
  |  |   81|   204k|#define ASS_JUSTIFY_RIGHT 3
  ------------------
  |  Branch (2378:28): [True: 0, False: 204k]
  ------------------
 2379|      0|                    shift = (max_text_width - max_width) / 2.0 + max_width - width;
 2380|   204k|                } else {
 2381|   204k|                    shift = (max_text_width - width) / 2.0;
 2382|   204k|                }
 2383|   204k|            }
 2384|  3.13M|            for (j = last_break + 1; j < i; ++j) {
  ------------------
  |  Branch (2384:38): [True: 2.93M, False: 204k]
  ------------------
 2385|  2.93M|                GlyphInfo *info = glyphs + j;
 2386|  5.86M|                while (info) {
  ------------------
  |  Branch (2386:24): [True: 2.93M, False: 2.93M]
  ------------------
 2387|  2.93M|                    info->pos.x += double_to_d6(shift);
 2388|  2.93M|                    info = info->next;
 2389|  2.93M|                }
 2390|  2.93M|            }
 2391|   204k|            last_break = i - 1;
 2392|   204k|            width = 0;
 2393|   204k|        }
 2394|  3.13M|        if (i < text_info->length && !glyphs[i].skip &&
  ------------------
  |  Branch (2394:13): [True: 2.93M, False: 204k]
  |  Branch (2394:38): [True: 2.72M, False: 204k]
  ------------------
 2395|  3.13M|                glyphs[i].symbol != '\n' && glyphs[i].symbol != 0) {
  ------------------
  |  Branch (2395:17): [True: 2.72M, False: 0]
  |  Branch (2395:45): [True: 2.72M, False: 0]
  ------------------
 2396|  2.72M|            width += d6_to_double(glyphs[i].cluster_advance.x);
 2397|  2.72M|        }
 2398|  3.13M|    }
 2399|   204k|}
ass_render.c:compute_string_bbox:
  878|   204k|{
  879|   204k|    if (text->length > 0) {
  ------------------
  |  Branch (879:9): [True: 204k, False: 0]
  ------------------
  880|   204k|        bbox->x_min = +32000;
  881|   204k|        bbox->x_max = -32000;
  882|   204k|        bbox->y_min = -text->lines[0].asc;
  883|   204k|        bbox->y_max = bbox->y_min + text->height;
  884|       |
  885|  3.13M|        for (int i = 0; i < text->length; i++) {
  ------------------
  |  Branch (885:25): [True: 2.93M, False: 204k]
  ------------------
  886|  2.93M|            GlyphInfo *info = text->glyphs + i;
  887|  2.93M|            if (info->skip) continue;
  ------------------
  |  Branch (887:17): [True: 204k, False: 2.72M]
  ------------------
  888|  2.72M|            double s = d6_to_double(info->pos.x);
  889|  2.72M|            double e = s + d6_to_double(info->cluster_advance.x);
  890|  2.72M|            bbox->x_min = FFMIN(bbox->x_min, s);
  ------------------
  |  |   47|  2.72M|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 102k, False: 2.62M]
  |  |  ------------------
  ------------------
  891|  2.72M|            bbox->x_max = FFMAX(bbox->x_max, e);
  ------------------
  |  |   46|  2.72M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 1.25M, False: 1.47M]
  |  |  ------------------
  ------------------
  892|  2.72M|        }
  893|   204k|    } else
  894|      0|        bbox->x_min = bbox->x_max = bbox->y_min = bbox->y_max = 0;
  895|   204k|}
ass_render.c:apply_baseline_shear:
 2307|   204k|{
 2308|   204k|    ASS_Renderer *render_priv = state->renderer;
 2309|   204k|    TextInfo *text_info = state->text_info;
 2310|   204k|    FriBidiStrIndex *cmap = ass_shaper_get_reorder_map(state->shaper);
 2311|   204k|    int32_t shear = 0;
 2312|   204k|    bool whole_text_layout =
 2313|   204k|        render_priv->track->parser_priv->feature_flags &
 2314|   204k|        FEATURE_MASK(ASS_FEATURE_WHOLE_TEXT_LAYOUT);
  ------------------
  |  |   52|   204k|#define FEATURE_MASK(feat) (((uint32_t) 1) << (feat))
  ------------------
 2315|  3.13M|    for (int i = 0; i < text_info->length; i++) {
  ------------------
  |  Branch (2315:21): [True: 2.93M, False: 204k]
  ------------------
 2316|  2.93M|        GlyphInfo *info = text_info->glyphs + cmap[i];
 2317|  2.93M|        if (text_info->glyphs[i].linebreak ||
  ------------------
  |  Branch (2317:13): [True: 12, False: 2.93M]
  ------------------
 2318|  2.93M|            (!whole_text_layout && text_info->glyphs[i].starts_new_run))
  ------------------
  |  Branch (2318:14): [True: 2.93M, False: 0]
  |  Branch (2318:36): [True: 204k, False: 2.72M]
  ------------------
 2319|   204k|            shear = 0;
 2320|  2.93M|        if (!info->scale_x || !info->scale_y)
  ------------------
  |  Branch (2320:13): [True: 0, False: 2.93M]
  |  Branch (2320:31): [True: 0, False: 2.93M]
  ------------------
 2321|      0|            info->skip = true;
 2322|  2.93M|        if (info->skip)
  ------------------
  |  Branch (2322:13): [True: 204k, False: 2.72M]
  ------------------
 2323|   204k|            continue;
 2324|  5.45M|        for (GlyphInfo *cur = info; cur; cur = cur->next)
  ------------------
  |  Branch (2324:37): [True: 2.72M, False: 2.72M]
  ------------------
 2325|  2.72M|            cur->pos.y += shear;
 2326|  2.72M|        shear += (info->fay / info->scale_x * info->scale_y) * info->cluster_advance.x;
 2327|  2.72M|    }
 2328|   204k|}
ass_render.c:get_base_point:
 1971|   204k|{
 1972|   204k|    const int halign = alignment & 3;
 1973|   204k|    const int valign = alignment & 12;
 1974|   204k|    if (bx)
  ------------------
  |  Branch (1974:9): [True: 204k, False: 0]
  ------------------
 1975|   204k|        switch (halign) {
  ------------------
  |  Branch (1975:17): [True: 8, False: 204k]
  ------------------
 1976|      0|        case HALIGN_LEFT:
  ------------------
  |  |   75|      0|#define HALIGN_LEFT 1
  ------------------
  |  Branch (1976:9): [True: 0, False: 204k]
  ------------------
 1977|      0|            *bx = bbox->x_min;
 1978|      0|            break;
 1979|   204k|        case HALIGN_CENTER:
  ------------------
  |  |   76|   204k|#define HALIGN_CENTER 2
  ------------------
  |  Branch (1979:9): [True: 204k, False: 8]
  ------------------
 1980|   204k|            *bx = (bbox->x_max + bbox->x_min) / 2.0;
 1981|   204k|            break;
 1982|      0|        case HALIGN_RIGHT:
  ------------------
  |  |   77|      0|#define HALIGN_RIGHT 3
  ------------------
  |  Branch (1982:9): [True: 0, False: 204k]
  ------------------
 1983|      0|            *bx = bbox->x_max;
 1984|      0|            break;
 1985|   204k|        }
 1986|   204k|    if (by)
  ------------------
  |  Branch (1986:9): [True: 204k, False: 0]
  ------------------
 1987|   204k|        switch (valign) {
  ------------------
  |  Branch (1987:17): [True: 0, False: 204k]
  ------------------
 1988|      0|        case VALIGN_TOP:
  ------------------
  |  |   74|      0|#define VALIGN_TOP 4
  ------------------
  |  Branch (1988:9): [True: 0, False: 204k]
  ------------------
 1989|      0|            *by = bbox->y_min;
 1990|      0|            break;
 1991|      0|        case VALIGN_CENTER:
  ------------------
  |  |   73|      0|#define VALIGN_CENTER 8
  ------------------
  |  Branch (1991:9): [True: 0, False: 204k]
  ------------------
 1992|      0|            *by = (bbox->y_max + bbox->y_min) / 2.0;
 1993|      0|            break;
 1994|   204k|        case VALIGN_SUB:
  ------------------
  |  |   72|   204k|#define VALIGN_SUB 0
  ------------------
  |  Branch (1994:9): [True: 204k, False: 0]
  ------------------
 1995|   204k|            *by = bbox->y_max;
 1996|   204k|            break;
 1997|   204k|        }
 1998|   204k|}
ass_render.c:x2scr_pos:
  227|   614k|{
  228|   614k|    return x * render_priv->frame_content_width / render_priv->par_scale_x / render_priv->track->PlayResX +
  229|   614k|        render_priv->settings.left_margin;
  230|   614k|}
ass_render.c:y2scr_pos:
  257|   819k|{
  258|   819k|    return y * render_priv->frame_content_height / render_priv->track->PlayResY +
  259|   819k|        render_priv->settings.top_margin;
  260|   819k|}
ass_render.c:y2scr_top:
  273|   204k|{
  274|   204k|    ASS_Renderer *render_priv = state->renderer;
  275|   204k|    if (state->explicit || !render_priv->settings.use_margins)
  ------------------
  |  Branch (275:9): [True: 0, False: 204k]
  |  Branch (275:28): [True: 204k, False: 0]
  ------------------
  276|   204k|        return y2scr_pos(render_priv, y);
  277|      0|    return y * render_priv->fit_height /
  278|      0|        render_priv->track->PlayResY;
  279|   204k|}
ass_render.c:y2scr_sub:
  282|   204k|{
  283|   204k|    ASS_Renderer *render_priv = state->renderer;
  284|   204k|    if (state->explicit || !render_priv->settings.use_margins)
  ------------------
  |  Branch (284:9): [True: 0, False: 204k]
  |  Branch (284:28): [True: 204k, False: 0]
  ------------------
  285|   204k|        return y2scr_pos(render_priv, y);
  286|      0|    return y * render_priv->fit_height /
  287|      0|        render_priv->track->PlayResY +
  288|      0|        (render_priv->height - render_priv->fit_height);
  289|   204k|}
ass_render.c:x2scr_pos_scaled:
  249|   409k|{
  250|   409k|    return x * render_priv->frame_content_width / render_priv->track->PlayResX +
  251|   409k|        render_priv->settings.left_margin;
  252|   409k|}
ass_render.c:calculate_rotation_params:
 2403|   204k|{
 2404|   204k|    ASS_Renderer *render_priv = state->renderer;
 2405|   204k|    ASS_DVector center;
 2406|   204k|    if (state->have_origin) {
  ------------------
  |  Branch (2406:9): [True: 0, False: 204k]
  ------------------
 2407|      0|        center.x = x2scr_pos(render_priv, state->org_x);
 2408|      0|        center.y = y2scr_pos(render_priv, state->org_y);
 2409|   204k|    } else {
 2410|   204k|        double bx = 0., by = 0.;
 2411|   204k|        get_base_point(bbox, state->alignment, &bx, &by);
 2412|   204k|        center.x = device_x + bx;
 2413|   204k|        center.y = device_y + by;
 2414|   204k|    }
 2415|       |
 2416|   204k|    TextInfo *text_info = state->text_info;
 2417|  3.13M|    for (int i = 0; i < text_info->length; i++) {
  ------------------
  |  Branch (2417:21): [True: 2.93M, False: 204k]
  ------------------
 2418|  2.93M|        GlyphInfo *info = text_info->glyphs + i;
 2419|  5.86M|        while (info) {
  ------------------
  |  Branch (2419:16): [True: 2.93M, False: 2.93M]
  ------------------
 2420|  2.93M|            info->shift.x = info->pos.x + double_to_d6(device_x - center.x +
 2421|  2.93M|                    info->shadow_x * state->border_scale_x /
 2422|  2.93M|                    render_priv->par_scale_x);
 2423|  2.93M|            info->shift.y = info->pos.y + double_to_d6(device_y - center.y +
 2424|  2.93M|                    info->shadow_y * state->border_scale_y);
 2425|  2.93M|            info = info->next;
 2426|  2.93M|        }
 2427|  2.93M|    }
 2428|   204k|}
ass_render.c:render_and_combine_glyphs:
 2482|   204k|{
 2483|   204k|    ASS_Renderer *render_priv = state->renderer;
 2484|   204k|    TextInfo *text_info = state->text_info;
 2485|   204k|    int left = render_priv->settings.left_margin;
 2486|   204k|    device_x = (device_x - left) * render_priv->par_scale_x + left;
 2487|   204k|    unsigned nb_bitmaps = 0;
 2488|   204k|    bool new_run = true;
 2489|   204k|    CombinedBitmapInfo *combined_info = text_info->combined_bitmaps;
 2490|   204k|    CombinedBitmapInfo *current_info = NULL;
 2491|   204k|    ASS_DVector offset;
 2492|  3.13M|    for (int i = 0; i < text_info->length; i++) {
  ------------------
  |  Branch (2492:21): [True: 2.93M, False: 204k]
  ------------------
 2493|  2.93M|        GlyphInfo *info = text_info->glyphs + i;
 2494|  2.93M|        if (info->starts_new_run) new_run = true;
  ------------------
  |  Branch (2494:13): [True: 204k, False: 2.72M]
  ------------------
 2495|  2.93M|        if (info->skip) {
  ------------------
  |  Branch (2495:13): [True: 204k, False: 2.72M]
  ------------------
 2496|   409k|            for (; info; info = info->next)
  ------------------
  |  Branch (2496:20): [True: 204k, False: 204k]
  ------------------
 2497|   204k|                ass_cache_dec_ref(info->outline);
 2498|   204k|            continue;
 2499|   204k|        }
 2500|  5.45M|        for (; info; info = info->next) {
  ------------------
  |  Branch (2500:16): [True: 2.72M, False: 2.72M]
  ------------------
 2501|  2.72M|            int flags = 0;
 2502|  2.72M|            if (info->border_style == 3)
  ------------------
  |  Branch (2502:17): [True: 0, False: 2.72M]
  ------------------
 2503|      0|                flags |= FILTER_BORDER_STYLE_3;
 2504|  2.72M|            if (info->border_x || info->border_y)
  ------------------
  |  Branch (2504:17): [True: 2.72M, False: 64]
  |  Branch (2504:35): [True: 0, False: 64]
  ------------------
 2505|  2.72M|                flags |= FILTER_NONZERO_BORDER;
 2506|  2.72M|            if (info->shadow_x || info->shadow_y)
  ------------------
  |  Branch (2506:17): [True: 2.72M, False: 64]
  |  Branch (2506:35): [True: 0, False: 64]
  ------------------
 2507|  2.72M|                flags |= FILTER_NONZERO_SHADOW;
 2508|  2.72M|            if (flags & FILTER_NONZERO_SHADOW &&
  ------------------
  |  Branch (2508:17): [True: 2.72M, False: 64]
  ------------------
 2509|  2.72M|                (info->effect_type == EF_KARAOKE_KF ||
  ------------------
  |  Branch (2509:18): [True: 0, False: 2.72M]
  ------------------
 2510|  2.72M|                 info->effect_type == EF_KARAOKE_KO ||
  ------------------
  |  Branch (2510:18): [True: 0, False: 2.72M]
  ------------------
 2511|  2.72M|                 (info->a_pre_fade[0]) != 0xFF ||
  ------------------
  |  Branch (2511:18): [True: 2.72M, False: 0]
  ------------------
 2512|  2.72M|                 info->border_style == 3))
  ------------------
  |  Branch (2512:18): [True: 0, False: 0]
  ------------------
 2513|  2.72M|                flags |= FILTER_FILL_IN_SHADOW;
 2514|  2.72M|            if (!(flags & FILTER_NONZERO_BORDER) &&
  ------------------
  |  Branch (2514:17): [True: 64, False: 2.72M]
  ------------------
 2515|  2.72M|                !(flags & FILTER_FILL_IN_SHADOW))
  ------------------
  |  Branch (2515:17): [True: 64, False: 0]
  ------------------
 2516|     64|                flags &= ~FILTER_NONZERO_SHADOW;
 2517|  2.72M|            if ((flags & FILTER_NONZERO_BORDER &&
  ------------------
  |  Branch (2517:18): [True: 2.72M, False: 64]
  ------------------
 2518|  2.72M|                 info->a_pre_fade[0] == 0 &&
  ------------------
  |  Branch (2518:18): [True: 2.72M, False: 0]
  ------------------
 2519|  2.72M|                 info->a_pre_fade[1] == 0 &&
  ------------------
  |  Branch (2519:18): [True: 2.72M, False: 0]
  ------------------
 2520|  2.72M|                 info->fade == 0) ||
  ------------------
  |  Branch (2520:18): [True: 2.72M, False: 0]
  ------------------
 2521|  2.72M|                info->border_style == 3)
  ------------------
  |  Branch (2521:17): [True: 0, False: 64]
  ------------------
 2522|  2.72M|                flags |= FILTER_FILL_IN_BORDER;
 2523|       |
 2524|  2.72M|            if (new_run) {
  ------------------
  |  Branch (2524:17): [True: 102k, False: 2.62M]
  ------------------
 2525|   102k|                if (nb_bitmaps >= text_info->max_bitmaps) {
  ------------------
  |  Branch (2525:21): [True: 0, False: 102k]
  ------------------
 2526|      0|                    size_t new_size = 2 * text_info->max_bitmaps;
 2527|      0|                    if (!ASS_REALLOC_ARRAY(text_info->combined_bitmaps, new_size)) {
  ------------------
  |  |   91|      0|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (2527:25): [True: 0, False: 0]
  ------------------
 2528|      0|                        ass_cache_dec_ref(info->outline);
 2529|      0|                        continue;
 2530|      0|                    }
 2531|      0|                    text_info->max_bitmaps = new_size;
 2532|      0|                    combined_info = text_info->combined_bitmaps;
 2533|      0|                }
 2534|   102k|                current_info = &combined_info[nb_bitmaps];
 2535|       |
 2536|   102k|                memcpy(&current_info->c, &info->c, sizeof(info->c));
 2537|   102k|                current_info->effect_type = info->effect_type;
 2538|   102k|                current_info->effect_timing = info->effect_timing;
 2539|   102k|                current_info->leftmost_x = OUTLINE_MAX;
  ------------------
  |  |   87|   102k|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
 2540|       |
 2541|   102k|                FilterDesc *filter = &current_info->filter;
 2542|   102k|                filter->flags = flags;
 2543|   102k|                filter->be = info->be;
 2544|       |
 2545|   102k|                int32_t shadow_mask_x, shadow_mask_y;
 2546|   102k|                double blur_radius_scale = 2 / sqrt(log(256));
 2547|   102k|                double blur_scale_x = state->blur_scale_x * blur_radius_scale;
 2548|   102k|                double blur_scale_y = state->blur_scale_y * blur_radius_scale;
 2549|   102k|                filter->blur_x = quantize_blur(info->blur * blur_scale_x, &shadow_mask_x);
 2550|   102k|                filter->blur_y = quantize_blur(info->blur * blur_scale_y, &shadow_mask_y);
 2551|   102k|                if (flags & FILTER_NONZERO_SHADOW) {
  ------------------
  |  Branch (2551:21): [True: 102k, False: 8]
  ------------------
 2552|   102k|                    int32_t x = double_to_d6(info->shadow_x * state->border_scale_x);
 2553|   102k|                    int32_t y = double_to_d6(info->shadow_y * state->border_scale_y);
 2554|   102k|                    filter->shadow.x = (x + (shadow_mask_x >> 1)) & ~shadow_mask_x;
 2555|   102k|                    filter->shadow.y = (y + (shadow_mask_y >> 1)) & ~shadow_mask_y;
 2556|   102k|                } else
 2557|      8|                    filter->shadow.x = filter->shadow.y = 0;
 2558|       |
 2559|   102k|                current_info->x = current_info->y = INT_MAX;
 2560|   102k|                current_info->bm = current_info->bm_o = current_info->bm_s = NULL;
 2561|   102k|                current_info->image = NULL;
 2562|       |
 2563|   102k|                current_info->bitmap_count = current_info->max_bitmap_count = 0;
 2564|   102k|                current_info->bitmaps = malloc(MAX_SUB_BITMAPS_INITIAL * sizeof(BitmapRef));
  ------------------
  |  |   41|   102k|#define MAX_SUB_BITMAPS_INITIAL 64
  ------------------
 2565|   102k|                if (!current_info->bitmaps) {
  ------------------
  |  Branch (2565:21): [True: 0, False: 102k]
  ------------------
 2566|      0|                    ass_cache_dec_ref(info->outline);
 2567|      0|                    continue;
 2568|      0|                }
 2569|   102k|                current_info->max_bitmap_count = MAX_SUB_BITMAPS_INITIAL;
  ------------------
  |  |   41|   102k|#define MAX_SUB_BITMAPS_INITIAL 64
  ------------------
 2570|       |
 2571|   102k|                nb_bitmaps++;
 2572|   102k|                new_run = false;
 2573|   102k|            }
 2574|  2.72M|            assert(current_info);
 2575|       |
 2576|  2.72M|            ASS_Vector pos, pos_o;
 2577|  2.72M|            info->pos.x = double_to_d6(device_x + d6_to_double(info->pos.x) * render_priv->par_scale_x);
 2578|  2.72M|            info->pos.y = double_to_d6(device_y) + info->pos.y;
 2579|  2.72M|            get_bitmap_glyph(state, info, &current_info->leftmost_x, &pos, &pos_o,
 2580|  2.72M|                             &offset, !current_info->bitmap_count, flags);
 2581|       |
 2582|  2.72M|            if (!info->bm && !info->bm_o) {
  ------------------
  |  Branch (2582:17): [True: 884k, False: 1.84M]
  |  Branch (2582:30): [True: 884k, False: 0]
  ------------------
 2583|   884k|                ass_cache_dec_ref(info->bm);
 2584|   884k|                ass_cache_dec_ref(info->bm_o);
 2585|   884k|                continue;
 2586|   884k|            }
 2587|       |
 2588|  1.84M|            if (current_info->bitmap_count >= current_info->max_bitmap_count) {
  ------------------
  |  Branch (2588:17): [True: 135, False: 1.84M]
  ------------------
 2589|    135|                size_t new_size = 2 * current_info->max_bitmap_count;
 2590|    135|                if (!ASS_REALLOC_ARRAY(current_info->bitmaps, new_size)) {
  ------------------
  |  |   91|    135|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (2590:21): [True: 0, False: 135]
  ------------------
 2591|      0|                    ass_cache_dec_ref(info->bm);
 2592|      0|                    ass_cache_dec_ref(info->bm_o);
 2593|      0|                    continue;
 2594|      0|                }
 2595|    135|                current_info->max_bitmap_count = new_size;
 2596|    135|            }
 2597|  1.84M|            current_info->bitmaps[current_info->bitmap_count].bm   = info->bm;
 2598|  1.84M|            current_info->bitmaps[current_info->bitmap_count].bm_o = info->bm_o;
 2599|  1.84M|            current_info->bitmaps[current_info->bitmap_count].pos   = pos;
 2600|  1.84M|            current_info->bitmaps[current_info->bitmap_count].pos_o = pos_o;
 2601|  1.84M|            current_info->bitmap_count++;
 2602|       |
 2603|  1.84M|            current_info->x = FFMIN(current_info->x, pos.x);
  ------------------
  |  |   47|  1.84M|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 102k, False: 1.74M]
  |  |  ------------------
  ------------------
 2604|  1.84M|            current_info->y = FFMIN(current_info->y, pos.y);
  ------------------
  |  |   47|  1.84M|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 204k, False: 1.63M]
  |  |  ------------------
  ------------------
 2605|  1.84M|        }
 2606|  2.72M|    }
 2607|       |
 2608|   307k|    for (int i = 0; i < nb_bitmaps; i++) {
  ------------------
  |  Branch (2608:21): [True: 102k, False: 204k]
  ------------------
 2609|   102k|        CombinedBitmapInfo *info = &combined_info[i];
 2610|   102k|        if (!info->bitmap_count) {
  ------------------
  |  Branch (2610:13): [True: 8, False: 102k]
  ------------------
 2611|      8|            free(info->bitmaps);
 2612|      8|            continue;
 2613|      8|        }
 2614|       |
 2615|   102k|        if (info->effect_type == EF_KARAOKE_KF)
  ------------------
  |  Branch (2615:13): [True: 0, False: 102k]
  ------------------
 2616|      0|            info->effect_timing = lround(d6_to_double(info->leftmost_x) +
 2617|      0|                d6_to_double(info->effect_timing) * render_priv->par_scale_x);
 2618|       |
 2619|  1.94M|        for (int j = 0; j < info->bitmap_count; j++) {
  ------------------
  |  Branch (2619:25): [True: 1.84M, False: 102k]
  ------------------
 2620|  1.84M|            info->bitmaps[j].pos.x -= info->x;
 2621|  1.84M|            info->bitmaps[j].pos.y -= info->y;
 2622|  1.84M|            info->bitmaps[j].pos_o.x -= info->x;
 2623|  1.84M|            info->bitmaps[j].pos_o.y -= info->y;
 2624|  1.84M|        }
 2625|       |
 2626|   102k|        CompositeHashKey key;
 2627|   102k|        key.filter = info->filter;
 2628|   102k|        key.bitmap_count = info->bitmap_count;
 2629|   102k|        key.bitmaps = info->bitmaps;
 2630|   102k|        CompositeHashValue *val = ass_cache_get(render_priv->cache.composite_cache, &key, render_priv);
 2631|   102k|        if (!val)
  ------------------
  |  Branch (2631:13): [True: 0, False: 102k]
  ------------------
 2632|      0|            continue;
 2633|       |
 2634|   102k|        if (val->bm.buffer)
  ------------------
  |  Branch (2634:13): [True: 102k, False: 0]
  ------------------
 2635|   102k|            info->bm = &val->bm;
 2636|   102k|        if (val->bm_o.buffer)
  ------------------
  |  Branch (2636:13): [True: 102k, False: 0]
  ------------------
 2637|   102k|            info->bm_o = &val->bm_o;
 2638|   102k|        if (val->bm_s.buffer)
  ------------------
  |  Branch (2638:13): [True: 102k, False: 0]
  ------------------
 2639|   102k|            info->bm_s = &val->bm_s;
 2640|   102k|        info->image = val;
 2641|   102k|        continue;
 2642|   102k|    }
 2643|       |
 2644|   204k|    text_info->n_bitmaps = nb_bitmaps;
 2645|   204k|}
ass_render.c:quantize_blur:
 2432|   204k|{
 2433|       |    // Gaussian filter kernel (1D):
 2434|       |    // G(x, r2) = exp(-x^2 / (2 * r2)) / sqrt(2 * pi * r2),
 2435|       |    // position unit is 1/64th of pixel, r = 64 * radius, r2 = r^2.
 2436|       |
 2437|       |    // Difference between kernels with different but near r2:
 2438|       |    // G(x, r2 + dr2) - G(x, r2) ~= dr2 * G(x, r2) * (x^2 - r2) / (2 * r2^2).
 2439|       |    // Maximal possible error relative to full pixel value is half of
 2440|       |    // integral (from -inf to +inf) of absolute value of that difference.
 2441|       |    // E_max ~= dr2 / 2 * integral(G(x, r2) * |x^2 - r2| / (2 * r2^2), x)
 2442|       |    //  = dr2 / (4 * r2) * integral(G(y, 1) * |y^2 - 1|, y)
 2443|       |    //  = dr2 / (4 * r2) * 4 / sqrt(2 * pi * e)
 2444|       |    //  ~ dr2 / (4 * r2) ~= dr / (2 * r).
 2445|       |    // E_max ~ BLUR_PRECISION / 2 as we have 2 dimensions.
 2446|       |
 2447|       |    // To get discretized blur radius solve the following
 2448|       |    // differential equation (n--quantization index):
 2449|       |    // dr(n) / dn = BLUR_PRECISION * r + POSITION_PRECISION, r(0) = 0,
 2450|       |    // r(n) = (exp(BLUR_PRECISION * n) - 1) * POSITION_PRECISION / BLUR_PRECISION,
 2451|       |    // n = log(1 + r * BLUR_PRECISION / POSITION_PRECISION) / BLUR_PRECISION.
 2452|       |
 2453|       |    // To get shadow offset quantization estimate difference of
 2454|       |    // G(x + dx, r2) - G(x, r2) ~= dx * G(x, r2) * (-x / r2).
 2455|       |    // E_max ~= dx / 2 * integral(G(x, r2) * |x| / r2, x)
 2456|       |    //  = dx / sqrt(2 * pi * r2) ~ dx / (2 * r).
 2457|       |    // 2^ord ~ dx ~ BLUR_PRECISION * r + POSITION_PRECISION.
 2458|       |
 2459|   204k|    const double scale = 64 * BLUR_PRECISION / POSITION_PRECISION;
  ------------------
  |  |   48|   204k|#define BLUR_PRECISION (1.0 / 256)  // blur error as fraction of full input range
  ------------------
                  const double scale = 64 * BLUR_PRECISION / POSITION_PRECISION;
  ------------------
  |  |   45|   204k|#define POSITION_PRECISION 8.0   // rough estimate of transform error in 1/64 pixel units
  ------------------
 2460|   204k|    radius *= scale;
 2461|       |
 2462|   204k|    int ord;
 2463|       |    // ord = floor(log2(BLUR_PRECISION * r + POSITION_PRECISION))
 2464|       |    //     = floor(log2(64 * radius * BLUR_PRECISION + POSITION_PRECISION))
 2465|       |    //     = floor(log2((radius * scale + 1) * POSITION_PRECISION)),
 2466|       |    // floor(log2(x)) = frexp(x) - 1 = frexp(x / 2).
 2467|   204k|    frexp((1 + radius) * (POSITION_PRECISION / 2), &ord);
  ------------------
  |  |   45|   204k|#define POSITION_PRECISION 8.0   // rough estimate of transform error in 1/64 pixel units
  ------------------
 2468|   204k|    *shadow_mask = ((uint32_t) 1 << ord) - 1;
 2469|   204k|    return lrint(log1p(radius) / BLUR_PRECISION);
  ------------------
  |  |   48|   204k|#define BLUR_PRECISION (1.0 / 256)  // blur error as fraction of full input range
  ------------------
 2470|   204k|}
ass_render.c:get_bitmap_glyph:
 1384|  2.72M|{
 1385|  2.72M|    ASS_Renderer *render_priv = state->renderer;
 1386|       |
 1387|  2.72M|    if (!info->outline || info->symbol == '\n' || info->symbol == 0 || info->skip) {
  ------------------
  |  Branch (1387:9): [True: 64, False: 2.72M]
  |  Branch (1387:27): [True: 0, False: 2.72M]
  |  Branch (1387:51): [True: 0, False: 2.72M]
  |  Branch (1387:72): [True: 0, False: 2.72M]
  ------------------
 1388|     64|        ass_cache_dec_ref(info->outline);
 1389|     64|        return;
 1390|     64|    }
 1391|       |
 1392|  2.72M|    double m1[3][3], m2[3][3], m[3][3];
 1393|  2.72M|    const ASS_Transform *tr = &info->transform;
 1394|  2.72M|    calc_transform_matrix(state, info, m1);
 1395|  10.9M|    for (int i = 0; i < 3; i++) {
  ------------------
  |  Branch (1395:21): [True: 8.18M, False: 2.72M]
  ------------------
 1396|  8.18M|        m2[i][0] = m1[i][0] * tr->scale.x;
 1397|  8.18M|        m2[i][1] = m1[i][1] * tr->scale.y;
 1398|  8.18M|        m2[i][2] = m1[i][0] * tr->offset.x + m1[i][1] * tr->offset.y + m1[i][2];
 1399|  8.18M|    }
 1400|  2.72M|    memcpy(m, m2, sizeof(m));
 1401|       |
 1402|  2.72M|    if (info->effect_type == EF_KARAOKE_KF)
  ------------------
  |  Branch (1402:9): [True: 0, False: 2.72M]
  ------------------
 1403|      0|        ass_outline_update_min_transformed_x(&info->outline->outline[0], m, leftmost_x);
 1404|       |
 1405|  2.72M|    BitmapHashKey key;
 1406|  2.72M|    key.outline = info->outline;
 1407|  2.72M|    if (!quantize_transform(m, pos, offset, first, &key)) {
  ------------------
  |  Branch (1407:9): [True: 884k, False: 1.84M]
  ------------------
 1408|   884k|        ass_cache_dec_ref(info->outline);
 1409|   884k|        return;
 1410|   884k|    }
 1411|  1.84M|    info->bm = ass_cache_get(render_priv->cache.bitmap_cache, &key, state);
 1412|  1.84M|    if (!info->bm || !info->bm->buffer) {
  ------------------
  |  Branch (1412:9): [True: 0, False: 1.84M]
  |  Branch (1412:22): [True: 10, False: 1.84M]
  ------------------
 1413|     10|        ass_cache_dec_ref(info->bm);
 1414|     10|        info->bm = NULL;
 1415|     10|    }
 1416|  1.84M|    *pos_o = *pos;
 1417|       |
 1418|  1.84M|    OutlineHashKey ol_key;
 1419|  1.84M|    if (flags & FILTER_BORDER_STYLE_3) {
  ------------------
  |  Branch (1419:9): [True: 0, False: 1.84M]
  ------------------
 1420|      0|        if (!(flags & (FILTER_NONZERO_BORDER | FILTER_NONZERO_SHADOW)))
  ------------------
  |  Branch (1420:13): [True: 0, False: 0]
  ------------------
 1421|      0|            return;
 1422|       |
 1423|      0|        ol_key.type = OUTLINE_BOX;
 1424|       |
 1425|      0|        ASS_DVector bord = {
 1426|      0|            64 * info->border_x * state->border_scale_x /
 1427|      0|                render_priv->par_scale_x,
 1428|      0|            64 * info->border_y * state->border_scale_y,
 1429|      0|        };
 1430|      0|        double width = info->hspacing_scaled + info->advance.x;
 1431|      0|        double height = info->asc + info->desc;
 1432|       |
 1433|      0|        ASS_DVector orig_scale;
 1434|      0|        orig_scale.x = info->scale_x * info->scale_fix;
 1435|      0|        orig_scale.y = info->scale_y * info->scale_fix;
 1436|       |
 1437|       |        // Emulate the WTFish behavior of VSFilter, i.e. double-scale
 1438|       |        // the sizes of the opaque box.
 1439|      0|        bord.x *= orig_scale.x;
 1440|      0|        bord.y *= orig_scale.y;
 1441|      0|        width  *= orig_scale.x;
 1442|      0|        height *= orig_scale.y;
 1443|       |
 1444|       |        // to avoid gaps
 1445|      0|        bord.x = FFMAX(64, bord.x);
  ------------------
  |  |   46|      0|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1446|      0|        bord.y = FFMAX(64, bord.y);
  ------------------
  |  |   46|      0|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1447|       |
 1448|      0|        ASS_DVector scale = {
 1449|      0|            (width  + 2 * bord.x) / 64,
 1450|      0|            (height + 2 * bord.y) / 64,
 1451|      0|        };
 1452|      0|        ASS_DVector offset = { -bord.x, -bord.y - info->asc };
 1453|      0|        for (int i = 0; i < 3; i++) {
  ------------------
  |  Branch (1453:25): [True: 0, False: 0]
  ------------------
 1454|      0|            m[i][0] = m1[i][0] * scale.x;
 1455|      0|            m[i][1] = m1[i][1] * scale.y;
 1456|      0|            m[i][2] = m1[i][0] * offset.x + m1[i][1] * offset.y + m1[i][2];
 1457|      0|        }
 1458|  1.84M|    } else {
 1459|  1.84M|        if (!(flags & FILTER_NONZERO_BORDER))
  ------------------
  |  Branch (1459:13): [True: 0, False: 1.84M]
  ------------------
 1460|      0|            return;
 1461|       |
 1462|  1.84M|        ol_key.type = OUTLINE_BORDER;
 1463|  1.84M|        BorderHashKey *k = &ol_key.u.border;
 1464|  1.84M|        k->outline = info->outline;
 1465|       |
 1466|  1.84M|        double bord_x =
 1467|  1.84M|            64 * state->border_scale_x * info->border_x / tr->scale.x /
 1468|  1.84M|                render_priv->par_scale_x;
 1469|  1.84M|        double bord_y =
 1470|  1.84M|            64 * state->border_scale_y * info->border_y / tr->scale.y;
 1471|       |
 1472|  1.84M|        const ASS_Rect *bbox = &info->outline->cbox;
 1473|       |        // Estimate bounding box half size after stroking
 1474|  1.84M|        double dx = (bbox->x_max - bbox->x_min) / 2.0 + (bord_x + 64);
 1475|  1.84M|        double dy = (bbox->y_max - bbox->y_min) / 2.0 + (bord_y + 64);
 1476|       |
 1477|       |        // Matrix after quantize_transform() has
 1478|       |        // input and output origin at bounding box center.
 1479|  1.84M|        double mxx = fabs(m[0][0]), mxy = fabs(m[0][1]);
 1480|  1.84M|        double myx = fabs(m[1][0]), myy = fabs(m[1][1]);
 1481|  1.84M|        double mzx = fabs(m[2][0]), mzy = fabs(m[2][1]);
 1482|       |
 1483|  1.84M|        double z0 = m[2][2] - mzx * dx - mzy * dy;
 1484|  1.84M|        double w = 1 / FFMAX(z0, m[2][2] / MAX_PERSP_SCALE);
  ------------------
  |  |   46|  1.84M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 1.84M, False: 0]
  |  |  ------------------
  ------------------
 1485|       |
 1486|       |        // Notation from quantize_transform().
 1487|       |        // Note that goal here is to estimate acceptable error for stroking, i. e. D(x) and D(y).
 1488|       |        // Matrix coefficients are constants now, so D(m_ij) = 0 for all i, j from {x, y, z}.
 1489|       |
 1490|       |        // D(z) <= |m_zx| * D(x) + |m_zy| * D(y),
 1491|       |        // D(x_out) = D((m_xx * x + m_xy * y) / z)
 1492|       |        //  <= (|m_xx| * D(x) + |m_xy| * D(y)) / z0 + x_lim * D(z) / z0^2
 1493|       |        //  <= (|m_xx| / z0 + |m_zx| * x_lim / z0^2) * D(x)
 1494|       |        //   + (|m_xy| / z0 + |m_zy| * x_lim / z0^2) * D(y),
 1495|       |        // D(y_out) = D((m_yx * x + m_yy * y) / z)
 1496|       |        //  <= (|m_yx| * D(x) + |m_yy| * D(y)) / z0 + y_lim * D(z) / z0^2
 1497|       |        //  <= (|m_yx| / z0 + |m_zx| * y_lim / z0^2) * D(x)
 1498|       |        //   + (|m_yy| / z0 + |m_zy| * y_lim / z0^2) * D(y).
 1499|       |
 1500|       |        // Quantization steps (pick: ACCURACY = POSITION_PRECISION):
 1501|       |        // STROKER_PRECISION / 2^scale_ord_x ~ D(x) ~ POSITION_PRECISION /
 1502|       |        //   (max(|m_xx|, |m_yx|) / z0 + |m_zx| * max(x_lim, y_lim) / z0^2),
 1503|       |        // STROKER_PRECISION / 2^scale_ord_y ~ D(y) ~ POSITION_PRECISION /
 1504|       |        //   (max(|m_xy|, |m_yy|) / z0 + |m_zy| * max(x_lim, y_lim) / z0^2).
 1505|       |
 1506|  1.84M|        double x_lim = mxx * dx + mxy * dy;
 1507|  1.84M|        double y_lim = myx * dx + myy * dy;
 1508|  1.84M|        double rz = FFMAX(x_lim, y_lim) * w;
  ------------------
  |  |   46|  1.84M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 1.12M, False: 717k]
  |  |  ------------------
  ------------------
 1509|       |
 1510|  1.84M|        w *= STROKER_PRECISION / POSITION_PRECISION;
  ------------------
  |  |   43|  1.84M|#define STROKER_PRECISION 16     // stroker error in integer units, unrelated to final accuracy
  ------------------
                      w *= STROKER_PRECISION / POSITION_PRECISION;
  ------------------
  |  |   45|  1.84M|#define POSITION_PRECISION 8.0   // rough estimate of transform error in 1/64 pixel units
  ------------------
 1511|  1.84M|        frexp(w * (FFMAX(mxx, myx) + mzx * rz), &k->scale_ord_x);
  ------------------
  |  |   46|  1.84M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 1.84M, False: 0]
  |  |  ------------------
  ------------------
 1512|  1.84M|        frexp(w * (FFMAX(mxy, myy) + mzy * rz), &k->scale_ord_y);
  ------------------
  |  |   46|  1.84M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 0, False: 1.84M]
  |  |  ------------------
  ------------------
 1513|  1.84M|        bord_x = ldexp(bord_x, k->scale_ord_x);
 1514|  1.84M|        bord_y = ldexp(bord_y, k->scale_ord_y);
 1515|  1.84M|        if (!(bord_x < OUTLINE_MAX && bord_y < OUTLINE_MAX))
  ------------------
  |  |   87|  3.68M|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
                      if (!(bord_x < OUTLINE_MAX && bord_y < OUTLINE_MAX))
  ------------------
  |  |   87|  1.84M|#define OUTLINE_MAX  (((int32_t) 1 << 28) - 1)
  ------------------
  |  Branch (1515:15): [True: 1.84M, False: 0]
  |  Branch (1515:39): [True: 1.84M, False: 0]
  ------------------
 1516|      0|            return;
 1517|  1.84M|        k->border.x = lrint(bord_x / STROKER_PRECISION);
  ------------------
  |  |   43|  1.84M|#define STROKER_PRECISION 16     // stroker error in integer units, unrelated to final accuracy
  ------------------
 1518|  1.84M|        k->border.y = lrint(bord_y / STROKER_PRECISION);
  ------------------
  |  |   43|  1.84M|#define STROKER_PRECISION 16     // stroker error in integer units, unrelated to final accuracy
  ------------------
 1519|  1.84M|        if (!k->border.x && !k->border.y) {
  ------------------
  |  Branch (1519:13): [True: 0, False: 1.84M]
  |  Branch (1519:29): [True: 0, False: 0]
  ------------------
 1520|      0|            ass_cache_inc_ref(info->bm);
 1521|      0|            info->bm_o = info->bm;
 1522|      0|            return;
 1523|      0|        }
 1524|       |
 1525|  7.37M|        for (int i = 0; i < 3; i++) {
  ------------------
  |  Branch (1525:25): [True: 5.53M, False: 1.84M]
  ------------------
 1526|  5.53M|            m[i][0] = ldexp(m2[i][0], -k->scale_ord_x);
 1527|  5.53M|            m[i][1] = ldexp(m2[i][1], -k->scale_ord_y);
 1528|  5.53M|            m[i][2] = m2[i][2];
 1529|  5.53M|        }
 1530|  1.84M|    }
 1531|       |
 1532|  1.84M|    key.outline = ass_cache_get(render_priv->cache.outline_cache, &ol_key, render_priv);
 1533|  1.84M|    if (!key.outline || !key.outline->valid ||
  ------------------
  |  Branch (1533:9): [True: 0, False: 1.84M]
  |  Branch (1533:25): [True: 0, False: 1.84M]
  ------------------
 1534|  1.84M|            !quantize_transform(m, pos_o, offset, false, &key)) {
  ------------------
  |  Branch (1534:13): [True: 0, False: 1.84M]
  ------------------
 1535|      0|        ass_cache_dec_ref(key.outline);
 1536|      0|        return;
 1537|      0|    }
 1538|  1.84M|    info->bm_o = ass_cache_get(render_priv->cache.bitmap_cache, &key, state);
 1539|  1.84M|    if (!info->bm_o || !info->bm_o->buffer) {
  ------------------
  |  Branch (1539:9): [True: 0, False: 1.84M]
  |  Branch (1539:24): [True: 10, False: 1.84M]
  ------------------
 1540|     10|        ass_cache_dec_ref(info->bm_o);
 1541|     10|        info->bm_o = NULL;
 1542|     10|        *pos_o = *pos;
 1543|  1.84M|    } else if (!info->bm)
  ------------------
  |  Branch (1543:16): [True: 0, False: 1.84M]
  ------------------
 1544|      0|        *pos = *pos_o;
 1545|  1.84M|}
ass_render.c:calc_transform_matrix:
 1324|  2.72M|{
 1325|  2.72M|    ASS_Renderer *render_priv = state->renderer;
 1326|       |
 1327|  2.72M|    double frx = ASS_PI / 180 * info->frx;
  ------------------
  |  |   50|  2.72M|#define ASS_PI 3.14159265358979323846
  ------------------
 1328|  2.72M|    double fry = ASS_PI / 180 * info->fry;
  ------------------
  |  |   50|  2.72M|#define ASS_PI 3.14159265358979323846
  ------------------
 1329|  2.72M|    double frz = ASS_PI / 180 * info->frz;
  ------------------
  |  |   50|  2.72M|#define ASS_PI 3.14159265358979323846
  ------------------
 1330|       |
 1331|  2.72M|    double sx = -sin(frx), cx = cos(frx);
 1332|  2.72M|    double sy =  sin(fry), cy = cos(fry);
 1333|  2.72M|    double sz = -sin(frz), cz = cos(frz);
 1334|       |
 1335|  2.72M|    double fax = info->fax * info->scale_x / info->scale_y;
 1336|  2.72M|    double fay = info->fay * info->scale_y / info->scale_x;
 1337|  2.72M|    double x1[3] = { 1, fax, info->shift.x + info->asc * fax };
 1338|  2.72M|    double y1[3] = { fay, 1, info->shift.y };
 1339|       |
 1340|  2.72M|    double x2[3], y2[3];
 1341|  10.9M|    for (int i = 0; i < 3; i++) {
  ------------------
  |  Branch (1341:21): [True: 8.18M, False: 2.72M]
  ------------------
 1342|  8.18M|        x2[i] = x1[i] * cz - y1[i] * sz;
 1343|  8.18M|        y2[i] = x1[i] * sz + y1[i] * cz;
 1344|  8.18M|    }
 1345|       |
 1346|  2.72M|    double y3[3], z3[3];
 1347|  10.9M|    for (int i = 0; i < 3; i++) {
  ------------------
  |  Branch (1347:21): [True: 8.18M, False: 2.72M]
  ------------------
 1348|  8.18M|        y3[i] = y2[i] * cx;
 1349|  8.18M|        z3[i] = y2[i] * sx;
 1350|  8.18M|    }
 1351|       |
 1352|  2.72M|    double x4[3], z4[3];
 1353|  10.9M|    for (int i = 0; i < 3; i++) {
  ------------------
  |  Branch (1353:21): [True: 8.18M, False: 2.72M]
  ------------------
 1354|  8.18M|        x4[i] = x2[i] * cy - z3[i] * sy;
 1355|  8.18M|        z4[i] = x2[i] * sy + z3[i] * cy;
 1356|  8.18M|    }
 1357|       |
 1358|  2.72M|    double dist = 20000 * state->blur_scale_y;
 1359|  2.72M|    z4[2] += dist;
 1360|       |
 1361|  2.72M|    double scale_x = dist * render_priv->par_scale_x;
 1362|  2.72M|    double offs_x = info->pos.x - info->shift.x * render_priv->par_scale_x;
 1363|  2.72M|    double offs_y = info->pos.y - info->shift.y;
 1364|  10.9M|    for (int i = 0; i < 3; i++) {
  ------------------
  |  Branch (1364:21): [True: 8.18M, False: 2.72M]
  ------------------
 1365|  8.18M|        m[0][i] = z4[i] * offs_x + x4[i] * scale_x;
 1366|  8.18M|        m[1][i] = z4[i] * offs_y + y3[i] * dist;
 1367|  8.18M|        m[2][i] = z4[i];
 1368|  8.18M|    }
 1369|  2.72M|}
ass_render.c:quantize_transform:
  486|  4.57M|{
  487|       |    // Full transform:
  488|       |    // x_out = (m_xx * x + m_xy * y + m_xz) / z,
  489|       |    // y_out = (m_yx * x + m_yy * y + m_yz) / z,
  490|       |    // z     =  m_zx * x + m_zy * y + m_zz.
  491|       |
  492|  4.57M|    const double max_val = 1000000;
  493|       |
  494|  4.57M|    const ASS_Rect *bbox = &key->outline->cbox;
  495|  4.57M|    double x0 = (bbox->x_min + bbox->x_max) / 2.0;
  496|  4.57M|    double y0 = (bbox->y_min + bbox->y_max) / 2.0;
  497|  4.57M|    double dx = (bbox->x_max - bbox->x_min) / 2.0 + 64;
  498|  4.57M|    double dy = (bbox->y_max - bbox->y_min) / 2.0 + 64;
  499|       |
  500|       |    // Change input coordinates' origin to (x0, y0),
  501|       |    // after that transformation x:[-dx, dx], y:[-dy, dy],
  502|       |    // max|x| = dx and max|y| = dy.
  503|  18.2M|    for (int i = 0; i < 3; i++)
  ------------------
  |  Branch (503:21): [True: 13.7M, False: 4.57M]
  ------------------
  504|  13.7M|        m[i][2] += m[i][0] * x0 + m[i][1] * y0;
  505|       |
  506|  4.57M|    if (m[2][2] <= 0)
  ------------------
  |  Branch (506:9): [True: 0, False: 4.57M]
  ------------------
  507|      0|        return false;
  508|       |
  509|  4.57M|    double w = 1 / m[2][2];
  510|       |    // Transformed center of bounding box
  511|  4.57M|    double center[2] = { m[0][2] * w, m[1][2] * w };
  512|       |    // Change output coordinates' origin to center,
  513|       |    // m_xz and m_yz is skipped as it becomes 0 and no longer needed.
  514|  13.7M|    for (int i = 0; i < 2; i++)
  ------------------
  |  Branch (514:21): [True: 9.14M, False: 4.57M]
  ------------------
  515|  27.4M|        for (int j = 0; j < 2; j++)
  ------------------
  |  Branch (515:25): [True: 18.2M, False: 9.14M]
  ------------------
  516|  18.2M|            m[i][j] -= m[2][j] * center[i];
  517|       |
  518|  4.57M|    double delta[2] = {0};
  519|  4.57M|    if (!first) {
  ------------------
  |  Branch (519:9): [True: 3.96M, False: 606k]
  ------------------
  520|  3.96M|        delta[0] = offset->x;
  521|  3.96M|        delta[1] = offset->y;
  522|  3.96M|    }
  523|       |
  524|  4.57M|    int32_t qr[2];  // quantized center position
  525|  11.9M|    for (int i = 0; i < 2; i++) {
  ------------------
  |  Branch (525:21): [True: 8.25M, False: 3.68M]
  ------------------
  526|  8.25M|        center[i] /= 64 >> SUBPIXEL_ORDER;
  ------------------
  |  |   47|  8.25M|#define SUBPIXEL_ORDER 3  // ~ log2(64 / POSITION_PRECISION)
  ------------------
  527|  8.25M|        center[i] -= delta[i];
  528|  8.25M|        if (!(fabs(center[i]) < max_val))
  ------------------
  |  Branch (528:13): [True: 884k, False: 7.37M]
  ------------------
  529|   884k|            return false;
  530|  7.37M|        qr[i] = lrint(center[i]);
  531|  7.37M|    }
  532|       |
  533|       |    // Minimal bounding box z coordinate
  534|  3.68M|    double z0 = m[2][2] - fabs(m[2][0]) * dx - fabs(m[2][1]) * dy;
  535|       |    // z0 clamped to z_center / MAX_PERSP_SCALE to mitigate problems with small z
  536|  3.68M|    w = 1.0 / POSITION_PRECISION / FFMAX(z0, m[2][2] / MAX_PERSP_SCALE);
  ------------------
  |  |   45|  3.68M|#define POSITION_PRECISION 8.0   // rough estimate of transform error in 1/64 pixel units
  ------------------
                  w = 1.0 / POSITION_PRECISION / FFMAX(z0, m[2][2] / MAX_PERSP_SCALE);
  ------------------
  |  |   46|  3.68M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 3.68M, False: 0]
  |  |  ------------------
  ------------------
  537|  3.68M|    double mul[2] = { dx * w, dy * w };  // 1 / q_x, 1 / q_y
  538|       |
  539|       |    // z0 = m_zz - |m_zx| * dx - |m_zy| * dy,
  540|       |    // m_zz = z0 + |m_zx| * dx + |m_zy| * dy,
  541|       |    // z = m_zx * x + m_zy * y + m_zz
  542|       |    //  = m_zx * (x + sign(m_zx) * dx) + m_zy * (y + sign(m_zy) * dy) + z0.
  543|       |
  544|       |    // Let D(f) denote the absolute error of a quantity f.
  545|       |    // Our goal is to determine tolerable error for matrix coefficients,
  546|       |    // so that the total error of the output x_out, y_out is still acceptable.
  547|       |    // As glyph dimensions are usually larger than a couple of pixels, errors
  548|       |    // will be relatively small and we can use first order approximation.
  549|       |
  550|       |    // z0 is effectively a scale factor and can thus be treated as a constant.
  551|       |    // Error of constants is obviously zero, so:  D(dx) = D(dy) = D(z0) = 0.
  552|       |    // For arbitrary quantities A, B, C with C not zero, the following holds true:
  553|       |    //   D(A * B) <= D(A) * max|B| + max|A| * D(B),
  554|       |    //   D(1 / C) <= D(C) * max|1 / C^2|.
  555|       |    // Write ~ for 'same magnitude' and ~= for 'approximately'.
  556|       |
  557|       |    // D(x_out) = D((m_xx * x + m_xy * y) / z)
  558|       |    //  <= D(m_xx * x + m_xy * y) * max|1 / z| + max|m_xx * x + m_xy * y| * D(1 / z)
  559|       |    //  <= (D(m_xx) * dx + D(m_xy) * dy) / z0 + (|m_xx| * dx + |m_xy| * dy) * D(z) / z0^2,
  560|       |    // D(y_out) = D((m_yx * x + m_yy * y) / z)
  561|       |    //  <= D(m_yx * x + m_yy * y) * max|1 / z| + max|m_yx * x + m_yy * y| * D(1 / z)
  562|       |    //  <= (D(m_yx) * dx + D(m_yy) * dy) / z0 + (|m_yx| * dx + |m_yy| * dy) * D(z) / z0^2,
  563|       |    // |m_xx| * dx + |m_xy| * dy = x_lim,
  564|       |    // |m_yx| * dx + |m_yy| * dy = y_lim,
  565|       |    // D(z) <= 2 * (D(m_zx) * dx + D(m_zy) * dy),
  566|       |    // D(x_out) <= (D(m_xx) * dx + D(m_xy) * dy) / z0
  567|       |    //       + 2 * (D(m_zx) * dx + D(m_zy) * dy) * x_lim / z0^2,
  568|       |    // D(y_out) <= (D(m_yx) * dx + D(m_yy) * dy) / z0
  569|       |    //       + 2 * (D(m_zx) * dx + D(m_zy) * dy) * y_lim / z0^2.
  570|       |
  571|       |    // To estimate acceptable error in a matrix coefficient, pick ACCURACY for this substep,
  572|       |    // set error in all other coefficients to zero and solve the system
  573|       |    // D(x_out) <= ACCURACY, D(y_out) <= ACCURACY for desired D(m_ij).
  574|       |    // Note that ACCURACY isn't equal to total error.
  575|       |    // Total error is larger than each ACCURACY, but still of the same magnitude.
  576|       |    // Via our choice of ACCURACY, we get a total error of up to several POSITION_PRECISION.
  577|       |
  578|       |    // Quantization steps (pick: ACCURARY = POSITION_PRECISION):
  579|       |    // D(m_xx), D(m_yx) ~ q_x = POSITION_PRECISION * z0 / dx,
  580|       |    // D(m_xy), D(m_yy) ~ q_y = POSITION_PRECISION * z0 / dy,
  581|       |    // qm_xx = round(m_xx / q_x), qm_xy = round(m_xy / q_y),
  582|       |    // qm_yx = round(m_yx / q_x), qm_yy = round(m_yy / q_y).
  583|       |
  584|  3.68M|    int32_t qm[3][2];
  585|  11.0M|    for (int i = 0; i < 2; i++)
  ------------------
  |  Branch (585:21): [True: 7.37M, False: 3.68M]
  ------------------
  586|  22.1M|        for (int j = 0; j < 2; j++) {
  ------------------
  |  Branch (586:25): [True: 14.7M, False: 7.37M]
  ------------------
  587|  14.7M|            double val = m[i][j] * mul[j];
  588|  14.7M|            if (!(fabs(val) < max_val))
  ------------------
  |  Branch (588:17): [True: 0, False: 14.7M]
  ------------------
  589|      0|                return false;
  590|  14.7M|            qm[i][j] = lrint(val);
  591|  14.7M|        }
  592|       |
  593|       |    // x_lim = |m_xx| * dx + |m_xy| * dy
  594|       |    //  ~= |qm_xx| * q_x * dx + |qm_xy| * q_y * dy
  595|       |    //  = (|qm_xx| + |qm_xy|) * POSITION_PRECISION * z0,
  596|       |    // y_lim = |m_yx| * dx + |m_yy| * dy
  597|       |    //  ~= |qm_yx| * q_x * dx + |qm_yy| * q_y * dy
  598|       |    //  = (|qm_yx| + |qm_yy|) * POSITION_PRECISION * z0,
  599|       |    // max(x_lim, y_lim) / z0 ~= w
  600|       |    //  = max(|qm_xx| + |qm_xy|, |qm_yx| + |qm_yy|) * POSITION_PRECISION.
  601|       |
  602|       |    // Quantization steps (pick: ACCURACY = 2 * POSITION_PRECISION):
  603|       |    // D(m_zx) ~ POSITION_PRECISION * z0^2 / max(x_lim, y_lim) / dx ~= q_zx = q_x / w,
  604|       |    // D(m_zy) ~ POSITION_PRECISION * z0^2 / max(x_lim, y_lim) / dy ~= q_zy = q_y / w,
  605|       |    // qm_zx = round(m_zx / q_zx), qm_zy = round(m_zy / q_zy).
  606|       |
  607|  3.68M|    int32_t qmx = abs(qm[0][0]) + abs(qm[0][1]);
  608|  3.68M|    int32_t qmy = abs(qm[1][0]) + abs(qm[1][1]);
  609|  3.68M|    w = POSITION_PRECISION * FFMAX(qmx, qmy);
  ------------------
  |  |   45|  3.68M|#define POSITION_PRECISION 8.0   // rough estimate of transform error in 1/64 pixel units
  ------------------
                  w = POSITION_PRECISION * FFMAX(qmx, qmy);
  ------------------
  |  |   46|  3.68M|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 1.22M, False: 2.45M]
  |  |  ------------------
  ------------------
  610|  3.68M|    mul[0] *= w;
  611|  3.68M|    mul[1] *= w;
  612|       |
  613|  11.0M|    for (int j = 0; j < 2; j++) {
  ------------------
  |  Branch (613:21): [True: 7.37M, False: 3.68M]
  ------------------
  614|  7.37M|        double val = m[2][j] * mul[j];
  615|  7.37M|        if (!(fabs(val) < max_val))
  ------------------
  |  Branch (615:13): [True: 0, False: 7.37M]
  ------------------
  616|      0|            return false;
  617|  7.37M|        qm[2][j] = lrint(val);
  618|  7.37M|    }
  619|       |
  620|  3.68M|    if (first && offset) {
  ------------------
  |  Branch (620:9): [True: 102k, False: 3.58M]
  |  Branch (620:18): [True: 102k, False: 0]
  ------------------
  621|   102k|        offset->x = center[0] - qr[0];
  622|   102k|        offset->y = center[1] - qr[1];
  623|   102k|    }
  624|  3.68M|    *pos = (ASS_Vector) {
  625|  3.68M|        .x = qr[0] >> SUBPIXEL_ORDER,
  ------------------
  |  |   47|  3.68M|#define SUBPIXEL_ORDER 3  // ~ log2(64 / POSITION_PRECISION)
  ------------------
  626|  3.68M|        .y = qr[1] >> SUBPIXEL_ORDER,
  ------------------
  |  |   47|  3.68M|#define SUBPIXEL_ORDER 3  // ~ log2(64 / POSITION_PRECISION)
  ------------------
  627|  3.68M|    };
  628|  3.68M|    key->offset.x = qr[0] & ((1 << SUBPIXEL_ORDER) - 1);
  ------------------
  |  |   47|  3.68M|#define SUBPIXEL_ORDER 3  // ~ log2(64 / POSITION_PRECISION)
  ------------------
  629|  3.68M|    key->offset.y = qr[1] & ((1 << SUBPIXEL_ORDER) - 1);
  ------------------
  |  |   47|  3.68M|#define SUBPIXEL_ORDER 3  // ~ log2(64 / POSITION_PRECISION)
  ------------------
  630|  3.68M|    key->matrix_x.x = qm[0][0];  key->matrix_x.y = qm[0][1];
  631|  3.68M|    key->matrix_y.x = qm[1][0];  key->matrix_y.y = qm[1][1];
  632|  3.68M|    key->matrix_z.x = qm[2][0];  key->matrix_z.y = qm[2][1];
  633|  3.68M|    return true;
  634|  3.68M|}
ass_render.c:render_text:
  809|   204k|{
  810|   204k|    ASS_Image *head;
  811|   204k|    ASS_Image **tail = &head;
  812|   204k|    unsigned n_bitmaps = state->text_info->n_bitmaps;
  813|   204k|    CombinedBitmapInfo *bitmaps = state->text_info->combined_bitmaps;
  814|       |
  815|   307k|    for (unsigned i = 0; i < n_bitmaps; i++) {
  ------------------
  |  Branch (815:26): [True: 102k, False: 204k]
  ------------------
  816|   102k|        CombinedBitmapInfo *info = &bitmaps[i];
  817|   102k|        if (!info->bm_s || state->border_style == 4)
  ------------------
  |  Branch (817:13): [True: 8, False: 102k]
  |  Branch (817:28): [True: 0, False: 102k]
  ------------------
  818|      8|            continue;
  819|       |
  820|   102k|        tail =
  821|   102k|            render_glyph(state, info->bm_s, info->x, info->y, info->c[3], 0,
  822|   102k|                         1000000, tail, IMAGE_TYPE_SHADOW, info->image);
  823|   102k|    }
  824|       |
  825|   307k|    for (unsigned i = 0; i < n_bitmaps; i++) {
  ------------------
  |  Branch (825:26): [True: 102k, False: 204k]
  ------------------
  826|   102k|        CombinedBitmapInfo *info = &bitmaps[i];
  827|   102k|        if (!info->bm_o)
  ------------------
  |  Branch (827:13): [True: 8, False: 102k]
  ------------------
  828|      8|            continue;
  829|       |
  830|   102k|        if ((info->effect_type == EF_KARAOKE_KO)
  ------------------
  |  Branch (830:13): [True: 0, False: 102k]
  ------------------
  831|   102k|                && (info->effect_timing <= 0)) {
  ------------------
  |  Branch (831:20): [True: 0, False: 0]
  ------------------
  832|       |            // do nothing
  833|   102k|        } else {
  834|   102k|            tail =
  835|   102k|                render_glyph(state, info->bm_o, info->x, info->y, info->c[2],
  836|   102k|                             0, 1000000, tail, IMAGE_TYPE_OUTLINE, info->image);
  837|   102k|        }
  838|   102k|    }
  839|       |
  840|   307k|    for (unsigned i = 0; i < n_bitmaps; i++) {
  ------------------
  |  Branch (840:26): [True: 102k, False: 204k]
  ------------------
  841|   102k|        CombinedBitmapInfo *info = &bitmaps[i];
  842|   102k|        if (!info->bm)
  ------------------
  |  Branch (842:13): [True: 8, False: 102k]
  ------------------
  843|      8|            continue;
  844|       |
  845|   102k|        if ((info->effect_type == EF_KARAOKE)
  ------------------
  |  Branch (845:13): [True: 0, False: 102k]
  ------------------
  846|   102k|                || (info->effect_type == EF_KARAOKE_KO)) {
  ------------------
  |  Branch (846:20): [True: 0, False: 102k]
  ------------------
  847|      0|            if (info->effect_timing > 0)
  ------------------
  |  Branch (847:17): [True: 0, False: 0]
  ------------------
  848|      0|                tail =
  849|      0|                    render_glyph(state, info->bm, info->x, info->y,
  850|      0|                                 info->c[0], 0, 1000000, tail,
  851|      0|                                 IMAGE_TYPE_CHARACTER, info->image);
  852|      0|            else
  853|      0|                tail =
  854|      0|                    render_glyph(state, info->bm, info->x, info->y,
  855|      0|                                 info->c[1], 0, 1000000, tail,
  856|      0|                                 IMAGE_TYPE_CHARACTER, info->image);
  857|   102k|        } else if (info->effect_type == EF_KARAOKE_KF) {
  ------------------
  |  Branch (857:20): [True: 0, False: 102k]
  ------------------
  858|      0|            tail =
  859|      0|                render_glyph(state, info->bm, info->x, info->y, info->c[0],
  860|      0|                             info->c[1], info->effect_timing, tail,
  861|      0|                             IMAGE_TYPE_CHARACTER, info->image);
  862|      0|        } else
  863|   102k|            tail =
  864|   102k|                render_glyph(state, info->bm, info->x, info->y, info->c[0],
  865|   102k|                             0, 1000000, tail, IMAGE_TYPE_CHARACTER, info->image);
  866|   102k|    }
  867|       |
  868|   307k|    for (unsigned i = 0; i < n_bitmaps; i++)
  ------------------
  |  Branch (868:26): [True: 102k, False: 204k]
  ------------------
  869|   102k|        ass_cache_dec_ref(bitmaps[i].image);
  870|       |
  871|   204k|    *tail = 0;
  872|   204k|    blend_vector_clip(state, head);
  873|       |
  874|   204k|    return head;
  875|   204k|}
ass_render.c:render_glyph:
  413|   307k|{
  414|       |    // Inverse clipping in use?
  415|   307k|    if (state->clip_mode)
  ------------------
  |  Branch (415:9): [True: 0, False: 307k]
  ------------------
  416|      0|        return render_glyph_i(state, bm, dst_x, dst_y, color, color2,
  417|      0|                              brk, tail, type, source);
  418|       |
  419|       |    // brk is absolute
  420|       |    // color = color left of brk
  421|       |    // color2 = color right of brk
  422|   307k|    int b_x0, b_y0, b_x1, b_y1; // visible part of the bitmap
  423|   307k|    int clip_x0, clip_y0, clip_x1, clip_y1;
  424|   307k|    int tmp;
  425|   307k|    ASS_Image *img;
  426|   307k|    ASS_Renderer *render_priv = state->renderer;
  427|       |
  428|   307k|    dst_x += bm->left;
  429|   307k|    dst_y += bm->top;
  430|   307k|    brk -= dst_x;
  431|       |
  432|       |    // clipping
  433|   307k|    clip_x0 = FFMINMAX(state->clip_x0, 0, render_priv->width);
  ------------------
  |  |   48|   307k|#define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
  |  |  ------------------
  |  |  |  |   47|   614k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (47:21): [True: 0, False: 307k]
  |  |  |  |  |  Branch (47:22): [True: 0, False: 307k]
  |  |  |  |  |  Branch (47:40): [True: 0, False: 307k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  434|   307k|    clip_y0 = FFMINMAX(state->clip_y0, 0, render_priv->height);
  ------------------
  |  |   48|   307k|#define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
  |  |  ------------------
  |  |  |  |   47|   614k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (47:21): [True: 0, False: 307k]
  |  |  |  |  |  Branch (47:22): [True: 0, False: 307k]
  |  |  |  |  |  Branch (47:40): [True: 0, False: 307k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  435|   307k|    clip_x1 = FFMINMAX(state->clip_x1, 0, render_priv->width);
  ------------------
  |  |   48|   307k|#define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
  |  |  ------------------
  |  |  |  |   47|   614k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (47:21): [True: 0, False: 307k]
  |  |  |  |  |  Branch (47:22): [True: 307k, False: 0]
  |  |  |  |  |  Branch (47:40): [True: 307k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  436|   307k|    clip_y1 = FFMINMAX(state->clip_y1, 0, render_priv->height);
  ------------------
  |  |   48|   307k|#define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
  |  |  ------------------
  |  |  |  |   47|   614k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (47:21): [True: 0, False: 307k]
  |  |  |  |  |  Branch (47:22): [True: 307k, False: 0]
  |  |  |  |  |  Branch (47:40): [True: 307k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  437|   307k|    b_x0 = 0;
  438|   307k|    b_y0 = 0;
  439|   307k|    b_x1 = bm->w;
  440|   307k|    b_y1 = bm->h;
  441|       |
  442|   307k|    tmp = dst_x - clip_x0;
  443|   307k|    if (tmp < 0)
  ------------------
  |  Branch (443:9): [True: 192, False: 307k]
  ------------------
  444|    192|        b_x0 = -tmp;
  445|   307k|    tmp = dst_y - clip_y0;
  446|   307k|    if (tmp < 0)
  ------------------
  |  Branch (446:9): [True: 156, False: 307k]
  ------------------
  447|    156|        b_y0 = -tmp;
  448|   307k|    tmp = clip_x1 - dst_x - bm->w;
  449|   307k|    if (tmp < 0)
  ------------------
  |  Branch (449:9): [True: 36, False: 307k]
  ------------------
  450|     36|        b_x1 = bm->w + tmp;
  451|   307k|    tmp = clip_y1 - dst_y - bm->h;
  452|   307k|    if (tmp < 0)
  ------------------
  |  Branch (452:9): [True: 0, False: 307k]
  ------------------
  453|      0|        b_y1 = bm->h + tmp;
  454|       |
  455|   307k|    if ((b_y0 >= b_y1) || (b_x0 >= b_x1))
  ------------------
  |  Branch (455:9): [True: 0, False: 307k]
  |  Branch (455:27): [True: 0, False: 307k]
  ------------------
  456|      0|        return tail;
  457|       |
  458|   307k|    if (brk > b_x0) {           // draw left part
  ------------------
  |  Branch (458:9): [True: 307k, False: 0]
  ------------------
  459|   307k|        if (brk > b_x1)
  ------------------
  |  Branch (459:13): [True: 307k, False: 0]
  ------------------
  460|   307k|            brk = b_x1;
  461|   307k|        img = my_draw_bitmap(bm->buffer + bm->stride * b_y0 + b_x0,
  462|   307k|                             brk - b_x0, b_y1 - b_y0, bm->stride,
  463|   307k|                             dst_x + b_x0, dst_y + b_y0, color, source);
  464|   307k|        if (!img) return tail;
  ------------------
  |  Branch (464:13): [True: 0, False: 307k]
  ------------------
  465|   307k|        img->type = type;
  466|   307k|        *tail = img;
  467|   307k|        tail = &img->next;
  468|   307k|    }
  469|   307k|    if (brk < b_x1) {           // draw right part
  ------------------
  |  Branch (469:9): [True: 0, False: 307k]
  ------------------
  470|      0|        if (brk < b_x0)
  ------------------
  |  Branch (470:13): [True: 0, False: 0]
  ------------------
  471|      0|            brk = b_x0;
  472|      0|        img = my_draw_bitmap(bm->buffer + bm->stride * b_y0 + brk,
  473|      0|                             b_x1 - brk, b_y1 - b_y0, bm->stride,
  474|      0|                             dst_x + brk, dst_y + b_y0, color2, source);
  475|      0|        if (!img) return tail;
  ------------------
  |  Branch (475:13): [True: 0, False: 0]
  ------------------
  476|      0|        img->type = type;
  477|      0|        *tail = img;
  478|      0|        tail = &img->next;
  479|      0|    }
  480|   307k|    return tail;
  481|   307k|}
ass_render.c:my_draw_bitmap:
  199|   307k|{
  200|   307k|    ASS_ImagePriv *img = malloc(sizeof(ASS_ImagePriv));
  201|   307k|    if (!img) {
  ------------------
  |  Branch (201:9): [True: 0, False: 307k]
  ------------------
  202|      0|        if (!source)
  ------------------
  |  Branch (202:13): [True: 0, False: 0]
  ------------------
  203|      0|            ass_aligned_free(bitmap);
  204|      0|        return NULL;
  205|      0|    }
  206|       |
  207|   307k|    img->result.w = bitmap_w;
  208|   307k|    img->result.h = bitmap_h;
  209|   307k|    img->result.stride = stride;
  210|   307k|    img->result.bitmap = bitmap;
  211|   307k|    img->result.color = color;
  212|   307k|    img->result.dst_x = dst_x;
  213|   307k|    img->result.dst_y = dst_y;
  214|       |
  215|   307k|    img->source = source;
  216|   307k|    ass_cache_inc_ref(source);
  217|   307k|    img->buffer = source ? NULL : bitmap;
  ------------------
  |  Branch (217:19): [True: 307k, False: 0]
  ------------------
  218|   307k|    img->ref_count = 0;
  219|       |
  220|   307k|    return &img->result;
  221|   307k|}
ass_render.c:blend_vector_clip:
  686|   204k|{
  687|   204k|    if (!state->clip_drawing_text.str)
  ------------------
  |  Branch (687:9): [True: 204k, False: 0]
  ------------------
  688|   204k|        return;
  689|       |
  690|      0|    ASS_Renderer *render_priv = state->renderer;
  691|       |
  692|      0|    OutlineHashKey ol_key;
  693|      0|    ol_key.type = OUTLINE_DRAWING;
  694|      0|    ol_key.u.drawing.text = state->clip_drawing_text;
  695|       |
  696|      0|    double m[3][3] = {{0}};
  697|      0|    int32_t scale_base = lshiftwrapi(1, state->clip_drawing_scale - 1);
  698|      0|    double w = scale_base > 0 ? (1.0 / scale_base) : 0;
  ------------------
  |  Branch (698:16): [True: 0, False: 0]
  ------------------
  699|      0|    m[0][0] = state->screen_scale_x * w;
  700|      0|    m[1][1] = state->screen_scale_y * w;
  701|      0|    m[2][2] = 1;
  702|       |
  703|      0|    m[0][2] = int_to_d6(render_priv->settings.left_margin);
  704|      0|    m[1][2] = int_to_d6(render_priv->settings.top_margin);
  705|       |
  706|      0|    ASS_Vector pos;
  707|      0|    BitmapHashKey key;
  708|      0|    key.outline = ass_cache_get(render_priv->cache.outline_cache, &ol_key, render_priv);
  709|      0|    if (!key.outline || !key.outline->valid ||
  ------------------
  |  Branch (709:9): [True: 0, False: 0]
  |  Branch (709:25): [True: 0, False: 0]
  ------------------
  710|      0|            !quantize_transform(m, &pos, NULL, true, &key)) {
  ------------------
  |  Branch (710:13): [True: 0, False: 0]
  ------------------
  711|      0|        ass_cache_dec_ref(key.outline);
  712|      0|        return;
  713|      0|    }
  714|      0|    Bitmap *clip_bm = ass_cache_get(render_priv->cache.bitmap_cache, &key, state);
  715|      0|    if (!clip_bm)
  ------------------
  |  Branch (715:9): [True: 0, False: 0]
  ------------------
  716|      0|        return;
  717|       |
  718|       |    // Iterate through bitmaps and blend/clip them
  719|      0|    for (ASS_Image *cur = head; cur; cur = cur->next) {
  ------------------
  |  Branch (719:33): [True: 0, False: 0]
  ------------------
  720|      0|        int left, top, right, bottom, w, h;
  721|      0|        int ax, ay, aw, ah, as;
  722|      0|        int bx, by, bw, bh, bs;
  723|      0|        int aleft, atop, bleft, btop;
  724|      0|        unsigned char *abuffer, *bbuffer, *nbuffer;
  725|       |
  726|      0|        abuffer = cur->bitmap;
  727|      0|        bbuffer = clip_bm->buffer;
  728|      0|        ax = cur->dst_x;
  729|      0|        ay = cur->dst_y;
  730|      0|        aw = cur->w;
  731|      0|        ah = cur->h;
  732|      0|        as = cur->stride;
  733|      0|        bx = pos.x + clip_bm->left;
  734|      0|        by = pos.y + clip_bm->top;
  735|      0|        bw = clip_bm->w;
  736|      0|        bh = clip_bm->h;
  737|      0|        bs = clip_bm->stride;
  738|       |
  739|       |        // Calculate overlap coordinates
  740|      0|        left = (ax > bx) ? ax : bx;
  ------------------
  |  Branch (740:16): [True: 0, False: 0]
  ------------------
  741|      0|        top = (ay > by) ? ay : by;
  ------------------
  |  Branch (741:15): [True: 0, False: 0]
  ------------------
  742|      0|        right = ((ax + aw) < (bx + bw)) ? (ax + aw) : (bx + bw);
  ------------------
  |  Branch (742:17): [True: 0, False: 0]
  ------------------
  743|      0|        bottom = ((ay + ah) < (by + bh)) ? (ay + ah) : (by + bh);
  ------------------
  |  Branch (743:18): [True: 0, False: 0]
  ------------------
  744|      0|        aleft = left - ax;
  745|      0|        atop = top - ay;
  746|      0|        w = right - left;
  747|      0|        h = bottom - top;
  748|      0|        bleft = left - bx;
  749|      0|        btop = top - by;
  750|       |
  751|      0|        unsigned align = 1 << render_priv->engine.align_order;
  752|      0|        if (state->clip_drawing_mode) {
  ------------------
  |  Branch (752:13): [True: 0, False: 0]
  ------------------
  753|       |            // Inverse clip
  754|      0|            if (ax + aw < bx || ay + ah < by || ax > bx + bw ||
  ------------------
  |  Branch (754:17): [True: 0, False: 0]
  |  Branch (754:33): [True: 0, False: 0]
  |  Branch (754:49): [True: 0, False: 0]
  ------------------
  755|      0|                ay > by + bh || !h || !w) {
  ------------------
  |  Branch (755:17): [True: 0, False: 0]
  |  Branch (755:33): [True: 0, False: 0]
  |  Branch (755:39): [True: 0, False: 0]
  ------------------
  756|      0|                continue;
  757|      0|            }
  758|       |
  759|       |            // Allocate new buffer and add to free list
  760|      0|            nbuffer = ass_aligned_alloc(align, as * ah + align, false);
  761|      0|            if (!nbuffer)
  ------------------
  |  Branch (761:17): [True: 0, False: 0]
  ------------------
  762|      0|                break;
  763|       |
  764|       |            // Blend together
  765|      0|            memcpy(nbuffer, abuffer, ((ah - 1) * as) + aw);
  766|      0|            render_priv->engine.imul_bitmaps(nbuffer + atop * as + aleft, as,
  767|      0|                                             bbuffer + btop * bs + bleft, bs,
  768|      0|                                             w, h);
  769|      0|        } else {
  770|       |            // Regular clip
  771|      0|            if (ax + aw < bx || ay + ah < by || ax > bx + bw ||
  ------------------
  |  Branch (771:17): [True: 0, False: 0]
  |  Branch (771:33): [True: 0, False: 0]
  |  Branch (771:49): [True: 0, False: 0]
  ------------------
  772|      0|                ay > by + bh || !h || !w) {
  ------------------
  |  Branch (772:17): [True: 0, False: 0]
  |  Branch (772:33): [True: 0, False: 0]
  |  Branch (772:39): [True: 0, False: 0]
  ------------------
  773|      0|                cur->w = cur->h = cur->stride = 0;
  774|      0|                continue;
  775|      0|            }
  776|       |
  777|       |            // Allocate new buffer and add to free list
  778|      0|            unsigned ns = ass_align(align, w);
  779|      0|            nbuffer = ass_aligned_alloc(align, ns * h + align, false);
  780|      0|            if (!nbuffer)
  ------------------
  |  Branch (780:17): [True: 0, False: 0]
  ------------------
  781|      0|                break;
  782|       |
  783|       |            // Blend together
  784|      0|            render_priv->engine.mul_bitmaps(nbuffer, ns,
  785|      0|                                            abuffer + atop * as + aleft, as,
  786|      0|                                            bbuffer + btop * bs + bleft, bs,
  787|      0|                                            w, h);
  788|      0|            cur->dst_x += aleft;
  789|      0|            cur->dst_y += atop;
  790|      0|            cur->w = w;
  791|      0|            cur->h = h;
  792|      0|            cur->stride = ns;
  793|      0|        }
  794|       |
  795|      0|        ASS_ImagePriv *priv = (ASS_ImagePriv *) cur;
  796|      0|        priv->buffer = cur->bitmap = nbuffer;
  797|      0|        ass_cache_dec_ref(priv->source);
  798|      0|        priv->source = NULL;
  799|      0|    }
  800|       |
  801|      0|    ass_cache_dec_ref(clip_bm);
  802|      0|}
ass_render.c:cmp_event_layer:
 3138|   204k|{
 3139|   204k|    ASS_Event *e1 = ((EventImages *) p1)->event;
 3140|   204k|    ASS_Event *e2 = ((EventImages *) p2)->event;
 3141|   204k|    if (e1->Layer < e2->Layer)
  ------------------
  |  Branch (3141:9): [True: 0, False: 204k]
  ------------------
 3142|      0|        return -1;
 3143|   204k|    if (e1->Layer > e2->Layer)
  ------------------
  |  Branch (3143:9): [True: 0, False: 204k]
  ------------------
 3144|      0|        return 1;
 3145|   204k|    if (e1->ReadOrder < e2->ReadOrder)
  ------------------
  |  Branch (3145:9): [True: 204k, False: 0]
  ------------------
 3146|   204k|        return -1;
 3147|      0|    if (e1->ReadOrder > e2->ReadOrder)
  ------------------
  |  Branch (3147:9): [True: 0, False: 0]
  ------------------
 3148|      0|        return 1;
 3149|      0|    return 0;
 3150|      0|}
ass_render.c:fix_collisions:
 3240|  51.2k|{
 3241|  51.2k|    Rect *used = ass_realloc_array(NULL, cnt, sizeof(*used));
 3242|  51.2k|    int cnt_used = 0;
 3243|  51.2k|    int i, j;
 3244|       |
 3245|  51.2k|    if (!used)
  ------------------
  |  Branch (3245:9): [True: 0, False: 51.2k]
  ------------------
 3246|      0|        return;
 3247|       |
 3248|       |    // fill used[] with fixed events
 3249|   255k|    for (i = 0; i < cnt; ++i) {
  ------------------
  |  Branch (3249:17): [True: 204k, False: 51.2k]
  ------------------
 3250|   204k|        ASS_RenderPriv *priv;
 3251|       |        // VSFilter considers events colliding if their intersections area is non-zero,
 3252|       |        // zero-area events are therefore effectively fixed as well
 3253|   204k|        if (!imgs[i].detect_collisions || !imgs[i].height  || !imgs[i].width)
  ------------------
  |  Branch (3253:13): [True: 70, False: 204k]
  |  Branch (3253:43): [True: 8, False: 204k]
  |  Branch (3253:63): [True: 0, False: 204k]
  ------------------
 3254|     78|            continue;
 3255|   204k|        priv = get_render_priv(render_priv, imgs[i].event);
 3256|   204k|        if (priv && priv->height > 0) { // it's a fixed event
  ------------------
  |  Branch (3256:13): [True: 204k, False: 0]
  |  Branch (3256:21): [True: 204k, False: 7]
  ------------------
 3257|   204k|            Rect s;
 3258|   204k|            s.y0 = priv->top;
 3259|   204k|            s.y1 = priv->top + priv->height;
 3260|   204k|            s.x0 = priv->left;
 3261|   204k|            s.x1 = priv->left + priv->width;
 3262|   204k|            if (priv->height != imgs[i].height) {       // no, it's not
  ------------------
  |  Branch (3262:17): [True: 0, False: 204k]
  ------------------
 3263|      0|                ass_msg(render_priv->library, MSGL_WARN,
  ------------------
  |  |   41|      0|#define MSGL_WARN 2
  ------------------
 3264|      0|                        "Event height has changed");
 3265|      0|                priv->top = 0;
 3266|      0|                priv->height = 0;
 3267|      0|                priv->left = 0;
 3268|      0|                priv->width = 0;
 3269|      0|            }
 3270|   511k|            for (j = 0; j < cnt_used; ++j)
  ------------------
  |  Branch (3270:25): [True: 306k, False: 204k]
  ------------------
 3271|   306k|                if (overlap(&s, used + j)) {    // no, it's not
  ------------------
  |  Branch (3271:21): [True: 0, False: 306k]
  ------------------
 3272|      0|                    priv->top = 0;
 3273|      0|                    priv->height = 0;
 3274|      0|                    priv->left = 0;
 3275|      0|                    priv->width = 0;
 3276|      0|                }
 3277|   204k|            if (priv->height > 0) {     // still a fixed event
  ------------------
  |  Branch (3277:17): [True: 204k, False: 0]
  ------------------
 3278|   204k|                used[cnt_used].y0 = priv->top;
 3279|   204k|                used[cnt_used].y1 = priv->top + priv->height;
 3280|   204k|                used[cnt_used].x0 = priv->left;
 3281|   204k|                used[cnt_used].x1 = priv->left + priv->width;
 3282|   204k|                cnt_used++;
 3283|   204k|                shift_event(render_priv, imgs + i, priv->top - imgs[i].top);
 3284|   204k|            }
 3285|   204k|        }
 3286|   204k|    }
 3287|  51.2k|    qsort(used, cnt_used, sizeof(*used), cmp_rect_y0);
 3288|       |
 3289|       |    // try to fit other events in free spaces
 3290|   255k|    for (i = 0; i < cnt; ++i) {
  ------------------
  |  Branch (3290:17): [True: 204k, False: 51.2k]
  ------------------
 3291|   204k|        ASS_RenderPriv *priv;
 3292|   204k|        if (!imgs[i].detect_collisions || !imgs[i].height  || !imgs[i].width)
  ------------------
  |  Branch (3292:13): [True: 70, False: 204k]
  |  Branch (3292:43): [True: 8, False: 204k]
  |  Branch (3292:63): [True: 0, False: 204k]
  ------------------
 3293|     78|            continue;
 3294|   204k|        priv = get_render_priv(render_priv, imgs[i].event);
 3295|   204k|        if (priv && priv->height == 0) {        // not a fixed event
  ------------------
  |  Branch (3295:13): [True: 204k, False: 0]
  |  Branch (3295:21): [True: 7, False: 204k]
  ------------------
 3296|      7|            int shift;
 3297|      7|            Rect s;
 3298|      7|            s.y0 = imgs[i].top;
 3299|      7|            s.y1 = imgs[i].top + imgs[i].height;
 3300|      7|            s.x0 = imgs[i].left;
 3301|      7|            s.x1 = imgs[i].left + imgs[i].width;
 3302|      7|            shift = fit_rect(&s, used, &cnt_used, imgs[i].shift_direction);
 3303|      7|            if (shift)
  ------------------
  |  Branch (3303:17): [True: 1, False: 6]
  ------------------
 3304|      1|                shift_event(render_priv, imgs + i, shift);
 3305|       |            // make it fixed
 3306|      7|            priv->top = imgs[i].top;
 3307|      7|            priv->height = imgs[i].height;
 3308|      7|            priv->left = imgs[i].left;
 3309|      7|            priv->width = imgs[i].width;
 3310|      7|        }
 3311|       |
 3312|   204k|    }
 3313|       |
 3314|  51.2k|    free(used);
 3315|  51.2k|}
ass_render.c:get_render_priv:
 3154|   409k|{
 3155|   409k|    if (!event->render_priv) {
  ------------------
  |  Branch (3155:9): [True: 7, False: 409k]
  ------------------
 3156|      7|        event->render_priv = calloc(1, sizeof(ASS_RenderPriv));
 3157|      7|        if (!event->render_priv)
  ------------------
  |  Branch (3157:13): [True: 0, False: 7]
  ------------------
 3158|      0|            return NULL;
 3159|      7|    }
 3160|   409k|    if (render_priv->render_id != event->render_priv->render_id) {
  ------------------
  |  Branch (3160:9): [True: 7, False: 409k]
  ------------------
 3161|      7|        memset(event->render_priv, 0, sizeof(ASS_RenderPriv));
 3162|      7|        event->render_priv->render_id = render_priv->render_id;
 3163|      7|    }
 3164|       |
 3165|   409k|    return event->render_priv;
 3166|   409k|}
ass_render.c:overlap:
 3169|   306k|{
 3170|   306k|    if (s1->y0 >= s2->y1 || s2->y0 >= s1->y1 ||
  ------------------
  |  Branch (3170:9): [True: 51.1k, False: 255k]
  |  Branch (3170:29): [True: 102k, False: 153k]
  ------------------
 3171|   306k|        s1->x0 >= s2->x1 || s2->x0 >= s1->x1)
  ------------------
  |  Branch (3171:9): [True: 153k, False: 0]
  |  Branch (3171:29): [True: 0, False: 0]
  ------------------
 3172|   306k|        return 0;
 3173|      0|    return 1;
 3174|   306k|}
ass_render.c:shift_event:
 3183|   204k|{
 3184|   204k|    ASS_Image *cur = ei->imgs;
 3185|   511k|    while (cur) {
  ------------------
  |  Branch (3185:12): [True: 307k, False: 204k]
  ------------------
 3186|   307k|        cur->dst_y += shift;
 3187|       |        // clip top and bottom
 3188|   307k|        if (cur->dst_y < 0) {
  ------------------
  |  Branch (3188:13): [True: 0, False: 307k]
  ------------------
 3189|      0|            int clip = -cur->dst_y;
 3190|      0|            cur->h -= clip;
 3191|      0|            cur->bitmap += clip * cur->stride;
 3192|      0|            cur->dst_y = 0;
 3193|      0|        }
 3194|   307k|        if (cur->dst_y + cur->h >= render_priv->height) {
  ------------------
  |  Branch (3194:13): [True: 0, False: 307k]
  ------------------
 3195|      0|            int clip = cur->dst_y + cur->h - render_priv->height;
 3196|      0|            cur->h -= clip;
 3197|      0|        }
 3198|   307k|        if (cur->h <= 0) {
  ------------------
  |  Branch (3198:13): [True: 0, False: 307k]
  ------------------
 3199|      0|            cur->h = 0;
 3200|      0|            cur->dst_y = 0;
 3201|      0|        }
 3202|   307k|        cur = cur->next;
 3203|   307k|    }
 3204|   204k|    ei->top += shift;
 3205|   204k|}
ass_render.c:cmp_rect_y0:
 3177|   255k|{
 3178|   255k|    return ((Rect *) p1)->y0 - ((Rect *) p2)->y0;
 3179|   255k|}
ass_render.c:fit_rect:
 3210|      7|{
 3211|      7|    int i;
 3212|      7|    int shift = 0;
 3213|       |
 3214|      7|    if (dir == 1)               // move down
  ------------------
  |  Branch (3214:9): [True: 0, False: 7]
  ------------------
 3215|      0|        for (i = 0; i < *cnt; ++i) {
  ------------------
  |  Branch (3215:21): [True: 0, False: 0]
  ------------------
 3216|      0|            if (s->y1 + shift <= fixed[i].y0 || s->y0 + shift >= fixed[i].y1 ||
  ------------------
  |  Branch (3216:17): [True: 0, False: 0]
  |  Branch (3216:49): [True: 0, False: 0]
  ------------------
 3217|      0|                s->x1 <= fixed[i].x0 || s->x0 >= fixed[i].x1)
  ------------------
  |  Branch (3217:17): [True: 0, False: 0]
  |  Branch (3217:41): [True: 0, False: 0]
  ------------------
 3218|      0|                continue;
 3219|      0|            shift = fixed[i].y1 - s->y0;
 3220|      0|    } else                      // dir == -1, move up
 3221|     13|        for (i = *cnt - 1; i >= 0; --i) {
  ------------------
  |  Branch (3221:28): [True: 6, False: 7]
  ------------------
 3222|      6|            if (s->y1 + shift <= fixed[i].y0 || s->y0 + shift >= fixed[i].y1 ||
  ------------------
  |  Branch (3222:17): [True: 1, False: 5]
  |  Branch (3222:49): [True: 1, False: 4]
  ------------------
 3223|      6|                s->x1 <= fixed[i].x0 || s->x0 >= fixed[i].x1)
  ------------------
  |  Branch (3223:17): [True: 3, False: 1]
  |  Branch (3223:41): [True: 0, False: 1]
  ------------------
 3224|      5|                continue;
 3225|      1|            shift = fixed[i].y0 - s->y1;
 3226|      1|        }
 3227|       |
 3228|      7|    fixed[*cnt].y0 = s->y0 + shift;
 3229|      7|    fixed[*cnt].y1 = s->y1 + shift;
 3230|      7|    fixed[*cnt].x0 = s->x0;
 3231|      7|    fixed[*cnt].x1 = s->x1;
 3232|      7|    (*cnt)++;
 3233|      7|    qsort(fixed, *cnt, sizeof(*fixed), cmp_rect_y0);
 3234|       |
 3235|      7|    return shift;
 3236|      7|}
ass_render.c:ass_detect_change:
 3348|  51.2k|{
 3349|  51.2k|    ASS_Image *img, *img2;
 3350|  51.2k|    int diff;
 3351|       |
 3352|  51.2k|    img = priv->prev_images_root;
 3353|  51.2k|    img2 = priv->images_root;
 3354|  51.2k|    diff = 0;
 3355|   358k|    while (img && diff < 2) {
  ------------------
  |  Branch (3355:12): [True: 307k, False: 51.2k]
  |  Branch (3355:19): [True: 307k, False: 14]
  ------------------
 3356|   307k|        ASS_Image *next, *next2;
 3357|   307k|        next = img->next;
 3358|   307k|        if (img2) {
  ------------------
  |  Branch (3358:13): [True: 307k, False: 3]
  ------------------
 3359|   307k|            int d = ass_image_compare(img, img2);
 3360|   307k|            if (d > diff)
  ------------------
  |  Branch (3360:17): [True: 14, False: 307k]
  ------------------
 3361|     14|                diff = d;
 3362|   307k|            next2 = img2->next;
 3363|   307k|        } else {
 3364|       |            // previous list is shorter
 3365|      3|            diff = 2;
 3366|      3|            break;
 3367|      3|        }
 3368|   307k|        img = next;
 3369|   307k|        img2 = next2;
 3370|   307k|    }
 3371|       |
 3372|       |    // is the previous list longer?
 3373|  51.2k|    if (img2)
  ------------------
  |  Branch (3373:9): [True: 25, False: 51.2k]
  ------------------
 3374|     25|        diff = 2;
 3375|       |
 3376|  51.2k|    return diff;
 3377|  51.2k|}
ass_render.c:ass_image_compare:
 3324|   307k|{
 3325|   307k|    if (i1->w != i2->w)
  ------------------
  |  Branch (3325:9): [True: 6, False: 307k]
  ------------------
 3326|      6|        return 2;
 3327|   307k|    if (i1->h != i2->h)
  ------------------
  |  Branch (3327:9): [True: 8, False: 307k]
  ------------------
 3328|      8|        return 2;
 3329|   307k|    if (i1->stride != i2->stride)
  ------------------
  |  Branch (3329:9): [True: 0, False: 307k]
  ------------------
 3330|      0|        return 2;
 3331|   307k|    if (i1->color != i2->color)
  ------------------
  |  Branch (3331:9): [True: 0, False: 307k]
  ------------------
 3332|      0|        return 2;
 3333|   307k|    if (i1->bitmap != i2->bitmap)
  ------------------
  |  Branch (3333:9): [True: 0, False: 307k]
  ------------------
 3334|      0|        return 2;
 3335|   307k|    if (i1->dst_x != i2->dst_x)
  ------------------
  |  Branch (3335:9): [True: 0, False: 307k]
  ------------------
 3336|      0|        return 1;
 3337|   307k|    if (i1->dst_y != i2->dst_y)
  ------------------
  |  Branch (3337:9): [True: 0, False: 307k]
  ------------------
 3338|      0|        return 1;
 3339|   307k|    return 0;
 3340|   307k|}

ass_set_frame_size:
   53|     33|{
   54|     33|    if (w < 0 || h < 0)
  ------------------
  |  Branch (54:9): [True: 0, False: 33]
  |  Branch (54:18): [True: 0, False: 33]
  ------------------
   55|      0|        w = h = 0;
   56|     33|    if (priv->settings.frame_width != w || priv->settings.frame_height != h) {
  ------------------
  |  Branch (56:9): [True: 33, False: 0]
  |  Branch (56:44): [True: 0, False: 0]
  ------------------
   57|     33|        priv->settings.frame_width = w;
   58|     33|        priv->settings.frame_height = h;
   59|     33|        ass_reconfigure(priv);
   60|     33|    }
   61|     33|}
ass_set_storage_size:
   64|     33|{
   65|     33|    if (w < 0 || h < 0)
  ------------------
  |  Branch (65:9): [True: 0, False: 33]
  |  Branch (65:18): [True: 0, False: 33]
  ------------------
   66|      0|        w = h = 0;
   67|     33|    if (priv->settings.storage_width != w ||
  ------------------
  |  Branch (67:9): [True: 33, False: 0]
  ------------------
   68|     33|        priv->settings.storage_height != h) {
  ------------------
  |  Branch (68:9): [True: 0, False: 0]
  ------------------
   69|     33|        priv->settings.storage_width = w;
   70|     33|        priv->settings.storage_height = h;
   71|     33|        ass_reconfigure(priv);
   72|     33|    }
   73|     33|}
ass_set_fonts:
  147|     33|{
  148|     33|    free(priv->settings.default_font);
  149|     33|    free(priv->settings.default_family);
  150|     33|    priv->settings.default_font = default_font ? strdup(default_font) : 0;
  ------------------
  |  Branch (150:35): [True: 0, False: 33]
  ------------------
  151|     33|    priv->settings.default_family =
  152|     33|        default_family ? strdup(default_family) : 0;
  ------------------
  |  Branch (152:9): [True: 33, False: 0]
  ------------------
  153|       |
  154|     33|    ass_reconfigure(priv);
  155|       |
  156|     33|    ass_cache_empty(priv->cache.font_cache);
  157|     33|    ass_cache_empty(priv->cache.metrics_cache);
  158|       |
  159|     33|    if (priv->fontselect)
  ------------------
  |  Branch (159:9): [True: 0, False: 33]
  ------------------
  160|      0|        ass_fontselect_free(priv->fontselect);
  161|     33|    priv->fontselect = ass_fontselect_init(priv->library, priv->ftlibrary,
  162|     33|            &priv->num_emfonts, default_family, default_font, config, dfp);
  163|     33|}
ass_render_api.c:ass_reconfigure:
   26|     99|{
   27|     99|    ASS_Settings *settings = &priv->settings;
   28|       |
   29|     99|    priv->render_id++;
   30|     99|    ass_cache_empty(priv->cache.composite_cache);
   31|     99|    ass_cache_empty(priv->cache.bitmap_cache);
   32|     99|    ass_cache_empty(priv->cache.outline_cache);
   33|       |
   34|     99|    priv->width = settings->frame_width;
   35|     99|    priv->height = settings->frame_height;
   36|     99|    priv->frame_content_width = settings->frame_width - settings->left_margin -
   37|     99|        settings->right_margin;
   38|     99|    priv->frame_content_height = settings->frame_height - settings->top_margin -
   39|     99|        settings->bottom_margin;
   40|     99|    priv->fit_width =
   41|     99|        (long long) priv->frame_content_width * priv->height >=
  ------------------
  |  Branch (41:9): [True: 99, False: 0]
  ------------------
   42|     99|        (long long) priv->frame_content_height * priv->width ?
   43|     99|            priv->width :
   44|     99|            (double) priv->frame_content_width * priv->height / priv->frame_content_height;
   45|     99|    priv->fit_height =
   46|     99|        (long long) priv->frame_content_width * priv->height <=
  ------------------
  |  Branch (46:9): [True: 99, False: 0]
  ------------------
   47|     99|        (long long) priv->frame_content_height * priv->width ?
   48|     99|            priv->height :
   49|     99|            (double) priv->frame_content_height * priv->width / priv->frame_content_width;
   50|     99|}

ass_shaper_info:
   92|     33|{
   93|     33|    ass_msg(lib, MSGL_INFO, "Shaper: FriBidi "
  ------------------
  |  |   42|     33|#define MSGL_INFO 4
  ------------------
   94|     33|            FRIBIDI_VERSION " (SIMPLE)"
   95|     33|            " HarfBuzz-ng %s (COMPLEX)", hb_version_string()
   96|     33|           );
   97|     33|}
ass_shaper_free:
  136|     33|{
  137|     33|    free(shaper->features);
  138|     33|    free(shaper->ctypes);
  139|     33|#ifdef USE_FRIBIDI_EX_API
  140|     33|    free(shaper->btypes);
  141|     33|#endif
  142|     33|    free(shaper->emblevels);
  143|     33|    free(shaper->cmap);
  144|     33|    free(shaper->pbase_dir);
  145|     33|    free(shaper);
  146|     33|}
ass_shaper_font_data_free:
  149|     10|{
  150|     10|    int i;
  151|    110|    for (i = 0; i < ASS_FONT_MAX_FACES; i++)
  ------------------
  |  |   36|    110|#define ASS_FONT_MAX_FACES 10
  ------------------
  |  Branch (151:17): [True: 100, False: 10]
  ------------------
  152|    100|        if (priv->fonts[i]) {
  ------------------
  |  Branch (152:13): [True: 11, False: 89]
  ------------------
  153|     11|            free(priv->metrics_data[i]);
  154|     11|            hb_font_destroy(priv->fonts[i]);
  155|     11|            hb_font_funcs_destroy(priv->font_funcs[i]);
  156|     11|        }
  157|     10|    free(priv);
  158|     10|}
ass_glyph_metrics_construct:
  249|    180|{
  250|    180|    GlyphMetricsHashKey *k = key;
  251|    180|    FT_Glyph_Metrics *v = value;
  252|       |
  253|    180|    int load_flags = FT_LOAD_DEFAULT | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
  ------------------
  |  | 3033|    180|#define FT_LOAD_DEFAULT                      0x0
  ------------------
                  int load_flags = FT_LOAD_DEFAULT | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH
  ------------------
  |  | 3042|    180|#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  ( 1L << 9 )
  ------------------
  254|    180|        | FT_LOAD_IGNORE_TRANSFORM;
  ------------------
  |  | 3044|    180|#define FT_LOAD_IGNORE_TRANSFORM             ( 1L << 11 )
  ------------------
  255|       |
  256|    180|    FT_Face face = k->font->faces[k->face_index];
  257|    180|    if (FT_Load_Glyph(face, k->glyph_index, load_flags)) {
  ------------------
  |  Branch (257:9): [True: 4, False: 176]
  ------------------
  258|      4|        v->width = -1;
  259|      4|        return 1;
  260|      4|    }
  261|       |
  262|    176|    memcpy(v, &face->glyph->metrics, sizeof(FT_Glyph_Metrics));
  263|       |
  264|    176|    if (priv)  // rotate
  ------------------
  |  Branch (264:9): [True: 0, False: 176]
  ------------------
  265|      0|        v->horiAdvance = v->vertAdvance;
  266|       |
  267|    176|    return 1;
  268|    180|}
ass_shaper_determine_script:
  760|   204k|{
  761|   204k|    int i;
  762|   204k|    int backwards_scan = 0;
  763|   204k|    hb_unicode_funcs_t *ufuncs = hb_unicode_funcs_get_default();
  764|   204k|    hb_script_t last_script = HB_SCRIPT_UNKNOWN;
  765|       |
  766|       |    // determine script (forward scan)
  767|  3.13M|    for (i = 0; i < len; i++) {
  ------------------
  |  Branch (767:17): [True: 2.93M, False: 204k]
  ------------------
  768|  2.93M|        GlyphInfo *info = glyphs + i;
  769|  2.93M|        info->script = hb_unicode_script(ufuncs, info->symbol);
  770|       |
  771|       |        // common/inherit codepoints inherit script from context
  772|  2.93M|        if (info->script == HB_SCRIPT_COMMON ||
  ------------------
  |  Branch (772:13): [True: 2.54M, False: 392k]
  ------------------
  773|  2.93M|                info->script == HB_SCRIPT_INHERITED) {
  ------------------
  |  Branch (773:17): [True: 0, False: 392k]
  ------------------
  774|       |            // unknown is not a valid context
  775|  2.54M|            if (last_script != HB_SCRIPT_UNKNOWN)
  ------------------
  |  Branch (775:17): [True: 1.56M, False: 972k]
  ------------------
  776|  1.56M|                info->script = last_script;
  777|   972k|            else
  778|       |                // do a backwards scan to check if next codepoint
  779|       |                // contains a valid script for context
  780|   972k|                backwards_scan = 1;
  781|  2.54M|        } else {
  782|   392k|            last_script = info->script;
  783|   392k|        }
  784|  2.93M|    }
  785|       |
  786|       |    // determine script (backwards scan, if needed)
  787|   204k|    last_script = HB_SCRIPT_UNKNOWN;
  788|  3.13M|    for (i = len - 1; i >= 0 && backwards_scan; i--) {
  ------------------
  |  Branch (788:23): [True: 2.93M, False: 204k]
  |  Branch (788:33): [True: 2.93M, False: 22]
  ------------------
  789|  2.93M|        GlyphInfo *info = glyphs + i;
  790|       |
  791|       |        // common/inherit codepoints inherit script from context
  792|  2.93M|        if (info->script == HB_SCRIPT_COMMON ||
  ------------------
  |  Branch (792:13): [True: 972k, False: 1.96M]
  ------------------
  793|  2.93M|                info->script == HB_SCRIPT_INHERITED) {
  ------------------
  |  Branch (793:17): [True: 0, False: 1.96M]
  ------------------
  794|       |            // unknown script is not a valid context
  795|   972k|            if (last_script != HB_SCRIPT_UNKNOWN)
  ------------------
  |  Branch (795:17): [True: 870k, False: 102k]
  ------------------
  796|   870k|                info->script = last_script;
  797|  1.96M|        } else {
  798|  1.96M|            last_script = info->script;
  799|  1.96M|        }
  800|  2.93M|    }
  801|   204k|}
ass_shaper_set_kerning:
  838|  51.2k|{
  839|  51.2k|    shaper->features[KERN].value = kern;
  840|  51.2k|}
ass_shaper_find_runs:
  883|   204k|{
  884|   204k|    int i;
  885|   204k|    int shape_run = 0;
  886|       |
  887|   204k|    ass_shaper_determine_script(shaper, glyphs, len);
  888|   204k|    ass_shaper_skip_characters(glyphs, len);
  889|       |
  890|       |    // find appropriate fonts for the shape runs
  891|  3.13M|    for (i = 0; i < len; i++) {
  ------------------
  |  Branch (891:17): [True: 2.93M, False: 204k]
  ------------------
  892|  2.93M|        GlyphInfo *info = glyphs + i;
  893|  2.93M|        if (!info->drawing_text.str && !info->skip) {
  ------------------
  |  Branch (893:13): [True: 2.93M, False: 0]
  |  Branch (893:40): [True: 2.93M, False: 9]
  ------------------
  894|       |            // get font face and glyph index
  895|  2.93M|            ass_font_get_index(render_priv->fontselect, info->font,
  896|  2.93M|                    info->symbol, &info->face_index, &info->glyph_index);
  897|  2.93M|        }
  898|  2.93M|        if (i > 0) {
  ------------------
  |  Branch (898:13): [True: 2.72M, False: 204k]
  ------------------
  899|  2.72M|            GlyphInfo *last = glyphs + i - 1;
  900|  2.72M|            if ((last->font != info->font ||
  ------------------
  |  Branch (900:18): [True: 0, False: 2.72M]
  ------------------
  901|  2.72M|                    (!info->skip &&
  ------------------
  |  Branch (901:22): [True: 2.72M, False: 9]
  ------------------
  902|  2.72M|                        last->face_index != info->face_index) ||
  ------------------
  |  Branch (902:25): [True: 18, False: 2.72M]
  ------------------
  903|  2.72M|                    last->script != info->script ||
  ------------------
  |  Branch (903:21): [True: 0, False: 2.72M]
  ------------------
  904|  2.72M|                    info->starts_new_run ||
  ------------------
  |  Branch (904:21): [True: 0, False: 2.72M]
  ------------------
  905|  2.72M|                    (!shaper->whole_text_layout && info->hspacing) ||
  ------------------
  |  Branch (905:22): [True: 2.72M, False: 0]
  |  Branch (905:52): [True: 0, False: 2.72M]
  ------------------
  906|  2.72M|                    last->flags != info->flags))
  ------------------
  |  Branch (906:21): [True: 0, False: 2.72M]
  ------------------
  907|     18|                shape_run++;
  908|  2.72M|            else if (info->skip)
  ------------------
  |  Branch (908:22): [True: 9, False: 2.72M]
  ------------------
  909|      9|                info->face_index = last->face_index;
  910|  2.72M|        }
  911|  2.93M|        info->shape_run_id = shape_run;
  912|  2.93M|    }
  913|   204k|}
ass_shaper_set_base_direction:
  920|   204k|{
  921|   204k|    shaper->base_direction = dir;
  922|       |
  923|   204k|    if (shaper->whole_text_layout != WHOLE_TEXT_LAYOUT_EXPLICIT)
  ------------------
  |  Branch (923:9): [True: 204k, False: 0]
  ------------------
  924|   204k|        shaper->whole_text_layout = dir == FRIBIDI_PAR_ON ?
  ------------------
  |  Branch (924:37): [True: 0, False: 204k]
  ------------------
  925|   204k|            WHOLE_TEXT_LAYOUT_IMPLICIT : WHOLE_TEXT_LAYOUT_OFF;
  926|   204k|}
ass_shaper_set_language:
  934|  51.2k|{
  935|  51.2k|    hb_language_t lang;
  936|       |
  937|  51.2k|    if (code)
  ------------------
  |  Branch (937:9): [True: 0, False: 51.2k]
  ------------------
  938|      0|        lang = hb_language_from_string(code, -1);
  939|  51.2k|    else
  940|  51.2k|        lang = HB_LANGUAGE_INVALID;
  ------------------
  |  |  334|  51.2k|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  ------------------
  941|       |
  942|  51.2k|    shaper->language = lang;
  943|  51.2k|}
ass_shaper_set_level:
  949|  51.2k|{
  950|  51.2k|    shaper->shaping_level = level;
  951|  51.2k|}
ass_shaper_set_bidi_brackets:
  955|  51.2k|{
  956|  51.2k|    shaper->bidi_brackets = match_brackets;
  957|  51.2k|}
ass_shaper_set_whole_text_layout:
  961|  51.2k|{
  962|  51.2k|    shaper->whole_text_layout = enable ?
  ------------------
  |  Branch (962:33): [True: 0, False: 51.2k]
  ------------------
  963|      0|        WHOLE_TEXT_LAYOUT_EXPLICIT :
  964|  51.2k|        shaper->base_direction == FRIBIDI_PAR_ON ?
  ------------------
  |  Branch (964:9): [True: 15, False: 51.2k]
  ------------------
  965|  51.2k|            WHOLE_TEXT_LAYOUT_IMPLICIT : WHOLE_TEXT_LAYOUT_OFF;
  966|  51.2k|}
ass_shaper_shape:
  974|   204k|{
  975|   204k|    int i, ret, last_break;
  976|   204k|    FriBidiParType dir, *pdir;
  977|   204k|    GlyphInfo *glyphs = text_info->glyphs;
  978|   204k|    shaper->event_text = text_info->event_text;
  979|       |
  980|   204k|    if (!check_codepoint_allocations(shaper, text_info->length))
  ------------------
  |  Branch (980:9): [True: 0, False: 204k]
  ------------------
  981|      0|        return false;
  982|       |
  983|  3.13M|    for (i = 0; i < text_info->length; i++)
  ------------------
  |  Branch (983:17): [True: 2.93M, False: 204k]
  ------------------
  984|  2.93M|        shaper->event_text[i] = glyphs[i].symbol;
  985|       |
  986|   204k|    fribidi_get_bidi_types(shaper->event_text,
  987|   204k|            text_info->length, shaper->ctypes);
  988|       |
  989|   204k|    int n_pars = 1;
  990|  2.93M|    for (i = 0; i < text_info->length - 1; i++)
  ------------------
  |  Branch (990:17): [True: 2.72M, False: 204k]
  ------------------
  991|  2.72M|        if (shaper->ctypes[i] == FRIBIDI_TYPE_BS)
  ------------------
  |  Branch (991:13): [True: 0, False: 2.72M]
  ------------------
  992|      0|            n_pars++;
  993|       |
  994|   204k|    if (!check_par_allocations(shaper, n_pars))
  ------------------
  |  Branch (994:9): [True: 0, False: 204k]
  ------------------
  995|      0|        return false;
  996|       |
  997|   204k|#ifdef USE_FRIBIDI_EX_API
  998|   204k|    if (shaper->bidi_brackets) {
  ------------------
  |  Branch (998:9): [True: 0, False: 204k]
  ------------------
  999|      0|        fribidi_get_bracket_types(shaper->event_text,
 1000|      0|                text_info->length, shaper->ctypes, shaper->btypes);
 1001|      0|    }
 1002|   204k|#endif
 1003|       |
 1004|       |    // Get bidi embedding levels
 1005|   204k|    last_break = 0;
 1006|   204k|    pdir = shaper->pbase_dir;
 1007|  3.13M|    for (i = 0; i < text_info->length; i++) {
  ------------------
  |  Branch (1007:17): [True: 2.93M, False: 204k]
  ------------------
 1008|       |        // Embedding levels must be calculated one bidi "paragraph" at a time
 1009|  2.93M|        if (i == text_info->length - 1 ||
  ------------------
  |  Branch (1009:13): [True: 204k, False: 2.72M]
  ------------------
 1010|  2.93M|                shaper->ctypes[i] == FRIBIDI_TYPE_BS ||
  ------------------
  |  Branch (1010:17): [True: 0, False: 2.72M]
  ------------------
 1011|  2.93M|                (!shaper->whole_text_layout &&
  ------------------
  |  Branch (1011:18): [True: 2.72M, False: 0]
  ------------------
 1012|  2.72M|                    (glyphs[i + 1].starts_new_run || glyphs[i].hspacing))) {
  ------------------
  |  Branch (1012:22): [True: 0, False: 2.72M]
  |  Branch (1012:54): [True: 0, False: 2.72M]
  ------------------
 1013|   204k|            dir = shaper->base_direction;
 1014|   204k|#ifdef USE_FRIBIDI_EX_API
 1015|   204k|            FriBidiBracketType *btypes = NULL;
 1016|   204k|            if (shaper->bidi_brackets)
  ------------------
  |  Branch (1016:17): [True: 0, False: 204k]
  ------------------
 1017|      0|                btypes = shaper->btypes + last_break;
 1018|   204k|            ret = fribidi_get_par_embedding_levels_ex(
 1019|   204k|                    shaper->ctypes + last_break, btypes,
 1020|   204k|                    i - last_break + 1, &dir, shaper->emblevels + last_break);
 1021|       |#else
 1022|       |            ret = fribidi_get_par_embedding_levels(shaper->ctypes + last_break,
 1023|       |                    i - last_break + 1, &dir, shaper->emblevels + last_break);
 1024|       |#endif
 1025|   204k|            if (ret == 0)
  ------------------
  |  Branch (1025:17): [True: 0, False: 204k]
  ------------------
 1026|      0|                return false;
 1027|   204k|            last_break = i + 1;
 1028|   204k|            if (shaper->whole_text_layout)
  ------------------
  |  Branch (1028:17): [True: 0, False: 204k]
  ------------------
 1029|      0|                *pdir++ = dir;
 1030|   204k|        }
 1031|  2.93M|    }
 1032|       |
 1033|   204k|    switch (shaper->shaping_level) {
 1034|      0|    case ASS_SHAPING_SIMPLE:
  ------------------
  |  Branch (1034:5): [True: 0, False: 204k]
  ------------------
 1035|      0|        shape_fribidi(shaper, glyphs, text_info->length);
 1036|      0|        return true;
 1037|   204k|    case ASS_SHAPING_COMPLEX:
  ------------------
  |  Branch (1037:5): [True: 204k, False: 0]
  ------------------
 1038|   204k|    default:
  ------------------
  |  Branch (1038:5): [True: 0, False: 204k]
  ------------------
 1039|   204k|        return shape_harfbuzz(shaper, glyphs, text_info->length);
 1040|   204k|    }
 1041|   204k|}
ass_shaper_new:
 1047|     33|{
 1048|     33|    assert(metrics_cache);
 1049|       |
 1050|     33|    ASS_Shaper *shaper = calloc(sizeof(*shaper), 1);
 1051|     33|    if (!shaper)
  ------------------
  |  Branch (1051:9): [True: 0, False: 33]
  ------------------
 1052|      0|        return NULL;
 1053|       |
 1054|     33|    shaper->base_direction = FRIBIDI_PAR_ON;
 1055|       |
 1056|     33|    if (!init_features(shaper))
  ------------------
  |  Branch (1056:9): [True: 0, False: 33]
  ------------------
 1057|      0|        goto error;
 1058|     33|    shaper->metrics_cache = metrics_cache;
 1059|       |
 1060|     33|    return shaper;
 1061|       |
 1062|      0|error:
 1063|      0|    ass_shaper_free(shaper);
 1064|      0|    return NULL;
 1065|     33|}
ass_shaper_cleanup:
 1073|   204k|{
 1074|   204k|    int i;
 1075|       |
 1076|  3.13M|    for (i = 0; i < text_info->length; i++) {
  ------------------
  |  Branch (1076:17): [True: 2.93M, False: 204k]
  ------------------
 1077|  2.93M|        GlyphInfo *info = text_info->glyphs + i;
 1078|  2.93M|        info = info->next;
 1079|  2.93M|        while (info) {
  ------------------
  |  Branch (1079:16): [True: 3, False: 2.93M]
  ------------------
 1080|      3|            GlyphInfo *next = info->next;
 1081|      3|            free(info);
 1082|      3|            info = next;
 1083|      3|        }
 1084|  2.93M|    }
 1085|   204k|}
ass_shaper_reorder:
 1094|   204k|{
 1095|   204k|    int i, ret;
 1096|       |
 1097|       |    // Initialize reorder map
 1098|  3.13M|    for (i = 0; i < text_info->length; i++)
  ------------------
  |  Branch (1098:17): [True: 2.93M, False: 204k]
  ------------------
 1099|  2.93M|        shaper->cmap[i] = i;
 1100|       |
 1101|       |    // Create reorder map line-by-line or run-by-run
 1102|   204k|    int last_break = 0;
 1103|   204k|    FriBidiParType *pdir = shaper->whole_text_layout ?
  ------------------
  |  Branch (1103:28): [True: 0, False: 204k]
  ------------------
 1104|   204k|        shaper->pbase_dir : &shaper->base_direction;
 1105|   204k|    GlyphInfo *glyphs = text_info->glyphs;
 1106|  3.13M|    for (i = 0; i < text_info->length; i++) {
  ------------------
  |  Branch (1106:17): [True: 2.93M, False: 204k]
  ------------------
 1107|       |        // Bidi "paragraph separators" may occur between line breaks:
 1108|       |        // U+001C..1E even with ASS_FEATURE_WRAP_UNICODE,
 1109|       |        // or U+000D, U+0085, U+2029 only without it
 1110|  2.93M|        if (i == text_info->length - 1 || glyphs[i + 1].linebreak ||
  ------------------
  |  Branch (1110:13): [True: 204k, False: 2.72M]
  |  Branch (1110:43): [True: 12, False: 2.72M]
  ------------------
 1111|  2.93M|                shaper->ctypes[i] == FRIBIDI_TYPE_BS ||
  ------------------
  |  Branch (1111:17): [True: 0, False: 2.72M]
  ------------------
 1112|  2.93M|                (!shaper->whole_text_layout &&
  ------------------
  |  Branch (1112:18): [True: 2.72M, False: 0]
  ------------------
 1113|  2.72M|                    (glyphs[i + 1].starts_new_run || glyphs[i].hspacing))) {
  ------------------
  |  Branch (1113:22): [True: 0, False: 2.72M]
  |  Branch (1113:54): [True: 0, False: 2.72M]
  ------------------
 1114|   204k|            ret = fribidi_reorder_line(0,
 1115|   204k|                    shaper->ctypes, i - last_break + 1, last_break, *pdir,
 1116|   204k|                    shaper->emblevels, NULL,
 1117|   204k|                    shaper->cmap);
 1118|   204k|            if (ret == 0)
  ------------------
  |  Branch (1118:17): [True: 0, False: 204k]
  ------------------
 1119|      0|                return NULL;
 1120|       |
 1121|   204k|            last_break = i + 1;
 1122|   204k|            if (shaper->whole_text_layout && shaper->ctypes[i] == FRIBIDI_TYPE_BS)
  ------------------
  |  Branch (1122:17): [True: 0, False: 204k]
  |  Branch (1122:46): [True: 0, False: 0]
  ------------------
 1123|      0|                pdir++;
 1124|   204k|        }
 1125|  2.93M|    }
 1126|       |
 1127|   204k|    return shaper->cmap;
 1128|   204k|}
ass_shaper_get_reorder_map:
 1131|   204k|{
 1132|   204k|    return shaper->cmap;
 1133|   204k|}
ass_resolve_base_direction:
 1143|   204k|{
 1144|   204k|    switch (enc) {
 1145|      0|        case -1:
  ------------------
  |  Branch (1145:9): [True: 0, False: 204k]
  ------------------
 1146|      0|            return FRIBIDI_PAR_ON;
 1147|   204k|        default:
  ------------------
  |  Branch (1147:9): [True: 204k, False: 0]
  ------------------
 1148|   204k|            return FRIBIDI_PAR_LTR;
 1149|   204k|    }
 1150|   204k|}
ass_shaper.c:ass_shaper_skip_characters:
  870|   204k|{
  871|  3.13M|    for (int i = 0; i < len; i++) {
  ------------------
  |  Branch (871:21): [True: 2.93M, False: 204k]
  ------------------
  872|  2.93M|        if (is_harfbuzz_ignorable(glyphs[i].symbol)) {
  ------------------
  |  Branch (872:13): [True: 9, False: 2.93M]
  ------------------
  873|      9|            glyphs[i].skip = true;
  874|      9|        }
  875|  2.93M|    }
  876|   204k|}
ass_shaper.c:is_harfbuzz_ignorable:
  848|  2.93M|static inline bool is_harfbuzz_ignorable(unsigned symbol) {
  849|  2.93M|    switch (symbol >> 8) {
  850|  2.93M|        case 0x00: return symbol == 0x00AD;
  ------------------
  |  Branch (850:9): [True: 2.93M, False: 9]
  ------------------
  851|      0|        case 0x03: return symbol == 0x034F;
  ------------------
  |  Branch (851:9): [True: 0, False: 2.93M]
  ------------------
  852|      0|        case 0x06: return symbol == 0x061C;
  ------------------
  |  Branch (852:9): [True: 0, False: 2.93M]
  ------------------
  853|      0|        case 0x17: return symbol >= 0x17B4 && symbol <= 0x17B5;
  ------------------
  |  Branch (853:9): [True: 0, False: 2.93M]
  |  Branch (853:27): [True: 0, False: 0]
  |  Branch (853:47): [True: 0, False: 0]
  ------------------
  854|      0|        case 0x18: return symbol >= 0x180B && symbol <= 0x180E;
  ------------------
  |  Branch (854:9): [True: 0, False: 2.93M]
  |  Branch (854:27): [True: 0, False: 0]
  |  Branch (854:47): [True: 0, False: 0]
  ------------------
  855|      6|        case 0x20: return (symbol >= 0x200B && symbol <= 0x200F) ||
  ------------------
  |  Branch (855:9): [True: 6, False: 2.93M]
  |  Branch (855:28): [True: 6, False: 0]
  |  Branch (855:48): [True: 0, False: 6]
  ------------------
  856|      6|                          (symbol >= 0x202A && symbol <= 0x202E) ||
  ------------------
  |  Branch (856:28): [True: 6, False: 0]
  |  Branch (856:48): [True: 0, False: 6]
  ------------------
  857|      6|                          (symbol >= 0x2060 && symbol <= 0x206F);
  ------------------
  |  Branch (857:28): [True: 6, False: 0]
  |  Branch (857:48): [True: 6, False: 0]
  ------------------
  858|      0|        case 0xFE: return (symbol >= 0xFE00 && symbol <= 0xFE0F) ||
  ------------------
  |  Branch (858:9): [True: 0, False: 2.93M]
  |  Branch (858:28): [True: 0, False: 0]
  |  Branch (858:48): [True: 0, False: 0]
  ------------------
  859|      0|                          symbol == 0xFEFF;
  ------------------
  |  Branch (859:27): [True: 0, False: 0]
  ------------------
  860|      0|        case 0xFF: return symbol >= 0xFFF0 && symbol <= 0xFFF8;
  ------------------
  |  Branch (860:9): [True: 0, False: 2.93M]
  |  Branch (860:27): [True: 0, False: 0]
  |  Branch (860:47): [True: 0, False: 0]
  ------------------
  861|      0|        case 0x1D1: return symbol >= 0x1D173 && symbol <= 0x1D17A;
  ------------------
  |  Branch (861:9): [True: 0, False: 2.93M]
  |  Branch (861:28): [True: 0, False: 0]
  |  Branch (861:49): [True: 0, False: 0]
  ------------------
  862|      3|        default: return symbol >= 0xE0000 && symbol <= 0xE0FFF;
  ------------------
  |  Branch (862:9): [True: 3, False: 2.93M]
  |  Branch (862:25): [True: 3, False: 0]
  |  Branch (862:46): [True: 3, False: 0]
  ------------------
  863|  2.93M|    }
  864|  2.93M|}
ass_shaper.c:check_codepoint_allocations:
  104|   204k|{
  105|   204k|    if (new_size > shaper->n_codepoints) {
  ------------------
  |  Branch (105:9): [True: 12, False: 204k]
  ------------------
  106|     12|        if (!ASS_REALLOC_ARRAY(shaper->ctypes, new_size) ||
  ------------------
  |  |   91|     24|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (106:13): [True: 0, False: 12]
  ------------------
  107|     12|#ifdef USE_FRIBIDI_EX_API
  108|     12|            (shaper->bidi_brackets && !ASS_REALLOC_ARRAY(shaper->btypes, new_size)) ||
  ------------------
  |  |   91|      0|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (108:14): [True: 0, False: 12]
  |  Branch (108:39): [True: 0, False: 0]
  ------------------
  109|     12|#endif
  110|     12|            !ASS_REALLOC_ARRAY(shaper->emblevels, new_size) ||
  ------------------
  |  |   91|     24|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (110:13): [True: 0, False: 12]
  ------------------
  111|     12|            !ASS_REALLOC_ARRAY(shaper->cmap, new_size))
  ------------------
  |  |   91|     12|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (111:13): [True: 0, False: 12]
  ------------------
  112|      0|            return false;
  113|     12|        shaper->n_codepoints = new_size;
  114|     12|    }
  115|   204k|    return true;
  116|   204k|}
ass_shaper.c:check_par_allocations:
  123|   204k|{
  124|   204k|    if (shaper->whole_text_layout && n_pars > shaper->n_pars) {
  ------------------
  |  Branch (124:9): [True: 0, False: 204k]
  |  Branch (124:38): [True: 0, False: 0]
  ------------------
  125|      0|        if (!ASS_REALLOC_ARRAY(shaper->pbase_dir, n_pars))
  ------------------
  |  |   91|      0|    (errno = 0, (ptr) = ass_try_realloc_array(ptr, count, sizeof(*ptr)), !errno)
  ------------------
  |  Branch (125:13): [True: 0, False: 0]
  ------------------
  126|      0|            return false;
  127|      0|        shaper->n_pars = n_pars;
  128|      0|    }
  129|   204k|    return true;
  130|   204k|}
ass_shaper.c:shape_harfbuzz:
  687|   204k|{
  688|   204k|    int i;
  689|   204k|    hb_buffer_t *buf = hb_buffer_create();
  690|   204k|    hb_segment_properties_t props = HB_SEGMENT_PROPERTIES_DEFAULT;
  ------------------
  |  |  225|   204k|#define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
  |  |  226|   204k|				       HB_SCRIPT_INVALID, \
  |  |  227|   204k|				       HB_LANGUAGE_INVALID, \
  |  |  ------------------
  |  |  |  |  334|   204k|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  |  |  ------------------
  |  |  228|   204k|				       (void *) 0, \
  |  |  229|   204k|				       (void *) 0}
  ------------------
  691|       |
  692|       |    // Initialize: skip all glyphs, this is undone later as needed
  693|  3.13M|    for (i = 0; i < len; i++)
  ------------------
  |  Branch (693:17): [True: 2.93M, False: 204k]
  ------------------
  694|  2.93M|        glyphs[i].skip = true;
  695|       |
  696|   409k|    for (i = 0; i < len; i++) {
  ------------------
  |  Branch (696:17): [True: 204k, False: 204k]
  ------------------
  697|   204k|        if (glyphs[i].drawing_text.str) {
  ------------------
  |  Branch (697:13): [True: 0, False: 204k]
  ------------------
  698|      0|            glyphs[i].skip = false;
  699|      0|            continue;
  700|      0|        }
  701|       |
  702|   204k|        int offset = i;
  703|   204k|        hb_font_t *font = get_hb_font(shaper, glyphs + offset);
  704|   204k|        if (!font)
  ------------------
  |  Branch (704:13): [True: 0, False: 204k]
  ------------------
  705|      0|            return false;
  706|   204k|        int run_id = glyphs[offset].shape_run_id;
  707|   204k|        int level = shaper->emblevels[offset];
  708|       |
  709|       |        // advance in text until end of run
  710|  2.93M|        while (i < (len - 1) && run_id == glyphs[i + 1].shape_run_id &&
  ------------------
  |  Branch (710:16): [True: 2.72M, False: 204k]
  |  Branch (710:33): [True: 2.72M, False: 18]
  ------------------
  711|  2.93M|                level == shaper->emblevels[i + 1])
  ------------------
  |  Branch (711:17): [True: 2.72M, False: 0]
  ------------------
  712|  2.72M|            i++;
  713|       |
  714|   204k|        hb_buffer_pre_allocate(buf, i - offset + 1);
  715|       |
  716|   204k|        int lead_context = 0, trail_context = 0;
  717|   204k|        if (shaper->whole_text_layout) {
  ------------------
  |  Branch (717:13): [True: 0, False: 204k]
  ------------------
  718|      0|            hb_buffer_add_utf32(buf, shaper->event_text, len,
  719|      0|                    offset, i - offset + 1);
  720|   204k|        } else {
  721|   204k|            if (offset > 0 && !glyphs[offset].starts_new_run &&
  ------------------
  |  Branch (721:17): [True: 18, False: 204k]
  |  Branch (721:31): [True: 18, False: 0]
  ------------------
  722|   204k|                    is_shaping_control(glyphs[offset - 1].symbol))
  ------------------
  |  Branch (722:21): [True: 0, False: 18]
  ------------------
  723|      0|                lead_context = 1;
  724|   204k|            if (i < (len - 1) && !glyphs[i + 1].starts_new_run &&
  ------------------
  |  Branch (724:17): [True: 18, False: 204k]
  |  Branch (724:34): [True: 18, False: 0]
  ------------------
  725|   204k|                    is_shaping_control(glyphs[i + 1].symbol))
  ------------------
  |  Branch (725:21): [True: 0, False: 18]
  ------------------
  726|      0|                trail_context = 1;
  727|       |
  728|   204k|            hb_buffer_add_utf32(buf,
  729|   204k|                    shaper->event_text + offset - lead_context,
  730|   204k|                    i - offset + 1 + lead_context + trail_context,
  731|   204k|                    lead_context, i - offset + 1);
  732|   204k|        }
  733|       |
  734|   204k|        props.direction = FRIBIDI_LEVEL_IS_RTL(level) ?
  ------------------
  |  |  252|   204k|#define FRIBIDI_LEVEL_IS_RTL(lev) ((lev) & 1)
  |  |  ------------------
  |  |  |  Branch (252:35): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  735|   204k|            HB_DIRECTION_RTL : HB_DIRECTION_LTR;
  736|   204k|        props.script = glyphs[offset].script;
  737|   204k|        props.language  = hb_shaper_get_run_language(shaper, props.script);
  738|   204k|        hb_buffer_set_segment_properties(buf, &props);
  739|       |
  740|   204k|        set_run_features(shaper, glyphs + offset);
  741|   204k|        hb_shape(font, buf, shaper->features, shaper->n_features);
  742|       |
  743|   204k|        shape_harfbuzz_process_run(glyphs, buf,
  744|   204k|                shaper->whole_text_layout ? 0 : offset - lead_context);
  ------------------
  |  Branch (744:17): [True: 0, False: 204k]
  ------------------
  745|   204k|        hb_buffer_reset(buf);
  746|   204k|    }
  747|       |
  748|   204k|    hb_buffer_destroy(buf);
  749|       |
  750|   204k|    return true;
  751|   204k|}
ass_shaper.c:get_hb_font:
  447|   204k|{
  448|   204k|    ASS_Font *font = info->font;
  449|   204k|    hb_font_t **hb_fonts;
  450|       |
  451|   204k|    if (!font->shaper_priv)
  ------------------
  |  Branch (451:9): [True: 10, False: 204k]
  ------------------
  452|     10|        font->shaper_priv = calloc(sizeof(ASS_ShaperFontData), 1);
  453|   204k|    if (!font->shaper_priv)
  ------------------
  |  Branch (453:9): [True: 0, False: 204k]
  ------------------
  454|      0|        return NULL;
  455|       |
  456|   204k|    hb_fonts = font->shaper_priv->fonts;
  457|   204k|    if (!hb_fonts[info->face_index]) {
  ------------------
  |  Branch (457:9): [True: 11, False: 204k]
  ------------------
  458|     11|        FT_Face face = font->faces[info->face_index];
  459|     11|        hb_face_t *hb_face = hb_face_create_for_tables(get_reference_table, face, NULL);
  460|     11|        if (!hb_face)
  ------------------
  |  Branch (460:13): [True: 0, False: 11]
  ------------------
  461|      0|            return NULL;
  462|     11|        hb_face_set_index(hb_face, face->face_index);
  463|     11|        hb_face_set_upem(hb_face, face->units_per_EM);
  464|       |
  465|     11|        hb_font_t *hb_font = hb_fonts[info->face_index] = hb_font_create(hb_face);
  466|     11|        hb_face_destroy(hb_face);
  467|     11|        if (!hb_font)
  ------------------
  |  Branch (467:13): [True: 0, False: 11]
  ------------------
  468|      0|            return NULL;
  469|       |
  470|     11|        hb_font_set_scale(hb_font,
  471|     11|            (int)(((uint64_t)face->size->metrics.x_scale * face->units_per_EM + (1<<15)) >> 16),
  472|     11|            (int)(((uint64_t)face->size->metrics.y_scale * face->units_per_EM + (1<<15)) >> 16));
  473|       |
  474|       |        // set up cached metrics access
  475|     11|        struct ass_shaper_metrics_data *metrics =
  476|     11|            font->shaper_priv->metrics_data[info->face_index] =
  477|     11|                calloc(sizeof(struct ass_shaper_metrics_data), 1);
  478|     11|        if (!metrics)
  ------------------
  |  Branch (478:13): [True: 0, False: 11]
  ------------------
  479|      0|            return NULL;
  480|     11|        metrics->metrics_cache = shaper->metrics_cache;
  481|     11|        metrics->vertical = info->font->desc.vertical;
  482|       |
  483|     11|        hb_font_funcs_t *funcs = hb_font_funcs_create();
  484|     11|        if (!funcs)
  ------------------
  |  Branch (484:13): [True: 0, False: 11]
  ------------------
  485|      0|            return NULL;
  486|     11|        font->shaper_priv->font_funcs[info->face_index] = funcs;
  487|     11|        hb_font_funcs_set_nominal_glyph_func(funcs, get_glyph_nominal,
  488|     11|                metrics, NULL);
  489|     11|        hb_font_funcs_set_variation_glyph_func(funcs, get_glyph_variation,
  490|     11|                metrics, NULL);
  491|     11|        hb_font_funcs_set_glyph_h_advance_func(funcs, cached_h_advance,
  492|     11|                metrics, NULL);
  493|     11|        hb_font_funcs_set_glyph_v_advance_func(funcs, cached_v_advance,
  494|     11|                metrics, NULL);
  495|     11|        hb_font_funcs_set_glyph_h_origin_func(funcs, cached_h_origin,
  496|     11|                metrics, NULL);
  497|     11|        hb_font_funcs_set_glyph_v_origin_func(funcs, cached_v_origin,
  498|     11|                metrics, NULL);
  499|     11|        hb_font_funcs_set_glyph_h_kerning_func(funcs, get_h_kerning,
  500|     11|                metrics, NULL);
  501|     11|        hb_font_funcs_set_glyph_v_kerning_func(funcs, get_v_kerning,
  502|     11|                metrics, NULL);
  503|     11|        hb_font_funcs_set_glyph_extents_func(funcs, cached_extents,
  504|     11|                metrics, NULL);
  505|     11|        hb_font_funcs_set_glyph_contour_point_func(funcs, get_contour_point,
  506|     11|                metrics, NULL);
  507|     11|        hb_font_set_funcs(hb_font, funcs, face, NULL);
  508|     11|    }
  509|       |
  510|   204k|    ass_face_set_size(font->faces[info->face_index], info->font_size);
  511|   204k|    update_hb_size(hb_fonts[info->face_index], font->faces[info->face_index]);
  512|       |
  513|       |    // update hash key for cached metrics
  514|   204k|    struct ass_shaper_metrics_data *metrics =
  515|   204k|        font->shaper_priv->metrics_data[info->face_index];
  516|   204k|    metrics->hash_key.font = info->font;
  517|   204k|    metrics->hash_key.face_index = info->face_index;
  518|   204k|    metrics->hash_key.size = info->font_size;
  519|       |
  520|   204k|    return hb_fonts[info->face_index];
  521|   204k|}
ass_shaper.c:get_reference_table:
  272|     99|{
  273|     99|  FT_Face face = font_data;
  274|     99|  FT_ULong len = 0;
  275|       |
  276|     99|  if (FT_Load_Sfnt_Table(face, tag, 0, NULL, &len) != FT_Err_Ok)
  ------------------
  |  Branch (276:7): [True: 64, False: 35]
  ------------------
  277|     64|    return NULL;
  278|       |
  279|     35|  char *buf = malloc(len);
  280|     35|  if (!buf)
  ------------------
  |  Branch (280:7): [True: 0, False: 35]
  ------------------
  281|      0|    return NULL;
  282|       |
  283|     35|  if (FT_Load_Sfnt_Table(face, tag, 0, (FT_Byte*)buf, &len) != FT_Err_Ok) {
  ------------------
  |  Branch (283:7): [True: 0, False: 35]
  ------------------
  284|      0|    free(buf);
  285|      0|    return NULL;
  286|      0|  }
  287|       |
  288|     35|  hb_blob_t *blob = hb_blob_create(buf, len, HB_MEMORY_MODE_WRITABLE, buf, free);
  289|     35|  if (!blob)
  ------------------
  |  Branch (289:7): [True: 0, False: 35]
  ------------------
  290|      0|      free(buf);
  291|       |
  292|     35|  return blob;
  293|     35|}
ass_shaper.c:get_glyph_nominal:
  298|  2.93M|{
  299|  2.93M|    FT_Face face = font_data;
  300|  2.93M|    struct ass_shaper_metrics_data *metrics_priv = user_data;
  301|       |
  302|  2.93M|    *glyph = ass_font_index_magic(face, unicode);
  303|  2.93M|    if (*glyph)
  ------------------
  |  Branch (303:9): [True: 2.93M, False: 0]
  ------------------
  304|  2.93M|        *glyph = FT_Get_Char_Index(face, *glyph);
  305|  2.93M|    if (!*glyph)
  ------------------
  |  Branch (305:9): [True: 486k, False: 2.44M]
  ------------------
  306|   486k|        return false;
  307|       |
  308|       |    // rotate glyph advances for @fonts while we still know the Unicode codepoints
  309|  2.44M|    FT_Glyph_Metrics *metrics = get_cached_metrics(metrics_priv, unicode, *glyph);
  310|  2.44M|    ass_cache_dec_ref(metrics);
  311|  2.44M|    return true;
  312|  2.93M|}
ass_shaper.c:get_cached_metrics:
  230|  5.37M|{
  231|  5.37M|    bool rotate = false;
  232|       |    // if @font rendering is enabled and the glyph should be rotated,
  233|       |    // make cached_h_advance pick up the right advance later
  234|  5.37M|    if (metrics->vertical && unicode >= VERTICAL_LOWER_BOUND)
  ------------------
  |  |   34|      0|#define VERTICAL_LOWER_BOUND 0x02f1
  ------------------
  |  Branch (234:9): [True: 0, False: 5.37M]
  |  Branch (234:30): [True: 0, False: 0]
  ------------------
  235|      0|        rotate = true;
  236|       |
  237|  5.37M|    metrics->hash_key.glyph_index = glyph;
  238|  5.37M|    FT_Glyph_Metrics *val = ass_cache_get(metrics->metrics_cache, &metrics->hash_key,
  239|  5.37M|                                          rotate ? metrics : NULL);
  ------------------
  |  Branch (239:43): [True: 0, False: 5.37M]
  ------------------
  240|  5.37M|    if (!val)
  ------------------
  |  Branch (240:9): [True: 0, False: 5.37M]
  ------------------
  241|      0|        return NULL;
  242|  5.37M|    if (val->width >= 0)
  ------------------
  |  Branch (242:9): [True: 5.37M, False: 128]
  ------------------
  243|  5.37M|        return val;
  244|    128|    ass_cache_dec_ref(val);
  245|    128|    return NULL;
  246|  5.37M|}
ass_shaper.c:cached_h_advance:
  336|  2.93M|{
  337|  2.93M|    struct ass_shaper_metrics_data *metrics_priv = user_data;
  338|  2.93M|    FT_Glyph_Metrics *metrics = get_cached_metrics(metrics_priv, 0, glyph);
  339|  2.93M|    if (!metrics)
  ------------------
  |  Branch (339:9): [True: 64, False: 2.93M]
  ------------------
  340|     64|        return 0;
  341|       |
  342|  2.93M|    hb_position_t advance = metrics->horiAdvance;
  343|  2.93M|    ass_cache_dec_ref(metrics);
  344|  2.93M|    return advance;
  345|  2.93M|}
ass_shaper.c:cached_h_origin:
  364|  8.79M|{
  365|  8.79M|    return true;
  366|  8.79M|}
ass_shaper.c:update_hb_size:
  209|   204k|{
  210|   204k|    hb_font_set_scale (hb_font,
  211|   204k|            ((uint64_t) face->size->metrics.x_scale * (uint64_t) face->units_per_EM) >> 16,
  212|   204k|            ((uint64_t) face->size->metrics.y_scale * (uint64_t) face->units_per_EM) >> 16);
  213|   204k|    hb_font_set_ppem (hb_font, face->size->metrics.x_ppem,
  214|   204k|            face->size->metrics.y_ppem);
  215|   204k|}
ass_shaper.c:is_shaping_control:
  528|     36|static inline bool is_shaping_control(unsigned symbol) {
  529|     36|    return symbol == 0x200C /* ZWNJ */ || symbol == 0x200D /* ZWJ */;
  ------------------
  |  Branch (529:12): [True: 0, False: 36]
  |  Branch (529:43): [True: 0, False: 36]
  ------------------
  530|     36|}
ass_shaper.c:hb_shaper_get_run_language:
  616|   204k|{
  617|   204k|    hb_language_t lang;
  618|       |
  619|       |    // override set, use it
  620|   204k|    if (shaper->language != HB_LANGUAGE_INVALID)
  ------------------
  |  |  334|   204k|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  ------------------
  |  Branch (620:9): [True: 0, False: 204k]
  ------------------
  621|      0|        return shaper->language;
  622|       |
  623|       |    // get default language for given script
  624|   204k|    lang = script_to_language(script);
  625|       |
  626|       |    // no dice, use system default
  627|   204k|    if (lang == HB_LANGUAGE_INVALID)
  ------------------
  |  |  334|   204k|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  ------------------
  |  Branch (627:9): [True: 102k, False: 102k]
  ------------------
  628|   102k|        lang = hb_language_get_default();
  629|       |
  630|   204k|    return lang;
  631|   204k|}
ass_shaper.c:script_to_language:
  545|   204k|{
  546|   204k|    switch (script) {
  547|       |        // Unicode 1.1
  548|      0|        case HB_SCRIPT_ARABIC: return hb_language_from_string("ar", -1); break;
  ------------------
  |  Branch (548:9): [True: 0, False: 204k]
  ------------------
  549|      0|        case HB_SCRIPT_ARMENIAN: return hb_language_from_string("hy", -1); break;
  ------------------
  |  Branch (549:9): [True: 0, False: 204k]
  ------------------
  550|      0|        case HB_SCRIPT_BENGALI: return hb_language_from_string("bn", -1); break;
  ------------------
  |  Branch (550:9): [True: 0, False: 204k]
  ------------------
  551|      0|        case HB_SCRIPT_CANADIAN_ABORIGINAL: return hb_language_from_string("iu", -1); break;
  ------------------
  |  |   63|      0|#define HB_SCRIPT_CANADIAN_ABORIGINAL		HB_SCRIPT_CANADIAN_SYLLABICS
  ------------------
  |  Branch (551:9): [True: 0, False: 204k]
  ------------------
  552|      0|        case HB_SCRIPT_CHEROKEE: return hb_language_from_string("chr", -1); break;
  ------------------
  |  Branch (552:9): [True: 0, False: 204k]
  ------------------
  553|      0|        case HB_SCRIPT_COPTIC: return hb_language_from_string("cop", -1); break;
  ------------------
  |  Branch (553:9): [True: 0, False: 204k]
  ------------------
  554|      0|        case HB_SCRIPT_CYRILLIC: return hb_language_from_string("ru", -1); break;
  ------------------
  |  Branch (554:9): [True: 0, False: 204k]
  ------------------
  555|      0|        case HB_SCRIPT_DEVANAGARI: return hb_language_from_string("hi", -1); break;
  ------------------
  |  Branch (555:9): [True: 0, False: 204k]
  ------------------
  556|      0|        case HB_SCRIPT_GEORGIAN: return hb_language_from_string("ka", -1); break;
  ------------------
  |  Branch (556:9): [True: 0, False: 204k]
  ------------------
  557|      0|        case HB_SCRIPT_GREEK: return hb_language_from_string("el", -1); break;
  ------------------
  |  Branch (557:9): [True: 0, False: 204k]
  ------------------
  558|      0|        case HB_SCRIPT_GUJARATI: return hb_language_from_string("gu", -1); break;
  ------------------
  |  Branch (558:9): [True: 0, False: 204k]
  ------------------
  559|      0|        case HB_SCRIPT_GURMUKHI: return hb_language_from_string("pa", -1); break;
  ------------------
  |  Branch (559:9): [True: 0, False: 204k]
  ------------------
  560|      0|        case HB_SCRIPT_HANGUL: return hb_language_from_string("ko", -1); break;
  ------------------
  |  Branch (560:9): [True: 0, False: 204k]
  ------------------
  561|      0|        case HB_SCRIPT_HEBREW: return hb_language_from_string("he", -1); break;
  ------------------
  |  Branch (561:9): [True: 0, False: 204k]
  ------------------
  562|      0|        case HB_SCRIPT_HIRAGANA: return hb_language_from_string("ja", -1); break;
  ------------------
  |  Branch (562:9): [True: 0, False: 204k]
  ------------------
  563|      0|        case HB_SCRIPT_KANNADA: return hb_language_from_string("kn", -1); break;
  ------------------
  |  Branch (563:9): [True: 0, False: 204k]
  ------------------
  564|      0|        case HB_SCRIPT_KATAKANA: return hb_language_from_string("ja", -1); break;
  ------------------
  |  Branch (564:9): [True: 0, False: 204k]
  ------------------
  565|      0|        case HB_SCRIPT_LAO: return hb_language_from_string("lo", -1); break;
  ------------------
  |  Branch (565:9): [True: 0, False: 204k]
  ------------------
  566|   102k|        case HB_SCRIPT_LATIN: return hb_language_from_string("en", -1); break;
  ------------------
  |  Branch (566:9): [True: 102k, False: 102k]
  ------------------
  567|      0|        case HB_SCRIPT_MALAYALAM: return hb_language_from_string("ml", -1); break;
  ------------------
  |  Branch (567:9): [True: 0, False: 204k]
  ------------------
  568|      0|        case HB_SCRIPT_MONGOLIAN: return hb_language_from_string("mn", -1); break;
  ------------------
  |  Branch (568:9): [True: 0, False: 204k]
  ------------------
  569|      0|        case HB_SCRIPT_ORIYA: return hb_language_from_string("or", -1); break;
  ------------------
  |  Branch (569:9): [True: 0, False: 204k]
  ------------------
  570|      0|        case HB_SCRIPT_SYRIAC: return hb_language_from_string("syr", -1); break;
  ------------------
  |  Branch (570:9): [True: 0, False: 204k]
  ------------------
  571|      0|        case HB_SCRIPT_TAMIL: return hb_language_from_string("ta", -1); break;
  ------------------
  |  Branch (571:9): [True: 0, False: 204k]
  ------------------
  572|      0|        case HB_SCRIPT_TELUGU: return hb_language_from_string("te", -1); break;
  ------------------
  |  Branch (572:9): [True: 0, False: 204k]
  ------------------
  573|      0|        case HB_SCRIPT_THAI: return hb_language_from_string("th", -1); break;
  ------------------
  |  Branch (573:9): [True: 0, False: 204k]
  ------------------
  574|       |
  575|       |        // Unicode 2.0
  576|      0|        case HB_SCRIPT_TIBETAN: return hb_language_from_string("bo", -1); break;
  ------------------
  |  Branch (576:9): [True: 0, False: 204k]
  ------------------
  577|       |
  578|       |        // Unicode 3.0
  579|      0|        case HB_SCRIPT_ETHIOPIC: return hb_language_from_string("am", -1); break;
  ------------------
  |  Branch (579:9): [True: 0, False: 204k]
  ------------------
  580|      0|        case HB_SCRIPT_KHMER: return hb_language_from_string("km", -1); break;
  ------------------
  |  Branch (580:9): [True: 0, False: 204k]
  ------------------
  581|      0|        case HB_SCRIPT_MYANMAR: return hb_language_from_string("my", -1); break;
  ------------------
  |  Branch (581:9): [True: 0, False: 204k]
  ------------------
  582|      0|        case HB_SCRIPT_SINHALA: return hb_language_from_string("si", -1); break;
  ------------------
  |  Branch (582:9): [True: 0, False: 204k]
  ------------------
  583|      0|        case HB_SCRIPT_THAANA: return hb_language_from_string("dv", -1); break;
  ------------------
  |  Branch (583:9): [True: 0, False: 204k]
  ------------------
  584|       |
  585|       |        // Unicode 3.2
  586|      0|        case HB_SCRIPT_BUHID: return hb_language_from_string("bku", -1); break;
  ------------------
  |  Branch (586:9): [True: 0, False: 204k]
  ------------------
  587|      0|        case HB_SCRIPT_HANUNOO: return hb_language_from_string("hnn", -1); break;
  ------------------
  |  Branch (587:9): [True: 0, False: 204k]
  ------------------
  588|      0|        case HB_SCRIPT_TAGALOG: return hb_language_from_string("tl", -1); break;
  ------------------
  |  Branch (588:9): [True: 0, False: 204k]
  ------------------
  589|      0|        case HB_SCRIPT_TAGBANWA: return hb_language_from_string("tbw", -1); break;
  ------------------
  |  Branch (589:9): [True: 0, False: 204k]
  ------------------
  590|       |
  591|       |        // Unicode 4.0
  592|      0|        case HB_SCRIPT_UGARITIC: return hb_language_from_string("uga", -1); break;
  ------------------
  |  Branch (592:9): [True: 0, False: 204k]
  ------------------
  593|       |
  594|       |        // Unicode 4.1
  595|      0|        case HB_SCRIPT_BUGINESE: return hb_language_from_string("bug", -1); break;
  ------------------
  |  Branch (595:9): [True: 0, False: 204k]
  ------------------
  596|      0|        case HB_SCRIPT_OLD_PERSIAN: return hb_language_from_string("peo", -1); break;
  ------------------
  |  Branch (596:9): [True: 0, False: 204k]
  ------------------
  597|      0|        case HB_SCRIPT_SYLOTI_NAGRI: return hb_language_from_string("syl", -1); break;
  ------------------
  |  Branch (597:9): [True: 0, False: 204k]
  ------------------
  598|       |
  599|       |        // Unicode 5.0
  600|      0|        case HB_SCRIPT_NKO: return hb_language_from_string("nko", -1); break;
  ------------------
  |  Branch (600:9): [True: 0, False: 204k]
  ------------------
  601|       |
  602|       |        // no representative language exists
  603|   102k|        default: return HB_LANGUAGE_INVALID; break;
  ------------------
  |  |  334|   102k|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  ------------------
  |  Branch (603:9): [True: 102k, False: 102k]
  ------------------
  604|   204k|    }
  605|   204k|}
ass_shaper.c:set_run_features:
  189|   204k|{
  190|       |    // enable vertical substitutions for @font runs
  191|   204k|    if (info->font->desc.vertical)
  ------------------
  |  Branch (191:9): [True: 0, False: 204k]
  ------------------
  192|      0|        shaper->features[VERT].value = shaper->features[VKNA].value = 1;
  193|   204k|    else
  194|   204k|        shaper->features[VERT].value = shaper->features[VKNA].value = 0;
  195|       |
  196|       |    // disable ligatures if horizontal spacing is non-standard
  197|   204k|    if (info->hspacing)
  ------------------
  |  Branch (197:9): [True: 0, False: 204k]
  ------------------
  198|      0|        shaper->features[LIGA].value = shaper->features[CLIG].value = 0;
  199|   204k|    else
  200|   204k|        shaper->features[LIGA].value = shaper->features[CLIG].value = 1;
  201|   204k|}
ass_shaper.c:shape_harfbuzz_process_run:
  642|   204k|{
  643|   204k|    int j;
  644|   204k|    int num_glyphs = hb_buffer_get_length(buf);
  645|   204k|    hb_glyph_info_t *glyph_info = hb_buffer_get_glyph_infos(buf, NULL);
  646|   204k|    hb_glyph_position_t *pos    = hb_buffer_get_glyph_positions(buf, NULL);
  647|       |
  648|  3.13M|    for (j = 0; j < num_glyphs; j++) {
  ------------------
  |  Branch (648:17): [True: 2.93M, False: 204k]
  ------------------
  649|  2.93M|        unsigned idx = glyph_info[j].cluster + offset;
  650|  2.93M|        GlyphInfo *info = glyphs + idx;
  651|  2.93M|        GlyphInfo *root = info;
  652|       |
  653|       |        // if we have more than one glyph per cluster, allocate a new one
  654|       |        // and attach to the root glyph
  655|  2.93M|        if (!info->skip) {
  ------------------
  |  Branch (655:13): [True: 3, False: 2.93M]
  ------------------
  656|      3|            while (info->next)
  ------------------
  |  Branch (656:20): [True: 0, False: 3]
  ------------------
  657|      0|                info = info->next;
  658|      3|            info->next = malloc(sizeof(GlyphInfo));
  659|      3|            if (info->next) {
  ------------------
  |  Branch (659:17): [True: 3, False: 0]
  ------------------
  660|      3|                memcpy(info->next, info, sizeof(GlyphInfo));
  661|      3|                ass_cache_inc_ref(info->font);
  662|      3|                info = info->next;
  663|      3|                info->next = NULL;
  664|      3|            }
  665|      3|        }
  666|       |
  667|       |        // set position and advance
  668|  2.93M|        info->skip = false;
  669|  2.93M|        info->glyph_index = glyph_info[j].codepoint;
  670|  2.93M|        info->offset.x    = lrint(pos[j].x_offset * info->scale_x);
  671|  2.93M|        info->offset.y    = lrint(-pos[j].y_offset * info->scale_y);
  672|  2.93M|        info->advance.x   = lrint(pos[j].x_advance * info->scale_x);
  673|  2.93M|        info->advance.y   = lrint(-pos[j].y_advance * info->scale_y);
  674|       |
  675|       |        // accumulate advance in the root glyph
  676|  2.93M|        root->cluster_advance.x += info->advance.x;
  677|  2.93M|        root->cluster_advance.y += info->advance.y;
  678|  2.93M|    }
  679|   204k|}
ass_shaper.c:init_features:
  165|     33|{
  166|     33|    shaper->features = calloc(sizeof(hb_feature_t), NUM_FEATURES);
  ------------------
  |  |   40|     33|#define NUM_FEATURES 5
  ------------------
  167|     33|    if (!shaper->features)
  ------------------
  |  Branch (167:9): [True: 0, False: 33]
  ------------------
  168|      0|        return false;
  169|       |
  170|     33|    shaper->n_features = NUM_FEATURES;
  ------------------
  |  |   40|     33|#define NUM_FEATURES 5
  ------------------
  171|     33|    shaper->features[VERT].tag = HB_TAG('v', 'e', 'r', 't');
  ------------------
  |  |  179|     33|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  172|     33|    shaper->features[VERT].end = UINT_MAX;
  173|     33|    shaper->features[VKNA].tag = HB_TAG('v', 'k', 'n', 'a');
  ------------------
  |  |  179|     33|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  174|     33|    shaper->features[VKNA].end = UINT_MAX;
  175|     33|    shaper->features[KERN].tag = HB_TAG('k', 'e', 'r', 'n');
  ------------------
  |  |  179|     33|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  176|     33|    shaper->features[KERN].end = UINT_MAX;
  177|     33|    shaper->features[LIGA].tag = HB_TAG('l', 'i', 'g', 'a');
  ------------------
  |  |  179|     33|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  178|     33|    shaper->features[LIGA].end = UINT_MAX;
  179|     33|    shaper->features[CLIG].tag = HB_TAG('c', 'l', 'i', 'g');
  ------------------
  |  |  179|     33|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  180|     33|    shaper->features[CLIG].end = UINT_MAX;
  181|       |
  182|     33|    return true;
  183|     33|}

ass_strcasecmp:
   52|   584k|{
   53|   584k|    unsigned char a, b;
   54|       |
   55|  1.42M|    do {
   56|  1.42M|        a = lowertab[(unsigned char)*s1++];
   57|  1.42M|        b = lowertab[(unsigned char)*s2++];
   58|  1.42M|    } while (a && a == b);
  ------------------
  |  Branch (58:14): [True: 1.23M, False: 183k]
  |  Branch (58:19): [True: 837k, False: 401k]
  ------------------
   59|       |
   60|   584k|    return a - b;
   61|   584k|}
ass_strncasecmp:
   64|  2.39M|{
   65|  2.39M|    unsigned char a, b;
   66|  2.39M|    const char *last = s1 + n;
   67|       |
   68|  2.39M|    do {
   69|  2.39M|        a = lowertab[(unsigned char)*s1++];
   70|  2.39M|        b = lowertab[(unsigned char)*s2++];
   71|  2.39M|    } while (s1 < last && a && a == b);
  ------------------
  |  Branch (71:14): [True: 2.39M, False: 158]
  |  Branch (71:27): [True: 2.39M, False: 354]
  |  Branch (71:32): [True: 1.84k, False: 2.39M]
  ------------------
   72|       |
   73|  2.39M|    return a - b;
   74|  2.39M|}

ass_strtod.c:ass_isspace:
   28|   256k|{
   29|   256k|    return c == ' ' || c == '\t' || c == '\n' || c == '\v' ||
  ------------------
  |  Branch (29:12): [True: 0, False: 256k]
  |  Branch (29:24): [True: 0, False: 256k]
  |  Branch (29:37): [True: 0, False: 256k]
  |  Branch (29:50): [True: 0, False: 256k]
  ------------------
   30|   256k|           c == '\f' || c == '\r';
  ------------------
  |  Branch (30:12): [True: 0, False: 256k]
  |  Branch (30:25): [True: 0, False: 256k]
  ------------------
   31|   256k|}
ass_strtod.c:ass_isdigit:
   34|  6.34M|{
   35|  6.34M|    return c >= '0' && c <= '9';
  ------------------
  |  Branch (35:12): [True: 6.13M, False: 204k]
  |  Branch (35:24): [True: 6.08M, False: 51.4k]
  ------------------
   36|  6.34M|}

ass_strtod:
   95|   256k|{
   96|   256k|    int sign, fracExpSign, expSign;
   97|   256k|    double fraction, dblExp;
   98|   256k|    const double *d;
   99|   256k|    register const char *p;
  100|   256k|    register int c;
  101|   256k|    size_t exp = 0;         /* Exponent read from "EX" field. */
  102|   256k|    size_t fracExp;         /* Exponent that derives from the fractional
  103|       |                             * part.  Under normal circumstatnces, it is
  104|       |                             * the negative of the number of digits in F.
  105|       |                             * However, if I is very long, the last digits
  106|       |                             * of I get dropped (otherwise a long I with a
  107|       |                             * large negative exponent could cause an
  108|       |                             * unnecessary overflow on I alone).  In this
  109|       |                             * case, fracExp is incremented one for each
  110|       |                             * dropped digit. */
  111|   256k|    size_t mantSize;    /* Number of digits in mantissa. */
  112|   256k|    size_t decPt;       /* Number of mantissa digits BEFORE decimal
  113|       |                         * point. */
  114|   256k|    size_t leadZeros;   /* Number of leading zeros in mantissa. */
  115|   256k|    const char *pExp;       /* Temporarily holds location of exponent
  116|       |                             * in string. */
  117|       |
  118|       |    /*
  119|       |     * Strip off leading blanks and check for a sign.
  120|       |     */
  121|       |
  122|   256k|    p = string;
  123|   256k|    while (ass_isspace(*p)) {
  ------------------
  |  Branch (123:12): [True: 0, False: 256k]
  ------------------
  124|      0|        p += 1;
  125|      0|    }
  126|   256k|    if (*p == '-') {
  ------------------
  |  Branch (126:9): [True: 204k, False: 51.4k]
  ------------------
  127|   204k|        sign = 1;
  128|   204k|        p += 1;
  129|   204k|    } else {
  130|  51.4k|        if (*p == '+') {
  ------------------
  |  Branch (130:13): [True: 0, False: 51.4k]
  ------------------
  131|      0|            p += 1;
  132|      0|        }
  133|  51.4k|        sign = 0;
  134|  51.4k|    }
  135|       |
  136|       |    /*
  137|       |     * Count the number of digits in the mantissa (including the decimal
  138|       |     * point), and also locate the decimal point.
  139|       |     */
  140|       |
  141|   256k|    decPt = -1;
  142|   256k|    leadZeros = -1;
  143|  6.08M|    for (mantSize = 0; ; mantSize += 1)
  144|  6.34M|    {
  145|  6.34M|        c = *p;
  146|  6.34M|        if (!ass_isdigit(c)) {
  ------------------
  |  Branch (146:13): [True: 256k, False: 6.08M]
  ------------------
  147|   256k|            if ((c != '.') || (decPt != (size_t) -1)) {
  ------------------
  |  Branch (147:17): [True: 256k, False: 11]
  |  Branch (147:31): [True: 0, False: 11]
  ------------------
  148|   256k|                break;
  149|   256k|            }
  150|     11|            decPt = mantSize;
  151|  6.08M|        } else if ((c != '0') && (leadZeros == (size_t) -1)) {
  ------------------
  |  Branch (151:20): [True: 206k, False: 5.87M]
  |  Branch (151:34): [True: 204k, False: 1.72k]
  ------------------
  152|   204k|            leadZeros = mantSize;
  153|   204k|        }
  154|  6.08M|        p += 1;
  155|  6.08M|    }
  156|       |
  157|       |    /*
  158|       |     * Now suck up the digits in the mantissa.  Use two integers to
  159|       |     * collect 9 digits each (this is faster than using floating-point).
  160|       |     * If the mantissa has more than 18 digits, ignore the extras, since
  161|       |     * they can't affect the value anyway.
  162|       |     */
  163|       |
  164|   256k|    if (leadZeros == (size_t) -1) {
  ------------------
  |  Branch (164:9): [True: 51.3k, False: 204k]
  ------------------
  165|  51.3k|        leadZeros = mantSize;
  166|  51.3k|    }
  167|   256k|    pExp  = p;
  168|   256k|    p -= mantSize - leadZeros;
  169|   256k|    if (decPt == (size_t) -1) {
  ------------------
  |  Branch (169:9): [True: 256k, False: 11]
  ------------------
  170|   256k|        decPt = mantSize;
  171|   256k|    } else {
  172|     11|        mantSize -= 1;      /* One of the digits was the point. */
  173|     11|        if (decPt < leadZeros) {
  ------------------
  |  Branch (173:13): [True: 7, False: 4]
  ------------------
  174|      7|            leadZeros -= 1;
  175|      7|        }
  176|     11|    }
  177|   256k|    if (mantSize - leadZeros > 18) {
  ------------------
  |  Branch (177:9): [True: 5, False: 256k]
  ------------------
  178|      5|        mantSize = leadZeros + 18;
  179|      5|    }
  180|   256k|    if (decPt < mantSize) {
  ------------------
  |  Branch (180:9): [True: 7, False: 256k]
  ------------------
  181|      7|        fracExpSign = 1;
  182|      7|        fracExp = mantSize - decPt;
  183|   256k|    } else {
  184|   256k|        fracExpSign = 0;
  185|   256k|        fracExp = decPt - mantSize;
  186|   256k|    }
  187|   256k|    if (mantSize == 0) {
  ------------------
  |  Branch (187:9): [True: 51.3k, False: 204k]
  ------------------
  188|  51.3k|        fraction = 0.0;
  189|  51.3k|        p = string;
  190|  51.3k|        goto done;
  191|   204k|    } else {
  192|   204k|        int frac1, frac2, m;
  193|   204k|        mantSize -= leadZeros;
  194|   204k|        m = mantSize;
  195|   204k|        frac1 = 0;
  196|   205k|        for ( ; m > 9; m -= 1)
  ------------------
  |  Branch (196:17): [True: 48, False: 204k]
  ------------------
  197|     48|        {
  198|     48|            c = *p;
  199|     48|            p += 1;
  200|     48|            if (c == '.') {
  ------------------
  |  Branch (200:17): [True: 0, False: 48]
  ------------------
  201|      0|                c = *p;
  202|      0|                p += 1;
  203|      0|            }
  204|     48|            frac1 = 10*frac1 + (c - '0');
  205|     48|        }
  206|   204k|        frac2 = 0;
  207|   614k|        for (; m > 0; m -= 1)
  ------------------
  |  Branch (207:16): [True: 409k, False: 204k]
  ------------------
  208|   409k|        {
  209|   409k|            c = *p;
  210|   409k|            p += 1;
  211|   409k|            if (c == '.') {
  ------------------
  |  Branch (211:17): [True: 0, False: 409k]
  ------------------
  212|      0|                c = *p;
  213|      0|                p += 1;
  214|      0|            }
  215|   409k|            frac2 = 10*frac2 + (c - '0');
  216|   409k|        }
  217|   204k|        fraction = (1.0e9 * frac1) + frac2;
  218|   204k|    }
  219|       |
  220|       |    /*
  221|       |     * Skim off the exponent.
  222|       |     */
  223|       |
  224|   204k|    p = pExp;
  225|   204k|    if ((*p == 'E') || (*p == 'e')) {
  ------------------
  |  Branch (225:9): [True: 0, False: 204k]
  |  Branch (225:24): [True: 3, False: 204k]
  ------------------
  226|      3|        size_t expLimit;    /* If exp > expLimit, appending another digit
  227|       |                             * to exp is guaranteed to make it too large.
  228|       |                             * If exp == expLimit, this may depend on
  229|       |                             * the exact digit, but in any case exp with
  230|       |                             * the digit appended and fracExp added will
  231|       |                             * still fit in size_t, even if it does
  232|       |                             * exceed maxExponent. */
  233|      3|        int expWraparound = 0;
  234|      3|        p += 1;
  235|      3|        if (*p == '-') {
  ------------------
  |  Branch (235:13): [True: 0, False: 3]
  ------------------
  236|      0|            expSign = 1;
  237|      0|            p += 1;
  238|      3|        } else {
  239|      3|            if (*p == '+') {
  ------------------
  |  Branch (239:17): [True: 0, False: 3]
  ------------------
  240|      0|                p += 1;
  241|      0|            }
  242|      3|            expSign = 0;
  243|      3|        }
  244|      3|        if (expSign == fracExpSign) {
  ------------------
  |  Branch (244:13): [True: 0, False: 3]
  ------------------
  245|      0|            if (maxExponent < fracExp) {
  ------------------
  |  Branch (245:17): [True: 0, False: 0]
  ------------------
  246|      0|                expLimit = 0;
  247|      0|            } else {
  248|      0|                expLimit = (maxExponent - fracExp) / 10;
  249|      0|            }
  250|      3|        } else {
  251|      3|            expLimit = fracExp / 10 + (fracExp % 10 + maxExponent) / 10;
  252|      3|        }
  253|      3|        while (ass_isdigit(*p)) {
  ------------------
  |  Branch (253:16): [True: 0, False: 3]
  ------------------
  254|      0|            if ((exp > expLimit) || expWraparound) {
  ------------------
  |  Branch (254:17): [True: 0, False: 0]
  |  Branch (254:37): [True: 0, False: 0]
  ------------------
  255|      0|                do {
  256|      0|                    p += 1;
  257|      0|                } while (ass_isdigit(*p));
  ------------------
  |  Branch (257:26): [True: 0, False: 0]
  ------------------
  258|      0|                goto expOverflow;
  259|      0|            } else if (exp > ((size_t) -1 - (*p - '0')) / 10) {
  ------------------
  |  Branch (259:24): [True: 0, False: 0]
  ------------------
  260|      0|                expWraparound = 1;
  261|      0|            }
  262|      0|            exp = exp * 10u + (*p - '0');
  263|      0|            p += 1;
  264|      0|        }
  265|      3|        if (expSign == fracExpSign) {
  ------------------
  |  Branch (265:13): [True: 0, False: 3]
  ------------------
  266|      0|            exp = fracExp + exp;
  267|      3|        } else if ((fracExp <= exp) || expWraparound) {
  ------------------
  |  Branch (267:20): [True: 0, False: 3]
  |  Branch (267:40): [True: 0, False: 3]
  ------------------
  268|      0|            exp = exp - fracExp;
  269|      3|        } else {
  270|      3|            exp = fracExp - exp;
  271|      3|            expSign = fracExpSign;
  272|      3|        }
  273|   204k|    } else {
  274|   204k|        exp = fracExp;
  275|   204k|        expSign = fracExpSign;
  276|   204k|    }
  277|       |
  278|       |    /*
  279|       |     * Generate a floating-point number that represents the exponent.
  280|       |     * Do this by processing the exponent one bit at a time to combine
  281|       |     * many powers of 2 of 10. Then combine the exponent with the
  282|       |     * fraction.
  283|       |     */
  284|       |
  285|   204k|    if (exp > maxExponent) {
  ------------------
  |  Branch (285:9): [True: 11, False: 204k]
  ------------------
  286|     11|expOverflow:
  287|     11|        exp = maxExponent;
  288|     11|        if (fraction != 0.0) {
  ------------------
  |  Branch (288:13): [True: 10, False: 1]
  ------------------
  289|     10|            errno = ERANGE;
  290|     10|        }
  291|     11|    }
  292|       |    /* Prefer positive powers of 10 for increased precision, especially
  293|       |     * for small powers that are represented exactly in floating-point. */
  294|   204k|    if ((exp <= DBL_MAX_10_EXP) || !expSign) {
  ------------------
  |  Branch (294:9): [True: 204k, False: 11]
  |  Branch (294:36): [True: 4, False: 7]
  ------------------
  295|   204k|        d = powersOf10;
  296|   204k|    } else {
  297|       |        /* The floating-point format supports more negative exponents
  298|       |         * than positive, or perhaps the result is a subnormal number. */
  299|      7|        if (exp > -DBL_MIN_10_EXP) {
  ------------------
  |  Branch (299:13): [True: 7, False: 0]
  ------------------
  300|       |            /* The result might be a valid subnormal number, but the
  301|       |             * exponent underflows.  Tweak fraction so that it is below
  302|       |             * 1.0 first, so that if the exponent still underflows after
  303|       |             * that, the result is sure to underflow as well. */
  304|      7|            exp -= mantSize;
  305|      7|            dblExp = 1.0;
  306|     26|            for (d = powersOf10; mantSize != 0; mantSize >>= 1, d += 1) {
  ------------------
  |  Branch (306:34): [True: 19, False: 7]
  ------------------
  307|     19|                if (mantSize & 01) {
  ------------------
  |  Branch (307:21): [True: 11, False: 8]
  ------------------
  308|     11|                    dblExp *= *d;
  309|     11|                }
  310|     19|            }
  311|      7|            fraction /= dblExp;
  312|      7|        }
  313|      7|        d = negPowOf10;
  314|      7|        expSign = 0;
  315|      7|    }
  316|   204k|    dblExp = 1.0;
  317|   205k|    for (; exp != 0; exp >>= 1, d += 1) {
  ------------------
  |  Branch (317:12): [True: 99, False: 204k]
  ------------------
  318|     99|        if (exp & 01) {
  ------------------
  |  Branch (318:13): [True: 88, False: 11]
  ------------------
  319|     88|            dblExp *= *d;
  320|     88|        }
  321|     99|    }
  322|   204k|    if (expSign) {
  ------------------
  |  Branch (322:9): [True: 0, False: 204k]
  ------------------
  323|      0|        fraction /= dblExp;
  324|   204k|    } else {
  325|   204k|        fraction *= dblExp;
  326|   204k|    }
  327|       |
  328|   256k|done:
  329|   256k|    if (endPtr != NULL) {
  ------------------
  |  Branch (329:9): [True: 256k, False: 11]
  ------------------
  330|   256k|        *endPtr = (char *) p;
  331|   256k|    }
  332|       |
  333|   256k|    if (sign) {
  ------------------
  |  Branch (333:9): [True: 204k, False: 51.4k]
  ------------------
  334|   204k|        return -fraction;
  335|   204k|    }
  336|  51.4k|    return fraction;
  337|   256k|}

ass_aligned_alloc:
   60|    687|{
   61|    687|    assert(!(alignment & (alignment - 1))); // alignment must be power of 2
   62|    687|    if (size >= SIZE_MAX - alignment - sizeof(void *))
  ------------------
  |  Branch (62:9): [True: 0, False: 687]
  ------------------
   63|      0|        return NULL;
   64|    687|    char *allocation = zero ? calloc(size + sizeof(void *) + alignment - 1, 1)
  ------------------
  |  Branch (64:24): [True: 36, False: 651]
  ------------------
   65|    687|                            : malloc(size + sizeof(void *) + alignment - 1);
   66|    687|    if (!allocation)
  ------------------
  |  Branch (66:9): [True: 0, False: 687]
  ------------------
   67|      0|        return NULL;
   68|    687|    char *ptr = allocation + sizeof(void *);
   69|    687|    unsigned int misalign = (uintptr_t)ptr & (alignment - 1);
   70|    687|    if (misalign)
  ------------------
  |  Branch (70:9): [True: 687, False: 0]
  ------------------
   71|    687|        ptr += alignment - misalign;
   72|    687|    *((void **)ptr - 1) = allocation;
   73|    687|    return ptr;
   74|    687|}
ass_aligned_free:
   77|   307k|{
   78|   307k|    if (ptr)
  ------------------
  |  Branch (78:9): [True: 687, False: 307k]
  ------------------
   79|    687|        free(*((void **)ptr - 1));
   80|   307k|}
ass_realloc_array:
   90|  51.7k|{
   91|  51.7k|    if (nmemb > (SIZE_MAX / size))
  ------------------
  |  Branch (91:9): [True: 0, False: 51.7k]
  ------------------
   92|      0|        return NULL;
   93|  51.7k|    size *= nmemb;
   94|  51.7k|    if (size < 1)
  ------------------
  |  Branch (94:9): [True: 0, False: 51.7k]
  ------------------
   95|      0|        size = 1;
   96|       |
   97|  51.7k|    return realloc(ptr, size);
   98|  51.7k|}
ass_try_realloc_array:
  106|    569|{
  107|    569|    void *new_ptr = ass_realloc_array(ptr, nmemb, size);
  108|    569|    if (new_ptr) {
  ------------------
  |  Branch (108:9): [True: 569, False: 0]
  ------------------
  109|    569|        errno = 0;
  110|    569|        return new_ptr;
  111|    569|    } else {
  112|      0|        errno = ENOMEM;
  113|      0|        return ptr;
  114|      0|    }
  115|    569|}
ass_msg:
  118|   215k|{
  119|   215k|    va_list va;
  120|   215k|    va_start(va, fmt);
  121|   215k|    priv->msg_callback(lvl, fmt, va, priv->msg_callback_data);
  122|   215k|    va_end(va);
  123|   215k|}
ass_utf8_get_char:
  126|  2.72M|{
  127|  2.72M|    uint8_t *strp = (uint8_t *) * str;
  128|  2.72M|    unsigned c = *strp++;
  129|  2.72M|    unsigned mask = 0x80;
  130|  2.72M|    int len = -1;
  131|  3.32M|    while (c & mask) {
  ------------------
  |  Branch (131:12): [True: 599k, False: 2.72M]
  ------------------
  132|   599k|        mask >>= 1;
  133|   599k|        len++;
  134|   599k|    }
  135|  2.72M|    if (len <= 0 || len > 4)
  ------------------
  |  Branch (135:9): [True: 2.62M, False: 103k]
  |  Branch (135:21): [True: 414, False: 102k]
  ------------------
  136|  2.62M|        goto no_utf8;
  137|   102k|    c &= mask - 1;
  138|   102k|    while ((*strp & 0xc0) == 0x80) {
  ------------------
  |  Branch (138:12): [True: 21, False: 102k]
  ------------------
  139|     21|        if (len-- <= 0)
  ------------------
  |  Branch (139:13): [True: 0, False: 21]
  ------------------
  140|      0|            goto no_utf8;
  141|     21|        c = (c << 6) | (*strp++ & 0x3f);
  142|     21|    }
  143|   102k|    if (len)
  ------------------
  |  Branch (143:9): [True: 102k, False: 9]
  ------------------
  144|   102k|        goto no_utf8;
  145|      9|    *str = (char *) strp;
  146|      9|    return c;
  147|       |
  148|  2.72M|  no_utf8:
  149|  2.72M|    strp = (uint8_t *) * str;
  150|  2.72M|    c = *strp++;
  151|  2.72M|    *str = (char *) strp;
  152|  2.72M|    return c;
  153|   102k|}
ass_lookup_style:
  254|     52|{
  255|     52|    int i;
  256|       |    // '*' seem to mean literally nothing;
  257|       |    // VSFilter removes them as soon as it can
  258|     52|    while (*name == '*')
  ------------------
  |  Branch (258:12): [True: 0, False: 52]
  ------------------
  259|      0|        ++name;
  260|       |    // VSFilter then normalizes the case of "Default"
  261|       |    // (only in contexts where this function is called)
  262|     52|    if (ass_strcasecmp(name, "Default") == 0)
  ------------------
  |  Branch (262:9): [True: 0, False: 52]
  ------------------
  263|      0|        name = "Default";
  264|    103|    for (i = track->n_styles - 1; i >= 0; --i) {
  ------------------
  |  Branch (264:35): [True: 55, False: 48]
  ------------------
  265|     55|        if (strcmp(track->styles[i].Name, name) == 0)
  ------------------
  |  Branch (265:13): [True: 4, False: 51]
  ------------------
  266|      4|            return i;
  267|     55|    }
  268|     48|    i = track->default_style;
  269|     48|    ass_msg(track->library, MSGL_WARN,
  ------------------
  |  |   41|     48|#define MSGL_WARN 2
  ------------------
  270|     48|            "[%p]: Warning: no style named '%s' found, using '%s'",
  271|     48|            track, name, track->styles[i].Name);
  272|     48|    return i;
  273|     52|}

ass.c:skip_spaces:
  108|  1.70M|{
  109|  1.70M|    char *p = *str;
  110|  1.70M|    while ((*p == ' ') || (*p == '\t'))
  ------------------
  |  Branch (110:12): [True: 995, False: 1.70M]
  |  Branch (110:27): [True: 0, False: 1.70M]
  ------------------
  111|    995|        ++p;
  112|  1.70M|    *str = p;
  113|  1.70M|}
ass.c:rskip_spaces:
  116|   469k|{
  117|   469k|    char *p = *str;
  118|   469k|    while ((p > limit) && ((p[-1] == ' ') || (p[-1] == '\t')))
  ------------------
  |  Branch (118:12): [True: 469k, False: 0]
  |  Branch (118:28): [True: 0, False: 469k]
  |  Branch (118:46): [True: 0, False: 469k]
  ------------------
  119|      0|        --p;
  120|   469k|    *str = p;
  121|   469k|}
ass_render.c:double_to_d6:
  191|  23.2M|{
  192|  23.2M|    return lrint(x * 64);
  193|  23.2M|}
ass_render.c:ass_string_equal:
   70|  2.72M|{
   71|  2.72M|    return str1.len == str2.len && !memcmp(str1.str, str2.str, str1.len);
  ------------------
  |  Branch (71:12): [True: 2.72M, False: 0]
  |  Branch (71:36): [True: 2.72M, False: 0]
  ------------------
   72|  2.72M|}
ass_render.c:d6_to_double:
  187|  19.7M|{
  188|  19.7M|    return x / 64.;
  189|  19.7M|}
ass_cache.c:ass_string_equal:
   70|   512k|{
   71|   512k|    return str1.len == str2.len && !memcmp(str1.str, str2.str, str1.len);
  ------------------
  |  Branch (71:12): [True: 512k, False: 15]
  |  Branch (71:36): [True: 512k, False: 0]
  ------------------
   72|   512k|}
ass_cache.c:ass_copy_string:
   60|    201|{
   61|    201|    char *buf = malloc(src.len + 1);
   62|    201|    if (buf) {
  ------------------
  |  Branch (62:9): [True: 201, False: 0]
  ------------------
   63|    201|        memcpy(buf, src.str, src.len);
   64|    201|        buf[src.len] = '\0';
   65|    201|    }
   66|    201|    return buf;
   67|    201|}
ass_font.c:double_to_d6:
  191|   205k|{
  192|   205k|    return lrint(x * 64);
  193|   205k|}
ass_parse.c:skip_spaces:
  108|  3.94M|{
  109|  3.94M|    char *p = *str;
  110|  3.94M|    while ((*p == ' ') || (*p == '\t'))
  ------------------
  |  Branch (110:12): [True: 0, False: 3.94M]
  |  Branch (110:27): [True: 0, False: 3.94M]
  ------------------
  111|      0|        ++p;
  112|  3.94M|    *str = p;
  113|  3.94M|}
ass_parse.c:rskip_spaces:
  116|  3.32M|{
  117|  3.32M|    char *p = *str;
  118|  3.32M|    while ((p > limit) && ((p[-1] == ' ') || (p[-1] == '\t')))
  ------------------
  |  Branch (118:12): [True: 1.99M, False: 1.33M]
  |  Branch (118:28): [True: 8, False: 1.99M]
  |  Branch (118:46): [True: 0, False: 1.99M]
  ------------------
  119|      8|        --p;
  120|  3.32M|    *str = p;
  121|  3.32M|}
ass_parse.c:mystrtod:
  218|   256k|{
  219|   256k|    char *start = *p;
  220|   256k|    *res = ass_strtod(*p, p);
  221|   256k|    return *p != start;
  222|   256k|}
ass_parse.c:mystrtoi32:
  225|  1.48M|{
  226|  1.48M|    char *start = *p;
  227|  1.48M|    long long temp_res = strtoll(*p, p, base);
  228|  1.48M|    *res = FFMINMAX(temp_res, INT32_MIN, INT32_MAX);
  ------------------
  |  |   48|  1.48M|#define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
  |  |  ------------------
  |  |  |  |   47|  2.96M|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (47:21): [True: 0, False: 1.48M]
  |  |  |  |  |  Branch (47:22): [True: 1.48M, False: 52]
  |  |  |  |  |  Branch (47:40): [True: 1.48M, False: 52]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  229|  1.48M|    return *p != start;
  230|  1.48M|}
ass_parse.c:ass_bswap32:
  153|  9.15M|{
  154|       |#ifdef _MSC_VER
  155|       |    return _byteswap_ulong(x);
  156|       |#else
  157|  9.15M|    return (x & 0x000000FF) << 24 | (x & 0x0000FF00) <<  8 |
  158|  9.15M|           (x & 0x00FF0000) >>  8 | (x & 0xFF000000) >> 24;
  159|  9.15M|#endif
  160|  9.15M|}
ass_bitmap.c:ass_align:
  146|    654|{
  147|    654|    if (s > SIZE_MAX - (alignment - 1))
  ------------------
  |  Branch (147:9): [True: 0, False: 654]
  ------------------
  148|      0|        return s;
  149|    654|    return (s + (alignment - 1)) & ~(alignment - 1);
  150|    654|}

ass_add_bitmaps_c:
   35|   443k|{
   36|   443k|    uint8_t *end = dst + dst_stride * height;
   37|  7.54M|    while (dst < end) {
  ------------------
  |  Branch (37:12): [True: 7.09M, False: 443k]
  ------------------
   38|   120M|        for (size_t x = 0; x < width; x++) {
  ------------------
  |  Branch (38:28): [True: 113M, False: 7.09M]
  ------------------
   39|   113M|            unsigned out = dst[x] + src[x];
   40|   113M|            dst[x] = FFMIN(out, 255);
  ------------------
  |  |   47|   113M|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 6.22M, False: 107M]
  |  |  ------------------
  ------------------
   41|   113M|        }
   42|  7.09M|        dst += dst_stride;
   43|  7.09M|        src += src_stride;
   44|  7.09M|    }
   45|   443k|}

ass_fill_generic_tile16_c:
  140|    897|{
  141|    897|    int16_t res[TILE_SIZE][TILE_SIZE] = {0};
  142|    897|    int16_t delta[TILE_SIZE + 2] = {0};
  143|       |
  144|    897|    const struct segment *end = line + n_lines;
  145|  36.8k|    for (; line != end; ++line) {
  ------------------
  |  Branch (145:12): [True: 35.9k, False: 897]
  ------------------
  146|  35.9k|        assert(line->y_min >= 0 && line->y_min < 64 << TILE_ORDER);
  147|  35.9k|        assert(line->y_max > 0 && line->y_max <= 64 << TILE_ORDER);
  148|  35.9k|        assert(line->y_min <= line->y_max);
  149|       |
  150|  35.9k|        int16_t up_delta = line->flags & SEGFLAG_DN ? 4 : 0;
  ------------------
  |  Branch (150:28): [True: 20.0k, False: 15.8k]
  ------------------
  151|  35.9k|        int16_t dn_delta = up_delta;
  152|  35.9k|        if (!line->x_min && (line->flags & SEGFLAG_EXACT_LEFT)) dn_delta ^= 4;
  ------------------
  |  Branch (152:13): [True: 0, False: 35.9k]
  |  Branch (152:29): [True: 0, False: 0]
  ------------------
  153|  35.9k|        if (line->flags & SEGFLAG_UL_DR) {
  ------------------
  |  Branch (153:13): [True: 17.9k, False: 17.9k]
  ------------------
  154|  17.9k|            int16_t tmp = up_delta;
  155|  17.9k|            up_delta = dn_delta;
  156|  17.9k|            dn_delta = tmp;
  157|  17.9k|        }
  158|       |
  159|  35.9k|        int up = line->y_min >> 6, dn = line->y_max >> 6;
  160|  35.9k|        int16_t up_pos = line->y_min & 63;
  161|  35.9k|        int16_t up_delta1 = up_delta * up_pos;
  162|  35.9k|        int16_t dn_pos = line->y_max & 63;
  163|  35.9k|        int16_t dn_delta1 = dn_delta * dn_pos;
  164|  35.9k|        delta[up + 1] -= up_delta1;
  165|  35.9k|        delta[up] -= (up_delta << 6) - up_delta1;
  166|  35.9k|        delta[dn + 1] += dn_delta1;
  167|  35.9k|        delta[dn] += (dn_delta << 6) - dn_delta1;
  168|  35.9k|        if (line->y_min == line->y_max)
  ------------------
  |  Branch (168:13): [True: 5.20k, False: 30.7k]
  ------------------
  169|  5.20k|            continue;
  170|       |
  171|  30.7k|        int16_t a = RESCALE_AB(line->a, line->scale);
  ------------------
  |  |   31|  30.7k|    (((ab) * (int64_t) (scale) + ((int64_t) 1 << (45 + TILE_ORDER))) >> (46 + TILE_ORDER))
  |  |  ------------------
  |  |  |  |   21|  30.7k|#define TILE_ORDER    4
  |  |  ------------------
  |  |                   (((ab) * (int64_t) (scale) + ((int64_t) 1 << (45 + TILE_ORDER))) >> (46 + TILE_ORDER))
  |  |  ------------------
  |  |  |  |   21|  30.7k|#define TILE_ORDER    4
  |  |  ------------------
  ------------------
  172|  30.7k|        int16_t b = RESCALE_AB(line->b, line->scale);
  ------------------
  |  |   31|  30.7k|    (((ab) * (int64_t) (scale) + ((int64_t) 1 << (45 + TILE_ORDER))) >> (46 + TILE_ORDER))
  |  |  ------------------
  |  |  |  |   21|  30.7k|#define TILE_ORDER    4
  |  |  ------------------
  |  |                   (((ab) * (int64_t) (scale) + ((int64_t) 1 << (45 + TILE_ORDER))) >> (46 + TILE_ORDER))
  |  |  ------------------
  |  |  |  |   21|  30.7k|#define TILE_ORDER    4
  |  |  ------------------
  ------------------
  173|  30.7k|        int16_t c = RESCALE_C(line->c, line->scale) - (a >> 1) - b * up;
  ------------------
  |  |   33|  30.7k|    (((int32_t) ((c) >> (7 + TILE_ORDER)) * (int64_t) (scale) + ((int64_t) 1 << 44)) >> 45)
  |  |  ------------------
  |  |  |  |   21|  30.7k|#define TILE_ORDER    4
  |  |  ------------------
  ------------------
  174|       |
  175|  30.7k|        int16_t va[TILE_SIZE];
  176|   522k|        for (int x = 0; x < TILE_SIZE; x++)
  ------------------
  |  |   27|   522k|#define TILE_SIZE  16
  ------------------
  |  Branch (176:25): [True: 491k, False: 30.7k]
  ------------------
  177|   491k|            va[x] = a * x;
  178|  30.7k|        int16_t abs_a = a < 0 ? -a : a;
  ------------------
  |  Branch (178:25): [True: 15.8k, False: 14.8k]
  ------------------
  179|  30.7k|        int16_t abs_b = b < 0 ? -b : b;
  ------------------
  |  Branch (179:25): [True: 12.7k, False: 17.9k]
  ------------------
  180|  30.7k|        int16_t dc = (FFMIN(abs_a, abs_b) + 2) >> 2;
  ------------------
  |  |   47|  30.7k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 17.5k, False: 13.1k]
  |  |  ------------------
  ------------------
  181|  30.7k|        int16_t base = FULL_VALUE / 2 - (b >> 1);
  ------------------
  |  |   29|  30.7k|#define FULL_VALUE  (1 << (14 - TILE_ORDER))
  |  |  ------------------
  |  |  |  |   21|  30.7k|#define TILE_ORDER    4
  |  |  ------------------
  ------------------
  182|  30.7k|        int16_t dc1 = base + dc;
  183|  30.7k|        int16_t dc2 = base - dc;
  184|       |
  185|  30.7k|        if (up_pos) {
  ------------------
  |  Branch (185:13): [True: 30.0k, False: 645]
  ------------------
  186|  30.0k|            if (dn == up) {
  ------------------
  |  Branch (186:17): [True: 12.6k, False: 17.4k]
  ------------------
  187|  12.6k|                SUFFIX(update_border_line)(res[up], abs_a, va, b, abs_b, c, up_pos, dn_pos);
  ------------------
  |  |   20|  12.6k|#define SUFFIX(name)  name ## 16_c
  ------------------
  188|  12.6k|                continue;
  189|  12.6k|            }
  190|  17.4k|            SUFFIX(update_border_line)(res[up], abs_a, va, b, abs_b, c, up_pos, 64);
  ------------------
  |  |   20|  17.4k|#define SUFFIX(name)  name ## 16_c
  ------------------
  191|  17.4k|            up++;
  192|  17.4k|            c -= b;
  193|  17.4k|        }
  194|  24.2k|        for (int y = up; y < dn; y++) {
  ------------------
  |  Branch (194:26): [True: 6.14k, False: 18.0k]
  ------------------
  195|   104k|            for (int x = 0; x < TILE_SIZE; x++) {
  ------------------
  |  |   27|   104k|#define TILE_SIZE  16
  ------------------
  |  Branch (195:29): [True: 98.3k, False: 6.14k]
  ------------------
  196|  98.3k|                int16_t c1 = c - va[x] + dc1;
  197|  98.3k|                int16_t c2 = c - va[x] + dc2;
  198|  98.3k|                c1 = FFMINMAX(c1, 0, FULL_VALUE);
  ------------------
  |  |   48|  98.3k|#define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
  |  |  ------------------
  |  |  |  |   47|   196k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (47:21): [True: 45.4k, False: 52.9k]
  |  |  |  |  |  Branch (47:22): [True: 51.6k, False: 46.6k]
  |  |  |  |  |  Branch (47:40): [True: 6.25k, False: 46.6k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  199|  98.3k|                c2 = FFMINMAX(c2, 0, FULL_VALUE);
  ------------------
  |  |   48|  98.3k|#define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
  |  |  ------------------
  |  |  |  |   47|   196k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (47:21): [True: 45.0k, False: 53.3k]
  |  |  |  |  |  Branch (47:22): [True: 51.2k, False: 47.0k]
  |  |  |  |  |  Branch (47:40): [True: 6.24k, False: 47.0k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  200|  98.3k|                res[y][x] += (c1 + c2) >> (7 - TILE_ORDER);
  ------------------
  |  |   21|  98.3k|#define TILE_ORDER    4
  ------------------
  201|  98.3k|            }
  202|  6.14k|            c -= b;
  203|  6.14k|        }
  204|  18.0k|        if (dn_pos)
  ------------------
  |  Branch (204:13): [True: 17.4k, False: 611]
  ------------------
  205|  17.4k|            SUFFIX(update_border_line)(res[dn], abs_a, va, b, abs_b, c, 0, dn_pos);
  ------------------
  |  |   20|  17.4k|#define SUFFIX(name)  name ## 16_c
  ------------------
  206|  18.0k|    }
  207|       |
  208|    897|    int16_t cur = 256 * (int8_t) winding;
  209|  15.2k|    for (int y = 0; y < TILE_SIZE; y++) {
  ------------------
  |  |   27|  15.2k|#define TILE_SIZE  16
  ------------------
  |  Branch (209:21): [True: 14.3k, False: 897]
  ------------------
  210|  14.3k|        cur += delta[y];
  211|   243k|        for (int x = 0; x < TILE_SIZE; x++) {
  ------------------
  |  |   27|   243k|#define TILE_SIZE  16
  ------------------
  |  Branch (211:25): [True: 229k, False: 14.3k]
  ------------------
  212|   229k|            int16_t val = res[y][x] + cur, neg_val = -val;
  213|   229k|            val = (val > neg_val ? val : neg_val);
  ------------------
  |  Branch (213:20): [True: 24.1k, False: 205k]
  ------------------
  214|   229k|            buf[x] = FFMIN(val, 255);
  ------------------
  |  |   47|   229k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 18.3k, False: 211k]
  |  |  ------------------
  ------------------
  215|   229k|        }
  216|  14.3k|        buf += stride;
  217|  14.3k|    }
  218|    897|}
ass_merge_tile16_c:
  222|    297|{
  223|  5.04k|    for (int y = 0; y < TILE_SIZE; y++) {
  ------------------
  |  |   27|  5.04k|#define TILE_SIZE  16
  ------------------
  |  Branch (223:21): [True: 4.75k, False: 297]
  ------------------
  224|  80.7k|        for (int x = 0; x < TILE_SIZE; x++)
  ------------------
  |  |   27|  80.7k|#define TILE_SIZE  16
  ------------------
  |  Branch (224:25): [True: 76.0k, False: 4.75k]
  ------------------
  225|  76.0k|            buf[x] = FFMAX(buf[x], tile[x]);
  ------------------
  |  |   46|  76.0k|#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  |  |  ------------------
  |  |  |  Branch (46:21): [True: 12.6k, False: 63.4k]
  |  |  ------------------
  ------------------
  226|  4.75k|        buf += stride;
  227|  4.75k|        tile += TILE_SIZE;
  ------------------
  |  |   27|  4.75k|#define TILE_SIZE  16
  ------------------
  228|  4.75k|    }
  229|    297|}
c_rasterizer.c:update_border_line16_c:
  114|  47.5k|{
  115|  47.5k|    int16_t size = dn - up;
  116|  47.5k|    int16_t w = FULL_VALUE + (size << (8 - TILE_ORDER)) - abs_a;
  ------------------
  |  |   29|  47.5k|#define FULL_VALUE  (1 << (14 - TILE_ORDER))
  |  |  ------------------
  |  |  |  |   21|  47.5k|#define TILE_ORDER    4
  |  |  ------------------
  ------------------
                  int16_t w = FULL_VALUE + (size << (8 - TILE_ORDER)) - abs_a;
  ------------------
  |  |   21|  47.5k|#define TILE_ORDER    4
  ------------------
  117|  47.5k|    w = FFMIN(w, FULL_VALUE) << (2 * TILE_ORDER - 5);
  ------------------
  |  |   47|  47.5k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 2.78k, False: 44.7k]
  |  |  ------------------
  ------------------
                  w = FFMIN(w, FULL_VALUE) << (2 * TILE_ORDER - 5);
  ------------------
  |  |   21|  47.5k|#define TILE_ORDER    4
  ------------------
  118|       |
  119|  47.5k|    int16_t dc_b = abs_b * (int32_t) size >> 6;
  120|  47.5k|    int16_t dc = (FFMIN(abs_a, dc_b) + 2) >> 2;
  ------------------
  |  |   47|  47.5k|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  ------------------
  |  |  |  Branch (47:21): [True: 44.9k, False: 2.64k]
  |  |  ------------------
  ------------------
  121|       |
  122|  47.5k|    int16_t base = (int32_t) b * (int16_t) (up + dn) >> 7;
  123|  47.5k|    int16_t offs1 = size - ((base + dc) * (int32_t) w >> 16);
  124|  47.5k|    int16_t offs2 = size - ((base - dc) * (int32_t) w >> 16);
  125|       |
  126|  47.5k|    size <<= 1;
  127|   808k|    for (int x = 0; x < TILE_SIZE; x++) {
  ------------------
  |  |   27|   808k|#define TILE_SIZE  16
  ------------------
  |  Branch (127:21): [True: 760k, False: 47.5k]
  ------------------
  128|   760k|        int16_t cw = (c - va[x]) * (int32_t) w >> 16;
  129|   760k|        int16_t c1 = cw + offs1;
  130|   760k|        int16_t c2 = cw + offs2;
  131|   760k|        c1 = FFMINMAX(c1, 0, size);
  ------------------
  |  |   48|   760k|#define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
  |  |  ------------------
  |  |  |  |   47|  1.52M|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (47:21): [True: 382k, False: 378k]
  |  |  |  |  |  Branch (47:22): [True: 424k, False: 336k]
  |  |  |  |  |  Branch (47:40): [True: 42.3k, False: 336k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  132|   760k|        c2 = FFMINMAX(c2, 0, size);
  ------------------
  |  |   48|   760k|#define FFMINMAX(c,a,b) FFMIN(FFMAX(c, a), b)
  |  |  ------------------
  |  |  |  |   47|  1.52M|#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (47:21): [True: 389k, False: 371k]
  |  |  |  |  |  Branch (47:22): [True: 431k, False: 329k]
  |  |  |  |  |  Branch (47:40): [True: 42.2k, False: 329k]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  133|   760k|        res[x] += c1 + c2;
  134|   760k|    }
  135|  47.5k|}

ass_cache.c:wyhash:
  118|  98.1M|static inline uint64_t wyhash(const void *key, size_t len, uint64_t seed, const uint64_t *secret){
  119|  98.1M|  const uint8_t *p=(const uint8_t *)key; seed^=*secret;	uint64_t	a,	b;
  120|  98.1M|  if(_likely_(len<=16)){
  ------------------
  |  |   37|  98.1M|  #define _likely_(x)  __builtin_expect(x,1)
  |  |  ------------------
  |  |  |  Branch (37:24): [True: 98.1M, False: 816]
  |  |  ------------------
  ------------------
  121|  98.1M|    if(_likely_(len>=4)){ a=(_wyr4(p)<<32)|_wyr4(p+((len>>3)<<2)); b=(_wyr4(p+len-4)<<32)|_wyr4(p+len-4-((len>>3)<<2)); }
  ------------------
  |  |   37|  98.1M|  #define _likely_(x)  __builtin_expect(x,1)
  |  |  ------------------
  |  |  |  Branch (37:24): [True: 98.1M, False: 0]
  |  |  ------------------
  ------------------
  122|      0|    else if(_likely_(len>0)){ a=_wyr3(p,len); b=0;}
  ------------------
  |  |   37|      0|  #define _likely_(x)  __builtin_expect(x,1)
  |  |  ------------------
  |  |  |  Branch (37:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  123|      0|    else a=b=0;
  124|  98.1M|  }
  125|    816|  else{
  126|    816|    size_t i=len; 
  127|    816|    if(_unlikely_(i>48)){
  ------------------
  |  |   38|    816|  #define _unlikely_(x)  __builtin_expect(x,0)
  |  |  ------------------
  |  |  |  Branch (38:26): [True: 600, False: 216]
  |  |  ------------------
  ------------------
  128|    600|      uint64_t see1=seed, see2=seed;
  129|  1.61M|      do{
  130|  1.61M|        seed=_wymix(_wyr8(p)^secret[1],_wyr8(p+8)^seed);
  131|  1.61M|        see1=_wymix(_wyr8(p+16)^secret[2],_wyr8(p+24)^see1);
  132|  1.61M|        see2=_wymix(_wyr8(p+32)^secret[3],_wyr8(p+40)^see2);
  133|  1.61M|        p+=48; i-=48;
  134|  1.61M|      }while(_likely_(i>48));
  ------------------
  |  |   37|  1.61M|  #define _likely_(x)  __builtin_expect(x,1)
  |  |  ------------------
  |  |  |  Branch (37:24): [True: 1.61M, False: 600]
  |  |  ------------------
  ------------------
  135|    600|      seed^=see1^see2;
  136|    600|    }
  137|  1.53k|    while(_unlikely_(i>16)){  seed=_wymix(_wyr8(p)^secret[1],_wyr8(p+8)^seed);  i-=16; p+=16;  }
  ------------------
  |  |   38|  1.53k|  #define _unlikely_(x)  __builtin_expect(x,0)
  |  |  ------------------
  |  |  |  Branch (38:26): [True: 717, False: 816]
  |  |  ------------------
  ------------------
  138|    816|    a=_wyr8(p+i-16);  b=_wyr8(p+i-8);
  139|    816|  }
  140|  98.1M|  return _wymix(secret[1]^len,_wymix(a^secret[1],b^seed));
  141|  98.1M|}
ass_cache.c:_wyr4:
   99|   392M|static inline uint64_t _wyr4(const uint8_t *p) { uint32_t v; memcpy(&v, p, 4); return v;}
ass_cache.c:_wymix:
   82|   201M|static inline uint64_t _wymix(uint64_t A, uint64_t B){ _wymum(&A,&B); return A^B; }
ass_cache.c:_wymum:
   46|   201M|static inline void _wymum(uint64_t *A, uint64_t *B){
   47|       |#if(WYHASH_32BIT_MUM)
   48|       |  uint64_t hh=(*A>>32)*(*B>>32), hl=(*A>>32)*(uint32_t)*B, lh=(uint32_t)*A*(*B>>32), ll=(uint64_t)(uint32_t)*A*(uint32_t)*B;
   49|       |  #if(WYHASH_CONDOM>1)
   50|       |  *A^=_wyrot(hl)^hh; *B^=_wyrot(lh)^ll;
   51|       |  #else
   52|       |  *A=_wyrot(hl)^hh; *B=_wyrot(lh)^ll;
   53|       |  #endif
   54|       |#elif defined(__SIZEOF_INT128__)
   55|   201M|  __uint128_t r=*A; r*=*B; 
   56|       |  #if(WYHASH_CONDOM>1)
   57|       |  *A^=(uint64_t)r; *B^=(uint64_t)(r>>64);
   58|       |  #else
   59|   201M|  *A=(uint64_t)r; *B=(uint64_t)(r>>64);
   60|   201M|  #endif
   61|       |#elif defined(_MSC_VER) && defined(_M_X64)
   62|       |  #if(WYHASH_CONDOM>1)
   63|       |  uint64_t  a,  b;
   64|       |  a=_umul128(*A,*B,&b);
   65|       |  *A^=a;  *B^=b;
   66|       |  #else
   67|       |  *A=_umul128(*A,*B,B);
   68|       |  #endif
   69|       |#else
   70|       |  uint64_t ha=*A>>32, hb=*B>>32, la=(uint32_t)*A, lb=(uint32_t)*B, hi, lo;
   71|       |  uint64_t rh=ha*hb, rm0=ha*lb, rm1=hb*la, rl=la*lb, t=rl+(rm0<<32), c=t<rl;
   72|       |  lo=t+(rm1<<32); c+=lo<t; hi=rh+(rm0>>32)+(rm1>>32)+c;
   73|       |  #if(WYHASH_CONDOM>1)
   74|       |  *A^=lo;  *B^=hi;
   75|       |  #else
   76|       |  *A=lo;  *B=hi;
   77|       |  #endif
   78|       |#endif
   79|   201M|}
ass_cache.c:_wyr8:
   98|  9.70M|static inline uint64_t _wyr8(const uint8_t *p) { uint64_t v; memcpy(&v, p, 8); return v;}

_ZNK2OT6Layout6Common8Coverage8sanitizeEP21hb_sanitize_context_t:
   64|     52|  {
   65|     52|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     52|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   66|     52|    if (!u.format.sanitize (c)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (66:9): [True: 0, False: 52]
  ------------------
   67|     52|    switch (u.format)
   68|     52|    {
   69|     23|    case 1: return_trace (u.format1.sanitize (c));
  ------------------
  |  |  350|     23|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     23|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (69:5): [True: 23, False: 29]
  ------------------
   70|     29|    case 2: return_trace (u.format2.sanitize (c));
  ------------------
  |  |  350|     29|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     29|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (70:5): [True: 29, False: 23]
  ------------------
   71|       |#ifndef HB_NO_BEYOND_64K
   72|       |    case 3: return_trace (u.format3.sanitize (c));
   73|       |    case 4: return_trace (u.format4.sanitize (c));
   74|       |#endif
   75|      0|    default:return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (75:5): [True: 0, False: 52]
  ------------------
   76|     52|    }
   77|     52|  }
_ZNK2OT6Layout6Common8Coverage14get_populationEv:
  100|      1|  {
  101|      1|    switch (u.format) {
  102|      1|    case 1: return u.format1.get_population ();
  ------------------
  |  Branch (102:5): [True: 1, False: 0]
  ------------------
  103|      0|    case 2: return u.format2.get_population ();
  ------------------
  |  Branch (103:5): [True: 0, False: 1]
  ------------------
  104|       |#ifndef HB_NO_BEYOND_64K
  105|       |    case 3: return u.format3.get_population ();
  106|       |    case 4: return u.format4.get_population ();
  107|       |#endif
  108|      0|    default:return NOT_COVERED;
  ------------------
  |  |   37|      0|#define NOT_COVERED             ((unsigned int) -1)
  ------------------
  |  Branch (108:5): [True: 0, False: 1]
  ------------------
  109|      1|    }
  110|      1|  }
_ZNK2OT6Layout6Common8Coverage16collect_coverageI24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES4_IS5_ImLj0EES5_ImLj9EEEEEEbPT_:
  207|      8|  {
  208|      8|    switch (u.format)
  209|      8|    {
  210|      3|    case 1: return u.format1.collect_coverage (glyphs);
  ------------------
  |  Branch (210:5): [True: 3, False: 5]
  ------------------
  211|      5|    case 2: return u.format2.collect_coverage (glyphs);
  ------------------
  |  Branch (211:5): [True: 5, False: 3]
  ------------------
  212|       |#ifndef HB_NO_BEYOND_64K
  213|       |    case 3: return u.format3.collect_coverage (glyphs);
  214|       |    case 4: return u.format4.collect_coverage (glyphs);
  215|       |#endif
  216|      0|    default:return false;
  ------------------
  |  Branch (216:5): [True: 0, False: 8]
  ------------------
  217|      8|    }
  218|      8|  }

_ZNK2OT6Layout6Common17CoverageFormat1_3INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   53|     23|  {
   54|     23|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     23|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   55|     23|    return_trace (glyphArray.sanitize (c));
  ------------------
  |  |  350|     23|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     23|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   56|     23|  }
_ZNK2OT6Layout6Common17CoverageFormat1_3INS0_10SmallTypesEE14get_populationEv:
   66|      1|  {
   67|      1|    return glyphArray.len;
   68|      1|  }
_ZNK2OT6Layout6Common17CoverageFormat1_3INS0_10SmallTypesEE16collect_coverageI24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES6_IS7_ImLj0EES7_ImLj9EEEEEEbPT_:
  108|      3|  { return glyphs->add_sorted_array (glyphArray.as_array ()); }

_ZNK2OT6Layout6Common17CoverageFormat2_4INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   55|     29|  {
   56|     29|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     29|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   57|     29|    return_trace (rangeRecord.sanitize (c));
  ------------------
  |  |  350|     29|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     29|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   58|     29|  }
_ZNK2OT6Layout6Common17CoverageFormat2_4INS0_10SmallTypesEE16collect_coverageI24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES6_IS7_ImLj0EES7_ImLj9EEEEEEbPT_:
  162|      5|  {
  163|      5|    for (const auto& range: rangeRecord)
  ------------------
  |  Branch (163:27): [True: 24, False: 5]
  ------------------
  164|     24|      if (unlikely (!range.collect_coverage (glyphs)))
  ------------------
  |  |  260|     24|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  165|      0|        return false;
  166|      5|    return true;
  167|      5|  }

_ZNK2OT6Layout6Common11RangeRecordINS0_10SmallTypesEE3cmpEj:
   52|      4|  { return g < first ? -1 : g <= last ? 0 : +1; }
  ------------------
  |  Branch (52:12): [True: 3, False: 1]
  |  Branch (52:29): [True: 1, False: 0]
  ------------------
_ZN4NullIN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEE8get_nullEv:
   91|      1|  static OT::Layout::Common::RangeRecord<Spec> const & get_null () {
   92|      1|    return *reinterpret_cast<const OT::Layout::Common::RangeRecord<Spec> *> (_hb_Null_OT_RangeRecord);
   93|      1|  }
_ZNK2OT6Layout6Common11RangeRecordINS0_10SmallTypesEE16collect_coverageI24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES6_IS7_ImLj0EES7_ImLj9EEEEEEbPT_:
   77|     24|  { return glyphs->add_range (first, last); }

_ZN2OT4GDEF13accelerator_tD2Ev:
  883|     11|    ~accelerator_t () { table.destroy (); }
_ZNK2OT12LigCaretList8sanitizeEP21hb_sanitize_context_t:
  420|      1|  {
  421|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  422|      1|    return_trace (coverage.sanitize (c, this) && ligGlyph.sanitize (c, this));
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  423|      1|  }
_ZNK2OT4GDEF8sanitizeEP21hb_sanitize_context_t:
  671|      1|  {
  672|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  673|      1|    if (unlikely (!u.version.sanitize (c))) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely (!u.version.sanitize (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  674|      1|    switch (u.version.major) {
  675|      1|    case 1: return_trace (u.version1.sanitize (c));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (675:5): [True: 1, False: 0]
  ------------------
  676|       |#ifndef HB_NO_BEYOND_64K
  677|       |    case 2: return_trace (u.version2.sanitize (c));
  678|       |#endif
  679|      0|    default: return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (679:5): [True: 0, False: 1]
  ------------------
  680|      1|    }
  681|      1|  }
_ZNK2OT4GDEF17has_glyph_classesEv:
  695|   409k|  {
  696|   409k|    switch (u.version.major) {
  697|     19|    case 1: return u.version1.glyphClassDef != 0;
  ------------------
  |  Branch (697:5): [True: 19, False: 409k]
  ------------------
  698|       |#ifndef HB_NO_BEYOND_64K
  699|       |    case 2: return u.version2.glyphClassDef != 0;
  700|       |#endif
  701|   409k|    default: return false;
  ------------------
  |  Branch (701:5): [True: 409k, False: 19]
  ------------------
  702|   409k|    }
  703|   409k|  }
_ZNK2OT4GDEF19get_glyph_class_defEv:
  705|    180|  {
  706|    180|    switch (u.version.major) {
  707|      1|    case 1: return this+u.version1.glyphClassDef;
  ------------------
  |  Branch (707:5): [True: 1, False: 179]
  ------------------
  708|       |#ifndef HB_NO_BEYOND_64K
  709|       |    case 2: return this+u.version2.glyphClassDef;
  710|       |#endif
  711|    179|    default: return Null(ClassDef);
  ------------------
  |  |  124|    179|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (711:5): [True: 179, False: 1]
  ------------------
  712|    180|    }
  713|    180|  }
_ZNK2OT4GDEF19get_mark_glyph_setsEv:
  785|     11|  {
  786|     11|    switch (u.version.major) {
  787|      1|    case 1: return u.version.to_int () >= 0x00010002u ? this+u.version1.markGlyphSetsDef : Null(MarkGlyphSets);
  ------------------
  |  |  124|      2|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (787:5): [True: 1, False: 10]
  |  Branch (787:20): [True: 0, False: 1]
  ------------------
  788|       |#ifndef HB_NO_BEYOND_64K
  789|       |    case 2: return this+u.version2.markGlyphSetsDef;
  790|       |#endif
  791|     10|    default: return Null(MarkGlyphSets);
  ------------------
  |  |  124|     10|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (791:5): [True: 10, False: 1]
  ------------------
  792|     11|    }
  793|     11|  }
_ZNK2OT4GDEF13get_var_storeEv:
  805|   409k|  {
  806|   409k|    switch (u.version.major) {
  807|     18|    case 1: return u.version.to_int () >= 0x00010003u ? this+u.version1.varStore : Null(VariationStore);
  ------------------
  |  |  124|     36|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (807:5): [True: 18, False: 409k]
  |  Branch (807:20): [True: 0, False: 18]
  ------------------
  808|       |#ifndef HB_NO_BEYOND_64K
  809|       |    case 2: return this+u.version2.varStore;
  810|       |#endif
  811|   409k|    default: return Null(VariationStore);
  ------------------
  |  |  124|   409k|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (811:5): [True: 409k, False: 18]
  ------------------
  812|   409k|    }
  813|   409k|  }
_ZNK2OT4GDEF15get_glyph_classEj:
  818|    180|  { return get_glyph_class_def ().get_class (glyph); }
_ZNK2OT4GDEF15get_glyph_propsEj:
  848|    180|  {
  849|    180|    unsigned int klass = get_glyph_class (glyph);
  850|       |
  851|    180|    static_assert (((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH == (unsigned int) LookupFlag::IgnoreBaseGlyphs), "");
  852|    180|    static_assert (((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE == (unsigned int) LookupFlag::IgnoreLigatures), "");
  853|    180|    static_assert (((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_MARK == (unsigned int) LookupFlag::IgnoreMarks), "");
  854|       |
  855|    180|    switch (klass) {
  856|    179|    default:			return HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED;
  ------------------
  |  Branch (856:5): [True: 179, False: 1]
  ------------------
  857|      1|    case BaseGlyph:		return HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH;
  ------------------
  |  Branch (857:5): [True: 1, False: 179]
  ------------------
  858|      0|    case LigatureGlyph:		return HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE;
  ------------------
  |  Branch (858:5): [True: 0, False: 180]
  ------------------
  859|      0|    case MarkGlyph:
  ------------------
  |  Branch (859:5): [True: 0, False: 180]
  ------------------
  860|      0|	  klass = get_mark_attachment_type (glyph);
  861|      0|	  return HB_OT_LAYOUT_GLYPH_PROPS_MARK | (klass << 8);
  862|    180|    }
  863|    180|  }
_ZN2OT4GDEF13accelerator_tC2EP9hb_face_t:
  871|     11|    {
  872|     11|      table = hb_sanitize_context_t ().reference_table<GDEF> (face);
  873|     11|      if (unlikely (table->is_blocklisted (table.get_blob (), face)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  874|      0|      {
  875|      0|	hb_blob_destroy (table.get_blob ());
  876|      0|	table = hb_blob_get_empty ();
  877|      0|      }
  878|       |
  879|     11|#ifndef HB_NO_GDEF_CACHE
  880|     11|      table->get_mark_glyph_sets ().collect_coverage (mark_glyph_set_digests);
  881|     11|#endif
  882|     11|    }
_ZNK2OT4GDEF13accelerator_t15get_glyph_propsEj:
  886|  2.93M|    {
  887|  2.93M|      unsigned v;
  888|       |
  889|  2.93M|#ifndef HB_NO_GDEF_CACHE
  890|  2.93M|      if (glyph_props_cache.get (glyph, &v))
  ------------------
  |  Branch (890:11): [True: 2.93M, False: 180]
  ------------------
  891|  2.93M|        return v;
  892|    180|#endif
  893|       |
  894|    180|      v = table->get_glyph_props (glyph);
  895|       |
  896|    180|#ifndef HB_NO_GDEF_CACHE
  897|    180|      if (likely (table.get_blob ())) // Don't try setting if we are the null instance!
  ------------------
  |  |  259|    180|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 180, False: 0]
  |  |  ------------------
  ------------------
  898|    180|	glyph_props_cache.set (glyph, v);
  899|    180|#endif
  900|       |
  901|    180|      return v;
  902|       |
  903|  2.93M|    }
_ZN2OT18GDEF_accelerator_tC2EP9hb_face_t:
  966|     11|  GDEF_accelerator_t (hb_face_t *face) : GDEF::accelerator_t (face) {}
_ZNK2OT14GDEFVersion1_2INS_6Layout10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
  594|      1|  {
  595|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  596|      1|    return_trace (version.sanitize (c) &&
  ------------------
  |  |  350|     14|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  597|      1|		  glyphClassDef.sanitize (c, this) &&
  598|      1|		  attachList.sanitize (c, this) &&
  599|      1|		  ligCaretList.sanitize (c, this) &&
  600|      1|		  markAttachClassDef.sanitize (c, this) &&
  601|      1|		  (version.to_int () < 0x00010002u || markGlyphSetsDef.sanitize (c, this)) &&
  602|      1|		  (version.to_int () < 0x00010003u || varStore.sanitize (c, this)));
  603|      1|  }
_ZNK2OT13MarkGlyphSets16collect_coverageI24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES2_IS3_ImLj0EES3_ImLj9EEEEEEvR11hb_vector_tIT_Lb0EE:
  507|     11|  {
  508|     11|    switch (u.format) {
  509|      0|    case 1: u.format1.collect_coverage (sets); return;
  ------------------
  |  Branch (509:5): [True: 0, False: 11]
  ------------------
  510|     11|    default:return;
  ------------------
  |  Branch (510:5): [True: 11, False: 0]
  ------------------
  511|     11|    }
  512|     11|  }

_ZNK2OT6Layout9GPOS_impl6Anchor8sanitizeEP21hb_sanitize_context_t:
   25|     96|  {
   26|     96|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     96|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   27|     96|    if (!u.format.sanitize (c)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (27:9): [True: 0, False: 96]
  ------------------
   28|     96|    switch (u.format) {
   29|     96|    case 1: return_trace (u.format1.sanitize (c));
  ------------------
  |  |  350|     96|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     96|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (29:5): [True: 96, False: 0]
  ------------------
   30|      0|    case 2: return_trace (u.format2.sanitize (c));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (30:5): [True: 0, False: 96]
  ------------------
   31|      0|    case 3: return_trace (u.format3.sanitize (c));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (31:5): [True: 0, False: 96]
  ------------------
   32|      0|    default:return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (32:5): [True: 0, False: 96]
  ------------------
   33|     96|    }
   34|     96|  }

_ZNK2OT6Layout9GPOS_impl13AnchorFormat18sanitizeEP21hb_sanitize_context_t:
   18|     96|  {
   19|     96|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     96|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   20|     96|    return_trace (c->check_struct (this));
  ------------------
  |  |  350|     96|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     96|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   21|     96|  }

_ZNK2OT6Layout9GPOS_impl12AnchorMatrix8sanitizeEP21hb_sanitize_context_tj:
   18|      6|  {
   19|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   20|      6|    if (!c->check_struct (this)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (20:9): [True: 0, False: 6]
  ------------------
   21|      6|    if (unlikely (hb_unsigned_mul_overflows (rows, cols))) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (hb_unsigned_mul_overflows (rows, cols))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   22|      6|    unsigned int count = rows * cols;
   23|      6|    if (!c->check_array (matrixZ.arrayZ, count)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (23:9): [True: 0, False: 6]
  ------------------
   24|       |
   25|      6|    if (c->lazy_some_gpos)
  ------------------
  |  Branch (25:9): [True: 6, False: 0]
  ------------------
   26|      6|      return_trace (true);
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   27|       |
   28|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (28:30): [True: 0, False: 0]
  ------------------
   29|      0|      if (!matrixZ[i].sanitize (c, this)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (29:11): [True: 0, False: 0]
  ------------------
   30|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   31|      0|  }

_ZNK2OT6Layout4GPOS10get_lookupEj:
   34|      3|  { return static_cast<const PosLookup &> (GSUBGPOS::get_lookup (i)); }
_ZNK2OT6Layout4GPOS8sanitizeEP21hb_sanitize_context_t:
   47|     11|  {
   48|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   49|     11|    return_trace (GSUBGPOS::sanitize<PosLookup> (c));
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   50|     11|  }
_ZN2OT18GPOS_accelerator_tC2EP9hb_face_t:
  166|     11|  GPOS_accelerator_t (hb_face_t *face) : Layout::GPOS::accelerator_t (face) {}
_ZN2OT6Layout4GPOS14position_startEP9hb_font_tP11hb_buffer_t:
  129|   204k|{
  130|   204k|  unsigned int count = buffer->len;
  131|  3.13M|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (131:28): [True: 2.93M, False: 204k]
  ------------------
  132|  2.93M|    buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0;
  ------------------
  |  |   17|  2.93M|#define attach_chain() var.i16[0] /* glyph to which this attaches to, relative to current glyphs; negative for going back, positive for forward. */
  ------------------
                  buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0;
  ------------------
  |  |   18|  2.93M|#define attach_type() var.u8[2] /* attachment type */
  ------------------
  133|   204k|}
_ZN2OT6Layout4GPOS24position_finish_advancesEP9hb_font_tP11hb_buffer_t:
  137|   204k|{
  138|       |  //_hb_buffer_assert_gsubgpos_vars (buffer);
  139|   204k|}
_ZN2OT6Layout4GPOS23position_finish_offsetsEP9hb_font_tP11hb_buffer_t:
  143|   204k|{
  144|   204k|  _hb_buffer_assert_gsubgpos_vars (buffer);
  145|       |
  146|   204k|  unsigned int len;
  147|   204k|  hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len);
  148|   204k|  hb_direction_t direction = buffer->props.direction;
  149|       |
  150|       |  /* Handle attachments */
  151|   204k|  if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT)
  ------------------
  |  Branch (151:7): [True: 0, False: 204k]
  ------------------
  152|      0|    for (unsigned i = 0; i < len; i++)
  ------------------
  |  Branch (152:26): [True: 0, False: 0]
  ------------------
  153|      0|      propagate_attachment_offsets (pos, len, i, direction);
  154|       |
  155|   204k|  if (unlikely (font->slant))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  156|      0|  {
  157|      0|    for (unsigned i = 0; i < len; i++)
  ------------------
  |  Branch (157:26): [True: 0, False: 0]
  ------------------
  158|      0|      if (unlikely (pos[i].y_offset))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  159|      0|        pos[i].x_offset += roundf (font->slant_xy * pos[i].y_offset);
  ------------------
  |  |  207|      0|#define roundf(x) _hb_roundf(x)
  ------------------
  160|      0|  }
  161|   204k|}

_ZNK2OT6Layout9GPOS_impl9MarkArray8sanitizeEP21hb_sanitize_context_t:
   14|      6|  {
   15|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   16|      6|    return_trace (Array16Of<MarkRecord>::sanitize (c, this));
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   17|      6|  }

_ZNK2OT6Layout9GPOS_impl11MarkBasePos8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_DpOT0_:
   24|      4|  {
   25|      4|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
   26|      4|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      4|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   27|      4|    switch (u.format) {
   28|      4|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (28:5): [True: 4, False: 0]
  ------------------
   29|       |#ifndef HB_NO_BEYOND_64K
   30|       |    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
   31|       |#endif
   32|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (32:5): [True: 0, False: 4]
  ------------------
   33|      4|    }
   34|      4|  }
_ZNK2OT6Layout9GPOS_impl11MarkBasePos8dispatchINS_33hb_accelerate_subtables_context_tEJEEENT_8return_tEPS5_DpOT0_:
   24|      4|  {
   25|      4|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
   26|      4|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      4|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   27|      4|    switch (u.format) {
   28|      4|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (28:5): [True: 4, False: 0]
  ------------------
   29|       |#ifndef HB_NO_BEYOND_64K
   30|       |    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
   31|       |#endif
   32|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (32:5): [True: 0, False: 4]
  ------------------
   33|      4|    }
   34|      4|  }

_ZNK2OT6Layout9GPOS_impl20MarkBasePosFormat1_2INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   38|      4|  {
   39|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   40|      4|    return_trace (c->check_struct (this) &&
  ------------------
  |  |  350|     32|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  ------------------
  ------------------
   41|      4|                  markCoverage.sanitize (c, this) &&
   42|      4|                  baseCoverage.sanitize (c, this) &&
   43|      4|                  markArray.sanitize (c, this) &&
   44|      4|                  baseArray.sanitize (c, this, (unsigned int) classCount));
   45|      4|  }
_ZNK2OT6Layout9GPOS_impl20MarkBasePosFormat1_2INS0_10SmallTypesEE12get_coverageEv:
   91|      4|  const Coverage &get_coverage () const { return this+markCoverage; }

_ZNK2OT6Layout9GPOS_impl10MarkLigPos8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_DpOT0_:
   24|      1|  {
   25|      1|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
   26|      1|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      1|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   27|      1|    switch (u.format) {
   28|      1|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (28:5): [True: 1, False: 0]
  ------------------
   29|       |#ifndef HB_NO_BEYOND_64K
   30|       |    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
   31|       |#endif
   32|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (32:5): [True: 0, False: 1]
  ------------------
   33|      1|    }
   34|      1|  }
_ZNK2OT6Layout9GPOS_impl10MarkLigPos8dispatchINS_33hb_accelerate_subtables_context_tEJEEENT_8return_tEPS5_DpOT0_:
   24|      1|  {
   25|      1|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
   26|      1|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      1|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   27|      1|    switch (u.format) {
   28|      1|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (28:5): [True: 1, False: 0]
  ------------------
   29|       |#ifndef HB_NO_BEYOND_64K
   30|       |    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
   31|       |#endif
   32|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (32:5): [True: 0, False: 1]
  ------------------
   33|      1|    }
   34|      1|  }

_ZNK2OT6Layout9GPOS_impl19MarkLigPosFormat1_2INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   34|      1|  {
   35|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   36|      1|    return_trace (c->check_struct (this) &&
  ------------------
  |  |  350|      8|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
   37|      1|                  markCoverage.sanitize (c, this) &&
   38|      1|                  ligatureCoverage.sanitize (c, this) &&
   39|      1|                  markArray.sanitize (c, this) &&
   40|      1|                  ligatureArray.sanitize (c, this, (unsigned int) classCount));
   41|      1|  }
_ZNK2OT6Layout9GPOS_impl19MarkLigPosFormat1_2INS0_10SmallTypesEE12get_coverageEv:
   93|      1|  const Coverage &get_coverage () const { return this+markCoverage; }

_ZNK2OT6Layout9GPOS_impl11MarkMarkPos8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_DpOT0_:
   24|      1|  {
   25|      1|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
   26|      1|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      1|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   27|      1|    switch (u.format) {
   28|      1|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (28:5): [True: 1, False: 0]
  ------------------
   29|       |#ifndef HB_NO_BEYOND_64K
   30|       |    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
   31|       |#endif
   32|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (32:5): [True: 0, False: 1]
  ------------------
   33|      1|    }
   34|      1|  }
_ZNK2OT6Layout9GPOS_impl11MarkMarkPos8dispatchINS_33hb_accelerate_subtables_context_tEJEEENT_8return_tEPS5_DpOT0_:
   24|      1|  {
   25|      1|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
   26|      1|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      1|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   27|      1|    switch (u.format) {
   28|      1|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (28:5): [True: 1, False: 0]
  ------------------
   29|       |#ifndef HB_NO_BEYOND_64K
   30|       |    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
   31|       |#endif
   32|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (32:5): [True: 0, False: 1]
  ------------------
   33|      1|    }
   34|      1|  }

_ZNK2OT6Layout9GPOS_impl20MarkMarkPosFormat1_2INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   39|      1|  {
   40|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   41|      1|    return_trace (c->check_struct (this) &&
  ------------------
  |  |  350|      8|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
   42|      1|                  mark1Coverage.sanitize (c, this) &&
   43|      1|                  mark2Coverage.sanitize (c, this) &&
   44|      1|                  mark1Array.sanitize (c, this) &&
   45|      1|                  mark2Array.sanitize (c, this, (unsigned int) classCount));
   46|      1|  }
_ZNK2OT6Layout9GPOS_impl20MarkMarkPosFormat1_2INS0_10SmallTypesEE12get_coverageEv:
   92|      1|  const Coverage &get_coverage () const { return this+mark1Coverage; }

_ZNK2OT6Layout9GPOS_impl10MarkRecord8sanitizeEP21hb_sanitize_context_tPKv:
   22|     96|  {
   23|     96|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     96|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   24|     96|    return_trace (c->check_struct (this) && markAnchor.sanitize (c, base));
  ------------------
  |  |  350|    192|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     96|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 96, False: 0]
  |  |  |  Branch (350:45): [True: 96, False: 0]
  |  |  ------------------
  ------------------
   25|     96|  }

_ZNK2OT6Layout9GPOS_impl7PairPos8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_DpOT0_:
   27|      1|  {
   28|      1|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
   29|      1|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      1|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   30|      1|    switch (u.format) {
   31|      0|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (31:5): [True: 0, False: 1]
  ------------------
   32|      1|    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (32:5): [True: 1, False: 0]
  ------------------
   33|       |#ifndef HB_NO_BEYOND_64K
   34|       |    case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
   35|       |    case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
   36|       |#endif
   37|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (37:5): [True: 0, False: 1]
  ------------------
   38|      1|    }
   39|      1|  }

_ZNK2OT6Layout9GPOS_impl16PairPosFormat2_4INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   43|      1|  {
   44|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   45|      1|    if (!(c->check_struct (this)
  ------------------
  |  Branch (45:11): [True: 1, False: 0]
  ------------------
   46|      1|       && coverage.sanitize (c, this)
  ------------------
  |  Branch (46:11): [True: 1, False: 0]
  ------------------
   47|      1|       && classDef1.sanitize (c, this)
  ------------------
  |  Branch (47:11): [True: 1, False: 0]
  ------------------
   48|      1|       && classDef2.sanitize (c, this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (48:11): [True: 1, False: 0]
  ------------------
   49|       |
   50|      1|    unsigned int len1 = valueFormat1.get_len ();
   51|      1|    unsigned int len2 = valueFormat2.get_len ();
   52|      1|    unsigned int stride = HBUINT16::static_size * (len1 + len2);
   53|      1|    unsigned int count = (unsigned int) class1Count * (unsigned int) class2Count;
   54|      1|    return_trace (c->check_range ((const void *) values,
  ------------------
  |  |  350|      3|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
   55|      1|                                  count,
   56|      1|                                  stride) &&
   57|      1|		  (c->lazy_some_gpos ||
   58|      1|		   (valueFormat1.sanitize_values_stride_unsafe (c, this, &values[0], count, stride) &&
   59|      1|		    valueFormat2.sanitize_values_stride_unsafe (c, this, &values[len1], count, stride))));
   60|      1|  }

_ZNK2OT6Layout9GPOS_impl9PosLookup8sanitizeEP21hb_sanitize_context_t:
   72|      4|  { return Lookup::sanitize<SubTable> (c); }
_ZNK2OT6Layout9GPOS_impl9PosLookup8dispatchINS_33hb_accelerate_subtables_context_tEJEEENT_8return_tEPS5_DpOT0_:
   66|      3|  { return Lookup::dispatch<SubTable> (c, std::forward<Ts> (ds)...); }

_ZNK2OT6Layout9GPOS_impl17PosLookupSubTable8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_jDpOT0_:
   37|      7|  {
   38|      7|    TRACE_DISPATCH (this, lookup_type);
  ------------------
  |  |  482|      7|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   39|      7|    switch (lookup_type) {
   40|      0|    case Single:                return_trace (u.single.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (40:5): [True: 0, False: 7]
  ------------------
   41|      1|    case Pair:                  return_trace (u.pair.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (41:5): [True: 1, False: 6]
  ------------------
   42|      0|    case Cursive:               return_trace (u.cursive.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (42:5): [True: 0, False: 7]
  ------------------
   43|      4|    case MarkBase:              return_trace (u.markBase.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (43:5): [True: 4, False: 3]
  ------------------
   44|      1|    case MarkLig:               return_trace (u.markLig.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (44:5): [True: 1, False: 6]
  ------------------
   45|      1|    case MarkMark:              return_trace (u.markMark.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (45:5): [True: 1, False: 6]
  ------------------
   46|      0|    case Context:               return_trace (u.context.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (46:5): [True: 0, False: 7]
  ------------------
   47|      0|    case ChainContext:          return_trace (u.chainContext.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (47:5): [True: 0, False: 7]
  ------------------
   48|      0|    case Extension:             return_trace (u.extension.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (48:5): [True: 0, False: 7]
  ------------------
   49|      0|    default:                    return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (49:5): [True: 0, False: 7]
  ------------------
   50|      7|    }
   51|      7|  }
_ZNK2OT6Layout9GPOS_impl17PosLookupSubTable8dispatchINS_33hb_accelerate_subtables_context_tEJEEENT_8return_tEPS5_jDpOT0_:
   37|      6|  {
   38|      6|    TRACE_DISPATCH (this, lookup_type);
  ------------------
  |  |  482|      6|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   39|      6|    switch (lookup_type) {
   40|      0|    case Single:                return_trace (u.single.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (40:5): [True: 0, False: 6]
  ------------------
   41|      0|    case Pair:                  return_trace (u.pair.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (41:5): [True: 0, False: 6]
  ------------------
   42|      0|    case Cursive:               return_trace (u.cursive.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (42:5): [True: 0, False: 6]
  ------------------
   43|      4|    case MarkBase:              return_trace (u.markBase.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (43:5): [True: 4, False: 2]
  ------------------
   44|      1|    case MarkLig:               return_trace (u.markLig.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (44:5): [True: 1, False: 5]
  ------------------
   45|      1|    case MarkMark:              return_trace (u.markMark.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (45:5): [True: 1, False: 5]
  ------------------
   46|      0|    case Context:               return_trace (u.context.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (46:5): [True: 0, False: 6]
  ------------------
   47|      0|    case ChainContext:          return_trace (u.chainContext.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (47:5): [True: 0, False: 6]
  ------------------
   48|      0|    case Extension:             return_trace (u.extension.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (48:5): [True: 0, False: 6]
  ------------------
   49|      0|    default:                    return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (49:5): [True: 0, False: 6]
  ------------------
   50|      6|    }
   51|      6|  }

_ZNK2OT6Layout9GPOS_impl11ValueFormat7get_lenEv:
   59|      2|  unsigned int get_len () const  { return hb_popcount ((unsigned int) *this); }

_ZNK2OT6Layout9GSUB_impl12AlternateSetINS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   21|  13.9k|  {
   22|  13.9k|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|  13.9k|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   23|  13.9k|    return_trace (alternates.sanitize (c));
  ------------------
  |  |  350|  13.9k|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|  13.9k|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   24|  13.9k|  }

_ZNK2OT6Layout9GSUB_impl14AlternateSubst8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_DpOT0_:
   25|     21|  {
   26|     21|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|     21|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 21]
  |  |  ------------------
  ------------------
   27|     21|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|     21|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   28|     21|    switch (u.format) {
   29|     21|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|     21|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     21|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (29:5): [True: 21, False: 0]
  ------------------
   30|       |#ifndef HB_NO_BEYOND_64K
   31|       |    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
   32|       |#endif
   33|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (33:5): [True: 0, False: 21]
  ------------------
   34|     21|    }
   35|     21|  }

_ZNK2OT6Layout9GSUB_impl23AlternateSubstFormat1_2INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   26|     21|  {
   27|     21|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     21|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   28|     21|    return_trace (coverage.sanitize (c, this) && alternateSet.sanitize (c, this));
  ------------------
  |  |  350|     42|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     21|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 21, False: 0]
  |  |  |  Branch (350:45): [True: 21, False: 0]
  |  |  ------------------
  ------------------
   29|     21|  }

_ZNK2OT6Layout4GSUB10get_lookupEj:
   26|      2|  { return static_cast<const SubstLookup &> (GSUBGPOS::get_lookup (i)); }
_ZNK2OT6Layout4GSUB8sanitizeEP21hb_sanitize_context_t:
   35|     11|  {
   36|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   37|     11|    return_trace (GSUBGPOS::sanitize<SubstLookup> (c));
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   38|     11|  }
_ZN2OT18GSUB_accelerator_tC2EP9hb_face_t:
   55|     11|  GSUB_accelerator_t (hb_face_t *face) : Layout::GSUB::accelerator_t (face) {}

_ZNK2OT6Layout9GSUB_impl8LigatureINS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   24|      9|  {
   25|      9|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      9|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   26|      9|    return_trace (ligGlyph.sanitize (c) && component.sanitize (c));
  ------------------
  |  |  350|     18|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      9|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 9, False: 0]
  |  |  |  Branch (350:45): [True: 9, False: 0]
  |  |  ------------------
  ------------------
   27|      9|  }

_ZNK2OT6Layout9GSUB_impl11LigatureSetINS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   22|      3|  {
   23|      3|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      3|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   24|      3|    return_trace (ligature.sanitize (c, this));
  ------------------
  |  |  350|      3|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      3|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   25|      3|  }

_ZNK2OT6Layout9GSUB_impl13LigatureSubst8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_DpOT0_:
   25|      2|  {
   26|      2|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
   27|      2|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      2|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   28|      2|    switch (u.format) {
   29|      2|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      2|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (29:5): [True: 2, False: 0]
  ------------------
   30|       |#ifndef HB_NO_BEYOND_64K
   31|       |    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
   32|       |#endif
   33|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (33:5): [True: 0, False: 2]
  ------------------
   34|      2|    }
   35|      2|  }
_ZNK2OT6Layout9GSUB_impl13LigatureSubst8dispatchINS_33hb_accelerate_subtables_context_tEJEEENT_8return_tEPS5_DpOT0_:
   25|      1|  {
   26|      1|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
   27|      1|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      1|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   28|      1|    switch (u.format) {
   29|      1|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (29:5): [True: 1, False: 0]
  ------------------
   30|       |#ifndef HB_NO_BEYOND_64K
   31|       |    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
   32|       |#endif
   33|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (33:5): [True: 0, False: 1]
  ------------------
   34|      1|    }
   35|      1|  }

_ZNK2OT6Layout9GSUB_impl22LigatureSubstFormat1_2INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   26|      2|  {
   27|      2|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      2|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   28|      2|    return_trace (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      2|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 2, False: 0]
  |  |  |  Branch (350:45): [True: 2, False: 0]
  |  |  ------------------
  ------------------
   29|      2|  }
_ZNK2OT6Layout9GSUB_impl22LigatureSubstFormat1_2INS0_10SmallTypesEE12get_coverageEv:
   70|      1|  const Coverage &get_coverage () const { return this+coverage; }

_ZNK2OT6Layout9GSUB_impl11SingleSubst8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_DpOT0_:
   29|     14|  {
   30|     14|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|     14|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 14]
  |  |  ------------------
  ------------------
   31|     14|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|     14|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   32|     14|    switch (u.format) {
   33|      1|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (33:5): [True: 1, False: 13]
  ------------------
   34|     13|    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|     13|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     13|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (34:5): [True: 13, False: 1]
  ------------------
   35|       |#ifndef HB_NO_BEYOND_64K
   36|       |    case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
   37|       |    case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
   38|       |#endif
   39|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (39:5): [True: 0, False: 14]
  ------------------
   40|     14|    }
   41|     14|  }

_ZNK2OT6Layout9GSUB_impl20SingleSubstFormat1_3INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   26|      1|  {
   27|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   28|      1|    return_trace (c->check_struct (this) &&
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
   29|      1|                  coverage.sanitize (c, this) &&
   30|       |                  /* The coverage  table may use a range to represent a set
   31|       |                   * of glyphs, which means a small number of bytes can
   32|       |                   * generate a large glyph set. Manually modify the
   33|       |                   * sanitizer max ops to take this into account.
   34|       |                   *
   35|       |                   * Note: This check *must* be right after coverage sanitize. */
   36|      1|                  c->check_ops ((this + coverage).get_population () >> 1));
   37|      1|  }

_ZNK2OT6Layout9GSUB_impl20SingleSubstFormat2_4INS0_10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
   26|     13|  {
   27|     13|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     13|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   28|     13|    return_trace (coverage.sanitize (c, this) && substitute.sanitize (c));
  ------------------
  |  |  350|     26|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     13|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 13, False: 0]
  |  |  |  Branch (350:45): [True: 13, False: 0]
  |  |  ------------------
  ------------------
   29|     13|  }

_ZNK2OT6Layout9GSUB_impl11SubstLookup8sanitizeEP21hb_sanitize_context_t:
   16|     38|  { return Lookup::sanitize<SubTable> (c); }
_ZNK2OT6Layout9GSUB_impl11SubstLookup8dispatchINS_33hb_accelerate_subtables_context_tEJEEENT_8return_tEPS5_DpOT0_:
  209|      2|  { return Lookup::dispatch<SubTable> (c, std::forward<Ts> (ds)...); }

_ZNK2OT6Layout9GSUB_impl19SubstLookupSubTable8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_jDpOT0_:
   50|     38|  {
   51|     38|    TRACE_DISPATCH (this, lookup_type);
  ------------------
  |  |  482|     38|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   52|     38|    switch (lookup_type) {
   53|     14|    case Single:                return_trace (u.single.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|     14|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     14|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (53:5): [True: 14, False: 24]
  ------------------
   54|      0|    case Multiple:              return_trace (u.multiple.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (54:5): [True: 0, False: 38]
  ------------------
   55|     21|    case Alternate:             return_trace (u.alternate.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|     21|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     21|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (55:5): [True: 21, False: 17]
  ------------------
   56|      2|    case Ligature:              return_trace (u.ligature.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      2|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (56:5): [True: 2, False: 36]
  ------------------
   57|      0|    case Context:               return_trace (u.context.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (57:5): [True: 0, False: 38]
  ------------------
   58|      1|    case ChainContext:          return_trace (u.chainContext.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (58:5): [True: 1, False: 37]
  ------------------
   59|      0|    case Extension:             return_trace (u.extension.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (59:5): [True: 0, False: 38]
  ------------------
   60|      0|    case ReverseChainSingle:    return_trace (u.reverseChainContextSingle.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (60:5): [True: 0, False: 38]
  ------------------
   61|      0|    default:                    return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (61:5): [True: 0, False: 38]
  ------------------
   62|     38|    }
   63|     38|  }
_ZNK2OT6Layout9GSUB_impl19SubstLookupSubTable8dispatchINS_33hb_accelerate_subtables_context_tEJEEENT_8return_tEPS5_jDpOT0_:
   50|      2|  {
   51|      2|    TRACE_DISPATCH (this, lookup_type);
  ------------------
  |  |  482|      2|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
   52|      2|    switch (lookup_type) {
   53|      0|    case Single:                return_trace (u.single.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (53:5): [True: 0, False: 2]
  ------------------
   54|      0|    case Multiple:              return_trace (u.multiple.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (54:5): [True: 0, False: 2]
  ------------------
   55|      0|    case Alternate:             return_trace (u.alternate.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (55:5): [True: 0, False: 2]
  ------------------
   56|      1|    case Ligature:              return_trace (u.ligature.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (56:5): [True: 1, False: 1]
  ------------------
   57|      0|    case Context:               return_trace (u.context.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (57:5): [True: 0, False: 2]
  ------------------
   58|      1|    case ChainContext:          return_trace (u.chainContext.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (58:5): [True: 1, False: 1]
  ------------------
   59|      0|    case Extension:             return_trace (u.extension.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (59:5): [True: 0, False: 2]
  ------------------
   60|      0|    case ReverseChainSingle:    return_trace (u.reverseChainContextSingle.dispatch (c, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (60:5): [True: 0, False: 2]
  ------------------
   61|      0|    default:                    return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (61:5): [True: 0, False: 2]
  ------------------
   62|      2|    }
   63|      2|  }

hb_malloc_impl:
   44|     39|{
   45|     39|  return (fastrand () % 16) ? malloc (size) : NULL;
  ------------------
  |  Branch (45:10): [True: 39, False: 0]
  ------------------
   46|     39|}
hb_calloc_impl:
   49|   204k|{
   50|   204k|  return (fastrand () % 16) ? calloc (nmemb, size) : NULL;
  ------------------
  |  Branch (50:10): [True: 204k, False: 0]
  ------------------
   51|   204k|}
hb_realloc_impl:
   54|   409k|{
   55|   409k|  return (fastrand () % 16) ? realloc (ptr, size) : NULL;
  ------------------
  |  Branch (55:10): [True: 409k, False: 0]
  ------------------
   56|   409k|}
hb_free_impl:
   59|  1.02M|{
   60|  1.02M|  return free (ptr);
   61|  1.02M|}
failing-alloc.c:fastrand:
   36|   614k|{
   37|   614k|  if (!alloc_state) return 1;
  ------------------
  |  Branch (37:7): [True: 614k, False: 0]
  ------------------
   38|       |  /* Based on https://software.intel.com/content/www/us/en/develop/articles/fast-random-number-generator-on-the-intel-pentiumr-4-processor.html */
   39|      0|  alloc_state = (214013 * alloc_state + 2531011);
   40|      0|  return (alloc_state >> 16) & 0x7FFF;
   41|   614k|}

_ZN3AAT22hb_aat_apply_context_t16set_lookup_indexEj:
   76|     45|  void set_lookup_index (unsigned int i) { lookup_index = i; }
_ZN3AAT22hb_aat_apply_context_t8dispatchIN2OT6KernOTEEEbRKT_:
   50|      9|  return_t dispatch (const T &obj) { return obj.apply (this); }
_ZN3AAT22hb_aat_apply_context_t8dispatchINS_19KerxSubTableFormat0IN2OT20KernOTSubTableHeaderEEEEEbRKT_:
   50|     36|  return_t dispatch (const T &obj) { return obj.apply (this); }

_ZNK3AAT4kerx8has_dataEv:
  982|     13|  bool has_data () const { return version; }
_ZNK3AAT9KerxTableIN2OT6KernOTEE17has_state_machineEv:
  823|      1|  {
  824|      1|    typedef typename T::SubTable SubTable;
  825|       |
  826|      1|    const SubTable *st = &thiz()->firstSubTable;
  827|      1|    unsigned int count = thiz()->tableCount;
  828|      5|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (828:30): [True: 4, False: 1]
  ------------------
  829|      4|    {
  830|      4|      if (st->get_type () == 1)
  ------------------
  |  Branch (830:11): [True: 0, False: 4]
  ------------------
  831|      0|	return true;
  832|      4|      st = &StructAfter<SubTable> (*st);
  833|      4|    }
  834|      1|    return false;
  835|      1|  }
_ZNK3AAT9KerxTableIN2OT6KernOTEE4thizEv:
  820|     25|  const T* thiz () const { return static_cast<const T *> (this); }
_ZNK3AAT9KerxTableIN2OT6KernOTEE5applyEPNS_22hb_aat_apply_context_tE:
  871|      9|  {
  872|      9|    c->buffer->unsafe_to_concat ();
  873|       |
  874|      9|    typedef typename T::SubTable SubTable;
  875|       |
  876|      9|    bool ret = false;
  877|      9|    bool seenCrossStream = false;
  878|      9|    c->set_lookup_index (0);
  879|      9|    const SubTable *st = &thiz()->firstSubTable;
  880|      9|    unsigned int count = thiz()->tableCount;
  881|     45|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (881:30): [True: 36, False: 9]
  ------------------
  882|     36|    {
  883|     36|      bool reverse;
  884|       |
  885|     36|      if (!T::Types::extended && (st->u.header.coverage & st->u.header.Variation))
  ------------------
  |  Branch (885:11): [Folded - Ignored]
  |  Branch (885:34): [True: 0, False: 36]
  ------------------
  886|      0|	goto skip;
  887|       |
  888|     36|      if (HB_DIRECTION_IS_HORIZONTAL (c->buffer->props.direction) != st->u.header.is_horizontal ())
  ------------------
  |  |  271|     36|#define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
  ------------------
  |  Branch (888:11): [True: 0, False: 36]
  ------------------
  889|      0|	goto skip;
  890|       |
  891|     36|      reverse = bool (st->u.header.coverage & st->u.header.Backwards) !=
  892|     36|		HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction);
  ------------------
  |  |  298|     36|#define HB_DIRECTION_IS_BACKWARD(dir)	((((unsigned int) (dir)) & ~2U) == 5)
  ------------------
  893|       |
  894|     36|      if (!c->buffer->message (c->font, "start subtable %u", c->lookup_index))
  ------------------
  |  Branch (894:11): [True: 0, False: 36]
  ------------------
  895|      0|	goto skip;
  896|       |
  897|     36|      if (!seenCrossStream &&
  ------------------
  |  Branch (897:11): [True: 36, False: 0]
  ------------------
  898|     36|	  (st->u.header.coverage & st->u.header.CrossStream))
  ------------------
  |  Branch (898:4): [True: 0, False: 36]
  ------------------
  899|      0|      {
  900|       |	/* Attach all glyphs into a chain. */
  901|      0|	seenCrossStream = true;
  902|      0|	hb_glyph_position_t *pos = c->buffer->pos;
  903|      0|	unsigned int count = c->buffer->len;
  904|      0|	for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (904:27): [True: 0, False: 0]
  ------------------
  905|      0|	{
  906|      0|	  pos[i].attach_type() = OT::Layout::GPOS_impl::ATTACH_TYPE_CURSIVE;
  ------------------
  |  |   18|      0|#define attach_type() var.u8[2] /* attachment type */
  ------------------
  907|      0|	  pos[i].attach_chain() = HB_DIRECTION_IS_FORWARD (c->buffer->props.direction) ? -1 : +1;
  ------------------
  |  |   17|      0|#define attach_chain() var.i16[0] /* glyph to which this attaches to, relative to current glyphs; negative for going back, positive for forward. */
  ------------------
              	  pos[i].attach_chain() = HB_DIRECTION_IS_FORWARD (c->buffer->props.direction) ? -1 : +1;
  ------------------
  |  |  289|      0|#define HB_DIRECTION_IS_FORWARD(dir)	((((unsigned int) (dir)) & ~2U) == 4)
  |  |  ------------------
  |  |  |  Branch (289:38): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  908|       |	  /* We intentionally don't set HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT,
  909|       |	   * since there needs to be a non-zero attachment for post-positioning to
  910|       |	   * be needed. */
  911|      0|	}
  912|      0|      }
  913|       |
  914|     36|      if (reverse)
  ------------------
  |  Branch (914:11): [True: 0, False: 36]
  ------------------
  915|      0|	c->buffer->reverse ();
  916|       |
  917|     36|      {
  918|       |	/* See comment in sanitize() for conditional here. */
  919|     36|	hb_sanitize_with_object_t with (&c->sanitizer, i < count - 1 ? st : (const SubTable *) nullptr);
  ------------------
  |  Branch (919:49): [True: 27, False: 9]
  ------------------
  920|     36|	ret |= st->dispatch (c);
  921|     36|      }
  922|       |
  923|     36|      if (reverse)
  ------------------
  |  Branch (923:11): [True: 0, False: 36]
  ------------------
  924|      0|	c->buffer->reverse ();
  925|       |
  926|     36|      (void) c->buffer->message (c->font, "end subtable %u", c->lookup_index);
  927|       |
  928|     36|    skip:
  929|     36|      st = &StructAfter<SubTable> (*st);
  930|     36|      c->set_lookup_index (c->lookup_index + 1);
  931|     36|    }
  932|       |
  933|      9|    return ret;
  934|      9|  }
_ZNK3AAT19KerxSubTableFormat0IN2OT20KernOTSubTableHeaderEE5applyEPNS_22hb_aat_apply_context_tE:
  104|     36|  {
  105|     36|    TRACE_APPLY (this);
  ------------------
  |  |  411|     36|#define TRACE_APPLY(this) hb_no_trace_t<bool> trace
  ------------------
  106|       |
  107|     36|    if (!c->plan->requested_kerning)
  ------------------
  |  Branch (107:9): [True: 36, False: 0]
  ------------------
  108|     36|      return false;
  109|       |
  110|      0|    if (header.coverage & header.Backwards)
  ------------------
  |  Branch (110:9): [True: 0, False: 0]
  ------------------
  111|      0|      return false;
  112|       |
  113|      0|    accelerator_t accel (*this, c);
  114|      0|    hb_kern_machine_t<accelerator_t> machine (accel, header.coverage & header.CrossStream);
  115|      0|    machine.kern (c->font, c->buffer, c->plan->kern_mask);
  116|       |
  117|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  118|      0|  }
_ZNK3AAT9KerxTableIN2OT6KernOTEE8sanitizeEP21hb_sanitize_context_t:
  937|      1|  {
  938|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  939|      1|    if (unlikely (!thiz()->version.sanitize (c) ||
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  |  Branch (260:47): [True: 0, False: 1]
  |  |  |  Branch (260:47): [True: 0, False: 1]
  |  |  |  Branch (260:47): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  940|      1|		  (unsigned) thiz()->version < (unsigned) T::minVersion ||
  941|      1|		  !thiz()->tableCount.sanitize (c)))
  942|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  943|       |
  944|      1|    typedef typename T::SubTable SubTable;
  945|       |
  946|      1|    const SubTable *st = &thiz()->firstSubTable;
  947|      1|    unsigned int count = thiz()->tableCount;
  948|      5|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (948:30): [True: 4, False: 1]
  ------------------
  949|      4|    {
  950|      4|      if (unlikely (!st->u.header.sanitize (c)))
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  951|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  952|       |      /* OpenType kern table has 2-byte subtable lengths.  That's limiting.
  953|       |       * MS implementation also only supports one subtable, of format 0,
  954|       |       * anyway.  Certain versions of some fonts, like Calibry, contain
  955|       |       * kern subtable that exceeds 64kb.  Looks like, the subtable length
  956|       |       * is simply ignored.  Which makes sense.  It's only needed if you
  957|       |       * have multiple subtables.  To handle such fonts, we just ignore
  958|       |       * the length for the last subtable. */
  959|      4|      hb_sanitize_with_object_t with (c, i < count - 1 ? st : (const SubTable *) nullptr);
  ------------------
  |  Branch (959:42): [True: 3, False: 1]
  ------------------
  960|       |
  961|      4|      if (unlikely (!st->sanitize (c)))
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  962|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  963|       |
  964|      4|      st = &StructAfter<SubTable> (*st);
  965|      4|    }
  966|       |
  967|      1|    return_trace (true);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  968|      1|  }
_ZNK3AAT19KerxSubTableFormat0IN2OT20KernOTSubTableHeaderEE8sanitizeEP21hb_sanitize_context_t:
  135|      4|  {
  136|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  137|      4|    return_trace (likely (pairs.sanitize (c)));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  138|      4|  }

_ZNK3AAT8mortmorxINS_13ExtendedTypesELj1836020344EE8has_dataEv:
 1136|     13|  bool has_data () const { return version != 0; }
_ZNK3AAT8mortmorxINS_13ObsoleteTypesELj1836020340EE8has_dataEv:
 1136|     13|  bool has_data () const { return version != 0; }

_ZNK3AAT4trak8has_dataEv:
  158|     13|  bool has_data () const { return version.to_int (); }

_ZN3AAT22hb_aat_apply_context_tC2EPK18hb_ot_shape_plan_tP9hb_font_tP11hb_buffer_tP9hb_blob_t:
   66|      9|{
   67|      9|  sanitizer.init (blob);
   68|      9|  sanitizer.set_num_glyphs (face->get_num_glyphs ());
   69|      9|  sanitizer.start_processing ();
   70|      9|  sanitizer.set_max_ops (HB_SANITIZE_MAX_OPS_MAX);
  ------------------
  |  |  114|      9|#define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF
  ------------------
   71|      9|}
_ZN3AAT22hb_aat_apply_context_tD2Ev:
   74|      9|{ sanitizer.end_processing (); }
hb_aat_layout_has_substitution:
  245|     13|{
  246|     13|  return face->table.morx->has_data () ||
  ------------------
  |  Branch (246:10): [True: 0, False: 13]
  ------------------
  247|     13|	 face->table.mort->has_data ();
  ------------------
  |  Branch (247:3): [True: 0, False: 13]
  ------------------
  248|     13|}
hb_aat_layout_has_positioning:
  324|     13|{
  325|     13|  return face->table.kerx->has_data ();
  326|     13|}
hb_aat_layout_has_tracking:
  357|     13|{
  358|     13|  return face->table.trak->has_data ();
  359|     13|}

hb-blob.cc:_ZL25hb_unsigned_mul_overflowsjjPj:
 1028|     11|{
 1029|     11|#if hb_has_builtin(__builtin_mul_overflow)
 1030|     11|  unsigned stack_result;
 1031|     11|  if (!result)
  ------------------
  |  Branch (1031:7): [True: 11, False: 0]
  ------------------
 1032|     11|    result = &stack_result;
 1033|     11|  return __builtin_mul_overflow (count, size, result);
 1034|      0|#endif
 1035|       |
 1036|      0|  if (result)
  ------------------
  |  Branch (1036:7): [True: 0, False: 0]
  ------------------
 1037|      0|    *result = count * size;
 1038|      0|  return (size > 0) && (count >= ((unsigned int) -1) / size);
  ------------------
  |  Branch (1038:10): [True: 0, False: 0]
  |  Branch (1038:24): [True: 0, False: 0]
  ------------------
 1039|     11|}
hb-buffer.cc:_ZL25hb_unsigned_mul_overflowsjjPj:
 1028|   819k|{
 1029|   819k|#if hb_has_builtin(__builtin_mul_overflow)
 1030|   819k|  unsigned stack_result;
 1031|   819k|  if (!result)
  ------------------
  |  Branch (1031:7): [True: 204k, False: 614k]
  ------------------
 1032|   204k|    result = &stack_result;
 1033|   819k|  return __builtin_mul_overflow (count, size, result);
 1034|      0|#endif
 1035|       |
 1036|      0|  if (result)
  ------------------
  |  Branch (1036:7): [True: 0, False: 0]
  ------------------
 1037|      0|    *result = count * size;
 1038|      0|  return (size > 0) && (count >= ((unsigned int) -1) / size);
  ------------------
  |  Branch (1038:10): [True: 0, False: 0]
  |  Branch (1038:24): [True: 0, False: 0]
  ------------------
 1039|   819k|}
hb-buffer.cc:_ZL9hb_memsetPvij:
  989|  3.95M|{
  990|       |  /* It's illegal to pass NULL to memset(), even if n is zero. */
  991|  3.95M|  if (unlikely (!n)) return s;
  ------------------
  |  |  260|  3.95M|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 3.95M]
  |  |  ------------------
  ------------------
  992|  3.95M|  return memset (s, c, n);
  993|  3.95M|}
hb-buffer.cc:_Zco16hb_glyph_flags_t:
   62|      3|	  static inline constexpr unsigned operator ~ (T r) { return (~(unsigned) r); } \
_ZNK5BEIntIjLi4EEcvjEv:
  185|   409k|  constexpr operator Type () const {
  186|   409k|#if HB_FAST_INT_ACCESS
  187|   409k|#if __BYTE_ORDER == __LITTLE_ENDIAN
  188|   409k|    return __builtin_bswap32 (((packed_uint32_t *) v)->v);
  189|       |#else /* __BYTE_ORDER == __BIG_ENDIAN */
  190|       |    return ((packed_uint32_t *) v)->v;
  191|       |#endif
  192|       |#else
  193|       |    return (v[0] << 24)
  194|       |	 + (v[1] << 16)
  195|       |	 + (v[2] <<  8)
  196|       |	 + (v[3]      );
  197|       |#endif
  198|   409k|  }
_ZNK5BEIntItLi2EEcvtEv:
  134|  2.10M|  constexpr operator Type () const {
  135|  2.10M|#if HB_FAST_INT_ACCESS
  136|  2.10M|#if __BYTE_ORDER == __LITTLE_ENDIAN
  137|  2.10M|    return __builtin_bswap16 (((packed_uint16_t *) v)->v);
  138|       |#else /* __BYTE_ORDER == __BIG_ENDIAN */
  139|       |    return ((packed_uint16_t *) v)->v;
  140|       |#endif
  141|       |#else
  142|       |    return (v[0] <<  8)
  143|       |	 + (v[1]      );
  144|       |#endif
  145|  2.10M|  }
hb-common.cc:_ZL9hb_memcpyPvPKvm:
  971|      2|{
  972|       |  /* It's illegal to pass 0 as size to memcpy. */
  973|      2|  if (unlikely (!len)) return dst;
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  974|      2|  return memcpy (dst, src, len);
  975|      2|}
_ZNK5BEIntIhLi1EEcvhEv:
  111|    188|  constexpr operator Type () const { return v; }
hb-face.cc:_ZL25hb_unsigned_mul_overflowsjjPj:
 1028|   409k|{
 1029|   409k|#if hb_has_builtin(__builtin_mul_overflow)
 1030|   409k|  unsigned stack_result;
 1031|   409k|  if (!result)
  ------------------
  |  Branch (1031:7): [True: 0, False: 409k]
  ------------------
 1032|      0|    result = &stack_result;
 1033|   409k|  return __builtin_mul_overflow (count, size, result);
 1034|      0|#endif
 1035|       |
 1036|      0|  if (result)
  ------------------
  |  Branch (1036:7): [True: 0, False: 0]
  ------------------
 1037|      0|    *result = count * size;
 1038|      0|  return (size > 0) && (count >= ((unsigned int) -1) / size);
  ------------------
  |  Branch (1038:10): [True: 0, False: 0]
  |  Branch (1038:24): [True: 0, False: 0]
  ------------------
 1039|   409k|}
hb-face.cc:_ZL9hb_memsetPvij:
  989|     26|{
  990|       |  /* It's illegal to pass NULL to memset(), even if n is zero. */
  991|     26|  if (unlikely (!n)) return s;
  ------------------
  |  |  260|     26|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 26]
  |  |  ------------------
  ------------------
  992|     26|  return memset (s, c, n);
  993|     26|}
hb-face.cc:_ZL14hb_bit_storageIjEjT_:
  784|     26|{
  785|     26|  if (unlikely (!v)) return 0;
  ------------------
  |  |  260|     26|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 26]
  |  |  ------------------
  ------------------
  786|       |
  787|     26|#if hb_has_builtin(__builtin_clz)
  788|     26|  if (sizeof (T) <= sizeof (unsigned int))
  ------------------
  |  Branch (788:7): [Folded - Ignored]
  ------------------
  789|     26|    return sizeof (unsigned int) * 8 - __builtin_clz (v);
  790|      0|#endif
  791|       |
  792|      0|#if hb_has_builtin(__builtin_clzl)
  793|      0|  if (sizeof (T) <= sizeof (unsigned long))
  ------------------
  |  Branch (793:7): [Folded - Ignored]
  ------------------
  794|      0|    return sizeof (unsigned long) * 8 - __builtin_clzl (v);
  795|      0|#endif
  796|       |
  797|      0|#if hb_has_builtin(__builtin_clzll)
  798|      0|  if (sizeof (T) <= sizeof (unsigned long long))
  ------------------
  |  Branch (798:7): [Folded - Ignored]
  ------------------
  799|      0|    return sizeof (unsigned long long) * 8 - __builtin_clzll (v);
  800|      0|#endif
  801|       |
  802|       |#if (defined(_MSC_VER) && _MSC_VER >= 1500) || (defined(__MINGW32__) && (__GNUC__ < 4))
  803|       |  if (sizeof (T) <= sizeof (unsigned int))
  804|       |  {
  805|       |    unsigned long where;
  806|       |    _BitScanReverse (&where, v);
  807|       |    return 1 + where;
  808|       |  }
  809|       |# if defined(_WIN64)
  810|       |  if (sizeof (T) <= 8)
  811|       |  {
  812|       |    unsigned long where;
  813|       |    _BitScanReverse64 (&where, v);
  814|       |    return 1 + where;
  815|       |  }
  816|       |# endif
  817|       |#endif
  818|       |
  819|      0|  if (sizeof (T) <= 4)
  ------------------
  |  Branch (819:7): [Folded - Ignored]
  ------------------
  820|      0|  {
  821|       |    /* "bithacks" */
  822|      0|    const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
  823|      0|    const unsigned int S[] = {1, 2, 4, 8, 16};
  824|      0|    unsigned int r = 0;
  825|      0|    for (int i = 4; i >= 0; i--)
  ------------------
  |  Branch (825:21): [True: 0, False: 0]
  ------------------
  826|      0|      if (v & b[i])
  ------------------
  |  Branch (826:11): [True: 0, False: 0]
  ------------------
  827|      0|      {
  828|      0|	v >>= S[i];
  829|      0|	r |= S[i];
  830|      0|      }
  831|      0|    return r + 1;
  832|      0|  }
  833|      0|  if (sizeof (T) <= 8)
  ------------------
  |  Branch (833:7): [Folded - Ignored]
  ------------------
  834|      0|  {
  835|       |    /* "bithacks" */
  836|      0|    const uint64_t b[] = {0x2ULL, 0xCULL, 0xF0ULL, 0xFF00ULL, 0xFFFF0000ULL, 0xFFFFFFFF00000000ULL};
  837|      0|    const unsigned int S[] = {1, 2, 4, 8, 16, 32};
  838|      0|    unsigned int r = 0;
  839|      0|    for (int i = 5; i >= 0; i--)
  ------------------
  |  Branch (839:21): [True: 0, False: 0]
  ------------------
  840|      0|      if (v & b[i])
  ------------------
  |  Branch (840:11): [True: 0, False: 0]
  ------------------
  841|      0|      {
  842|      0|	v >>= S[i];
  843|      0|	r |= S[i];
  844|      0|      }
  845|      0|    return r + 1;
  846|      0|  }
  847|      0|  if (sizeof (T) == 16)
  ------------------
  |  Branch (847:7): [Folded - Ignored]
  ------------------
  848|      0|  {
  849|      0|    unsigned int shift = 64;
  850|      0|    return (v >> shift) ? hb_bit_storage<uint64_t> ((uint64_t) (v >> shift)) + shift :
  ------------------
  |  Branch (850:12): [True: 0, False: 0]
  ------------------
  851|      0|			  hb_bit_storage<uint64_t> ((uint64_t) v);
  852|      0|  }
  853|       |
  854|      0|  assert (0);
  855|      0|  return 0; /* Shut up stupid compiler. */
  856|      0|}
hb-face.cc:_ZL12ARRAY_LENGTHIjLj32EEjRAT0__KT_:
  964|     26|static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
hb-fallback-shape.cc:_ZL11hb_in_rangeIjEbT_S0_S0_:
 1003|     21|{
 1004|     21|  static_assert (!std::is_signed<T>::value, "");
 1005|       |
 1006|       |  /* The casts below are important as if T is smaller than int,
 1007|       |   * the subtract results will become a signed int! */
 1008|     21|  return (T)(u - lo) <= (T)(hi - lo);
 1009|     21|}
hb-fallback-shape.cc:_ZL12hb_in_rangesIjJjjjjEEbT_S0_S0_DpT0_:
 1017|      6|{
 1018|      6|  return hb_in_range<T> (u, lo1, hi1) || hb_in_ranges<T> (u, ds...);
  ------------------
  |  Branch (1018:10): [True: 0, False: 6]
  |  Branch (1018:42): [True: 6, False: 0]
  ------------------
 1019|      6|}
hb-fallback-shape.cc:_ZL12hb_in_rangesIjJjjEEbT_S0_S0_DpT0_:
 1017|      6|{
 1018|      6|  return hb_in_range<T> (u, lo1, hi1) || hb_in_ranges<T> (u, ds...);
  ------------------
  |  Branch (1018:10): [True: 0, False: 6]
  |  Branch (1018:42): [True: 6, False: 0]
  ------------------
 1019|      6|}
hb-fallback-shape.cc:_ZL12hb_in_rangesIjEbT_S0_S0_:
 1012|      6|{
 1013|      6|  return hb_in_range (u, lo1, hi1);
 1014|      6|}
hb-font.cc:_ZL10_hb_roundff:
  206|     42|_hb_roundf (float x) { return floorf (x + .5f); }
hb-ot-shape.cc:_ZL15hb_bsearch_implIKN11hb_ot_map_t13feature_map_tEjJEEbPjRKT0_PT_mmPFiPKvSA_DpT1_ESC_:
 1063|    117|{
 1064|       |  /* This is our *only* bsearch implementation. */
 1065|       |
 1066|    117|  int min = 0, max = (int) nmemb - 1;
 1067|    236|  while (min <= max)
  ------------------
  |  Branch (1067:10): [True: 133, False: 103]
  ------------------
 1068|    133|  {
 1069|    133|    int mid = ((unsigned int) min + (unsigned int) max) / 2;
 1070|    133|#pragma GCC diagnostic push
 1071|    133|#pragma GCC diagnostic ignored "-Wcast-align"
 1072|    133|    V* p = (V*) (((const char *) base) + (mid * stride));
 1073|    133|#pragma GCC diagnostic pop
 1074|    133|    int c = compar ((const void *) std::addressof (key), (const void *) p, ds...);
 1075|    133|    if (c < 0)
  ------------------
  |  Branch (1075:9): [True: 94, False: 39]
  ------------------
 1076|     94|      max = mid - 1;
 1077|     39|    else if (c > 0)
  ------------------
  |  Branch (1077:14): [True: 25, False: 14]
  ------------------
 1078|     25|      min = mid + 1;
 1079|     14|    else
 1080|     14|    {
 1081|     14|      *pos = mid;
 1082|     14|      return true;
 1083|     14|    }
 1084|    133|  }
 1085|    103|  *pos = min;
 1086|    103|  return false;
 1087|    117|}
hb-ot-shape.cc:_ZL14_hb_cmp_methodIjKN11hb_ot_map_t13feature_map_tEJEEiPKvS4_DpT1_:
 1049|    133|{
 1050|    133|  const K& key = * (const K*) pkey;
 1051|    133|  const V& val = * (const V*) pval;
 1052|       |
 1053|    133|  return val.cmp (key, ds...);
 1054|    133|}
hb-ot-shape.cc:_ZL9hb_memsetPvij:
  989|     13|{
  990|       |  /* It's illegal to pass NULL to memset(), even if n is zero. */
  991|     13|  if (unlikely (!n)) return s;
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  992|     13|  return memset (s, c, n);
  993|     13|}
hb-ot-shape.cc:_Zor25hb_ot_map_feature_flags_tS_:
   59|    117|	  static inline constexpr T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
hb-ot-shape.cc:_ZL12ARRAY_LENGTHI19hb_ot_map_feature_tLj7EEjRAT0__KT_:
  964|    208|static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
hb-ot-shape.cc:_ZoRR25hb_buffer_scratch_flags_tS_:
   63|   288k|	  static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
hb-ot-shape.cc:_Zor25hb_buffer_scratch_flags_tS_:
   59|   288k|	  static inline constexpr T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
hb-ot-shape.cc:_ZL11hb_in_rangeIjEbT_S0_S0_:
 1003|  6.90M|{
 1004|  6.90M|  static_assert (!std::is_signed<T>::value, "");
 1005|       |
 1006|       |  /* The casts below are important as if T is smaller than int,
 1007|       |   * the subtract results will become a signed int! */
 1008|  6.90M|  return (T)(u - lo) <= (T)(hi - lo);
 1009|  6.90M|}
hb-ot-shape.cc:_ZL12hb_in_rangesIjJjjEEbT_S0_S0_DpT0_:
 1017|  2.33M|{
 1018|  2.33M|  return hb_in_range<T> (u, lo1, hi1) || hb_in_ranges<T> (u, ds...);
  ------------------
  |  Branch (1018:10): [True: 0, False: 2.33M]
  |  Branch (1018:42): [True: 3, False: 2.33M]
  ------------------
 1019|  2.33M|}
hb-ot-shape.cc:_ZL12hb_in_rangesIjEbT_S0_S0_:
 1012|  2.33M|{
 1013|  2.33M|  return hb_in_range (u, lo1, hi1);
 1014|  2.33M|}
hb-ot-shape.cc:_Zan17hb_buffer_flags_tS_:
   60|   409k|	  static inline constexpr T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
hb-ot-shape.cc:_Zan25hb_buffer_scratch_flags_tS_:
   60|  1.22M|	  static inline constexpr T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
hb-shape-plan.cc:_ZL9hb_memcpyPvPKvm:
  971|     13|{
  972|       |  /* It's illegal to pass 0 as size to memcpy. */
  973|     13|  if (unlikely (!len)) return dst;
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  974|     13|  return memcpy (dst, src, len);
  975|     13|}
hb-shape-plan.cc:_ZL9hb_memcmpPKvS0_j:
  979|   204k|{
  980|       |  /* It's illegal to pass NULL to memcmp(), even if len is zero.
  981|       |   * So, wrap it.
  982|       |   * https://sourceware.org/bugzilla/show_bug.cgi?id=23878 */
  983|   204k|  if (unlikely (!len)) return 0;
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  984|   204k|  return memcmp (a, b, len);
  985|   204k|}
hb-shape.cc:_Zan17hb_buffer_flags_tS_:
   60|   204k|	  static inline constexpr T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
hb-aat-layout.cc:_ZL15hb_bsearch_implIKN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEjJEEbPjRKT0_PT_mmPFiPKvSE_DpT1_ESG_:
 1063|      1|{
 1064|       |  /* This is our *only* bsearch implementation. */
 1065|       |
 1066|      1|  int min = 0, max = (int) nmemb - 1;
 1067|      4|  while (min <= max)
  ------------------
  |  Branch (1067:10): [True: 4, False: 0]
  ------------------
 1068|      4|  {
 1069|      4|    int mid = ((unsigned int) min + (unsigned int) max) / 2;
 1070|      4|#pragma GCC diagnostic push
 1071|      4|#pragma GCC diagnostic ignored "-Wcast-align"
 1072|      4|    V* p = (V*) (((const char *) base) + (mid * stride));
 1073|      4|#pragma GCC diagnostic pop
 1074|      4|    int c = compar ((const void *) std::addressof (key), (const void *) p, ds...);
 1075|      4|    if (c < 0)
  ------------------
  |  Branch (1075:9): [True: 3, False: 1]
  ------------------
 1076|      3|      max = mid - 1;
 1077|      1|    else if (c > 0)
  ------------------
  |  Branch (1077:14): [True: 0, False: 1]
  ------------------
 1078|      0|      min = mid + 1;
 1079|      1|    else
 1080|      1|    {
 1081|      1|      *pos = mid;
 1082|      1|      return true;
 1083|      1|    }
 1084|      4|  }
 1085|      0|  *pos = min;
 1086|      0|  return false;
 1087|      1|}
hb-aat-layout.cc:_ZL14_hb_cmp_methodIjKN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEJEEiPKvS8_DpT1_:
 1049|      4|{
 1050|      4|  const K& key = * (const K*) pkey;
 1051|      4|  const V& val = * (const V*) pval;
 1052|       |
 1053|      4|  return val.cmp (key, ds...);
 1054|      4|}
hb-ot-layout.cc:_Zan17hb_buffer_flags_tS_:
   60|      9|	  static inline constexpr T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
hb-ot-layout.cc:_ZL25hb_unsigned_mul_overflowsjjPj:
 1028|     17|{
 1029|     17|#if hb_has_builtin(__builtin_mul_overflow)
 1030|     17|  unsigned stack_result;
 1031|     17|  if (!result)
  ------------------
  |  Branch (1031:7): [True: 6, False: 11]
  ------------------
 1032|      6|    result = &stack_result;
 1033|     17|  return __builtin_mul_overflow (count, size, result);
 1034|      0|#endif
 1035|       |
 1036|      0|  if (result)
  ------------------
  |  Branch (1036:7): [True: 0, False: 0]
  ------------------
 1037|      0|    *result = count * size;
 1038|      0|  return (size > 0) && (count >= ((unsigned int) -1) / size);
  ------------------
  |  Branch (1038:10): [True: 0, False: 0]
  |  Branch (1038:24): [True: 0, False: 0]
  ------------------
 1039|     17|}
hb-ot-layout.cc:_ZL15hb_bsearch_implIKN2OT6RecordINS0_6ScriptEEEjJEEbPjRKT0_PT_mmPFiPKvSC_DpT1_ESE_:
 1063|     98|{
 1064|       |  /* This is our *only* bsearch implementation. */
 1065|       |
 1066|     98|  int min = 0, max = (int) nmemb - 1;
 1067|    198|  while (min <= max)
  ------------------
  |  Branch (1067:10): [True: 102, False: 96]
  ------------------
 1068|    102|  {
 1069|    102|    int mid = ((unsigned int) min + (unsigned int) max) / 2;
 1070|    102|#pragma GCC diagnostic push
 1071|    102|#pragma GCC diagnostic ignored "-Wcast-align"
 1072|    102|    V* p = (V*) (((const char *) base) + (mid * stride));
 1073|    102|#pragma GCC diagnostic pop
 1074|    102|    int c = compar ((const void *) std::addressof (key), (const void *) p, ds...);
 1075|    102|    if (c < 0)
  ------------------
  |  Branch (1075:9): [True: 92, False: 10]
  ------------------
 1076|     92|      max = mid - 1;
 1077|     10|    else if (c > 0)
  ------------------
  |  Branch (1077:14): [True: 8, False: 2]
  ------------------
 1078|      8|      min = mid + 1;
 1079|      2|    else
 1080|      2|    {
 1081|      2|      *pos = mid;
 1082|      2|      return true;
 1083|      2|    }
 1084|    102|  }
 1085|     96|  *pos = min;
 1086|     96|  return false;
 1087|     98|}
hb-ot-layout.cc:_ZL14_hb_cmp_methodIjKN2OT6RecordINS0_6ScriptEEEJEEiPKvS6_DpT1_:
 1049|    102|{
 1050|    102|  const K& key = * (const K*) pkey;
 1051|    102|  const V& val = * (const V*) pval;
 1052|       |
 1053|    102|  return val.cmp (key, ds...);
 1054|    102|}
hb-ot-layout.cc:_ZL15hb_bsearch_implIKN2OT6RecordINS0_7LangSysEEEjJEEbPjRKT0_PT_mmPFiPKvSC_DpT1_ESE_:
 1063|     48|{
 1064|       |  /* This is our *only* bsearch implementation. */
 1065|       |
 1066|     48|  int min = 0, max = (int) nmemb - 1;
 1067|     56|  while (min <= max)
  ------------------
  |  Branch (1067:10): [True: 8, False: 48]
  ------------------
 1068|      8|  {
 1069|      8|    int mid = ((unsigned int) min + (unsigned int) max) / 2;
 1070|      8|#pragma GCC diagnostic push
 1071|      8|#pragma GCC diagnostic ignored "-Wcast-align"
 1072|      8|    V* p = (V*) (((const char *) base) + (mid * stride));
 1073|      8|#pragma GCC diagnostic pop
 1074|      8|    int c = compar ((const void *) std::addressof (key), (const void *) p, ds...);
 1075|      8|    if (c < 0)
  ------------------
  |  Branch (1075:9): [True: 3, False: 5]
  ------------------
 1076|      3|      max = mid - 1;
 1077|      5|    else if (c > 0)
  ------------------
  |  Branch (1077:14): [True: 5, False: 0]
  ------------------
 1078|      5|      min = mid + 1;
 1079|      0|    else
 1080|      0|    {
 1081|      0|      *pos = mid;
 1082|      0|      return true;
 1083|      0|    }
 1084|      8|  }
 1085|     48|  *pos = min;
 1086|     48|  return false;
 1087|     48|}
hb-ot-layout.cc:_ZL14_hb_cmp_methodIjKN2OT6RecordINS0_7LangSysEEEJEEiPKvS6_DpT1_:
 1049|      8|{
 1050|      8|  const K& key = * (const K*) pkey;
 1051|      8|  const V& val = * (const V*) pval;
 1052|       |
 1053|      8|  return val.cmp (key, ds...);
 1054|      8|}
hb-ot-layout.cc:_ZL11hb_popcountIjEjT_:
  737|      2|{
  738|      2|#if hb_has_builtin(__builtin_popcount)
  739|      2|  if (sizeof (T) <= sizeof (unsigned int))
  ------------------
  |  Branch (739:7): [Folded - Ignored]
  ------------------
  740|      2|    return __builtin_popcount (v);
  741|      0|#endif
  742|       |
  743|      0|#if hb_has_builtin(__builtin_popcountl)
  744|      0|  if (sizeof (T) <= sizeof (unsigned long))
  ------------------
  |  Branch (744:7): [Folded - Ignored]
  ------------------
  745|      0|    return __builtin_popcountl (v);
  746|      0|#endif
  747|       |
  748|      0|#if hb_has_builtin(__builtin_popcountll)
  749|      0|  if (sizeof (T) <= sizeof (unsigned long long))
  ------------------
  |  Branch (749:7): [Folded - Ignored]
  ------------------
  750|      0|    return __builtin_popcountll (v);
  751|      0|#endif
  752|       |
  753|      0|  if (sizeof (T) <= 4)
  ------------------
  |  Branch (753:7): [Folded - Ignored]
  ------------------
  754|      0|  {
  755|       |    /* "HACKMEM 169" */
  756|      0|    uint32_t y;
  757|      0|    y = (v >> 1) &033333333333;
  758|      0|    y = v - y - ((y >>1) & 033333333333);
  759|      0|    return (((y + (y >> 3)) & 030707070707) % 077);
  760|      0|  }
  761|       |
  762|      0|  if (sizeof (T) == 8)
  ------------------
  |  Branch (762:7): [Folded - Ignored]
  ------------------
  763|      0|  {
  764|      0|    uint64_t y = (uint64_t) v;
  765|      0|    y -= ((y >> 1) & 0x5555555555555555ull);
  766|      0|    y = (y & 0x3333333333333333ull) + (y >> 2 & 0x3333333333333333ull);
  767|      0|    return ((y + (y >> 4)) & 0xf0f0f0f0f0f0f0full) * 0x101010101010101ull >> 56;
  768|      0|  }
  769|       |
  770|      0|  if (sizeof (T) == 16)
  ------------------
  |  Branch (770:7): [Folded - Ignored]
  ------------------
  771|      0|  {
  772|      0|    unsigned int shift = 64;
  773|      0|    return hb_popcount<uint64_t> ((uint64_t) v) + hb_popcount ((uint64_t) (v >> shift));
  774|      0|  }
  775|       |
  776|      0|  assert (0);
  777|      0|  return 0; /* Shut up stupid compiler. */
  778|      0|}
hb-ot-layout.cc:_ZL14hb_bit_storageIjEjT_:
  784|      1|{
  785|      1|  if (unlikely (!v)) return 0;
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  786|       |
  787|      1|#if hb_has_builtin(__builtin_clz)
  788|      1|  if (sizeof (T) <= sizeof (unsigned int))
  ------------------
  |  Branch (788:7): [Folded - Ignored]
  ------------------
  789|      1|    return sizeof (unsigned int) * 8 - __builtin_clz (v);
  790|      0|#endif
  791|       |
  792|      0|#if hb_has_builtin(__builtin_clzl)
  793|      0|  if (sizeof (T) <= sizeof (unsigned long))
  ------------------
  |  Branch (793:7): [Folded - Ignored]
  ------------------
  794|      0|    return sizeof (unsigned long) * 8 - __builtin_clzl (v);
  795|      0|#endif
  796|       |
  797|      0|#if hb_has_builtin(__builtin_clzll)
  798|      0|  if (sizeof (T) <= sizeof (unsigned long long))
  ------------------
  |  Branch (798:7): [Folded - Ignored]
  ------------------
  799|      0|    return sizeof (unsigned long long) * 8 - __builtin_clzll (v);
  800|      0|#endif
  801|       |
  802|       |#if (defined(_MSC_VER) && _MSC_VER >= 1500) || (defined(__MINGW32__) && (__GNUC__ < 4))
  803|       |  if (sizeof (T) <= sizeof (unsigned int))
  804|       |  {
  805|       |    unsigned long where;
  806|       |    _BitScanReverse (&where, v);
  807|       |    return 1 + where;
  808|       |  }
  809|       |# if defined(_WIN64)
  810|       |  if (sizeof (T) <= 8)
  811|       |  {
  812|       |    unsigned long where;
  813|       |    _BitScanReverse64 (&where, v);
  814|       |    return 1 + where;
  815|       |  }
  816|       |# endif
  817|       |#endif
  818|       |
  819|      0|  if (sizeof (T) <= 4)
  ------------------
  |  Branch (819:7): [Folded - Ignored]
  ------------------
  820|      0|  {
  821|       |    /* "bithacks" */
  822|      0|    const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
  823|      0|    const unsigned int S[] = {1, 2, 4, 8, 16};
  824|      0|    unsigned int r = 0;
  825|      0|    for (int i = 4; i >= 0; i--)
  ------------------
  |  Branch (825:21): [True: 0, False: 0]
  ------------------
  826|      0|      if (v & b[i])
  ------------------
  |  Branch (826:11): [True: 0, False: 0]
  ------------------
  827|      0|      {
  828|      0|	v >>= S[i];
  829|      0|	r |= S[i];
  830|      0|      }
  831|      0|    return r + 1;
  832|      0|  }
  833|      0|  if (sizeof (T) <= 8)
  ------------------
  |  Branch (833:7): [Folded - Ignored]
  ------------------
  834|      0|  {
  835|       |    /* "bithacks" */
  836|      0|    const uint64_t b[] = {0x2ULL, 0xCULL, 0xF0ULL, 0xFF00ULL, 0xFFFF0000ULL, 0xFFFFFFFF00000000ULL};
  837|      0|    const unsigned int S[] = {1, 2, 4, 8, 16, 32};
  838|      0|    unsigned int r = 0;
  839|      0|    for (int i = 5; i >= 0; i--)
  ------------------
  |  Branch (839:21): [True: 0, False: 0]
  ------------------
  840|      0|      if (v & b[i])
  ------------------
  |  Branch (840:11): [True: 0, False: 0]
  ------------------
  841|      0|      {
  842|      0|	v >>= S[i];
  843|      0|	r |= S[i];
  844|      0|      }
  845|      0|    return r + 1;
  846|      0|  }
  847|      0|  if (sizeof (T) == 16)
  ------------------
  |  Branch (847:7): [Folded - Ignored]
  ------------------
  848|      0|  {
  849|      0|    unsigned int shift = 64;
  850|      0|    return (v >> shift) ? hb_bit_storage<uint64_t> ((uint64_t) (v >> shift)) + shift :
  ------------------
  |  Branch (850:12): [True: 0, False: 0]
  ------------------
  851|      0|			  hb_bit_storage<uint64_t> ((uint64_t) v);
  852|      0|  }
  853|       |
  854|      0|  assert (0);
  855|      0|  return 0; /* Shut up stupid compiler. */
  856|      0|}
hb-ot-layout.cc:_Zan25hb_buffer_scratch_flags_tS_:
   60|   204k|	  static inline constexpr T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
hb-ot-map.cc:_ZL9hb_memsetPvij:
  989|    516|{
  990|       |  /* It's illegal to pass NULL to memset(), even if n is zero. */
  991|    516|  if (unlikely (!n)) return s;
  ------------------
  |  |  260|    516|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 516]
  |  |  ------------------
  ------------------
  992|    516|  return memset (s, c, n);
  993|    516|}
hb-ot-map.cc:_Zan25hb_ot_map_feature_flags_tS_:
   60|  1.57k|	  static inline constexpr T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
hb-ot-map.cc:_ZoRR25hb_ot_map_feature_flags_tS_:
   63|     78|	  static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
hb-ot-map.cc:_Zor25hb_ot_map_feature_flags_tS_:
   59|     78|	  static inline constexpr T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
hb-ot-map.cc:_ZL25hb_unsigned_mul_overflowsjjPj:
 1028|    106|{
 1029|    106|#if hb_has_builtin(__builtin_mul_overflow)
 1030|    106|  unsigned stack_result;
 1031|    106|  if (!result)
  ------------------
  |  Branch (1031:7): [True: 106, False: 0]
  ------------------
 1032|    106|    result = &stack_result;
 1033|    106|  return __builtin_mul_overflow (count, size, result);
 1034|      0|#endif
 1035|       |
 1036|      0|  if (result)
  ------------------
  |  Branch (1036:7): [True: 0, False: 0]
  ------------------
 1037|      0|    *result = count * size;
 1038|      0|  return (size > 0) && (count >= ((unsigned int) -1) / size);
  ------------------
  |  Branch (1038:10): [True: 0, False: 0]
  |  Branch (1038:24): [True: 0, False: 0]
  ------------------
 1039|    106|}
hb-ot-map.cc:_ZL12ARRAY_LENGTHIjLj32EEjRAT0__KT_:
  964|     68|static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }
hb-ot-map.cc:_ZL8hb_qsortPvmmPFiPKvS1_E:
 1308|     15|{
 1309|       |#if defined(__OPTIMIZE_SIZE__) && !defined(HB_USE_INTERNAL_QSORT)
 1310|       |  qsort (base, nel, width, compar);
 1311|       |#else
 1312|     15|  sort_r_simple (base, nel, width, compar);
 1313|     15|#endif
 1314|     15|}
hb-ot-map.cc:_ZL13sort_r_simpleIJEEvPvmmPFiPKvS2_DpT_ES4_:
 1191|     93|{
 1192|     93|  char *b = (char *)base, *end = b + nel*w;
 1193|       |
 1194|       |  /* for(size_t i=0; i<nel; i++) {printf("%4i", *(int*)(b + i*sizeof(int)));}
 1195|       |  printf("\n"); */
 1196|       |
 1197|     93|  if(nel < 10) {
  ------------------
  |  Branch (1197:6): [True: 54, False: 39]
  ------------------
 1198|       |    /* Insertion sort for arbitrarily small inputs */
 1199|     54|    char *pi, *pj;
 1200|    369|    for(pi = b+w; pi < end; pi += w) {
  ------------------
  |  Branch (1200:19): [True: 315, False: 54]
  ------------------
 1201|  1.00k|      for(pj = pi; pj > b && sort_r_cmpswap(pj-w,pj,w,compar,ds...); pj -= w) {}
  ------------------
  |  Branch (1201:20): [True: 888, False: 118]
  |  Branch (1201:30): [True: 691, False: 197]
  ------------------
 1202|    315|    }
 1203|     54|  }
 1204|     39|  else
 1205|     39|  {
 1206|       |    /* nel > 9; Quicksort */
 1207|       |
 1208|     39|    int cmp;
 1209|     39|    char *pl, *ple, *pr, *pre, *pivot;
 1210|     39|    char *last = b+w*(nel-1), *tmp;
 1211|       |
 1212|       |    /*
 1213|       |    Use median of second, middle and second-last items as pivot.
 1214|       |    First and last may have been swapped with pivot and therefore be extreme
 1215|       |    */
 1216|     39|    char *l[3];
 1217|     39|    l[0] = b + w;
 1218|     39|    l[1] = b+w*(nel/2);
 1219|     39|    l[2] = last - w;
 1220|       |
 1221|       |    /* printf("pivots: %i, %i, %i\n", *(int*)l[0], *(int*)l[1], *(int*)l[2]); */
 1222|       |
 1223|     39|    if(compar(l[0],l[1],ds...) > 0) { SORT_R_SWAP(l[0], l[1], tmp); }
  ------------------
  |  | 1138|     26|#define SORT_R_SWAP(a,b,tmp) ((void) ((tmp) = (a)), (void) ((a) = (b)), (b) = (tmp))
  ------------------
  |  Branch (1223:8): [True: 26, False: 13]
  ------------------
 1224|     39|    if(compar(l[1],l[2],ds...) > 0) {
  ------------------
  |  Branch (1224:8): [True: 26, False: 13]
  ------------------
 1225|     26|      SORT_R_SWAP(l[1], l[2], tmp);
  ------------------
  |  | 1138|     26|#define SORT_R_SWAP(a,b,tmp) ((void) ((tmp) = (a)), (void) ((a) = (b)), (b) = (tmp))
  ------------------
 1226|     26|      if(compar(l[0],l[1],ds...) > 0) { SORT_R_SWAP(l[0], l[1], tmp); }
  ------------------
  |  | 1138|     13|#define SORT_R_SWAP(a,b,tmp) ((void) ((tmp) = (a)), (void) ((a) = (b)), (b) = (tmp))
  ------------------
  |  Branch (1226:10): [True: 13, False: 13]
  ------------------
 1227|     26|    }
 1228|       |
 1229|       |    /* swap mid value (l[1]), and last element to put pivot as last element */
 1230|     39|    if(l[1] != last) { sort_r_swap(l[1], last, w); }
  ------------------
  |  Branch (1230:8): [True: 39, False: 0]
  ------------------
 1231|       |
 1232|       |    /*
 1233|       |    pl is the next item on the left to be compared to the pivot
 1234|       |    pr is the last item on the right that was compared to the pivot
 1235|       |    ple is the left position to put the next item that equals the pivot
 1236|       |    ple is the last right position where we put an item that equals the pivot
 1237|       |                                           v- end (beyond the array)
 1238|       |      EEEEEELLLLLLLLuuuuuuuuGGGGGGGEEEEEEEE.
 1239|       |      ^- b  ^- ple  ^- pl   ^- pr  ^- pre ^- last (where the pivot is)
 1240|       |    Pivot comparison key:
 1241|       |      E = equal, L = less than, u = unknown, G = greater than, E = equal
 1242|       |    */
 1243|     39|    pivot = last;
 1244|     39|    ple = pl = b;
 1245|     39|    pre = pr = last;
 1246|       |
 1247|       |    /*
 1248|       |    Strategy:
 1249|       |    Loop into the list from the left and right at the same time to find:
 1250|       |    - an item on the left that is greater than the pivot
 1251|       |    - an item on the right that is less than the pivot
 1252|       |    Once found, they are swapped and the loop continues.
 1253|       |    Meanwhile items that are equal to the pivot are moved to the edges of the
 1254|       |    array.
 1255|       |    */
 1256|    286|    while(pl < pr) {
  ------------------
  |  Branch (1256:11): [True: 247, False: 39]
  ------------------
 1257|       |      /* Move left hand items which are equal to the pivot to the far left.
 1258|       |         break when we find an item that is greater than the pivot */
 1259|    442|      for(; pl < pr; pl += w) {
  ------------------
  |  Branch (1259:13): [True: 442, False: 0]
  ------------------
 1260|    442|        cmp = compar(pl, pivot, ds...);
 1261|    442|        if(cmp > 0) { break; }
  ------------------
  |  Branch (1261:12): [True: 247, False: 195]
  ------------------
 1262|    195|        else if(cmp == 0) {
  ------------------
  |  Branch (1262:17): [True: 0, False: 195]
  ------------------
 1263|      0|          if(ple < pl) { sort_r_swap(ple, pl, w); }
  ------------------
  |  Branch (1263:14): [True: 0, False: 0]
  ------------------
 1264|      0|          ple += w;
 1265|      0|        }
 1266|    442|      }
 1267|       |      /* break if last batch of left hand items were equal to pivot */
 1268|    247|      if(pl >= pr) { break; }
  ------------------
  |  Branch (1268:10): [True: 0, False: 247]
  ------------------
 1269|       |      /* Move right hand items which are equal to the pivot to the far right.
 1270|       |         break when we find an item that is less than the pivot */
 1271|    364|      for(; pl < pr; ) {
  ------------------
  |  Branch (1271:13): [True: 338, False: 26]
  ------------------
 1272|    338|        pr -= w; /* Move right pointer onto an unprocessed item */
 1273|    338|        cmp = compar(pr, pivot, ds...);
 1274|    338|        if(cmp == 0) {
  ------------------
  |  Branch (1274:12): [True: 0, False: 338]
  ------------------
 1275|      0|          pre -= w;
 1276|      0|          if(pr < pre) { sort_r_swap(pr, pre, w); }
  ------------------
  |  Branch (1276:14): [True: 0, False: 0]
  ------------------
 1277|      0|        }
 1278|    338|        else if(cmp < 0) {
  ------------------
  |  Branch (1278:17): [True: 221, False: 117]
  ------------------
 1279|    221|          if(pl < pr) { sort_r_swap(pl, pr, w); }
  ------------------
  |  Branch (1279:14): [True: 221, False: 0]
  ------------------
 1280|    221|          pl += w;
 1281|    221|          break;
 1282|    221|        }
 1283|    338|      }
 1284|    247|    }
 1285|       |
 1286|     39|    pl = pr; /* pr may have gone below pl */
 1287|       |
 1288|       |    /*
 1289|       |    Now we need to go from: EEELLLGGGGEEEE
 1290|       |                        to: LLLEEEEEEEGGGG
 1291|       |    Pivot comparison key:
 1292|       |      E = equal, L = less than, u = unknown, G = greater than, E = equal
 1293|       |    */
 1294|     39|    sort_r_swap_blocks(b, ple-b, pl-ple);
 1295|     39|    sort_r_swap_blocks(pr, pre-pr, end-pre);
 1296|       |
 1297|       |    /*for(size_t i=0; i<nel; i++) {printf("%4i", *(int*)(b + i*sizeof(int)));}
 1298|       |    printf("\n");*/
 1299|       |
 1300|     39|    sort_r_simple(b, (pl-ple)/w, w, compar, ds...);
 1301|     39|    sort_r_simple(end-(pre-pr), (pre-pr)/w, w, compar, ds...);
 1302|     39|  }
 1303|     93|}
hb-ot-map.cc:_ZL14sort_r_cmpswapIJEEiPcS0_mPFiPKvS2_DpT_ES4_:
 1159|    888|{
 1160|    888|  if(compar(a, b, ds...) > 0) {
  ------------------
  |  Branch (1160:6): [True: 691, False: 197]
  ------------------
 1161|    691|    sort_r_swap(a, b, w);
 1162|    691|    return 1;
 1163|    691|  }
 1164|    197|  return 0;
 1165|    888|}
hb-ot-map.cc:_ZL11sort_r_swapPcS_m:
 1144|    990|{
 1145|    990|  char tmp, *end = a+w;
 1146|  28.6k|  for(; a < end; a++, b++) { SORT_R_SWAP(*a, *b, tmp); }
  ------------------
  |  | 1138|  27.6k|#define SORT_R_SWAP(a,b,tmp) ((void) ((tmp) = (a)), (void) ((a) = (b)), (b) = (tmp))
  ------------------
  |  Branch (1146:9): [True: 27.6k, False: 990]
  ------------------
 1147|    990|}
hb-ot-map.cc:_ZL18sort_r_swap_blocksPcmm:
 1176|     78|{
 1177|     78|  if(na > 0 && nb > 0) {
  ------------------
  |  Branch (1177:6): [True: 39, False: 39]
  |  Branch (1177:16): [True: 39, False: 0]
  ------------------
 1178|     39|    if(na > nb) { sort_r_swap(ptr, ptr+na, nb); }
  ------------------
  |  Branch (1178:8): [True: 39, False: 0]
  ------------------
 1179|      0|    else { sort_r_swap(ptr, ptr+nb, na); }
 1180|     39|  }
 1181|     78|}
hb-ot-map.cc:_ZL11hb_popcountI16hb_glyph_flags_tEjT_:
  737|     13|{
  738|     13|#if hb_has_builtin(__builtin_popcount)
  739|     13|  if (sizeof (T) <= sizeof (unsigned int))
  ------------------
  |  Branch (739:7): [Folded - Ignored]
  ------------------
  740|     13|    return __builtin_popcount (v);
  741|      0|#endif
  742|       |
  743|      0|#if hb_has_builtin(__builtin_popcountl)
  744|      0|  if (sizeof (T) <= sizeof (unsigned long))
  ------------------
  |  Branch (744:7): [Folded - Ignored]
  ------------------
  745|      0|    return __builtin_popcountl (v);
  746|      0|#endif
  747|       |
  748|      0|#if hb_has_builtin(__builtin_popcountll)
  749|      0|  if (sizeof (T) <= sizeof (unsigned long long))
  ------------------
  |  Branch (749:7): [Folded - Ignored]
  ------------------
  750|      0|    return __builtin_popcountll (v);
  751|      0|#endif
  752|       |
  753|      0|  if (sizeof (T) <= 4)
  ------------------
  |  Branch (753:7): [Folded - Ignored]
  ------------------
  754|      0|  {
  755|       |    /* "HACKMEM 169" */
  756|      0|    uint32_t y;
  757|      0|    y = (v >> 1) &033333333333;
  758|      0|    y = v - y - ((y >>1) & 033333333333);
  759|      0|    return (((y + (y >> 3)) & 030707070707) % 077);
  760|      0|  }
  761|       |
  762|      0|  if (sizeof (T) == 8)
  ------------------
  |  Branch (762:7): [Folded - Ignored]
  ------------------
  763|      0|  {
  764|      0|    uint64_t y = (uint64_t) v;
  765|      0|    y -= ((y >> 1) & 0x5555555555555555ull);
  766|      0|    y = (y & 0x3333333333333333ull) + (y >> 2 & 0x3333333333333333ull);
  767|      0|    return ((y + (y >> 4)) & 0xf0f0f0f0f0f0f0full) * 0x101010101010101ull >> 56;
  768|      0|  }
  769|       |
  770|      0|  if (sizeof (T) == 16)
  ------------------
  |  Branch (770:7): [Folded - Ignored]
  ------------------
  771|      0|  {
  772|      0|    unsigned int shift = 64;
  773|      0|    return hb_popcount<uint64_t> ((uint64_t) v) + hb_popcount ((uint64_t) (v >> shift));
  774|      0|  }
  775|       |
  776|      0|  assert (0);
  777|      0|  return 0; /* Shut up stupid compiler. */
  778|      0|}
hb-ot-map.cc:_ZL14hb_bit_storageIjEjT_:
  784|     91|{
  785|     91|  if (unlikely (!v)) return 0;
  ------------------
  |  |  260|     91|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 39, False: 52]
  |  |  ------------------
  ------------------
  786|       |
  787|     52|#if hb_has_builtin(__builtin_clz)
  788|     52|  if (sizeof (T) <= sizeof (unsigned int))
  ------------------
  |  Branch (788:7): [Folded - Ignored]
  ------------------
  789|     52|    return sizeof (unsigned int) * 8 - __builtin_clz (v);
  790|      0|#endif
  791|       |
  792|      0|#if hb_has_builtin(__builtin_clzl)
  793|      0|  if (sizeof (T) <= sizeof (unsigned long))
  ------------------
  |  Branch (793:7): [Folded - Ignored]
  ------------------
  794|      0|    return sizeof (unsigned long) * 8 - __builtin_clzl (v);
  795|      0|#endif
  796|       |
  797|      0|#if hb_has_builtin(__builtin_clzll)
  798|      0|  if (sizeof (T) <= sizeof (unsigned long long))
  ------------------
  |  Branch (798:7): [Folded - Ignored]
  ------------------
  799|      0|    return sizeof (unsigned long long) * 8 - __builtin_clzll (v);
  800|      0|#endif
  801|       |
  802|       |#if (defined(_MSC_VER) && _MSC_VER >= 1500) || (defined(__MINGW32__) && (__GNUC__ < 4))
  803|       |  if (sizeof (T) <= sizeof (unsigned int))
  804|       |  {
  805|       |    unsigned long where;
  806|       |    _BitScanReverse (&where, v);
  807|       |    return 1 + where;
  808|       |  }
  809|       |# if defined(_WIN64)
  810|       |  if (sizeof (T) <= 8)
  811|       |  {
  812|       |    unsigned long where;
  813|       |    _BitScanReverse64 (&where, v);
  814|       |    return 1 + where;
  815|       |  }
  816|       |# endif
  817|       |#endif
  818|       |
  819|      0|  if (sizeof (T) <= 4)
  ------------------
  |  Branch (819:7): [Folded - Ignored]
  ------------------
  820|      0|  {
  821|       |    /* "bithacks" */
  822|      0|    const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
  823|      0|    const unsigned int S[] = {1, 2, 4, 8, 16};
  824|      0|    unsigned int r = 0;
  825|      0|    for (int i = 4; i >= 0; i--)
  ------------------
  |  Branch (825:21): [True: 0, False: 0]
  ------------------
  826|      0|      if (v & b[i])
  ------------------
  |  Branch (826:11): [True: 0, False: 0]
  ------------------
  827|      0|      {
  828|      0|	v >>= S[i];
  829|      0|	r |= S[i];
  830|      0|      }
  831|      0|    return r + 1;
  832|      0|  }
  833|      0|  if (sizeof (T) <= 8)
  ------------------
  |  Branch (833:7): [Folded - Ignored]
  ------------------
  834|      0|  {
  835|       |    /* "bithacks" */
  836|      0|    const uint64_t b[] = {0x2ULL, 0xCULL, 0xF0ULL, 0xFF00ULL, 0xFFFF0000ULL, 0xFFFFFFFF00000000ULL};
  837|      0|    const unsigned int S[] = {1, 2, 4, 8, 16, 32};
  838|      0|    unsigned int r = 0;
  839|      0|    for (int i = 5; i >= 0; i--)
  ------------------
  |  Branch (839:21): [True: 0, False: 0]
  ------------------
  840|      0|      if (v & b[i])
  ------------------
  |  Branch (840:11): [True: 0, False: 0]
  ------------------
  841|      0|      {
  842|      0|	v >>= S[i];
  843|      0|	r |= S[i];
  844|      0|      }
  845|      0|    return r + 1;
  846|      0|  }
  847|      0|  if (sizeof (T) == 16)
  ------------------
  |  Branch (847:7): [Folded - Ignored]
  ------------------
  848|      0|  {
  849|      0|    unsigned int shift = 64;
  850|      0|    return (v >> shift) ? hb_bit_storage<uint64_t> ((uint64_t) (v >> shift)) + shift :
  ------------------
  |  Branch (850:12): [True: 0, False: 0]
  ------------------
  851|      0|			  hb_bit_storage<uint64_t> ((uint64_t) v);
  852|      0|  }
  853|       |
  854|      0|  assert (0);
  855|      0|  return 0; /* Shut up stupid compiler. */
  856|      0|}
hb-ot-shape-normalize.cc:_Zan25hb_buffer_scratch_flags_tS_:
   60|   204k|	  static inline constexpr T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
hb-ot-tag.cc:_ZL15hb_bsearch_implIK7LangTagjJEEbPjRKT0_PT_mmPFiPKvS9_DpT1_ESB_:
 1063|      3|{
 1064|       |  /* This is our *only* bsearch implementation. */
 1065|       |
 1066|      3|  int min = 0, max = (int) nmemb - 1;
 1067|      6|  while (min <= max)
  ------------------
  |  Branch (1067:10): [True: 4, False: 2]
  ------------------
 1068|      4|  {
 1069|      4|    int mid = ((unsigned int) min + (unsigned int) max) / 2;
 1070|      4|#pragma GCC diagnostic push
 1071|      4|#pragma GCC diagnostic ignored "-Wcast-align"
 1072|      4|    V* p = (V*) (((const char *) base) + (mid * stride));
 1073|      4|#pragma GCC diagnostic pop
 1074|      4|    int c = compar ((const void *) std::addressof (key), (const void *) p, ds...);
 1075|      4|    if (c < 0)
  ------------------
  |  Branch (1075:9): [True: 2, False: 2]
  ------------------
 1076|      2|      max = mid - 1;
 1077|      2|    else if (c > 0)
  ------------------
  |  Branch (1077:14): [True: 1, False: 1]
  ------------------
 1078|      1|      min = mid + 1;
 1079|      1|    else
 1080|      1|    {
 1081|      1|      *pos = mid;
 1082|      1|      return true;
 1083|      1|    }
 1084|      4|  }
 1085|      2|  *pos = min;
 1086|      2|  return false;
 1087|      3|}
hb-ot-tag.cc:_ZL14_hb_cmp_methodIjK7LangTagJEEiPKvS3_DpT1_:
 1049|      4|{
 1050|      4|  const K& key = * (const K*) pkey;
 1051|      4|  const V& val = * (const V*) pval;
 1052|       |
 1053|      4|  return val.cmp (key, ds...);
 1054|      4|}
hb-ot-tag.cc:_ZL12ARRAY_LENGTHI7LangTagLj203EEjRAT0__KT_:
  964|     11|static inline unsigned int ARRAY_LENGTH (const Type (&)[n]) { return n; }

_Z8hb_arrayIN20hb_user_data_array_t19hb_user_data_item_tEE10hb_array_tIT_EPS3_j:
  338|     11|{ return hb_array_t<T> (array, length); }
_ZN10hb_array_tIN20hb_user_data_array_t19hb_user_data_item_tEEC2EPS1_j:
   59|     11|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZN10hb_array_tIN20hb_user_data_array_t19hb_user_data_item_tEE7lsearchIS1_EEPS1_RKT_S4_:
  178|     11|  {
  179|     11|    unsigned i;
  180|     11|    return lfind (x, &i) ? &this->arrayZ[i] : not_found;
  ------------------
  |  Branch (180:12): [True: 0, False: 11]
  ------------------
  181|     11|  }
_ZNK10hb_array_tIN20hb_user_data_array_t19hb_user_data_item_tEE5lfindIS1_EEbRKT_Pj14hb_not_found_tj:
  192|     11|  {
  193|     11|    for (unsigned i = 0; i < length; ++i)
  ------------------
  |  Branch (193:26): [True: 0, False: 11]
  ------------------
  194|      0|      if (hb_equal (x, this->arrayZ[i]))
  ------------------
  |  Branch (194:11): [True: 0, False: 0]
  ------------------
  195|      0|      {
  196|      0|	if (pos)
  ------------------
  |  Branch (196:6): [True: 0, False: 0]
  ------------------
  197|      0|	  *pos = i;
  198|      0|	return true;
  199|      0|      }
  200|       |
  201|     11|    if (pos)
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  ------------------
  202|     11|    {
  203|     11|      switch (not_found)
  ------------------
  |  Branch (203:15): [True: 0, False: 11]
  ------------------
  204|     11|      {
  205|     11|	case HB_NOT_FOUND_DONT_STORE:
  ------------------
  |  Branch (205:2): [True: 11, False: 0]
  ------------------
  206|     11|	  break;
  207|       |
  208|      0|	case HB_NOT_FOUND_STORE:
  ------------------
  |  Branch (208:2): [True: 0, False: 11]
  ------------------
  209|      0|	  *pos = to_store;
  210|      0|	  break;
  211|       |
  212|      0|	case HB_NOT_FOUND_STORE_CLOSEST:
  ------------------
  |  Branch (212:2): [True: 0, False: 11]
  ------------------
  213|      0|	  *pos = length;
  214|      0|	  break;
  215|     11|      }
  216|     11|    }
  217|     11|    return false;
  218|     11|  }
_Z8hb_arrayIN11hb_ot_map_t13feature_map_tEE10hb_array_tIT_EPS3_j:
  338|    117|{ return hb_array_t<T> (array, length); }
_ZN17hb_sorted_array_tIKN11hb_ot_map_t13feature_map_tEE7bsearchIjEEPS2_RKT_S5_:
  394|    117|  {
  395|    117|    unsigned int i;
  396|    117|    return bfind (x, &i) ? &this->arrayZ[i] : not_found;
  ------------------
  |  Branch (396:12): [True: 14, False: 103]
  ------------------
  397|    117|  }
_ZNK17hb_sorted_array_tIKN11hb_ot_map_t13feature_map_tEE5bfindIjEEbRKT_Pj14hb_not_found_tj:
  408|    117|  {
  409|    117|    unsigned pos;
  410|       |
  411|    117|    if (bsearch_impl (x, &pos))
  ------------------
  |  Branch (411:9): [True: 14, False: 103]
  ------------------
  412|     14|    {
  413|     14|      if (i)
  ------------------
  |  Branch (413:11): [True: 14, False: 0]
  ------------------
  414|     14|	*i = pos;
  415|     14|      return true;
  416|     14|    }
  417|       |
  418|    103|    if (i)
  ------------------
  |  Branch (418:9): [True: 103, False: 0]
  ------------------
  419|    103|    {
  420|    103|      switch (not_found)
  ------------------
  |  Branch (420:15): [True: 0, False: 103]
  ------------------
  421|    103|      {
  422|    103|	case HB_NOT_FOUND_DONT_STORE:
  ------------------
  |  Branch (422:2): [True: 103, False: 0]
  ------------------
  423|    103|	  break;
  424|       |
  425|      0|	case HB_NOT_FOUND_STORE:
  ------------------
  |  Branch (425:2): [True: 0, False: 103]
  ------------------
  426|      0|	  *i = to_store;
  427|      0|	  break;
  428|       |
  429|      0|	case HB_NOT_FOUND_STORE_CLOSEST:
  ------------------
  |  Branch (429:2): [True: 0, False: 103]
  ------------------
  430|      0|	  *i = pos;
  431|      0|	  break;
  432|    103|      }
  433|    103|    }
  434|    103|    return false;
  435|    103|  }
_ZNK17hb_sorted_array_tIKN11hb_ot_map_t13feature_map_tEE12bsearch_implIjJEEEbRKT_PjDpT0_:
  438|    117|  {
  439|    117|    return hb_bsearch_impl (pos,
  440|    117|			    x,
  441|    117|			    this->arrayZ,
  442|    117|			    this->length,
  443|    117|			    sizeof (Type),
  444|    117|			    _hb_cmp_method<T, Type, Ts...>,
  445|    117|			    std::forward<Ts> (ds)...);
  446|    117|  }
_Z8hb_arrayIN11hb_ot_map_t12lookup_map_tEE10hb_array_tIT_EPS3_j:
  338|      2|{ return hb_array_t<T> (array, length); }
_ZN10hb_array_tIjE8__next__Ev:
   90|     13|  {
   91|     13|    if (unlikely (!length))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
   92|      0|      return;
   93|     13|    length--;
   94|     13|    backwards_length++;
   95|     13|    arrayZ++;
   96|     13|  }
_ZNK10hb_array_tIjE8__item__Ev:
   80|     13|  {
   81|     13|    if (unlikely (!length)) return CrapOrNull (Type);
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
                  if (unlikely (!length)) return CrapOrNull (Type);
  ------------------
  |  |  198|      0|#define CrapOrNull(Type) CrapOrNullHelper<Type>::get ()
  ------------------
   82|     13|    return *arrayZ;
   83|     13|  }
_Z8hb_arrayIjE10hb_array_tIT_EPS1_j:
  338|     42|{ return hb_array_t<T> (array, length); }
_ZN10hb_array_tIjEC2EPjj:
   59|     42|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZN10hb_array_tIKcEC2EPS0_j:
   59|   819k|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_Z15hb_sorted_arrayIKN2OT11HBGlyphID16EE17hb_sorted_array_tIT_EPS4_j:
  450|      3|{ return hb_sorted_array_t<T> (array, length); }
_Z15hb_sorted_arrayIKN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEE17hb_sorted_array_tIT_EPS8_j:
  450|      1|{ return hb_sorted_array_t<T> (array, length); }
_ZN17hb_sorted_array_tIKN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEE7bsearchIjEEPS6_RKT_S9_:
  394|      1|  {
  395|      1|    unsigned int i;
  396|      1|    return bfind (x, &i) ? &this->arrayZ[i] : not_found;
  ------------------
  |  Branch (396:12): [True: 1, False: 0]
  ------------------
  397|      1|  }
_ZNK17hb_sorted_array_tIKN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEE5bfindIjEEbRKT_Pj14hb_not_found_tj:
  408|      1|  {
  409|      1|    unsigned pos;
  410|       |
  411|      1|    if (bsearch_impl (x, &pos))
  ------------------
  |  Branch (411:9): [True: 1, False: 0]
  ------------------
  412|      1|    {
  413|      1|      if (i)
  ------------------
  |  Branch (413:11): [True: 1, False: 0]
  ------------------
  414|      1|	*i = pos;
  415|      1|      return true;
  416|      1|    }
  417|       |
  418|      0|    if (i)
  ------------------
  |  Branch (418:9): [True: 0, False: 0]
  ------------------
  419|      0|    {
  420|      0|      switch (not_found)
  ------------------
  |  Branch (420:15): [True: 0, False: 0]
  ------------------
  421|      0|      {
  422|      0|	case HB_NOT_FOUND_DONT_STORE:
  ------------------
  |  Branch (422:2): [True: 0, False: 0]
  ------------------
  423|      0|	  break;
  424|       |
  425|      0|	case HB_NOT_FOUND_STORE:
  ------------------
  |  Branch (425:2): [True: 0, False: 0]
  ------------------
  426|      0|	  *i = to_store;
  427|      0|	  break;
  428|       |
  429|      0|	case HB_NOT_FOUND_STORE_CLOSEST:
  ------------------
  |  Branch (429:2): [True: 0, False: 0]
  ------------------
  430|      0|	  *i = pos;
  431|      0|	  break;
  432|      0|      }
  433|      0|    }
  434|      0|    return false;
  435|      0|  }
_ZNK17hb_sorted_array_tIKN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEE12bsearch_implIjJEEEbRKT_PjDpT0_:
  438|      1|  {
  439|      1|    return hb_bsearch_impl (pos,
  440|      1|			    x,
  441|      1|			    this->arrayZ,
  442|      1|			    this->length,
  443|      1|			    sizeof (Type),
  444|      1|			    _hb_cmp_method<T, Type, Ts...>,
  445|      1|			    std::forward<Ts> (ds)...);
  446|      1|  }
_ZNK10hb_array_tIKN2OT5IndexEE7__len__Ev:
  121|     55|  unsigned __len__ () const { return length; }
_ZN10hb_array_tIKN2OT5IndexEE8__next__Ev:
   90|     13|  {
   91|     13|    if (unlikely (!length))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
   92|      0|      return;
   93|     13|    length--;
   94|     13|    backwards_length++;
   95|     13|    arrayZ++;
   96|     13|  }
_ZNK10hb_array_tIKN2OT5IndexEE8__item__Ev:
   80|     13|  {
   81|     13|    if (unlikely (!length)) return CrapOrNull (Type);
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
                  if (unlikely (!length)) return CrapOrNull (Type);
  ------------------
  |  |  198|      0|#define CrapOrNull(Type) CrapOrNullHelper<Type>::get ()
  ------------------
   82|     13|    return *arrayZ;
   83|     13|  }
_Z8hb_arrayIKN2OT5IndexEE10hb_array_tIT_EPS4_j:
  338|     42|{ return hb_array_t<T> (array, length); }
_ZNK10hb_array_tIKN2OT5IndexEE9sub_arrayEjPj:
  257|     42|  {
  258|     42|    if (!start_offset && !seg_count)
  ------------------
  |  Branch (258:9): [True: 36, False: 6]
  |  Branch (258:26): [True: 0, False: 36]
  ------------------
  259|      0|      return *this;
  260|       |
  261|     42|    unsigned int count = length;
  262|     42|    if (unlikely (start_offset > count))
  ------------------
  |  |  260|     42|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 42]
  |  |  ------------------
  ------------------
  263|      0|      count = 0;
  264|     42|    else
  265|     42|      count -= start_offset;
  266|     42|    if (seg_count)
  ------------------
  |  Branch (266:9): [True: 42, False: 0]
  ------------------
  267|     42|      count = *seg_count = hb_min (count, *seg_count);
  268|     42|    return hb_array_t (arrayZ + start_offset, count);
  269|     42|  }
_Z15hb_sorted_arrayIKN2OT6RecordINS0_7LangSysEEEE17hb_sorted_array_tIT_EPS6_j:
  450|     48|{ return hb_sorted_array_t<T> (array, length); }
_ZNK17hb_sorted_array_tIKN2OT6RecordINS0_7LangSysEEEE5bfindIjEEbRKT_Pj14hb_not_found_tj:
  408|     48|  {
  409|     48|    unsigned pos;
  410|       |
  411|     48|    if (bsearch_impl (x, &pos))
  ------------------
  |  Branch (411:9): [True: 0, False: 48]
  ------------------
  412|      0|    {
  413|      0|      if (i)
  ------------------
  |  Branch (413:11): [True: 0, False: 0]
  ------------------
  414|      0|	*i = pos;
  415|      0|      return true;
  416|      0|    }
  417|       |
  418|     48|    if (i)
  ------------------
  |  Branch (418:9): [True: 48, False: 0]
  ------------------
  419|     48|    {
  420|     48|      switch (not_found)
  ------------------
  |  Branch (420:15): [True: 0, False: 48]
  ------------------
  421|     48|      {
  422|      0|	case HB_NOT_FOUND_DONT_STORE:
  ------------------
  |  Branch (422:2): [True: 0, False: 48]
  ------------------
  423|      0|	  break;
  424|       |
  425|     48|	case HB_NOT_FOUND_STORE:
  ------------------
  |  Branch (425:2): [True: 48, False: 0]
  ------------------
  426|     48|	  *i = to_store;
  427|     48|	  break;
  428|       |
  429|      0|	case HB_NOT_FOUND_STORE_CLOSEST:
  ------------------
  |  Branch (429:2): [True: 0, False: 48]
  ------------------
  430|      0|	  *i = pos;
  431|      0|	  break;
  432|     48|      }
  433|     48|    }
  434|     48|    return false;
  435|     48|  }
_ZNK17hb_sorted_array_tIKN2OT6RecordINS0_7LangSysEEEE12bsearch_implIjJEEEbRKT_PjDpT0_:
  438|     48|  {
  439|     48|    return hb_bsearch_impl (pos,
  440|     48|			    x,
  441|     48|			    this->arrayZ,
  442|     48|			    this->length,
  443|     48|			    sizeof (Type),
  444|     48|			    _hb_cmp_method<T, Type, Ts...>,
  445|     48|			    std::forward<Ts> (ds)...);
  446|     48|  }
_Z15hb_sorted_arrayIKN2OT6RecordINS0_6ScriptEEEE17hb_sorted_array_tIT_EPS6_j:
  450|     98|{ return hb_sorted_array_t<T> (array, length); }
_ZNK10hb_array_tIKcE2asIN2OT4maxpELj1ELPv0EEEPKT_v:
  279|     11|  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |   99|     11|#define hb_min_size(T) hb_min_size<T>::value
  ------------------
                { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (279:12): [True: 0, False: 11]
  ------------------
_ZNK10hb_array_tIKcE2asIN2OT4GDEFELj1ELPv0EEEPKT_v:
  279|   409k|  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |   99|   409k|#define hb_min_size(T) hb_min_size<T>::value
  ------------------
                { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |  124|   409k|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (279:12): [True: 409k, False: 31]
  ------------------
_ZNK10hb_array_tIKN2OT11HBGlyphID16EEadEv:
  139|      3|  Type * operator & () const { return arrayZ; }
_ZNK10hb_array_tIKN2OT11HBGlyphID16EE7__len__Ev:
  121|      3|  unsigned __len__ () const { return length; }
_ZNK17hb_sorted_array_tIKN2OT6RecordINS0_6ScriptEEEE5bfindIjEEbRKT_Pj14hb_not_found_tj:
  408|     98|  {
  409|     98|    unsigned pos;
  410|       |
  411|     98|    if (bsearch_impl (x, &pos))
  ------------------
  |  Branch (411:9): [True: 2, False: 96]
  ------------------
  412|      2|    {
  413|      2|      if (i)
  ------------------
  |  Branch (413:11): [True: 2, False: 0]
  ------------------
  414|      2|	*i = pos;
  415|      2|      return true;
  416|      2|    }
  417|       |
  418|     96|    if (i)
  ------------------
  |  Branch (418:9): [True: 96, False: 0]
  ------------------
  419|     96|    {
  420|     96|      switch (not_found)
  ------------------
  |  Branch (420:15): [True: 0, False: 96]
  ------------------
  421|     96|      {
  422|      0|	case HB_NOT_FOUND_DONT_STORE:
  ------------------
  |  Branch (422:2): [True: 0, False: 96]
  ------------------
  423|      0|	  break;
  424|       |
  425|     96|	case HB_NOT_FOUND_STORE:
  ------------------
  |  Branch (425:2): [True: 96, False: 0]
  ------------------
  426|     96|	  *i = to_store;
  427|     96|	  break;
  428|       |
  429|      0|	case HB_NOT_FOUND_STORE_CLOSEST:
  ------------------
  |  Branch (429:2): [True: 0, False: 96]
  ------------------
  430|      0|	  *i = pos;
  431|      0|	  break;
  432|     96|      }
  433|     96|    }
  434|     96|    return false;
  435|     96|  }
_ZNK17hb_sorted_array_tIKN2OT6RecordINS0_6ScriptEEEE12bsearch_implIjJEEEbRKT_PjDpT0_:
  438|     98|  {
  439|     98|    return hb_bsearch_impl (pos,
  440|     98|			    x,
  441|     98|			    this->arrayZ,
  442|     98|			    this->length,
  443|     98|			    sizeof (Type),
  444|     98|			    _hb_cmp_method<T, Type, Ts...>,
  445|     98|			    std::forward<Ts> (ds)...);
  446|     98|  }
_ZNK10hb_array_tIKcE2asIN2OT6Layout4GPOSELj1ELPv0EEEPKT_v:
  279|   204k|  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |   99|   204k|#define hb_min_size(T) hb_min_size<T>::value
  ------------------
                { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (279:12): [True: 0, False: 204k]
  ------------------
_ZNK10hb_array_tIN2OT33hb_accelerate_subtables_context_t15hb_applicable_tEE5beginEv:
  133|      5|  Type *begin () const { return arrayZ; }
_ZNK10hb_array_tIN2OT33hb_accelerate_subtables_context_t15hb_applicable_tEE3endEv:
  134|      5|  Type *end () const { return arrayZ + length; }
_ZNK10hb_array_tIKcE2asIN2OT6Layout4GSUBELj1ELPv0EEEPKT_v:
  279|   204k|  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |   99|   204k|#define hb_min_size(T) hb_min_size<T>::value
  ------------------
                { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (279:12): [True: 0, False: 204k]
  ------------------
_ZN10hb_array_tIN11hb_ot_map_t13feature_map_tEEC2EPS1_j:
   59|    117|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZN17hb_sorted_array_tIKN11hb_ot_map_t13feature_map_tEEC2IS1_LPv0EEERK10hb_array_tIT_E:
  368|    117|    hb_iter_t<hb_sorted_array_t, Type&> () {}
_ZN10hb_array_tIKN11hb_ot_map_t13feature_map_tEEC2IS1_LPv0EEERKS_IT_E:
   67|    117|    arrayZ (o.arrayZ), length (o.length), backwards_length (o.backwards_length) {}
_ZN17hb_sorted_array_tIKN2OT11HBGlyphID16EEC2EPS2_j:
  360|      3|  constexpr hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
_ZN10hb_array_tIKN2OT11HBGlyphID16EEC2EPS2_j:
   59|      3|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZNK10hb_array_tIKcE2asIN3AAT4morxELj1ELPv0EEEPKT_v:
  279|     13|  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |   99|     13|#define hb_min_size(T) hb_min_size<T>::value
  ------------------
                { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |  124|     13|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (279:12): [True: 13, False: 0]
  ------------------
_ZN17hb_sorted_array_tIKN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEEC2EPS6_j:
  360|      1|  constexpr hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
_ZN10hb_array_tIKN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEEC2EPS6_j:
   59|      1|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZNK10hb_array_tIKcE2asIN3AAT4mortELj1ELPv0EEEPKT_v:
  279|     13|  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |   99|     13|#define hb_min_size(T) hb_min_size<T>::value
  ------------------
                { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |  124|     13|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (279:12): [True: 13, False: 0]
  ------------------
_ZNK10hb_array_tIKcE2asIN3AAT4kerxELj1ELPv0EEEPKT_v:
  279|     13|  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |   99|     13|#define hb_min_size(T) hb_min_size<T>::value
  ------------------
                { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |  124|     13|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (279:12): [True: 13, False: 0]
  ------------------
_ZNK10hb_array_tIKcE2asIN3AAT4trakELj1ELPv0EEEPKT_v:
  279|     13|  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |   99|     13|#define hb_min_size(T) hb_min_size<T>::value
  ------------------
                { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |  124|     13|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (279:12): [True: 13, False: 0]
  ------------------
_ZN10hb_array_tIKN2OT5IndexEEC2EPS2_j:
   59|     84|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZN17hb_sorted_array_tIKN2OT6RecordINS0_6ScriptEEEEC2EPS4_j:
  360|     98|  constexpr hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
_ZN10hb_array_tIKN2OT6RecordINS0_6ScriptEEEEC2EPS4_j:
   59|     98|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZN17hb_sorted_array_tIKN2OT6RecordINS0_7LangSysEEEEC2EPS4_j:
  360|     48|  constexpr hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
_ZN10hb_array_tIKN2OT6RecordINS0_7LangSysEEEEC2EPS4_j:
   59|     48|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZN10hb_array_tIN2OT33hb_accelerate_subtables_context_t15hb_applicable_tEEC2EPS2_j:
   59|      5|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZNK10hb_array_tIKcE2asIN2OT4kernELj1ELPv0EEEPKT_v:
  279|     23|  { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |   99|     23|#define hb_min_size(T) hb_min_size<T>::value
  ------------------
                { return length < hb_min_size (T) ? &Null (T) : reinterpret_cast<const T *> (arrayZ); }
  ------------------
  |  |  124|     12|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (279:12): [True: 12, False: 11]
  ------------------
_Z8hb_arrayIN19hb_ot_map_builder_t14feature_info_tEE10hb_array_tIT_EPS3_j:
  338|     13|{ return hb_array_t<T> (array, length); }
_ZN10hb_array_tIN19hb_ot_map_builder_t14feature_info_tEEC2EPS1_j:
   59|     13|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZN10hb_array_tIN19hb_ot_map_builder_t14feature_info_tEE5qsortEPFiPKvS4_E:
  221|     13|  {
  222|       |    //static_assert (hb_enable_if (hb_is_trivially_copy_assignable(Type)), "");
  223|     13|    if (likely (length))
  ------------------
  |  |  259|     13|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 13, False: 0]
  |  |  ------------------
  ------------------
  224|     13|      hb_qsort (arrayZ, length, this->get_item_size (), cmp_);
  225|     13|    return hb_sorted_array_t<Type> (*this);
  226|     13|  }
_ZN17hb_sorted_array_tIN19hb_ot_map_builder_t14feature_info_tEEC2IS1_LPv0EEERK10hb_array_tIT_E:
  368|     13|    hb_iter_t<hb_sorted_array_t, Type&> () {}
_ZN10hb_array_tIN11hb_ot_map_t12lookup_map_tEEC2EPS1_j:
   59|      4|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZNK10hb_array_tIN11hb_ot_map_t12lookup_map_tEE9sub_arrayEjj:
  271|      2|  { return sub_array (start_offset, &seg_count); }
_ZNK10hb_array_tIN11hb_ot_map_t12lookup_map_tEE9sub_arrayEjPj:
  257|      2|  {
  258|      2|    if (!start_offset && !seg_count)
  ------------------
  |  Branch (258:9): [True: 2, False: 0]
  |  Branch (258:26): [True: 0, False: 2]
  ------------------
  259|      0|      return *this;
  260|       |
  261|      2|    unsigned int count = length;
  262|      2|    if (unlikely (start_offset > count))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  263|      0|      count = 0;
  264|      2|    else
  265|      2|      count -= start_offset;
  266|      2|    if (seg_count)
  ------------------
  |  Branch (266:9): [True: 2, False: 0]
  ------------------
  267|      2|      count = *seg_count = hb_min (count, *seg_count);
  268|      2|    return hb_array_t (arrayZ + start_offset, count);
  269|      2|  }
_ZN10hb_array_tIN11hb_ot_map_t12lookup_map_tEE5qsortEv:
  228|      2|  {
  229|       |    //static_assert (hb_enable_if (hb_is_trivially_copy_assignable(Type)), "");
  230|      2|    if (likely (length))
  ------------------
  |  |  259|      2|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  231|      2|      hb_qsort (arrayZ, length, this->get_item_size (), Type::cmp);
  232|      2|    return hb_sorted_array_t<Type> (*this);
  233|      2|  }
_ZN17hb_sorted_array_tIN11hb_ot_map_t12lookup_map_tEEC2IS1_LPv0EEERK10hb_array_tIT_E:
  368|      2|    hb_iter_t<hb_sorted_array_t, Type&> () {}
_Z15hb_sorted_arrayIK7LangTagE17hb_sorted_array_tIT_EPS3_j:
  450|      3|{ return hb_sorted_array_t<T> (array, length); }
_ZN17hb_sorted_array_tIK7LangTagEC2EPS1_j:
  360|      3|  constexpr hb_sorted_array_t (Type *array_, unsigned int length_) : hb_array_t<Type> (array_, length_) {}
_ZN10hb_array_tIK7LangTagEC2EPS1_j:
   59|      3|  constexpr hb_array_t (Type *array_, unsigned int length_) : arrayZ (array_), length (length_) {}
_ZNK17hb_sorted_array_tIK7LangTagE5bfindIjEEbRKT_Pj14hb_not_found_tj:
  408|      3|  {
  409|      3|    unsigned pos;
  410|       |
  411|      3|    if (bsearch_impl (x, &pos))
  ------------------
  |  Branch (411:9): [True: 1, False: 2]
  ------------------
  412|      1|    {
  413|      1|      if (i)
  ------------------
  |  Branch (413:11): [True: 1, False: 0]
  ------------------
  414|      1|	*i = pos;
  415|      1|      return true;
  416|      1|    }
  417|       |
  418|      2|    if (i)
  ------------------
  |  Branch (418:9): [True: 2, False: 0]
  ------------------
  419|      2|    {
  420|      2|      switch (not_found)
  ------------------
  |  Branch (420:15): [True: 0, False: 2]
  ------------------
  421|      2|      {
  422|      2|	case HB_NOT_FOUND_DONT_STORE:
  ------------------
  |  Branch (422:2): [True: 2, False: 0]
  ------------------
  423|      2|	  break;
  424|       |
  425|      0|	case HB_NOT_FOUND_STORE:
  ------------------
  |  Branch (425:2): [True: 0, False: 2]
  ------------------
  426|      0|	  *i = to_store;
  427|      0|	  break;
  428|       |
  429|      0|	case HB_NOT_FOUND_STORE_CLOSEST:
  ------------------
  |  Branch (429:2): [True: 0, False: 2]
  ------------------
  430|      0|	  *i = pos;
  431|      0|	  break;
  432|      2|      }
  433|      2|    }
  434|      2|    return false;
  435|      2|  }
_ZNK17hb_sorted_array_tIK7LangTagE12bsearch_implIjJEEEbRKT_PjDpT0_:
  438|      3|  {
  439|      3|    return hb_bsearch_impl (pos,
  440|      3|			    x,
  441|      3|			    this->arrayZ,
  442|      3|			    this->length,
  443|      3|			    sizeof (Type),
  444|      3|			    _hb_cmp_method<T, Type, Ts...>,
  445|      3|			    std::forward<Ts> (ds)...);
  446|      3|  }

_ZN15hb_atomic_int_tC2Ev:
  184|   207k|  hb_atomic_int_t () = default;
_ZN15hb_atomic_int_tC2Ei:
  185|   204k|  constexpr hb_atomic_int_t (int v) : v (v) {}
_ZN15hb_atomic_ptr_tI20hb_user_data_array_tEC2Ev:
  205|   204k|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_int_taSEi:
  187|   617k|  hb_atomic_int_t& operator = (int v_) { set_relaxed (v_); return *this; }
_ZN15hb_atomic_int_t11set_relaxedEi:
  190|   617k|  void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   60|   617k|#define hb_atomic_int_impl_set_relaxed(AI, V)	__atomic_store_n ((AI), (V), __ATOMIC_RELAXED)
  ------------------
_ZN15hb_atomic_ptr_tI20hb_user_data_array_tE4initEPS0_:
  209|   204k|  void init (T* v_ = nullptr) { set_relaxed (v_); }
_ZN15hb_atomic_ptr_tI20hb_user_data_array_tE11set_relaxedEPS0_:
  210|   204k|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|   204k|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_int_tcviEv:
  188|  8.60M|  operator int () const { return get_relaxed (); }
_ZNK15hb_atomic_int_t11get_relaxedEv:
  192|  8.60M|  int get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); }
  ------------------
  |  |   62|  8.60M|#define hb_atomic_int_impl_get_relaxed(AI)	__atomic_load_n ((AI), __ATOMIC_RELAXED)
  ------------------
_ZN15hb_atomic_int_t3incEv:
  194|  1.02M|  int inc () { return hb_atomic_int_impl_add (&v,  1); }
  ------------------
  |  |   59|  1.02M|#define hb_atomic_int_impl_add(AI, V)		__atomic_fetch_add ((AI), (V), __ATOMIC_ACQ_REL)
  ------------------
_ZN15hb_atomic_int_t3decEv:
  195|  1.22M|  int dec () { return hb_atomic_int_impl_add (&v, -1); }
  ------------------
  |  |   59|  1.22M|#define hb_atomic_int_impl_add(AI, V)		__atomic_fetch_add ((AI), (V), __ATOMIC_ACQ_REL)
  ------------------
_ZNK15hb_atomic_ptr_tI20hb_user_data_array_tE11get_acquireEv:
  212|   204k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   204k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZNK15hb_atomic_ptr_tI20hb_user_data_array_tE7cmpexchEPKS0_PS0_:
  213|     11|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|     11|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZN17hb_atomic_short_taSEs:
  169|  2.99k|  hb_atomic_short_t& operator = (short v_) { set_relaxed (v_); return *this; }
_ZNK17hb_atomic_short_tcvsEv:
  170|  2.93M|  operator short () const { return get_relaxed (); }
_ZN17hb_atomic_short_t11set_relaxedEs:
  172|  2.99k|  void set_relaxed (short v_) { hb_atomic_int_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   60|  2.99k|#define hb_atomic_int_impl_set_relaxed(AI, V)	__atomic_store_n ((AI), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK17hb_atomic_short_t11get_relaxedEv:
  174|  2.93M|  short get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); }
  ------------------
  |  |   62|  2.93M|#define hb_atomic_int_impl_get_relaxed(AI)	__atomic_load_n ((AI), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIP17hb_ot_font_data_tE11get_acquireEv:
  212|   204k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   204k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIP17hb_ot_font_data_tE11set_relaxedES1_:
  210|     32|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     32|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIP23hb_fallback_font_data_tE11get_acquireEv:
  212|     32|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     32|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIP23hb_fallback_font_data_tE11set_relaxedES1_:
  210|     32|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     32|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tI18hb_language_item_tEcvPT_IS0_EEv:
  216|   102k|  template <typename C> operator C * () const { return get_acquire (); }
_ZNK15hb_atomic_ptr_tI18hb_language_item_tE11get_acquireEv:
  212|   102k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   102k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZNK15hb_atomic_ptr_tI18hb_language_item_tE7cmpexchEPKS0_PS0_:
  213|      3|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|      3|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
hb-common.cc:_ZL28_hb_atomic_ptr_impl_cmplexchPPKvS0_S0_:
   70|      4|{
   71|      4|  const void *O = O_; // Need lvalue
   72|      4|  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
   73|      4|}
_ZNK15hb_atomic_ptr_tIPK18hb_language_impl_tEcvPT_IS1_EEv:
  216|   102k|  template <typename C> operator C * () const { return get_acquire (); }
_ZNK15hb_atomic_ptr_tIPK18hb_language_impl_tE11get_acquireEv:
  212|   102k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   102k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZNK15hb_atomic_ptr_tIPK18hb_language_impl_tE7cmpexchES2_S2_:
  213|      1|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|      1|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZN15hb_atomic_ptr_tIP17hb_ot_face_data_tEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIP23hb_fallback_face_data_tEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIP9hb_blob_tEC2Ev:
  205|    264|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18cmap_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18hmtx_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18post_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18name_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18meta_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18vmtx_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18glyf_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18cff1_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18cff2_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18gvar_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18GDEF_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18GSUB_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18GPOS_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18CBDT_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT18sbix_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIPN2OT17SVG_accelerator_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIN9hb_face_t11plan_node_tEEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZNK15hb_atomic_ptr_tIN9hb_face_t11plan_node_tEEcvPT_IS1_EEv:
  216|   204k|  template <typename C> operator C * () const { return get_acquire (); }
_ZNK15hb_atomic_ptr_tIN9hb_face_t11plan_node_tEE11get_acquireEv:
  212|   204k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   204k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZNK15hb_atomic_ptr_tIP17hb_ot_face_data_tE11get_acquireEv:
  212|   204k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   204k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIP17hb_ot_face_data_tE11set_relaxedES1_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIP23hb_fallback_face_data_tE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIP23hb_fallback_face_data_tE11set_relaxedES1_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
hb-face.cc:_ZL28_hb_atomic_ptr_impl_cmplexchPPKvS0_S0_:
   70|     11|{
   71|     11|  const void *O = O_; // Need lvalue
   72|     11|  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
   73|     11|}
_ZNK15hb_atomic_ptr_tIPN2OT18cmap_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZNK15hb_atomic_ptr_tIP9hb_blob_tE11get_acquireEv:
  212|    350|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|    350|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZNK15hb_atomic_ptr_tIP9hb_blob_tE7cmpexchEPKS0_S1_:
  213|     66|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|     66|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZN15hb_atomic_ptr_tIP17hb_ot_font_data_tEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIP23hb_fallback_font_data_tEC2Ev:
  205|     11|  hb_atomic_ptr_t () = default;
_ZN15hb_atomic_ptr_tIP9hb_blob_tE11set_relaxedES1_:
  210|    264|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|    264|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18cmap_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18hmtx_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18hmtx_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18post_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18post_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18name_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18name_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18meta_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18meta_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18vmtx_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18vmtx_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18glyf_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18glyf_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18cff1_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18cff1_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18cff2_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18cff2_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18gvar_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18gvar_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18GDEF_accelerator_tEE11get_acquireEv:
  212|  1.02M|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|  1.02M|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18GDEF_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIN2OT33hb_ot_layout_lookup_accelerator_tEEcvPT_IvEEv:
  216|     42|  template <typename C> operator C * () const { return get_acquire (); }
_ZNK15hb_atomic_ptr_tIN2OT33hb_ot_layout_lookup_accelerator_tEE11get_acquireEv:
  212|     87|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     87|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18GSUB_accelerator_tEE11get_acquireEv:
  212|   409k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   409k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18GSUB_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18GPOS_accelerator_tEE11get_acquireEv:
  212|   409k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   409k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18GPOS_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18CBDT_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18CBDT_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18sbix_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT18sbix_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT17SVG_accelerator_tEE11get_acquireEv:
  212|     11|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     11|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZN15hb_atomic_ptr_tIPN2OT17SVG_accelerator_tEE11set_relaxedES2_:
  210|     11|  void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
  ------------------
  |  |   65|     11|#define hb_atomic_ptr_impl_set_relaxed(P, V)	__atomic_store_n ((P), (V), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18GDEF_accelerator_tEE7cmpexchEPKS1_S2_:
  213|     11|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|     11|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZNK15hb_atomic_ptr_tIN2OT33hb_ot_layout_lookup_accelerator_tEE7cmpexchEPKS1_PS1_:
  213|      5|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|      5|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZNK15hb_atomic_ptr_tIP15hb_font_funcs_tE11get_acquireEv:
  212|     12|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|     12|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
hb-ot-font.cc:_ZL28_hb_atomic_ptr_impl_cmplexchPPKvS0_S0_:
   70|     13|{
   71|     13|  const void *O = O_; // Need lvalue
   72|     13|  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
   73|     13|}
_ZNK15hb_atomic_ptr_tIP15hb_font_funcs_tE7cmpexchEPKS0_S1_:
  213|      2|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|      2|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZNK15hb_atomic_ptr_tI10hb_cache_tILj24ELj16ELj8ELb1EEE11get_relaxedEv:
  211|     11|  T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); }
  ------------------
  |  |   66|     11|#define hb_atomic_ptr_impl_get_relaxed(P)	__atomic_load_n ((P), __ATOMIC_RELAXED)
  ------------------
_ZNK15hb_atomic_ptr_tIP17hb_ot_font_data_tE7cmpexchEPKS0_S1_:
  213|     11|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|     11|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
hb-shape-plan.cc:_ZL28_hb_atomic_ptr_impl_cmplexchPPKvS0_S0_:
   70|     35|{
   71|     35|  const void *O = O_; // Need lvalue
   72|     35|  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
   73|     35|}
_ZNK15hb_atomic_ptr_tIP17hb_ot_face_data_tE7cmpexchEPKS0_S1_:
  213|     11|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|     11|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZNK15hb_atomic_ptr_tIN9hb_face_t11plan_node_tEE7cmpexchEPKS1_PS1_:
  213|     13|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|     13|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZNK15hb_atomic_ptr_tIP17hb_shaper_entry_tE11get_acquireEv:
  212|   204k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   204k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZNK15hb_atomic_ptr_tIP17hb_shaper_entry_tE7cmpexchEPKS0_S1_:
  213|      1|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|      1|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
hb-shaper.cc:_ZL28_hb_atomic_ptr_impl_cmplexchPPKvS0_S0_:
   70|      1|{
   71|      1|  const void *O = O_; // Need lvalue
   72|      1|  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
   73|      1|}
_ZN17hb_atomic_short_tC2Ev:
  166|  2.81k|  hb_atomic_short_t () = default;
hb-aat-layout.cc:_ZL28_hb_atomic_ptr_impl_cmplexchPPKvS0_S0_:
   70|     55|{
   71|     55|  const void *O = O_; // Need lvalue
   72|     55|  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
   73|     55|}
hb-ot-layout.cc:_ZL28_hb_atomic_ptr_impl_cmplexchPPKvS0_S0_:
   70|     38|{
   71|     38|  const void *O = O_; // Need lvalue
   72|     38|  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
   73|     38|}
_ZNK15hb_atomic_ptr_tIPN2OT18GSUB_accelerator_tEE7cmpexchEPKS1_S2_:
  213|     11|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|     11|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZNK15hb_atomic_ptr_tIPN2OT18GPOS_accelerator_tEE7cmpexchEPKS1_S2_:
  213|     11|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|     11|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
_ZNK15hb_atomic_ptr_tIP18hb_unicode_funcs_tE11get_acquireEv:
  212|   614k|  T *get_acquire () const { return (T *) hb_atomic_ptr_impl_get ((void **) &v); }
  ------------------
  |  |   67|   614k|#define hb_atomic_ptr_impl_get(P)		__atomic_load_n ((P), __ATOMIC_ACQUIRE)
  ------------------
_ZNK15hb_atomic_ptr_tIP18hb_unicode_funcs_tE7cmpexchEPKS0_S1_:
  213|      2|  bool cmpexch (const T *old, T *new_) const { return hb_atomic_ptr_impl_cmpexch ((void **) &v, (void *) old, (void *) new_); }
  ------------------
  |  |   74|      2|#define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
  ------------------
hb-ucd.cc:_ZL28_hb_atomic_ptr_impl_cmplexchPPKvS0_S0_:
   70|      2|{
   71|      2|  const void *O = O_; // Need lvalue
   72|      2|  return __atomic_compare_exchange_n ((void **) P, (void **) &O, (void *) N, true, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);
   73|      2|}

hb_blob_create:
   74|     35|{
   75|     35|  if (!length)
  ------------------
  |  Branch (75:7): [True: 0, False: 35]
  ------------------
   76|      0|  {
   77|      0|    if (destroy)
  ------------------
  |  Branch (77:9): [True: 0, False: 0]
  ------------------
   78|      0|      destroy (user_data);
   79|      0|    return hb_blob_get_empty ();
   80|      0|  }
   81|       |
   82|     35|  hb_blob_t *blob = hb_blob_create_or_fail (data, length, mode,
   83|     35|					    user_data, destroy);
   84|     35|  return likely (blob) ? blob : hb_blob_get_empty ();
  ------------------
  |  |  259|     35|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 35, False: 0]
  |  |  ------------------
  ------------------
   85|     35|}
hb_blob_create_or_fail:
  112|     35|{
  113|     35|  hb_blob_t *blob;
  114|       |
  115|     35|  if (length >= 1u << 31 ||
  ------------------
  |  Branch (115:7): [True: 0, False: 35]
  ------------------
  116|     35|      !(blob = hb_object_create<hb_blob_t> ()))
  ------------------
  |  Branch (116:7): [True: 0, False: 35]
  ------------------
  117|      0|  {
  118|      0|    if (destroy)
  ------------------
  |  Branch (118:9): [True: 0, False: 0]
  ------------------
  119|      0|      destroy (user_data);
  120|      0|    return nullptr;
  121|      0|  }
  122|       |
  123|     35|  blob->data = data;
  124|     35|  blob->length = length;
  125|     35|  blob->mode = mode;
  126|       |
  127|     35|  blob->user_data = user_data;
  128|     35|  blob->destroy = destroy;
  129|       |
  130|     35|  if (blob->mode == HB_MEMORY_MODE_DUPLICATE) {
  ------------------
  |  Branch (130:7): [True: 0, False: 35]
  ------------------
  131|      0|    blob->mode = HB_MEMORY_MODE_READONLY;
  132|      0|    if (!blob->try_make_writable ())
  ------------------
  |  Branch (132:9): [True: 0, False: 0]
  ------------------
  133|      0|    {
  134|      0|      hb_blob_destroy (blob);
  135|      0|      return nullptr;
  136|      0|    }
  137|      0|  }
  138|       |
  139|     35|  return blob;
  140|     35|}
hb_blob_get_empty:
  227|    130|{
  228|    130|  return const_cast<hb_blob_t *> (&Null (hb_blob_t));
  ------------------
  |  |  124|    130|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  229|    130|}
hb_blob_reference:
  245|   409k|{
  246|   409k|  return hb_object_reference (blob);
  247|   409k|}
hb_blob_destroy:
  263|   409k|{
  264|   409k|  if (!hb_object_destroy (blob)) return;
  ------------------
  |  Branch (264:7): [True: 409k, False: 35]
  ------------------
  265|       |
  266|     35|  hb_free (blob);
  ------------------
  |  |  237|     35|#define hb_free hb_free_impl
  ------------------
  267|     35|}
hb_blob_make_immutable:
  323|     35|{
  324|     35|  if (hb_object_is_immutable (blob))
  ------------------
  |  Branch (324:7): [True: 0, False: 35]
  ------------------
  325|      0|    return;
  326|       |
  327|     35|  hb_object_make_immutable (blob);
  328|     35|}

_ZN9hb_blob_t17destroy_user_dataEv:
   44|     35|  {
   45|     35|    if (destroy)
  ------------------
  |  Branch (45:9): [True: 35, False: 0]
  ------------------
   46|     35|    {
   47|     35|      destroy (user_data);
   48|     35|      user_data = nullptr;
   49|     35|      destroy = nullptr;
   50|     35|    }
   51|     35|  }
_ZN9hb_blob_tD2Ev:
   41|     35|  ~hb_blob_t () { destroy_user_data (); }
_ZNK9hb_blob_t8as_bytesEv:
   57|   819k|  hb_bytes_t as_bytes () const { return hb_bytes_t (data, length); }
_ZN13hb_blob_ptr_tIN2OT4GDEFEE7destroyEv:
   91|     11|  void destroy () { hb_blob_destroy (b.get_raw ()); b = nullptr; }
_ZN13hb_blob_ptr_tIN2OT6Layout4GSUBEE7destroyEv:
   91|     11|  void destroy () { hb_blob_destroy (b.get_raw ()); b = nullptr; }
_ZN13hb_blob_ptr_tIN2OT6Layout4GPOSEE7destroyEv:
   91|     11|  void destroy () { hb_blob_destroy (b.get_raw ()); b = nullptr; }
_ZNK9hb_blob_t2asIN2OT4maxpEEEPKT_v:
   59|     11|  const Type* as () const { return as_bytes ().as<Type> (); }
_ZN13hb_blob_ptr_tIN2OT4GDEFEEaSEP9hb_blob_t:
   83|     11|  hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; }
_ZNK13hb_blob_ptr_tIN2OT4GDEFEEptEv:
   84|    215|  const T * operator -> () const { return get (); }
_ZNK13hb_blob_ptr_tIN2OT4GDEFEE3getEv:
   88|   409k|  const T * get () const { return b->as<T> (); }
_ZNK9hb_blob_t2asIN2OT4GDEFEEEPKT_v:
   59|   409k|  const Type* as () const { return as_bytes ().as<Type> (); }
_ZNK13hb_blob_ptr_tIN2OT4GDEFEE8get_blobEv:
   89|    191|  hb_blob_t * get_blob () const { return b.get_raw (); }
_ZNK13hb_blob_ptr_tIN2OT4GDEFEEdeEv:
   85|   409k|  const T & operator * () const  { return *get (); }
_ZN13hb_blob_ptr_tIN2OT6Layout4GPOSEEaSEP9hb_blob_t:
   83|     11|  hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GPOSEE8get_blobEv:
   89|   204k|  hb_blob_t * get_blob () const { return b.get_raw (); }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GPOSEEptEv:
   84|     38|  const T * operator -> () const { return get (); }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GPOSEE3getEv:
   88|   204k|  const T * get () const { return b->as<T> (); }
_ZNK9hb_blob_t2asIN2OT6Layout4GPOSEEEPKT_v:
   59|   204k|  const Type* as () const { return as_bytes ().as<Type> (); }
_ZN13hb_blob_ptr_tIN2OT6Layout4GSUBEEaSEP9hb_blob_t:
   83|     11|  hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GSUBEE8get_blobEv:
   89|   204k|  hb_blob_t * get_blob () const { return b.get_raw (); }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GSUBEEptEv:
   84|     37|  const T * operator -> () const { return get (); }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GSUBEE3getEv:
   88|   204k|  const T * get () const { return b->as<T> (); }
_ZNK9hb_blob_t2asIN2OT6Layout4GSUBEEEPKT_v:
   59|   204k|  const Type* as () const { return as_bytes ().as<Type> (); }
_ZN13hb_blob_ptr_tIN2OT4GDEFEEC2EP9hb_blob_t:
   82|     11|  hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {}
_ZNK13hb_blob_ptr_tIN2OT4GDEFEEcvPKT_IS1_EEv:
   86|      9|  template <typename C> operator const C * () const { return get (); }
_ZNK9hb_blob_t2asIN3AAT4morxEEEPKT_v:
   59|     13|  const Type* as () const { return as_bytes ().as<Type> (); }
_ZNK9hb_blob_t2asIN3AAT4mortEEEPKT_v:
   59|     13|  const Type* as () const { return as_bytes ().as<Type> (); }
_ZNK9hb_blob_t2asIN3AAT4kerxEEEPKT_v:
   59|     13|  const Type* as () const { return as_bytes ().as<Type> (); }
_ZNK9hb_blob_t2asIN3AAT4trakEEEPKT_v:
   59|     13|  const Type* as () const { return as_bytes ().as<Type> (); }
_ZN13hb_blob_ptr_tIN2OT6Layout4GSUBEEC2EP9hb_blob_t:
   82|     11|  hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {}
_ZN13hb_blob_ptr_tIN2OT6Layout4GPOSEEC2EP9hb_blob_t:
   82|     11|  hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {}
_ZNK9hb_blob_t2asIN2OT4kernEEEPKT_v:
   59|     23|  const Type* as () const { return as_bytes ().as<Type> (); }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GSUBEE10get_lengthEv:
   90|     11|  unsigned int get_length () const { return b.get ()->length; }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GPOSEE10get_lengthEv:
   90|     11|  unsigned int get_length () const { return b.get ()->length; }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GSUBEEdeEv:
   85|   204k|  const T & operator * () const  { return *get (); }
_ZNK13hb_blob_ptr_tIN2OT6Layout4GPOSEEdeEv:
   85|   204k|  const T & operator * () const  { return *get (); }

hb_segment_properties_equal:
   66|   511k|{
   67|   511k|  return a->direction == b->direction &&
  ------------------
  |  Branch (67:10): [True: 511k, False: 0]
  ------------------
   68|   511k|	 a->script    == b->script    &&
  ------------------
  |  Branch (68:3): [True: 409k, False: 102k]
  ------------------
   69|   511k|	 a->language  == b->language  &&
  ------------------
  |  Branch (69:3): [True: 409k, False: 0]
  ------------------
   70|   511k|	 a->reserved1 == b->reserved1 &&
  ------------------
  |  Branch (70:3): [True: 409k, False: 0]
  ------------------
   71|   511k|	 a->reserved2 == b->reserved2;
  ------------------
  |  Branch (71:3): [True: 409k, False: 0]
  ------------------
   72|       |
   73|   511k|}
_ZN11hb_buffer_t7enlargeEj:
  160|   204k|{
  161|   204k|  if (unlikely (!successful))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  162|      0|    return false;
  163|   204k|  if (unlikely (size > max_len))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  164|      0|  {
  165|      0|    successful = false;
  166|      0|    return false;
  167|      0|  }
  168|       |
  169|   204k|  unsigned int new_allocated = allocated;
  170|   204k|  hb_glyph_position_t *new_pos = nullptr;
  171|   204k|  hb_glyph_info_t *new_info = nullptr;
  172|   204k|  bool separate_out = out_info != info;
  173|       |
  174|   204k|  if (unlikely (hb_unsigned_mul_overflows (size, sizeof (info[0]))))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  175|      0|    goto done;
  176|       |
  177|   409k|  while (size >= new_allocated)
  ------------------
  |  Branch (177:10): [True: 204k, False: 204k]
  ------------------
  178|   204k|    new_allocated += (new_allocated >> 1) + 32;
  179|       |
  180|   204k|  unsigned new_bytes;
  181|   204k|  if (unlikely (hb_unsigned_mul_overflows (new_allocated, sizeof (info[0]), &new_bytes)))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  182|      0|    goto done;
  183|       |
  184|   204k|  static_assert (sizeof (info[0]) == sizeof (pos[0]), "");
  185|   204k|  new_pos = (hb_glyph_position_t *) hb_realloc (pos, new_bytes);
  ------------------
  |  |  236|   204k|#define hb_realloc hb_realloc_impl
  ------------------
  186|   204k|  new_info = (hb_glyph_info_t *) hb_realloc (info, new_bytes);
  ------------------
  |  |  236|   204k|#define hb_realloc hb_realloc_impl
  ------------------
  187|       |
  188|   204k|done:
  189|   204k|  if (unlikely (!new_pos || !new_info))
  ------------------
  |  |  260|   409k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  190|      0|    successful = false;
  191|       |
  192|   204k|  if (likely (new_pos))
  ------------------
  |  |  259|   204k|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 204k, False: 0]
  |  |  ------------------
  ------------------
  193|   204k|    pos = new_pos;
  194|       |
  195|   204k|  if (likely (new_info))
  ------------------
  |  |  259|   204k|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 204k, False: 0]
  |  |  ------------------
  ------------------
  196|   204k|    info = new_info;
  197|       |
  198|   204k|  out_info = separate_out ? (hb_glyph_info_t *) pos : info;
  ------------------
  |  Branch (198:14): [True: 0, False: 204k]
  ------------------
  199|   204k|  if (likely (successful))
  ------------------
  |  |  259|   204k|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 204k, False: 0]
  |  |  ------------------
  ------------------
  200|   204k|    allocated = new_allocated;
  201|       |
  202|   204k|  return likely (successful);
  ------------------
  |  |  259|   204k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  203|   204k|}
_ZN11hb_buffer_t5resetEv:
  278|   409k|{
  279|   409k|  hb_unicode_funcs_destroy (unicode);
  280|   409k|  unicode = hb_unicode_funcs_reference (hb_unicode_funcs_get_default ());
  281|   409k|  flags = HB_BUFFER_FLAG_DEFAULT;
  282|   409k|  cluster_level = HB_BUFFER_CLUSTER_LEVEL_DEFAULT;
  283|   409k|  replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
  ------------------
  |  |  467|   409k|#define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu
  ------------------
  284|   409k|  invisible = 0;
  285|   409k|  not_found = 0;
  286|       |
  287|   409k|  clear ();
  288|   409k|}
_ZN11hb_buffer_t5clearEv:
  292|   409k|{
  293|   409k|  content_type = HB_BUFFER_CONTENT_TYPE_INVALID;
  294|   409k|  hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT;
  ------------------
  |  |  225|   409k|#define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
  |  |  226|   409k|				       HB_SCRIPT_INVALID, \
  |  |  227|   409k|				       HB_LANGUAGE_INVALID, \
  |  |  ------------------
  |  |  |  |  334|   409k|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  |  |  ------------------
  |  |  228|   409k|				       (void *) 0, \
  |  |  229|   409k|				       (void *) 0}
  ------------------
  295|   409k|  props = default_props;
  296|       |
  297|   409k|  successful = true;
  298|   409k|  shaping_failed = false;
  299|   409k|  have_output = false;
  300|   409k|  have_positions = false;
  301|       |
  302|   409k|  idx = 0;
  303|   409k|  len = 0;
  304|   409k|  out_len = 0;
  305|   409k|  out_info = info;
  306|       |
  307|   409k|  hb_memset (context, 0, sizeof context);
  308|   409k|  hb_memset (context_len, 0, sizeof context_len);
  309|       |
  310|   409k|  deallocate_var_all ();
  311|   409k|  serial = 0;
  312|   409k|  scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
  313|   409k|}
_ZN11hb_buffer_t5enterEv:
  317|   204k|{
  318|   204k|  deallocate_var_all ();
  319|   204k|  serial = 0;
  320|   204k|  shaping_failed = false;
  321|   204k|  scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
  322|   204k|  unsigned mul;
  323|   204k|  if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_LEN_FACTOR, &mul)))
  ------------------
  |  |  259|   204k|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 204k, False: 0]
  |  |  ------------------
  ------------------
  324|   204k|  {
  325|   204k|    max_len = hb_max (mul, (unsigned) HB_BUFFER_MAX_LEN_MIN);
  ------------------
  |  |   35|   204k|#define HB_BUFFER_MAX_LEN_MIN 16384
  ------------------
  326|   204k|  }
  327|   204k|  if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_OPS_FACTOR, &mul)))
  ------------------
  |  |  259|   204k|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 204k, False: 0]
  |  |  ------------------
  ------------------
  328|   204k|  {
  329|   204k|    max_ops = hb_max (mul, (unsigned) HB_BUFFER_MAX_OPS_MIN);
  ------------------
  |  |   45|   204k|#define HB_BUFFER_MAX_OPS_MIN 16384
  ------------------
  330|   204k|  }
  331|   204k|}
_ZN11hb_buffer_t5leaveEv:
  334|   409k|{
  335|   409k|  max_len = HB_BUFFER_MAX_LEN_DEFAULT;
  ------------------
  |  |   38|   409k|#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
  ------------------
  336|   409k|  max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
  ------------------
  |  |   48|   409k|#define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
  ------------------
  337|   409k|  deallocate_var_all ();
  338|   409k|  serial = 0;
  339|       |  // Intentionally not reseting shaping_failed, such that it can be inspected.
  340|   409k|}
_ZN11hb_buffer_t3addEjj:
  346|  2.93M|{
  347|  2.93M|  hb_glyph_info_t *glyph;
  348|       |
  349|  2.93M|  if (unlikely (!ensure (len + 1))) return;
  ------------------
  |  |  260|  2.93M|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2.93M]
  |  |  ------------------
  ------------------
  350|       |
  351|  2.93M|  glyph = &info[len];
  352|       |
  353|  2.93M|  hb_memset (glyph, 0, sizeof (*glyph));
  354|  2.93M|  glyph->codepoint = codepoint;
  355|  2.93M|  glyph->mask = 0;
  356|  2.93M|  glyph->cluster = cluster;
  357|       |
  358|  2.93M|  len++;
  359|  2.93M|}
_ZN11hb_buffer_t12clear_outputEv:
  374|   204k|{
  375|   204k|  have_output = true;
  376|   204k|  have_positions = false;
  377|       |
  378|   204k|  idx = 0;
  379|   204k|  out_len = 0;
  380|   204k|  out_info = info;
  381|   204k|}
_ZN11hb_buffer_t15clear_positionsEv:
  385|   204k|{
  386|   204k|  have_output = false;
  387|   204k|  have_positions = true;
  388|       |
  389|   204k|  out_len = 0;
  390|   204k|  out_info = info;
  391|       |
  392|   204k|  hb_memset (pos, 0, sizeof (pos[0]) * len);
  393|   204k|}
_ZN11hb_buffer_t4syncEv:
  397|   204k|{
  398|   204k|  bool ret = false;
  399|       |
  400|   204k|  assert (have_output);
  401|       |
  402|      0|  assert (idx <= len);
  403|       |
  404|   204k|  if (unlikely (!successful || !next_glyphs (len - idx)))
  ------------------
  |  |  260|   409k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  405|      0|    goto reset;
  406|       |
  407|   204k|  if (out_info != info)
  ------------------
  |  Branch (407:7): [True: 0, False: 204k]
  ------------------
  408|      0|  {
  409|      0|    pos = (hb_glyph_position_t *) info;
  410|      0|    info = out_info;
  411|      0|  }
  412|   204k|  len = out_len;
  413|   204k|  ret = true;
  414|       |
  415|   204k|reset:
  416|   204k|  have_output = false;
  417|   204k|  out_len = 0;
  418|   204k|  out_info = info;
  419|   204k|  idx = 0;
  420|       |
  421|   204k|  return ret;
  422|   204k|}
_ZN11hb_buffer_t19merge_clusters_implEjj:
  517|      3|{
  518|      3|  if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_CHARACTERS)
  ------------------
  |  Branch (518:7): [True: 0, False: 3]
  ------------------
  519|      0|  {
  520|      0|    unsafe_to_break (start, end);
  521|      0|    return;
  522|      0|  }
  523|       |
  524|      3|  unsigned int cluster = info[start].cluster;
  525|       |
  526|      6|  for (unsigned int i = start + 1; i < end; i++)
  ------------------
  |  Branch (526:36): [True: 3, False: 3]
  ------------------
  527|      3|    cluster = hb_min (cluster, info[i].cluster);
  528|       |
  529|       |  /* Extend end */
  530|      3|  if (cluster != info[end - 1].cluster)
  ------------------
  |  Branch (530:7): [True: 3, False: 0]
  ------------------
  531|      3|    while (end < len && info[end - 1].cluster == info[end].cluster)
  ------------------
  |  Branch (531:12): [True: 3, False: 0]
  |  Branch (531:25): [True: 0, False: 3]
  ------------------
  532|      0|      end++;
  533|       |
  534|       |  /* Extend start */
  535|      3|  if (cluster != info[start].cluster)
  ------------------
  |  Branch (535:7): [True: 0, False: 3]
  ------------------
  536|      0|    while (idx < start && info[start - 1].cluster == info[start].cluster)
  ------------------
  |  Branch (536:12): [True: 0, False: 0]
  |  Branch (536:27): [True: 0, False: 0]
  ------------------
  537|      0|      start--;
  538|       |
  539|       |  /* If we hit the start of buffer, continue in out-buffer. */
  540|      3|  if (idx == start && info[start].cluster != cluster)
  ------------------
  |  Branch (540:7): [True: 0, False: 3]
  |  Branch (540:23): [True: 0, False: 0]
  ------------------
  541|      0|    for (unsigned int i = out_len; i && out_info[i - 1].cluster == info[start].cluster; i--)
  ------------------
  |  Branch (541:36): [True: 0, False: 0]
  |  Branch (541:41): [True: 0, False: 0]
  ------------------
  542|      0|      set_cluster (out_info[i - 1], cluster);
  543|       |
  544|      9|  for (unsigned int i = start; i < end; i++)
  ------------------
  |  Branch (544:32): [True: 6, False: 3]
  ------------------
  545|      6|    set_cluster (info[i], cluster);
  546|      3|}
hb_buffer_create:
  737|   204k|{
  738|   204k|  hb_buffer_t *buffer;
  739|       |
  740|   204k|  if (!(buffer = hb_object_create<hb_buffer_t> ()))
  ------------------
  |  Branch (740:7): [True: 0, False: 204k]
  ------------------
  741|      0|    return hb_buffer_get_empty ();
  742|       |
  743|   204k|  buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT;
  ------------------
  |  |   38|   204k|#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */
  ------------------
  744|   204k|  buffer->max_ops = HB_BUFFER_MAX_OPS_DEFAULT;
  ------------------
  |  |   48|   204k|#define HB_BUFFER_MAX_OPS_DEFAULT 0x1FFFFFFF /* Shaping more than a billion operations? Let us know! */
  ------------------
  745|       |
  746|   204k|  buffer->reset ();
  747|       |
  748|   204k|  return buffer;
  749|   204k|}
hb_buffer_reset:
  784|   204k|{
  785|   204k|  if (unlikely (hb_object_is_immutable (buffer)))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  786|      0|    return;
  787|       |
  788|   204k|  buffer->reset ();
  789|   204k|}
hb_buffer_destroy:
  836|   204k|{
  837|   204k|  if (!hb_object_destroy (buffer)) return;
  ------------------
  |  Branch (837:7): [True: 0, False: 204k]
  ------------------
  838|       |
  839|   204k|  hb_unicode_funcs_destroy (buffer->unicode);
  840|       |
  841|   204k|  hb_free (buffer->info);
  ------------------
  |  |  237|   204k|#define hb_free hb_free_impl
  ------------------
  842|   204k|  hb_free (buffer->pos);
  ------------------
  |  |  237|   204k|#define hb_free hb_free_impl
  ------------------
  843|   204k|#ifndef HB_NO_BUFFER_MESSAGE
  844|   204k|  if (buffer->message_destroy)
  ------------------
  |  Branch (844:7): [True: 0, False: 204k]
  ------------------
  845|      0|    buffer->message_destroy (buffer->message_data);
  846|   204k|#endif
  847|       |
  848|   204k|  hb_free (buffer);
  ------------------
  |  |  237|   204k|#define hb_free hb_free_impl
  ------------------
  849|   204k|}
hb_buffer_set_segment_properties:
 1142|   204k|{
 1143|   204k|  if (unlikely (hb_object_is_immutable (buffer)))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
 1144|      0|    return;
 1145|       |
 1146|   204k|  buffer->props = *props;
 1147|   204k|}
hb_buffer_pre_allocate:
 1395|   204k|{
 1396|   204k|  return buffer->ensure (size);
 1397|   204k|}
hb_buffer_get_length:
 1498|   204k|{
 1499|   204k|  return buffer->len;
 1500|   204k|}
hb_buffer_get_glyph_infos:
 1519|   204k|{
 1520|   204k|  if (length)
  ------------------
  |  Branch (1520:7): [True: 0, False: 204k]
  ------------------
 1521|      0|    *length = buffer->len;
 1522|       |
 1523|   204k|  return (hb_glyph_info_t *) buffer->info;
 1524|   204k|}
hb_buffer_get_glyph_positions:
 1548|   409k|{
 1549|   409k|  if (length)
  ------------------
  |  Branch (1549:7): [True: 204k, False: 204k]
  ------------------
 1550|   204k|    *length = buffer->len;
 1551|       |
 1552|   409k|  if (!buffer->have_positions)
  ------------------
  |  Branch (1552:7): [True: 0, False: 409k]
  ------------------
 1553|      0|  {
 1554|      0|    if (unlikely (buffer->message_depth))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1555|      0|      return nullptr;
 1556|       |
 1557|      0|    buffer->clear_positions ();
 1558|      0|  }
 1559|       |
 1560|   409k|  return (hb_glyph_position_t *) buffer->pos;
 1561|   409k|}
hb_buffer_add_utf32:
 1826|   204k|{
 1827|   204k|  hb_buffer_add_utf<hb_utf32_t> (buffer, text, text_length, item_offset, item_length);
 1828|   204k|}
hb-buffer.cc:_ZL17hb_buffer_add_utfI13hb_utf32_xe_tIjLb1EEEvP11hb_buffer_tPKNT_11codepoint_tEiji:
 1687|   204k|{
 1688|   204k|  typedef typename utf_t::codepoint_t T;
 1689|   204k|  const hb_codepoint_t replacement = buffer->replacement;
 1690|       |
 1691|   204k|  buffer->assert_unicode ();
 1692|       |
 1693|   204k|  if (unlikely (hb_object_is_immutable (buffer)))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
 1694|      0|    return;
 1695|       |
 1696|   204k|  if (text_length == -1)
  ------------------
  |  Branch (1696:7): [True: 0, False: 204k]
  ------------------
 1697|      0|    text_length = utf_t::strlen (text);
 1698|       |
 1699|   204k|  if (item_length == -1)
  ------------------
  |  Branch (1699:7): [True: 0, False: 204k]
  ------------------
 1700|      0|    item_length = text_length - item_offset;
 1701|       |
 1702|   204k|  if (unlikely (item_length < 0 ||
  ------------------
  |  |  260|   819k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
 1703|   204k|		item_length > INT_MAX / 8 ||
 1704|   204k|		!buffer->ensure (buffer->len + item_length * sizeof (T) / 4)))
 1705|      0|    return;
 1706|       |
 1707|       |  /* If buffer is empty and pre-context provided, install it.
 1708|       |   * This check is written this way, to make sure people can
 1709|       |   * provide pre-context in one add_utf() call, then provide
 1710|       |   * text in a follow-up call.  See:
 1711|       |   *
 1712|       |   * https://bugzilla.mozilla.org/show_bug.cgi?id=801410#c13
 1713|       |   */
 1714|   204k|  if (!buffer->len && item_offset > 0)
  ------------------
  |  Branch (1714:7): [True: 204k, False: 0]
  |  Branch (1714:23): [True: 0, False: 204k]
  ------------------
 1715|      0|  {
 1716|       |    /* Add pre-context */
 1717|      0|    buffer->clear_context (0);
 1718|      0|    const T *prev = text + item_offset;
 1719|      0|    const T *start = text;
 1720|      0|    while (start < prev && buffer->context_len[0] < buffer->CONTEXT_LENGTH)
  ------------------
  |  Branch (1720:12): [True: 0, False: 0]
  |  Branch (1720:28): [True: 0, False: 0]
  ------------------
 1721|      0|    {
 1722|      0|      hb_codepoint_t u;
 1723|      0|      prev = utf_t::prev (prev, start, &u, replacement);
 1724|      0|      buffer->context[0][buffer->context_len[0]++] = u;
 1725|      0|    }
 1726|      0|  }
 1727|       |
 1728|   204k|  const T *next = text + item_offset;
 1729|   204k|  const T *end = next + item_length;
 1730|  3.13M|  while (next < end)
  ------------------
  |  Branch (1730:10): [True: 2.93M, False: 204k]
  ------------------
 1731|  2.93M|  {
 1732|  2.93M|    hb_codepoint_t u;
 1733|  2.93M|    const T *old_next = next;
 1734|  2.93M|    next = utf_t::next (next, end, &u, replacement);
 1735|  2.93M|    buffer->add (u, old_next - (const T *) text);
 1736|  2.93M|  }
 1737|       |
 1738|       |  /* Add post-context */
 1739|   204k|  buffer->clear_context (1);
 1740|   204k|  end = text + text_length;
 1741|   204k|  while (next < end && buffer->context_len[1] < buffer->CONTEXT_LENGTH)
  ------------------
  |  Branch (1741:10): [True: 0, False: 204k]
  |  Branch (1741:24): [True: 0, False: 0]
  ------------------
 1742|      0|  {
 1743|      0|    hb_codepoint_t u;
 1744|      0|    next = utf_t::next (next, end, &u, replacement);
 1745|      0|    buffer->context[1][buffer->context_len[1]++] = u;
 1746|      0|  }
 1747|       |
 1748|   204k|  buffer->content_type = HB_BUFFER_CONTENT_TYPE_UNICODE;
 1749|   204k|}

_ZN11hb_buffer_t6ensureEj:
  510|  3.34M|  { return likely (!size || size < allocated) ? true : enlarge (size); }
  ------------------
  |  |  259|  6.68M|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 3.13M, False: 204k]
  |  |  |  Branch (259:45): [True: 0, False: 3.34M]
  |  |  |  Branch (259:45): [True: 3.13M, False: 204k]
  |  |  ------------------
  ------------------
_ZN11hb_buffer_t18deallocate_var_allEv:
  178|  1.02M|  {
  179|  1.02M|    allocated_var_bits = 0;
  180|  1.02M|  }
_ZN11hb_buffer_t11next_glyphsEj:
  355|   409k|  {
  356|   409k|    if (have_output)
  ------------------
  |  Branch (356:9): [True: 409k, False: 0]
  ------------------
  357|   409k|    {
  358|   409k|      if (out_info != info || out_len != idx)
  ------------------
  |  Branch (358:11): [True: 0, False: 409k]
  |  Branch (358:31): [True: 0, False: 409k]
  ------------------
  359|      0|      {
  360|      0|	if (unlikely (!make_room_for (n, n))) return false;
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  361|      0|	memmove (out_info + out_len, info + idx, n * sizeof (out_info[0]));
  362|      0|      }
  363|   409k|      out_len += n;
  364|   409k|    }
  365|       |
  366|   409k|    idx += n;
  367|   409k|    return true;
  368|   409k|  }
_ZN11hb_buffer_t11set_clusterER15hb_glyph_info_tjj:
  586|      6|  {
  587|      6|    if (inf.cluster != cluster)
  ------------------
  |  Branch (587:9): [True: 3, False: 3]
  ------------------
  588|      3|      inf.mask = (inf.mask & ~HB_GLYPH_FLAG_DEFINED) | (mask & HB_GLYPH_FLAG_DEFINED);
  589|      6|    inf.cluster = cluster;
  590|      6|  }
_ZN11hb_buffer_t14merge_clustersEjj:
  385|  2.82M|  {
  386|  2.82M|    if (end - start < 2)
  ------------------
  |  Branch (386:9): [True: 2.82M, False: 3]
  ------------------
  387|  2.82M|      return;
  388|      3|    merge_clusters_impl (start, end);
  389|      3|  }
_ZN11hb_buffer_t14assert_unicodeEv:
  521|   409k|  {
  522|   409k|    assert ((content_type == HB_BUFFER_CONTENT_TYPE_UNICODE) ||
  523|   409k|	    (!len && (content_type == HB_BUFFER_CONTENT_TYPE_INVALID)));
  524|   409k|  }
_ZN11hb_buffer_t13clear_contextEj:
  554|   204k|  void clear_context (unsigned int side) { context_len[side] = 0; }
_ZNK11hb_buffer_t9group_endIFbRK15hb_glyph_info_tS3_EEEjjRKT_:
  265|  2.93M|  {
  266|  2.93M|    while (++start < len && group (info[start - 1], info[start]))
  ------------------
  |  Branch (266:12): [True: 2.72M, False: 204k]
  |  Branch (266:29): [True: 3, False: 2.72M]
  ------------------
  267|      3|      ;
  268|       |
  269|  2.93M|    return start;
  270|  2.93M|  }
_ZN11hb_buffer_t12allocate_varEjj:
  145|   819k|  {
  146|   819k|    unsigned int end = start + count;
  147|   819k|    assert (end <= 8);
  148|      0|    unsigned int bits = (1u<<end) - (1u<<start);
  149|   819k|    assert (0 == (allocated_var_bits & bits));
  150|      0|    allocated_var_bits |= bits;
  151|   819k|  }
_ZN11hb_buffer_t14deallocate_varEjj:
  163|   819k|  {
  164|   819k|    unsigned int end = start + count;
  165|   819k|    assert (end <= 8);
  166|      0|    unsigned int bits = (1u<<end) - (1u<<start);
  167|   819k|    assert (bits == (allocated_var_bits & bits));
  168|      0|    allocated_var_bits &= ~bits;
  169|   819k|  }
_ZN11hb_buffer_t10assert_varEjj:
  171|  1.02M|  {
  172|  1.02M|    unsigned int end = start + count;
  173|  1.02M|    assert (end <= 8);
  174|  1.02M|    HB_UNUSED unsigned int bits = (1u<<end) - (1u<<start);
  ------------------
  |  |  277|  1.02M|#define HB_UNUSED	__attribute__((unused))
  ------------------
  175|  1.02M|    assert (bits == (allocated_var_bits & bits));
  176|  1.02M|  }
_ZN11hb_buffer_t3curEj:
  182|  3.66M|  hb_glyph_info_t &cur (unsigned int i = 0) { return info[idx + i]; }
_ZNK11hb_buffer_t6digestEv:
  192|   409k|  {
  193|   409k|    hb_set_digest_t d;
  194|   409k|    d.init ();
  195|   409k|    d.add_array (&info[0].codepoint, len, sizeof (info[0]));
  196|   409k|    return d;
  197|   409k|  }
_ZN11hb_buffer_t10next_glyphEv:
  338|  1.38M|  {
  339|  1.38M|    if (have_output)
  ------------------
  |  Branch (339:9): [True: 1.38M, False: 0]
  ------------------
  340|  1.38M|    {
  341|  1.38M|      if (out_info != info || out_len != idx)
  ------------------
  |  Branch (341:11): [True: 0, False: 1.38M]
  |  Branch (341:31): [True: 0, False: 1.38M]
  ------------------
  342|      0|      {
  343|      0|	if (unlikely (!make_room_for (1, 1))) return false;
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  344|      0|	out_info[out_len] = info[idx];
  345|      0|      }
  346|  1.38M|      out_len++;
  347|  1.38M|    }
  348|       |
  349|  1.38M|    idx++;
  350|  1.38M|    return true;
  351|  1.38M|  }
_ZN11hb_buffer_t11reset_masksEj:
  372|   204k|  {
  373|  3.13M|    for (unsigned int j = 0; j < len; j++)
  ------------------
  |  Branch (373:30): [True: 2.93M, False: 204k]
  ------------------
  374|  2.93M|      info[j].mask = mask;
  375|   204k|  }
_ZN11hb_buffer_t16unsafe_to_concatEjj:
  471|      9|  {
  472|      9|    if (likely ((flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0))
  ------------------
  |  |  259|      9|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 9, False: 0]
  |  |  ------------------
  ------------------
  473|      9|      return;
  474|      0|    _set_glyph_flags (HB_GLYPH_FLAG_UNSAFE_TO_CONCAT,
  475|      0|		      start, end,
  476|      0|		      false);
  477|      0|  }
_ZN11hb_buffer_t9messagingEv:
  559|   819k|  {
  560|       |#ifdef HB_NO_BUFFER_MESSAGE
  561|       |    return false;
  562|       |#else
  563|   819k|    return unlikely (message_func);
  ------------------
  |  |  260|   819k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  ------------------
  564|   819k|#endif
  565|   819k|  }
_ZN11hb_buffer_t7messageEP9hb_font_tPKcz:
  567|     90|  {
  568|       |#ifdef HB_NO_BUFFER_MESSAGE
  569|       |    return true;
  570|       |#else
  571|     90|    if (likely (!messaging ()))
  ------------------
  |  |  259|     90|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 90, False: 0]
  |  |  ------------------
  ------------------
  572|     90|      return true;
  573|       |
  574|      0|    va_list ap;
  575|      0|    va_start (ap, fmt);
  576|      0|    bool ret = message_impl (font, fmt, ap);
  577|      0|    va_end (ap);
  578|       |
  579|      0|    return ret;
  580|     90|#endif
  581|     90|  }

_ZN10hb_cache_tILj21ELj3ELj8ELb1EE5clearEv:
   68|     11|  {
   69|     11|    for (auto &v : values)
  ------------------
  |  Branch (69:18): [True: 2.81k, False: 11]
  ------------------
   70|  2.81k|      v = -1;
   71|     11|  }
_ZNK10hb_cache_tILj21ELj3ELj8ELb1EE3getEjPj:
   74|  2.93M|  {
   75|  2.93M|    unsigned int k = key & ((1u<<cache_bits)-1);
   76|  2.93M|    unsigned int v = values[k];
   77|  2.93M|    if ((key_bits + value_bits - cache_bits == 8 * sizeof (item_t) && v == (unsigned int) -1) ||
  ------------------
  |  Branch (77:10): [Folded - Ignored]
  |  Branch (77:71): [True: 180, False: 2.93M]
  ------------------
   78|  2.93M|	(v >> value_bits) != (key >> cache_bits))
  ------------------
  |  Branch (78:2): [True: 0, False: 2.93M]
  ------------------
   79|    180|      return false;
   80|  2.93M|    *value = v & ((1u<<value_bits)-1);
   81|  2.93M|    return true;
   82|  2.93M|  }
_ZN10hb_cache_tILj21ELj3ELj8ELb1EE3setEjj:
   85|    180|  {
   86|    180|    if (unlikely ((key >> key_bits) || (value >> value_bits)))
  ------------------
  |  |  260|    360|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 180]
  |  |  |  Branch (260:47): [True: 0, False: 180]
  |  |  |  Branch (260:47): [True: 0, False: 180]
  |  |  ------------------
  ------------------
   87|      0|      return false; /* Overflows */
   88|    180|    unsigned int k = key & ((1u<<cache_bits)-1);
   89|    180|    unsigned int v = ((key>>cache_bits)<<value_bits) | value;
   90|    180|    values[k] = v;
   91|    180|    return true;
   92|    180|  }
_ZN10hb_cache_tILj21ELj16ELj8ELb1EEC2Ev:
   65|     11|  hb_cache_t () { clear (); }
_ZN10hb_cache_tILj21ELj16ELj8ELb1EE5clearEv:
   68|     11|  {
   69|     11|    for (auto &v : values)
  ------------------
  |  Branch (69:18): [True: 2.81k, False: 11]
  ------------------
   70|  2.81k|      v = -1;
   71|     11|  }
_ZN10hb_cache_tILj21ELj3ELj8ELb1EEC2Ev:
   65|     11|  hb_cache_t () { clear (); }

hb_tag_from_string:
   98|     13|{
   99|     13|  char tag[4];
  100|     13|  unsigned int i;
  101|       |
  102|     13|  if (!str || !len || !*str)
  ------------------
  |  Branch (102:7): [True: 0, False: 13]
  |  Branch (102:15): [True: 0, False: 13]
  |  Branch (102:23): [True: 0, False: 13]
  ------------------
  103|      0|    return HB_TAG_NONE;
  ------------------
  |  |  197|      0|#define HB_TAG_NONE HB_TAG(0,0,0,0)
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  104|       |
  105|     13|  if (len < 0 || len > 4)
  ------------------
  |  Branch (105:7): [True: 0, False: 13]
  |  Branch (105:18): [True: 0, False: 13]
  ------------------
  106|      0|    len = 4;
  107|     37|  for (i = 0; i < (unsigned) len && str[i]; i++)
  ------------------
  |  Branch (107:15): [True: 24, False: 13]
  |  Branch (107:37): [True: 24, False: 0]
  ------------------
  108|     24|    tag[i] = str[i];
  109|     41|  for (; i < 4; i++)
  ------------------
  |  Branch (109:10): [True: 28, False: 13]
  ------------------
  110|     28|    tag[i] = ' ';
  111|       |
  112|     13|  return HB_TAG (tag[0], tag[1], tag[2], tag[3]);
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  113|     13|}
hb_language_from_string:
  346|   102k|{
  347|   102k|  if (!str || !len || !*str)
  ------------------
  |  Branch (347:7): [True: 0, False: 102k]
  |  Branch (347:15): [True: 0, False: 102k]
  |  Branch (347:23): [True: 0, False: 102k]
  ------------------
  348|      0|    return HB_LANGUAGE_INVALID;
  ------------------
  |  |  334|      0|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  ------------------
  349|       |
  350|   102k|  hb_language_item_t *item = nullptr;
  351|   102k|  if (len >= 0)
  ------------------
  |  Branch (351:7): [True: 0, False: 102k]
  ------------------
  352|      0|  {
  353|       |    /* NUL-terminate it. */
  354|      0|    char strbuf[64];
  355|      0|    len = hb_min (len, (int) sizeof (strbuf) - 1);
  356|      0|    hb_memcpy (strbuf, str, len);
  357|      0|    strbuf[len] = '\0';
  358|      0|    item = lang_find_or_insert (strbuf);
  359|      0|  }
  360|   102k|  else
  361|   102k|    item = lang_find_or_insert (str);
  362|       |
  363|   102k|  return likely (item) ? item->lang : HB_LANGUAGE_INVALID;
  ------------------
  |  |  259|   102k|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 102k, False: 0]
  |  |  ------------------
  ------------------
                return likely (item) ? item->lang : HB_LANGUAGE_INVALID;
  ------------------
  |  |  334|      0|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  ------------------
  364|   102k|}
hb_language_to_string:
  380|     13|{
  381|     13|  if (unlikely (!language)) return nullptr;
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  382|       |
  383|     13|  return language->s;
  384|     13|}
hb_language_get_default:
  405|   102k|{
  406|   102k|  static hb_atomic_ptr_t <hb_language_t> default_language;
  407|       |
  408|   102k|  hb_language_t language = default_language;
  409|   102k|  if (unlikely (language == HB_LANGUAGE_INVALID))
  ------------------
  |  |  260|   102k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 1, False: 102k]
  |  |  ------------------
  ------------------
  410|      1|  {
  411|      1|    language = hb_language_from_string (hb_setlocale (LC_CTYPE, nullptr), -1);
  ------------------
  |  |  502|      1|#define hb_setlocale setlocale
  ------------------
  412|      1|    (void) default_language.cmpexch (HB_LANGUAGE_INVALID, language);
  ------------------
  |  |  334|      1|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  ------------------
  413|      1|  }
  414|       |
  415|   102k|  return language;
  416|   102k|}
hb_script_get_horizontal_direction:
  558|   204k|{
  559|       |  /* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
  560|   204k|  switch ((hb_tag_t) script)
  ------------------
  |  Branch (560:11): [True: 204k, False: 0]
  ------------------
  561|   204k|  {
  562|       |    /* Unicode-1.1 additions */
  563|      0|    case HB_SCRIPT_ARABIC:
  ------------------
  |  Branch (563:5): [True: 0, False: 204k]
  ------------------
  564|      0|    case HB_SCRIPT_HEBREW:
  ------------------
  |  Branch (564:5): [True: 0, False: 204k]
  ------------------
  565|       |
  566|       |    /* Unicode-3.0 additions */
  567|      0|    case HB_SCRIPT_SYRIAC:
  ------------------
  |  Branch (567:5): [True: 0, False: 204k]
  ------------------
  568|      0|    case HB_SCRIPT_THAANA:
  ------------------
  |  Branch (568:5): [True: 0, False: 204k]
  ------------------
  569|       |
  570|       |    /* Unicode-4.0 additions */
  571|      0|    case HB_SCRIPT_CYPRIOT:
  ------------------
  |  Branch (571:5): [True: 0, False: 204k]
  ------------------
  572|       |
  573|       |    /* Unicode-4.1 additions */
  574|      0|    case HB_SCRIPT_KHAROSHTHI:
  ------------------
  |  Branch (574:5): [True: 0, False: 204k]
  ------------------
  575|       |
  576|       |    /* Unicode-5.0 additions */
  577|      0|    case HB_SCRIPT_PHOENICIAN:
  ------------------
  |  Branch (577:5): [True: 0, False: 204k]
  ------------------
  578|      0|    case HB_SCRIPT_NKO:
  ------------------
  |  Branch (578:5): [True: 0, False: 204k]
  ------------------
  579|       |
  580|       |    /* Unicode-5.1 additions */
  581|      0|    case HB_SCRIPT_LYDIAN:
  ------------------
  |  Branch (581:5): [True: 0, False: 204k]
  ------------------
  582|       |
  583|       |    /* Unicode-5.2 additions */
  584|      0|    case HB_SCRIPT_AVESTAN:
  ------------------
  |  Branch (584:5): [True: 0, False: 204k]
  ------------------
  585|      0|    case HB_SCRIPT_IMPERIAL_ARAMAIC:
  ------------------
  |  Branch (585:5): [True: 0, False: 204k]
  ------------------
  586|      0|    case HB_SCRIPT_INSCRIPTIONAL_PAHLAVI:
  ------------------
  |  Branch (586:5): [True: 0, False: 204k]
  ------------------
  587|      0|    case HB_SCRIPT_INSCRIPTIONAL_PARTHIAN:
  ------------------
  |  Branch (587:5): [True: 0, False: 204k]
  ------------------
  588|      0|    case HB_SCRIPT_OLD_SOUTH_ARABIAN:
  ------------------
  |  Branch (588:5): [True: 0, False: 204k]
  ------------------
  589|      0|    case HB_SCRIPT_OLD_TURKIC:
  ------------------
  |  Branch (589:5): [True: 0, False: 204k]
  ------------------
  590|      0|    case HB_SCRIPT_SAMARITAN:
  ------------------
  |  Branch (590:5): [True: 0, False: 204k]
  ------------------
  591|       |
  592|       |    /* Unicode-6.0 additions */
  593|      0|    case HB_SCRIPT_MANDAIC:
  ------------------
  |  Branch (593:5): [True: 0, False: 204k]
  ------------------
  594|       |
  595|       |    /* Unicode-6.1 additions */
  596|      0|    case HB_SCRIPT_MEROITIC_CURSIVE:
  ------------------
  |  Branch (596:5): [True: 0, False: 204k]
  ------------------
  597|      0|    case HB_SCRIPT_MEROITIC_HIEROGLYPHS:
  ------------------
  |  Branch (597:5): [True: 0, False: 204k]
  ------------------
  598|       |
  599|       |    /* Unicode-7.0 additions */
  600|      0|    case HB_SCRIPT_MANICHAEAN:
  ------------------
  |  Branch (600:5): [True: 0, False: 204k]
  ------------------
  601|      0|    case HB_SCRIPT_MENDE_KIKAKUI:
  ------------------
  |  Branch (601:5): [True: 0, False: 204k]
  ------------------
  602|      0|    case HB_SCRIPT_NABATAEAN:
  ------------------
  |  Branch (602:5): [True: 0, False: 204k]
  ------------------
  603|      0|    case HB_SCRIPT_OLD_NORTH_ARABIAN:
  ------------------
  |  Branch (603:5): [True: 0, False: 204k]
  ------------------
  604|      0|    case HB_SCRIPT_PALMYRENE:
  ------------------
  |  Branch (604:5): [True: 0, False: 204k]
  ------------------
  605|      0|    case HB_SCRIPT_PSALTER_PAHLAVI:
  ------------------
  |  Branch (605:5): [True: 0, False: 204k]
  ------------------
  606|       |
  607|       |    /* Unicode-8.0 additions */
  608|      0|    case HB_SCRIPT_HATRAN:
  ------------------
  |  Branch (608:5): [True: 0, False: 204k]
  ------------------
  609|       |
  610|       |    /* Unicode-9.0 additions */
  611|      0|    case HB_SCRIPT_ADLAM:
  ------------------
  |  Branch (611:5): [True: 0, False: 204k]
  ------------------
  612|       |
  613|       |    /* Unicode-11.0 additions */
  614|      0|    case HB_SCRIPT_HANIFI_ROHINGYA:
  ------------------
  |  Branch (614:5): [True: 0, False: 204k]
  ------------------
  615|      0|    case HB_SCRIPT_OLD_SOGDIAN:
  ------------------
  |  Branch (615:5): [True: 0, False: 204k]
  ------------------
  616|      0|    case HB_SCRIPT_SOGDIAN:
  ------------------
  |  Branch (616:5): [True: 0, False: 204k]
  ------------------
  617|       |
  618|       |    /* Unicode-12.0 additions */
  619|      0|    case HB_SCRIPT_ELYMAIC:
  ------------------
  |  Branch (619:5): [True: 0, False: 204k]
  ------------------
  620|       |
  621|       |    /* Unicode-13.0 additions */
  622|      0|    case HB_SCRIPT_CHORASMIAN:
  ------------------
  |  Branch (622:5): [True: 0, False: 204k]
  ------------------
  623|      0|    case HB_SCRIPT_YEZIDI:
  ------------------
  |  Branch (623:5): [True: 0, False: 204k]
  ------------------
  624|       |
  625|       |    /* Unicode-14.0 additions */
  626|      0|    case HB_SCRIPT_OLD_UYGHUR:
  ------------------
  |  Branch (626:5): [True: 0, False: 204k]
  ------------------
  627|       |
  628|      0|      return HB_DIRECTION_RTL;
  629|       |
  630|       |
  631|       |    /* https://github.com/harfbuzz/harfbuzz/issues/1000 */
  632|      0|    case HB_SCRIPT_OLD_HUNGARIAN:
  ------------------
  |  Branch (632:5): [True: 0, False: 204k]
  ------------------
  633|      0|    case HB_SCRIPT_OLD_ITALIC:
  ------------------
  |  Branch (633:5): [True: 0, False: 204k]
  ------------------
  634|      0|    case HB_SCRIPT_RUNIC:
  ------------------
  |  Branch (634:5): [True: 0, False: 204k]
  ------------------
  635|      0|    case HB_SCRIPT_TIFINAGH:
  ------------------
  |  Branch (635:5): [True: 0, False: 204k]
  ------------------
  636|       |
  637|      0|      return HB_DIRECTION_INVALID;
  638|   204k|  }
  639|       |
  640|   204k|  return HB_DIRECTION_LTR;
  641|   204k|}
hb_version_string:
  690|     33|{
  691|     33|  return HB_VERSION_STRING;
  ------------------
  |  |   63|     33|#define HB_VERSION_STRING "8.2.1"
  ------------------
  692|     33|}
hb-common.cc:_ZL19lang_find_or_insertPKc:
  296|   102k|{
  297|   102k|retry:
  298|   102k|  hb_language_item_t *first_lang = langs;
  299|       |
  300|   204k|  for (hb_language_item_t *lang = first_lang; lang; lang = lang->next)
  ------------------
  |  Branch (300:47): [True: 204k, False: 2]
  ------------------
  301|   204k|    if (*lang == key)
  ------------------
  |  Branch (301:9): [True: 102k, False: 102k]
  ------------------
  302|   102k|      return lang;
  303|       |
  304|       |  /* Not found; allocate one. */
  305|      2|  hb_language_item_t *lang = (hb_language_item_t *) hb_calloc (1, sizeof (hb_language_item_t));
  ------------------
  |  |  235|      2|#define hb_calloc hb_calloc_impl
  ------------------
  306|      2|  if (unlikely (!lang))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  307|      0|    return nullptr;
  308|      2|  lang->next = first_lang;
  309|      2|  *lang = key;
  310|      2|  if (unlikely (!lang->lang))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  311|      0|  {
  312|      0|    hb_free (lang);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  313|      0|    return nullptr;
  314|      0|  }
  315|       |
  316|      2|  if (unlikely (!langs.cmpexch (first_lang, lang)))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  317|      0|  {
  318|      0|    lang->fini ();
  319|      0|    hb_free (lang);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  320|      0|    goto retry;
  321|      0|  }
  322|       |
  323|      2|  if (!first_lang)
  ------------------
  |  Branch (323:7): [True: 1, False: 1]
  ------------------
  324|      1|    hb_atexit (free_langs); /* First person registers atexit() callback. */
  ------------------
  |  |  475|      1|#    define hb_atexit atexit
  ------------------
  325|       |
  326|      2|  return lang;
  327|      2|}
_ZNK18hb_language_item_teqEPKc:
  253|   204k|  { return lang_equal (lang, s); }
hb-common.cc:_ZL10lang_equalPK18hb_language_impl_tPKv:
  218|   204k|{
  219|   204k|  const unsigned char *p1 = (const unsigned char *) v1;
  220|   204k|  const unsigned char *p2 = (const unsigned char *) v2;
  221|       |
  222|   409k|  while (*p1 && *p1 == canon_map[*p2]) {
  ------------------
  |  Branch (222:10): [True: 307k, False: 102k]
  |  Branch (222:17): [True: 204k, False: 102k]
  ------------------
  223|   204k|    p1++;
  224|   204k|    p2++;
  225|   204k|  }
  226|       |
  227|   204k|  return *p1 == canon_map[*p2];
  228|   204k|}
_ZN18hb_language_item_taSEPKc:
  256|      2|  {
  257|       |    /* We can't call strdup(), because we allow custom allocators. */
  258|      2|    size_t len = strlen(s) + 1;
  259|      2|    lang = (hb_language_t) hb_malloc(len);
  ------------------
  |  |  234|      2|#define hb_malloc hb_malloc_impl
  ------------------
  260|      2|    if (likely (lang))
  ------------------
  |  |  259|      2|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  261|      2|    {
  262|      2|      hb_memcpy((unsigned char *) lang, s, len);
  263|      5|      for (unsigned char *p = (unsigned char *) lang; *p; p++)
  ------------------
  |  Branch (263:55): [True: 3, False: 2]
  ------------------
  264|      3|	*p = canon_map[*p];
  265|      2|    }
  266|       |
  267|      2|    return *this;
  268|      2|  }
_ZN18hb_language_item_t4finiEv:
  270|      2|  void fini () { hb_free ((void *) lang); }
  ------------------
  |  |  237|      2|#define hb_free hb_free_impl
  ------------------
hb-common.cc:_ZL10free_langsv:
  280|      1|{
  281|      1|retry:
  282|      1|  hb_language_item_t *first_lang = langs;
  283|      1|  if (unlikely (!langs.cmpexch (first_lang, nullptr)))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  284|      0|    goto retry;
  285|       |
  286|      3|  while (first_lang) {
  ------------------
  |  Branch (286:10): [True: 2, False: 1]
  ------------------
  287|      2|    hb_language_item_t *next = first_lang->next;
  288|      2|    first_lang->fini ();
  289|      2|    hb_free (first_lang);
  ------------------
  |  |  237|      2|#define hb_free hb_free_impl
  ------------------
  290|      2|    first_lang = next;
  291|      2|  }
  292|      1|}

hb_font_funcs_set_glyph_v_kerning_func:
  124|    132|#define HB_IF_NOT_DEPRECATED(x) x
  ------------------
  |  Branch (124:33): [True: 0, False: 11]
  |  Branch (124:33): [True: 0, False: 11]
  |  Branch (124:33): [True: 0, False: 0]
  |  Branch (124:33): [True: 0, False: 0]
  |  Branch (124:33): [True: 0, False: 11]
  |  Branch (124:33): [True: 11, False: 0]
  |  Branch (124:33): [True: 11, False: 0]
  |  Branch (124:33): [True: 0, False: 11]
  ------------------

hb-blob.cc:_ZL13_hb_debug_msgILi0EEvPKcPKvS1_bjiS1_z:
  229|   819k|		  ...) {}
hb-buffer.cc:_ZL13_hb_debug_msgILi0EEvPKcPKvS1_bjiS1_z:
  229|   409k|		  ...) {}
_ZN13hb_no_trace_tIbE3retIbEET_OS2_PKcj:
  347|  86.9k|	 unsigned int line HB_UNUSED = 0) { return std::forward<T> (v); }
hb-face.cc:_ZL13_hb_debug_msgILi0EEvPKcPKvS1_bjiS1_z:
  229|   437k|		  ...) {}
hb-font.cc:_ZL13_hb_debug_msgILi0EEvPKcPKvS1_bjiS1_z:
  229|    112|		  ...) {}
_ZN13hb_no_trace_tIbE3retIlEET_OS2_PKcj:
  347|     10|	 unsigned int line HB_UNUSED = 0) { return std::forward<T> (v); }
_ZN13hb_no_trace_tI10hb_empty_tE3retIS0_EET_OS3_PKcj:
  347|     21|	 unsigned int line HB_UNUSED = 0) { return std::forward<T> (v); }
hb-ot-font.cc:_ZL13_hb_debug_msgILi0EEvPKcPKvS1_bjiS1_z:
  229|     55|		  ...) {}
hb-shape-plan.cc:_ZL13_hb_debug_msgILi0EEvPKcPKvS1_bjiS1_z:
  229|  1.02M|		  ...) {}
hb-unicode.cc:_ZL13_hb_debug_msgILi0EEvPKcPKvS1_bjiS1_z:
  229|  1.02M|		  ...) {}
hb-aat-layout.cc:_ZL13_hb_debug_msgILi0EEvPKcPKvS1_bjiS1_z:
  229|    203|		  ...) {}
hb-ot-layout.cc:_ZL13_hb_debug_msgILi0EEvPKcPKvS1_bjiS1_z:
  229|   425k|		  ...) {}

_ZN21hb_dispatch_context_tIN2OT33hb_accelerate_subtables_context_tE10hb_empty_tLj0EE12may_dispatchINS0_6Layout9GPOS_impl11MarkBasePosENS0_7IntTypeItLj2EEEEEbPKT_PKT0_:
   50|      4|  bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
_ZN21hb_dispatch_context_tIN2OT33hb_accelerate_subtables_context_tE10hb_empty_tLj0EE12may_dispatchINS0_6Layout9GPOS_impl10MarkLigPosENS0_7IntTypeItLj2EEEEEbPKT_PKT0_:
   50|      1|  bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
_ZN21hb_dispatch_context_tIN2OT33hb_accelerate_subtables_context_tE10hb_empty_tLj0EE12may_dispatchINS0_6Layout9GPOS_impl11MarkMarkPosENS0_7IntTypeItLj2EEEEEbPKT_PKT0_:
   50|      1|  bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
_ZN21hb_dispatch_context_tIN2OT33hb_accelerate_subtables_context_tE10hb_empty_tLj0EE12may_dispatchINS0_12ChainContextENS0_7IntTypeItLj2EEEEEbPKT_PKT0_:
   50|      1|  bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
_ZN21hb_dispatch_context_tIN2OT33hb_accelerate_subtables_context_tE10hb_empty_tLj0EE24stop_sublookup_iterationES2_:
   55|      8|  static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; }
_ZN21hb_dispatch_context_tIN2OT33hb_accelerate_subtables_context_tE10hb_empty_tLj0EE12may_dispatchINS0_6Layout9GSUB_impl13LigatureSubstENS0_7IntTypeItLj2EEEEEbPKT_PKT0_:
   50|      1|  bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }

hb_face_create_for_tables:
  127|     11|{
  128|     11|  hb_face_t *face;
  129|       |
  130|     11|  if (!reference_table_func || !(face = hb_object_create<hb_face_t> ())) {
  ------------------
  |  Branch (130:7): [True: 0, False: 11]
  |  Branch (130:32): [True: 0, False: 11]
  ------------------
  131|      0|    if (destroy)
  ------------------
  |  Branch (131:9): [True: 0, False: 0]
  ------------------
  132|      0|      destroy (user_data);
  133|      0|    return hb_face_get_empty ();
  134|      0|  }
  135|       |
  136|     11|  face->reference_table_func = reference_table_func;
  137|     11|  face->user_data = user_data;
  138|     11|  face->destroy = destroy;
  139|       |
  140|     11|  face->num_glyphs = -1;
  141|       |
  142|     11|  face->data.init0 (face);
  143|     11|  face->table.init0 (face);
  144|       |
  145|     11|  return face;
  146|     11|}
hb_face_reference:
  277|     11|{
  278|     11|  return hb_object_reference (face);
  279|     11|}
hb_face_destroy:
  293|     22|{
  294|     22|  if (!hb_object_destroy (face)) return;
  ------------------
  |  Branch (294:7): [True: 11, False: 11]
  ------------------
  295|       |
  296|     11|#ifndef HB_NO_SHAPER
  297|     24|  for (hb_face_t::plan_node_t *node = face->shape_plans; node; )
  ------------------
  |  Branch (297:58): [True: 13, False: 11]
  ------------------
  298|     13|  {
  299|     13|    hb_face_t::plan_node_t *next = node->next;
  300|     13|    hb_shape_plan_destroy (node->shape_plan);
  301|     13|    hb_free (node);
  ------------------
  |  |  237|     13|#define hb_free hb_free_impl
  ------------------
  302|     13|    node = next;
  303|     13|  }
  304|     11|#endif
  305|       |
  306|     11|  face->data.fini ();
  307|     11|  face->table.fini ();
  308|       |
  309|     11|  if (face->destroy)
  ------------------
  |  Branch (309:7): [True: 0, False: 11]
  ------------------
  310|      0|    face->destroy (face->user_data);
  311|       |
  312|     11|  hb_free (face);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
  313|     11|}
hb_face_set_user_data:
  335|     11|{
  336|     11|  return hb_object_set_user_data (face, key, data, destroy, replace);
  337|     11|}
hb_face_get_user_data:
  354|     11|{
  355|     11|  return hb_object_get_user_data (face, key);
  356|     11|}
hb_face_make_immutable:
  368|     24|{
  369|     24|  if (hb_object_is_immutable (face))
  ------------------
  |  Branch (369:7): [True: 13, False: 11]
  ------------------
  370|     13|    return;
  371|       |
  372|     11|  hb_object_make_immutable (face);
  373|     11|}
hb_face_reference_table:
  407|     99|{
  408|     99|  if (unlikely (tag == HB_TAG_NONE))
  ------------------
  |  |  260|     99|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  409|      0|    return hb_blob_get_empty ();
  410|       |
  411|     99|  return face->reference_table (tag);
  412|     99|}
hb_face_set_index:
  448|     11|{
  449|     11|  if (hb_object_is_immutable (face))
  ------------------
  |  Branch (449:7): [True: 0, False: 11]
  ------------------
  450|      0|    return;
  451|       |
  452|     11|  face->index = index;
  453|     11|}
hb_face_set_upem:
  487|     11|{
  488|     11|  if (hb_object_is_immutable (face))
  ------------------
  |  Branch (488:7): [True: 0, False: 11]
  ------------------
  489|      0|    return;
  490|       |
  491|     11|  face->upem = upem;
  492|     11|}
hb_face_get_glyph_count:
  546|     77|{
  547|     77|  return face->get_num_glyphs ();
  548|     77|}

_ZNK9hb_face_t15reference_tableEj:
   73|     99|  {
   74|     99|    hb_blob_t *blob;
   75|       |
   76|     99|    if (unlikely (!reference_table_func))
  ------------------
  |  |  260|     99|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 99]
  |  |  ------------------
  ------------------
   77|      0|      return hb_blob_get_empty ();
   78|       |
   79|     99|    blob = reference_table_func (/*Oh, well.*/const_cast<hb_face_t *> (this), tag, user_data);
   80|     99|    if (unlikely (!blob))
  ------------------
  |  |  260|     99|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 64, False: 35]
  |  |  ------------------
  ------------------
   81|     64|      return hb_blob_get_empty ();
   82|       |
   83|     35|    return blob;
   84|     99|  }
_ZNK9hb_face_t8get_upemEv:
   87|     32|  {
   88|     32|    unsigned int ret = upem;
   89|     32|    if (unlikely (!ret))
  ------------------
  |  |  260|     32|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 32]
  |  |  ------------------
  ------------------
   90|      0|    {
   91|      0|      return load_upem ();
   92|      0|    }
   93|     32|    return ret;
   94|     32|  }
_ZNK9hb_face_t14get_num_glyphsEv:
   97|     86|  {
   98|     86|    unsigned int ret = num_glyphs;
   99|     86|    if (unlikely (ret == UINT_MAX))
  ------------------
  |  |  260|     86|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 75]
  |  |  ------------------
  ------------------
  100|     11|      return load_num_glyphs ();
  101|     75|    return ret;
  102|     86|  }

hb_font_funcs_create:
  723|     12|{
  724|     12|  hb_font_funcs_t *ffuncs;
  725|       |
  726|     12|  if (!(ffuncs = hb_object_create<hb_font_funcs_t> ()))
  ------------------
  |  Branch (726:7): [True: 0, False: 12]
  ------------------
  727|      0|    return hb_font_funcs_get_empty ();
  728|       |
  729|     12|  ffuncs->get = _hb_font_funcs_default.get;
  730|       |
  731|     12|  return ffuncs;
  732|     12|}
hb_font_funcs_get_empty:
  745|     12|{
  746|     12|  return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_default);
  747|     12|}
hb_font_funcs_reference:
  761|     22|{
  762|     22|  return hb_object_reference (ffuncs);
  763|     22|}
hb_font_funcs_destroy:
  777|     45|{
  778|     45|  if (!hb_object_destroy (ffuncs)) return;
  ------------------
  |  Branch (778:7): [True: 33, False: 12]
  ------------------
  779|       |
  780|     12|  if (ffuncs->destroy)
  ------------------
  |  Branch (780:7): [True: 0, False: 12]
  ------------------
  781|      0|  {
  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  784|      0|    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
  ------------------
  |  |   43|      0|  HB_FONT_FUNC_IMPLEMENT (get_,font_h_extents) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   44|      0|  HB_FONT_FUNC_IMPLEMENT (get_,font_v_extents) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   45|      0|  HB_FONT_FUNC_IMPLEMENT (get_,nominal_glyph) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      0|  HB_FONT_FUNC_IMPLEMENT (get_,nominal_glyphs) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   47|      0|  HB_FONT_FUNC_IMPLEMENT (get_,variation_glyph) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   48|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_h_advance) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_v_advance) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_h_advances) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_v_advances) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   52|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_h_origin) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_v_origin) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   54|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_h_kerning) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   55|      0|  HB_IF_NOT_DEPRECATED (HB_FONT_FUNC_IMPLEMENT (get_,glyph_v_kerning)) \
  |  |  ------------------
  |  |  |  |  124|      0|#define HB_IF_NOT_DEPRECATED(x) x
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (124:33): [True: 0, False: 0]
  |  |  |  |  |  Branch (124:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   56|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_extents) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   57|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_contour_point) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_name) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   59|      0|  HB_FONT_FUNC_IMPLEMENT (get_,glyph_from_name) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|      0|  HB_FONT_FUNC_IMPLEMENT (,draw_glyph) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|      0|  HB_FONT_FUNC_IMPLEMENT (,paint_glyph) \
  |  |  ------------------
  |  |  |  |  782|      0|#define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (782:47): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  783|      0|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (783:28): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  785|      0|#undef HB_FONT_FUNC_IMPLEMENT
  786|      0|  }
  787|       |
  788|     12|  hb_free (ffuncs->destroy);
  ------------------
  |  |  237|     12|#define hb_free hb_free_impl
  ------------------
  789|     12|  hb_free (ffuncs->user_data);
  ------------------
  |  |  237|     12|#define hb_free hb_free_impl
  ------------------
  790|       |
  791|     12|  hb_free (ffuncs);
  ------------------
  |  |  237|     12|#define hb_free hb_free_impl
  ------------------
  792|     12|}
hb_font_funcs_make_immutable:
  848|      1|{
  849|      1|  if (hb_object_is_immutable (ffuncs))
  ------------------
  |  Branch (849:7): [True: 0, False: 1]
  ------------------
  850|      0|    return;
  851|       |
  852|      1|  hb_object_make_immutable (ffuncs);
  853|      1|}
hb_font_funcs_set_font_h_extents_func:
  928|      1|				 hb_destroy_func_t            destroy)   \
  929|      1|{                                                                        \
  930|      1|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 1]
  ------------------
  931|      1|      return;                                                            \
  932|      1|									 \
  933|      1|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 1]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|      1|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|      1|                                                                         \
  936|      1|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 1]
  ------------------
  937|      1|      return;                                                            \
  938|      1|									 \
  939|      1|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 1, False: 0]
  ------------------
  940|      1|    ffuncs->get.f.name = func;                                           \
  941|      1|  else                                                                   \
  942|      1|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|      1|									 \
  944|      1|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 0, False: 1]
  ------------------
  945|      1|    ffuncs->user_data->name = user_data;                                 \
  946|      1|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 1]
  ------------------
  947|      1|    ffuncs->destroy->name = destroy;                                     \
  948|      1|}
hb_font_funcs_set_font_v_extents_func:
  928|      1|				 hb_destroy_func_t            destroy)   \
  929|      1|{                                                                        \
  930|      1|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 1]
  ------------------
  931|      1|      return;                                                            \
  932|      1|									 \
  933|      1|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 1]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|      1|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|      1|                                                                         \
  936|      1|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 1]
  ------------------
  937|      1|      return;                                                            \
  938|      1|									 \
  939|      1|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 1, False: 0]
  ------------------
  940|      1|    ffuncs->get.f.name = func;                                           \
  941|      1|  else                                                                   \
  942|      1|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|      1|									 \
  944|      1|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 0, False: 1]
  ------------------
  945|      1|    ffuncs->user_data->name = user_data;                                 \
  946|      1|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 1]
  ------------------
  947|      1|    ffuncs->destroy->name = destroy;                                     \
  948|      1|}
hb_font_funcs_set_nominal_glyph_func:
  928|     12|				 hb_destroy_func_t            destroy)   \
  929|     12|{                                                                        \
  930|     12|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 12]
  ------------------
  931|     12|      return;                                                            \
  932|     12|									 \
  933|     12|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 12]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|     12|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|     12|                                                                         \
  936|     12|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 12]
  ------------------
  937|     12|      return;                                                            \
  938|     12|									 \
  939|     12|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 12, False: 0]
  ------------------
  940|     12|    ffuncs->get.f.name = func;                                           \
  941|     12|  else                                                                   \
  942|     12|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|     12|									 \
  944|     12|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 11, False: 1]
  ------------------
  945|     12|    ffuncs->user_data->name = user_data;                                 \
  946|     12|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 12]
  ------------------
  947|     12|    ffuncs->destroy->name = destroy;                                     \
  948|     12|}
hb_font_funcs_set_nominal_glyphs_func:
  928|      1|				 hb_destroy_func_t            destroy)   \
  929|      1|{                                                                        \
  930|      1|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 1]
  ------------------
  931|      1|      return;                                                            \
  932|      1|									 \
  933|      1|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 1]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|      1|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|      1|                                                                         \
  936|      1|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 1]
  ------------------
  937|      1|      return;                                                            \
  938|      1|									 \
  939|      1|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 1, False: 0]
  ------------------
  940|      1|    ffuncs->get.f.name = func;                                           \
  941|      1|  else                                                                   \
  942|      1|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|      1|									 \
  944|      1|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 0, False: 1]
  ------------------
  945|      1|    ffuncs->user_data->name = user_data;                                 \
  946|      1|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 1]
  ------------------
  947|      1|    ffuncs->destroy->name = destroy;                                     \
  948|      1|}
hb_font_funcs_set_variation_glyph_func:
  928|     12|				 hb_destroy_func_t            destroy)   \
  929|     12|{                                                                        \
  930|     12|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 12]
  ------------------
  931|     12|      return;                                                            \
  932|     12|									 \
  933|     12|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 12]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|     12|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|     12|                                                                         \
  936|     12|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 12]
  ------------------
  937|     12|      return;                                                            \
  938|     12|									 \
  939|     12|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 12, False: 0]
  ------------------
  940|     12|    ffuncs->get.f.name = func;                                           \
  941|     12|  else                                                                   \
  942|     12|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|     12|									 \
  944|     12|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 11, False: 1]
  ------------------
  945|     12|    ffuncs->user_data->name = user_data;                                 \
  946|     12|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 12]
  ------------------
  947|     12|    ffuncs->destroy->name = destroy;                                     \
  948|     12|}
hb_font_funcs_set_glyph_h_advance_func:
  928|     11|				 hb_destroy_func_t            destroy)   \
  929|     11|{                                                                        \
  930|     11|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 11]
  ------------------
  931|     11|      return;                                                            \
  932|     11|									 \
  933|     11|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 11]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|     11|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|     11|                                                                         \
  936|     11|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 11]
  ------------------
  937|     11|      return;                                                            \
  938|     11|									 \
  939|     11|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 11, False: 0]
  ------------------
  940|     11|    ffuncs->get.f.name = func;                                           \
  941|     11|  else                                                                   \
  942|     11|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|     11|									 \
  944|     11|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 11, False: 0]
  ------------------
  945|     11|    ffuncs->user_data->name = user_data;                                 \
  946|     11|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 11]
  ------------------
  947|     11|    ffuncs->destroy->name = destroy;                                     \
  948|     11|}
hb_font_funcs_set_glyph_v_advance_func:
  928|     11|				 hb_destroy_func_t            destroy)   \
  929|     11|{                                                                        \
  930|     11|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 11]
  ------------------
  931|     11|      return;                                                            \
  932|     11|									 \
  933|     11|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 11]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|     11|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|     11|                                                                         \
  936|     11|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 11]
  ------------------
  937|     11|      return;                                                            \
  938|     11|									 \
  939|     11|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 11, False: 0]
  ------------------
  940|     11|    ffuncs->get.f.name = func;                                           \
  941|     11|  else                                                                   \
  942|     11|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|     11|									 \
  944|     11|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 11, False: 0]
  ------------------
  945|     11|    ffuncs->user_data->name = user_data;                                 \
  946|     11|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 11]
  ------------------
  947|     11|    ffuncs->destroy->name = destroy;                                     \
  948|     11|}
hb_font_funcs_set_glyph_h_advances_func:
  928|      1|				 hb_destroy_func_t            destroy)   \
  929|      1|{                                                                        \
  930|      1|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 1]
  ------------------
  931|      1|      return;                                                            \
  932|      1|									 \
  933|      1|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 1]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|      1|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|      1|                                                                         \
  936|      1|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 1]
  ------------------
  937|      1|      return;                                                            \
  938|      1|									 \
  939|      1|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 1, False: 0]
  ------------------
  940|      1|    ffuncs->get.f.name = func;                                           \
  941|      1|  else                                                                   \
  942|      1|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|      1|									 \
  944|      1|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 0, False: 1]
  ------------------
  945|      1|    ffuncs->user_data->name = user_data;                                 \
  946|      1|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 1]
  ------------------
  947|      1|    ffuncs->destroy->name = destroy;                                     \
  948|      1|}
hb_font_funcs_set_glyph_v_advances_func:
  928|      1|				 hb_destroy_func_t            destroy)   \
  929|      1|{                                                                        \
  930|      1|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 1]
  ------------------
  931|      1|      return;                                                            \
  932|      1|									 \
  933|      1|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 1]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|      1|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|      1|                                                                         \
  936|      1|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 1]
  ------------------
  937|      1|      return;                                                            \
  938|      1|									 \
  939|      1|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 1, False: 0]
  ------------------
  940|      1|    ffuncs->get.f.name = func;                                           \
  941|      1|  else                                                                   \
  942|      1|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|      1|									 \
  944|      1|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 0, False: 1]
  ------------------
  945|      1|    ffuncs->user_data->name = user_data;                                 \
  946|      1|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 1]
  ------------------
  947|      1|    ffuncs->destroy->name = destroy;                                     \
  948|      1|}
hb_font_funcs_set_glyph_h_origin_func:
  928|     11|				 hb_destroy_func_t            destroy)   \
  929|     11|{                                                                        \
  930|     11|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 11]
  ------------------
  931|     11|      return;                                                            \
  932|     11|									 \
  933|     11|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 11]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|     11|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|     11|                                                                         \
  936|     11|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 11]
  ------------------
  937|     11|      return;                                                            \
  938|     11|									 \
  939|     11|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 11, False: 0]
  ------------------
  940|     11|    ffuncs->get.f.name = func;                                           \
  941|     11|  else                                                                   \
  942|     11|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|     11|									 \
  944|     11|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 11, False: 0]
  ------------------
  945|     11|    ffuncs->user_data->name = user_data;                                 \
  946|     11|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 11]
  ------------------
  947|     11|    ffuncs->destroy->name = destroy;                                     \
  948|     11|}
hb_font_funcs_set_glyph_v_origin_func:
  928|     12|				 hb_destroy_func_t            destroy)   \
  929|     12|{                                                                        \
  930|     12|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 12]
  ------------------
  931|     12|      return;                                                            \
  932|     12|									 \
  933|     12|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 12]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|     12|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|     12|                                                                         \
  936|     12|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 12]
  ------------------
  937|     12|      return;                                                            \
  938|     12|									 \
  939|     12|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 12, False: 0]
  ------------------
  940|     12|    ffuncs->get.f.name = func;                                           \
  941|     12|  else                                                                   \
  942|     12|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|     12|									 \
  944|     12|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 11, False: 1]
  ------------------
  945|     12|    ffuncs->user_data->name = user_data;                                 \
  946|     12|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 12]
  ------------------
  947|     12|    ffuncs->destroy->name = destroy;                                     \
  948|     12|}
hb_font_funcs_set_glyph_h_kerning_func:
  928|     11|				 hb_destroy_func_t            destroy)   \
  929|     11|{                                                                        \
  930|     11|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 11]
  ------------------
  931|     11|      return;                                                            \
  932|     11|									 \
  933|     11|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 11]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|     11|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|     11|                                                                         \
  936|     11|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 11]
  ------------------
  937|     11|      return;                                                            \
  938|     11|									 \
  939|     11|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 11, False: 0]
  ------------------
  940|     11|    ffuncs->get.f.name = func;                                           \
  941|     11|  else                                                                   \
  942|     11|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|     11|									 \
  944|     11|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 11, False: 0]
  ------------------
  945|     11|    ffuncs->user_data->name = user_data;                                 \
  946|     11|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 11]
  ------------------
  947|     11|    ffuncs->destroy->name = destroy;                                     \
  948|     11|}
hb_font_funcs_set_glyph_extents_func:
  928|     12|				 hb_destroy_func_t            destroy)   \
  929|     12|{                                                                        \
  930|     12|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 12]
  ------------------
  931|     12|      return;                                                            \
  932|     12|									 \
  933|     12|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 12]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|     12|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|     12|                                                                         \
  936|     12|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 12]
  ------------------
  937|     12|      return;                                                            \
  938|     12|									 \
  939|     12|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 12, False: 0]
  ------------------
  940|     12|    ffuncs->get.f.name = func;                                           \
  941|     12|  else                                                                   \
  942|     12|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|     12|									 \
  944|     12|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 11, False: 1]
  ------------------
  945|     12|    ffuncs->user_data->name = user_data;                                 \
  946|     12|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 12]
  ------------------
  947|     12|    ffuncs->destroy->name = destroy;                                     \
  948|     12|}
hb_font_funcs_set_glyph_contour_point_func:
  928|     11|				 hb_destroy_func_t            destroy)   \
  929|     11|{                                                                        \
  930|     11|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 11]
  ------------------
  931|     11|      return;                                                            \
  932|     11|									 \
  933|     11|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 11]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|     11|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|     11|                                                                         \
  936|     11|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 11]
  ------------------
  937|     11|      return;                                                            \
  938|     11|									 \
  939|     11|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 11, False: 0]
  ------------------
  940|     11|    ffuncs->get.f.name = func;                                           \
  941|     11|  else                                                                   \
  942|     11|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|     11|									 \
  944|     11|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 11, False: 0]
  ------------------
  945|     11|    ffuncs->user_data->name = user_data;                                 \
  946|     11|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 11]
  ------------------
  947|     11|    ffuncs->destroy->name = destroy;                                     \
  948|     11|}
hb_font_funcs_set_glyph_name_func:
  928|      1|				 hb_destroy_func_t            destroy)   \
  929|      1|{                                                                        \
  930|      1|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 1]
  ------------------
  931|      1|      return;                                                            \
  932|      1|									 \
  933|      1|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 1]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|      1|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|      1|                                                                         \
  936|      1|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 1]
  ------------------
  937|      1|      return;                                                            \
  938|      1|									 \
  939|      1|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 1, False: 0]
  ------------------
  940|      1|    ffuncs->get.f.name = func;                                           \
  941|      1|  else                                                                   \
  942|      1|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|      1|									 \
  944|      1|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 0, False: 1]
  ------------------
  945|      1|    ffuncs->user_data->name = user_data;                                 \
  946|      1|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 1]
  ------------------
  947|      1|    ffuncs->destroy->name = destroy;                                     \
  948|      1|}
hb_font_funcs_set_glyph_from_name_func:
  928|      1|				 hb_destroy_func_t            destroy)   \
  929|      1|{                                                                        \
  930|      1|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 1]
  ------------------
  931|      1|      return;                                                            \
  932|      1|									 \
  933|      1|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 1]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|      1|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|      1|                                                                         \
  936|      1|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 1]
  ------------------
  937|      1|      return;                                                            \
  938|      1|									 \
  939|      1|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 1, False: 0]
  ------------------
  940|      1|    ffuncs->get.f.name = func;                                           \
  941|      1|  else                                                                   \
  942|      1|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|      1|									 \
  944|      1|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 0, False: 1]
  ------------------
  945|      1|    ffuncs->user_data->name = user_data;                                 \
  946|      1|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 1]
  ------------------
  947|      1|    ffuncs->destroy->name = destroy;                                     \
  948|      1|}
hb_font_funcs_set_draw_glyph_func:
  928|      1|				 hb_destroy_func_t            destroy)   \
  929|      1|{                                                                        \
  930|      1|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 1]
  ------------------
  931|      1|      return;                                                            \
  932|      1|									 \
  933|      1|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 1]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|      1|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|      1|                                                                         \
  936|      1|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 1]
  ------------------
  937|      1|      return;                                                            \
  938|      1|									 \
  939|      1|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 1, False: 0]
  ------------------
  940|      1|    ffuncs->get.f.name = func;                                           \
  941|      1|  else                                                                   \
  942|      1|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|      1|									 \
  944|      1|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 0, False: 1]
  ------------------
  945|      1|    ffuncs->user_data->name = user_data;                                 \
  946|      1|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 1]
  ------------------
  947|      1|    ffuncs->destroy->name = destroy;                                     \
  948|      1|}
hb_font_funcs_set_paint_glyph_func:
  928|      1|				 hb_destroy_func_t            destroy)   \
  929|      1|{                                                                        \
  930|      1|  if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
  ------------------
  |  Branch (930:7): [True: 0, False: 1]
  ------------------
  931|      1|      return;                                                            \
  932|      1|									 \
  933|      1|  if (ffuncs->destroy && ffuncs->destroy->name)                          \
  ------------------
  |  Branch (933:7): [True: 0, False: 1]
  |  Branch (933:26): [True: 0, False: 0]
  ------------------
  934|      1|    ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
  ------------------
  |  Branch (934:28): [True: 0, False: 0]
  ------------------
  935|      1|                                                                         \
  936|      1|  if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy))           \
  ------------------
  |  Branch (936:7): [True: 0, False: 1]
  ------------------
  937|      1|      return;                                                            \
  938|      1|									 \
  939|      1|  if (func)                                                              \
  ------------------
  |  Branch (939:7): [True: 1, False: 0]
  ------------------
  940|      1|    ffuncs->get.f.name = func;                                           \
  941|      1|  else                                                                   \
  942|      1|    ffuncs->get.f.name = hb_font_##get_##name##_default;                   \
  943|      1|									 \
  944|      1|  if (ffuncs->user_data)                                                 \
  ------------------
  |  Branch (944:7): [True: 0, False: 1]
  ------------------
  945|      1|    ffuncs->user_data->name = user_data;                                 \
  946|      1|  if (ffuncs->destroy)                                                   \
  ------------------
  |  Branch (946:7): [True: 0, False: 1]
  ------------------
  947|      1|    ffuncs->destroy->name = destroy;                                     \
  948|      1|}
_ZN9hb_font_t12has_func_setEj:
  955|  1.02M|{
  956|  1.02M|  return this->klass->get.array[i] != _hb_font_funcs_default.get.array[i];
  957|  1.02M|}
_ZN9hb_font_t8has_funcEj:
  961|   614k|{
  962|   614k|  return has_func_set (i) ||
  ------------------
  |  Branch (962:10): [True: 614k, False: 0]
  ------------------
  963|   614k|	 (parent && parent != &_hb_Null_hb_font_t && parent->has_func (i));
  ------------------
  |  Branch (963:4): [True: 0, False: 0]
  |  Branch (963:14): [True: 0, False: 0]
  |  Branch (963:47): [True: 0, False: 0]
  ------------------
  964|   614k|}
hb_font_create:
 1854|     11|{
 1855|     11|  hb_font_t *font = _hb_font_create (face);
 1856|       |
 1857|     11|#ifndef HB_NO_OT_FONT
 1858|       |  /* Install our in-house, very lightweight, funcs. */
 1859|     11|  hb_ot_font_set_funcs (font);
 1860|     11|#endif
 1861|       |
 1862|     11|#ifndef HB_NO_VAR
 1863|     11|  if (face && face->index >> 16)
  ------------------
  |  Branch (1863:7): [True: 11, False: 0]
  |  Branch (1863:15): [True: 0, False: 11]
  ------------------
 1864|      0|    hb_font_set_var_named_instance (font, (face->index >> 16) - 1);
 1865|     11|#endif
 1866|       |
 1867|     11|  return font;
 1868|     11|}
hb_font_get_empty:
 1954|     11|{
 1955|     11|  return const_cast<hb_font_t *> (&Null (hb_font_t));
  ------------------
  |  |  124|     11|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
 1956|     11|}
hb_font_destroy:
 1986|     22|{
 1987|     22|  if (!hb_object_destroy (font)) return;
  ------------------
  |  Branch (1987:7): [True: 11, False: 11]
  ------------------
 1988|       |
 1989|     11|  font->data.fini ();
 1990|       |
 1991|     11|  if (font->destroy)
  ------------------
  |  Branch (1991:7): [True: 0, False: 11]
  ------------------
 1992|      0|    font->destroy (font->user_data);
 1993|       |
 1994|     11|  hb_font_destroy (font->parent);
 1995|     11|  hb_face_destroy (font->face);
 1996|     11|  hb_font_funcs_destroy (font->klass);
 1997|       |
 1998|     11|  hb_free (font->coords);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
 1999|     11|  hb_free (font->design_coords);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
 2000|       |
 2001|     11|  hb_free (font);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
 2002|     11|}
hb_font_set_funcs:
 2239|     22|{
 2240|     22|  if (hb_object_is_immutable (font))
  ------------------
  |  Branch (2240:7): [True: 0, False: 22]
  ------------------
 2241|      0|  {
 2242|      0|    if (destroy)
  ------------------
  |  Branch (2242:9): [True: 0, False: 0]
  ------------------
 2243|      0|      destroy (font_data);
 2244|      0|    return;
 2245|      0|  }
 2246|       |
 2247|     22|  font->serial++;
 2248|       |
 2249|     22|  if (font->destroy)
  ------------------
  |  Branch (2249:7): [True: 11, False: 11]
  ------------------
 2250|     11|    font->destroy (font->user_data);
 2251|       |
 2252|     22|  if (!klass)
  ------------------
  |  Branch (2252:7): [True: 0, False: 22]
  ------------------
 2253|      0|    klass = hb_font_funcs_get_empty ();
 2254|       |
 2255|     22|  hb_font_funcs_reference (klass);
 2256|     22|  hb_font_funcs_destroy (font->klass);
 2257|     22|  font->klass = klass;
 2258|     22|  font->user_data = font_data;
 2259|     22|  font->destroy = destroy;
 2260|     22|}
hb_font_set_scale:
 2335|   204k|{
 2336|   204k|  if (hb_object_is_immutable (font))
  ------------------
  |  Branch (2336:7): [True: 0, False: 204k]
  ------------------
 2337|      0|    return;
 2338|       |
 2339|   204k|  if (font->x_scale == x_scale && font->y_scale == y_scale)
  ------------------
  |  Branch (2339:7): [True: 204k, False: 21]
  |  Branch (2339:35): [True: 204k, False: 0]
  ------------------
 2340|   204k|    return;
 2341|       |
 2342|     21|  font->serial++;
 2343|       |
 2344|     21|  font->x_scale = x_scale;
 2345|     21|  font->y_scale = y_scale;
 2346|     21|  font->mults_changed ();
 2347|     21|}
hb_font_set_ppem:
 2386|   204k|{
 2387|   204k|  if (hb_object_is_immutable (font))
  ------------------
  |  Branch (2387:7): [True: 0, False: 204k]
  ------------------
 2388|      0|    return;
 2389|       |
 2390|   204k|  if (font->x_ppem == x_ppem && font->y_ppem == y_ppem)
  ------------------
  |  Branch (2390:7): [True: 204k, False: 10]
  |  Branch (2390:33): [True: 204k, False: 0]
  ------------------
 2391|   204k|    return;
 2392|       |
 2393|     10|  font->serial++;
 2394|       |
 2395|     10|  font->x_ppem = x_ppem;
 2396|     10|  font->y_ppem = y_ppem;
 2397|     10|}
hb-font.cc:_ZL34hb_font_get_nominal_glyphs_defaultP9hb_font_tPvjPKjjPjjS1_:
  160|   204k|{
  161|   204k|  if (font->has_nominal_glyph_func_set ())
  ------------------
  |  Branch (161:7): [True: 204k, False: 0]
  ------------------
  162|   204k|  {
  163|  1.75M|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (163:30): [True: 1.54M, False: 204k]
  ------------------
  164|  1.54M|    {
  165|  1.54M|      if (!font->get_nominal_glyph (*first_unicode, first_glyph))
  ------------------
  |  Branch (165:11): [True: 9, False: 1.54M]
  ------------------
  166|      9|	return i;
  167|       |
  168|  1.54M|      first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride);
  169|  1.54M|      first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
  170|  1.54M|    }
  171|   204k|    return count;
  172|   204k|  }
  173|       |
  174|      0|  return font->parent->get_nominal_glyphs (count,
  175|      0|					   first_unicode, unicode_stride,
  176|      0|					   first_glyph, glyph_stride);
  177|   204k|}
hb-font.cc:_ZL36hb_font_get_glyph_h_advances_defaultP9hb_font_tPvjPKjjPijS1_:
  263|   204k|{
  264|   204k|  if (font->has_glyph_h_advance_func_set ())
  ------------------
  |  Branch (264:7): [True: 204k, False: 0]
  ------------------
  265|   204k|  {
  266|  3.13M|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (266:30): [True: 2.93M, False: 204k]
  ------------------
  267|  2.93M|    {
  268|  2.93M|      *first_advance = font->get_glyph_h_advance (*first_glyph);
  269|  2.93M|      first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
  270|  2.93M|      first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
  271|  2.93M|    }
  272|   204k|    return;
  273|   204k|  }
  274|       |
  275|      0|  font->parent->get_glyph_h_advances (count,
  276|      0|				      first_glyph, glyph_stride,
  277|      0|				      first_advance, advance_stride);
  278|      0|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (278:28): [True: 0, False: 0]
  ------------------
  279|      0|  {
  280|      0|    *first_advance = font->parent_scale_x_distance (*first_advance);
  281|      0|    first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
  282|      0|  }
  283|      0|}
hb-font.cc:_ZL27_hb_font_funcs_set_preambleP15hb_font_funcs_tbPPvPPFvS1_E:
  877|    123|{
  878|    123|  if (hb_object_is_immutable (ffuncs))
  ------------------
  |  Branch (878:7): [True: 0, False: 123]
  ------------------
  879|      0|  {
  880|      0|    if (*destroy)
  ------------------
  |  Branch (880:9): [True: 0, False: 0]
  ------------------
  881|      0|      (*destroy) (*user_data);
  882|      0|    return false;
  883|      0|  }
  884|       |
  885|    123|  if (func_is_null)
  ------------------
  |  Branch (885:7): [True: 0, False: 123]
  ------------------
  886|      0|  {
  887|      0|    if (*destroy)
  ------------------
  |  Branch (887:9): [True: 0, False: 0]
  ------------------
  888|      0|      (*destroy) (*user_data);
  889|      0|    *destroy = nullptr;
  890|      0|    *user_data = nullptr;
  891|      0|  }
  892|       |
  893|    123|  return true;
  894|    123|}
hb-font.cc:_ZL25_hb_font_funcs_set_middleP15hb_font_funcs_tPvPFvS1_E:
  900|    123|{
  901|    123|  if (user_data && !ffuncs->user_data)
  ------------------
  |  Branch (901:7): [True: 110, False: 13]
  |  Branch (901:20): [True: 11, False: 99]
  ------------------
  902|     11|  {
  903|     11|    ffuncs->user_data = (decltype (ffuncs->user_data)) hb_calloc (1, sizeof (*ffuncs->user_data));
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
  904|     11|    if (unlikely (!ffuncs->user_data))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  905|      0|      goto fail;
  906|     11|  }
  907|    123|  if (destroy && !ffuncs->destroy)
  ------------------
  |  Branch (907:7): [True: 0, False: 123]
  |  Branch (907:18): [True: 0, False: 0]
  ------------------
  908|      0|  {
  909|      0|    ffuncs->destroy = (decltype (ffuncs->destroy)) hb_calloc (1, sizeof (*ffuncs->destroy));
  ------------------
  |  |  235|      0|#define hb_calloc hb_calloc_impl
  ------------------
  910|      0|    if (unlikely (!ffuncs->destroy))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  911|      0|      goto fail;
  912|      0|  }
  913|       |
  914|    123|  return true;
  915|       |
  916|      0|fail:
  917|      0|  if (destroy)
  ------------------
  |  Branch (917:7): [True: 0, False: 0]
  ------------------
  918|      0|    (destroy) (user_data);
  919|      0|  return false;
  920|    123|}
hb-font.cc:_ZL15_hb_font_createP9hb_face_t:
 1812|     11|{
 1813|     11|  hb_font_t *font;
 1814|       |
 1815|     11|  if (unlikely (!face))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
 1816|      0|    face = hb_face_get_empty ();
 1817|       |
 1818|     11|  if (!(font = hb_object_create<hb_font_t> ()))
  ------------------
  |  Branch (1818:7): [True: 0, False: 11]
  ------------------
 1819|      0|    return hb_font_get_empty ();
 1820|       |
 1821|     11|  hb_face_make_immutable (face);
 1822|     11|  font->parent = hb_font_get_empty ();
 1823|     11|  font->face = hb_face_reference (face);
 1824|     11|  font->klass = hb_font_funcs_get_empty ();
 1825|     11|  font->data.init0 (font);
 1826|     11|  font->x_scale = font->y_scale = face->get_upem ();
 1827|     11|  font->embolden_in_place = true;
 1828|     11|  font->x_multf = font->y_multf = 1.f;
 1829|     11|  font->x_mult = font->y_mult = 1 << 16;
 1830|     11|  font->instance_index = HB_FONT_NO_VAR_NAMED_INSTANCE;
  ------------------
  |  | 1142|     11|#define HB_FONT_NO_VAR_NAMED_INSTANCE 0xFFFFFFFF
  ------------------
 1831|       |
 1832|     11|  return font;
 1833|     11|}

_ZN9hb_font_t26has_nominal_glyph_func_setEv:
  245|   204k|  { \
  246|   204k|    hb_font_funcs_t *funcs = this->klass; \
  247|   204k|    unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
  248|   204k|    return has_func_set (i); \
  249|   204k|  }
_ZN9hb_font_t28has_glyph_h_advance_func_setEv:
  245|   204k|  { \
  246|   204k|    hb_font_funcs_t *funcs = this->klass; \
  247|   204k|    unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
  248|   204k|    return has_func_set (i); \
  249|   204k|  }
_ZN9hb_font_t23has_glyph_h_origin_funcEv:
  238|   614k|  { \
  239|   614k|    hb_font_funcs_t *funcs = this->klass; \
  240|   614k|    unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \
  241|   614k|    return has_func (i); \
  242|   614k|  } \
_ZN9hb_font_t17get_nominal_glyphEjPjj:
  277|  2.93M|  {
  278|  2.93M|    *glyph = not_found;
  279|  2.93M|    return klass->get.f.nominal_glyph (this, user_data,
  280|  2.93M|				       unicode, glyph,
  281|  2.93M|				       !klass->user_data ? nullptr : klass->user_data->nominal_glyph);
  ------------------
  |  Branch (281:12): [True: 0, False: 2.93M]
  ------------------
  282|  2.93M|  }
_ZN9hb_font_t18get_nominal_glyphsEjPKjjPjj:
  288|   204k|  {
  289|   204k|    return klass->get.f.nominal_glyphs (this, user_data,
  290|   204k|					count,
  291|   204k|					first_unicode, unicode_stride,
  292|   204k|					first_glyph, glyph_stride,
  293|   204k|					!klass->user_data ? nullptr : klass->user_data->nominal_glyphs);
  ------------------
  |  Branch (293:6): [True: 0, False: 204k]
  ------------------
  294|   204k|  }
_ZN9hb_font_t19get_glyph_h_advanceEj:
  307|  2.93M|  {
  308|  2.93M|    return klass->get.f.glyph_h_advance (this, user_data,
  309|  2.93M|					 glyph,
  310|  2.93M|					 !klass->user_data ? nullptr : klass->user_data->glyph_h_advance);
  ------------------
  |  Branch (310:7): [True: 0, False: 2.93M]
  ------------------
  311|  2.93M|  }
_ZN9hb_font_t20get_glyph_h_advancesEjPKjjPij:
  325|   204k|  {
  326|   204k|    return klass->get.f.glyph_h_advances (this, user_data,
  327|   204k|					  count,
  328|   204k|					  first_glyph, glyph_stride,
  329|   204k|					  first_advance, advance_stride,
  330|   204k|					  !klass->user_data ? nullptr : klass->user_data->glyph_h_advances);
  ------------------
  |  Branch (330:8): [True: 0, False: 204k]
  ------------------
  331|   204k|  }
_ZN9hb_font_t18get_glyph_h_originEjPiS0_:
  348|  8.79M|  {
  349|  8.79M|    *x = *y = 0;
  350|  8.79M|    return klass->get.f.glyph_h_origin (this, user_data,
  351|  8.79M|					glyph, x, y,
  352|  8.79M|					!klass->user_data ? nullptr : klass->user_data->glyph_h_origin);
  ------------------
  |  Branch (352:6): [True: 0, False: 8.79M]
  ------------------
  353|  8.79M|  }
_ZN9hb_font_t32get_glyph_h_origin_with_fallbackEjPiS0_:
  515|  8.79M|  {
  516|  8.79M|    if (!get_glyph_h_origin (glyph, x, y) &&
  ------------------
  |  Branch (516:9): [True: 0, False: 8.79M]
  ------------------
  517|  8.79M|	 get_glyph_v_origin (glyph, x, y))
  ------------------
  |  Branch (517:3): [True: 0, False: 0]
  ------------------
  518|      0|    {
  519|      0|      hb_position_t dx, dy;
  520|      0|      guess_v_origin_minus_h_origin (glyph, &dx, &dy);
  521|      0|      *x -= dx; *y -= dy;
  522|      0|    }
  523|  8.79M|  }
_ZN9hb_font_t18add_glyph_h_originEjPiS0_:
  548|  2.93M|  {
  549|  2.93M|    hb_position_t origin_x, origin_y;
  550|       |
  551|  2.93M|    get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
  552|       |
  553|  2.93M|    *x += origin_x;
  554|  2.93M|    *y += origin_y;
  555|  2.93M|  }
_ZN9hb_font_t23subtract_glyph_h_originEjPiS0_:
  580|  5.86M|  {
  581|  5.86M|    hb_position_t origin_x, origin_y;
  582|       |
  583|  5.86M|    get_glyph_h_origin_with_fallback (glyph, &origin_x, &origin_y);
  584|       |
  585|  5.86M|    *x -= origin_x;
  586|  5.86M|    *y -= origin_y;
  587|  5.86M|  }
_ZN9hb_font_t13mults_changedEv:
  690|     21|  {
  691|     21|    float upem = face->get_upem ();
  692|       |
  693|     21|    x_multf = x_scale / upem;
  694|     21|    y_multf = y_scale / upem;
  695|     21|    bool x_neg = x_scale < 0;
  696|     21|    x_mult = (x_neg ? -((int64_t) -x_scale << 16) : ((int64_t) x_scale << 16)) / upem;
  ------------------
  |  Branch (696:15): [True: 0, False: 21]
  ------------------
  697|     21|    bool y_neg = y_scale < 0;
  698|     21|    y_mult = (y_neg ? -((int64_t) -y_scale << 16) : ((int64_t) y_scale << 16)) / upem;
  ------------------
  |  Branch (698:15): [True: 0, False: 21]
  ------------------
  699|       |
  700|     21|    x_strength = fabsf (roundf (x_scale * x_embolden));
  ------------------
  |  |  207|     21|#define roundf(x) _hb_roundf(x)
  ------------------
  701|     21|    y_strength = fabsf (roundf (y_scale * y_embolden));
  ------------------
  |  |  207|     21|#define roundf(x) _hb_roundf(x)
  ------------------
  702|       |
  703|     21|    slant_xy = y_scale ? slant * x_scale / y_scale : 0.f;
  ------------------
  |  Branch (703:16): [True: 10, False: 11]
  ------------------
  704|       |
  705|     21|    data.fini ();
  706|     21|  }

_ZN9hb_iter_tI10hb_array_tIjERjE4thizEv:
   71|     78|	iter_t* thiz ()       { return static_cast<      iter_t *> (this); }
_ZNR9hb_iter_tI10hb_array_tIjERjEppEv:
   94|     13|  iter_t& operator ++ () &  { thiz()->__next__ (); return *thiz(); }
_ZN9hb_iter_tI10hb_array_tIjERjEdeEv:
   89|     13|  item_t operator * () { return thiz()->__item__ (); }
_ZN9hb_sink_tI10hb_array_tIjEEC2ES1_:
  877|     42|  hb_sink_t (Sink s) : s (s) {}
_ZNK9hb_iter_tI10hb_array_tIKN2OT5IndexEERS3_EcvbEv:
   81|     55|  explicit operator bool () const { return thiz()->__more__ (); }
_ZNK9hb_iter_tI10hb_array_tIKN2OT5IndexEERS3_E4thizEv:
   70|    152|  const iter_t* thiz () const { return static_cast<const iter_t *> (this); }
_ZNK24hb_iter_fallback_mixin_tI10hb_array_tIKN2OT5IndexEERS3_E8__more__Ev:
  204|     55|  bool __more__ () const { return bool (thiz()->len ()); }
_ZNK24hb_iter_fallback_mixin_tI10hb_array_tIKN2OT5IndexEERS3_E4thizEv:
  195|     55|  const iter_t* thiz () const { return static_cast<const iter_t *> (this); }
_ZNK9hb_iter_tI10hb_array_tIKN2OT5IndexEERS3_E3lenEv:
   82|     55|  unsigned len () const { return thiz()->__len__ (); }
_ZNR9hb_iter_tI10hb_array_tIKN2OT5IndexEERS3_EppEv:
   94|     13|  iter_t& operator ++ () &  { thiz()->__next__ (); return *thiz(); }
_ZN9hb_iter_tI10hb_array_tIKN2OT5IndexEERS3_E4thizEv:
   71|     39|	iter_t* thiz ()       { return static_cast<      iter_t *> (this); }
_ZN9hb_iter_tI10hb_array_tIKN2OT5IndexEERS3_EdeEv:
   89|     13|  item_t operator * () { return thiz()->__item__ (); }
_ZNK9hb_iter_tI10hb_array_tIKN2OT5IndexEERS3_EpsEv:
   76|     42|  iter_t operator + () const { return *thiz(); }
_ZN9hb_sink_tI10hb_array_tIjEEclIS0_IKN2OT5IndexEELPv0EEEvT_:
  882|     42|  {
  883|     55|    for (; it; ++it)
  ------------------
  |  Branch (883:12): [True: 13, False: 42]
  ------------------
  884|     13|      s << *it;
  885|     42|  }
_ZNR9hb_iter_tI10hb_array_tIjERjElsIN2OT5IndexEEERS1_T_:
  110|     13|  iter_t& operator << (const T v) &  { **thiz() = v; ++*thiz(); return *thiz(); }
_ZNK9hb_iter_tI17hb_sorted_array_tIKN2OT11HBGlyphID16EERS3_E3lenEv:
   82|      3|  unsigned len () const { return thiz()->__len__ (); }
_ZNK9hb_iter_tI17hb_sorted_array_tIKN2OT11HBGlyphID16EERS3_E4thizEv:
   70|      3|  const iter_t* thiz () const { return static_cast<const iter_t *> (this); }
hb-ot-layout.cc:_ZNK4$_26clI10hb_array_tIjEEE9hb_sink_tIT_EOS4_:
  894|     42|  { return hb_sink_t<Sink> (s); }
hb-ot-layout.cc:_ZNK3$_9clIN2OT33hb_accelerate_subtables_context_t15hb_applicable_tEEE10hb_array_tIT_EPS5_j:
  166|      5|  { return hb_array_t<Type> (array, length); }
_ZNK9hb_iter_tI10hb_array_tIN19hb_ot_map_builder_t14feature_info_tEERS2_E13get_item_sizeEv:
   62|     13|  constexpr unsigned get_item_size () const { return hb_static_size (Item); }
  ------------------
  |  |   91|     13|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
_ZNK9hb_iter_tI10hb_array_tIN11hb_ot_map_t12lookup_map_tEERS2_E13get_item_sizeEv:
   62|      2|  constexpr unsigned get_item_size () const { return hb_static_size (Item); }
  ------------------
  |  |   91|      2|#define hb_static_size(T) hb_static_size<T>::value
  ------------------

_ZNK17hb_data_wrapper_tIvLj0EE8is_inertEv:
  163|      3|  bool is_inert () const { return false; }
_ZN16hb_lazy_loader_tI17hb_ot_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj1ES0_ES2_Lj1ES0_E4finiEv:
  188|     32|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tI17hb_ot_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj1ES0_ES2_Lj1ES0_E10do_destroyEPS0_:
  200|     32|  {
  201|     32|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 21]
  |  Branch (201:14): [True: 11, False: 0]
  ------------------
  202|     11|      Funcs::destroy (p);
  203|     32|  }
_ZN16hb_lazy_loader_tI17hb_ot_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj1ES0_ES2_Lj1ES0_E4initEv:
  187|     32|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tI23hb_fallback_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj2ES0_ES2_Lj2ES0_E4finiEv:
  188|     32|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tI23hb_fallback_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj2ES0_ES2_Lj2ES0_E10do_destroyEPS0_:
  200|     32|  {
  201|     32|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 32]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     32|  }
_ZN16hb_lazy_loader_tI23hb_fallback_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj2ES0_ES2_Lj2ES0_E4initEv:
  187|     32|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tI17hb_ot_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj1ES0_ES2_Lj1ES0_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tI23hb_fallback_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj2ES0_ES2_Lj2ES0_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4headE22hb_table_lazy_loader_tIS1_Lj1ELb1EE9hb_face_tLj1E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4maxpE22hb_table_lazy_loader_tIS1_Lj2ELb1EE9hb_face_tLj2E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18cmap_accelerator_tE21hb_face_lazy_loader_tIS1_Lj3EE9hb_face_tLj3ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4hheaE22hb_table_lazy_loader_tIS1_Lj4ELb1EE9hb_face_tLj4E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18hmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj5EE9hb_face_tLj5ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT3OS2E22hb_table_lazy_loader_tIS1_Lj6ELb1EE9hb_face_tLj6E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18post_accelerator_tE21hb_face_lazy_loader_tIS1_Lj7EE9hb_face_tLj7ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18name_accelerator_tE21hb_face_lazy_loader_tIS1_Lj8EE9hb_face_tLj8ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4STATE22hb_table_lazy_loader_tIS1_Lj9ELb1EE9hb_face_tLj9E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18meta_accelerator_tE21hb_face_lazy_loader_tIS1_Lj10EE9hb_face_tLj10ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4vheaE22hb_table_lazy_loader_tIS1_Lj11ELb1EE9hb_face_tLj11E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18vmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj12EE9hb_face_tLj12ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4VORGE22hb_table_lazy_loader_tIS1_Lj13ELb1EE9hb_face_tLj13E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4locaE22hb_table_lazy_loader_tIS1_Lj14ELb1EE9hb_face_tLj14E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18glyf_accelerator_tE21hb_face_lazy_loader_tIS1_Lj15EE9hb_face_tLj15ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18cff1_accelerator_tE21hb_face_lazy_loader_tIS1_Lj16EE9hb_face_tLj16ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18cff2_accelerator_tE21hb_face_lazy_loader_tIS1_Lj17EE9hb_face_tLj17ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4fvarE22hb_table_lazy_loader_tIS1_Lj18ELb1EE9hb_face_tLj18E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4avarE22hb_table_lazy_loader_tIS1_Lj19ELb1EE9hb_face_tLj19E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4cvarE22hb_table_lazy_loader_tIS1_Lj20ELb1EE9hb_face_tLj20E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18gvar_accelerator_tE21hb_face_lazy_loader_tIS1_Lj21EE9hb_face_tLj21ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4MVARE22hb_table_lazy_loader_tIS1_Lj22ELb1EE9hb_face_tLj22E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4kernE22hb_table_lazy_loader_tIS1_Lj23ELb1EE9hb_face_tLj23E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4BASEE22hb_table_lazy_loader_tIS1_Lj27ELb1EE9hb_face_tLj27E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN3AAT4morxE22hb_table_lazy_loader_tIS1_Lj28ELb0EE9hb_face_tLj28E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN3AAT4mortE22hb_table_lazy_loader_tIS1_Lj29ELb0EE9hb_face_tLj29E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN3AAT4kerxE22hb_table_lazy_loader_tIS1_Lj30ELb0EE9hb_face_tLj30E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN3AAT4ankrE22hb_table_lazy_loader_tIS1_Lj31ELb0EE9hb_face_tLj31E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN3AAT4trakE22hb_table_lazy_loader_tIS1_Lj32ELb0EE9hb_face_tLj32E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN3AAT4ltagE22hb_table_lazy_loader_tIS1_Lj33ELb0EE9hb_face_tLj33E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN3AAT4featE22hb_table_lazy_loader_tIS1_Lj34ELb0EE9hb_face_tLj34E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4COLRE22hb_table_lazy_loader_tIS1_Lj35ELb1EE9hb_face_tLj35E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4CPALE22hb_table_lazy_loader_tIS1_Lj36ELb1EE9hb_face_tLj36E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18CBDT_accelerator_tE21hb_face_lazy_loader_tIS1_Lj37EE9hb_face_tLj37ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT18sbix_accelerator_tE21hb_face_lazy_loader_tIS1_Lj38EE9hb_face_tLj38ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT17SVG_accelerator_tE21hb_face_lazy_loader_tIS1_Lj39EE9hb_face_tLj39ES1_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tIN2OT4MATHE22hb_table_lazy_loader_tIS1_Lj40ELb1EE9hb_face_tLj40E9hb_blob_tEC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tI17hb_ot_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj1ES0_ES2_Lj1ES0_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tI23hb_fallback_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj2ES0_ES2_Lj2ES0_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tI17hb_ot_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj1ES0_ES2_Lj1ES0_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tI17hb_ot_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj1ES0_ES2_Lj1ES0_E10do_destroyEPS0_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 11, False: 0]
  ------------------
  202|     11|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tI17hb_ot_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj1ES0_ES2_Lj1ES0_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tI23hb_fallback_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj2ES0_ES2_Lj2ES0_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tI23hb_fallback_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj2ES0_ES2_Lj2ES0_E10do_destroyEPS0_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tI23hb_fallback_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj2ES0_ES2_Lj2ES0_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT3OS2E22hb_table_lazy_loader_tIS1_Lj6ELb1EE9hb_face_tLj6E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18cmap_accelerator_tE21hb_face_lazy_loader_tIS1_Lj3EE9hb_face_tLj3ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4MVARE22hb_table_lazy_loader_tIS1_Lj22ELb1EE9hb_face_tLj22E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
hb-font.cc:_ZL23StructAtOffsetUnalignedIjERKT_PKvj:
   53|  4.48M|{
   54|  4.48M|#pragma GCC diagnostic push
   55|  4.48M|#pragma GCC diagnostic ignored "-Wcast-align"
   56|  4.48M|  return * reinterpret_cast<const Type*> ((const char *) P + offset);
   57|  4.48M|#pragma GCC diagnostic pop
   58|  4.48M|}
hb-font.cc:_ZL23StructAtOffsetUnalignedIjERT_Pvj:
   61|  1.54M|{
   62|  1.54M|#pragma GCC diagnostic push
   63|  1.54M|#pragma GCC diagnostic ignored "-Wcast-align"
   64|  1.54M|  return * reinterpret_cast<Type*> ((char *) P + offset);
   65|  1.54M|#pragma GCC diagnostic pop
   66|  1.54M|}
hb-font.cc:_ZL23StructAtOffsetUnalignedIiERT_Pvj:
   61|  2.93M|{
   62|  2.93M|#pragma GCC diagnostic push
   63|  2.93M|#pragma GCC diagnostic ignored "-Wcast-align"
   64|  2.93M|  return * reinterpret_cast<Type*> ((char *) P + offset);
   65|  2.93M|#pragma GCC diagnostic pop
   66|  2.93M|}
_ZN16hb_lazy_loader_tI17hb_ot_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj1ES0_ES2_Lj1ES0_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tI23hb_fallback_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj2ES0_ES2_Lj2ES0_EC2Ev:
  183|     11|  hb_lazy_loader_t () = default;
_ZN16hb_lazy_loader_tI17hb_ot_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj1ES0_ES2_Lj1ES0_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tI23hb_fallback_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj2ES0_ES2_Lj2ES0_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4fvarE22hb_table_lazy_loader_tIS1_Lj18ELb1EE9hb_face_tLj18E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4avarE22hb_table_lazy_loader_tIS1_Lj19ELb1EE9hb_face_tLj19E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4headE22hb_table_lazy_loader_tIS1_Lj1ELb1EE9hb_face_tLj1E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4maxpE22hb_table_lazy_loader_tIS1_Lj2ELb1EE9hb_face_tLj2E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18cmap_accelerator_tE21hb_face_lazy_loader_tIS1_Lj3EE9hb_face_tLj3ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4hheaE22hb_table_lazy_loader_tIS1_Lj4ELb1EE9hb_face_tLj4E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18hmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj5EE9hb_face_tLj5ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT3OS2E22hb_table_lazy_loader_tIS1_Lj6ELb1EE9hb_face_tLj6E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18post_accelerator_tE21hb_face_lazy_loader_tIS1_Lj7EE9hb_face_tLj7ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18name_accelerator_tE21hb_face_lazy_loader_tIS1_Lj8EE9hb_face_tLj8ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4STATE22hb_table_lazy_loader_tIS1_Lj9ELb1EE9hb_face_tLj9E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18meta_accelerator_tE21hb_face_lazy_loader_tIS1_Lj10EE9hb_face_tLj10ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4vheaE22hb_table_lazy_loader_tIS1_Lj11ELb1EE9hb_face_tLj11E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18vmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj12EE9hb_face_tLj12ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4VORGE22hb_table_lazy_loader_tIS1_Lj13ELb1EE9hb_face_tLj13E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4locaE22hb_table_lazy_loader_tIS1_Lj14ELb1EE9hb_face_tLj14E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18glyf_accelerator_tE21hb_face_lazy_loader_tIS1_Lj15EE9hb_face_tLj15ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18cff1_accelerator_tE21hb_face_lazy_loader_tIS1_Lj16EE9hb_face_tLj16ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18cff2_accelerator_tE21hb_face_lazy_loader_tIS1_Lj17EE9hb_face_tLj17ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4fvarE22hb_table_lazy_loader_tIS1_Lj18ELb1EE9hb_face_tLj18E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4avarE22hb_table_lazy_loader_tIS1_Lj19ELb1EE9hb_face_tLj19E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4cvarE22hb_table_lazy_loader_tIS1_Lj20ELb1EE9hb_face_tLj20E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18gvar_accelerator_tE21hb_face_lazy_loader_tIS1_Lj21EE9hb_face_tLj21ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4MVARE22hb_table_lazy_loader_tIS1_Lj22ELb1EE9hb_face_tLj22E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4kernE22hb_table_lazy_loader_tIS1_Lj23ELb1EE9hb_face_tLj23E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4BASEE22hb_table_lazy_loader_tIS1_Lj27ELb1EE9hb_face_tLj27E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN3AAT4morxE22hb_table_lazy_loader_tIS1_Lj28ELb0EE9hb_face_tLj28E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN3AAT4mortE22hb_table_lazy_loader_tIS1_Lj29ELb0EE9hb_face_tLj29E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN3AAT4kerxE22hb_table_lazy_loader_tIS1_Lj30ELb0EE9hb_face_tLj30E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN3AAT4ankrE22hb_table_lazy_loader_tIS1_Lj31ELb0EE9hb_face_tLj31E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN3AAT4trakE22hb_table_lazy_loader_tIS1_Lj32ELb0EE9hb_face_tLj32E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN3AAT4ltagE22hb_table_lazy_loader_tIS1_Lj33ELb0EE9hb_face_tLj33E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN3AAT4featE22hb_table_lazy_loader_tIS1_Lj34ELb0EE9hb_face_tLj34E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4COLRE22hb_table_lazy_loader_tIS1_Lj35ELb1EE9hb_face_tLj35E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4CPALE22hb_table_lazy_loader_tIS1_Lj36ELb1EE9hb_face_tLj36E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18CBDT_accelerator_tE21hb_face_lazy_loader_tIS1_Lj37EE9hb_face_tLj37ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT18sbix_accelerator_tE21hb_face_lazy_loader_tIS1_Lj38EE9hb_face_tLj38ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT17SVG_accelerator_tE21hb_face_lazy_loader_tIS1_Lj39EE9hb_face_tLj39ES1_E5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4MATHE22hb_table_lazy_loader_tIS1_Lj40ELb1EE9hb_face_tLj40E9hb_blob_tE5init0Ev:
  186|     11|  void init0 () {} /* Init, when memory is already set to 0. No-op for us. */
_ZN16hb_lazy_loader_tIN2OT4headE22hb_table_lazy_loader_tIS1_Lj1ELb1EE9hb_face_tLj1E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4headE22hb_table_lazy_loader_tIS1_Lj1ELb1EE9hb_face_tLj1E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4headE22hb_table_lazy_loader_tIS1_Lj1ELb1EE9hb_face_tLj1E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4maxpE22hb_table_lazy_loader_tIS1_Lj2ELb1EE9hb_face_tLj2E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4maxpE22hb_table_lazy_loader_tIS1_Lj2ELb1EE9hb_face_tLj2E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 11, False: 0]
  ------------------
  202|     11|      Funcs::destroy (p);
  203|     11|  }
_ZN22hb_table_lazy_loader_tIN2OT4maxpELj2ELb1EE8get_nullEv:
  306|     11|  { return hb_blob_get_empty (); }
_ZN22hb_table_lazy_loader_tIN2OT4maxpELj2ELb1EE7destroyEP9hb_blob_t:
  303|     11|  static void destroy (hb_blob_t *p) { hb_blob_destroy (p); }
_ZN16hb_lazy_loader_tIN2OT4maxpE22hb_table_lazy_loader_tIS1_Lj2ELb1EE9hb_face_tLj2E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18cmap_accelerator_tE21hb_face_lazy_loader_tIS1_Lj3EE9hb_face_tLj3ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18cmap_accelerator_tE21hb_face_lazy_loader_tIS1_Lj3EE9hb_face_tLj3ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4hheaE22hb_table_lazy_loader_tIS1_Lj4ELb1EE9hb_face_tLj4E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4hheaE22hb_table_lazy_loader_tIS1_Lj4ELb1EE9hb_face_tLj4E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4hheaE22hb_table_lazy_loader_tIS1_Lj4ELb1EE9hb_face_tLj4E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18hmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj5EE9hb_face_tLj5ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18hmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj5EE9hb_face_tLj5ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18hmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj5EE9hb_face_tLj5ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT3OS2E22hb_table_lazy_loader_tIS1_Lj6ELb1EE9hb_face_tLj6E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT3OS2E22hb_table_lazy_loader_tIS1_Lj6ELb1EE9hb_face_tLj6E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18post_accelerator_tE21hb_face_lazy_loader_tIS1_Lj7EE9hb_face_tLj7ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18post_accelerator_tE21hb_face_lazy_loader_tIS1_Lj7EE9hb_face_tLj7ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18post_accelerator_tE21hb_face_lazy_loader_tIS1_Lj7EE9hb_face_tLj7ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18name_accelerator_tE21hb_face_lazy_loader_tIS1_Lj8EE9hb_face_tLj8ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18name_accelerator_tE21hb_face_lazy_loader_tIS1_Lj8EE9hb_face_tLj8ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18name_accelerator_tE21hb_face_lazy_loader_tIS1_Lj8EE9hb_face_tLj8ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4STATE22hb_table_lazy_loader_tIS1_Lj9ELb1EE9hb_face_tLj9E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4STATE22hb_table_lazy_loader_tIS1_Lj9ELb1EE9hb_face_tLj9E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4STATE22hb_table_lazy_loader_tIS1_Lj9ELb1EE9hb_face_tLj9E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18meta_accelerator_tE21hb_face_lazy_loader_tIS1_Lj10EE9hb_face_tLj10ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18meta_accelerator_tE21hb_face_lazy_loader_tIS1_Lj10EE9hb_face_tLj10ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18meta_accelerator_tE21hb_face_lazy_loader_tIS1_Lj10EE9hb_face_tLj10ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4vheaE22hb_table_lazy_loader_tIS1_Lj11ELb1EE9hb_face_tLj11E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4vheaE22hb_table_lazy_loader_tIS1_Lj11ELb1EE9hb_face_tLj11E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4vheaE22hb_table_lazy_loader_tIS1_Lj11ELb1EE9hb_face_tLj11E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18vmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj12EE9hb_face_tLj12ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18vmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj12EE9hb_face_tLj12ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18vmtx_accelerator_tE21hb_face_lazy_loader_tIS1_Lj12EE9hb_face_tLj12ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4VORGE22hb_table_lazy_loader_tIS1_Lj13ELb1EE9hb_face_tLj13E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4VORGE22hb_table_lazy_loader_tIS1_Lj13ELb1EE9hb_face_tLj13E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4VORGE22hb_table_lazy_loader_tIS1_Lj13ELb1EE9hb_face_tLj13E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4locaE22hb_table_lazy_loader_tIS1_Lj14ELb1EE9hb_face_tLj14E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4locaE22hb_table_lazy_loader_tIS1_Lj14ELb1EE9hb_face_tLj14E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4locaE22hb_table_lazy_loader_tIS1_Lj14ELb1EE9hb_face_tLj14E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18glyf_accelerator_tE21hb_face_lazy_loader_tIS1_Lj15EE9hb_face_tLj15ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18glyf_accelerator_tE21hb_face_lazy_loader_tIS1_Lj15EE9hb_face_tLj15ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18glyf_accelerator_tE21hb_face_lazy_loader_tIS1_Lj15EE9hb_face_tLj15ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18cff1_accelerator_tE21hb_face_lazy_loader_tIS1_Lj16EE9hb_face_tLj16ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18cff1_accelerator_tE21hb_face_lazy_loader_tIS1_Lj16EE9hb_face_tLj16ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18cff1_accelerator_tE21hb_face_lazy_loader_tIS1_Lj16EE9hb_face_tLj16ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18cff2_accelerator_tE21hb_face_lazy_loader_tIS1_Lj17EE9hb_face_tLj17ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18cff2_accelerator_tE21hb_face_lazy_loader_tIS1_Lj17EE9hb_face_tLj17ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18cff2_accelerator_tE21hb_face_lazy_loader_tIS1_Lj17EE9hb_face_tLj17ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4fvarE22hb_table_lazy_loader_tIS1_Lj18ELb1EE9hb_face_tLj18E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4fvarE22hb_table_lazy_loader_tIS1_Lj18ELb1EE9hb_face_tLj18E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4avarE22hb_table_lazy_loader_tIS1_Lj19ELb1EE9hb_face_tLj19E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4avarE22hb_table_lazy_loader_tIS1_Lj19ELb1EE9hb_face_tLj19E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4cvarE22hb_table_lazy_loader_tIS1_Lj20ELb1EE9hb_face_tLj20E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4cvarE22hb_table_lazy_loader_tIS1_Lj20ELb1EE9hb_face_tLj20E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4cvarE22hb_table_lazy_loader_tIS1_Lj20ELb1EE9hb_face_tLj20E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18gvar_accelerator_tE21hb_face_lazy_loader_tIS1_Lj21EE9hb_face_tLj21ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18gvar_accelerator_tE21hb_face_lazy_loader_tIS1_Lj21EE9hb_face_tLj21ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18gvar_accelerator_tE21hb_face_lazy_loader_tIS1_Lj21EE9hb_face_tLj21ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4MVARE22hb_table_lazy_loader_tIS1_Lj22ELb1EE9hb_face_tLj22E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4MVARE22hb_table_lazy_loader_tIS1_Lj22ELb1EE9hb_face_tLj22E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4kernE22hb_table_lazy_loader_tIS1_Lj23ELb1EE9hb_face_tLj23E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4kernE22hb_table_lazy_loader_tIS1_Lj23ELb1EE9hb_face_tLj23E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 1, False: 10]
  ------------------
  202|      1|      Funcs::destroy (p);
  203|     11|  }
_ZN22hb_table_lazy_loader_tIN2OT4kernELj23ELb1EE8get_nullEv:
  306|     11|  { return hb_blob_get_empty (); }
_ZN22hb_table_lazy_loader_tIN2OT4kernELj23ELb1EE7destroyEP9hb_blob_t:
  303|      1|  static void destroy (hb_blob_t *p) { hb_blob_destroy (p); }
_ZN16hb_lazy_loader_tIN2OT4kernE22hb_table_lazy_loader_tIS1_Lj23ELb1EE9hb_face_tLj23E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 11, False: 0]
  ------------------
  202|     11|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E8get_nullEv:
  253|     11|  static const Stored* get_null () { return &Null (Stored); }
  ------------------
  |  |  124|     11|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
_ZN16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E7destroyEPS1_:
  269|     11|  {
  270|     11|    p->~Stored ();
  271|     11|    hb_free (p);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
  272|     11|  }
_ZN16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 11, False: 0]
  ------------------
  202|     11|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E8get_nullEv:
  253|     11|  static const Stored* get_null () { return &Null (Stored); }
  ------------------
  |  |  124|     11|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
_ZN16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E7destroyEPS1_:
  269|     11|  {
  270|     11|    p->~Stored ();
  271|     11|    hb_free (p);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
  272|     11|  }
_ZN16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 11, False: 0]
  ------------------
  202|     11|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E8get_nullEv:
  253|     11|  static const Stored* get_null () { return &Null (Stored); }
  ------------------
  |  |  124|     11|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
_ZN16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E7destroyEPS1_:
  269|     11|  {
  270|     11|    p->~Stored ();
  271|     11|    hb_free (p);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
  272|     11|  }
_ZN16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4BASEE22hb_table_lazy_loader_tIS1_Lj27ELb1EE9hb_face_tLj27E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4BASEE22hb_table_lazy_loader_tIS1_Lj27ELb1EE9hb_face_tLj27E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4BASEE22hb_table_lazy_loader_tIS1_Lj27ELb1EE9hb_face_tLj27E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN3AAT4morxE22hb_table_lazy_loader_tIS1_Lj28ELb0EE9hb_face_tLj28E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN3AAT4morxE22hb_table_lazy_loader_tIS1_Lj28ELb0EE9hb_face_tLj28E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 0, False: 11]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN22hb_table_lazy_loader_tIN3AAT4morxELj28ELb0EE8get_nullEv:
  306|     11|  { return hb_blob_get_empty (); }
_ZN16hb_lazy_loader_tIN3AAT4morxE22hb_table_lazy_loader_tIS1_Lj28ELb0EE9hb_face_tLj28E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN3AAT4mortE22hb_table_lazy_loader_tIS1_Lj29ELb0EE9hb_face_tLj29E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN3AAT4mortE22hb_table_lazy_loader_tIS1_Lj29ELb0EE9hb_face_tLj29E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 0, False: 11]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN22hb_table_lazy_loader_tIN3AAT4mortELj29ELb0EE8get_nullEv:
  306|     11|  { return hb_blob_get_empty (); }
_ZN16hb_lazy_loader_tIN3AAT4mortE22hb_table_lazy_loader_tIS1_Lj29ELb0EE9hb_face_tLj29E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN3AAT4kerxE22hb_table_lazy_loader_tIS1_Lj30ELb0EE9hb_face_tLj30E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN3AAT4kerxE22hb_table_lazy_loader_tIS1_Lj30ELb0EE9hb_face_tLj30E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 0, False: 11]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN22hb_table_lazy_loader_tIN3AAT4kerxELj30ELb0EE8get_nullEv:
  306|     11|  { return hb_blob_get_empty (); }
_ZN16hb_lazy_loader_tIN3AAT4kerxE22hb_table_lazy_loader_tIS1_Lj30ELb0EE9hb_face_tLj30E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN3AAT4ankrE22hb_table_lazy_loader_tIS1_Lj31ELb0EE9hb_face_tLj31E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN3AAT4ankrE22hb_table_lazy_loader_tIS1_Lj31ELb0EE9hb_face_tLj31E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN3AAT4ankrE22hb_table_lazy_loader_tIS1_Lj31ELb0EE9hb_face_tLj31E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN3AAT4trakE22hb_table_lazy_loader_tIS1_Lj32ELb0EE9hb_face_tLj32E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN3AAT4trakE22hb_table_lazy_loader_tIS1_Lj32ELb0EE9hb_face_tLj32E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 11, False: 0]
  |  Branch (201:14): [True: 0, False: 11]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN22hb_table_lazy_loader_tIN3AAT4trakELj32ELb0EE8get_nullEv:
  306|     11|  { return hb_blob_get_empty (); }
_ZN16hb_lazy_loader_tIN3AAT4trakE22hb_table_lazy_loader_tIS1_Lj32ELb0EE9hb_face_tLj32E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN3AAT4ltagE22hb_table_lazy_loader_tIS1_Lj33ELb0EE9hb_face_tLj33E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN3AAT4ltagE22hb_table_lazy_loader_tIS1_Lj33ELb0EE9hb_face_tLj33E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN3AAT4ltagE22hb_table_lazy_loader_tIS1_Lj33ELb0EE9hb_face_tLj33E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN3AAT4featE22hb_table_lazy_loader_tIS1_Lj34ELb0EE9hb_face_tLj34E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN3AAT4featE22hb_table_lazy_loader_tIS1_Lj34ELb0EE9hb_face_tLj34E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN3AAT4featE22hb_table_lazy_loader_tIS1_Lj34ELb0EE9hb_face_tLj34E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4COLRE22hb_table_lazy_loader_tIS1_Lj35ELb1EE9hb_face_tLj35E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4COLRE22hb_table_lazy_loader_tIS1_Lj35ELb1EE9hb_face_tLj35E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4COLRE22hb_table_lazy_loader_tIS1_Lj35ELb1EE9hb_face_tLj35E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4CPALE22hb_table_lazy_loader_tIS1_Lj36ELb1EE9hb_face_tLj36E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4CPALE22hb_table_lazy_loader_tIS1_Lj36ELb1EE9hb_face_tLj36E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4CPALE22hb_table_lazy_loader_tIS1_Lj36ELb1EE9hb_face_tLj36E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18CBDT_accelerator_tE21hb_face_lazy_loader_tIS1_Lj37EE9hb_face_tLj37ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18CBDT_accelerator_tE21hb_face_lazy_loader_tIS1_Lj37EE9hb_face_tLj37ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18CBDT_accelerator_tE21hb_face_lazy_loader_tIS1_Lj37EE9hb_face_tLj37ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT18sbix_accelerator_tE21hb_face_lazy_loader_tIS1_Lj38EE9hb_face_tLj38ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT18sbix_accelerator_tE21hb_face_lazy_loader_tIS1_Lj38EE9hb_face_tLj38ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT18sbix_accelerator_tE21hb_face_lazy_loader_tIS1_Lj38EE9hb_face_tLj38ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT17SVG_accelerator_tE21hb_face_lazy_loader_tIS1_Lj39EE9hb_face_tLj39ES1_E4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT17SVG_accelerator_tE21hb_face_lazy_loader_tIS1_Lj39EE9hb_face_tLj39ES1_E10do_destroyEPS1_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT17SVG_accelerator_tE21hb_face_lazy_loader_tIS1_Lj39EE9hb_face_tLj39ES1_E4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZN16hb_lazy_loader_tIN2OT4MATHE22hb_table_lazy_loader_tIS1_Lj40ELb1EE9hb_face_tLj40E9hb_blob_tE4finiEv:
  188|     11|  void fini ()  { do_destroy (instance.get_acquire ()); init (); }
_ZN16hb_lazy_loader_tIN2OT4MATHE22hb_table_lazy_loader_tIS1_Lj40ELb1EE9hb_face_tLj40E9hb_blob_tE10do_destroyEPS5_:
  200|     11|  {
  201|     11|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 0, False: 11]
  |  Branch (201:14): [True: 0, False: 0]
  ------------------
  202|      0|      Funcs::destroy (p);
  203|     11|  }
_ZN16hb_lazy_loader_tIN2OT4MATHE22hb_table_lazy_loader_tIS1_Lj40ELb1EE9hb_face_tLj40E9hb_blob_tE4initEv:
  187|     11|  void init ()  { instance.set_relaxed (nullptr); }
_ZNK2OT4maxp8get_sizeEv:
  104|     11|  unsigned int get_size () const { return (size); } \
_ZNK16hb_lazy_loader_tIN2OT4maxpE22hb_table_lazy_loader_tIS1_Lj2ELb1EE9hb_face_tLj2E9hb_blob_tEptEv:
  205|     11|  const Returned * operator -> () const { return get (); }
_ZNK16hb_lazy_loader_tIN2OT4maxpE22hb_table_lazy_loader_tIS1_Lj2ELb1EE9hb_face_tLj2E9hb_blob_tE3getEv:
  245|     11|  const Returned * get () const { return Funcs::convert (get_stored ()); }
_ZN22hb_table_lazy_loader_tIN2OT4maxpELj2ELb1EE7convertEPK9hb_blob_t:
  309|     11|  { return blob->as<T> (); }
_ZNK16hb_lazy_loader_tIN2OT4maxpE22hb_table_lazy_loader_tIS1_Lj2ELb1EE9hb_face_tLj2E9hb_blob_tE10get_storedEv:
  213|     11|  {
  214|     11|  retry:
  215|     11|    Stored *p = this->instance.get_acquire ();
  216|     11|    if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|     11|    return p;
  232|     11|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj2EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj2EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj2EE11call_createI9hb_blob_t22hb_table_lazy_loader_tIN2OT4maxpELj2ELb1EEEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZN22hb_table_lazy_loader_tIN2OT4maxpELj2ELb1EE6createEP9hb_face_t:
  297|     11|  {
  298|     11|    hb_sanitize_context_t c;
  299|     11|    if (core)
  ------------------
  |  Branch (299:9): [Folded - Ignored]
  ------------------
  300|     11|      c.set_num_glyphs (0); // So we don't recurse ad infinitum, or doesn't need num_glyphs
  301|     11|    return c.reference_table<T> (face);
  302|     11|  }
_ZNK16hb_lazy_loader_tIN2OT4maxpE22hb_table_lazy_loader_tIS1_Lj2ELb1EE9hb_face_tLj2E9hb_blob_tE7cmpexchEPS5_S7_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj1EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj1EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_EptEv:
  205|   409k|  const Returned * operator -> () const { return get (); }
_ZNK16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E3getEv:
  245|  1.02M|  const Returned * get () const { return Funcs::convert (get_stored ()); }
_ZN16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E7convertEPS1_:
  250|  1.02M|  static Returned* convert (Stored *p) { return p; }
_ZNK16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E10get_storedEv:
  213|  1.02M|  {
  214|  1.02M|  retry:
  215|  1.02M|    Stored *p = this->instance.get_acquire ();
  216|  1.02M|    if (unlikely (!p))
  ------------------
  |  |  260|  1.02M|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 1.02M]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|  1.02M|    return p;
  232|  1.02M|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj24EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj24EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj24EE11call_createIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS4_Lj24EEEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZN16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E6createEPS4_:
  255|     11|  {
  256|     11|    Stored *p = (Stored *) hb_calloc (1, sizeof (Stored));
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
  257|     11|    if (likely (p))
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  258|     11|      p = new (p) Stored (data);
  259|     11|    return p;
  260|     11|  }
_ZNK16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_E7cmpexchEPS1_S6_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
_ZNK16hb_lazy_loader_tIN2OT18GDEF_accelerator_tE21hb_face_lazy_loader_tIS1_Lj24EE9hb_face_tLj24ES1_EdeIS1_LPv0EEERKT_v:
  207|   614k|  const U & operator * () const  { return *get (); }
_ZN16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E7convertEPS1_:
  250|   409k|  static Returned* convert (Stored *p) { return p; }
_ZN16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E7convertEPS1_:
  250|   409k|  static Returned* convert (Stored *p) { return p; }
_ZNK16hb_lazy_loader_tI15hb_font_funcs_t30hb_ot_font_funcs_lazy_loader_tvLj0ES0_E11get_unconstEv:
  247|     11|  Returned * get_unconst () const { return const_cast<Returned *> (Funcs::convert (get_stored ())); }
_ZN16hb_lazy_loader_tI15hb_font_funcs_t30hb_ot_font_funcs_lazy_loader_tvLj0ES0_E7convertEPS0_:
  250|     11|  static Returned* convert (Stored *p) { return p; }
_ZNK16hb_lazy_loader_tI15hb_font_funcs_t30hb_ot_font_funcs_lazy_loader_tvLj0ES0_E10get_storedEv:
  213|     11|  {
  214|     11|  retry:
  215|     11|    Stored *p = this->instance.get_acquire ();
  216|     11|    if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 1, False: 10]
  |  |  ------------------
  ------------------
  217|      1|    {
  218|      1|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|      1|      p = this->template call_create<Stored, Funcs> ();
  222|      1|      if (unlikely (!p))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|      1|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|      1|    }
  231|     11|    return p;
  232|     11|  }
_ZN27hb_font_funcs_lazy_loader_tI30hb_ot_font_funcs_lazy_loader_tE8get_nullEv:
  321|      1|    { return hb_##Type##_funcs_get_empty (); } \
_ZNK17hb_data_wrapper_tIvLj0EE11call_createI15hb_font_funcs_t30hb_ot_font_funcs_lazy_loader_tEEPT_v:
  166|      1|  Stored * call_create () const { return Funcs::create (); }
hb-ot-font.cc:_ZL11StructAfterIN2OT10maxpV1TailENS0_4maxpEERKT_RKT0_:
   72|     11|{ return StructAtOffset<Type>(&X, X.get_size()); }
hb-ot-font.cc:_ZL14StructAtOffsetIN2OT10maxpV1TailEERKT_PKvj:
   47|     11|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
_ZN16hb_lazy_loader_tI15hb_font_funcs_t30hb_ot_font_funcs_lazy_loader_tvLj0ES0_E13free_instanceEv:
  191|      1|  {
  192|      1|  retry:
  193|      1|    Stored *p = instance.get_acquire ();
  194|      1|    if (unlikely (p && !cmpexch (p, nullptr)))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  |  Branch (260:47): [True: 1, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  195|      0|      goto retry;
  196|      1|    do_destroy (p);
  197|      1|  }
_ZNK16hb_lazy_loader_tI15hb_font_funcs_t30hb_ot_font_funcs_lazy_loader_tvLj0ES0_E7cmpexchEPS0_S3_:
  239|      2|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|      2|    return this->instance.cmpexch (current, value);
  243|      2|  }
_ZN16hb_lazy_loader_tI15hb_font_funcs_t30hb_ot_font_funcs_lazy_loader_tvLj0ES0_E10do_destroyEPS0_:
  200|      1|  {
  201|      1|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 1, False: 0]
  |  Branch (201:14): [True: 1, False: 0]
  ------------------
  202|      1|      Funcs::destroy (p);
  203|      1|  }
_ZN27hb_font_funcs_lazy_loader_tI30hb_ot_font_funcs_lazy_loader_tE7destroyEP15hb_font_funcs_t:
  319|      1|    { hb_##Type##_funcs_destroy (p); } \
_ZNK16hb_lazy_loader_tI17hb_ot_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj1ES0_ES2_Lj1ES0_EcvbEv:
  209|   204k|  { return get_stored () != Funcs::get_null (); }
_ZNK16hb_lazy_loader_tI17hb_ot_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj1ES0_ES2_Lj1ES0_E10get_storedEv:
  213|   204k|  {
  214|   204k|  retry:
  215|   204k|    Stored *p = this->instance.get_acquire ();
  216|   204k|    if (unlikely (!p))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 204k]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|   204k|    return p;
  232|   204k|  }
_ZNK17hb_data_wrapper_tI9hb_font_tLj1EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_font_tLj1EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_font_tLj1EE11call_createI17hb_ot_font_data_t23hb_shaper_lazy_loader_tIS0_Lj1ES3_EEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZNK16hb_lazy_loader_tI17hb_ot_font_data_t23hb_shaper_lazy_loader_tI9hb_font_tLj1ES0_ES2_Lj1ES0_E7cmpexchEPS0_S5_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
_ZNK16hb_lazy_loader_tI17hb_ot_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj1ES0_ES2_Lj1ES0_EcvbEv:
  209|   204k|  { return get_stored () != Funcs::get_null (); }
_ZNK16hb_lazy_loader_tI17hb_ot_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj1ES0_ES2_Lj1ES0_E10get_storedEv:
  213|   204k|  {
  214|   204k|  retry:
  215|   204k|    Stored *p = this->instance.get_acquire ();
  216|   204k|    if (unlikely (!p))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 204k]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|   204k|    return p;
  232|   204k|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj1EE11call_createI17hb_ot_face_data_t23hb_shaper_lazy_loader_tIS0_Lj1ES3_EEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZNK16hb_lazy_loader_tI17hb_ot_face_data_t23hb_shaper_lazy_loader_tI9hb_face_tLj1ES0_ES2_Lj1ES0_E7cmpexchEPS0_S5_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
_ZNK16hb_lazy_loader_tI17hb_shaper_entry_t24hb_shapers_lazy_loader_tvLj0ES0_E11get_unconstEv:
  247|   204k|  Returned * get_unconst () const { return const_cast<Returned *> (Funcs::convert (get_stored ())); }
_ZN16hb_lazy_loader_tI17hb_shaper_entry_t24hb_shapers_lazy_loader_tvLj0ES0_E7convertEPS0_:
  250|   204k|  static Returned* convert (Stored *p) { return p; }
_ZNK16hb_lazy_loader_tI17hb_shaper_entry_t24hb_shapers_lazy_loader_tvLj0ES0_E10get_storedEv:
  213|   204k|  {
  214|   204k|  retry:
  215|   204k|    Stored *p = this->instance.get_acquire ();
  216|   204k|    if (unlikely (!p))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 1, False: 204k]
  |  |  ------------------
  ------------------
  217|      1|    {
  218|      1|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|      1|      p = this->template call_create<Stored, Funcs> ();
  222|      1|      if (unlikely (!p))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  223|      1|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|      1|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|      1|    }
  231|   204k|    return p;
  232|   204k|  }
_ZNK17hb_data_wrapper_tIvLj0EE11call_createI17hb_shaper_entry_t24hb_shapers_lazy_loader_tEEPT_v:
  166|      1|  Stored * call_create () const { return Funcs::create (); }
_ZNK16hb_lazy_loader_tI17hb_shaper_entry_t24hb_shapers_lazy_loader_tvLj0ES0_E7cmpexchEPS0_S3_:
  239|      1|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|      1|    return this->instance.cmpexch (current, value);
  243|      1|  }
hb-aat-layout.cc:_ZL14StructAtOffsetIN2OT8ClassDefEERKT_PKvj:
   47|      1|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-aat-layout.cc:_ZL14StructAtOffsetIN2OT6Layout6Common8CoverageEERKT_PKvj:
   47|      1|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-aat-layout.cc:_ZL14StructAtOffsetIN2OT12LigCaretListEERKT_PKvj:
   47|      1|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-aat-layout.cc:_ZL23StructAtOffsetUnalignedIN2OT11HBGlyphID16EERKT_PKvj:
   53|     12|{
   54|     12|#pragma GCC diagnostic push
   55|     12|#pragma GCC diagnostic ignored "-Wcast-align"
   56|     12|  return * reinterpret_cast<const Type*> ((const char *) P + offset);
   57|     12|#pragma GCC diagnostic pop
   58|     12|}
_ZNK16hb_lazy_loader_tIN3AAT4morxE22hb_table_lazy_loader_tIS1_Lj28ELb0EE9hb_face_tLj28E9hb_blob_tE3getEv:
  245|     13|  const Returned * get () const { return Funcs::convert (get_stored ()); }
_ZN22hb_table_lazy_loader_tIN3AAT4morxELj28ELb0EE7convertEPK9hb_blob_t:
  309|     13|  { return blob->as<T> (); }
_ZNK16hb_lazy_loader_tIN3AAT4morxE22hb_table_lazy_loader_tIS1_Lj28ELb0EE9hb_face_tLj28E9hb_blob_tE10get_storedEv:
  213|     13|  {
  214|     13|  retry:
  215|     13|    Stored *p = this->instance.get_acquire ();
  216|     13|    if (unlikely (!p))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 2]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|     13|    return p;
  232|     13|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj28EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj28EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj28EE11call_createI9hb_blob_t22hb_table_lazy_loader_tIN3AAT4morxELj28ELb0EEEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZN22hb_table_lazy_loader_tIN3AAT4morxELj28ELb0EE6createEP9hb_face_t:
  297|     11|  {
  298|     11|    hb_sanitize_context_t c;
  299|     11|    if (core)
  ------------------
  |  Branch (299:9): [Folded - Ignored]
  ------------------
  300|      0|      c.set_num_glyphs (0); // So we don't recurse ad infinitum, or doesn't need num_glyphs
  301|     11|    return c.reference_table<T> (face);
  302|     11|  }
_ZNK16hb_lazy_loader_tIN3AAT4morxE22hb_table_lazy_loader_tIS1_Lj28ELb0EE9hb_face_tLj28E9hb_blob_tE7cmpexchEPS5_S7_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
_ZNK16hb_lazy_loader_tIN3AAT4mortE22hb_table_lazy_loader_tIS1_Lj29ELb0EE9hb_face_tLj29E9hb_blob_tE3getEv:
  245|     13|  const Returned * get () const { return Funcs::convert (get_stored ()); }
_ZN22hb_table_lazy_loader_tIN3AAT4mortELj29ELb0EE7convertEPK9hb_blob_t:
  309|     13|  { return blob->as<T> (); }
_ZNK16hb_lazy_loader_tIN3AAT4mortE22hb_table_lazy_loader_tIS1_Lj29ELb0EE9hb_face_tLj29E9hb_blob_tE10get_storedEv:
  213|     13|  {
  214|     13|  retry:
  215|     13|    Stored *p = this->instance.get_acquire ();
  216|     13|    if (unlikely (!p))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 2]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|     13|    return p;
  232|     13|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj29EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj29EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj29EE11call_createI9hb_blob_t22hb_table_lazy_loader_tIN3AAT4mortELj29ELb0EEEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZN22hb_table_lazy_loader_tIN3AAT4mortELj29ELb0EE6createEP9hb_face_t:
  297|     11|  {
  298|     11|    hb_sanitize_context_t c;
  299|     11|    if (core)
  ------------------
  |  Branch (299:9): [Folded - Ignored]
  ------------------
  300|      0|      c.set_num_glyphs (0); // So we don't recurse ad infinitum, or doesn't need num_glyphs
  301|     11|    return c.reference_table<T> (face);
  302|     11|  }
_ZNK16hb_lazy_loader_tIN3AAT4mortE22hb_table_lazy_loader_tIS1_Lj29ELb0EE9hb_face_tLj29E9hb_blob_tE7cmpexchEPS5_S7_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
_ZNK16hb_lazy_loader_tIN3AAT4morxE22hb_table_lazy_loader_tIS1_Lj28ELb0EE9hb_face_tLj28E9hb_blob_tEptEv:
  205|     13|  const Returned * operator -> () const { return get (); }
_ZNK16hb_lazy_loader_tIN3AAT4mortE22hb_table_lazy_loader_tIS1_Lj29ELb0EE9hb_face_tLj29E9hb_blob_tEptEv:
  205|     13|  const Returned * operator -> () const { return get (); }
hb-aat-layout.cc:_ZL14StructAtOffsetIKN2OT8ClassDefEERKT_PKvj:
   47|      1|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
_ZNK16hb_lazy_loader_tIN3AAT4kerxE22hb_table_lazy_loader_tIS1_Lj30ELb0EE9hb_face_tLj30E9hb_blob_tEptEv:
  205|     13|  const Returned * operator -> () const { return get (); }
_ZNK16hb_lazy_loader_tIN3AAT4kerxE22hb_table_lazy_loader_tIS1_Lj30ELb0EE9hb_face_tLj30E9hb_blob_tE3getEv:
  245|     13|  const Returned * get () const { return Funcs::convert (get_stored ()); }
_ZN22hb_table_lazy_loader_tIN3AAT4kerxELj30ELb0EE7convertEPK9hb_blob_t:
  309|     13|  { return blob->as<T> (); }
_ZNK16hb_lazy_loader_tIN3AAT4kerxE22hb_table_lazy_loader_tIS1_Lj30ELb0EE9hb_face_tLj30E9hb_blob_tE10get_storedEv:
  213|     13|  {
  214|     13|  retry:
  215|     13|    Stored *p = this->instance.get_acquire ();
  216|     13|    if (unlikely (!p))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 2]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|     13|    return p;
  232|     13|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj30EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj30EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj30EE11call_createI9hb_blob_t22hb_table_lazy_loader_tIN3AAT4kerxELj30ELb0EEEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZN22hb_table_lazy_loader_tIN3AAT4kerxELj30ELb0EE6createEP9hb_face_t:
  297|     11|  {
  298|     11|    hb_sanitize_context_t c;
  299|     11|    if (core)
  ------------------
  |  Branch (299:9): [Folded - Ignored]
  ------------------
  300|      0|      c.set_num_glyphs (0); // So we don't recurse ad infinitum, or doesn't need num_glyphs
  301|     11|    return c.reference_table<T> (face);
  302|     11|  }
_ZNK16hb_lazy_loader_tIN3AAT4kerxE22hb_table_lazy_loader_tIS1_Lj30ELb0EE9hb_face_tLj30E9hb_blob_tE7cmpexchEPS5_S7_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
hb-aat-layout.cc:_ZL23StructAtOffsetUnalignedIjERKT_PKvj:
   53|  17.5M|{
   54|  17.5M|#pragma GCC diagnostic push
   55|  17.5M|#pragma GCC diagnostic ignored "-Wcast-align"
   56|  17.5M|  return * reinterpret_cast<const Type*> ((const char *) P + offset);
   57|  17.5M|#pragma GCC diagnostic pop
   58|  17.5M|}
_ZNK16hb_lazy_loader_tIN3AAT4trakE22hb_table_lazy_loader_tIS1_Lj32ELb0EE9hb_face_tLj32E9hb_blob_tEptEv:
  205|     13|  const Returned * operator -> () const { return get (); }
_ZNK16hb_lazy_loader_tIN3AAT4trakE22hb_table_lazy_loader_tIS1_Lj32ELb0EE9hb_face_tLj32E9hb_blob_tE3getEv:
  245|     13|  const Returned * get () const { return Funcs::convert (get_stored ()); }
_ZN22hb_table_lazy_loader_tIN3AAT4trakELj32ELb0EE7convertEPK9hb_blob_t:
  309|     13|  { return blob->as<T> (); }
_ZNK16hb_lazy_loader_tIN3AAT4trakE22hb_table_lazy_loader_tIS1_Lj32ELb0EE9hb_face_tLj32E9hb_blob_tE10get_storedEv:
  213|     13|  {
  214|     13|  retry:
  215|     13|    Stored *p = this->instance.get_acquire ();
  216|     13|    if (unlikely (!p))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 2]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|     13|    return p;
  232|     13|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj32EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj32EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj32EE11call_createI9hb_blob_t22hb_table_lazy_loader_tIN3AAT4trakELj32ELb0EEEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZN22hb_table_lazy_loader_tIN3AAT4trakELj32ELb0EE6createEP9hb_face_t:
  297|     11|  {
  298|     11|    hb_sanitize_context_t c;
  299|     11|    if (core)
  ------------------
  |  Branch (299:9): [Folded - Ignored]
  ------------------
  300|      0|      c.set_num_glyphs (0); // So we don't recurse ad infinitum, or doesn't need num_glyphs
  301|     11|    return c.reference_table<T> (face);
  302|     11|  }
_ZNK16hb_lazy_loader_tIN3AAT4trakE22hb_table_lazy_loader_tIS1_Lj32ELb0EE9hb_face_tLj32E9hb_blob_tE7cmpexchEPS5_S7_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
hb-ot-layout.cc:_ZL11StructAfterIN2OT12KernSubTableINS0_20KernOTSubTableHeaderEEES3_ERKT_RKT0_:
   72|     44|{ return StructAtOffset<Type>(&X, X.get_size()); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT12KernSubTableINS0_20KernOTSubTableHeaderEEEERKT_PKvj:
   47|     44|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT8ClassDefEERKT_PKvj:
   47|      5|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout6Common8CoverageEERKT_PKvj:
   47|     51|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT6Layout6Common8CoverageEERKT_PKvj:
   47|      9|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT8ClassDefEERKT_PKvj:
   47|      1|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT18RecordListOfScriptEERKT_PKvj:
   47|    176|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT12RecordListOfINS0_7FeatureEEEERKT_PKvj:
   47|     42|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT6ScriptEERKT_PKvj:
   47|      6|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT7LangSysEERKT_PKvj:
   47|      4|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT16List16OfOffsetToINS0_6LookupENS0_7IntTypeItLj2EEEEEERKT_PKvj:
   47|     61|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT7FeatureEERKT_PKvj:
   47|      4|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT6LookupEERKT_PKvj:
   47|      5|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT6Layout9GSUB_impl19SubstLookupSubTableEERKT_PKvj:
   47|      2|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL11StructAfterIN2OT15HeadlessArrayOfINS0_7IntTypeItLj2EEES3_EENS0_7ArrayOfIS3_S3_EEERKT_RKT0_:
   72|      6|{ return StructAtOffset<Type>(&X, X.get_size()); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT15HeadlessArrayOfINS0_7IntTypeItLj2EEES3_EEERKT_PKvj:
   47|      6|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL11StructAfterIN2OT7ArrayOfINS0_7IntTypeItLj2EEES3_EENS0_15HeadlessArrayOfIS3_S3_EEERKT_RKT0_:
   72|      6|{ return StructAtOffset<Type>(&X, X.get_size()); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT7ArrayOfINS0_7IntTypeItLj2EEES3_EEERKT_PKvj:
   47|      6|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL11StructAfterIN2OT7ArrayOfINS0_12LookupRecordENS0_7IntTypeItLj2EEEEENS1_IS4_S4_EEERKT_RKT0_:
   72|      6|{ return StructAtOffset<Type>(&X, X.get_size()); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT7ArrayOfINS0_12LookupRecordENS0_7IntTypeItLj2EEEEEERKT_PKvj:
   47|      6|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIKN2OT6Layout9GPOS_impl17PosLookupSubTableEERKT_PKvj:
   47|      6|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
_ZNK16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_EdeIS1_LPv0EEERKT_v:
  207|   204k|  const U & operator * () const  { return *get (); }
_ZNK16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E3getEv:
  245|   409k|  const Returned * get () const { return Funcs::convert (get_stored ()); }
_ZNK16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E10get_storedEv:
  213|   409k|  {
  214|   409k|  retry:
  215|   409k|    Stored *p = this->instance.get_acquire ();
  216|   409k|    if (unlikely (!p))
  ------------------
  |  |  260|   409k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 409k]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|   409k|    return p;
  232|   409k|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj25EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj25EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj25EE11call_createIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS4_Lj25EEEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZN16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E6createEPS4_:
  255|     11|  {
  256|     11|    Stored *p = (Stored *) hb_calloc (1, sizeof (Stored));
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
  257|     11|    if (likely (p))
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  258|     11|      p = new (p) Stored (data);
  259|     11|    return p;
  260|     11|  }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT7LangSysEERKT_PKvj:
   47|     39|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6ScriptEERKT_PKvj:
   47|     28|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT18RecordListOfScriptEERKT_PKvj:
   47|     22|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT7FeatureEERKT_PKvj:
   47|     39|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT12RecordListOfINS0_7FeatureEEEERKT_PKvj:
   47|     22|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GSUB_impl12AlternateSetINS1_10SmallTypesEEEERKT_PKvj:
   47|  13.9k|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GSUB_impl8LigatureINS1_10SmallTypesEEEERKT_PKvj:
   47|      9|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GSUB_impl11LigatureSetINS1_10SmallTypesEEEERKT_PKvj:
   47|      3|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT9ChainRuleINS0_6Layout10SmallTypesEEEERKT_PKvj:
   47|      6|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT12ChainRuleSetINS0_6Layout10SmallTypesEEEERKT_PKvj:
   47|      2|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GSUB_impl19SubstLookupSubTableEERKT_PKvj:
   47|     38|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GSUB_impl11SubstLookupEERKT_PKvj:
   47|     38|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT16List16OfOffsetToINS0_6Layout9GSUB_impl11SubstLookupENS0_7IntTypeItLj2EEEEEERKT_PKvj:
   47|     11|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
_ZNK16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_E7cmpexchEPS1_S6_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
_ZNK16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_EdeIS1_LPv0EEERKT_v:
  207|   204k|  const U & operator * () const  { return *get (); }
_ZNK16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E3getEv:
  245|   409k|  const Returned * get () const { return Funcs::convert (get_stored ()); }
_ZNK16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E10get_storedEv:
  213|   409k|  {
  214|   409k|  retry:
  215|   409k|    Stored *p = this->instance.get_acquire ();
  216|   409k|    if (unlikely (!p))
  ------------------
  |  |  260|   409k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 409k]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|   409k|    return p;
  232|   409k|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj26EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj26EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj26EE11call_createIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS4_Lj26EEEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZN16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E6createEPS4_:
  255|     11|  {
  256|     11|    Stored *p = (Stored *) hb_calloc (1, sizeof (Stored));
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
  257|     11|    if (likely (p))
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  258|     11|      p = new (p) Stored (data);
  259|     11|    return p;
  260|     11|  }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GPOS_impl6AnchorEERKT_PKvj:
   47|     96|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GPOS_impl9MarkArrayEERKT_PKvj:
   47|      6|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GPOS_impl12AnchorMatrixEERKT_PKvj:
   47|      6|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GPOS_impl13LigatureArrayEERKT_PKvj:
   47|      1|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GPOS_impl17PosLookupSubTableEERKT_PKvj:
   47|      7|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT6Layout9GPOS_impl9PosLookupEERKT_PKvj:
   47|      4|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
hb-ot-layout.cc:_ZL14StructAtOffsetIN2OT16List16OfOffsetToINS0_6Layout9GPOS_impl9PosLookupENS0_7IntTypeItLj2EEEEEERKT_PKvj:
   47|     11|{ return * reinterpret_cast<const Type*> ((const char *) P + offset); }
_ZNK16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_E7cmpexchEPS1_S6_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
_ZNK16hb_lazy_loader_tIN2OT4kernE22hb_table_lazy_loader_tIS1_Lj23ELb1EE9hb_face_tLj23E9hb_blob_tEptEv:
  205|     14|  const Returned * operator -> () const { return get (); }
_ZNK16hb_lazy_loader_tIN2OT4kernE22hb_table_lazy_loader_tIS1_Lj23ELb1EE9hb_face_tLj23E9hb_blob_tE3getEv:
  245|     14|  const Returned * get () const { return Funcs::convert (get_stored ()); }
_ZN22hb_table_lazy_loader_tIN2OT4kernELj23ELb1EE7convertEPK9hb_blob_t:
  309|     14|  { return blob->as<T> (); }
_ZNK16hb_lazy_loader_tIN2OT4kernE22hb_table_lazy_loader_tIS1_Lj23ELb1EE9hb_face_tLj23E9hb_blob_tE10get_storedEv:
  213|     23|  {
  214|     23|  retry:
  215|     23|    Stored *p = this->instance.get_acquire ();
  216|     23|    if (unlikely (!p))
  ------------------
  |  |  260|     23|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 12]
  |  |  ------------------
  ------------------
  217|     11|    {
  218|     11|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|     11|      p = this->template call_create<Stored, Funcs> ();
  222|     11|      if (unlikely (!p))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|     11|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|     11|    }
  231|     23|    return p;
  232|     23|  }
_ZNK17hb_data_wrapper_tI9hb_face_tLj23EE8is_inertEv:
  155|     11|  bool is_inert () const { return !get_data (); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj23EE8get_dataEv:
  153|     22|  { return *(((Data **) (void *) this) - WheresData); }
_ZNK17hb_data_wrapper_tI9hb_face_tLj23EE11call_createI9hb_blob_t22hb_table_lazy_loader_tIN2OT4kernELj23ELb1EEEEPT_v:
  158|     11|  Stored * call_create () const { return Subclass::create (get_data ()); }
_ZN22hb_table_lazy_loader_tIN2OT4kernELj23ELb1EE6createEP9hb_face_t:
  297|     11|  {
  298|     11|    hb_sanitize_context_t c;
  299|     11|    if (core)
  ------------------
  |  Branch (299:9): [Folded - Ignored]
  ------------------
  300|     11|      c.set_num_glyphs (0); // So we don't recurse ad infinitum, or doesn't need num_glyphs
  301|     11|    return c.reference_table<T> (face);
  302|     11|  }
_ZNK16hb_lazy_loader_tIN2OT4kernE22hb_table_lazy_loader_tIS1_Lj23ELb1EE9hb_face_tLj23E9hb_blob_tE7cmpexchEPS5_S7_:
  239|     11|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|     11|    return this->instance.cmpexch (current, value);
  243|     11|  }
_ZNK22hb_table_lazy_loader_tIN2OT4kernELj23ELb1EE8get_blobEv:
  311|      9|  hb_blob_t* get_blob () const { return this->get_stored (); }
_ZNK16hb_lazy_loader_tIN2OT18GSUB_accelerator_tE21hb_face_lazy_loader_tIS1_Lj25EE9hb_face_tLj25ES1_EptEv:
  205|   204k|  const Returned * operator -> () const { return get (); }
_ZNK16hb_lazy_loader_tIN2OT18GPOS_accelerator_tE21hb_face_lazy_loader_tIS1_Lj26EE9hb_face_tLj26ES1_EptEv:
  205|   204k|  const Returned * operator -> () const { return get (); }
_ZNK16hb_lazy_loader_tI18hb_unicode_funcs_t34hb_ucd_unicode_funcs_lazy_loader_tvLj0ES0_E11get_unconstEv:
  247|   614k|  Returned * get_unconst () const { return const_cast<Returned *> (Funcs::convert (get_stored ())); }
_ZN16hb_lazy_loader_tI18hb_unicode_funcs_t34hb_ucd_unicode_funcs_lazy_loader_tvLj0ES0_E7convertEPS0_:
  250|   614k|  static Returned* convert (Stored *p) { return p; }
_ZNK16hb_lazy_loader_tI18hb_unicode_funcs_t34hb_ucd_unicode_funcs_lazy_loader_tvLj0ES0_E10get_storedEv:
  213|   614k|  {
  214|   614k|  retry:
  215|   614k|    Stored *p = this->instance.get_acquire ();
  216|   614k|    if (unlikely (!p))
  ------------------
  |  |  260|   614k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 1, False: 614k]
  |  |  ------------------
  ------------------
  217|      1|    {
  218|      1|      if (unlikely (this->is_inert ()))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  219|      0|	return const_cast<Stored *> (Funcs::get_null ());
  220|       |
  221|      1|      p = this->template call_create<Stored, Funcs> ();
  222|      1|      if (unlikely (!p))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  223|      0|	p = const_cast<Stored *> (Funcs::get_null ());
  224|       |
  225|      1|      if (unlikely (!cmpexch (nullptr, p)))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  226|      0|      {
  227|      0|	do_destroy (p);
  228|      0|	goto retry;
  229|      0|      }
  230|      1|    }
  231|   614k|    return p;
  232|   614k|  }
_ZN30hb_unicode_funcs_lazy_loader_tI34hb_ucd_unicode_funcs_lazy_loader_tE8get_nullEv:
  321|      1|    { return hb_##Type##_funcs_get_empty (); } \
_ZNK17hb_data_wrapper_tIvLj0EE11call_createI18hb_unicode_funcs_t34hb_ucd_unicode_funcs_lazy_loader_tEEPT_v:
  166|      1|  Stored * call_create () const { return Funcs::create (); }
_ZN16hb_lazy_loader_tI18hb_unicode_funcs_t34hb_ucd_unicode_funcs_lazy_loader_tvLj0ES0_E13free_instanceEv:
  191|      1|  {
  192|      1|  retry:
  193|      1|    Stored *p = instance.get_acquire ();
  194|      1|    if (unlikely (p && !cmpexch (p, nullptr)))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  |  Branch (260:47): [True: 1, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  195|      0|      goto retry;
  196|      1|    do_destroy (p);
  197|      1|  }
_ZNK16hb_lazy_loader_tI18hb_unicode_funcs_t34hb_ucd_unicode_funcs_lazy_loader_tvLj0ES0_E7cmpexchEPS0_S3_:
  239|      2|  {
  240|       |    /* This function can only be safely called directly if no
  241|       |     * other thread is accessing. */
  242|      2|    return this->instance.cmpexch (current, value);
  243|      2|  }
_ZN16hb_lazy_loader_tI18hb_unicode_funcs_t34hb_ucd_unicode_funcs_lazy_loader_tvLj0ES0_E10do_destroyEPS0_:
  200|      1|  {
  201|      1|    if (p && p != const_cast<Stored *> (Funcs::get_null ()))
  ------------------
  |  Branch (201:9): [True: 1, False: 0]
  |  Branch (201:14): [True: 1, False: 0]
  ------------------
  202|      1|      Funcs::destroy (p);
  203|      1|  }
_ZN30hb_unicode_funcs_lazy_loader_tI34hb_ucd_unicode_funcs_lazy_loader_tE7destroyEP18hb_unicode_funcs_t:
  319|      1|    { hb_##Type##_funcs_destroy (p); } \

_ZN8hb_map_tC2Ev:
  534|     26|  hb_map_t () : hashmap () {}
_ZN12hb_hashmap_tIjjLb1EE4initEv:
  139|     26|  {
  140|     26|    hb_object_init (this);
  141|       |
  142|     26|    successful = true;
  143|     26|    population = occupancy = 0;
  144|     26|    mask = 0;
  145|     26|    prime = 0;
  146|     26|    max_chain_length = 0;
  147|     26|    items = nullptr;
  148|     26|  }
_ZN12hb_hashmap_tIjjLb1EE4finiEv:
  150|     26|  {
  151|     26|    hb_object_fini (this);
  152|       |
  153|     26|    if (likely (items))
  ------------------
  |  |  259|     26|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 26, False: 0]
  |  |  ------------------
  ------------------
  154|     26|    {
  155|     26|      unsigned size = mask + 1;
  156|     26|      if (!item_t::is_trivial)
  ------------------
  |  Branch (156:11): [Folded - Ignored]
  ------------------
  157|      0|	for (unsigned i = 0; i < size; i++)
  ------------------
  |  Branch (157:23): [True: 0, False: 0]
  ------------------
  158|      0|	  items[i].~item_t ();
  159|     26|      hb_free (items);
  ------------------
  |  |  237|     26|#define hb_free hb_free_impl
  ------------------
  160|     26|      items = nullptr;
  161|     26|    }
  162|     26|    population = occupancy = 0;
  163|     26|  }
_ZNK12hb_hashmap_tIjjLb1EE6item_t7is_usedEv:
   85|    679|    bool is_used () const { return is_used_; }
_ZNK12hb_hashmap_tIjjLb1EE6item_teqERKj:
  101|     17|    bool operator == (const K &o) const { return hb_deref (key) == hb_deref (o); }
_ZNK12hb_hashmap_tIjjLb1EE6item_t7is_realEv:
   88|      4|    bool is_real () const { return is_real_; }
_ZN12hb_hashmap_tIjjLb1EE6item_t8set_usedEb:
   86|      8|    void set_used (bool is_used) { is_used_ = is_used; }
_ZN12hb_hashmap_tIjjLb1EE6item_t8set_realEb:
   87|      8|    void set_real (bool is_real) { is_real_ = is_real; }
_ZNK12hb_hashmap_tIjjLb1EE3hasIjEEbRKjPPT_:
  314|    650|  {
  315|    650|    if (!items) return false;
  ------------------
  |  Branch (315:9): [True: 0, False: 650]
  ------------------
  316|    650|    auto *item = fetch_item (key, hb_hash (key));
  317|    650|    if (item)
  ------------------
  |  Branch (317:9): [True: 4, False: 646]
  ------------------
  318|      4|    {
  319|      4|      if (vp) *vp = std::addressof (item->value);
  ------------------
  |  Branch (319:11): [True: 4, False: 0]
  ------------------
  320|      4|      return true;
  321|      4|    }
  322|    646|    return false;
  323|    650|  }
_ZNK12hb_hashmap_tIjjLb1EE10fetch_itemERKjj:
  325|    650|  {
  326|    650|    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
  327|    650|    unsigned int i = hash % prime;
  328|    650|    unsigned step = 0;
  329|    663|    while (items[i].is_used ())
  ------------------
  |  Branch (329:12): [True: 17, False: 646]
  ------------------
  330|     17|    {
  331|     17|      if ((std::is_integral<K>::value || items[i].hash == hash) &&
  ------------------
  |  Branch (331:12): [Folded - Ignored]
  |  Branch (331:42): [True: 0, False: 0]
  ------------------
  332|     17|	  items[i] == key)
  ------------------
  |  Branch (332:4): [True: 4, False: 13]
  ------------------
  333|      4|      {
  334|      4|	if (items[i].is_real ())
  ------------------
  |  Branch (334:6): [True: 4, False: 0]
  ------------------
  335|      4|	  return &items[i];
  336|      0|	else
  337|      0|	  return nullptr;
  338|      4|      }
  339|     13|      i = (i + ++step) & mask;
  340|     13|    }
  341|    646|    return nullptr;
  342|    650|  }
_ZN12hb_hashmap_tIjjLb1EE3setIRjEEbRKjOT_b:
  272|      8|  bool set (const K &key, VV&& value, bool overwrite = true) { return set_with_hash (key, hb_hash (key), std::forward<VV> (value), overwrite); }
_ZN12hb_hashmap_tIjjLb1EE13set_with_hashIRKjRjEEbOT_jOT0_b:
  223|      8|  {
  224|      8|    if (unlikely (!successful)) return false;
  ------------------
  |  |  260|      8|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  225|      8|    if (unlikely ((occupancy + occupancy / 2) >= mask && !alloc ())) return false;
  ------------------
  |  |  260|      8|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 8]
  |  |  |  Branch (260:47): [True: 0, False: 8]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  226|       |
  227|      8|    hash &= 0x3FFFFFFF; // We only store lower 30bit of hash
  228|      8|    unsigned int tombstone = (unsigned int) -1;
  229|      8|    unsigned int i = hash % prime;
  230|      8|    unsigned length = 0;
  231|      8|    unsigned step = 0;
  232|      8|    while (items[i].is_used ())
  ------------------
  |  Branch (232:12): [True: 0, False: 8]
  ------------------
  233|      0|    {
  234|      0|      if ((std::is_integral<K>::value || items[i].hash == hash) &&
  ------------------
  |  Branch (234:12): [Folded - Ignored]
  |  Branch (234:42): [True: 0, False: 0]
  ------------------
  235|      0|	  items[i] == key)
  ------------------
  |  Branch (235:4): [True: 0, False: 0]
  ------------------
  236|      0|      {
  237|      0|        if (!overwrite)
  ------------------
  |  Branch (237:13): [True: 0, False: 0]
  ------------------
  238|      0|	  return false;
  239|      0|        else
  240|      0|	  break;
  241|      0|      }
  242|      0|      if (!items[i].is_real () && tombstone == (unsigned) -1)
  ------------------
  |  Branch (242:11): [True: 0, False: 0]
  |  Branch (242:35): [True: 0, False: 0]
  ------------------
  243|      0|        tombstone = i;
  244|      0|      i = (i + ++step) & mask;
  245|      0|      length++;
  246|      0|    }
  247|       |
  248|      8|    item_t &item = items[tombstone == (unsigned) -1 ? i : tombstone];
  ------------------
  |  Branch (248:26): [True: 8, False: 0]
  ------------------
  249|       |
  250|      8|    if (item.is_used ())
  ------------------
  |  Branch (250:9): [True: 0, False: 8]
  ------------------
  251|      0|    {
  252|      0|      occupancy--;
  253|      0|      population -= item.is_real ();
  254|      0|    }
  255|       |
  256|      8|    item.key = std::forward<KK> (key);
  257|      8|    item.value = std::forward<VV> (value);
  258|      8|    item.hash = hash;
  259|      8|    item.set_used (true);
  260|      8|    item.set_real (true);
  261|       |
  262|      8|    occupancy++;
  263|      8|    population++;
  264|       |
  265|      8|    if (unlikely (length > max_chain_length) && occupancy * 8 > mask)
  ------------------
  |  |  260|     16|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  |  Branch (265:49): [True: 0, False: 0]
  ------------------
  266|      0|      alloc (mask - 8); // This ensures we jump to next larger size
  267|       |
  268|      8|    return true;
  269|      8|  }
_ZN12hb_hashmap_tIjjLb1EE5allocEj:
  174|     26|  {
  175|     26|    if (unlikely (!successful)) return false;
  ------------------
  |  |  260|     26|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 26]
  |  |  ------------------
  ------------------
  176|       |
  177|     26|    if (new_population != 0 && (new_population + new_population / 2) < mask) return true;
  ------------------
  |  Branch (177:9): [True: 2, False: 24]
  |  Branch (177:32): [True: 0, False: 2]
  ------------------
  178|       |
  179|     26|    unsigned int power = hb_bit_storage (hb_max ((unsigned) population, new_population) * 2 + 8);
  180|     26|    unsigned int new_size = 1u << power;
  181|     26|    item_t *new_items = (item_t *) hb_malloc ((size_t) new_size * sizeof (item_t));
  ------------------
  |  |  234|     26|#define hb_malloc hb_malloc_impl
  ------------------
  182|     26|    if (unlikely (!new_items))
  ------------------
  |  |  260|     26|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 26]
  |  |  ------------------
  ------------------
  183|      0|    {
  184|      0|      successful = false;
  185|      0|      return false;
  186|      0|    }
  187|     26|    if (!item_t::is_trivial)
  ------------------
  |  Branch (187:9): [Folded - Ignored]
  ------------------
  188|      0|      for (auto &_ : hb_iter (new_items, new_size))
  ------------------
  |  Branch (188:20): [True: 0, False: 0]
  ------------------
  189|      0|	new (&_) item_t ();
  190|     26|    else
  191|     26|      hb_memset (new_items, 0, (size_t) new_size * sizeof (item_t));
  192|       |
  193|     26|    unsigned int old_size = size ();
  194|     26|    item_t *old_items = items;
  195|       |
  196|       |    /* Switch to new, empty, array. */
  197|     26|    population = occupancy = 0;
  198|     26|    mask = new_size - 1;
  199|     26|    prime = prime_for (power);
  200|     26|    max_chain_length = power * 2;
  201|     26|    items = new_items;
  202|       |
  203|       |    /* Insert back old items. */
  204|     26|    for (unsigned int i = 0; i < old_size; i++)
  ------------------
  |  Branch (204:30): [True: 0, False: 26]
  ------------------
  205|      0|    {
  206|      0|      if (old_items[i].is_real ())
  ------------------
  |  Branch (206:11): [True: 0, False: 0]
  ------------------
  207|      0|      {
  208|      0|	set_with_hash (std::move (old_items[i].key),
  209|      0|		       old_items[i].hash,
  210|      0|		       std::move (old_items[i].value));
  211|      0|      }
  212|      0|      if (!item_t::is_trivial)
  ------------------
  |  Branch (212:11): [Folded - Ignored]
  ------------------
  213|      0|	old_items[i].~item_t ();
  214|      0|    }
  215|       |
  216|     26|    hb_free (old_items);
  ------------------
  |  |  237|     26|#define hb_free hb_free_impl
  ------------------
  217|       |
  218|     26|    return true;
  219|     26|  }
_ZNK12hb_hashmap_tIjjLb1EE4sizeEv:
  346|     26|  unsigned size () const { return mask ? mask + 1 : 0; }
  ------------------
  |  Branch (346:35): [True: 0, False: 26]
  ------------------
_ZN12hb_hashmap_tIjjLb1EE9prime_forEj:
  470|     26|  {
  471|       |    /* Following comment and table copied from glib. */
  472|       |    /* Each table size has an associated prime modulo (the first prime
  473|       |     * lower than the table size) used to find the initial bucket. Probing
  474|       |     * then works modulo 2^n. The prime modulo is necessary to get a
  475|       |     * good distribution with poor hash functions.
  476|       |     */
  477|       |    /* Not declaring static to make all kinds of compilers happy... */
  478|     26|    /*static*/ const unsigned int prime_mod [32] =
  479|     26|    {
  480|     26|      1,          /* For 1 << 0 */
  481|     26|      2,
  482|     26|      3,
  483|     26|      7,
  484|     26|      13,
  485|     26|      31,
  486|     26|      61,
  487|     26|      127,
  488|     26|      251,
  489|     26|      509,
  490|     26|      1021,
  491|     26|      2039,
  492|     26|      4093,
  493|     26|      8191,
  494|     26|      16381,
  495|     26|      32749,
  496|     26|      65521,      /* For 1 << 16 */
  497|     26|      131071,
  498|     26|      262139,
  499|     26|      524287,
  500|     26|      1048573,
  501|     26|      2097143,
  502|     26|      4194301,
  503|     26|      8388593,
  504|     26|      16777213,
  505|     26|      33554393,
  506|     26|      67108859,
  507|     26|      134217689,
  508|     26|      268435399,
  509|     26|      536870909,
  510|     26|      1073741789,
  511|     26|      2147483647  /* For 1 << 31 */
  512|     26|    };
  513|       |
  514|     26|    if (unlikely (shift >= ARRAY_LENGTH (prime_mod)))
  ------------------
  |  |  260|     26|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 26]
  |  |  ------------------
  ------------------
  515|      0|      return prime_mod[ARRAY_LENGTH (prime_mod) - 1];
  516|       |
  517|     26|    return prime_mod[shift];
  518|     26|  }
_ZN12hb_hashmap_tIjjLb1EEC2Ev:
   45|     26|  hb_hashmap_t ()  { init (); }
_ZN12hb_hashmap_tIjjLb1EED2Ev:
   46|     26|  ~hb_hashmap_t () { fini (); }

hb-buffer.cc:_ZNK3$_0clIRjjEEDTqugefp_fp0_fp_fp0_EOT_OT0_:
   76|   819k|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 75, False: 409k]
  ------------------
hb-buffer.cc:_ZNK3$_1clIRjS1_EEDTqulefp_fp0_fp_fp0_EOT_OT0_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 3, False: 0]
  ------------------
hb-face.cc:_ZNK3$_1clIRjjEEDTqulefp_fp0_fp_fp0_EOT_OT0_:
   76|   819k|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 409k, False: 0]
  ------------------
hb-face.cc:_ZNK3$_0clIjRjEEDTqugefp_fp0_fp_fp0_EOT_OT0_:
   76|     52|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 24, False: 2]
  ------------------
hb-face.cc:_ZNK3$_2clIRjjjEEDTclL_ZL6hb_minEclL_ZL6hb_maxEclsr3stdE7forwardIT_Efp_Eclsr3stdE7forwardIT0_Efp0_EEclsr3stdE7forwardIT1_Efp1_EEEOS2_OS3_OS4_:
   76|   409k|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
hb-face.cc:_ZNK3$_0clIRjjEEDTqugefp_fp0_fp_fp0_EOT_OT0_:
   76|   819k|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 204k, False: 204k]
  ------------------
_ZN21hb_sanitize_context_t8dispatchIN2OT7LangSysEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS5_:
   76|     28|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT7LangSysEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS3_:
   76|     28|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6RecordINS1_7LangSysEEEJPKNS1_6ScriptEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSA_:
   76|     11|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6RecordINS1_7LangSysEEEJPKNS1_6ScriptEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS8_:
   76|     11|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT7LangSysEJPKNS1_25Record_sanitize_closure_tEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS8_:
   76|     11|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT7LangSysEJPKNS1_25Record_sanitize_closure_tEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS6_:
   76|     11|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout6Common8CoverageEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|     52|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout6Common8CoverageEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS5_:
   76|     52|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8ClassDefEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS5_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8ClassDefEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS3_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT12LigCaretListEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS5_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT12LigCaretListEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS3_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl6AnchorEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|     96|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl6AnchorEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS5_:
   76|     96|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl10MarkRecordEJPKNS3_9MarkArrayEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSA_:
   76|     96|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl10MarkRecordEJPKNS3_9MarkArrayEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS8_:
   76|     96|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_6Layout9GPOS_impl17PosLookupSubTableENS1_7IntTypeItLj2EEELb1EEEJPKNS1_6LookupEjEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSE_:
   76|      7|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_6Layout9GPOS_impl17PosLookupSubTableENS1_7IntTypeItLj2EEELb1EEEJPKNS1_6LookupEjEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSC_:
   76|      7|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl17PosLookupSubTableEJjEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|      7|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl17PosLookupSubTableEJjEEEDTcldtfp_8dispatchfpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj0EEDpOS5_:
   76|      7|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl16PairPosFormat2_4INS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl16PairPosFormat2_4INS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl20MarkBasePosFormat1_2INS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|      4|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl20MarkBasePosFormat1_2INS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|      4|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl9MarkArrayEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl9MarkArrayEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS5_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl12AnchorMatrixEJjEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl12AnchorMatrixEJjEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS5_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl19MarkLigPosFormat1_2INS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl19MarkLigPosFormat1_2INS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl13LigatureArrayEJjEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl13LigatureArrayEJjEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS5_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_6Layout9GPOS_impl12AnchorMatrixENS1_7IntTypeItLj2EEELb1EEEJPKNS1_16List16OfOffsetToIS5_S7_EEjEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSF_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_6Layout9GPOS_impl12AnchorMatrixENS1_7IntTypeItLj2EEELb1EEEJPKNS1_16List16OfOffsetToIS5_S7_EEjEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSD_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl20MarkMarkPosFormat1_2INS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl20MarkMarkPosFormat1_2INS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT12ChainRuleSetINS1_6Layout10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS8_:
   76|      2|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT12ChainRuleSetINS1_6Layout10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS6_:
   76|      2|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_9ChainRuleINS1_6Layout10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS1_12ChainRuleSetIS5_EEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSG_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_9ChainRuleINS1_6Layout10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS1_12ChainRuleSetIS5_EEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSE_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT9ChainRuleINS1_6Layout10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS8_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT9ChainRuleINS1_6Layout10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS6_:
   76|      6|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT21ChainContextFormat2_5INS1_6Layout10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS8_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT21ChainContextFormat2_5INS1_6Layout10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS6_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_12ChainRuleSetINS1_6Layout10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS1_21ChainContextFormat2_5IS5_EEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSG_:
   76|      5|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_12ChainRuleSetINS1_6Layout10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS1_21ChainContextFormat2_5IS5_EEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSE_:
   76|      5|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT18RecordListOfScriptEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS5_:
   76|     22|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT18RecordListOfScriptEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS3_:
   76|     22|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6RecordINS1_6ScriptEEEJPKNS1_12RecordListOfIS3_EEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSB_:
   76|     28|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6RecordINS1_6ScriptEEEJPKNS1_12RecordListOfIS3_EEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS9_:
   76|     28|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6ScriptEJPKNS1_25Record_sanitize_closure_tEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS8_:
   76|     28|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6ScriptEJPKNS1_25Record_sanitize_closure_tEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS6_:
   76|     28|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT12RecordListOfINS1_7FeatureEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|     22|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT12RecordListOfINS1_7FeatureEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS5_:
   76|     22|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6RecordINS1_7FeatureEEEJPKNS1_12RecordListOfIS3_EEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSB_:
   76|     39|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6RecordINS1_7FeatureEEEJPKNS1_12RecordListOfIS3_EEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS9_:
   76|     39|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT7FeatureEJPKNS1_25Record_sanitize_closure_tEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS8_:
   76|     39|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT7FeatureEJPKNS1_25Record_sanitize_closure_tEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS6_:
   76|     39|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT16List16OfOffsetToINS1_6Layout9GPOS_impl9PosLookupENS1_7IntTypeItLj2EEEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSB_:
   76|     11|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT16List16OfOffsetToINS1_6Layout9GPOS_impl9PosLookupENS1_7IntTypeItLj2EEEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS9_:
   76|     11|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_6Layout9GPOS_impl9PosLookupENS1_7IntTypeItLj2EEELb1EEEJPKNS1_16List16OfOffsetToIS5_S7_EEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSF_:
   76|      4|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_6Layout9GPOS_impl9PosLookupENS1_7IntTypeItLj2EEELb1EEEJPKNS1_16List16OfOffsetToIS5_S7_EEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSD_:
   76|      4|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GPOS_impl9PosLookupEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|      4|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GPOS_impl9PosLookupEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS5_:
   76|      4|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN2OT33hb_accelerate_subtables_context_t10cache_costINS_6Layout9GPOS_impl20MarkBasePosFormat1_2INS2_10SmallTypesEEEEEjRKT_11hb_priorityILj0EE:
   76|      4|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN2OT33hb_accelerate_subtables_context_t10cache_costINS_6Layout9GPOS_impl19MarkLigPosFormat1_2INS2_10SmallTypesEEEEEjRKT_11hb_priorityILj0EE:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN2OT33hb_accelerate_subtables_context_t10cache_costINS_6Layout9GPOS_impl20MarkMarkPosFormat1_2INS2_10SmallTypesEEEEEjRKT_11hb_priorityILj0EE:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN2OT33hb_accelerate_subtables_context_t10cache_costINS_21ChainContextFormat2_5INS_6Layout10SmallTypesEEEEEDTcldtfp_10cache_costEERKT_11hb_priorityILj1EE:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6KernOTEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS5_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6KernOTEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS3_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN3AAT19KerxSubTableFormat0IN2OT20KernOTSubTableHeaderEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS8_:
   76|      4|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN3AAT19KerxSubTableFormat0IN2OT20KernOTSubTableHeaderEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS6_:
   76|      4|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl19SubstLookupSubTableENS1_7IntTypeItLj2EEELb1EEEJPKNS1_6LookupEjEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSE_:
   76|     38|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl19SubstLookupSubTableENS1_7IntTypeItLj2EEELb1EEEJPKNS1_6LookupEjEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSC_:
   76|     38|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GSUB_impl19SubstLookupSubTableEJjEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|     38|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GSUB_impl19SubstLookupSubTableEJjEEEDTcldtfp_8dispatchfpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj0EEDpOS5_:
   76|     38|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GSUB_impl20SingleSubstFormat1_3INS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GSUB_impl20SingleSubstFormat1_3INS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GSUB_impl20SingleSubstFormat2_4INS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|     13|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GSUB_impl20SingleSubstFormat2_4INS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|     13|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GSUB_impl23AlternateSubstFormat1_2INS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|     21|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GSUB_impl23AlternateSubstFormat1_2INS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|     21|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl12AlternateSetINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS4_23AlternateSubstFormat1_2IS6_EEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSH_:
   76|  13.9k|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl12AlternateSetINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS4_23AlternateSubstFormat1_2IS6_EEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSF_:
   76|  13.9k|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GSUB_impl12AlternateSetINS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|  13.9k|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GSUB_impl12AlternateSetINS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|  13.9k|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GSUB_impl22LigatureSubstFormat1_2INS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|      2|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GSUB_impl22LigatureSubstFormat1_2INS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|      2|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl11LigatureSetINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS4_22LigatureSubstFormat1_2IS6_EEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSH_:
   76|      3|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl11LigatureSetINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS4_22LigatureSubstFormat1_2IS6_EEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSF_:
   76|      3|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GSUB_impl11LigatureSetINS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|      3|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GSUB_impl11LigatureSetINS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|      3|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl8LigatureINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS4_11LigatureSetIS6_EEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSH_:
   76|      9|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl8LigatureINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEJPKNS4_11LigatureSetIS6_EEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSF_:
   76|      9|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GSUB_impl8LigatureINS2_10SmallTypesEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS9_:
   76|      9|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GSUB_impl8LigatureINS2_10SmallTypesEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS7_:
   76|      9|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT16List16OfOffsetToINS1_6Layout9GSUB_impl11SubstLookupENS1_7IntTypeItLj2EEEEEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSB_:
   76|     11|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT16List16OfOffsetToINS1_6Layout9GSUB_impl11SubstLookupENS1_7IntTypeItLj2EEEEEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS9_:
   76|     11|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl11SubstLookupENS1_7IntTypeItLj2EEELb1EEEJPKNS1_16List16OfOffsetToIS5_S7_EEEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOSF_:
   76|     38|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT8OffsetToINS1_6Layout9GSUB_impl11SubstLookupENS1_7IntTypeItLj2EEELb1EEEJPKNS1_16List16OfOffsetToIS5_S7_EEEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOSD_:
   76|     38|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t8dispatchIN2OT6Layout9GSUB_impl11SubstLookupEJEEEDTcl9_dispatchfp_cv11hb_priorityILj16EE_Espclsr3stdE7forwardIT0_Efp0_EEERKT_DpOS7_:
   76|     38|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN21hb_sanitize_context_t9_dispatchIN2OT6Layout9GSUB_impl11SubstLookupEJEEEDTcldtfp_8sanitizefpTspclsr3stdE7forwardIT0_Efp1_EEERKT_11hb_priorityILj1EEDpOS5_:
   76|     38|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
_ZN2OT33hb_accelerate_subtables_context_t10cache_costINS_6Layout9GSUB_impl22LigatureSubstFormat1_2INS2_10SmallTypesEEEEEjRKT_11hb_priorityILj0EE:
   76|      1|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
hb-ot-font.cc:_ZNK3$_4clIRKjEEDTclsr3stdE7forwardIT_Efp_EEOS3_:
   76|     34|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
hb-static.cc:_ZNK3$_0clIRjjEEDTqugefp_fp0_fp_fp0_EOT_OT0_:
   76|     22|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 0, False: 11]
  ------------------
hb-ot-layout.cc:_ZNK3$_1clIRjS1_EEDTqulefp_fp0_fp_fp0_EOT_OT0_:
   76|     84|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 36, False: 6]
  ------------------
hb-ot-layout.cc:_ZNK3$_1clImjEEDTqulefp_fp0_fp_fp0_EOT_OT0_:
   76|     60|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 0, False: 30]
  ------------------
hb-ot-layout.cc:_ZorI10hb_array_tIKN2OT5IndexEE9hb_sink_tIS0_IjEELPv0EEDTclclsr3stdE7forwardIT0_Efp0_Eclsr3stdE7forwardIT_Efp_EEEOSA_OS9_:
   76|     42|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
hb-ot-layout.cc:_ZNK3$_3clIjEEN10_hb_head_tIjJDTcl4implfp_cv11hb_priorityILj16EE_EEEEE4typeERKT_:
   75|      8|#define HB_RETURN(Ret, E) -> hb_head_t<Ret, decltype ((E))> { return (E); }
hb-ot-layout.cc:_ZNK3$_34implIjLPv0EEEN10_hb_head_tIjJDTmlcvjfp_Lj2654435761EEEE4typeERKT_11hb_priorityILj1EE:
   75|      8|#define HB_RETURN(Ret, E) -> hb_head_t<Ret, decltype ((E))> { return (E); }
hb-ot-map.cc:_ZNK3$_0clIRjS1_EEDTqugefp_fp0_fp_fp0_EOT_OT0_:
   76|     26|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 13, False: 0]
  ------------------
hb-ot-map.cc:_ZNK3$_1clIRjS1_EEDTqulefp_fp0_fp_fp0_EOT_OT0_:
   76|    160|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 80, False: 0]
  ------------------
hb-ot-map.cc:_ZNK3$_1clIjjEEDTqulefp_fp0_fp_fp0_EOT_OT0_:
   76|    182|#define HB_AUTO_RETURN(E) -> decltype ((E)) { return (E); }
  ------------------
  |  Branch (76:55): [True: 13, False: 78]
  ------------------
hb-ot-map.cc:_ZNK3$_3clIjEEN10_hb_head_tIjJDTcl4implfp_cv11hb_priorityILj16EE_EEEEE4typeERKT_:
   75|    650|#define HB_RETURN(Ret, E) -> hb_head_t<Ret, decltype ((E))> { return (E); }
hb-ot-map.cc:_ZNK3$_34implIjLPv0EEEN10_hb_head_tIjJDTmlcvjfp_Lj2654435761EEEE4typeERKT_11hb_priorityILj1EE:
   75|    650|#define HB_RETURN(Ret, E) -> hb_head_t<Ret, decltype ((E))> { return (E); }

_ZN10hb_mutex_t4lockEv:
  106|     33|  void lock   () { hb_mutex_impl_lock   ((hb_mutex_impl_t *) m); }
  ------------------
  |  |   55|     33|#define hb_mutex_impl_lock(M)	pthread_mutex_lock (M)
  ------------------
_ZN10hb_mutex_t6unlockEv:
  107|     33|  void unlock () { hb_mutex_impl_unlock ((hb_mutex_impl_t *) m); }
  ------------------
  |  |   56|     33|#define hb_mutex_impl_unlock(M)	pthread_mutex_unlock (M)
  ------------------
_ZN10hb_mutex_t4finiEv:
  108|     11|  void fini   () { hb_mutex_impl_finish ((hb_mutex_impl_t *) m); }
  ------------------
  |  |   57|     11|#define hb_mutex_impl_finish(M)	pthread_mutex_destroy (M)
  ------------------
_ZN10hb_mutex_t4initEv:
  105|     11|  void init   () { hb_mutex_impl_init   ((hb_mutex_impl_t *) m); }
  ------------------
  |  |   54|     11|#define hb_mutex_impl_init(M)	pthread_mutex_init (M, nullptr)
  ------------------

_ZN10NullHelperI9hb_blob_tE8get_nullEv:
  122|    130|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullI9hb_blob_tE8get_nullEv:
  113|    130|  {
  114|    130|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|    130|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|    130|  }
_ZN4NullI18hb_unicode_funcs_tE8get_nullEv:
  157|      2|	  static Type const & get_null () { \
  158|      2|	    return _hb_Null_##Type; \
  159|      2|	  } \
_ZN4NullI9hb_font_tE8get_nullEv:
  157|     11|	  static Type const & get_null () { \
  158|     11|	    return _hb_Null_##Type; \
  159|     11|	  } \
_ZN16hb_nonnull_ptr_tI9hb_blob_tEC2EPS0_:
  210|     33|  hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {}
_ZN16hb_nonnull_ptr_tI9hb_blob_tEaSEPS0_:
  211|     66|  T * operator = (T *v_)   { return v = v_; }
_ZNK16hb_nonnull_ptr_tI9hb_blob_tEptEv:
  212|   819k|  T * operator -> () const { return get (); }
_ZNK16hb_nonnull_ptr_tI9hb_blob_tE3getEv:
  218|   819k|  T * get () const { return v ? v : const_cast<T *> (std::addressof (Null (T))); }
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (218:29): [True: 819k, False: 0]
  ------------------
_ZNK16hb_nonnull_ptr_tI9hb_blob_tE7get_rawEv:
  219|   409k|  T * get_raw () const { return v; }
_ZN4NullIN2OT7LangSysEE8get_nullEv:
  132|     48|	  static Namespace::Type const & get_null () { \
  133|     48|	    return *reinterpret_cast<const Namespace::Type *> (_hb_Null_##Namespace##_##Type); \
  134|     48|	  } \
_ZN10NullHelperIN2OT6Layout6Common11RangeRecordINS1_10SmallTypesEEEE8get_nullEv:
  122|      1|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN10NullHelperIN2OT6RecordINS0_7FeatureEEEE8get_nullEv:
  122|     30|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT6RecordINS0_7FeatureEEEE8get_nullEv:
  113|     30|  {
  114|     30|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     30|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     30|  }
_ZN10NullHelperIN2OT7FeatureEE8get_nullEv:
  122|     30|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT7FeatureEE8get_nullEv:
  113|     30|  {
  114|     30|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     30|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     30|  }
_ZN10NullHelperIN2OT7LangSysEE8get_nullEv:
  122|     48|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN10NullHelperIN2OT6RecordINS0_6ScriptEEEE8get_nullEv:
  122|     72|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT6RecordINS0_6ScriptEEEE8get_nullEv:
  113|     72|  {
  114|     72|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     72|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     72|  }
_ZN10NullHelperIN2OT6ScriptEE8get_nullEv:
  122|     72|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT6ScriptEE8get_nullEv:
  113|     72|  {
  114|     72|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     72|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     72|  }
_ZN10NullHelperIN2OT14VariationStoreEE8get_nullEv:
  122|   409k|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT14VariationStoreEE8get_nullEv:
  113|   409k|  {
  114|   409k|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|   409k|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|   409k|  }
_ZN10NullHelperI9hb_font_tE8get_nullEv:
  122|     11|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN10NullHelperIN2OT18GDEF_accelerator_tEE8get_nullEv:
  122|     11|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT18GDEF_accelerator_tEE8get_nullEv:
  113|     11|  {
  114|     11|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     11|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     11|  }
_ZN10NullHelperIN2OT18GSUB_accelerator_tEE8get_nullEv:
  122|     11|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT18GSUB_accelerator_tEE8get_nullEv:
  113|     11|  {
  114|     11|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     11|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     11|  }
_ZN10NullHelperIN2OT18GPOS_accelerator_tEE8get_nullEv:
  122|     11|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT18GPOS_accelerator_tEE8get_nullEv:
  113|     11|  {
  114|     11|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     11|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     11|  }
_ZN10NullHelperIN2OT8ClassDefEE8get_nullEv:
  122|    179|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT8ClassDefEE8get_nullEv:
  113|    179|  {
  114|    179|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|    179|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|    179|  }
_ZN10NullHelperIN2OT13MarkGlyphSetsEE8get_nullEv:
  122|     11|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT13MarkGlyphSetsEE8get_nullEv:
  113|     11|  {
  114|     11|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     11|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     11|  }
_ZN10NullHelperIN2OT4GDEFEE8get_nullEv:
  122|   409k|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT4GDEFEE8get_nullEv:
  113|   409k|  {
  114|   409k|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|   409k|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|   409k|  }
_ZN10NullHelperIN2OT17FeatureVariationsEE8get_nullEv:
  122|   409k|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT17FeatureVariationsEE8get_nullEv:
  113|   409k|  {
  114|   409k|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|   409k|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|   409k|  }
_ZN10NullHelperI18hb_unicode_funcs_tE8get_nullEv:
  122|      2|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN10NullHelperIN3AAT4ankrEE8get_nullEv:
  122|      9|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN3AAT4ankrEE8get_nullEv:
  113|      9|  {
  114|      9|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|      9|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|      9|  }
_ZN10NullHelperIN3AAT4morxEE8get_nullEv:
  122|     13|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN3AAT4morxEE8get_nullEv:
  113|     13|  {
  114|     13|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     13|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     13|  }
_ZN10NullHelperIN3AAT4mortEE8get_nullEv:
  122|     13|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN3AAT4mortEE8get_nullEv:
  113|     13|  {
  114|     13|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     13|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     13|  }
_ZN10NullHelperIN3AAT4kerxEE8get_nullEv:
  122|     13|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN3AAT4kerxEE8get_nullEv:
  113|     13|  {
  114|     13|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     13|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     13|  }
_ZN10NullHelperIN3AAT4trakEE8get_nullEv:
  122|     13|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN3AAT4trakEE8get_nullEv:
  113|     13|  {
  114|     13|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     13|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     13|  }
_ZN10NullHelperIN2OT4kernEE8get_nullEv:
  122|     12|  static const Type & get_null () { return Null<Type>::get_null (); }
_ZN4NullIN2OT4kernEE8get_nullEv:
  113|     12|  {
  114|     12|    static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
  115|     12|    return *reinterpret_cast<Type const *> (_hb_NullPool);
  116|     12|  }

hb-blob.cc:_ZL16hb_object_createI9hb_blob_tJEEPT_DpT0_:
  239|     35|{
  240|     35|  Type *obj = (Type *) hb_calloc (1, sizeof (Type));
  ------------------
  |  |  235|     35|#define hb_calloc hb_calloc_impl
  ------------------
  241|       |
  242|     35|  if (unlikely (!obj))
  ------------------
  |  |  260|     35|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 35]
  |  |  ------------------
  ------------------
  243|      0|    return obj;
  244|       |
  245|     35|  new (obj) Type (std::forward<Ts> (ds)...);
  246|       |
  247|     35|  hb_object_init (obj);
  248|     35|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     35|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  249|       |
  250|     35|  return obj;
  251|     35|}
hb-blob.cc:_ZL14hb_object_initI9hb_blob_tEvPT_:
  254|     35|{
  255|     35|  obj->header.ref_count.init ();
  256|     35|  obj->header.writable = true;
  257|     35|  obj->header.user_data.init ();
  258|     35|}
_ZN20hb_reference_count_t4initEi:
  147|   204k|  void init (int v = 1) { ref_count = v; }
hb-blob.cc:_ZL15hb_object_traceI9hb_blob_tEvPKT_PKc:
  230|   819k|{
  231|   819k|  DEBUG_MSG (OBJECT, (void *) obj,
  ------------------
  |  |  232|  1.63M|#define DEBUG_MSG(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (232:109): [True: 819k, False: 0]
  |  |  ------------------
  ------------------
  232|   819k|	     "%s refcount=%d",
  233|   819k|	     function,
  234|   819k|	     obj ? obj->header.ref_count.get_relaxed () : 0);
  235|   819k|}
_ZNK20hb_reference_count_t11get_relaxedEv:
  148|  4.71M|  int get_relaxed () const { return ref_count; }
hb-blob.cc:_ZL19hb_object_referenceI9hb_blob_tEPT_S2_:
  276|   409k|{
  277|   409k|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|   409k|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  278|   409k|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|   819k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 64, False: 409k]
  |  |  |  Branch (260:47): [True: 0, False: 409k]
  |  |  |  Branch (260:47): [True: 64, False: 409k]
  |  |  ------------------
  ------------------
  279|     64|    return obj;
  280|   409k|  assert (hb_object_is_valid (obj));
  281|      0|  obj->header.ref_count.inc ();
  282|   409k|  return obj;
  283|   409k|}
_ZNK18hb_object_header_t8is_inertEv:
  219|  2.25M|  bool is_inert () const { return !ref_count.get_relaxed (); }
hb-blob.cc:_ZL18hb_object_is_validI9hb_blob_tEbPKT_:
  261|   819k|{
  262|   819k|  return likely (obj->header.ref_count.is_valid ());
  ------------------
  |  |  259|   819k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  263|   819k|}
_ZNK20hb_reference_count_t8is_validEv:
  154|  2.66M|  bool is_valid () const { return ref_count > 0; }
_ZNK20hb_reference_count_t3incEv:
  149|  1.02M|  int inc () const { return ref_count.inc (); }
hb-blob.cc:_ZL17hb_object_destroyI9hb_blob_tEbPT_:
  286|   409k|{
  287|   409k|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|   409k|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  288|   409k|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|   819k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 74, False: 409k]
  |  |  |  Branch (260:47): [True: 0, False: 409k]
  |  |  |  Branch (260:47): [True: 74, False: 409k]
  |  |  ------------------
  ------------------
  289|     74|    return false;
  290|   409k|  assert (hb_object_is_valid (obj));
  291|   409k|  if (obj->header.ref_count.dec () != 1)
  ------------------
  |  Branch (291:7): [True: 409k, False: 35]
  ------------------
  292|   409k|    return false;
  293|       |
  294|     35|  hb_object_fini (obj);
  295|       |
  296|     35|  if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (296:7): [Folded - Ignored]
  ------------------
  297|     35|    obj->~Type ();
  298|       |
  299|     35|  return true;
  300|   409k|}
_ZNK20hb_reference_count_t3decEv:
  150|  1.22M|  int dec () const { return ref_count.dec (); }
hb-blob.cc:_ZL14hb_object_finiI9hb_blob_tEvPT_:
  303|     35|{
  304|     35|  obj->header.ref_count.fini (); /* Do this before user_data */
  305|     35|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  306|     35|  if (user_data)
  ------------------
  |  Branch (306:7): [True: 0, False: 35]
  ------------------
  307|      0|  {
  308|      0|    user_data->fini ();
  309|      0|    hb_free (user_data);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  310|      0|    obj->header.user_data.set_relaxed (nullptr);
  311|      0|  }
  312|     35|}
_ZN20hb_reference_count_t4finiEv:
  151|   204k|  void fini () { ref_count = -0x0000DEAD; }
_ZN20hb_user_data_array_t4finiEv:
  178|     11|  void fini () { items.fini (lock); lock.fini (); }
_ZN17hb_lockable_set_tIN20hb_user_data_array_t19hb_user_data_item_tE10hb_mutex_tE4finiERS2_:
  116|     11|  {
  117|     11|    if (!items.length)
  ------------------
  |  Branch (117:9): [True: 0, False: 11]
  ------------------
  118|      0|    {
  119|       |      /* No need to lock. */
  120|      0|      items.fini ();
  121|      0|      return;
  122|      0|    }
  123|     11|    l.lock ();
  124|     22|    while (items.length)
  ------------------
  |  Branch (124:12): [True: 11, False: 11]
  ------------------
  125|     11|    {
  126|     11|      item_t old = items.tail ();
  127|     11|      items.pop ();
  128|     11|      l.unlock ();
  129|     11|      old.fini ();
  130|     11|      l.lock ();
  131|     11|    }
  132|     11|    items.fini ();
  133|     11|    l.unlock ();
  134|     11|  }
_ZN20hb_user_data_array_t19hb_user_data_item_t4finiEv:
  170|     11|    void fini () { if (destroy) destroy (data); }
  ------------------
  |  Branch (170:24): [True: 11, False: 0]
  ------------------
_ZN20hb_user_data_array_t4initEv:
  176|     11|  void init () { lock.init (); items.init (); }
_ZN17hb_lockable_set_tIN20hb_user_data_array_t19hb_user_data_item_tE10hb_mutex_tE4initEv:
   50|     11|  void init () { items.init (); }
_ZN20hb_user_data_array_t3setEP18hb_user_data_key_tPvPFvS2_Ei:
  184|     11|  {
  185|     11|    if (!key)
  ------------------
  |  Branch (185:9): [True: 0, False: 11]
  ------------------
  186|      0|      return false;
  187|       |
  188|     11|    if (replace) {
  ------------------
  |  Branch (188:9): [True: 0, False: 11]
  ------------------
  189|      0|      if (!data && !destroy) {
  ------------------
  |  Branch (189:11): [True: 0, False: 0]
  |  Branch (189:20): [True: 0, False: 0]
  ------------------
  190|      0|	items.remove (key, lock);
  191|      0|	return true;
  192|      0|      }
  193|      0|    }
  194|     11|    hb_user_data_item_t item = {key, data, destroy};
  195|     11|    bool ret = !!items.replace_or_insert (item, lock, (bool) replace);
  196|       |
  197|     11|    return ret;
  198|     11|  }
_ZN17hb_lockable_set_tIN20hb_user_data_array_t19hb_user_data_item_tE10hb_mutex_tE17replace_or_insertIS1_EEPS1_T_RS2_b:
   54|     11|  {
   55|     11|    l.lock ();
   56|     11|    item_t *item = items.lsearch (v);
   57|     11|    if (item) {
  ------------------
  |  Branch (57:9): [True: 0, False: 11]
  ------------------
   58|      0|      if (replace) {
  ------------------
  |  Branch (58:11): [True: 0, False: 0]
  ------------------
   59|      0|	item_t old = *item;
   60|      0|	*item = v;
   61|      0|	l.unlock ();
   62|      0|	old.fini ();
   63|      0|      }
   64|      0|      else {
   65|      0|	item = nullptr;
   66|      0|	l.unlock ();
   67|      0|      }
   68|     11|    } else {
   69|     11|      item = items.push (v);
   70|     11|      l.unlock ();
   71|     11|    }
   72|     11|    return items.in_error () ? nullptr : item;
  ------------------
  |  Branch (72:12): [True: 0, False: 11]
  ------------------
   73|     11|  }
hb-blob.cc:_ZL22hb_object_is_immutableI9hb_blob_tEbPKT_:
  266|     35|{
  267|     35|  return !obj->header.writable;
  268|     35|}
hb-blob.cc:_ZL24hb_object_make_immutableI9hb_blob_tEvPKT_:
  271|     35|{
  272|     35|  obj->header.writable = false;
  273|     35|}
hb-buffer.cc:_ZL16hb_object_createI11hb_buffer_tJEEPT_DpT0_:
  239|   204k|{
  240|   204k|  Type *obj = (Type *) hb_calloc (1, sizeof (Type));
  ------------------
  |  |  235|   204k|#define hb_calloc hb_calloc_impl
  ------------------
  241|       |
  242|   204k|  if (unlikely (!obj))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  243|      0|    return obj;
  244|       |
  245|   204k|  new (obj) Type (std::forward<Ts> (ds)...);
  246|       |
  247|   204k|  hb_object_init (obj);
  248|   204k|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|   204k|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  249|       |
  250|   204k|  return obj;
  251|   204k|}
hb-buffer.cc:_ZL14hb_object_initI11hb_buffer_tEvPT_:
  254|   204k|{
  255|   204k|  obj->header.ref_count.init ();
  256|   204k|  obj->header.writable = true;
  257|   204k|  obj->header.user_data.init ();
  258|   204k|}
hb-buffer.cc:_ZL15hb_object_traceI11hb_buffer_tEvPKT_PKc:
  230|   409k|{
  231|   409k|  DEBUG_MSG (OBJECT, (void *) obj,
  ------------------
  |  |  232|   819k|#define DEBUG_MSG(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (232:109): [True: 409k, False: 0]
  |  |  ------------------
  ------------------
  232|   409k|	     "%s refcount=%d",
  233|   409k|	     function,
  234|   409k|	     obj ? obj->header.ref_count.get_relaxed () : 0);
  235|   409k|}
hb-buffer.cc:_ZL22hb_object_is_immutableI11hb_buffer_tEbPKT_:
  266|   614k|{
  267|   614k|  return !obj->header.writable;
  268|   614k|}
hb-buffer.cc:_ZL18hb_object_is_validI11hb_buffer_tEbPKT_:
  261|   204k|{
  262|   204k|  return likely (obj->header.ref_count.is_valid ());
  ------------------
  |  |  259|   204k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  263|   204k|}
hb-buffer.cc:_ZL17hb_object_destroyI11hb_buffer_tEbPT_:
  286|   204k|{
  287|   204k|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|   204k|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  288|   204k|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|   409k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  289|      0|    return false;
  290|   204k|  assert (hb_object_is_valid (obj));
  291|   204k|  if (obj->header.ref_count.dec () != 1)
  ------------------
  |  Branch (291:7): [True: 0, False: 204k]
  ------------------
  292|      0|    return false;
  293|       |
  294|   204k|  hb_object_fini (obj);
  295|       |
  296|   204k|  if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (296:7): [Folded - Ignored]
  ------------------
  297|      0|    obj->~Type ();
  298|       |
  299|   204k|  return true;
  300|   204k|}
hb-buffer.cc:_ZL14hb_object_finiI11hb_buffer_tEvPT_:
  303|   204k|{
  304|   204k|  obj->header.ref_count.fini (); /* Do this before user_data */
  305|   204k|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  306|   204k|  if (user_data)
  ------------------
  |  Branch (306:7): [True: 0, False: 204k]
  ------------------
  307|      0|  {
  308|      0|    user_data->fini ();
  309|      0|    hb_free (user_data);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  310|      0|    obj->header.user_data.set_relaxed (nullptr);
  311|      0|  }
  312|   204k|}
hb-face.cc:_ZL16hb_object_createI9hb_face_tJEEPT_DpT0_:
  239|     11|{
  240|     11|  Type *obj = (Type *) hb_calloc (1, sizeof (Type));
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
  241|       |
  242|     11|  if (unlikely (!obj))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  243|      0|    return obj;
  244|       |
  245|     11|  new (obj) Type (std::forward<Ts> (ds)...);
  246|       |
  247|     11|  hb_object_init (obj);
  248|     11|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  249|       |
  250|     11|  return obj;
  251|     11|}
hb-face.cc:_ZL14hb_object_initI9hb_face_tEvPT_:
  254|     11|{
  255|     11|  obj->header.ref_count.init ();
  256|     11|  obj->header.writable = true;
  257|     11|  obj->header.user_data.init ();
  258|     11|}
hb-face.cc:_ZL15hb_object_traceI9hb_face_tEvPKT_PKc:
  230|     44|{
  231|     44|  DEBUG_MSG (OBJECT, (void *) obj,
  ------------------
  |  |  232|     88|#define DEBUG_MSG(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (232:109): [True: 44, False: 0]
  |  |  ------------------
  ------------------
  232|     44|	     "%s refcount=%d",
  233|     44|	     function,
  234|     44|	     obj ? obj->header.ref_count.get_relaxed () : 0);
  235|     44|}
hb-face.cc:_ZL19hb_object_referenceI9hb_face_tEPT_S2_:
  276|     11|{
  277|     11|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  278|     11|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  279|      0|    return obj;
  280|     11|  assert (hb_object_is_valid (obj));
  281|      0|  obj->header.ref_count.inc ();
  282|     11|  return obj;
  283|     11|}
hb-face.cc:_ZL18hb_object_is_validI9hb_face_tEbPKT_:
  261|     55|{
  262|     55|  return likely (obj->header.ref_count.is_valid ());
  ------------------
  |  |  259|     55|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  263|     55|}
hb-face.cc:_ZL17hb_object_destroyI9hb_face_tEbPT_:
  286|     22|{
  287|     22|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  288|     22|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|     44|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 22]
  |  |  |  Branch (260:47): [True: 0, False: 22]
  |  |  |  Branch (260:47): [True: 0, False: 22]
  |  |  ------------------
  ------------------
  289|      0|    return false;
  290|     22|  assert (hb_object_is_valid (obj));
  291|     22|  if (obj->header.ref_count.dec () != 1)
  ------------------
  |  Branch (291:7): [True: 11, False: 11]
  ------------------
  292|     11|    return false;
  293|       |
  294|     11|  hb_object_fini (obj);
  295|       |
  296|     11|  if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (296:7): [Folded - Ignored]
  ------------------
  297|      0|    obj->~Type ();
  298|       |
  299|     11|  return true;
  300|     22|}
hb-face.cc:_ZL14hb_object_finiI9hb_face_tEvPT_:
  303|     11|{
  304|     11|  obj->header.ref_count.fini (); /* Do this before user_data */
  305|     11|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  306|     11|  if (user_data)
  ------------------
  |  Branch (306:7): [True: 11, False: 0]
  ------------------
  307|     11|  {
  308|     11|    user_data->fini ();
  309|     11|    hb_free (user_data);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
  310|     11|    obj->header.user_data.set_relaxed (nullptr);
  311|     11|  }
  312|     11|}
hb-face.cc:_ZL23hb_object_set_user_dataI9hb_face_tEbPT_P18hb_user_data_key_tPvPFvS5_Ei:
  319|     11|{
  320|     11|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  321|      0|    return false;
  322|     11|  assert (hb_object_is_valid (obj));
  323|       |
  324|     11|retry:
  325|     11|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  326|     11|  if (unlikely (!user_data))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  327|     11|  {
  328|     11|    user_data = (hb_user_data_array_t *) hb_calloc (sizeof (hb_user_data_array_t), 1);
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
  329|     11|    if (unlikely (!user_data))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  330|      0|      return false;
  331|     11|    user_data->init ();
  332|     11|    if (unlikely (!obj->header.user_data.cmpexch (nullptr, user_data)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  333|      0|    {
  334|      0|      user_data->fini ();
  335|      0|      hb_free (user_data);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  336|      0|      goto retry;
  337|      0|    }
  338|     11|  }
  339|       |
  340|     11|  return user_data->set (key, data, destroy, replace);
  341|     11|}
hb-face.cc:_ZL23hb_object_get_user_dataIK9hb_face_tEPvPT_P18hb_user_data_key_t:
  346|     11|{
  347|     11|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  348|      0|    return nullptr;
  349|     11|  assert (hb_object_is_valid (obj));
  350|      0|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  351|     11|  if (!user_data)
  ------------------
  |  Branch (351:7): [True: 11, False: 0]
  ------------------
  352|     11|    return nullptr;
  353|      0|  return user_data->get (key);
  354|     11|}
hb-face.cc:_ZL22hb_object_is_immutableI9hb_face_tEbPKT_:
  266|     46|{
  267|     46|  return !obj->header.writable;
  268|     46|}
hb-face.cc:_ZL24hb_object_make_immutableI9hb_face_tEvPKT_:
  271|     11|{
  272|     11|  obj->header.writable = false;
  273|     11|}
hb-font.cc:_ZL16hb_object_createI9hb_font_tJEEPT_DpT0_:
  239|     11|{
  240|     11|  Type *obj = (Type *) hb_calloc (1, sizeof (Type));
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
  241|       |
  242|     11|  if (unlikely (!obj))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  243|      0|    return obj;
  244|       |
  245|     11|  new (obj) Type (std::forward<Ts> (ds)...);
  246|       |
  247|     11|  hb_object_init (obj);
  248|     11|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  249|       |
  250|     11|  return obj;
  251|     11|}
hb-font.cc:_ZL14hb_object_initI9hb_font_tEvPT_:
  254|     11|{
  255|     11|  obj->header.ref_count.init ();
  256|     11|  obj->header.writable = true;
  257|     11|  obj->header.user_data.init ();
  258|     11|}
hb-font.cc:_ZL15hb_object_traceI9hb_font_tEvPKT_PKc:
  230|     33|{
  231|     33|  DEBUG_MSG (OBJECT, (void *) obj,
  ------------------
  |  |  232|     66|#define DEBUG_MSG(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (232:109): [True: 33, False: 0]
  |  |  ------------------
  ------------------
  232|     33|	     "%s refcount=%d",
  233|     33|	     function,
  234|     33|	     obj ? obj->header.ref_count.get_relaxed () : 0);
  235|     33|}
hb-font.cc:_ZL16hb_object_createI15hb_font_funcs_tJEEPT_DpT0_:
  239|     12|{
  240|     12|  Type *obj = (Type *) hb_calloc (1, sizeof (Type));
  ------------------
  |  |  235|     12|#define hb_calloc hb_calloc_impl
  ------------------
  241|       |
  242|     12|  if (unlikely (!obj))
  ------------------
  |  |  260|     12|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 12]
  |  |  ------------------
  ------------------
  243|      0|    return obj;
  244|       |
  245|     12|  new (obj) Type (std::forward<Ts> (ds)...);
  246|       |
  247|     12|  hb_object_init (obj);
  248|     12|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     12|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  249|       |
  250|     12|  return obj;
  251|     12|}
hb-font.cc:_ZL14hb_object_initI15hb_font_funcs_tEvPT_:
  254|     12|{
  255|     12|  obj->header.ref_count.init ();
  256|     12|  obj->header.writable = true;
  257|     12|  obj->header.user_data.init ();
  258|     12|}
hb-font.cc:_ZL15hb_object_traceI15hb_font_funcs_tEvPKT_PKc:
  230|     79|{
  231|     79|  DEBUG_MSG (OBJECT, (void *) obj,
  ------------------
  |  |  232|    158|#define DEBUG_MSG(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (232:109): [True: 79, False: 0]
  |  |  ------------------
  ------------------
  232|     79|	     "%s refcount=%d",
  233|     79|	     function,
  234|     79|	     obj ? obj->header.ref_count.get_relaxed () : 0);
  235|     79|}
hb-font.cc:_ZL19hb_object_referenceI15hb_font_funcs_tEPT_S2_:
  276|     22|{
  277|     22|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  278|     22|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|     44|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 22]
  |  |  |  Branch (260:47): [True: 0, False: 22]
  |  |  |  Branch (260:47): [True: 0, False: 22]
  |  |  ------------------
  ------------------
  279|      0|    return obj;
  280|     22|  assert (hb_object_is_valid (obj));
  281|      0|  obj->header.ref_count.inc ();
  282|     22|  return obj;
  283|     22|}
hb-font.cc:_ZL18hb_object_is_validI15hb_font_funcs_tEbPKT_:
  261|     56|{
  262|     56|  return likely (obj->header.ref_count.is_valid ());
  ------------------
  |  |  259|     56|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  263|     56|}
hb-font.cc:_ZL17hb_object_destroyI15hb_font_funcs_tEbPT_:
  286|     45|{
  287|     45|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     45|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  288|     45|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|     90|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 34]
  |  |  |  Branch (260:47): [True: 0, False: 45]
  |  |  |  Branch (260:47): [True: 11, False: 34]
  |  |  ------------------
  ------------------
  289|     11|    return false;
  290|     34|  assert (hb_object_is_valid (obj));
  291|     34|  if (obj->header.ref_count.dec () != 1)
  ------------------
  |  Branch (291:7): [True: 22, False: 12]
  ------------------
  292|     22|    return false;
  293|       |
  294|     12|  hb_object_fini (obj);
  295|       |
  296|     12|  if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (296:7): [Folded - Ignored]
  ------------------
  297|      0|    obj->~Type ();
  298|       |
  299|     12|  return true;
  300|     34|}
hb-font.cc:_ZL14hb_object_finiI15hb_font_funcs_tEvPT_:
  303|     12|{
  304|     12|  obj->header.ref_count.fini (); /* Do this before user_data */
  305|     12|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  306|     12|  if (user_data)
  ------------------
  |  Branch (306:7): [True: 0, False: 12]
  ------------------
  307|      0|  {
  308|      0|    user_data->fini ();
  309|      0|    hb_free (user_data);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  310|      0|    obj->header.user_data.set_relaxed (nullptr);
  311|      0|  }
  312|     12|}
hb-font.cc:_ZL22hb_object_is_immutableI15hb_font_funcs_tEbPKT_:
  266|    124|{
  267|    124|  return !obj->header.writable;
  268|    124|}
hb-font.cc:_ZL24hb_object_make_immutableI15hb_font_funcs_tEvPKT_:
  271|      1|{
  272|      1|  obj->header.writable = false;
  273|      1|}
hb-font.cc:_ZL22hb_object_is_immutableI9hb_font_tEbPKT_:
  266|   409k|{
  267|   409k|  return !obj->header.writable;
  268|   409k|}
hb-font.cc:_ZL18hb_object_is_validI9hb_font_tEbPKT_:
  261|     11|{
  262|     11|  return likely (obj->header.ref_count.is_valid ());
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  263|     11|}
hb-font.cc:_ZL17hb_object_destroyI9hb_font_tEbPT_:
  286|     22|{
  287|     22|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  288|     22|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|     44|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 11]
  |  |  |  Branch (260:47): [True: 0, False: 22]
  |  |  |  Branch (260:47): [True: 11, False: 11]
  |  |  ------------------
  ------------------
  289|     11|    return false;
  290|     11|  assert (hb_object_is_valid (obj));
  291|     11|  if (obj->header.ref_count.dec () != 1)
  ------------------
  |  Branch (291:7): [True: 0, False: 11]
  ------------------
  292|      0|    return false;
  293|       |
  294|     11|  hb_object_fini (obj);
  295|       |
  296|     11|  if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (296:7): [Folded - Ignored]
  ------------------
  297|      0|    obj->~Type ();
  298|       |
  299|     11|  return true;
  300|     11|}
hb-font.cc:_ZL14hb_object_finiI9hb_font_tEvPT_:
  303|     11|{
  304|     11|  obj->header.ref_count.fini (); /* Do this before user_data */
  305|     11|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  306|     11|  if (user_data)
  ------------------
  |  Branch (306:7): [True: 0, False: 11]
  ------------------
  307|      0|  {
  308|      0|    user_data->fini ();
  309|      0|    hb_free (user_data);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  310|      0|    obj->header.user_data.set_relaxed (nullptr);
  311|      0|  }
  312|     11|}
hb-ot-font.cc:_ZL14hb_object_finiI12hb_hashmap_tIjjLb1EEEvPT_:
  303|     26|{
  304|     26|  obj->header.ref_count.fini (); /* Do this before user_data */
  305|     26|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  306|     26|  if (user_data)
  ------------------
  |  Branch (306:7): [True: 0, False: 26]
  ------------------
  307|      0|  {
  308|      0|    user_data->fini ();
  309|      0|    hb_free (user_data);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  310|      0|    obj->header.user_data.set_relaxed (nullptr);
  311|      0|  }
  312|     26|}
hb-shape-plan.cc:_ZL22hb_object_is_immutableI11hb_buffer_tEbPKT_:
  266|   204k|{
  267|   204k|  return !obj->header.writable;
  268|   204k|}
hb-shape-plan.cc:_ZL18hb_object_is_validI15hb_shape_plan_tEbPKT_:
  261|   614k|{
  262|   614k|  return likely (obj->header.ref_count.is_valid ());
  ------------------
  |  |  259|   614k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  263|   614k|}
hb-shape-plan.cc:_ZL16hb_object_createI15hb_shape_plan_tJEEPT_DpT0_:
  239|     13|{
  240|     13|  Type *obj = (Type *) hb_calloc (1, sizeof (Type));
  ------------------
  |  |  235|     13|#define hb_calloc hb_calloc_impl
  ------------------
  241|       |
  242|     13|  if (unlikely (!obj))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  243|      0|    return obj;
  244|       |
  245|     13|  new (obj) Type (std::forward<Ts> (ds)...);
  246|       |
  247|     13|  hb_object_init (obj);
  248|     13|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|     13|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  249|       |
  250|     13|  return obj;
  251|     13|}
hb-shape-plan.cc:_ZL14hb_object_initI15hb_shape_plan_tEvPT_:
  254|     13|{
  255|     13|  obj->header.ref_count.init ();
  256|     13|  obj->header.writable = true;
  257|     13|  obj->header.user_data.init ();
  258|     13|}
hb-shape-plan.cc:_ZL15hb_object_traceI15hb_shape_plan_tEvPKT_PKc:
  230|   409k|{
  231|   409k|  DEBUG_MSG (OBJECT, (void *) obj,
  ------------------
  |  |  232|   819k|#define DEBUG_MSG(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (232:109): [True: 409k, False: 0]
  |  |  ------------------
  ------------------
  232|   409k|	     "%s refcount=%d",
  233|   409k|	     function,
  234|   409k|	     obj ? obj->header.ref_count.get_relaxed () : 0);
  235|   409k|}
hb-shape-plan.cc:_ZL19hb_object_referenceI15hb_shape_plan_tEPT_S2_:
  276|   204k|{
  277|   204k|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|   204k|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  278|   204k|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|   409k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  279|      0|    return obj;
  280|   204k|  assert (hb_object_is_valid (obj));
  281|      0|  obj->header.ref_count.inc ();
  282|   204k|  return obj;
  283|   204k|}
hb-shape-plan.cc:_ZL17hb_object_destroyI15hb_shape_plan_tEbPT_:
  286|   204k|{
  287|   204k|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|   204k|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  288|   204k|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|   409k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  289|      0|    return false;
  290|   204k|  assert (hb_object_is_valid (obj));
  291|   204k|  if (obj->header.ref_count.dec () != 1)
  ------------------
  |  Branch (291:7): [True: 204k, False: 13]
  ------------------
  292|   204k|    return false;
  293|       |
  294|     13|  hb_object_fini (obj);
  295|       |
  296|     13|  if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (296:7): [Folded - Ignored]
  ------------------
  297|     13|    obj->~Type ();
  298|       |
  299|     13|  return true;
  300|   204k|}
hb-shape-plan.cc:_ZL14hb_object_finiI15hb_shape_plan_tEvPT_:
  303|     13|{
  304|     13|  obj->header.ref_count.fini (); /* Do this before user_data */
  305|     13|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  306|     13|  if (user_data)
  ------------------
  |  Branch (306:7): [True: 0, False: 13]
  ------------------
  307|      0|  {
  308|      0|    user_data->fini ();
  309|      0|    hb_free (user_data);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  310|      0|    obj->header.user_data.set_relaxed (nullptr);
  311|      0|  }
  312|     13|}
hb-shape-plan.cc:_ZL18hb_object_is_validI9hb_face_tEbPKT_:
  261|   204k|{
  262|   204k|  return likely (obj->header.ref_count.is_valid ());
  ------------------
  |  |  259|   204k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  263|   204k|}
hb-unicode.cc:_ZL16hb_object_createI18hb_unicode_funcs_tJEEPT_DpT0_:
  239|      1|{
  240|      1|  Type *obj = (Type *) hb_calloc (1, sizeof (Type));
  ------------------
  |  |  235|      1|#define hb_calloc hb_calloc_impl
  ------------------
  241|       |
  242|      1|  if (unlikely (!obj))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  243|      0|    return obj;
  244|       |
  245|      1|  new (obj) Type (std::forward<Ts> (ds)...);
  246|       |
  247|      1|  hb_object_init (obj);
  248|      1|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  249|       |
  250|      1|  return obj;
  251|      1|}
hb-unicode.cc:_ZL14hb_object_initI18hb_unicode_funcs_tEvPT_:
  254|      1|{
  255|      1|  obj->header.ref_count.init ();
  256|      1|  obj->header.writable = true;
  257|      1|  obj->header.user_data.init ();
  258|      1|}
hb-unicode.cc:_ZL15hb_object_traceI18hb_unicode_funcs_tEvPKT_PKc:
  230|  1.02M|{
  231|  1.02M|  DEBUG_MSG (OBJECT, (void *) obj,
  ------------------
  |  |  232|  2.04M|#define DEBUG_MSG(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (232:109): [True: 819k, False: 204k]
  |  |  ------------------
  ------------------
  232|  1.02M|	     "%s refcount=%d",
  233|  1.02M|	     function,
  234|  1.02M|	     obj ? obj->header.ref_count.get_relaxed () : 0);
  235|  1.02M|}
hb-unicode.cc:_ZL19hb_object_referenceI18hb_unicode_funcs_tEPT_S2_:
  276|   409k|{
  277|   409k|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|   409k|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  278|   409k|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|   819k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 1, False: 409k]
  |  |  |  Branch (260:47): [True: 0, False: 409k]
  |  |  |  Branch (260:47): [True: 1, False: 409k]
  |  |  ------------------
  ------------------
  279|      1|    return obj;
  280|   409k|  assert (hb_object_is_valid (obj));
  281|      0|  obj->header.ref_count.inc ();
  282|   409k|  return obj;
  283|   409k|}
hb-unicode.cc:_ZL18hb_object_is_validI18hb_unicode_funcs_tEbPKT_:
  261|   819k|{
  262|   819k|  return likely (obj->header.ref_count.is_valid ());
  ------------------
  |  |  259|   819k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  263|   819k|}
hb-unicode.cc:_ZL17hb_object_destroyI18hb_unicode_funcs_tEbPT_:
  286|   614k|{
  287|   614k|  hb_object_trace (obj, HB_FUNC);
  ------------------
  |  |  307|   614k|#define HB_FUNC __PRETTY_FUNCTION__
  ------------------
  288|   614k|  if (unlikely (!obj || obj->header.is_inert ()))
  ------------------
  |  |  260|  1.02M|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 204k, False: 409k]
  |  |  |  Branch (260:47): [True: 204k, False: 409k]
  |  |  |  Branch (260:47): [True: 1, False: 409k]
  |  |  ------------------
  ------------------
  289|   204k|    return false;
  290|   409k|  assert (hb_object_is_valid (obj));
  291|   409k|  if (obj->header.ref_count.dec () != 1)
  ------------------
  |  Branch (291:7): [True: 409k, False: 1]
  ------------------
  292|   409k|    return false;
  293|       |
  294|      1|  hb_object_fini (obj);
  295|       |
  296|      1|  if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (296:7): [Folded - Ignored]
  ------------------
  297|      0|    obj->~Type ();
  298|       |
  299|      1|  return true;
  300|   409k|}
hb-unicode.cc:_ZL14hb_object_finiI18hb_unicode_funcs_tEvPT_:
  303|      1|{
  304|      1|  obj->header.ref_count.fini (); /* Do this before user_data */
  305|      1|  hb_user_data_array_t *user_data = obj->header.user_data.get_acquire ();
  306|      1|  if (user_data)
  ------------------
  |  Branch (306:7): [True: 0, False: 1]
  ------------------
  307|      0|  {
  308|      0|    user_data->fini ();
  309|      0|    hb_free (user_data);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  310|      0|    obj->header.user_data.set_relaxed (nullptr);
  311|      0|  }
  312|      1|}
hb-unicode.cc:_ZL22hb_object_is_immutableI18hb_unicode_funcs_tEbPKT_:
  266|      8|{
  267|      8|  return !obj->header.writable;
  268|      8|}
hb-unicode.cc:_ZL24hb_object_make_immutableI18hb_unicode_funcs_tEvPKT_:
  271|      1|{
  272|      1|  obj->header.writable = false;
  273|      1|}
hb-ot-map.cc:_ZL14hb_object_initI12hb_hashmap_tIjjLb1EEEvPT_:
  254|     26|{
  255|     26|  obj->header.ref_count.init ();
  256|     26|  obj->header.writable = true;
  257|     26|  obj->header.user_data.init ();
  258|     26|}

_ZNK2OT7IntTypeIjLj4EEcvjEv:
   68|   409k|  operator typename std::conditional<std::is_signed<Type>::value, signed, unsigned>::type () const { return v; }
_ZNK2OT7IntTypeItLj2EEcvjEv:
   68|  2.10M|  operator typename std::conditional<std::is_signed<Type>::value, signed, unsigned>::type () const { return v; }
_ZNK2OT15BinSearchHeaderINS_7IntTypeItLj2EEEEcvjEv:
 1002|      4|  operator uint32_t () const { return len; }
_ZNK2OT7IntTypeIhLj1EEcvjEv:
   68|    188|  operator typename std::conditional<std::is_signed<Type>::value, signed, unsigned>::type () const { return v; }
_ZNK2OT7IntTypeIjLj4EE8sanitizeEP21hb_sanitize_context_t:
  106|      1|  {
  107|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  108|      1|    return_trace (c->check_struct (this));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  109|      1|  }
_ZNK2OT15BinSearchHeaderINS_7IntTypeItLj2EEEE8sanitizeEP21hb_sanitize_context_t:
 1005|      4|  {
 1006|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 1007|      4|    return_trace (c->check_struct (this));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1008|      4|  }
_ZNK2OT12FixedVersionINS_7IntTypeItLj2EEEE8sanitizeEP21hb_sanitize_context_t:
  282|     24|  {
  283|     24|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     24|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  284|     24|    return_trace (c->check_struct (this));
  ------------------
  |  |  350|     24|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     24|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  285|     24|  }
_ZNK2OT7IntTypeItLj2EE8sanitizeEP21hb_sanitize_context_t:
  106|  14.5k|  {
  107|  14.5k|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|  14.5k|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  108|  14.5k|    return_trace (c->check_struct (this));
  ------------------
  |  |  350|  14.5k|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|  14.5k|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  109|  14.5k|  }
_ZNK2OT7ArrayOfINS_11HBGlyphID16ENS_7IntTypeItLj2EEEE8sanitizeIJEEEbP21hb_sanitize_context_tDpOT_:
  724|  13.9k|  {
  725|  13.9k|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|  13.9k|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|  13.9k|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|  13.9k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13.9k]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|  13.9k|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|  13.9k|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|  13.9k|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      0|    unsigned int count = len;
  729|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 0, False: 0]
  ------------------
  730|      0|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      0|  }
_ZNK2OT7ArrayOfINS_11HBGlyphID16ENS_7IntTypeItLj2EEEE16sanitize_shallowEP21hb_sanitize_context_t:
  736|  13.9k|  {
  737|  13.9k|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|  13.9k|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|  13.9k|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|  27.9k|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|  13.9k|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 13.9k, False: 0]
  |  |  |  Branch (350:45): [True: 13.9k, False: 0]
  |  |  ------------------
  ------------------
  739|  13.9k|  }
_ZNK2OT7ArrayOfINS_6Layout6Common11RangeRecordINS1_10SmallTypesEEENS_7IntTypeItLj2EEEE8sanitizeIJEEEbP21hb_sanitize_context_tDpOT_:
  724|     35|  {
  725|     35|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     35|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     35|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     35|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 35]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     35|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|     35|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     35|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      0|    unsigned int count = len;
  729|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 0, False: 0]
  ------------------
  730|      0|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      0|  }
_ZNK2OT7ArrayOfINS_6Layout6Common11RangeRecordINS1_10SmallTypesEEENS_7IntTypeItLj2EEEE16sanitize_shallowEP21hb_sanitize_context_t:
  736|     35|  {
  737|     35|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     35|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     35|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     70|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     35|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 35, False: 0]
  |  |  |  Branch (350:45): [True: 35, False: 0]
  |  |  ------------------
  ------------------
  739|     35|  }
_ZNK2OT13SortedArrayOfINS_11HBGlyphID16ENS_7IntTypeItLj2EEEE8as_arrayEv:
  949|      3|  hb_sorted_array_t<const Type> as_array () const { return hb_sorted_array (this->arrayZ, this->len); }
_ZNK2OT13SortedArrayOfINS_6Layout6Common11RangeRecordINS1_10SmallTypesEEENS_7IntTypeItLj2EEEE7bsearchIjEERKS5_RKT_SB_:
  983|      1|  { return *as_array ().bsearch (x, &not_found); }
_ZNK2OT13SortedArrayOfINS_6Layout6Common11RangeRecordINS1_10SmallTypesEEENS_7IntTypeItLj2EEEE8as_arrayEv:
  949|      1|  hb_sorted_array_t<const Type> as_array () const { return hb_sorted_array (this->arrayZ, this->len); }
_ZNK2OT13SortedArrayOfINS_6Layout6Common11RangeRecordINS1_10SmallTypesEEENS_7IntTypeItLj2EEEE5beginEv:
  960|      5|  const Type *begin () const { return this->arrayZ; }
_ZNK2OT13SortedArrayOfINS_6Layout6Common11RangeRecordINS1_10SmallTypesEEENS_7IntTypeItLj2EEEE3endEv:
  961|      5|  const Type *end () const { return this->arrayZ + this->len; }
_ZNK2OT7ArrayOfINS_5IndexENS_7IntTypeItLj2EEEE8as_arrayEv:
  648|     42|  hb_array_t<const Type> as_array () const { return hb_array (arrayZ, len); }
_ZNK2OT7ArrayOfINS_5IndexENS_7IntTypeItLj2EEEE8sanitizeIJEEEbP21hb_sanitize_context_tDpOT_:
  724|     78|  {
  725|     78|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     78|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     78|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     78|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 78]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     78|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|     78|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     78|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      0|    unsigned int count = len;
  729|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 0, False: 0]
  ------------------
  730|      0|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      0|  }
_ZNK2OT7ArrayOfINS_5IndexENS_7IntTypeItLj2EEEE16sanitize_shallowEP21hb_sanitize_context_t:
  736|     78|  {
  737|     78|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     78|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     78|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|    156|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     78|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 78, False: 0]
  |  |  |  Branch (350:45): [True: 78, False: 0]
  |  |  ------------------
  ------------------
  739|     78|  }
_ZNK2OT6OffsetINS_7IntTypeItLj2EEELb1EE7is_nullEv:
  235|  14.9k|  bool is_null () const { return has_null && 0 == *this; }
  ------------------
  |  Branch (235:34): [Folded - Ignored]
  |  Branch (235:46): [True: 194, False: 14.7k]
  ------------------
_ZNK2OT8OffsetToINS_7FeatureENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|     34|  {
  328|     34|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|     34|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 30, False: 4]
  |  |  ------------------
  ------------------
  329|      4|    return StructAtOffset<const Type> (base, *this);
  330|     34|  }
_ZN2OT12_hb_has_nullINS_7FeatureELb1EE8get_nullEv:
  308|     30|  static const Type *get_null () { return &Null (Type); }
  ------------------
  |  |  124|     30|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
_ZNK2OT13SortedArrayOfINS_6RecordINS_7LangSysEEENS_7IntTypeItLj2EEEE8as_arrayEv:
  949|     48|  hb_sorted_array_t<const Type> as_array () const { return hb_sorted_array (this->arrayZ, this->len); }
_ZN2OTplIPKNS_6ScriptELPv0EEERKNS_7LangSysERKT_RKNS_8OffsetToIS5_NS_7IntTypeItLj2EEELb1EEE:
  339|     52|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT8OffsetToINS_7LangSysENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|     52|  {
  328|     52|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|     52|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 48, False: 4]
  |  |  ------------------
  ------------------
  329|      4|    return StructAtOffset<const Type> (base, *this);
  330|     52|  }
_ZN2OT12_hb_has_nullINS_7LangSysELb1EE8get_nullEv:
  308|     48|  static const Type *get_null () { return &Null (Type); }
  ------------------
  |  |  124|     48|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
_ZNK2OT13SortedArrayOfINS_6RecordINS_7LangSysEEENS_7IntTypeItLj2EEEE5bfindIjEEbRKT_Pj14hb_not_found_tj:
  988|     48|  { return as_array ().bfind (x, i, not_found, to_store); }
_ZNK2OT8OffsetToINS_7LangSysENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     28|  {
  432|     28|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     28|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     28|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|    140|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     28|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 28]
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  ------------------
  ------------------
  434|     28|		  (this->is_null () ||
  435|     28|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     28|		   neuter (c)));
  437|     28|  }
_ZNK2OT8OffsetToINS_7LangSysENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     39|  {
  419|     39|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     39|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     39|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     39|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     39|    return_trace (true);
  ------------------
  |  |  350|     39|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     39|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     39|  }
_ZNK2OT7ArrayOfINS_6RecordINS_7LangSysEEENS_7IntTypeItLj2EEEE8sanitizeIJPKNS_6ScriptEEEEbP21hb_sanitize_context_tDpOT_:
  724|     28|  {
  725|     28|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     28|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     28|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     28|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 28]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     28|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|     28|    unsigned int count = len;
  729|     39|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 11, False: 28]
  ------------------
  730|     11|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|     28|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|     28|    return_trace (true);
  ------------------
  |  |  350|     28|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     28|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|     28|  }
_ZNK2OT7ArrayOfINS_6RecordINS_7LangSysEEENS_7IntTypeItLj2EEEE16sanitize_shallowEP21hb_sanitize_context_t:
  736|     28|  {
  737|     28|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     28|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     28|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     56|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     28|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  ------------------
  ------------------
  739|     28|  }
_ZNK2OT8OffsetToINS_7LangSysENS_7IntTypeItLj2EEELb1EE8sanitizeIJPKNS_25Record_sanitize_closure_tEEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     11|  {
  432|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     11|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     55|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 11]
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  434|     11|		  (this->is_null () ||
  435|     11|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     11|		   neuter (c)));
  437|     11|  }
_ZNK2OT13SortedArrayOfINS_6RecordINS_6ScriptEEENS_7IntTypeItLj2EEEE8as_arrayEv:
  949|     98|  hb_sorted_array_t<const Type> as_array () const { return hb_sorted_array (this->arrayZ, this->len); }
_ZNK2OT8OffsetToINS_6ScriptENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|     78|  {
  328|     78|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|     78|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 72, False: 6]
  |  |  ------------------
  ------------------
  329|      6|    return StructAtOffset<const Type> (base, *this);
  330|     78|  }
_ZN2OT12_hb_has_nullINS_6ScriptELb1EE8get_nullEv:
  308|     72|  static const Type *get_null () { return &Null (Type); }
  ------------------
  |  |  124|     72|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
_ZNK2OT7ArrayOfINS_7IntTypeItLj2EEES2_E8get_sizeEv:
  641|     12|  { return len.static_size + len * Type::static_size; }
_ZNK2OT7IntTypeIjLj4EE3cmpIjLPv0EEEiT_:
  101|    110|  {
  102|    110|    Type b = v;
  103|    110|    return a < b ? -1 : a == b ? 0 : +1;
  ------------------
  |  Branch (103:12): [True: 95, False: 15]
  |  Branch (103:25): [True: 2, False: 13]
  ------------------
  104|    110|  }
_ZNK2OT12FixedVersionINS_7IntTypeItLj2EEEE6to_intEv:
  279|   409k|  uint32_t to_int () const { return (major << (sizeof (FixedType) * 8)) + minor; }
_ZNK2OT8OffsetToINS_6Layout6Common8CoverageENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|      9|  {
  328|      9|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|      9|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 9]
  |  |  ------------------
  ------------------
  329|      9|    return StructAtOffset<const Type> (base, *this);
  330|      9|  }
_ZNK2OT8OffsetToINS_6Layout6Common8CoverageENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     52|  {
  432|     52|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     52|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     52|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|    260|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     52|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 52]
  |  |  |  Branch (350:45): [True: 52, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 52, False: 0]
  |  |  ------------------
  ------------------
  434|     52|		  (this->is_null () ||
  435|     52|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     52|		   neuter (c)));
  437|     52|  }
_ZNK2OT8OffsetToINS_6Layout6Common8CoverageENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     52|  {
  419|     52|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     52|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     52|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     52|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 52]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     52|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     52|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 52]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     52|    return_trace (true);
  ------------------
  |  |  350|     52|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     52|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     52|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_8LigGlyphENS_7IntTypeItLj2EEELb1EEES4_E8sanitizeIJPKNS_12LigCaretListEEEEbP21hb_sanitize_context_tDpOT_:
  724|      1|  {
  725|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      1|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      1|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      1|    unsigned int count = len;
  729|      1|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 0, False: 1]
  ------------------
  730|      0|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      1|    return_trace (true);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      1|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_8LigGlyphENS_7IntTypeItLj2EEELb1EEES4_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|      1|  {
  737|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      1|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  739|      1|  }
_ZNK2OT8OffsetToINS_8ClassDefENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      7|  {
  432|      7|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      7|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      7|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     34|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      7|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 6]
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 7, False: 0]
  |  |  ------------------
  ------------------
  434|      7|		  (this->is_null () ||
  435|      7|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      7|		   neuter (c)));
  437|      7|  }
_ZNK2OT8OffsetToINS_8ClassDefENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      7|  {
  419|      7|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      7|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      7|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      7|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 7]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      7|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      7|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 7]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      7|    return_trace (true);
  ------------------
  |  |  350|      7|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      7|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      7|  }
_ZNK2OT8OffsetToINS_10AttachListENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      1|  {
  432|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      1|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  434|      1|		  (this->is_null () ||
  435|      1|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      1|		   neuter (c)));
  437|      1|  }
_ZNK2OT8OffsetToINS_10AttachListENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      1|  {
  419|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      1|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      1|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      1|    return_trace (true);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      1|  }
_ZNK2OT8OffsetToINS_12LigCaretListENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      1|  {
  432|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      1|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|      5|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 1]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  434|      1|		  (this->is_null () ||
  435|      1|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      1|		   neuter (c)));
  437|      1|  }
_ZNK2OT8OffsetToINS_12LigCaretListENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      1|  {
  419|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      1|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      1|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      1|    return_trace (true);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      1|  }
_ZNK2OT8OffsetToINS_8ClassDefENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|      2|  {
  328|      2|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  329|      2|    return StructAtOffset<const Type> (base, *this);
  330|      2|  }
_ZN2OTplIPKNS_4GDEFELPv0EEERKNS_8ClassDefERKT_RKNS_8OffsetToIS5_NS_7IntTypeItLj2EEELb1EEE:
  339|      1|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT7ArrayOfINS_12LookupRecordENS_7IntTypeItLj2EEEE8sanitizeIJEEEbP21hb_sanitize_context_tDpOT_:
  724|      6|  {
  725|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      6|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      6|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      0|    unsigned int count = len;
  729|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 0, False: 0]
  ------------------
  730|      0|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      0|  }
_ZNK2OT7ArrayOfINS_12LookupRecordENS_7IntTypeItLj2EEEE16sanitize_shallowEP21hb_sanitize_context_t:
  736|      6|  {
  737|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      6|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     12|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  ------------------
  ------------------
  739|      6|  }
_ZN2OTplIPKNS_8GSUBGPOSELPv0EEERKNS_18RecordListOfScriptERKT_RKNS_8OffsetToIS5_NS_7IntTypeItLj2EEELb1EEE:
  339|    176|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT8OffsetToINS_18RecordListOfScriptENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|    176|  {
  328|    176|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|    176|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 176]
  |  |  ------------------
  ------------------
  329|    176|    return StructAtOffset<const Type> (base, *this);
  330|    176|  }
_ZN2OTplIPKNS_8GSUBGPOSELPv0EEERKNS_12RecordListOfINS_7FeatureEEERKT_RKNS_8OffsetToIS7_NS_7IntTypeItLj2EEELb1EEE:
  339|     42|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT8OffsetToINS_12RecordListOfINS_7FeatureEEENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|     42|  {
  328|     42|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|     42|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 42]
  |  |  ------------------
  ------------------
  329|     42|    return StructAtOffset<const Type> (base, *this);
  330|     42|  }
_ZN2OTplIPKNS_8GSUBGPOSELPv0EEERKNS_16List16OfOffsetToINS_6LookupENS_7IntTypeItLj2EEEEERKT_RKNS_8OffsetToIS9_S8_Lb1EEE:
  339|     61|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT8OffsetToINS_16List16OfOffsetToINS_6LookupENS_7IntTypeItLj2EEEEES4_Lb1EEclEPKv:
  327|     61|  {
  328|     61|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|     61|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 61]
  |  |  ------------------
  ------------------
  329|     61|    return StructAtOffset<const Type> (base, *this);
  330|     61|  }
_ZNK2OT16List16OfOffsetToINS_6LookupENS_7IntTypeItLj2EEEEixEi:
  762|      5|  {
  763|      5|    unsigned int i = (unsigned int) i_;
  764|      5|    if (unlikely (i >= this->len)) return Null (Type);
  ------------------
  |  |  260|      5|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 5]
  |  |  ------------------
  ------------------
                  if (unlikely (i >= this->len)) return Null (Type);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  765|      5|    _hb_compiler_memory_r_barrier ();
  ------------------
  |  |  121|      5|#define _hb_compiler_memory_r_barrier() asm volatile("": : :"memory")
  ------------------
  766|      5|    return this+this->arrayZ[i];
  767|      5|  }
_ZN2OTplIPKNS_16List16OfOffsetToINS_6LookupENS_7IntTypeItLj2EEEEELPv0EEERKS2_RKT_RKNS_8OffsetToIS2_S4_Lb1EEE:
  339|      5|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT8OffsetToINS_6LookupENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|      5|  {
  328|      5|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|      5|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  329|      5|    return StructAtOffset<const Type> (base, *this);
  330|      5|  }
_ZNK2OT7ArrayOfINS_6RecordINS_6ScriptEEENS_7IntTypeItLj2EEEEixEi:
  626|     78|  {
  627|     78|    unsigned int i = (unsigned int) i_;
  628|     78|    if (unlikely (i >= len)) return Null (Type);
  ------------------
  |  |  260|     78|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 72, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (i >= len)) return Null (Type);
  ------------------
  |  |  124|     72|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  629|      6|    _hb_compiler_memory_r_barrier ();
  ------------------
  |  |  121|      6|#define _hb_compiler_memory_r_barrier() asm volatile("": : :"memory")
  ------------------
  630|      6|    return arrayZ[i];
  631|     78|  }
_ZN2OTplIPKNS_12RecordListOfINS_6ScriptEEELPv0EEERKS2_RKT_RKNS_8OffsetToIS2_NS_7IntTypeItLj2EEELb1EEE:
  339|     78|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT13SortedArrayOfINS_6RecordINS_6ScriptEEENS_7IntTypeItLj2EEEE5bfindIjEEbRKT_Pj14hb_not_found_tj:
  988|     98|  { return as_array ().bfind (x, i, not_found, to_store); }
_ZNK2OT7ArrayOfINS_6RecordINS_7FeatureEEENS_7IntTypeItLj2EEEEixEi:
  626|     42|  {
  627|     42|    unsigned int i = (unsigned int) i_;
  628|     42|    if (unlikely (i >= len)) return Null (Type);
  ------------------
  |  |  260|     42|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 30, False: 12]
  |  |  ------------------
  ------------------
                  if (unlikely (i >= len)) return Null (Type);
  ------------------
  |  |  124|     30|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  629|     12|    _hb_compiler_memory_r_barrier ();
  ------------------
  |  |  121|     12|#define _hb_compiler_memory_r_barrier() asm volatile("": : :"memory")
  ------------------
  630|     12|    return arrayZ[i];
  631|     42|  }
_ZN2OTplIPKNS_12RecordListOfINS_7FeatureEEELPv0EEERKS2_RKT_RKNS_8OffsetToIS2_NS_7IntTypeItLj2EEELb1EEE:
  339|     34|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl6AnchorENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     96|  {
  432|     96|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     96|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     96|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|    480|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     96|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 96]
  |  |  |  Branch (350:45): [True: 96, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 96, False: 0]
  |  |  ------------------
  ------------------
  434|     96|		  (this->is_null () ||
  435|     96|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     96|		   neuter (c)));
  437|     96|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl6AnchorENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     96|  {
  419|     96|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     96|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     96|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     96|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 96]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     96|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     96|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 96]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     96|    return_trace (true);
  ------------------
  |  |  350|     96|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     96|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     96|  }
_ZNK2OT7ArrayOfINS_6Layout9GPOS_impl10MarkRecordENS_7IntTypeItLj2EEEE8sanitizeIJPKNS2_9MarkArrayEEEEbP21hb_sanitize_context_tDpOT_:
  724|      6|  {
  725|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      6|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      6|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      6|    unsigned int count = len;
  729|    102|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 96, False: 6]
  ------------------
  730|     96|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|     96|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 96]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      6|    return_trace (true);
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      6|  }
_ZNK2OT7ArrayOfINS_6Layout9GPOS_impl10MarkRecordENS_7IntTypeItLj2EEEE16sanitize_shallowEP21hb_sanitize_context_t:
  736|      6|  {
  737|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      6|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     12|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  ------------------
  ------------------
  739|      6|  }
_ZN2OTplIPKNS_6Layout9GPOS_impl20MarkBasePosFormat1_2INS1_10SmallTypesEEELPv0EEERKNS1_6Common8CoverageERKT_RKNS_8OffsetToISA_NS_7IntTypeItLj2EEELb1EEE:
  339|      4|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZN2OTplIPKNS_6Layout9GPOS_impl19MarkLigPosFormat1_2INS1_10SmallTypesEEELPv0EEERKNS1_6Common8CoverageERKT_RKNS_8OffsetToISA_NS_7IntTypeItLj2EEELb1EEE:
  339|      1|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZN2OTplIPKNS_6Layout9GPOS_impl20MarkMarkPosFormat1_2INS1_10SmallTypesEEELPv0EEERKNS1_6Common8CoverageERKT_RKNS_8OffsetToISA_NS_7IntTypeItLj2EEELb1EEE:
  339|      1|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT15HeadlessArrayOfINS_7IntTypeItLj2EEES2_E8get_sizeEv:
  821|      6|  { return lenP1.static_size + get_length () * Type::static_size; }
_ZNK2OT15HeadlessArrayOfINS_7IntTypeItLj2EEES2_E10get_lengthEv:
  823|      6|  unsigned get_length () const { return lenP1 ? lenP1 - 1 : 0; }
  ------------------
  |  Branch (823:41): [True: 6, False: 0]
  ------------------
_ZN2OTplIPKNS_21ChainContextFormat2_5INS_6Layout10SmallTypesEEELPv0EEERKNS2_6Common8CoverageERKT_RKNS_8OffsetToIS9_NS_7IntTypeItLj2EEELb1EEE:
  339|      1|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZN2OTplIPKNS_21ChainContextFormat2_5INS_6Layout10SmallTypesEEELPv0EEERKNS_8ClassDefERKT_RKNS_8OffsetToIS8_NS_7IntTypeItLj2EEELb1EEE:
  339|      1|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GPOS_impl17PosLookupSubTableENS_7IntTypeItLj2EEELb1EEES6_EixEi:
  626|      6|  {
  627|      6|    unsigned int i = (unsigned int) i_;
  628|      6|    if (unlikely (i >= len)) return Null (Type);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (i >= len)) return Null (Type);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  629|      6|    _hb_compiler_memory_r_barrier ();
  ------------------
  |  |  121|      6|#define _hb_compiler_memory_r_barrier() asm volatile("": : :"memory")
  ------------------
  630|      6|    return arrayZ[i];
  631|      6|  }
_ZN2OTplIPKNS_6LookupELPv0EEERKNS_6Layout9GPOS_impl17PosLookupSubTableERKT_RKNS_8OffsetToIS7_NS_7IntTypeItLj2EEELb1EEE:
  339|      6|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl17PosLookupSubTableENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|      6|  {
  328|      6|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
  329|      6|    return StructAtOffset<const Type> (base, *this);
  330|      6|  }
_ZNK2OT7ArrayOfINS_6OffsetINS_7IntTypeItLj2EEELb1EEES3_E8sanitizeIJEEEbP21hb_sanitize_context_tDpOT_:
  724|     42|  {
  725|     42|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     42|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     42|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     42|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 42]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     42|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|     42|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     42|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      0|    unsigned int count = len;
  729|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 0, False: 0]
  ------------------
  730|      0|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      0|  }
_ZNK2OT7ArrayOfINS_6OffsetINS_7IntTypeItLj2EEELb1EEES3_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|     42|  {
  737|     42|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     42|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     42|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     84|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     42|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 42, False: 0]
  |  |  |  Branch (350:45): [True: 42, False: 0]
  |  |  ------------------
  ------------------
  739|     42|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GPOS_impl17PosLookupSubTableENS_7IntTypeItLj2EEELb1EEES6_E8sanitizeIJPKNS_6LookupEjEEEbP21hb_sanitize_context_tDpOT_:
  724|      4|  {
  725|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      4|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      4|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      4|    unsigned int count = len;
  729|     11|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 7, False: 4]
  ------------------
  730|      7|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      7|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 7]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      4|    return_trace (true);
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      4|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GPOS_impl17PosLookupSubTableENS_7IntTypeItLj2EEELb1EEES6_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|      4|  {
  737|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      4|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|      8|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  ------------------
  ------------------
  739|      4|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl17PosLookupSubTableENS_7IntTypeItLj2EEELb1EE8sanitizeIJjEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      7|  {
  432|      7|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      7|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      7|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     35|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      7|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 7]
  |  |  |  Branch (350:45): [True: 7, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 7, False: 0]
  |  |  ------------------
  ------------------
  434|      7|		  (this->is_null () ||
  435|      7|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      7|		   neuter (c)));
  437|      7|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl17PosLookupSubTableENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      7|  {
  419|      7|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      7|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      7|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      7|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 7]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      7|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      7|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 7]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      7|    return_trace (true);
  ------------------
  |  |  350|      7|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      7|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      7|  }
_ZNK2OT14UnsizedArrayOfINS_7IntTypeItLj2EEEEcvPKT_IvEEv:
  483|      1|  template <typename T> operator const T * () const { return arrayZ; }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl9MarkArrayENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      6|  {
  432|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      6|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     30|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 6]
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  ------------------
  ------------------
  434|      6|		  (this->is_null () ||
  435|      6|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      6|		   neuter (c)));
  437|      6|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl9MarkArrayENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      6|  {
  419|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      6|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      6|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      6|    return_trace (true);
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      6|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl12AnchorMatrixENS_7IntTypeItLj2EEELb1EE8sanitizeIJjEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      6|  {
  432|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      6|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     30|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 6]
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  ------------------
  ------------------
  434|      6|		  (this->is_null () ||
  435|      6|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      6|		   neuter (c)));
  437|      6|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl12AnchorMatrixENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      6|  {
  419|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      6|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      6|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      6|    return_trace (true);
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      6|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl13LigatureArrayENS_7IntTypeItLj2EEELb1EE8sanitizeIJjEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      1|  {
  432|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      1|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|      5|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 1]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  434|      1|		  (this->is_null () ||
  435|      1|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      1|		   neuter (c)));
  437|      1|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl13LigatureArrayENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      1|  {
  419|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      1|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      1|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      1|    return_trace (true);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      1|  }
_ZNK2OT16List16OfOffsetToINS_6Layout9GPOS_impl12AnchorMatrixENS_7IntTypeItLj2EEEE8sanitizeIJjEEEbP21hb_sanitize_context_tDpOT_:
  789|      1|  {
  790|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  791|      1|    return_trace ((Array16Of<OffsetTo<Type, OffsetType>>::sanitize (c, this, std::forward<Ts> (ds)...)));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  792|      1|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GPOS_impl12AnchorMatrixENS_7IntTypeItLj2EEELb1EEES6_E8sanitizeIJPKNS_16List16OfOffsetToIS4_S6_EEjEEEbP21hb_sanitize_context_tDpOT_:
  724|      1|  {
  725|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      1|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      1|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      1|    unsigned int count = len;
  729|      2|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 1, False: 1]
  ------------------
  730|      1|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      1|    return_trace (true);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      1|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GPOS_impl12AnchorMatrixENS_7IntTypeItLj2EEELb1EEES6_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|      1|  {
  737|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      1|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  739|      1|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_12ChainRuleSetINS_6Layout10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES7_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|      1|  {
  737|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      1|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  739|      1|  }
_ZNK2OT8OffsetToINS_12ChainRuleSetINS_6Layout10SmallTypesEEENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      5|  {
  432|      5|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      5|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      5|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      5|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 3, False: 2]
  |  |  |  Branch (350:45): [True: 2, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 5, False: 0]
  |  |  ------------------
  ------------------
  434|      5|		  (this->is_null () ||
  435|      5|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      5|		   neuter (c)));
  437|      5|  }
_ZNK2OT8OffsetToINS_12ChainRuleSetINS_6Layout10SmallTypesEEENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      5|  {
  419|      5|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      5|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      5|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      5|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 5]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      5|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      5|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 5]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      5|    return_trace (true);
  ------------------
  |  |  350|      5|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      5|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      5|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_9ChainRuleINS_6Layout10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES7_E8sanitizeIJPKNS_12ChainRuleSetIS4_EEEEEbP21hb_sanitize_context_tDpOT_:
  724|      2|  {
  725|      2|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      2|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      2|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      2|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      2|    unsigned int count = len;
  729|      8|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 6, False: 2]
  ------------------
  730|      6|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      2|    return_trace (true);
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      2|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      2|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_9ChainRuleINS_6Layout10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES7_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|      2|  {
  737|      2|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      2|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      2|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      2|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 2, False: 0]
  |  |  |  Branch (350:45): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  739|      2|  }
_ZNK2OT8OffsetToINS_9ChainRuleINS_6Layout10SmallTypesEEENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      6|  {
  432|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      6|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     30|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 6]
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 6, False: 0]
  |  |  ------------------
  ------------------
  434|      6|		  (this->is_null () ||
  435|      6|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      6|		   neuter (c)));
  437|      6|  }
_ZNK2OT8OffsetToINS_9ChainRuleINS_6Layout10SmallTypesEEENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      6|  {
  419|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      6|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      6|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      6|    return_trace (true);
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      6|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_12ChainRuleSetINS_6Layout10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES7_E8sanitizeIJPKNS_21ChainContextFormat2_5IS4_EEEEEbP21hb_sanitize_context_tDpOT_:
  724|      1|  {
  725|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      1|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      1|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      1|    unsigned int count = len;
  729|      6|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 5, False: 1]
  ------------------
  730|      5|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      5|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      1|    return_trace (true);
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      1|  }
_ZNK2OT8OffsetToINS_18RecordListOfScriptENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     22|  {
  432|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     22|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|    110|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 22]
  |  |  |  Branch (350:45): [True: 22, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 22, False: 0]
  |  |  ------------------
  ------------------
  434|     22|		  (this->is_null () ||
  435|     22|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     22|		   neuter (c)));
  437|     22|  }
_ZNK2OT8OffsetToINS_18RecordListOfScriptENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     22|  {
  419|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     22|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 22]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     22|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 22]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     22|    return_trace (true);
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     22|  }
_ZNK2OT7ArrayOfINS_6RecordINS_6ScriptEEENS_7IntTypeItLj2EEEE8sanitizeIJPKNS_12RecordListOfIS2_EEEEEbP21hb_sanitize_context_tDpOT_:
  724|     22|  {
  725|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     22|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 22]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     22|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|     22|    unsigned int count = len;
  729|     50|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 28, False: 22]
  ------------------
  730|     28|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|     28|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 28]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|     22|    return_trace (true);
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|     22|  }
_ZNK2OT7ArrayOfINS_6RecordINS_6ScriptEEENS_7IntTypeItLj2EEEE16sanitize_shallowEP21hb_sanitize_context_t:
  736|     22|  {
  737|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     22|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     44|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 22, False: 0]
  |  |  |  Branch (350:45): [True: 22, False: 0]
  |  |  ------------------
  ------------------
  739|     22|  }
_ZNK2OT8OffsetToINS_6ScriptENS_7IntTypeItLj2EEELb1EE8sanitizeIJPKNS_25Record_sanitize_closure_tEEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     28|  {
  432|     28|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     28|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     28|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|    140|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     28|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 28]
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  ------------------
  ------------------
  434|     28|		  (this->is_null () ||
  435|     28|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     28|		   neuter (c)));
  437|     28|  }
_ZNK2OT8OffsetToINS_6ScriptENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     28|  {
  419|     28|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     28|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     28|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     28|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 28]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     28|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     28|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 28]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     28|    return_trace (true);
  ------------------
  |  |  350|     28|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     28|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     28|  }
_ZNK2OT8OffsetToINS_12RecordListOfINS_7FeatureEEENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     22|  {
  432|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     22|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|    110|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 22]
  |  |  |  Branch (350:45): [True: 22, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 22, False: 0]
  |  |  ------------------
  ------------------
  434|     22|		  (this->is_null () ||
  435|     22|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     22|		   neuter (c)));
  437|     22|  }
_ZNK2OT8OffsetToINS_12RecordListOfINS_7FeatureEEENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     22|  {
  419|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     22|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 22]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     22|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 22]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     22|    return_trace (true);
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     22|  }
_ZNK2OT7ArrayOfINS_6RecordINS_7FeatureEEENS_7IntTypeItLj2EEEE8sanitizeIJPKNS_12RecordListOfIS2_EEEEEbP21hb_sanitize_context_tDpOT_:
  724|     22|  {
  725|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     22|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 22]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     22|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|     22|    unsigned int count = len;
  729|     61|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 39, False: 22]
  ------------------
  730|     39|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|     22|    return_trace (true);
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|     22|  }
_ZNK2OT7ArrayOfINS_6RecordINS_7FeatureEEENS_7IntTypeItLj2EEEE16sanitize_shallowEP21hb_sanitize_context_t:
  736|     22|  {
  737|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     22|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     44|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 22, False: 0]
  |  |  |  Branch (350:45): [True: 22, False: 0]
  |  |  ------------------
  ------------------
  739|     22|  }
_ZNK2OT8OffsetToINS_7FeatureENS_7IntTypeItLj2EEELb1EE8sanitizeIJPKNS_25Record_sanitize_closure_tEEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     39|  {
  432|     39|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     39|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     39|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|    195|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     39|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 39]
  |  |  |  Branch (350:45): [True: 39, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 39, False: 0]
  |  |  ------------------
  ------------------
  434|     39|		  (this->is_null () ||
  435|     39|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     39|		   neuter (c)));
  437|     39|  }
_ZNK2OT8OffsetToINS_7FeatureENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     39|  {
  419|     39|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     39|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     39|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     39|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     39|    return_trace (true);
  ------------------
  |  |  350|     39|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     39|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     39|  }
_ZNK2OT8OffsetToINS_16List16OfOffsetToINS_6Layout9GPOS_impl9PosLookupENS_7IntTypeItLj2EEEEES6_Lb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     11|  {
  432|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     11|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     55|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 11]
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  434|     11|		  (this->is_null () ||
  435|     11|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     11|		   neuter (c)));
  437|     11|  }
_ZNK2OT8OffsetToINS_16List16OfOffsetToINS_6Layout9GPOS_impl9PosLookupENS_7IntTypeItLj2EEEEES6_Lb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     11|  {
  419|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     11|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     11|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     11|    return_trace (true);
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     11|  }
_ZNK2OT16List16OfOffsetToINS_6Layout9GPOS_impl9PosLookupENS_7IntTypeItLj2EEEE8sanitizeIJEEEbP21hb_sanitize_context_tDpOT_:
  789|     11|  {
  790|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  791|     11|    return_trace ((Array16Of<OffsetTo<Type, OffsetType>>::sanitize (c, this, std::forward<Ts> (ds)...)));
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  792|     11|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GPOS_impl9PosLookupENS_7IntTypeItLj2EEELb1EEES6_E8sanitizeIJPKNS_16List16OfOffsetToIS4_S6_EEEEEbP21hb_sanitize_context_tDpOT_:
  724|     11|  {
  725|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     11|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     11|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|     11|    unsigned int count = len;
  729|     15|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 4, False: 11]
  ------------------
  730|      4|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|     11|    return_trace (true);
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|     11|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GPOS_impl9PosLookupENS_7IntTypeItLj2EEELb1EEES6_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|     11|  {
  737|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     11|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  739|     11|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl9PosLookupENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      4|  {
  432|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      4|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     20|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 4]
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  ------------------
  ------------------
  434|      4|		  (this->is_null () ||
  435|      4|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      4|		   neuter (c)));
  437|      4|  }
_ZNK2OT8OffsetToINS_6Layout9GPOS_impl9PosLookupENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      4|  {
  419|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      4|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      4|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      4|    return_trace (true);
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      4|  }
_ZNK2OT7ArrayOfIN3AAT8KernPairENS_15BinSearchHeaderINS_7IntTypeItLj2EEEEEE8sanitizeIJEEEbP21hb_sanitize_context_tDpOT_:
  724|      4|  {
  725|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      4|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      4|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      0|    unsigned int count = len;
  729|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 0, False: 0]
  ------------------
  730|      0|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      0|  }
_ZNK2OT7ArrayOfIN3AAT8KernPairENS_15BinSearchHeaderINS_7IntTypeItLj2EEEEEE16sanitize_shallowEP21hb_sanitize_context_t:
  736|      4|  {
  737|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      4|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|      8|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  |  Branch (350:45): [True: 4, False: 0]
  |  |  ------------------
  ------------------
  739|      4|  }
_ZN2OTplIPKNS_6Layout9GSUB_impl20SingleSubstFormat1_3INS1_10SmallTypesEEELPv0EEERKNS1_6Common8CoverageERKT_RKNS_8OffsetToISA_NS_7IntTypeItLj2EEELb1EEE:
  339|      1|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZN2OTplIPKNS_6Layout9GSUB_impl22LigatureSubstFormat1_2INS1_10SmallTypesEEELPv0EEERKNS1_6Common8CoverageERKT_RKNS_8OffsetToISA_NS_7IntTypeItLj2EEELb1EEE:
  339|      1|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl19SubstLookupSubTableENS_7IntTypeItLj2EEELb1EEES6_E8sanitizeIJPKNS_6LookupEjEEEbP21hb_sanitize_context_tDpOT_:
  724|     38|  {
  725|     38|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     38|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     38|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     38|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|     38|    unsigned int count = len;
  729|     76|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 38, False: 38]
  ------------------
  730|     38|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|     38|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|     38|    return_trace (true);
  ------------------
  |  |  350|     38|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     38|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|     38|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl19SubstLookupSubTableENS_7IntTypeItLj2EEELb1EEES6_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|     38|  {
  737|     38|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     38|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     38|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     76|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     38|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 38, False: 0]
  |  |  |  Branch (350:45): [True: 38, False: 0]
  |  |  ------------------
  ------------------
  739|     38|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl19SubstLookupSubTableENS_7IntTypeItLj2EEELb1EE8sanitizeIJjEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     38|  {
  432|     38|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     38|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     38|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|    190|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     38|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 38]
  |  |  |  Branch (350:45): [True: 38, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 38, False: 0]
  |  |  ------------------
  ------------------
  434|     38|		  (this->is_null () ||
  435|     38|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     38|		   neuter (c)));
  437|     38|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl19SubstLookupSubTableENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     38|  {
  419|     38|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     38|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     38|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     38|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     38|    return_trace (true);
  ------------------
  |  |  350|     38|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     38|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     38|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl12AlternateSetINS2_10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES8_E8sanitizeIJPKNS3_23AlternateSubstFormat1_2IS5_EEEEEbP21hb_sanitize_context_tDpOT_:
  724|     21|  {
  725|     21|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     21|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     21|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     21|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 21]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     21|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|     21|    unsigned int count = len;
  729|  13.9k|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 13.9k, False: 21]
  ------------------
  730|  13.9k|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|  13.9k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13.9k]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|     21|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|     21|    return_trace (true);
  ------------------
  |  |  350|     21|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     21|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|     21|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl12AlternateSetINS2_10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES8_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|     21|  {
  737|     21|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     21|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     21|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     42|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     21|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 21, False: 0]
  |  |  |  Branch (350:45): [True: 21, False: 0]
  |  |  ------------------
  ------------------
  739|     21|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl12AlternateSetINS1_10SmallTypesEEENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|  13.9k|  {
  432|  13.9k|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|  13.9k|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|  13.9k|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|  69.7k|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|  13.9k|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 13.9k]
  |  |  |  Branch (350:45): [True: 13.9k, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 13.9k, False: 0]
  |  |  ------------------
  ------------------
  434|  13.9k|		  (this->is_null () ||
  435|  13.9k|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|  13.9k|		   neuter (c)));
  437|  13.9k|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl12AlternateSetINS1_10SmallTypesEEENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|  13.9k|  {
  419|  13.9k|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|  13.9k|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|  13.9k|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|  13.9k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13.9k]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|  13.9k|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|  13.9k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13.9k]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|  13.9k|    return_trace (true);
  ------------------
  |  |  350|  13.9k|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|  13.9k|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|  13.9k|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl11LigatureSetINS2_10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES8_E8sanitizeIJPKNS3_22LigatureSubstFormat1_2IS5_EEEEEbP21hb_sanitize_context_tDpOT_:
  724|      2|  {
  725|      2|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      2|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      2|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      2|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      2|    unsigned int count = len;
  729|      5|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 3, False: 2]
  ------------------
  730|      3|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      3|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 3]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      2|    return_trace (true);
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      2|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      2|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl11LigatureSetINS2_10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES8_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|      2|  {
  737|      2|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      2|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      2|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      2|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 2, False: 0]
  |  |  |  Branch (350:45): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  739|      2|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl11LigatureSetINS1_10SmallTypesEEENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      3|  {
  432|      3|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      3|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      3|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     15|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      3|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 3]
  |  |  |  Branch (350:45): [True: 3, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 3, False: 0]
  |  |  ------------------
  ------------------
  434|      3|		  (this->is_null () ||
  435|      3|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      3|		   neuter (c)));
  437|      3|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl11LigatureSetINS1_10SmallTypesEEENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      3|  {
  419|      3|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      3|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      3|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      3|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 3]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      3|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      3|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 3]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      3|    return_trace (true);
  ------------------
  |  |  350|      3|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      3|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      3|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl8LigatureINS2_10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES8_E8sanitizeIJPKNS3_11LigatureSetIS5_EEEEEbP21hb_sanitize_context_tDpOT_:
  724|      3|  {
  725|      3|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      3|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|      3|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      3|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 3]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|      3|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|      3|    unsigned int count = len;
  729|     12|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 9, False: 3]
  ------------------
  730|      9|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      9|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 9]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|      3|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|      3|    return_trace (true);
  ------------------
  |  |  350|      3|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      3|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|      3|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl8LigatureINS2_10SmallTypesEEENS_7IntTypeItLj2EEELb1EEES8_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|      3|  {
  737|      3|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      3|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|      3|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      3|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 3, False: 0]
  |  |  |  Branch (350:45): [True: 3, False: 0]
  |  |  ------------------
  ------------------
  739|      3|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl8LigatureINS1_10SmallTypesEEENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|      9|  {
  432|      9|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      9|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|      9|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     45|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      9|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 9]
  |  |  |  Branch (350:45): [True: 9, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 9, False: 0]
  |  |  ------------------
  ------------------
  434|      9|		  (this->is_null () ||
  435|      9|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|      9|		   neuter (c)));
  437|      9|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl8LigatureINS1_10SmallTypesEEENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|      9|  {
  419|      9|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      9|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|      9|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|      9|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 9]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|      9|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|      9|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 9]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|      9|    return_trace (true);
  ------------------
  |  |  350|      9|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      9|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|      9|  }
_ZNK2OT15HeadlessArrayOfINS_11HBGlyphID16ENS_7IntTypeItLj2EEEE8sanitizeIJEEEbP21hb_sanitize_context_tDpOT_:
  865|      9|  {
  866|      9|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      9|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  867|      9|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|      9|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 9]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  868|      9|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      9|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      9|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (868:9): [Folded - Ignored]
  ------------------
  869|      0|    unsigned int count = get_length ();
  870|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (870:30): [True: 0, False: 0]
  ------------------
  871|      0|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  872|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  873|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  874|      0|  }
_ZNK2OT15HeadlessArrayOfINS_11HBGlyphID16ENS_7IntTypeItLj2EEEE16sanitize_shallowEP21hb_sanitize_context_t:
  878|      9|  {
  879|      9|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      9|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  880|      9|    return_trace (lenP1.sanitize (c) &&
  ------------------
  |  |  350|     36|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      9|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 9]
  |  |  |  Branch (350:45): [True: 9, False: 0]
  |  |  |  Branch (350:45): [True: 9, False: 0]
  |  |  ------------------
  ------------------
  881|      9|		  (!lenP1 || c->check_array_sized (arrayZ, lenP1 - 1, sizeof (LenType))));
  882|      9|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl19SubstLookupSubTableENS_7IntTypeItLj2EEELb1EEES6_EixEi:
  626|      2|  {
  627|      2|    unsigned int i = (unsigned int) i_;
  628|      2|    if (unlikely (i >= len)) return Null (Type);
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
                  if (unlikely (i >= len)) return Null (Type);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  629|      2|    _hb_compiler_memory_r_barrier ();
  ------------------
  |  |  121|      2|#define _hb_compiler_memory_r_barrier() asm volatile("": : :"memory")
  ------------------
  630|      2|    return arrayZ[i];
  631|      2|  }
_ZN2OTplIPKNS_6LookupELPv0EEERKNS_6Layout9GSUB_impl19SubstLookupSubTableERKT_RKNS_8OffsetToIS7_NS_7IntTypeItLj2EEELb1EEE:
  339|      2|  friend const Type& operator + (const Base &base, const OffsetTo &offset) { return offset ((const void *) base); }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl19SubstLookupSubTableENS_7IntTypeItLj2EEELb1EEclEPKv:
  327|      2|  {
  328|      2|    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  329|      2|    return StructAtOffset<const Type> (base, *this);
  330|      2|  }
_ZNK2OT8OffsetToINS_16List16OfOffsetToINS_6Layout9GSUB_impl11SubstLookupENS_7IntTypeItLj2EEEEES6_Lb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     11|  {
  432|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     11|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|     55|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 11]
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  434|     11|		  (this->is_null () ||
  435|     11|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     11|		   neuter (c)));
  437|     11|  }
_ZNK2OT8OffsetToINS_16List16OfOffsetToINS_6Layout9GSUB_impl11SubstLookupENS_7IntTypeItLj2EEEEES6_Lb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     11|  {
  419|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     11|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     11|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     11|    return_trace (true);
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     11|  }
_ZNK2OT16List16OfOffsetToINS_6Layout9GSUB_impl11SubstLookupENS_7IntTypeItLj2EEEE8sanitizeIJEEEbP21hb_sanitize_context_tDpOT_:
  789|     11|  {
  790|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  791|     11|    return_trace ((Array16Of<OffsetTo<Type, OffsetType>>::sanitize (c, this, std::forward<Ts> (ds)...)));
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  792|     11|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl11SubstLookupENS_7IntTypeItLj2EEELb1EEES6_E8sanitizeIJPKNS_16List16OfOffsetToIS4_S6_EEEEEbP21hb_sanitize_context_tDpOT_:
  724|     11|  {
  725|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  726|     11|    if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
                  if (unlikely (!sanitize_shallow (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  727|     11|    if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  209|      0|#define hb_is_trivially_copyable(T) std::is_trivially_copyable<T>::value
  |  |  ------------------
  |  |  |  Branch (209:37): [Folded - Ignored]
  |  |  ------------------
  ------------------
                  if (!sizeof... (Ts) && hb_is_trivially_copyable(Type)) return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (727:9): [Folded - Ignored]
  ------------------
  728|     11|    unsigned int count = len;
  729|     49|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (729:30): [True: 38, False: 11]
  ------------------
  730|     38|      if (unlikely (!c->dispatch (arrayZ[i], std::forward<Ts> (ds)...)))
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  ------------------
  ------------------
  731|      0|	return_trace (false);
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  732|     11|    return_trace (true);
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  733|     11|  }
_ZNK2OT7ArrayOfINS_8OffsetToINS_6Layout9GSUB_impl11SubstLookupENS_7IntTypeItLj2EEELb1EEES6_E16sanitize_shallowEP21hb_sanitize_context_t:
  736|     11|  {
  737|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  738|     11|    return_trace (len.sanitize (c) && c->check_array_sized (arrayZ, len, sizeof (LenType)));
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  739|     11|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl11SubstLookupENS_7IntTypeItLj2EEELb1EE8sanitizeIJEEEbP21hb_sanitize_context_tPKvDpOT_:
  431|     38|  {
  432|     38|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     38|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  433|     38|    return_trace (sanitize_shallow (c, base) &&
  ------------------
  |  |  350|    190|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     38|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 38]
  |  |  |  Branch (350:45): [True: 38, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 38, False: 0]
  |  |  ------------------
  ------------------
  434|     38|		  (this->is_null () ||
  435|     38|		   c->dispatch (StructAtOffset<Type> (base, *this), std::forward<Ts> (ds)...) ||
  436|     38|		   neuter (c)));
  437|     38|  }
_ZNK2OT8OffsetToINS_6Layout9GSUB_impl11SubstLookupENS_7IntTypeItLj2EEELb1EE16sanitize_shallowEP21hb_sanitize_context_tPKv:
  418|     38|  {
  419|     38|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     38|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  420|     38|    if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->check_struct (this))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  421|       |    //if (unlikely (this->is_null ())) return_trace (true);
  422|     38|    if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  ------------------
  ------------------
                  if (unlikely ((const char *) base + (unsigned) *this < (const char *) base)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  423|     38|    return_trace (true);
  ------------------
  |  |  350|     38|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     38|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  424|     38|  }

_ZN12hb_ot_face_t5init0EP9hb_face_t:
   47|     11|{
   48|     11|  this->face = face;
   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
   50|     11|#include "hb-ot-face-table-list.hh"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright © 2007,2008,2009  Red Hat, Inc.
  |  |    3|       | * Copyright © 2012,2013  Google, Inc.
  |  |    4|       | * Copyright © 2019, Facebook Inc.
  |  |    5|       | *
  |  |    6|       | *  This is part of HarfBuzz, a text shaping library.
  |  |    7|       | *
  |  |    8|       | * Permission is hereby granted, without written agreement and without
  |  |    9|       | * license or royalty fees, to use, copy, modify, and distribute this
  |  |   10|       | * software and its documentation for any purpose, provided that the
  |  |   11|       | * above copyright notice and the following two paragraphs appear in
  |  |   12|       | * all copies of this software.
  |  |   13|       | *
  |  |   14|       | * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
  |  |   15|       | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
  |  |   16|       | * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
  |  |   17|       | * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
  |  |   18|       | * DAMAGE.
  |  |   19|       | *
  |  |   20|       | * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
  |  |   21|       | * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  |  |   22|       | * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  |  |   23|       | * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  |  |   24|       | * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  |  |   25|       | *
  |  |   26|       | * Red Hat Author(s): Behdad Esfahbod
  |  |   27|       | * Google Author(s): Behdad Esfahbod
  |  |   28|       | * Facebook Author(s): Behdad Esfahbod
  |  |   29|       | */
  |  |   30|       |
  |  |   31|       |#ifndef HB_OT_FACE_TABLE_LIST_HH
  |  |   32|       |#define HB_OT_FACE_TABLE_LIST_HH
  |  |   33|       |#endif /* HB_OT_FACE_TABLE_LIST_HH */ /* Dummy header guards */
  |  |   34|       |
  |  |   35|     11|#ifndef HB_OT_CORE_TABLE
  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |   37|     11|#define _HB_OT_CORE_TABLE_UNDEF
  |  |   38|     11|#endif
  |  |   39|       |
  |  |   40|     11|#ifndef HB_OT_ACCELERATOR
  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |   42|     11|#define _HB_OT_ACCELERATOR_UNDEF
  |  |   43|     11|#endif
  |  |   44|       |
  |  |   45|       |
  |  |   46|       |/* This lists font tables that the hb_face_t will contain and lazily
  |  |   47|       | * load.  Don't add a table unless it's used though.  This is not
  |  |   48|       | * exactly zero-cost. */
  |  |   49|       |
  |  |   50|       |/* v--- Add new tables in the right place here. */
  |  |   51|       |
  |  |   52|       |
  |  |   53|       |/* OpenType fundamentals. */
  |  |   54|     11|HB_OT_CORE_TABLE (OT, head)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   55|     11|HB_OT_CORE_TABLE (OT, maxp)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   56|     11|#if !defined(HB_NO_FACE_COLLECT_UNICODES) || !defined(HB_NO_OT_FONT)
  |  |   57|     11|HB_OT_ACCELERATOR (OT, cmap)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|     11|#endif
  |  |   59|     11|HB_OT_CORE_TABLE (OT, hhea)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|     11|HB_OT_ACCELERATOR (OT, hmtx)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|     11|HB_OT_CORE_TABLE (OT, OS2)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   62|     11|#if !defined(HB_NO_OT_FONT_GLYPH_NAMES) || !defined(HB_NO_METRICS) || !defined(HB_NO_STYLE)
  |  |   63|     11|HB_OT_ACCELERATOR (OT, post)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   64|     11|#endif
  |  |   65|     11|#ifndef HB_NO_NAME
  |  |   66|     11|HB_OT_ACCELERATOR (OT, name)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   67|     11|#endif
  |  |   68|     11|#ifndef HB_NO_STYLE
  |  |   69|     11|HB_OT_CORE_TABLE (OT, STAT)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   70|     11|#endif
  |  |   71|     11|#ifndef HB_NO_META
  |  |   72|     11|HB_OT_ACCELERATOR (OT, meta)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   73|     11|#endif
  |  |   74|       |
  |  |   75|       |/* Vertical layout. */
  |  |   76|     11|#ifndef HB_NO_VERTICAL
  |  |   77|     11|HB_OT_CORE_TABLE (OT, vhea)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   78|     11|HB_OT_ACCELERATOR (OT, vmtx)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   79|     11|HB_OT_CORE_TABLE (OT, VORG)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   80|     11|#endif
  |  |   81|       |
  |  |   82|       |/* TrueType outlines. */
  |  |   83|     11|HB_OT_CORE_TABLE (OT, loca) // Also used to determine number of glyphs
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   84|     11|HB_OT_ACCELERATOR (OT, glyf)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   85|       |
  |  |   86|       |/* CFF outlines. */
  |  |   87|     11|#ifndef HB_NO_CFF
  |  |   88|     11|HB_OT_ACCELERATOR (OT, cff1)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   89|     11|HB_OT_ACCELERATOR (OT, cff2)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   90|     11|#endif
  |  |   91|       |
  |  |   92|       |/* OpenType variations. */
  |  |   93|     11|#ifndef HB_NO_VAR
  |  |   94|     11|HB_OT_CORE_TABLE (OT, fvar)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   95|     11|HB_OT_CORE_TABLE (OT, avar)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|     11|HB_OT_CORE_TABLE (OT, cvar)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   97|     11|HB_OT_ACCELERATOR (OT, gvar)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   98|     11|HB_OT_CORE_TABLE (OT, MVAR)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   99|     11|#endif
  |  |  100|       |
  |  |  101|       |/* Legacy kern. */
  |  |  102|     11|#ifndef HB_NO_OT_KERN
  |  |  103|     11|HB_OT_CORE_TABLE (OT, kern)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  104|     11|#endif
  |  |  105|       |
  |  |  106|       |/* OpenType shaping. */
  |  |  107|     11|#ifndef HB_NO_OT_LAYOUT
  |  |  108|     11|HB_OT_ACCELERATOR (OT, GDEF)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  109|     11|HB_OT_ACCELERATOR (OT, GSUB)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  110|     11|HB_OT_ACCELERATOR (OT, GPOS)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  111|       |//HB_OT_CORE_TABLE (OT, JSTF)
  |  |  112|     11|#endif
  |  |  113|       |
  |  |  114|       |/* OpenType baseline. */
  |  |  115|     11|#ifndef HB_NO_BASE
  |  |  116|     11|HB_OT_CORE_TABLE (OT, BASE)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|     11|#endif
  |  |  118|       |
  |  |  119|       |/* AAT shaping. */
  |  |  120|     11|#ifndef HB_NO_AAT
  |  |  121|     11|HB_OT_TABLE (AAT, morx)
  |  |  ------------------
  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  ------------------
  |  |  122|     11|HB_OT_TABLE (AAT, mort)
  |  |  ------------------
  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  ------------------
  |  |  123|     11|HB_OT_TABLE (AAT, kerx)
  |  |  ------------------
  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  ------------------
  |  |  124|     11|HB_OT_TABLE (AAT, ankr)
  |  |  ------------------
  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  ------------------
  |  |  125|     11|HB_OT_TABLE (AAT, trak)
  |  |  ------------------
  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  ------------------
  |  |  126|     11|HB_OT_TABLE (AAT, ltag)
  |  |  ------------------
  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  ------------------
  |  |  127|     11|HB_OT_TABLE (AAT, feat)
  |  |  ------------------
  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  ------------------
  |  |  128|       |// HB_OT_TABLE (AAT, opbd)
  |  |  129|     11|#endif
  |  |  130|       |
  |  |  131|       |/* OpenType color fonts. */
  |  |  132|     11|#ifndef HB_NO_COLOR
  |  |  133|     11|HB_OT_CORE_TABLE (OT, COLR)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|     11|HB_OT_CORE_TABLE (OT, CPAL)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|     11|HB_OT_ACCELERATOR (OT, CBDT)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|     11|HB_OT_ACCELERATOR (OT, sbix)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|     11|HB_OT_ACCELERATOR (OT, SVG)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|     11|#endif
  |  |  139|       |
  |  |  140|       |/* OpenType math. */
  |  |  141|     11|#ifndef HB_NO_MATH
  |  |  142|     11|HB_OT_CORE_TABLE (OT, MATH)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|     11|#define HB_OT_TABLE(Namespace, Type) Type.init0 ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  143|     11|#endif
  |  |  144|       |
  |  |  145|       |
  |  |  146|     11|#ifdef _HB_OT_ACCELERATOR_UNDEF
  |  |  147|     11|#undef HB_OT_ACCELERATOR
  |  |  148|     11|#endif
  |  |  149|       |
  |  |  150|     11|#ifdef _HB_OT_CORE_TABLE_UNDEF
  |  |  151|     11|#undef HB_OT_CORE_TABLE
  |  |  152|     11|#endif
  ------------------
   51|     11|#undef HB_OT_TABLE
   52|     11|}
_ZN12hb_ot_face_t4finiEv:
   54|     11|{
   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
   56|     11|#include "hb-ot-face-table-list.hh"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright © 2007,2008,2009  Red Hat, Inc.
  |  |    3|       | * Copyright © 2012,2013  Google, Inc.
  |  |    4|       | * Copyright © 2019, Facebook Inc.
  |  |    5|       | *
  |  |    6|       | *  This is part of HarfBuzz, a text shaping library.
  |  |    7|       | *
  |  |    8|       | * Permission is hereby granted, without written agreement and without
  |  |    9|       | * license or royalty fees, to use, copy, modify, and distribute this
  |  |   10|       | * software and its documentation for any purpose, provided that the
  |  |   11|       | * above copyright notice and the following two paragraphs appear in
  |  |   12|       | * all copies of this software.
  |  |   13|       | *
  |  |   14|       | * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
  |  |   15|       | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
  |  |   16|       | * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
  |  |   17|       | * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
  |  |   18|       | * DAMAGE.
  |  |   19|       | *
  |  |   20|       | * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
  |  |   21|       | * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  |  |   22|       | * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  |  |   23|       | * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  |  |   24|       | * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  |  |   25|       | *
  |  |   26|       | * Red Hat Author(s): Behdad Esfahbod
  |  |   27|       | * Google Author(s): Behdad Esfahbod
  |  |   28|       | * Facebook Author(s): Behdad Esfahbod
  |  |   29|       | */
  |  |   30|       |
  |  |   31|       |#ifndef HB_OT_FACE_TABLE_LIST_HH
  |  |   32|       |#define HB_OT_FACE_TABLE_LIST_HH
  |  |   33|       |#endif /* HB_OT_FACE_TABLE_LIST_HH */ /* Dummy header guards */
  |  |   34|       |
  |  |   35|     11|#ifndef HB_OT_CORE_TABLE
  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |   37|     11|#define _HB_OT_CORE_TABLE_UNDEF
  |  |   38|     11|#endif
  |  |   39|       |
  |  |   40|     11|#ifndef HB_OT_ACCELERATOR
  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |   42|     11|#define _HB_OT_ACCELERATOR_UNDEF
  |  |   43|     11|#endif
  |  |   44|       |
  |  |   45|       |
  |  |   46|       |/* This lists font tables that the hb_face_t will contain and lazily
  |  |   47|       | * load.  Don't add a table unless it's used though.  This is not
  |  |   48|       | * exactly zero-cost. */
  |  |   49|       |
  |  |   50|       |/* v--- Add new tables in the right place here. */
  |  |   51|       |
  |  |   52|       |
  |  |   53|       |/* OpenType fundamentals. */
  |  |   54|     11|HB_OT_CORE_TABLE (OT, head)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   55|     11|HB_OT_CORE_TABLE (OT, maxp)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   56|     11|#if !defined(HB_NO_FACE_COLLECT_UNICODES) || !defined(HB_NO_OT_FONT)
  |  |   57|     11|HB_OT_ACCELERATOR (OT, cmap)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|     11|#endif
  |  |   59|     11|HB_OT_CORE_TABLE (OT, hhea)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|     11|HB_OT_ACCELERATOR (OT, hmtx)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|     11|HB_OT_CORE_TABLE (OT, OS2)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   62|     11|#if !defined(HB_NO_OT_FONT_GLYPH_NAMES) || !defined(HB_NO_METRICS) || !defined(HB_NO_STYLE)
  |  |   63|     11|HB_OT_ACCELERATOR (OT, post)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   64|     11|#endif
  |  |   65|     11|#ifndef HB_NO_NAME
  |  |   66|     11|HB_OT_ACCELERATOR (OT, name)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   67|     11|#endif
  |  |   68|     11|#ifndef HB_NO_STYLE
  |  |   69|     11|HB_OT_CORE_TABLE (OT, STAT)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   70|     11|#endif
  |  |   71|     11|#ifndef HB_NO_META
  |  |   72|     11|HB_OT_ACCELERATOR (OT, meta)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   73|     11|#endif
  |  |   74|       |
  |  |   75|       |/* Vertical layout. */
  |  |   76|     11|#ifndef HB_NO_VERTICAL
  |  |   77|     11|HB_OT_CORE_TABLE (OT, vhea)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   78|     11|HB_OT_ACCELERATOR (OT, vmtx)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   79|     11|HB_OT_CORE_TABLE (OT, VORG)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   80|     11|#endif
  |  |   81|       |
  |  |   82|       |/* TrueType outlines. */
  |  |   83|     11|HB_OT_CORE_TABLE (OT, loca) // Also used to determine number of glyphs
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   84|     11|HB_OT_ACCELERATOR (OT, glyf)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   85|       |
  |  |   86|       |/* CFF outlines. */
  |  |   87|     11|#ifndef HB_NO_CFF
  |  |   88|     11|HB_OT_ACCELERATOR (OT, cff1)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   89|     11|HB_OT_ACCELERATOR (OT, cff2)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   90|     11|#endif
  |  |   91|       |
  |  |   92|       |/* OpenType variations. */
  |  |   93|     11|#ifndef HB_NO_VAR
  |  |   94|     11|HB_OT_CORE_TABLE (OT, fvar)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   95|     11|HB_OT_CORE_TABLE (OT, avar)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   96|     11|HB_OT_CORE_TABLE (OT, cvar)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   97|     11|HB_OT_ACCELERATOR (OT, gvar)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   98|     11|HB_OT_CORE_TABLE (OT, MVAR)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   99|     11|#endif
  |  |  100|       |
  |  |  101|       |/* Legacy kern. */
  |  |  102|     11|#ifndef HB_NO_OT_KERN
  |  |  103|     11|HB_OT_CORE_TABLE (OT, kern)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  104|     11|#endif
  |  |  105|       |
  |  |  106|       |/* OpenType shaping. */
  |  |  107|     11|#ifndef HB_NO_OT_LAYOUT
  |  |  108|     11|HB_OT_ACCELERATOR (OT, GDEF)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  109|     11|HB_OT_ACCELERATOR (OT, GSUB)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  110|     11|HB_OT_ACCELERATOR (OT, GPOS)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  111|       |//HB_OT_CORE_TABLE (OT, JSTF)
  |  |  112|     11|#endif
  |  |  113|       |
  |  |  114|       |/* OpenType baseline. */
  |  |  115|     11|#ifndef HB_NO_BASE
  |  |  116|     11|HB_OT_CORE_TABLE (OT, BASE)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|     11|#endif
  |  |  118|       |
  |  |  119|       |/* AAT shaping. */
  |  |  120|     11|#ifndef HB_NO_AAT
  |  |  121|     11|HB_OT_TABLE (AAT, morx)
  |  |  ------------------
  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  ------------------
  |  |  122|     11|HB_OT_TABLE (AAT, mort)
  |  |  ------------------
  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  ------------------
  |  |  123|     11|HB_OT_TABLE (AAT, kerx)
  |  |  ------------------
  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  ------------------
  |  |  124|     11|HB_OT_TABLE (AAT, ankr)
  |  |  ------------------
  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  ------------------
  |  |  125|     11|HB_OT_TABLE (AAT, trak)
  |  |  ------------------
  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  ------------------
  |  |  126|     11|HB_OT_TABLE (AAT, ltag)
  |  |  ------------------
  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  ------------------
  |  |  127|     11|HB_OT_TABLE (AAT, feat)
  |  |  ------------------
  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  ------------------
  |  |  128|       |// HB_OT_TABLE (AAT, opbd)
  |  |  129|     11|#endif
  |  |  130|       |
  |  |  131|       |/* OpenType color fonts. */
  |  |  132|     11|#ifndef HB_NO_COLOR
  |  |  133|     11|HB_OT_CORE_TABLE (OT, COLR)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  134|     11|HB_OT_CORE_TABLE (OT, CPAL)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  135|     11|HB_OT_ACCELERATOR (OT, CBDT)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|     11|HB_OT_ACCELERATOR (OT, sbix)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|     11|HB_OT_ACCELERATOR (OT, SVG)
  |  |  ------------------
  |  |  |  |   41|     11|#define HB_OT_ACCELERATOR(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|     11|#endif
  |  |  139|       |
  |  |  140|       |/* OpenType math. */
  |  |  141|     11|#ifndef HB_NO_MATH
  |  |  142|     11|HB_OT_CORE_TABLE (OT, MATH)
  |  |  ------------------
  |  |  |  |   36|     11|#define HB_OT_CORE_TABLE(Namespace, Type) HB_OT_TABLE (Namespace, Type)
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|     11|#define HB_OT_TABLE(Namespace, Type) Type.fini ();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  143|     11|#endif
  |  |  144|       |
  |  |  145|       |
  |  |  146|     11|#ifdef _HB_OT_ACCELERATOR_UNDEF
  |  |  147|     11|#undef HB_OT_ACCELERATOR
  |  |  148|     11|#endif
  |  |  149|       |
  |  |  150|     11|#ifdef _HB_OT_CORE_TABLE_UNDEF
  |  |  151|     11|#undef HB_OT_CORE_TABLE
  |  |  152|     11|#endif
  ------------------
   57|     11|#undef HB_OT_TABLE
   58|     11|}

hb_ot_font_set_funcs:
  643|     11|{
  644|     11|  hb_ot_font_t *ot_font = _hb_ot_font_create (font);
  645|     11|  if (unlikely (!ot_font))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  646|      0|    return;
  647|       |
  648|     11|  hb_font_set_funcs (font,
  649|     11|		     _hb_ot_get_font_funcs (),
  650|     11|		     ot_font,
  651|     11|		     _hb_ot_font_destroy);
  652|     11|}
hb-ot-font.cc:_ZL18_hb_ot_font_createP9hb_font_t:
   86|     11|{
   87|     11|  hb_ot_font_t *ot_font = (hb_ot_font_t *) hb_calloc (1, sizeof (hb_ot_font_t));
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
   88|     11|  if (unlikely (!ot_font))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
   89|      0|    return nullptr;
   90|       |
   91|     11|  ot_font->ot_face = &font->face->table;
   92|       |
   93|     11|#ifndef HB_NO_OT_FONT_CMAP_CACHE
   94|       |  // retry:
   95|     11|  auto *cmap_cache  = (hb_ot_font_cmap_cache_t *) hb_face_get_user_data (font->face,
   96|     11|									 &hb_ot_font_cmap_cache_user_data_key);
   97|     11|  if (!cmap_cache)
  ------------------
  |  Branch (97:7): [True: 11, False: 0]
  ------------------
   98|     11|  {
   99|     11|    cmap_cache = (hb_ot_font_cmap_cache_t *) hb_malloc (sizeof (hb_ot_font_cmap_cache_t));
  ------------------
  |  |  234|     11|#define hb_malloc hb_malloc_impl
  ------------------
  100|     11|    if (unlikely (!cmap_cache)) goto out;
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  101|     11|    new (cmap_cache) hb_ot_font_cmap_cache_t ();
  102|     11|    if (unlikely (!hb_face_set_user_data (font->face,
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  103|     11|					  &hb_ot_font_cmap_cache_user_data_key,
  104|     11|					  cmap_cache,
  105|     11|					  hb_free,
  106|     11|					  false)))
  107|      0|    {
  108|      0|      hb_free (cmap_cache);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  109|      0|      cmap_cache = nullptr;
  110|       |      /* Normally we would retry here, but that would
  111|       |       * infinite-loop if the face is the empty-face.
  112|       |       * Just let it go and this font will be uncached if it
  113|       |       * happened to collide with another thread creating the
  114|       |       * cache at the same time. */
  115|       |      // goto retry;
  116|      0|    }
  117|     11|  }
  118|     11|  out:
  119|     11|  ot_font->cmap_cache = cmap_cache;
  120|     11|#endif
  121|       |
  122|     11|  return ot_font;
  123|     11|}
hb-ot-font.cc:_ZL21_hb_ot_get_font_funcsv:
  628|     11|{
  629|     11|  return static_ot_funcs.get_unconst ();
  630|     11|}
_ZN30hb_ot_font_funcs_lazy_loader_t6createEv:
  579|      1|  {
  580|      1|    hb_font_funcs_t *funcs = hb_font_funcs_create ();
  581|       |
  582|      1|    hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, nullptr, nullptr);
  583|      1|    hb_font_funcs_set_nominal_glyphs_func (funcs, hb_ot_get_nominal_glyphs, nullptr, nullptr);
  584|      1|    hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, nullptr, nullptr);
  585|       |
  586|      1|    hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, nullptr, nullptr);
  587|      1|    hb_font_funcs_set_glyph_h_advances_func (funcs, hb_ot_get_glyph_h_advances, nullptr, nullptr);
  588|       |    //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, nullptr, nullptr);
  589|       |
  590|      1|#ifndef HB_NO_VERTICAL
  591|      1|    hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, nullptr, nullptr);
  592|      1|    hb_font_funcs_set_glyph_v_advances_func (funcs, hb_ot_get_glyph_v_advances, nullptr, nullptr);
  593|      1|    hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, nullptr, nullptr);
  594|      1|#endif
  595|       |
  596|      1|#ifndef HB_NO_DRAW
  597|      1|    hb_font_funcs_set_draw_glyph_func (funcs, hb_ot_draw_glyph, nullptr, nullptr);
  598|      1|#endif
  599|       |
  600|      1|#ifndef HB_NO_PAINT
  601|      1|    hb_font_funcs_set_paint_glyph_func (funcs, hb_ot_paint_glyph, nullptr, nullptr);
  602|      1|#endif
  603|       |
  604|      1|    hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, nullptr, nullptr);
  605|       |    //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, nullptr, nullptr);
  606|       |
  607|      1|#ifndef HB_NO_OT_FONT_GLYPH_NAMES
  608|      1|    hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, nullptr, nullptr);
  609|      1|    hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, nullptr, nullptr);
  610|      1|#endif
  611|       |
  612|      1|    hb_font_funcs_make_immutable (funcs);
  613|       |
  614|      1|    hb_atexit (free_static_ot_funcs);
  ------------------
  |  |  475|      1|#    define hb_atexit atexit
  ------------------
  615|       |
  616|      1|    return funcs;
  617|      1|  }
hb-ot-font.cc:_ZL20free_static_ot_funcsv:
  622|      1|{
  623|      1|  static_ot_funcs.free_instance ();
  624|      1|}
hb-ot-font.cc:_ZL19_hb_ot_font_destroyPv:
  127|     11|{
  128|     11|  hb_ot_font_t *ot_font = (hb_ot_font_t *) font_data;
  129|       |
  130|     11|  auto *cache = ot_font->advance_cache.get_relaxed ();
  131|     11|  hb_free (cache);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
  132|       |
  133|     11|  hb_free (ot_font);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
  134|     11|}

_ZNK2OT20KernOTSubTableHeader13is_horizontalEv:
  176|     36|  bool     is_horizontal () const { return (coverage & Horizontal); }
_ZNK2OT20KernOTSubTableHeader8sanitizeEP21hb_sanitize_context_t:
  191|      8|  {
  192|      8|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      8|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  193|      8|    return_trace (c->check_struct (this));
  ------------------
  |  |  350|      8|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      8|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  194|      8|  }
_ZNK2OT4kern8has_dataEv:
  283|     13|  bool     has_data () const { return u.version32; }
_ZNK2OT4kern8get_typeEv:
  284|     11|  unsigned get_type () const { return u.major; }
_ZNK2OT4kern17has_state_machineEv:
  287|      1|  {
  288|      1|    switch (get_type ()) {
  289|      1|    case 0: return u.ot.has_state_machine ();
  ------------------
  |  Branch (289:5): [True: 1, False: 0]
  ------------------
  290|      0|#ifndef HB_NO_AAT_SHAPE
  291|      0|    case 1: return u.aat.has_state_machine ();
  ------------------
  |  Branch (291:5): [True: 0, False: 1]
  ------------------
  292|      0|#endif
  293|      0|    default:return false;
  ------------------
  |  Branch (293:5): [True: 0, False: 1]
  ------------------
  294|      1|    }
  295|      1|  }
_ZNK2OT4kern5applyEPN3AAT22hb_aat_apply_context_tE:
  320|      9|  { return dispatch (c); }
_ZNK2OT4kern8sanitizeEP21hb_sanitize_context_t:
  337|      1|  {
  338|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  339|      1|    if (!u.version32.sanitize (c)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (339:9): [True: 0, False: 1]
  ------------------
  340|      1|    return_trace (dispatch (c));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  341|      1|  }
_ZNK2OT12KernSubTableINS_20KernOTSubTableHeaderEE8get_typeEv:
  118|     44|  unsigned int get_type () const { return u.header.format; }
_ZNK2OT12KernSubTableINS_20KernOTSubTableHeaderEE8get_sizeEv:
  117|     74|  unsigned int get_size () const { return u.header.length; }
_ZNK2OT4kern8dispatchIN3AAT22hb_aat_apply_context_tEJEEENT_8return_tEPS4_DpOT0_:
  324|      9|  {
  325|      9|    unsigned int subtable_type = get_type ();
  326|      9|    TRACE_DISPATCH (this, subtable_type);
  ------------------
  |  |  482|      9|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
  327|      9|    switch (subtable_type) {
  328|      9|    case 0:	return_trace (c->dispatch (u.ot, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      9|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      9|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (328:5): [True: 9, False: 0]
  ------------------
  329|      0|#ifndef HB_NO_AAT_SHAPE
  330|      0|    case 1:	return_trace (c->dispatch (u.aat, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (330:5): [True: 0, False: 9]
  ------------------
  331|      0|#endif
  332|      0|    default:	return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (332:5): [True: 0, False: 9]
  ------------------
  333|      9|    }
  334|      9|  }
_ZNK2OT12KernSubTableINS_20KernOTSubTableHeaderEE8dispatchIN3AAT22hb_aat_apply_context_tEJEEENT_8return_tEPS6_DpOT0_:
  131|     36|  {
  132|     36|    unsigned int subtable_type = get_type ();
  133|     36|    TRACE_DISPATCH (this, subtable_type);
  ------------------
  |  |  482|     36|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
  134|     36|    switch (subtable_type) {
  135|     36|    case 0:	return_trace (c->dispatch (u.format0));
  ------------------
  |  |  350|     36|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     36|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (135:5): [True: 36, False: 0]
  ------------------
  136|      0|#ifndef HB_NO_AAT_SHAPE
  137|      0|    case 1:	return_trace (u.header.apple ? c->dispatch (u.format1, std::forward<Ts> (ds)...) : c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (137:5): [True: 0, False: 36]
  ------------------
  138|      0|#endif
  139|      0|    case 2:	return_trace (c->dispatch (u.format2));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (139:5): [True: 0, False: 36]
  ------------------
  140|      0|#ifndef HB_NO_AAT_SHAPE
  141|      0|    case 3:	return_trace (u.header.apple ? c->dispatch (u.format3, std::forward<Ts> (ds)...) : c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (141:5): [True: 0, False: 36]
  ------------------
  142|      0|#endif
  143|      0|    default:	return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (143:5): [True: 0, False: 36]
  ------------------
  144|     36|    }
  145|     36|  }
_ZNK2OT4kern8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS3_DpOT0_:
  324|      1|  {
  325|      1|    unsigned int subtable_type = get_type ();
  326|      1|    TRACE_DISPATCH (this, subtable_type);
  ------------------
  |  |  482|      1|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
  327|      1|    switch (subtable_type) {
  328|      1|    case 0:	return_trace (c->dispatch (u.ot, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (328:5): [True: 1, False: 0]
  ------------------
  329|      0|#ifndef HB_NO_AAT_SHAPE
  330|      0|    case 1:	return_trace (c->dispatch (u.aat, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (330:5): [True: 0, False: 1]
  ------------------
  331|      0|#endif
  332|      0|    default:	return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (332:5): [True: 0, False: 1]
  ------------------
  333|      1|    }
  334|      1|  }
_ZNK2OT12KernSubTableINS_20KernOTSubTableHeaderEE8sanitizeEP21hb_sanitize_context_t:
  148|      4|  {
  149|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  150|      4|    if (unlikely (!u.header.sanitize (c) ||
  ------------------
  |  |  260|     16|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  |  Branch (260:47): [True: 0, False: 4]
  |  |  |  Branch (260:47): [True: 0, False: 4]
  |  |  |  Branch (260:47): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  151|      4|		  u.header.length < u.header.min_size ||
  152|      4|		  !c->check_range (this, u.header.length))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  153|       |
  154|      4|    return_trace (dispatch (c));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  155|      4|  }
_ZNK2OT12KernSubTableINS_20KernOTSubTableHeaderEE8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS5_DpOT0_:
  131|      4|  {
  132|      4|    unsigned int subtable_type = get_type ();
  133|      4|    TRACE_DISPATCH (this, subtable_type);
  ------------------
  |  |  482|      4|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
  134|      4|    switch (subtable_type) {
  135|      4|    case 0:	return_trace (c->dispatch (u.format0));
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (135:5): [True: 4, False: 0]
  ------------------
  136|      0|#ifndef HB_NO_AAT_SHAPE
  137|      0|    case 1:	return_trace (u.header.apple ? c->dispatch (u.format1, std::forward<Ts> (ds)...) : c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (137:5): [True: 0, False: 4]
  ------------------
  138|      0|#endif
  139|      0|    case 2:	return_trace (c->dispatch (u.format2));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (139:5): [True: 0, False: 4]
  ------------------
  140|      0|#ifndef HB_NO_AAT_SHAPE
  141|      0|    case 3:	return_trace (u.header.apple ? c->dispatch (u.format3, std::forward<Ts> (ds)...) : c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (141:5): [True: 0, False: 4]
  ------------------
  142|      0|#endif
  143|      0|    default:	return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (143:5): [True: 0, False: 4]
  ------------------
  144|      4|    }
  145|      4|  }

_ZNK2OT10IndexArray11get_indexesEjPjS1_:
  445|     68|  {
  446|     68|    if (_count)
  ------------------
  |  Branch (446:9): [True: 42, False: 26]
  ------------------
  447|     42|    {
  448|     42|      + this->as_array ().sub_array (start_offset, _count)
  449|     42|      | hb_sink (hb_array (_indexes, *_count))
  450|     42|      ;
  451|     42|    }
  452|     68|    return this->len;
  453|     68|  }
_ZNK2OT7Feature18get_lookup_indexesEjPjS1_:
  791|     34|  { return lookupIndex.get_indexes (start_index, lookup_count, lookup_tags); }
_ZNK2OT7Feature8sanitizeEP21hb_sanitize_context_tPKNS_25Record_sanitize_closure_tE:
  831|     39|  {
  832|     39|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     39|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  833|     39|    if (unlikely (!(c->check_struct (this) && lookupIndex.sanitize (c))))
  ------------------
  |  |  260|     78|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  |  Branch (260:47): [True: 39, False: 0]
  |  |  |  Branch (260:47): [True: 39, False: 0]
  |  |  ------------------
  ------------------
  834|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  835|       |
  836|       |    /* Some earlier versions of Adobe tools calculated the offset of the
  837|       |     * FeatureParams subtable from the beginning of the FeatureList table!
  838|       |     *
  839|       |     * If sanitizing "failed" for the FeatureParams subtable, try it with the
  840|       |     * alternative location.  We would know sanitize "failed" if old value
  841|       |     * of the offset was non-zero, but it's zeroed now.
  842|       |     *
  843|       |     * Only do this for the 'size' feature, since at the time of the faulty
  844|       |     * Adobe tools, only the 'size' feature had FeatureParams defined.
  845|       |     */
  846|       |
  847|     39|    if (likely (featureParams.is_null ()))
  ------------------
  |  |  259|     39|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 39, False: 0]
  |  |  ------------------
  ------------------
  848|     39|      return_trace (true);
  ------------------
  |  |  350|     39|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     39|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  849|       |
  850|      0|    unsigned int orig_offset = featureParams;
  851|      0|    if (unlikely (!featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  852|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  853|       |
  854|      0|    if (featureParams == 0 && closure &&
  ------------------
  |  Branch (854:9): [True: 0, False: 0]
  |  Branch (854:31): [True: 0, False: 0]
  ------------------
  855|      0|	closure->tag == HB_TAG ('s','i','z','e') &&
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (855:2): [True: 0, False: 0]
  ------------------
  856|      0|	closure->list_base && closure->list_base < this)
  ------------------
  |  Branch (856:2): [True: 0, False: 0]
  |  Branch (856:24): [True: 0, False: 0]
  ------------------
  857|      0|    {
  858|      0|      unsigned int new_offset_int = orig_offset -
  859|      0|				    (((char *) this) - ((char *) closure->list_base));
  860|       |
  861|      0|      Offset16To<FeatureParams> new_offset;
  862|       |      /* Check that it would not overflow. */
  863|      0|      new_offset = new_offset_int;
  864|      0|      if (new_offset == new_offset_int &&
  ------------------
  |  Branch (864:11): [True: 0, False: 0]
  |  Branch (864:11): [True: 0, False: 0]
  ------------------
  865|      0|	  c->try_set (&featureParams, new_offset_int) &&
  ------------------
  |  Branch (865:4): [True: 0, False: 0]
  ------------------
  866|      0|	  !featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE))
  ------------------
  |  |  197|      0|#define HB_TAG_NONE HB_TAG(0,0,0,0)
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (866:4): [True: 0, False: 0]
  |  Branch (866:38): [True: 0, False: 0]
  ------------------
  867|      0|	return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  868|      0|    }
  869|       |
  870|      0|    return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  871|      0|  }
_ZNK2OT7LangSys19get_feature_indexesEjPjS1_:
 1018|     34|  { return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); }
_ZNK2OT7LangSys20has_required_featureEv:
 1022|     26|  bool has_required_feature () const { return reqFeatureIndex != 0xFFFFu; }
_ZNK2OT7LangSys26get_required_feature_indexEv:
 1024|     26|  {
 1025|     26|    if (reqFeatureIndex == 0xFFFFu)
  ------------------
  |  Branch (1025:9): [True: 26, False: 0]
  ------------------
 1026|     26|      return Index::NOT_FOUND_INDEX;
 1027|      0|   return reqFeatureIndex;
 1028|     26|  }
_ZNK2OT7LangSys8sanitizeEP21hb_sanitize_context_tPKNS_25Record_sanitize_closure_tE:
 1105|     39|  {
 1106|     39|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     39|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 1107|     39|    return_trace (c->check_struct (this) && featureIndex.sanitize (c));
  ------------------
  |  |  350|     78|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     39|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 39, False: 0]
  |  |  |  Branch (350:45): [True: 39, False: 0]
  |  |  ------------------
  ------------------
 1108|     39|  }
_ZNK2OT6Script12get_lang_sysEj:
 1132|     52|  {
 1133|     52|    if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys ();
  ------------------
  |  Branch (1133:9): [True: 52, False: 0]
  ------------------
 1134|      0|    return this+langSys[i].offset;
 1135|     52|  }
_ZNK2OT6Script19find_lang_sys_indexEjPj:
 1137|     48|  { return langSys.find_index (tag, index); }
_ZNK2OT6Script20get_default_lang_sysEv:
 1140|     52|  const LangSys& get_default_lang_sys () const { return this+defaultLangSys; }
_ZNK2OT6Script8sanitizeEP21hb_sanitize_context_tPKNS_25Record_sanitize_closure_tE:
 1230|     28|  {
 1231|     28|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     28|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 1232|     28|    return_trace (defaultLangSys.sanitize (c, this) && langSys.sanitize (c, this));
  ------------------
  |  |  350|     56|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     28|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  ------------------
  ------------------
 1233|     28|  }
_ZNK2OT6Lookup18get_subtable_countEv:
 1295|     52|  unsigned int get_subtable_count () const { return subTable.len; }
_ZNK2OT6Lookup8get_typeEv:
 1319|     89|  unsigned int get_type () const { return lookupType; }
_ZNK2OT8ClassDef9get_classEj:
 2058|    180|  {
 2059|    180|    switch (u.format) {
 2060|      0|    case 1: return u.format1.get_class (glyph_id);
  ------------------
  |  Branch (2060:5): [True: 0, False: 180]
  ------------------
 2061|      1|    case 2: return u.format2.get_class (glyph_id);
  ------------------
  |  Branch (2061:5): [True: 1, False: 179]
  ------------------
 2062|       |#ifndef HB_NO_BEYOND_64K
 2063|       |    case 3: return u.format3.get_class (glyph_id);
 2064|       |    case 4: return u.format4.get_class (glyph_id);
 2065|       |#endif
 2066|    179|    default:return 0;
  ------------------
  |  Branch (2066:5): [True: 179, False: 1]
  ------------------
 2067|    180|    }
 2068|    180|  }
_ZNK2OT8ClassDef8sanitizeEP21hb_sanitize_context_t:
 2168|      6|  {
 2169|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 2170|      6|    if (!u.format.sanitize (c)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (2170:9): [True: 0, False: 6]
  ------------------
 2171|      6|    switch (u.format) {
 2172|      0|    case 1: return_trace (u.format1.sanitize (c));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (2172:5): [True: 0, False: 6]
  ------------------
 2173|      6|    case 2: return_trace (u.format2.sanitize (c));
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (2173:5): [True: 6, False: 0]
  ------------------
 2174|       |#ifndef HB_NO_BEYOND_64K
 2175|       |    case 3: return_trace (u.format3.sanitize (c));
 2176|       |    case 4: return_trace (u.format4.sanitize (c));
 2177|       |#endif
 2178|      0|    default:return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (2178:5): [True: 0, False: 6]
  ------------------
 2179|      6|    }
 2180|      6|  }
_ZNK2OT8ClassDef4costEv:
 2183|      1|  {
 2184|      1|    switch (u.format) {
 2185|      0|    case 1: return u.format1.cost ();
  ------------------
  |  Branch (2185:5): [True: 0, False: 1]
  ------------------
 2186|      1|    case 2: return u.format2.cost ();
  ------------------
  |  Branch (2186:5): [True: 1, False: 0]
  ------------------
 2187|       |#ifndef HB_NO_BEYOND_64K
 2188|       |    case 3: return u.format3.cost ();
 2189|       |    case 4: return u.format4.cost ();
 2190|       |#endif
 2191|      0|    default:return 0u;
  ------------------
  |  Branch (2191:5): [True: 0, False: 1]
  ------------------
 2192|      1|    }
 2193|      1|  }
_ZN2OT14VariationStore13destroy_cacheEPf:
 3044|   409k|  static void destroy_cache (cache_t *cache) { hb_free (cache); }
  ------------------
  |  |  237|   409k|#define hb_free hb_free_impl
  ------------------
_ZNK2OT17FeatureVariations10find_indexEPKijPj:
 3752|   409k|  {
 3753|   409k|    unsigned int count = varRecords.len;
 3754|   409k|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (3754:30): [True: 0, False: 409k]
  ------------------
 3755|      0|    {
 3756|      0|      const FeatureVariationRecord &record = varRecords.arrayZ[i];
 3757|      0|      if ((this+record.conditions).evaluate (coords, coord_len))
  ------------------
  |  Branch (3757:11): [True: 0, False: 0]
  ------------------
 3758|      0|      {
 3759|      0|	*index = i;
 3760|      0|	return true;
 3761|      0|      }
 3762|      0|    }
 3763|   409k|    *index = NOT_FOUND_INDEX;
 3764|   409k|    return false;
 3765|   409k|  }
_ZNK2OT13RecordArrayOfINS_7LangSysEE10find_indexEjPj:
  949|     48|  {
  950|     48|    return this->bfind (tag, index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
  951|     48|  }
_ZNK2OT6RecordINS_7LangSysEE3cmpEj:
  886|      8|  int cmp (hb_tag_t a) const { return tag.cmp (a); }
_ZNK2OT6RecordINS_7LangSysEE8sanitizeEP21hb_sanitize_context_tPKv:
  912|     11|  {
  913|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  914|     11|    const Record_sanitize_closure_t closure = {tag, base};
  915|     11|    return_trace (c->check_struct (this) && offset.sanitize (c, base, &closure));
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  |  Branch (350:45): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  916|     11|  }
_ZNK2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE9get_classEj:
 1751|      1|  {
 1752|      1|    return rangeRecord.bsearch (glyph_id).value;
 1753|      1|  }
_ZNK2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
 1892|      6|  {
 1893|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 1894|      6|    return_trace (rangeRecord.sanitize (c));
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1895|      6|  }
_ZNK2OT17ClassDefFormat2_4INS_6Layout10SmallTypesEE4costEv:
 1897|      1|  unsigned cost () const { return hb_bit_storage ((unsigned) rangeRecord.len); /* bsearch cost */ }
_ZNK2OT12RecordListOfINS_6ScriptEEixEj:
  958|     78|  { return this+this->get_offset (i); }
_ZNK2OT13RecordArrayOfINS_6ScriptEE10get_offsetEj:
  930|     78|  { return (*this)[i].offset; }
_ZNK2OT13RecordArrayOfINS_6ScriptEE10find_indexEjPj:
  949|     98|  {
  950|     98|    return this->bfind (tag, index, HB_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
  951|     98|  }
_ZNK2OT6RecordINS_6ScriptEE3cmpEj:
  886|    102|  int cmp (hb_tag_t a) const { return tag.cmp (a); }
_ZNK2OT13RecordArrayOfINS_7FeatureEE7get_tagEj:
  934|      8|  { return (*this)[i].tag; }
_ZNK2OT12RecordListOfINS_7FeatureEEixEj:
  958|     34|  { return this+this->get_offset (i); }
_ZNK2OT13RecordArrayOfINS_7FeatureEE10get_offsetEj:
  930|     34|  { return (*this)[i].offset; }
_ZNK2OT6Lookup12get_subtableINS_6Layout9GPOS_impl17PosLookupSubTableEEERKT_j:
 1306|      6|  { return this+get_subtables<TSubTable> ()[i]; }
_ZNK2OT6Lookup13get_subtablesINS_6Layout9GPOS_impl17PosLookupSubTableEEERKNS_7ArrayOfINS_8OffsetToIT_NS_7IntTypeItLj2EEELb1EEES9_EEv:
 1299|     10|  { return reinterpret_cast<const Array16OfOffset16To<TSubTable> &> (subTable); }
_ZNK2OT6Lookup8sanitizeINS_6Layout9GPOS_impl17PosLookupSubTableEEEbP21hb_sanitize_context_t:
 1403|      4|  {
 1404|      4|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      4|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 1405|      4|    if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (1405:11): [True: 4, False: 0]
  |  Branch (1405:37): [True: 4, False: 0]
  ------------------
 1406|       |
 1407|      4|    unsigned subtables = get_subtable_count ();
 1408|      4|    if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1409|       |
 1410|      4|    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
  ------------------
  |  Branch (1410:9): [True: 0, False: 4]
  ------------------
 1411|      0|    {
 1412|      0|      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
 1413|      0|      if (!markFilteringSet.sanitize (c)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (1413:11): [True: 0, False: 0]
  ------------------
 1414|      0|    }
 1415|       |
 1416|      4|    if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1417|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1418|       |
 1419|      4|    if (unlikely (get_type () == TSubTable::Extension && !c->get_edit_count ()))
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  |  Branch (260:47): [True: 0, False: 4]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1420|      0|    {
 1421|       |      /* The spec says all subtables of an Extension lookup should
 1422|       |       * have the same type, which shall not be the Extension type
 1423|       |       * itself (but we already checked for that).
 1424|       |       * This is specially important if one has a reverse type!
 1425|       |       *
 1426|       |       * We only do this if sanitizer edit_count is zero.  Otherwise,
 1427|       |       * some of the subtables might have become insane after they
 1428|       |       * were sanity-checked by the edits of subsequent subtables.
 1429|       |       * https://bugs.chromium.org/p/chromium/issues/detail?id=960331
 1430|       |       */
 1431|      0|      unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
 1432|      0|      for (unsigned int i = 1; i < subtables; i++)
  ------------------
  |  Branch (1432:32): [True: 0, False: 0]
  ------------------
 1433|      0|	if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
  ------------------
  |  Branch (1433:6): [True: 0, False: 0]
  ------------------
 1434|      0|	  return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1435|      0|    }
 1436|      4|    return_trace (true);
  ------------------
  |  |  350|      4|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      4|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1437|      4|  }
_ZNK2OT12RecordListOfINS_6ScriptEE8sanitizeEP21hb_sanitize_context_t:
  974|     22|  {
  975|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  976|     22|    return_trace (RecordArrayOf<Type>::sanitize (c, this));
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  977|     22|  }
_ZNK2OT6RecordINS_6ScriptEE8sanitizeEP21hb_sanitize_context_tPKv:
  912|     28|  {
  913|     28|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     28|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  914|     28|    const Record_sanitize_closure_t closure = {tag, base};
  915|     28|    return_trace (c->check_struct (this) && offset.sanitize (c, base, &closure));
  ------------------
  |  |  350|     56|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     28|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  |  Branch (350:45): [True: 28, False: 0]
  |  |  ------------------
  ------------------
  916|     28|  }
_ZNK2OT12RecordListOfINS_7FeatureEE8sanitizeEP21hb_sanitize_context_t:
  974|     22|  {
  975|     22|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     22|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  976|     22|    return_trace (RecordArrayOf<Type>::sanitize (c, this));
  ------------------
  |  |  350|     22|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     22|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  977|     22|  }
_ZNK2OT6RecordINS_7FeatureEE8sanitizeEP21hb_sanitize_context_tPKv:
  912|     39|  {
  913|     39|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     39|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
  914|     39|    const Record_sanitize_closure_t closure = {tag, base};
  915|     39|    return_trace (c->check_struct (this) && offset.sanitize (c, base, &closure));
  ------------------
  |  |  350|     78|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     39|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 39, False: 0]
  |  |  |  Branch (350:45): [True: 39, False: 0]
  |  |  ------------------
  ------------------
  916|     39|  }
_ZNK2OT6Lookup8dispatchINS_6Layout9GPOS_impl17PosLookupSubTableENS_33hb_accelerate_subtables_context_tEJEEENT0_8return_tEPS6_DpOT1_:
 1337|      3|  {
 1338|      3|    unsigned int lookup_type = get_type ();
 1339|      3|    TRACE_DISPATCH (this, lookup_type);
  ------------------
  |  |  482|      3|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
 1340|      3|    unsigned int count = get_subtable_count ();
 1341|      9|    for (unsigned int i = 0; i < count; i++) {
  ------------------
  |  Branch (1341:30): [True: 6, False: 3]
  ------------------
 1342|      6|      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, std::forward<Ts> (ds)...);
 1343|      6|      if (c->stop_sublookup_iteration (r))
  ------------------
  |  Branch (1343:11): [True: 0, False: 6]
  ------------------
 1344|      0|	return_trace (r);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1345|      6|    }
 1346|      3|    return_trace (c->default_return_value ());
  ------------------
  |  |  350|      3|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      3|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1347|      3|  }
_ZNK2OT6Lookup8sanitizeINS_6Layout9GSUB_impl19SubstLookupSubTableEEEbP21hb_sanitize_context_t:
 1403|     38|  {
 1404|     38|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     38|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 1405|     38|    if (!(c->check_struct (this) && subTable.sanitize (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (1405:11): [True: 38, False: 0]
  |  Branch (1405:37): [True: 38, False: 0]
  ------------------
 1406|       |
 1407|     38|    unsigned subtables = get_subtable_count ();
 1408|     38|    if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  ------------------
  ------------------
                  if (unlikely (!c->visit_subtables (subtables))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1409|       |
 1410|     38|    if (lookupFlag & LookupFlag::UseMarkFilteringSet)
  ------------------
  |  Branch (1410:9): [True: 0, False: 38]
  ------------------
 1411|      0|    {
 1412|      0|      const HBUINT16 &markFilteringSet = StructAfter<HBUINT16> (subTable);
 1413|      0|      if (!markFilteringSet.sanitize (c)) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (1413:11): [True: 0, False: 0]
  ------------------
 1414|      0|    }
 1415|       |
 1416|     38|    if (unlikely (!get_subtables<TSubTable> ().sanitize (c, this, get_type ())))
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  ------------------
  ------------------
 1417|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1418|       |
 1419|     38|    if (unlikely (get_type () == TSubTable::Extension && !c->get_edit_count ()))
  ------------------
  |  |  260|     38|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 38]
  |  |  |  Branch (260:47): [True: 0, False: 38]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1420|      0|    {
 1421|       |      /* The spec says all subtables of an Extension lookup should
 1422|       |       * have the same type, which shall not be the Extension type
 1423|       |       * itself (but we already checked for that).
 1424|       |       * This is specially important if one has a reverse type!
 1425|       |       *
 1426|       |       * We only do this if sanitizer edit_count is zero.  Otherwise,
 1427|       |       * some of the subtables might have become insane after they
 1428|       |       * were sanity-checked by the edits of subsequent subtables.
 1429|       |       * https://bugs.chromium.org/p/chromium/issues/detail?id=960331
 1430|       |       */
 1431|      0|      unsigned int type = get_subtable<TSubTable> (0).u.extension.get_type ();
 1432|      0|      for (unsigned int i = 1; i < subtables; i++)
  ------------------
  |  Branch (1432:32): [True: 0, False: 0]
  ------------------
 1433|      0|	if (get_subtable<TSubTable> (i).u.extension.get_type () != type)
  ------------------
  |  Branch (1433:6): [True: 0, False: 0]
  ------------------
 1434|      0|	  return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1435|      0|    }
 1436|     38|    return_trace (true);
  ------------------
  |  |  350|     38|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     38|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1437|     38|  }
_ZNK2OT6Lookup13get_subtablesINS_6Layout9GSUB_impl19SubstLookupSubTableEEERKNS_7ArrayOfINS_8OffsetToIT_NS_7IntTypeItLj2EEELb1EEES9_EEv:
 1299|     40|  { return reinterpret_cast<const Array16OfOffset16To<TSubTable> &> (subTable); }
_ZNK2OT6Lookup12get_subtableINS_6Layout9GSUB_impl19SubstLookupSubTableEEERKT_j:
 1306|      2|  { return this+get_subtables<TSubTable> ()[i]; }
_ZNK2OT6Lookup8dispatchINS_6Layout9GSUB_impl19SubstLookupSubTableENS_33hb_accelerate_subtables_context_tEJEEENT0_8return_tEPS6_DpOT1_:
 1337|      2|  {
 1338|      2|    unsigned int lookup_type = get_type ();
 1339|      2|    TRACE_DISPATCH (this, lookup_type);
  ------------------
  |  |  482|      2|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
 1340|      2|    unsigned int count = get_subtable_count ();
 1341|      4|    for (unsigned int i = 0; i < count; i++) {
  ------------------
  |  Branch (1341:30): [True: 2, False: 2]
  ------------------
 1342|      2|      typename context_t::return_t r = get_subtable<TSubTable> (i).dispatch (c, lookup_type, std::forward<Ts> (ds)...);
 1343|      2|      if (c->stop_sublookup_iteration (r))
  ------------------
  |  Branch (1343:11): [True: 0, False: 2]
  ------------------
 1344|      0|	return_trace (r);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1345|      2|    }
 1346|      2|    return_trace (c->default_return_value ());
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      2|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 1347|      2|  }

_ZN2OT8GSUBGPOS13accelerator_tINS_6Layout4GSUBEED2Ev:
 4773|     11|    {
 4774|     49|      for (unsigned int i = 0; i < this->lookup_count; i++)
  ------------------
  |  Branch (4774:32): [True: 38, False: 11]
  ------------------
 4775|     38|	hb_free (this->accels[i]);
  ------------------
  |  |  237|     38|#define hb_free hb_free_impl
  ------------------
 4776|     11|      hb_free (this->accels);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
 4777|     11|      this->table.destroy ();
 4778|     11|    }
_ZN2OT8GSUBGPOS13accelerator_tINS_6Layout4GPOSEED2Ev:
 4773|     11|    {
 4774|     15|      for (unsigned int i = 0; i < this->lookup_count; i++)
  ------------------
  |  Branch (4774:32): [True: 4, False: 11]
  ------------------
 4775|      4|	hb_free (this->accels[i]);
  ------------------
  |  |  237|      4|#define hb_free hb_free_impl
  ------------------
 4776|     11|      hb_free (this->accels);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
 4777|     11|      this->table.destroy ();
 4778|     11|    }
_ZN2OT21hb_ot_apply_context_t9matcher_t15set_ignore_zwnjEb:
  407|   819k|    void set_ignore_zwnj (bool ignore_zwnj_) { ignore_zwnj = ignore_zwnj_; }
_ZN2OT21hb_ot_apply_context_t9matcher_t14set_ignore_zwjEb:
  408|   819k|    void set_ignore_zwj (bool ignore_zwj_) { ignore_zwj = ignore_zwj_; }
_ZN2OT21hb_ot_apply_context_t9matcher_t16set_lookup_propsEj:
  409|   819k|    void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
_ZN2OT21hb_ot_apply_context_t9matcher_t8set_maskEj:
  410|   819k|    void set_mask (hb_mask_t mask_) { mask = mask_; }
_ZN2OT21hb_ot_apply_context_t9matcher_t16set_per_syllableEb:
  411|   819k|    void set_per_syllable (bool per_syllable_) { per_syllable = per_syllable_; }
_ZN2OT21hb_ot_apply_context_t9matcher_t12set_syllableEh:
  412|   819k|    void set_syllable (uint8_t syllable_)  { syllable = per_syllable ? syllable_ : 0; }
  ------------------
  |  Branch (412:57): [True: 0, False: 819k]
  ------------------
_ZN2OT21hb_ot_apply_context_t9matcher_t14set_match_funcEPFbR15hb_glyph_info_tjPKvES5_:
  415|   819k|    { match_func = match_func_; match_data = match_data_; }
_ZN2OT21hb_ot_apply_context_t19skipping_iterator_t4initEPS0_b:
  476|   819k|    {
  477|   819k|      c = c_;
  478|   819k|      end = c->buffer->len;
  479|   819k|      match_glyph_data16 = nullptr;
  480|       |#ifndef HB_NO_BEYOND_64K
  481|       |      match_glyph_data24 = nullptr;
  482|       |#endif
  483|   819k|      matcher.set_match_func (nullptr, nullptr);
  484|   819k|      matcher.set_lookup_props (c->lookup_props);
  485|       |      /* Ignore ZWNJ if we are matching GPOS, or matching GSUB context and asked to. */
  486|   819k|      matcher.set_ignore_zwnj (c->table_index == 1 || (context_match && c->auto_zwnj));
  ------------------
  |  Branch (486:32): [True: 409k, False: 409k]
  |  Branch (486:56): [True: 204k, False: 204k]
  |  Branch (486:73): [True: 204k, False: 0]
  ------------------
  487|       |      /* Ignore ZWJ if we are matching context, or asked to. */
  488|   819k|      matcher.set_ignore_zwj  (context_match || c->auto_zwj);
  ------------------
  |  Branch (488:32): [True: 409k, False: 409k]
  |  Branch (488:49): [True: 409k, False: 0]
  ------------------
  489|   819k|      matcher.set_mask (context_match ? -1 : c->lookup_mask);
  ------------------
  |  Branch (489:25): [True: 409k, False: 409k]
  ------------------
  490|       |      /* Per syllable matching is only for GSUB. */
  491|   819k|      matcher.set_per_syllable (c->table_index == 0 && c->per_syllable);
  ------------------
  |  Branch (491:33): [True: 409k, False: 409k]
  |  Branch (491:56): [True: 0, False: 409k]
  ------------------
  492|   819k|      matcher.set_syllable (0);
  493|   819k|    }
_ZN2OT21hb_ot_apply_context_tC2EjP9hb_font_tP11hb_buffer_tP9hb_blob_t:
  764|   409k|  { init_iters (); }
_ZN2OT21hb_ot_apply_context_tD2Ev:
  767|   409k|  {
  768|   409k|#ifndef HB_NO_VAR
  769|   409k|    VariationStore::destroy_cache (var_store_cache);
  770|   409k|#endif
  771|   409k|  }
_ZN2OT21hb_ot_apply_context_t10init_itersEv:
  774|   409k|  {
  775|   409k|    iter_input.init (this, false);
  776|   409k|    iter_context.init (this, true);
  777|   409k|  }
_ZN2OT21hb_ot_apply_context_t16set_recurse_funcEPFbPS0_jE:
  784|   409k|  void set_recurse_func (recurse_func_t func) { recurse_func = func; }
_ZN2OT33hb_accelerate_subtables_context_t20default_return_valueEv:
 1029|      5|  static return_t default_return_value () { return hb_empty_t (); }
_ZN2OT33hb_accelerate_subtables_context_tC2EPNS0_15hb_applicable_tE:
 1032|      5|				     array (array_) {}
_ZNK2OT8GSUBGPOS15get_script_listEv:
 4538|    176|  {
 4539|    176|    switch (u.version.major) {
 4540|    176|    case 1: return this+u.version1.scriptList;
  ------------------
  |  Branch (4540:5): [True: 176, False: 0]
  ------------------
 4541|       |#ifndef HB_NO_BEYOND_64K
 4542|       |    case 2: return this+u.version2.scriptList;
 4543|       |#endif
 4544|      0|    default: return Null (ScriptList);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (4544:5): [True: 0, False: 176]
  ------------------
 4545|    176|    }
 4546|    176|  }
_ZNK2OT8GSUBGPOS16get_feature_listEv:
 4548|     42|  {
 4549|     42|    switch (u.version.major) {
 4550|     42|    case 1: return this+u.version1.featureList;
  ------------------
  |  Branch (4550:5): [True: 42, False: 0]
  ------------------
 4551|       |#ifndef HB_NO_BEYOND_64K
 4552|       |    case 2: return this+u.version2.featureList;
 4553|       |#endif
 4554|      0|    default: return Null (FeatureList);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (4554:5): [True: 0, False: 42]
  ------------------
 4555|     42|    }
 4556|     42|  }
_ZNK2OT8GSUBGPOS16get_lookup_countEv:
 4558|     56|  {
 4559|     56|    switch (u.version.major) {
 4560|     56|    case 1: return (this+u.version1.lookupList).len;
  ------------------
  |  Branch (4560:5): [True: 56, False: 0]
  ------------------
 4561|       |#ifndef HB_NO_BEYOND_64K
 4562|       |    case 2: return (this+u.version2.lookupList).len;
 4563|       |#endif
 4564|      0|    default: return 0;
  ------------------
  |  Branch (4564:5): [True: 0, False: 56]
  ------------------
 4565|     56|    }
 4566|     56|  }
_ZNK2OT8GSUBGPOS10get_lookupEj:
 4568|      5|  {
 4569|      5|    switch (u.version.major) {
 4570|      5|    case 1: return (this+u.version1.lookupList)[i];
  ------------------
  |  Branch (4570:5): [True: 5, False: 0]
  ------------------
 4571|       |#ifndef HB_NO_BEYOND_64K
 4572|       |    case 2: return (this+u.version2.lookupList)[i];
 4573|       |#endif
 4574|      0|    default: return Null (Lookup);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (4574:5): [True: 0, False: 5]
  ------------------
 4575|      5|    }
 4576|      5|  }
_ZNK2OT8GSUBGPOS22get_feature_variationsEv:
 4578|   409k|  {
 4579|   409k|    switch (u.version.major) {
 4580|   409k|    case 1: return (u.version.to_int () >= 0x00010001u ? this+u.version1.featureVars : Null (FeatureVariations));
  ------------------
  |  |  124|   409k|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (4580:5): [True: 409k, False: 0]
  |  Branch (4580:21): [True: 0, False: 409k]
  ------------------
 4581|       |#ifndef HB_NO_BEYOND_64K
 4582|       |    case 2: return this+u.version2.featureVars;
 4583|       |#endif
 4584|      0|    default: return Null (FeatureVariations);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (4584:5): [True: 0, False: 409k]
  ------------------
 4585|   409k|    }
 4586|   409k|  }
_ZNK2OT8GSUBGPOS8has_dataEv:
 4588|     26|  bool has_data () const { return u.version.to_int (); }
_ZNK2OT8GSUBGPOS10get_scriptEj:
 4598|     78|  { return get_script_list ()[i]; }
_ZNK2OT8GSUBGPOS17find_script_indexEjPj:
 4600|     98|  { return get_script_list ().find_index (tag, index); }
_ZNK2OT8GSUBGPOS15get_feature_tagEj:
 4605|     34|  { return i == Index::NOT_FOUND_INDEX ? HB_TAG_NONE : get_feature_list ().get_tag (i); }
  ------------------
  |  |  197|     26|#define HB_TAG_NONE HB_TAG(0,0,0,0)
  |  |  ------------------
  |  |  |  |  179|     26|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (4605:12): [True: 26, False: 8]
  ------------------
_ZNK2OT8GSUBGPOS11get_featureEj:
 4611|     34|  { return get_feature_list ()[i]; }
_ZNK2OT8GSUBGPOS21find_variations_indexEPKijPj:
 4617|   409k|  {
 4618|       |#ifdef HB_NO_VAR
 4619|       |    *index = FeatureVariations::NOT_FOUND_INDEX;
 4620|       |    return false;
 4621|       |#endif
 4622|   409k|    return get_feature_variations ().find_index (coords, num_coords, index);
 4623|   409k|  }
_ZNK2OT8GSUBGPOS21get_feature_variationEjj:
 4626|     34|  {
 4627|     34|#ifndef HB_NO_VAR
 4628|     34|    if (FeatureVariations::NOT_FOUND_INDEX != variations_index &&
  ------------------
  |  Branch (4628:9): [True: 0, False: 34]
  ------------------
 4629|     34|	u.version.to_int () >= 0x00010001u)
  ------------------
  |  Branch (4629:2): [True: 0, False: 0]
  ------------------
 4630|      0|    {
 4631|      0|      const Feature *feature = get_feature_variations ().find_substitute (variations_index,
 4632|      0|									  feature_index);
 4633|      0|      if (feature)
  ------------------
  |  Branch (4633:11): [True: 0, False: 0]
  ------------------
 4634|      0|	return *feature;
 4635|      0|    }
 4636|     34|#endif
 4637|     34|    return get_feature (feature_index);
 4638|     34|  }
_ZNK2OT12ChainContext8dispatchI21hb_sanitize_context_tJEEENT_8return_tEPS3_DpOT0_:
 4158|      1|  {
 4159|      1|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 4160|      1|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      1|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
 4161|      1|    switch (u.format) {
 4162|      0|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4162:5): [True: 0, False: 1]
  ------------------
 4163|      1|    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4163:5): [True: 1, False: 0]
  ------------------
 4164|      0|    case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4164:5): [True: 0, False: 1]
  ------------------
 4165|       |#ifndef HB_NO_BEYOND_64K
 4166|       |    case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
 4167|       |    case 5: return_trace (c->dispatch (u.format5, std::forward<Ts> (ds)...));
 4168|       |#endif
 4169|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4169:5): [True: 0, False: 1]
  ------------------
 4170|      1|    }
 4171|      1|  }
_ZNK2OT12ChainRuleSetINS_6Layout10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
 3460|      2|  {
 3461|      2|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      2|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 3462|      2|    return_trace (rule.sanitize (c, this));
  ------------------
  |  |  350|      2|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      2|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 3463|      2|  }
_ZNK2OT9ChainRuleINS_6Layout10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
 3218|      6|  {
 3219|      6|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      6|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 3220|       |    /* Hyper-optimized sanitized because this is really hot. */
 3221|      6|    if (unlikely (!backtrack.len.sanitize (c))) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (!backtrack.len.sanitize (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 3222|      6|    const auto &input = StructAfter<decltype (inputX)> (backtrack);
 3223|      6|    if (unlikely (!input.lenP1.sanitize (c))) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (!input.lenP1.sanitize (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 3224|      6|    const auto &lookahead = StructAfter<decltype (lookaheadX)> (input);
 3225|      6|    if (unlikely (!lookahead.len.sanitize (c))) return_trace (false);
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
                  if (unlikely (!lookahead.len.sanitize (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 3226|      6|    const auto &lookup = StructAfter<decltype (lookupX)> (lookahead);
 3227|      6|    return_trace (likely (lookup.sanitize (c)));
  ------------------
  |  |  350|      6|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      6|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 3228|      6|  }
_ZNK2OT21ChainContextFormat2_5INS_6Layout10SmallTypesEE8sanitizeEP21hb_sanitize_context_t:
 3907|      1|  {
 3908|      1|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|      1|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 3909|      1|    return_trace (coverage.sanitize (c, this) &&
  ------------------
  |  |  350|      8|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  |  Branch (350:45): [True: 1, False: 0]
  |  |  ------------------
  ------------------
 3910|      1|		  backtrackClassDef.sanitize (c, this) &&
 3911|      1|		  inputClassDef.sanitize (c, this) &&
 3912|      1|		  lookaheadClassDef.sanitize (c, this) &&
 3913|      1|		  ruleSet.sanitize (c, this));
 3914|      1|  }
_ZNK2OT8GSUBGPOS8sanitizeINS_6Layout9GPOS_impl9PosLookupEEEbP21hb_sanitize_context_t:
 4513|     11|  {
 4514|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 4515|     11|    if (unlikely (!u.version.sanitize (c))) return_trace (false);
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
                  if (unlikely (!u.version.sanitize (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 4516|     11|    switch (u.version.major) {
 4517|     11|    case 1: return_trace (u.version1.sanitize<TLookup> (c));
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4517:5): [True: 11, False: 0]
  ------------------
 4518|       |#ifndef HB_NO_BEYOND_64K
 4519|       |    case 2: return_trace (u.version2.sanitize<TLookup> (c));
 4520|       |#endif
 4521|      0|    default: return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4521:5): [True: 0, False: 11]
  ------------------
 4522|     11|    }
 4523|     11|  }
_ZNK2OT18GSUBGPOSVersion1_2INS_6Layout10SmallTypesEE8sanitizeINS1_9GPOS_impl9PosLookupEEEbP21hb_sanitize_context_t:
 4424|     11|  {
 4425|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 4426|     11|    typedef List16OfOffsetTo<TLookup, typename Types::HBUINT> TLookupList;
 4427|     11|    if (unlikely (!(scriptList.sanitize (c, this) &&
  ------------------
  |  |  260|     44|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  ------------------
  ------------------
 4428|     11|		    featureList.sanitize (c, this) &&
 4429|     11|		    reinterpret_cast<const typename Types::template OffsetTo<TLookupList> &> (lookupList).sanitize (c, this))))
 4430|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 4431|       |
 4432|     11|#ifndef HB_NO_VAR
 4433|     11|    if (unlikely (!(version.to_int () < 0x00010001u || featureVars.sanitize (c, this))))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4434|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 4435|     11|#endif
 4436|       |
 4437|     11|    return_trace (true);
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 4438|     11|  }
_ZNK2OT8GSUBGPOS13accelerator_tINS_6Layout4GPOSEE9get_accelEj:
 4783|     27|    {
 4784|     27|      if (unlikely (lookup_index >= lookup_count)) return nullptr;
  ------------------
  |  |  260|     27|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 27]
  |  |  ------------------
  ------------------
 4785|       |
 4786|     27|    retry:
 4787|     27|      auto *accel = accels[lookup_index].get_acquire ();
 4788|     27|      if (unlikely (!accel))
  ------------------
  |  |  260|     27|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 3, False: 24]
  |  |  ------------------
  ------------------
 4789|      3|      {
 4790|      3|	accel = hb_ot_layout_lookup_accelerator_t::create (table->get_lookup (lookup_index));
 4791|      3|	if (unlikely (!accel))
  ------------------
  |  |  260|      3|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 4792|      0|	  return nullptr;
 4793|       |
 4794|      3|	if (unlikely (!accels[lookup_index].cmpexch (nullptr, accel)))
  ------------------
  |  |  260|      3|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 4795|      0|	{
 4796|      0|	  hb_free (accel);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
 4797|      0|	  goto retry;
 4798|      0|	}
 4799|      3|      }
 4800|       |
 4801|     27|      return accel;
 4802|     27|    }
_ZN2OT33hb_ot_layout_lookup_accelerator_t6createINS_6Layout9GPOS_impl9PosLookupEEEPS0_RKT_:
 4302|      3|  {
 4303|      3|    unsigned count = lookup.get_subtable_count ();
 4304|       |
 4305|      3|    unsigned size = sizeof (hb_ot_layout_lookup_accelerator_t) -
 4306|      3|		    HB_VAR_ARRAY * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t) +
  ------------------
  |  |   84|      3|#define HB_VAR_ARRAY 1
  ------------------
 4307|      3|		    count * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t);
 4308|       |
 4309|       |    /* The following is a calloc because when we are collecting subtables,
 4310|       |     * some of them might be invalid and hence not collect; as a result,
 4311|       |     * we might not fill in all the count entries of the subtables array.
 4312|       |     * Zeroing it allows the set digest to gatekeep it without having to
 4313|       |     * initialize it further. */
 4314|      3|    auto *thiz = (hb_ot_layout_lookup_accelerator_t *) hb_calloc (1, size);
  ------------------
  |  |  235|      3|#define hb_calloc hb_calloc_impl
  ------------------
 4315|      3|    if (unlikely (!thiz))
  ------------------
  |  |  260|      3|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 4316|      0|      return nullptr;
 4317|       |
 4318|      3|    hb_accelerate_subtables_context_t c_accelerate_subtables (thiz->subtables);
 4319|      3|    lookup.dispatch (&c_accelerate_subtables);
 4320|       |
 4321|      3|    thiz->digest.init ();
 4322|      3|    for (auto& subtable : hb_iter (thiz->subtables, count))
  ------------------
  |  Branch (4322:25): [True: 6, False: 3]
  ------------------
 4323|      6|      thiz->digest.add (subtable.digest);
 4324|       |
 4325|      3|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 4326|      3|    thiz->cache_user_idx = c_accelerate_subtables.cache_user_idx;
 4327|      9|    for (unsigned i = 0; i < count; i++)
  ------------------
  |  Branch (4327:26): [True: 6, False: 3]
  ------------------
 4328|      6|      if (i != thiz->cache_user_idx)
  ------------------
  |  Branch (4328:11): [True: 6, False: 0]
  ------------------
 4329|      6|	thiz->subtables[i].apply_cached_func = thiz->subtables[i].apply_func;
 4330|      3|#endif
 4331|       |
 4332|      3|    return thiz;
 4333|      3|  }
_ZN2OT33hb_accelerate_subtables_context_t8dispatchINS_6Layout9GPOS_impl20MarkBasePosFormat1_2INS2_10SmallTypesEEEEE10hb_empty_tRKT_:
  999|      4|  {
 1000|      4|    hb_applicable_t *entry = &array[i++];
 1001|       |
 1002|      4|    entry->init (obj,
 1003|      4|		 apply_to<T>
 1004|      4|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1005|      4|		 , apply_cached_to<T>
 1006|      4|		 , cache_func_to<T>
 1007|      4|#endif
 1008|      4|		 );
 1009|       |
 1010|      4|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1011|       |    /* Cache handling
 1012|       |     *
 1013|       |     * We allow one subtable from each lookup to use a cache. The assumption
 1014|       |     * being that multiple subtables of the same lookup cannot use a cache
 1015|       |     * because the resources they would use will collide.  As such, we ask
 1016|       |     * each subtable to tell us how much it costs (which a cache would avoid),
 1017|       |     * and we allocate the cache opportunity to the costliest subtable.
 1018|       |     */
 1019|      4|    unsigned cost = cache_cost (obj, hb_prioritize);
  ------------------
  |  |   81|      4|#define hb_prioritize hb_priority<16> ()
  ------------------
 1020|      4|    if (cost > cache_user_cost)
  ------------------
  |  Branch (1020:9): [True: 0, False: 4]
  ------------------
 1021|      0|    {
 1022|      0|      cache_user_idx = i - 1;
 1023|      0|      cache_user_cost = cost;
 1024|      0|    }
 1025|      4|#endif
 1026|       |
 1027|      4|    return hb_empty_t ();
 1028|      4|  }
_ZN2OT33hb_accelerate_subtables_context_t15hb_applicable_t4initINS_6Layout9GPOS_impl20MarkBasePosFormat1_2INS3_10SmallTypesEEEEEvRKT_PFbPKvPNS_21hb_ot_apply_context_tEESG_PFbSC_SE_bE:
  949|      4|    {
  950|      4|      obj = &obj_;
  951|      4|      apply_func = apply_func_;
  952|      4|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
  953|      4|      apply_cached_func = apply_cached_func_;
  954|      4|      cache_func = cache_func_;
  955|      4|#endif
  956|      4|      digest.init ();
  957|      4|      obj_.get_coverage ().collect_coverage (&digest);
  958|      4|    }
_ZN2OT33hb_accelerate_subtables_context_t8dispatchINS_6Layout9GPOS_impl19MarkLigPosFormat1_2INS2_10SmallTypesEEEEE10hb_empty_tRKT_:
  999|      1|  {
 1000|      1|    hb_applicable_t *entry = &array[i++];
 1001|       |
 1002|      1|    entry->init (obj,
 1003|      1|		 apply_to<T>
 1004|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1005|      1|		 , apply_cached_to<T>
 1006|      1|		 , cache_func_to<T>
 1007|      1|#endif
 1008|      1|		 );
 1009|       |
 1010|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1011|       |    /* Cache handling
 1012|       |     *
 1013|       |     * We allow one subtable from each lookup to use a cache. The assumption
 1014|       |     * being that multiple subtables of the same lookup cannot use a cache
 1015|       |     * because the resources they would use will collide.  As such, we ask
 1016|       |     * each subtable to tell us how much it costs (which a cache would avoid),
 1017|       |     * and we allocate the cache opportunity to the costliest subtable.
 1018|       |     */
 1019|      1|    unsigned cost = cache_cost (obj, hb_prioritize);
  ------------------
  |  |   81|      1|#define hb_prioritize hb_priority<16> ()
  ------------------
 1020|      1|    if (cost > cache_user_cost)
  ------------------
  |  Branch (1020:9): [True: 0, False: 1]
  ------------------
 1021|      0|    {
 1022|      0|      cache_user_idx = i - 1;
 1023|      0|      cache_user_cost = cost;
 1024|      0|    }
 1025|      1|#endif
 1026|       |
 1027|      1|    return hb_empty_t ();
 1028|      1|  }
_ZN2OT33hb_accelerate_subtables_context_t15hb_applicable_t4initINS_6Layout9GPOS_impl19MarkLigPosFormat1_2INS3_10SmallTypesEEEEEvRKT_PFbPKvPNS_21hb_ot_apply_context_tEESG_PFbSC_SE_bE:
  949|      1|    {
  950|      1|      obj = &obj_;
  951|      1|      apply_func = apply_func_;
  952|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
  953|      1|      apply_cached_func = apply_cached_func_;
  954|      1|      cache_func = cache_func_;
  955|      1|#endif
  956|      1|      digest.init ();
  957|      1|      obj_.get_coverage ().collect_coverage (&digest);
  958|      1|    }
_ZN2OT33hb_accelerate_subtables_context_t8dispatchINS_6Layout9GPOS_impl20MarkMarkPosFormat1_2INS2_10SmallTypesEEEEE10hb_empty_tRKT_:
  999|      1|  {
 1000|      1|    hb_applicable_t *entry = &array[i++];
 1001|       |
 1002|      1|    entry->init (obj,
 1003|      1|		 apply_to<T>
 1004|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1005|      1|		 , apply_cached_to<T>
 1006|      1|		 , cache_func_to<T>
 1007|      1|#endif
 1008|      1|		 );
 1009|       |
 1010|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1011|       |    /* Cache handling
 1012|       |     *
 1013|       |     * We allow one subtable from each lookup to use a cache. The assumption
 1014|       |     * being that multiple subtables of the same lookup cannot use a cache
 1015|       |     * because the resources they would use will collide.  As such, we ask
 1016|       |     * each subtable to tell us how much it costs (which a cache would avoid),
 1017|       |     * and we allocate the cache opportunity to the costliest subtable.
 1018|       |     */
 1019|      1|    unsigned cost = cache_cost (obj, hb_prioritize);
  ------------------
  |  |   81|      1|#define hb_prioritize hb_priority<16> ()
  ------------------
 1020|      1|    if (cost > cache_user_cost)
  ------------------
  |  Branch (1020:9): [True: 0, False: 1]
  ------------------
 1021|      0|    {
 1022|      0|      cache_user_idx = i - 1;
 1023|      0|      cache_user_cost = cost;
 1024|      0|    }
 1025|      1|#endif
 1026|       |
 1027|      1|    return hb_empty_t ();
 1028|      1|  }
_ZN2OT33hb_accelerate_subtables_context_t15hb_applicable_t4initINS_6Layout9GPOS_impl20MarkMarkPosFormat1_2INS3_10SmallTypesEEEEEvRKT_PFbPKvPNS_21hb_ot_apply_context_tEESG_PFbSC_SE_bE:
  949|      1|    {
  950|      1|      obj = &obj_;
  951|      1|      apply_func = apply_func_;
  952|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
  953|      1|      apply_cached_func = apply_cached_func_;
  954|      1|      cache_func = cache_func_;
  955|      1|#endif
  956|      1|      digest.init ();
  957|      1|      obj_.get_coverage ().collect_coverage (&digest);
  958|      1|    }
_ZNK2OT12ChainContext8dispatchINS_33hb_accelerate_subtables_context_tEJEEENT_8return_tEPS3_DpOT0_:
 4158|      1|  {
 4159|      1|    if (unlikely (!c->may_dispatch (this, &u.format))) return c->no_dispatch_return_value ();
  ------------------
  |  |  260|      1|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 4160|      1|    TRACE_DISPATCH (this, u.format);
  ------------------
  |  |  482|      1|#define TRACE_DISPATCH(this, format) hb_no_trace_t<typename context_t::return_t> trace
  ------------------
 4161|      1|    switch (u.format) {
 4162|      0|    case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4162:5): [True: 0, False: 1]
  ------------------
 4163|      1|    case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      1|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4163:5): [True: 1, False: 0]
  ------------------
 4164|      0|    case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4164:5): [True: 0, False: 1]
  ------------------
 4165|       |#ifndef HB_NO_BEYOND_64K
 4166|       |    case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...));
 4167|       |    case 5: return_trace (c->dispatch (u.format5, std::forward<Ts> (ds)...));
 4168|       |#endif
 4169|      0|    default:return_trace (c->default_return_value ());
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4169:5): [True: 0, False: 1]
  ------------------
 4170|      1|    }
 4171|      1|  }
_ZN2OT33hb_accelerate_subtables_context_t8dispatchINS_21ChainContextFormat2_5INS_6Layout10SmallTypesEEEEE10hb_empty_tRKT_:
  999|      1|  {
 1000|      1|    hb_applicable_t *entry = &array[i++];
 1001|       |
 1002|      1|    entry->init (obj,
 1003|      1|		 apply_to<T>
 1004|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1005|      1|		 , apply_cached_to<T>
 1006|      1|		 , cache_func_to<T>
 1007|      1|#endif
 1008|      1|		 );
 1009|       |
 1010|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1011|       |    /* Cache handling
 1012|       |     *
 1013|       |     * We allow one subtable from each lookup to use a cache. The assumption
 1014|       |     * being that multiple subtables of the same lookup cannot use a cache
 1015|       |     * because the resources they would use will collide.  As such, we ask
 1016|       |     * each subtable to tell us how much it costs (which a cache would avoid),
 1017|       |     * and we allocate the cache opportunity to the costliest subtable.
 1018|       |     */
 1019|      1|    unsigned cost = cache_cost (obj, hb_prioritize);
  ------------------
  |  |   81|      1|#define hb_prioritize hb_priority<16> ()
  ------------------
 1020|      1|    if (cost > cache_user_cost)
  ------------------
  |  Branch (1020:9): [True: 1, False: 0]
  ------------------
 1021|      1|    {
 1022|      1|      cache_user_idx = i - 1;
 1023|      1|      cache_user_cost = cost;
 1024|      1|    }
 1025|      1|#endif
 1026|       |
 1027|      1|    return hb_empty_t ();
 1028|      1|  }
_ZN2OT33hb_accelerate_subtables_context_t15hb_applicable_t4initINS_21ChainContextFormat2_5INS_6Layout10SmallTypesEEEEEvRKT_PFbPKvPNS_21hb_ot_apply_context_tEESF_PFbSB_SD_bE:
  949|      1|    {
  950|      1|      obj = &obj_;
  951|      1|      apply_func = apply_func_;
  952|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
  953|      1|      apply_cached_func = apply_cached_func_;
  954|      1|      cache_func = cache_func_;
  955|      1|#endif
  956|      1|      digest.init ();
  957|      1|      obj_.get_coverage ().collect_coverage (&digest);
  958|      1|    }
_ZNK2OT21ChainContextFormat2_5INS_6Layout10SmallTypesEE12get_coverageEv:
 3779|      1|  const Coverage &get_coverage () const { return this+coverage; }
_ZNK2OT21ChainContextFormat2_5INS_6Layout10SmallTypesEE10cache_costEv:
 3782|      1|  {
 3783|      1|    unsigned c = (this+lookaheadClassDef).cost () * ruleSet.len;
 3784|      1|    return c >= 4 ? c : 0;
  ------------------
  |  Branch (3784:12): [True: 1, False: 0]
  ------------------
 3785|      1|  }
_ZNK2OT8GSUBGPOS8sanitizeINS_6Layout9GSUB_impl11SubstLookupEEEbP21hb_sanitize_context_t:
 4513|     11|  {
 4514|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 4515|     11|    if (unlikely (!u.version.sanitize (c))) return_trace (false);
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
                  if (unlikely (!u.version.sanitize (c))) return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 4516|     11|    switch (u.version.major) {
 4517|     11|    case 1: return_trace (u.version1.sanitize<TLookup> (c));
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4517:5): [True: 11, False: 0]
  ------------------
 4518|       |#ifndef HB_NO_BEYOND_64K
 4519|       |    case 2: return_trace (u.version2.sanitize<TLookup> (c));
 4520|       |#endif
 4521|      0|    default: return_trace (true);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  |  Branch (4521:5): [True: 0, False: 11]
  ------------------
 4522|     11|    }
 4523|     11|  }
_ZNK2OT18GSUBGPOSVersion1_2INS_6Layout10SmallTypesEE8sanitizeINS1_9GSUB_impl11SubstLookupEEEbP21hb_sanitize_context_t:
 4424|     11|  {
 4425|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
 4426|     11|    typedef List16OfOffsetTo<TLookup, typename Types::HBUINT> TLookupList;
 4427|     11|    if (unlikely (!(scriptList.sanitize (c, this) &&
  ------------------
  |  |  260|     44|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  ------------------
  ------------------
 4428|     11|		    featureList.sanitize (c, this) &&
 4429|     11|		    reinterpret_cast<const typename Types::template OffsetTo<TLookupList> &> (lookupList).sanitize (c, this))))
 4430|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 4431|       |
 4432|     11|#ifndef HB_NO_VAR
 4433|     11|    if (unlikely (!(version.to_int () < 0x00010001u || featureVars.sanitize (c, this))))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4434|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 4435|     11|#endif
 4436|       |
 4437|     11|    return_trace (true);
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
 4438|     11|  }
_ZNK2OT8GSUBGPOS13accelerator_tINS_6Layout4GSUBEE9get_accelEj:
 4783|     18|    {
 4784|     18|      if (unlikely (lookup_index >= lookup_count)) return nullptr;
  ------------------
  |  |  260|     18|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 18]
  |  |  ------------------
  ------------------
 4785|       |
 4786|     18|    retry:
 4787|     18|      auto *accel = accels[lookup_index].get_acquire ();
 4788|     18|      if (unlikely (!accel))
  ------------------
  |  |  260|     18|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 2, False: 16]
  |  |  ------------------
  ------------------
 4789|      2|      {
 4790|      2|	accel = hb_ot_layout_lookup_accelerator_t::create (table->get_lookup (lookup_index));
 4791|      2|	if (unlikely (!accel))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 4792|      0|	  return nullptr;
 4793|       |
 4794|      2|	if (unlikely (!accels[lookup_index].cmpexch (nullptr, accel)))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 4795|      0|	{
 4796|      0|	  hb_free (accel);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
 4797|      0|	  goto retry;
 4798|      0|	}
 4799|      2|      }
 4800|       |
 4801|     18|      return accel;
 4802|     18|    }
_ZN2OT33hb_ot_layout_lookup_accelerator_t6createINS_6Layout9GSUB_impl11SubstLookupEEEPS0_RKT_:
 4302|      2|  {
 4303|      2|    unsigned count = lookup.get_subtable_count ();
 4304|       |
 4305|      2|    unsigned size = sizeof (hb_ot_layout_lookup_accelerator_t) -
 4306|      2|		    HB_VAR_ARRAY * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t) +
  ------------------
  |  |   84|      2|#define HB_VAR_ARRAY 1
  ------------------
 4307|      2|		    count * sizeof (hb_accelerate_subtables_context_t::hb_applicable_t);
 4308|       |
 4309|       |    /* The following is a calloc because when we are collecting subtables,
 4310|       |     * some of them might be invalid and hence not collect; as a result,
 4311|       |     * we might not fill in all the count entries of the subtables array.
 4312|       |     * Zeroing it allows the set digest to gatekeep it without having to
 4313|       |     * initialize it further. */
 4314|      2|    auto *thiz = (hb_ot_layout_lookup_accelerator_t *) hb_calloc (1, size);
  ------------------
  |  |  235|      2|#define hb_calloc hb_calloc_impl
  ------------------
 4315|      2|    if (unlikely (!thiz))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 4316|      0|      return nullptr;
 4317|       |
 4318|      2|    hb_accelerate_subtables_context_t c_accelerate_subtables (thiz->subtables);
 4319|      2|    lookup.dispatch (&c_accelerate_subtables);
 4320|       |
 4321|      2|    thiz->digest.init ();
 4322|      2|    for (auto& subtable : hb_iter (thiz->subtables, count))
  ------------------
  |  Branch (4322:25): [True: 2, False: 2]
  ------------------
 4323|      2|      thiz->digest.add (subtable.digest);
 4324|       |
 4325|      2|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 4326|      2|    thiz->cache_user_idx = c_accelerate_subtables.cache_user_idx;
 4327|      4|    for (unsigned i = 0; i < count; i++)
  ------------------
  |  Branch (4327:26): [True: 2, False: 2]
  ------------------
 4328|      2|      if (i != thiz->cache_user_idx)
  ------------------
  |  Branch (4328:11): [True: 1, False: 1]
  ------------------
 4329|      1|	thiz->subtables[i].apply_cached_func = thiz->subtables[i].apply_func;
 4330|      2|#endif
 4331|       |
 4332|      2|    return thiz;
 4333|      2|  }
_ZN2OT33hb_accelerate_subtables_context_t8dispatchINS_6Layout9GSUB_impl22LigatureSubstFormat1_2INS2_10SmallTypesEEEEE10hb_empty_tRKT_:
  999|      1|  {
 1000|      1|    hb_applicable_t *entry = &array[i++];
 1001|       |
 1002|      1|    entry->init (obj,
 1003|      1|		 apply_to<T>
 1004|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1005|      1|		 , apply_cached_to<T>
 1006|      1|		 , cache_func_to<T>
 1007|      1|#endif
 1008|      1|		 );
 1009|       |
 1010|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
 1011|       |    /* Cache handling
 1012|       |     *
 1013|       |     * We allow one subtable from each lookup to use a cache. The assumption
 1014|       |     * being that multiple subtables of the same lookup cannot use a cache
 1015|       |     * because the resources they would use will collide.  As such, we ask
 1016|       |     * each subtable to tell us how much it costs (which a cache would avoid),
 1017|       |     * and we allocate the cache opportunity to the costliest subtable.
 1018|       |     */
 1019|      1|    unsigned cost = cache_cost (obj, hb_prioritize);
  ------------------
  |  |   81|      1|#define hb_prioritize hb_priority<16> ()
  ------------------
 1020|      1|    if (cost > cache_user_cost)
  ------------------
  |  Branch (1020:9): [True: 0, False: 1]
  ------------------
 1021|      0|    {
 1022|      0|      cache_user_idx = i - 1;
 1023|      0|      cache_user_cost = cost;
 1024|      0|    }
 1025|      1|#endif
 1026|       |
 1027|      1|    return hb_empty_t ();
 1028|      1|  }
_ZN2OT33hb_accelerate_subtables_context_t15hb_applicable_t4initINS_6Layout9GSUB_impl22LigatureSubstFormat1_2INS3_10SmallTypesEEEEEvRKT_PFbPKvPNS_21hb_ot_apply_context_tEESG_PFbSC_SE_bE:
  949|      1|    {
  950|      1|      obj = &obj_;
  951|      1|      apply_func = apply_func_;
  952|      1|#ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE
  953|      1|      apply_cached_func = apply_cached_func_;
  954|      1|      cache_func = cache_func_;
  955|      1|#endif
  956|      1|      digest.init ();
  957|      1|      obj_.get_coverage ().collect_coverage (&digest);
  958|      1|    }
_ZN2OT8GSUBGPOS13accelerator_tINS_6Layout4GSUBEEC2EP9hb_face_t:
 4751|     11|    {
 4752|     11|      hb_sanitize_context_t sc;
 4753|     11|      sc.lazy_some_gpos = true;
 4754|     11|      this->table = sc.reference_table<T> (face);
 4755|       |
 4756|     11|      if (unlikely (this->table->is_blocklisted (this->table.get_blob (), face)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
 4757|      0|      {
 4758|      0|	hb_blob_destroy (this->table.get_blob ());
 4759|      0|	this->table = hb_blob_get_empty ();
 4760|      0|      }
 4761|       |
 4762|     11|      this->lookup_count = table->get_lookup_count ();
 4763|       |
 4764|     11|      this->accels = (hb_atomic_ptr_t<hb_ot_layout_lookup_accelerator_t> *) hb_calloc (this->lookup_count, sizeof (*accels));
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
 4765|     11|      if (unlikely (!this->accels))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
 4766|      0|      {
 4767|      0|	this->lookup_count = 0;
 4768|      0|	this->table.destroy ();
 4769|      0|	this->table = hb_blob_get_empty ();
 4770|      0|      }
 4771|     11|    }
_ZN2OT8GSUBGPOS13accelerator_tINS_6Layout4GPOSEEC2EP9hb_face_t:
 4751|     11|    {
 4752|     11|      hb_sanitize_context_t sc;
 4753|     11|      sc.lazy_some_gpos = true;
 4754|     11|      this->table = sc.reference_table<T> (face);
 4755|       |
 4756|     11|      if (unlikely (this->table->is_blocklisted (this->table.get_blob (), face)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
 4757|      0|      {
 4758|      0|	hb_blob_destroy (this->table.get_blob ());
 4759|      0|	this->table = hb_blob_get_empty ();
 4760|      0|      }
 4761|       |
 4762|     11|      this->lookup_count = table->get_lookup_count ();
 4763|       |
 4764|     11|      this->accels = (hb_atomic_ptr_t<hb_ot_layout_lookup_accelerator_t> *) hb_calloc (this->lookup_count, sizeof (*accels));
  ------------------
  |  |  235|     11|#define hb_calloc hb_calloc_impl
  ------------------
 4765|     11|      if (unlikely (!this->accels))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
 4766|      0|      {
 4767|      0|	this->lookup_count = 0;
 4768|      0|	this->table.destroy ();
 4769|      0|	this->table = hb_blob_get_empty ();
 4770|      0|      }
 4771|     11|    }
_ZNK2OT8GSUBGPOS13accelerator_tINS_6Layout4GSUBEE8get_blobEv:
 4780|   204k|    hb_blob_t *get_blob () const { return table.get_blob (); }
_ZNK2OT8GSUBGPOS13accelerator_tINS_6Layout4GPOSEE8get_blobEv:
 4780|   204k|    hb_blob_t *get_blob () const { return table.get_blob (); }

_Z24hb_ot_layout_has_kerningP9hb_face_t:
   89|     13|{
   90|     13|  return face->table.kern->has_data ();
   91|     13|}
_Z32hb_ot_layout_has_machine_kerningP9hb_face_t:
  105|      1|{
  106|      1|  return face->table.kern->has_state_machine ();
  107|      1|}
_Z17hb_ot_layout_kernPK18hb_ot_shape_plan_tP9hb_font_tP11hb_buffer_t:
  133|      9|{
  134|      9|  hb_blob_t *blob = font->face->table.kern.get_blob ();
  135|      9|  const AAT::kern& kern = *blob->as<AAT::kern> ();
  136|       |
  137|      9|  AAT::hb_aat_apply_context_t c (plan, font, buffer, blob);
  138|       |
  139|      9|  if (!buffer->message (font, "start table kern")) return;
  ------------------
  |  Branch (139:7): [True: 0, False: 9]
  ------------------
  140|      9|  kern.apply (&c);
  141|      9|  (void) buffer->message (font, "end table kern");
  142|      9|}
_ZNK2OT4GDEF14is_blocklistedEP9hb_blob_tP9hb_face_t:
  153|     11|{
  154|       |#ifdef HB_NO_OT_LAYOUT_BLOCKLIST
  155|       |  return false;
  156|       |#endif
  157|       |  /* The ugly business of blocklisting individual fonts' tables happen here!
  158|       |   * See this thread for why we finally had to bend in and do this:
  159|       |   * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
  160|       |   *
  161|       |   * In certain versions of Times New Roman Italic and Bold Italic,
  162|       |   * ASCII double quotation mark U+0022 has wrong glyph class 3 (mark)
  163|       |   * in GDEF.  Many versions of Tahoma have bad GDEF tables that
  164|       |   * incorrectly classify some spacing marks such as certain IPA
  165|       |   * symbols as glyph class 3. So do older versions of Microsoft
  166|       |   * Himalaya, and the version of Cantarell shipped by Ubuntu 16.04.
  167|       |   *
  168|       |   * Nuke the GDEF tables of to avoid unwanted width-zeroing.
  169|       |   *
  170|       |   * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
  171|       |   *     https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
  172|       |   *     https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
  173|       |   */
  174|     11|  switch HB_CODEPOINT_ENCODE3(blob->length,
  ------------------
  |  |  212|     11|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  |  |  ------------------
  |  |  |  Branch (212:38): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  175|     11|			      face->table.GSUB->table.get_length (),
  176|     11|			      face->table.GPOS->table.get_length ())
  177|     11|  {
  178|       |    /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
  179|      0|    case HB_CODEPOINT_ENCODE3 (442, 2874, 42038):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (179:5): [True: 0, False: 11]
  ------------------
  180|       |    /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
  181|      0|    case HB_CODEPOINT_ENCODE3 (430, 2874, 40662):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (181:5): [True: 0, False: 11]
  ------------------
  182|       |    /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
  183|      0|    case HB_CODEPOINT_ENCODE3 (442, 2874, 39116):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (183:5): [True: 0, False: 11]
  ------------------
  184|       |    /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
  185|      0|    case HB_CODEPOINT_ENCODE3 (430, 2874, 39374):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (185:5): [True: 0, False: 11]
  ------------------
  186|       |    /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
  187|      0|    case HB_CODEPOINT_ENCODE3 (490, 3046, 41638):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (187:5): [True: 0, False: 11]
  ------------------
  188|       |    /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
  189|      0|    case HB_CODEPOINT_ENCODE3 (478, 3046, 41902):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (189:5): [True: 0, False: 11]
  ------------------
  190|       |    /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c  tahoma.ttf from Windows 8 */
  191|      0|    case HB_CODEPOINT_ENCODE3 (898, 12554, 46470):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (191:5): [True: 0, False: 11]
  ------------------
  192|       |    /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc  tahomabd.ttf from Windows 8 */
  193|      0|    case HB_CODEPOINT_ENCODE3 (910, 12566, 47732):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (193:5): [True: 0, False: 11]
  ------------------
  194|       |    /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e  tahoma.ttf from Windows 8.1 */
  195|      0|    case HB_CODEPOINT_ENCODE3 (928, 23298, 59332):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (195:5): [True: 0, False: 11]
  ------------------
  196|       |    /* sha1sum:6d400781948517c3c0441ba42acb309584b73033  tahomabd.ttf from Windows 8.1 */
  197|      0|    case HB_CODEPOINT_ENCODE3 (940, 23310, 60732):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (197:5): [True: 0, False: 11]
  ------------------
  198|       |    /* tahoma.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
  199|      0|    case HB_CODEPOINT_ENCODE3 (964, 23836, 60072):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (199:5): [True: 0, False: 11]
  ------------------
  200|       |    /* tahomabd.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
  201|      0|    case HB_CODEPOINT_ENCODE3 (976, 23832, 61456):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (201:5): [True: 0, False: 11]
  ------------------
  202|       |    /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846  tahoma.ttf from Windows 10 */
  203|      0|    case HB_CODEPOINT_ENCODE3 (994, 24474, 60336):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (203:5): [True: 0, False: 11]
  ------------------
  204|       |    /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343  tahomabd.ttf from Windows 10 */
  205|      0|    case HB_CODEPOINT_ENCODE3 (1006, 24470, 61740):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (205:5): [True: 0, False: 11]
  ------------------
  206|       |    /* tahoma.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
  207|      0|    case HB_CODEPOINT_ENCODE3 (1006, 24576, 61346):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (207:5): [True: 0, False: 11]
  ------------------
  208|       |    /* tahomabd.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
  209|      0|    case HB_CODEPOINT_ENCODE3 (1018, 24572, 62828):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (209:5): [True: 0, False: 11]
  ------------------
  210|       |    /* sha1sum:b9c84d820c49850d3d27ec498be93955b82772b5  tahoma.ttf from Windows 10 AU */
  211|      0|    case HB_CODEPOINT_ENCODE3 (1006, 24576, 61352):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (211:5): [True: 0, False: 11]
  ------------------
  212|       |    /* sha1sum:2bdfaab28174bdadd2f3d4200a30a7ae31db79d2  tahomabd.ttf from Windows 10 AU */
  213|      0|    case HB_CODEPOINT_ENCODE3 (1018, 24572, 62834):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (213:5): [True: 0, False: 11]
  ------------------
  214|       |    /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7  Tahoma.ttf from Mac OS X 10.9 */
  215|      0|    case HB_CODEPOINT_ENCODE3 (832, 7324, 47162):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (215:5): [True: 0, False: 11]
  ------------------
  216|       |    /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba  Tahoma Bold.ttf from Mac OS X 10.9 */
  217|      0|    case HB_CODEPOINT_ENCODE3 (844, 7302, 45474):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (217:5): [True: 0, False: 11]
  ------------------
  218|       |    /* sha1sum:eb8afadd28e9cf963e886b23a30b44ab4fd83acc  himalaya.ttf from Windows 7 */
  219|      0|    case HB_CODEPOINT_ENCODE3 (180, 13054, 7254):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (219:5): [True: 0, False: 11]
  ------------------
  220|       |    /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0  himalaya.ttf from Windows 8 */
  221|      0|    case HB_CODEPOINT_ENCODE3 (192, 12638, 7254):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (221:5): [True: 0, False: 11]
  ------------------
  222|       |    /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427  himalaya.ttf from Windows 8.1 */
  223|      0|    case HB_CODEPOINT_ENCODE3 (192, 12690, 7254):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (223:5): [True: 0, False: 11]
  ------------------
  224|       |    /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44  cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
  225|       |    /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371  cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
  226|      0|    case HB_CODEPOINT_ENCODE3 (188, 248, 3852):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (226:5): [True: 0, False: 11]
  ------------------
  227|       |    /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f  cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
  228|       |    /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b  cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
  229|      0|    case HB_CODEPOINT_ENCODE3 (188, 264, 3426):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (229:5): [True: 0, False: 11]
  ------------------
  230|       |    /* d125afa82a77a6475ac0e74e7c207914af84b37a padauk-2.80/Padauk.ttf RHEL 7.2 */
  231|      0|    case HB_CODEPOINT_ENCODE3 (1058, 47032, 11818):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (231:5): [True: 0, False: 11]
  ------------------
  232|       |    /* 0f7b80437227b90a577cc078c0216160ae61b031 padauk-2.80/Padauk-Bold.ttf RHEL 7.2*/
  233|      0|    case HB_CODEPOINT_ENCODE3 (1046, 47030, 12600):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (233:5): [True: 0, False: 11]
  ------------------
  234|       |    /* d3dde9aa0a6b7f8f6a89ef1002e9aaa11b882290 padauk-2.80/Padauk.ttf Ubuntu 16.04 */
  235|      0|    case HB_CODEPOINT_ENCODE3 (1058, 71796, 16770):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (235:5): [True: 0, False: 11]
  ------------------
  236|       |    /* 5f3c98ccccae8a953be2d122c1b3a77fd805093f padauk-2.80/Padauk-Bold.ttf Ubuntu 16.04 */
  237|      0|    case HB_CODEPOINT_ENCODE3 (1046, 71790, 17862):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (237:5): [True: 0, False: 11]
  ------------------
  238|       |    /* 6c93b63b64e8b2c93f5e824e78caca555dc887c7 padauk-2.80/Padauk-book.ttf */
  239|      0|    case HB_CODEPOINT_ENCODE3 (1046, 71788, 17112):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (239:5): [True: 0, False: 11]
  ------------------
  240|       |    /* d89b1664058359b8ec82e35d3531931125991fb9 padauk-2.80/Padauk-bookbold.ttf */
  241|      0|    case HB_CODEPOINT_ENCODE3 (1058, 71794, 17514):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (241:5): [True: 0, False: 11]
  ------------------
  242|       |    /* 824cfd193aaf6234b2b4dc0cf3c6ef576c0d00ef padauk-3.0/Padauk-book.ttf */
  243|      0|    case HB_CODEPOINT_ENCODE3 (1330, 109904, 57938):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (243:5): [True: 0, False: 11]
  ------------------
  244|       |    /* 91fcc10cf15e012d27571e075b3b4dfe31754a8a padauk-3.0/Padauk-bookbold.ttf */
  245|      0|    case HB_CODEPOINT_ENCODE3 (1330, 109904, 58972):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (245:5): [True: 0, False: 11]
  ------------------
  246|       |    /* sha1sum: c26e41d567ed821bed997e937bc0c41435689e85  Padauk.ttf
  247|       |     *  "Padauk Regular" "Version 2.5", see https://crbug.com/681813 */
  248|      0|    case HB_CODEPOINT_ENCODE3 (1004, 59092, 14836):
  ------------------
  |  |  212|      0|#define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
  ------------------
  |  Branch (248:5): [True: 0, False: 11]
  ------------------
  249|      0|      return true;
  250|     11|  }
  251|     11|  return false;
  252|     11|}
hb_ot_layout_has_glyph_classes:
  283|     13|{
  284|     13|  return face->table.GDEF->table->has_glyph_classes ();
  285|     13|}
_ZNK2OT6Layout4GSUB14is_blocklistedEP9hb_blob_tP9hb_face_t:
  399|     11|{
  400|       |#ifdef HB_NO_OT_LAYOUT_BLOCKLIST
  401|       |  return false;
  402|       |#endif
  403|     11|  return false;
  404|     11|}
_ZNK2OT6Layout4GPOS14is_blocklistedEP9hb_blob_tP9hb_face_t:
  409|     11|{
  410|       |#ifdef HB_NO_OT_LAYOUT_BLOCKLIST
  411|       |  return false;
  412|       |#endif
  413|     11|  return false;
  414|     11|}
hb_ot_layout_table_select_script:
  553|     26|{
  554|     26|  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_SCRIPT_INDEX), "");
  555|     26|  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
  556|     26|  unsigned int i;
  557|       |
  558|     50|  for (i = 0; i < script_count; i++)
  ------------------
  |  Branch (558:15): [True: 26, False: 24]
  ------------------
  559|     26|  {
  560|     26|    if (g.find_script_index (script_tags[i], script_index))
  ------------------
  |  Branch (560:9): [True: 2, False: 24]
  ------------------
  561|      2|    {
  562|      2|      if (chosen_script)
  ------------------
  |  Branch (562:11): [True: 2, False: 0]
  ------------------
  563|      2|	*chosen_script = script_tags[i];
  564|      2|      return true;
  565|      2|    }
  566|     26|  }
  567|       |
  568|       |  /* try finding 'DFLT' */
  569|     24|  if (g.find_script_index (HB_OT_TAG_DEFAULT_SCRIPT, script_index)) {
  ------------------
  |  |   83|     24|#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
  |  |  ------------------
  |  |  |  |  179|     24|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (569:7): [True: 0, False: 24]
  ------------------
  570|      0|    if (chosen_script)
  ------------------
  |  Branch (570:9): [True: 0, False: 0]
  ------------------
  571|      0|      *chosen_script = HB_OT_TAG_DEFAULT_SCRIPT;
  ------------------
  |  |   83|      0|#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  572|      0|    return false;
  573|      0|  }
  574|       |
  575|       |  /* try with 'dflt'; MS site has had typos and many fonts use it now :( */
  576|     24|  if (g.find_script_index (HB_OT_TAG_DEFAULT_LANGUAGE, script_index)) {
  ------------------
  |  |   90|     24|#define HB_OT_TAG_DEFAULT_LANGUAGE	HB_TAG ('d', 'f', 'l', 't')
  |  |  ------------------
  |  |  |  |  179|     24|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (576:7): [True: 0, False: 24]
  ------------------
  577|      0|    if (chosen_script)
  ------------------
  |  Branch (577:9): [True: 0, False: 0]
  ------------------
  578|      0|      *chosen_script = HB_OT_TAG_DEFAULT_LANGUAGE;
  ------------------
  |  |   90|      0|#define HB_OT_TAG_DEFAULT_LANGUAGE	HB_TAG ('d', 'f', 'l', 't')
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  579|      0|    return false;
  580|      0|  }
  581|       |
  582|       |  /* try with 'latn'; some old fonts put their features there even though
  583|       |     they're really trying to support Thai, for example :( */
  584|     24|  if (g.find_script_index (HB_OT_TAG_LATIN_SCRIPT, script_index)) {
  ------------------
  |  |  455|     24|#define HB_OT_TAG_LATIN_SCRIPT		HB_TAG ('l', 'a', 't', 'n')
  |  |  ------------------
  |  |  |  |  179|     24|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (584:7): [True: 0, False: 24]
  ------------------
  585|      0|    if (chosen_script)
  ------------------
  |  Branch (585:9): [True: 0, False: 0]
  ------------------
  586|      0|      *chosen_script = HB_OT_TAG_LATIN_SCRIPT;
  ------------------
  |  |  455|      0|#define HB_OT_TAG_LATIN_SCRIPT		HB_TAG ('l', 'a', 't', 'n')
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  587|      0|    return false;
  588|      0|  }
  589|       |
  590|     24|  if (script_index) *script_index = HB_OT_LAYOUT_NO_SCRIPT_INDEX;
  ------------------
  |  |  193|     24|#define HB_OT_LAYOUT_NO_SCRIPT_INDEX		0xFFFFu
  ------------------
  |  Branch (590:7): [True: 24, False: 0]
  ------------------
  591|     24|  if (chosen_script)
  ------------------
  |  Branch (591:7): [True: 24, False: 0]
  ------------------
  592|     24|    *chosen_script = HB_TAG_NONE;
  ------------------
  |  |  197|     24|#define HB_TAG_NONE HB_TAG(0,0,0,0)
  |  |  ------------------
  |  |  |  |  179|     24|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  593|     24|  return false;
  594|     24|}
hb_ot_layout_script_select_language2:
  762|     26|{
  763|     26|  static_assert ((OT::Index::NOT_FOUND_INDEX == HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX), "");
  764|     26|  const OT::Script &s = get_gsubgpos_table (face, table_tag).get_script (script_index);
  765|     26|  unsigned int i;
  766|       |
  767|     48|  for (i = 0; i < language_count; i++)
  ------------------
  |  Branch (767:15): [True: 22, False: 26]
  ------------------
  768|     22|  {
  769|     22|    if (s.find_lang_sys_index (language_tags[i], language_index))
  ------------------
  |  Branch (769:9): [True: 0, False: 22]
  ------------------
  770|      0|    {
  771|      0|      if (chosen_language)
  ------------------
  |  Branch (771:11): [True: 0, False: 0]
  ------------------
  772|      0|        *chosen_language = language_tags[i];
  773|      0|      return true;
  774|      0|    }
  775|     22|  }
  776|       |
  777|       |  /* try finding 'dflt' */
  778|     26|  if (s.find_lang_sys_index (HB_OT_TAG_DEFAULT_LANGUAGE, language_index))
  ------------------
  |  |   90|     26|#define HB_OT_TAG_DEFAULT_LANGUAGE	HB_TAG ('d', 'f', 'l', 't')
  |  |  ------------------
  |  |  |  |  179|     26|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (778:7): [True: 0, False: 26]
  ------------------
  779|      0|  {
  780|      0|    if (chosen_language)
  ------------------
  |  Branch (780:9): [True: 0, False: 0]
  ------------------
  781|      0|      *chosen_language = HB_OT_TAG_DEFAULT_LANGUAGE;
  ------------------
  |  |   90|      0|#define HB_OT_TAG_DEFAULT_LANGUAGE	HB_TAG ('d', 'f', 'l', 't')
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  782|      0|    return false;
  783|      0|  }
  784|       |
  785|     26|  if (language_index)
  ------------------
  |  Branch (785:7): [True: 26, False: 0]
  ------------------
  786|     26|    *language_index = HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX;
  ------------------
  |  |  205|     26|#define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX	0xFFFFu
  ------------------
  787|     26|  if (chosen_language)
  ------------------
  |  Branch (787:7): [True: 0, False: 26]
  ------------------
  788|      0|    *chosen_language = HB_TAG_NONE;
  ------------------
  |  |  197|      0|#define HB_TAG_NONE HB_TAG(0,0,0,0)
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  789|     26|  return false;
  790|     26|}
hb_ot_layout_script_select_language:
  819|     26|{
  820|     26|  return hb_ot_layout_script_select_language2 (face, table_tag,
  821|     26|					       script_index,
  822|     26|					       language_count, language_tags,
  823|     26|					       language_index, nullptr);
  824|     26|}
hb_ot_layout_language_get_required_feature:
  881|     26|{
  882|     26|  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
  883|     26|  const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
  884|       |
  885|     26|  unsigned int index = l.get_required_feature_index ();
  886|     26|  if (feature_index) *feature_index = index;
  ------------------
  |  Branch (886:7): [True: 26, False: 0]
  ------------------
  887|     26|  if (feature_tag) *feature_tag = g.get_feature_tag (index);
  ------------------
  |  Branch (887:7): [True: 26, False: 0]
  ------------------
  888|       |
  889|     26|  return l.has_required_feature ();
  890|     26|}
hb_ot_layout_table_get_lookup_count:
 1069|     34|{
 1070|     34|  return get_gsubgpos_table (face, table_tag).get_lookup_count ();
 1071|     34|}
hb_ot_layout_collect_features_map:
 1304|     26|{
 1305|     26|  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 1306|     26|  const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
 1307|       |
 1308|     26|  unsigned int count = l.get_feature_indexes (0, nullptr, nullptr);
 1309|     26|  feature_map->alloc (count);
 1310|       |
 1311|     34|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (1311:28): [True: 8, False: 26]
  ------------------
 1312|      8|  {
 1313|      8|    unsigned feature_index = 0;
 1314|      8|    unsigned feature_count = 1;
 1315|      8|    l.get_feature_indexes (i, &feature_count, &feature_index);
 1316|      8|    if (!feature_count)
  ------------------
  |  Branch (1316:9): [True: 0, False: 8]
  ------------------
 1317|      0|      break;
 1318|      8|    hb_tag_t feature_tag = g.get_feature_tag (feature_index);
 1319|      8|    feature_map->set (feature_tag, feature_index);
 1320|      8|  }
 1321|     26|}
hb_ot_layout_table_find_feature_variations:
 1439|   409k|{
 1440|   409k|  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 1441|       |
 1442|   409k|  return g.find_variations_index (coords, num_coords, variations_index);
 1443|   409k|}
hb_ot_layout_feature_with_variations_get_lookups:
 1474|     34|{
 1475|     34|  static_assert ((OT::FeatureVariations::NOT_FOUND_INDEX == HB_OT_LAYOUT_NO_VARIATIONS_INDEX), "");
 1476|     34|  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 1477|       |
 1478|     34|  const OT::Feature &f = g.get_feature_variation (feature_index, variations_index);
 1479|       |
 1480|     34|  return f.get_lookup_indexes (start_offset, lookup_count, lookup_indexes);
 1481|     34|}
hb_ot_layout_has_substitution:
 1502|     13|{
 1503|     13|  return face->table.GSUB->table->has_data ();
 1504|     13|}
_Z29hb_ot_layout_substitute_startP9hb_font_tP11hb_buffer_t:
 1552|   204k|{
 1553|   204k|  _hb_ot_layout_set_glyph_props (font, buffer);
 1554|   204k|}
hb_ot_layout_has_positioning:
 1638|     13|{
 1639|     13|  return face->table.GPOS->table->has_data ();
 1640|     13|}
_Z27hb_ot_layout_position_startP9hb_font_tP11hb_buffer_t:
 1653|   204k|{
 1654|   204k|  GPOS::position_start (font, buffer);
 1655|   204k|}
_Z37hb_ot_layout_position_finish_advancesP9hb_font_tP11hb_buffer_t:
 1668|   204k|{
 1669|   204k|  GPOS::position_finish_advances (font, buffer);
 1670|   204k|}
_Z36hb_ot_layout_position_finish_offsetsP9hb_font_tP11hb_buffer_t:
 1682|   204k|{
 1683|   204k|  GPOS::position_finish_offsets (font, buffer);
 1684|   204k|}
_ZNK11hb_ot_map_t10substituteEPK18hb_ot_shape_plan_tP9hb_font_tP11hb_buffer_t:
 2048|   204k|{
 2049|   204k|  GSUBProxy proxy (font->face);
 2050|   204k|  if (buffer->messaging () &&
  ------------------
  |  Branch (2050:7): [True: 0, False: 204k]
  ------------------
 2051|   204k|      !buffer->message (font, "start table GSUB script tag '%c%c%c%c'", HB_UNTAG (chosen_script[0]))) return;
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
  |  Branch (2051:7): [True: 0, False: 0]
  ------------------
 2052|   204k|  apply (proxy, plan, font, buffer);
 2053|   204k|  if (buffer->messaging ())
  ------------------
  |  Branch (2053:7): [True: 0, False: 204k]
  ------------------
 2054|      0|    (void) buffer->message (font, "end table GSUB script tag '%c%c%c%c'", HB_UNTAG (chosen_script[0]));
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
 2055|   204k|}
_ZNK11hb_ot_map_t8positionEPK18hb_ot_shape_plan_tP9hb_font_tP11hb_buffer_t:
 2058|   204k|{
 2059|   204k|  GPOSProxy proxy (font->face);
 2060|   204k|  if (buffer->messaging () &&
  ------------------
  |  Branch (2060:7): [True: 0, False: 204k]
  ------------------
 2061|   204k|      !buffer->message (font, "start table GPOS script tag '%c%c%c%c'", HB_UNTAG (chosen_script[1]))) return;
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
  |  Branch (2061:7): [True: 0, False: 0]
  ------------------
 2062|   204k|  apply (proxy, plan, font, buffer);
 2063|   204k|  if (buffer->messaging ())
  ------------------
  |  Branch (2063:7): [True: 0, False: 204k]
  ------------------
 2064|      0|    (void) buffer->message (font, "end table GPOS script tag '%c%c%c%c'", HB_UNTAG (chosen_script[1]));
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
 2065|   204k|}
hb-ot-layout.cc:_ZL18get_gsubgpos_tableP9hb_face_tj:
  419|   409k|{
  420|   409k|  switch (table_tag) {
  421|   204k|    case HB_OT_TAG_GSUB: return *face->table.GSUB->table;
  ------------------
  |  |   58|   204k|#define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
  |  |  ------------------
  |  |  |  |  179|   204k|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (421:5): [True: 204k, False: 204k]
  ------------------
  422|   204k|    case HB_OT_TAG_GPOS: return *face->table.GPOS->table;
  ------------------
  |  |   64|   204k|#define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
  |  |  ------------------
  |  |  |  |  179|   204k|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (422:5): [True: 204k, False: 204k]
  ------------------
  423|      0|    default:             return Null (OT::GSUBGPOS);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (423:5): [True: 0, False: 409k]
  ------------------
  424|   409k|  }
  425|   409k|}
hb-ot-layout.cc:_ZL29_hb_ot_layout_set_glyph_propsP9hb_font_tP11hb_buffer_t:
  257|   204k|{
  258|   204k|  _hb_buffer_assert_gsubgpos_vars (buffer);
  259|       |
  260|   204k|  const auto &gdef = *font->face->table.GDEF;
  261|   204k|  unsigned int count = buffer->len;
  262|   204k|  hb_glyph_info_t *info = buffer->info;
  263|  3.13M|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (263:28): [True: 2.93M, False: 204k]
  ------------------
  264|  2.93M|  {
  265|  2.93M|    _hb_glyph_info_set_glyph_props (&info[i], gdef.get_glyph_props (info[i].codepoint));
  266|  2.93M|    _hb_glyph_info_clear_lig_props (&info[i]);
  267|  2.93M|  }
  268|   204k|}
_ZN9GSUBProxyC2EP9hb_face_t:
 1875|   204k|    accel (*face->table.GSUB) {}
_ZN9GPOSProxyC2EP9hb_face_t:
 1887|   204k|    accel (*face->table.GPOS) {}
_ZNK11hb_ot_map_t5applyI9GSUBProxyEEvRKT_PK18hb_ot_shape_plan_tP9hb_font_tP11hb_buffer_t:
 1990|   204k|{
 1991|   204k|  const unsigned int table_index = proxy.table_index;
 1992|   204k|  unsigned int i = 0;
 1993|   204k|  OT::hb_ot_apply_context_t c (table_index, font, buffer, proxy.accel.get_blob ());
 1994|   204k|  c.set_recurse_func (Proxy::Lookup::template dispatch_recurse_func<OT::hb_ot_apply_context_t>);
 1995|       |
 1996|   614k|  for (unsigned int stage_index = 0; stage_index < stages[table_index].length; stage_index++)
  ------------------
  |  Branch (1996:38): [True: 409k, False: 204k]
  ------------------
 1997|   409k|  {
 1998|   409k|    const stage_map_t *stage = &stages[table_index][stage_index];
 1999|   409k|    for (; i < stage->last_lookup; i++)
  ------------------
  |  Branch (1999:12): [True: 18, False: 409k]
  ------------------
 2000|     18|    {
 2001|     18|      auto &lookup = lookups[table_index][i];
 2002|       |
 2003|     18|      unsigned int lookup_index = lookup.index;
 2004|       |
 2005|     18|      auto *accel = proxy.accel.get_accel (lookup_index);
 2006|     18|      if (unlikely (!accel)) continue;
  ------------------
  |  |  260|     18|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 18]
  |  |  ------------------
  ------------------
 2007|       |
 2008|     18|      if (buffer->messaging () &&
  ------------------
  |  Branch (2008:11): [True: 0, False: 18]
  ------------------
 2009|     18|	  !buffer->message (font, "start lookup %u feature '%c%c%c%c'", lookup_index, HB_UNTAG (lookup.feature_tag))) continue;
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
  |  Branch (2009:4): [True: 0, False: 0]
  ------------------
 2010|       |
 2011|       |      /* c.digest is a digest of all the current glyphs in the buffer
 2012|       |       * (plus some past glyphs).
 2013|       |       *
 2014|       |       * Only try applying the lookup if there is any overlap. */
 2015|     18|      if (accel->digest.may_have (c.digest))
  ------------------
  |  Branch (2015:11): [True: 0, False: 18]
  ------------------
 2016|      0|      {
 2017|      0|	c.set_lookup_index (lookup_index);
 2018|      0|	c.set_lookup_mask (lookup.mask, false);
 2019|      0|	c.set_auto_zwj (lookup.auto_zwj, false);
 2020|      0|	c.set_auto_zwnj (lookup.auto_zwnj, false);
 2021|      0|	c.set_random (lookup.random);
 2022|      0|	c.set_per_syllable (lookup.per_syllable, false);
 2023|       |	/* apply_string's set_lookup_props initializes the iterators. */
 2024|       |
 2025|      0|	apply_string<Proxy> (&c,
 2026|      0|			     proxy.accel.table->get_lookup (lookup_index),
 2027|      0|			     *accel);
 2028|      0|      }
 2029|     18|      else if (buffer->messaging ())
  ------------------
  |  Branch (2029:16): [True: 0, False: 18]
  ------------------
 2030|      0|	(void) buffer->message (font, "skipped lookup %u feature '%c%c%c%c' because no glyph matches", lookup_index, HB_UNTAG (lookup.feature_tag));
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
 2031|       |
 2032|     18|      if (buffer->messaging ())
  ------------------
  |  Branch (2032:11): [True: 0, False: 18]
  ------------------
 2033|      0|	(void) buffer->message (font, "end lookup %u feature '%c%c%c%c'", lookup_index, HB_UNTAG (lookup.feature_tag));
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
 2034|     18|    }
 2035|       |
 2036|   409k|    if (stage->pause_func)
  ------------------
  |  Branch (2036:9): [True: 0, False: 409k]
  ------------------
 2037|      0|    {
 2038|      0|      if (stage->pause_func (plan, font, buffer))
  ------------------
  |  Branch (2038:11): [True: 0, False: 0]
  ------------------
 2039|      0|      {
 2040|       |	/* Refresh working buffer digest since buffer changed. */
 2041|      0|	c.digest = buffer->digest ();
 2042|      0|      }
 2043|      0|    }
 2044|   409k|  }
 2045|   204k|}
_ZNK11hb_ot_map_t5applyI9GPOSProxyEEvRKT_PK18hb_ot_shape_plan_tP9hb_font_tP11hb_buffer_t:
 1990|   204k|{
 1991|   204k|  const unsigned int table_index = proxy.table_index;
 1992|   204k|  unsigned int i = 0;
 1993|   204k|  OT::hb_ot_apply_context_t c (table_index, font, buffer, proxy.accel.get_blob ());
 1994|   204k|  c.set_recurse_func (Proxy::Lookup::template dispatch_recurse_func<OT::hb_ot_apply_context_t>);
 1995|       |
 1996|   409k|  for (unsigned int stage_index = 0; stage_index < stages[table_index].length; stage_index++)
  ------------------
  |  Branch (1996:38): [True: 204k, False: 204k]
  ------------------
 1997|   204k|  {
 1998|   204k|    const stage_map_t *stage = &stages[table_index][stage_index];
 1999|   204k|    for (; i < stage->last_lookup; i++)
  ------------------
  |  Branch (1999:12): [True: 27, False: 204k]
  ------------------
 2000|     27|    {
 2001|     27|      auto &lookup = lookups[table_index][i];
 2002|       |
 2003|     27|      unsigned int lookup_index = lookup.index;
 2004|       |
 2005|     27|      auto *accel = proxy.accel.get_accel (lookup_index);
 2006|     27|      if (unlikely (!accel)) continue;
  ------------------
  |  |  260|     27|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 27]
  |  |  ------------------
  ------------------
 2007|       |
 2008|     27|      if (buffer->messaging () &&
  ------------------
  |  Branch (2008:11): [True: 0, False: 27]
  ------------------
 2009|     27|	  !buffer->message (font, "start lookup %u feature '%c%c%c%c'", lookup_index, HB_UNTAG (lookup.feature_tag))) continue;
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
  |  Branch (2009:4): [True: 0, False: 0]
  ------------------
 2010|       |
 2011|       |      /* c.digest is a digest of all the current glyphs in the buffer
 2012|       |       * (plus some past glyphs).
 2013|       |       *
 2014|       |       * Only try applying the lookup if there is any overlap. */
 2015|     27|      if (accel->digest.may_have (c.digest))
  ------------------
  |  Branch (2015:11): [True: 0, False: 27]
  ------------------
 2016|      0|      {
 2017|      0|	c.set_lookup_index (lookup_index);
 2018|      0|	c.set_lookup_mask (lookup.mask, false);
 2019|      0|	c.set_auto_zwj (lookup.auto_zwj, false);
 2020|      0|	c.set_auto_zwnj (lookup.auto_zwnj, false);
 2021|      0|	c.set_random (lookup.random);
 2022|      0|	c.set_per_syllable (lookup.per_syllable, false);
 2023|       |	/* apply_string's set_lookup_props initializes the iterators. */
 2024|       |
 2025|      0|	apply_string<Proxy> (&c,
 2026|      0|			     proxy.accel.table->get_lookup (lookup_index),
 2027|      0|			     *accel);
 2028|      0|      }
 2029|     27|      else if (buffer->messaging ())
  ------------------
  |  Branch (2029:16): [True: 0, False: 27]
  ------------------
 2030|      0|	(void) buffer->message (font, "skipped lookup %u feature '%c%c%c%c' because no glyph matches", lookup_index, HB_UNTAG (lookup.feature_tag));
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
 2031|       |
 2032|     27|      if (buffer->messaging ())
  ------------------
  |  Branch (2032:11): [True: 0, False: 27]
  ------------------
 2033|      0|	(void) buffer->message (font, "end lookup %u feature '%c%c%c%c'", lookup_index, HB_UNTAG (lookup.feature_tag));
  ------------------
  |  |  190|      0|#define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
  ------------------
 2034|     27|    }
 2035|       |
 2036|   204k|    if (stage->pause_func)
  ------------------
  |  Branch (2036:9): [True: 0, False: 204k]
  ------------------
 2037|      0|    {
 2038|      0|      if (stage->pause_func (plan, font, buffer))
  ------------------
  |  Branch (2038:11): [True: 0, False: 0]
  ------------------
 2039|      0|      {
 2040|       |	/* Refresh working buffer digest since buffer changed. */
 2041|      0|	c.digest = buffer->digest ();
 2042|      0|      }
 2043|      0|    }
 2044|   204k|  }
 2045|   204k|}

hb-ot-shape.cc:_ZL32_hb_buffer_allocate_unicode_varsP11hb_buffer_t:
  568|   204k|{
  569|   204k|  HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props);
  ------------------
  |  |  675|   204k|#define HB_BUFFER_ALLOCATE_VAR(b, var)		HB_BUFFER_XALLOCATE_VAR (b, allocate_var,     var ())
  |  |  ------------------
  |  |  |  |  673|   204k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   204k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  570|   204k|}
hb-ot-shape.cc:_ZL32_hb_glyph_info_set_unicode_propsP15hb_glyph_info_tP11hb_buffer_t:
  205|  2.93M|{
  206|  2.93M|  hb_unicode_funcs_t *unicode = buffer->unicode;
  207|  2.93M|  unsigned int u = info->codepoint;
  208|  2.93M|  unsigned int gen_cat = (unsigned int) unicode->general_category (u);
  209|  2.93M|  unsigned int props = gen_cat;
  210|       |
  211|  2.93M|  if (u >= 0x80u)
  ------------------
  |  Branch (211:7): [True: 288k, False: 2.64M]
  ------------------
  212|   288k|  {
  213|   288k|    buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
  214|       |
  215|   288k|    if (unlikely (unicode->is_default_ignorable (u)))
  ------------------
  |  |  260|   288k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 9, False: 288k]
  |  |  ------------------
  ------------------
  216|      9|    {
  217|      9|      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
  218|      9|      props |=  UPROPS_MASK_IGNORABLE;
  219|      9|      if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
  ------------------
  |  Branch (219:11): [True: 0, False: 9]
  ------------------
  220|      9|      else if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
  ------------------
  |  Branch (220:16): [True: 0, False: 9]
  ------------------
  221|       |      /* Mongolian Free Variation Selectors need to be remembered
  222|       |       * because although we need to hide them like default-ignorables,
  223|       |       * they need to non-ignorable during shaping.  This is similar to
  224|       |       * what we do for joiners in Indic-like shapers, but since the
  225|       |       * FVSes are GC=Mn, we have use a separate bit to remember them.
  226|       |       * Fixes:
  227|       |       * https://github.com/harfbuzz/harfbuzz/issues/234 */
  228|      9|      else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x180Bu, 0x180Du, 0x180Fu, 0x180Fu))) props |= UPROPS_MASK_HIDDEN;
  ------------------
  |  |  260|      9|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 9]
  |  |  ------------------
  ------------------
  229|       |      /* TAG characters need similar treatment. Fixes:
  230|       |       * https://github.com/harfbuzz/harfbuzz/issues/463 */
  231|      9|      else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
  ------------------
  |  |  260|      9|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 3, False: 6]
  |  |  ------------------
  ------------------
  232|       |      /* COMBINING GRAPHEME JOINER should not be skipped; at least some times.
  233|       |       * https://github.com/harfbuzz/harfbuzz/issues/554 */
  234|      6|      else if (unlikely (u == 0x034Fu))
  ------------------
  |  |  260|      6|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 6]
  |  |  ------------------
  ------------------
  235|      0|      {
  236|      0|	buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CGJ;
  237|      0|	props |= UPROPS_MASK_HIDDEN;
  238|      0|      }
  239|      9|    }
  240|       |
  241|   288k|    if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (gen_cat)))
  ------------------
  |  |  260|   576k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 288k]
  |  |  |  Branch (260:47): [True: 288k, False: 0]
  |  |  ------------------
  ------------------
  242|      0|    {
  243|      0|      props |= UPROPS_MASK_CONTINUATION;
  244|      0|      props |= unicode->modified_combining_class (u)<<8;
  245|      0|    }
  246|   288k|  }
  247|       |
  248|  2.93M|  info->unicode_props() = props;
  ------------------
  |  |  142|  2.93M|#define unicode_props()		var2.u16[0]
  ------------------
  249|  2.93M|}
hb-ot-shape.cc:_ZL35_hb_glyph_info_get_general_categoryPK15hb_glyph_info_t:
  261|  8.20M|{
  262|  8.20M|  return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
  ------------------
  |  |  142|  8.20M|#define unicode_props()		var2.u16[0]
  ------------------
  263|  8.20M|}
hb-ot-shape.cc:_ZL31_hb_glyph_info_set_continuationP15hb_glyph_info_t:
  329|      3|{
  330|      3|  info->unicode_props() |= UPROPS_MASK_CONTINUATION;
  ------------------
  |  |  142|      3|#define unicode_props()		var2.u16[0]
  ------------------
  331|      3|}
hb-ot-shape.cc:_ZL30_hb_glyph_info_is_continuationPK15hb_glyph_info_t:
  339|  2.72M|{
  340|  2.72M|  return info->unicode_props() & UPROPS_MASK_CONTINUATION;
  ------------------
  |  |  142|  2.72M|#define unicode_props()		var2.u16[0]
  ------------------
  341|  2.72M|}
hb-ot-shape.cc:_ZL21_hb_glyph_info_is_zwjPK15hb_glyph_info_t:
  371|  2.33M|{
  372|  2.33M|  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
  ------------------
  |  |  142|      9|#define unicode_props()		var2.u16[0]
  ------------------
  |  Branch (372:10): [True: 9, False: 2.33M]
  |  Branch (372:53): [True: 0, False: 9]
  ------------------
  373|  2.33M|}
hb-ot-shape.cc:_ZL32_hb_glyph_info_is_unicode_formatPK15hb_glyph_info_t:
  360|  2.33M|{
  361|  2.33M|  return _hb_glyph_info_get_general_category (info) ==
  362|  2.33M|	 HB_UNICODE_GENERAL_CATEGORY_FORMAT;
  363|  2.33M|}
hb-ot-shape.cc:_ZL23_hb_grapheme_group_funcRK15hb_glyph_info_tS1_:
  346|  2.72M|{ return _hb_glyph_info_is_continuation (&b); }
hb-ot-shape.cc:_ZL33_hb_buffer_allocate_gsubgpos_varsP11hb_buffer_t:
  586|   204k|{
  587|   204k|  HB_BUFFER_ALLOCATE_VAR (buffer, glyph_props);
  ------------------
  |  |  675|   204k|#define HB_BUFFER_ALLOCATE_VAR(b, var)		HB_BUFFER_XALLOCATE_VAR (b, allocate_var,     var ())
  |  |  ------------------
  |  |  |  |  673|   204k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   204k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  588|   204k|  HB_BUFFER_ALLOCATE_VAR (buffer, lig_props);
  ------------------
  |  |  675|   204k|#define HB_BUFFER_ALLOCATE_VAR(b, var)		HB_BUFFER_XALLOCATE_VAR (b, allocate_var,     var ())
  |  |  ------------------
  |  |  |  |  673|   204k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   204k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  589|   204k|}
hb-ot-shape.cc:_ZL35_hb_glyph_info_is_default_ignorablePK15hb_glyph_info_t:
  310|   494k|{
  311|   494k|  return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
  ------------------
  |  |  142|   494k|#define unicode_props()		var2.u16[0]
  ------------------
  |  Branch (311:10): [True: 18, False: 494k]
  ------------------
  312|   494k|	 !_hb_glyph_info_substituted (info);
  ------------------
  |  Branch (312:3): [True: 18, False: 0]
  ------------------
  313|   494k|}
hb-ot-shape.cc:_ZL26_hb_glyph_info_substitutedPK15hb_glyph_info_t:
  516|     18|{
  517|     18|  return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED;
  ------------------
  |  |  145|     18|#define glyph_props()		var1.u16[0] /* GDEF glyph properties */
  ------------------
  518|     18|}
hb-ot-shape.cc:_ZL30_hb_glyph_info_set_glyph_propsP15hb_glyph_info_tj:
  486|  2.93M|{
  487|  2.93M|  info->glyph_props() = props;
  ------------------
  |  |  145|  2.93M|#define glyph_props()		var1.u16[0] /* GDEF glyph properties */
  ------------------
  488|  2.93M|}
hb-ot-shape.cc:_ZL22_hb_glyph_info_is_markPK15hb_glyph_info_t:
  510|  2.93M|{
  511|  2.93M|  return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK;
  ------------------
  |  |  145|  2.93M|#define glyph_props()		var1.u16[0] /* GDEF glyph properties */
  ------------------
  512|  2.93M|}
hb-ot-shape.cc:_ZL35_hb_buffer_deallocate_gsubgpos_varsP11hb_buffer_t:
  593|   204k|{
  594|   204k|  HB_BUFFER_DEALLOCATE_VAR (buffer, lig_props);
  ------------------
  |  |  677|   204k|#define HB_BUFFER_DEALLOCATE_VAR(b, var)	HB_BUFFER_XALLOCATE_VAR (b, deallocate_var,   var ())
  |  |  ------------------
  |  |  |  |  673|   204k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   204k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  595|   204k|  HB_BUFFER_DEALLOCATE_VAR (buffer, glyph_props);
  ------------------
  |  |  677|   204k|#define HB_BUFFER_DEALLOCATE_VAR(b, var)	HB_BUFFER_XALLOCATE_VAR (b, deallocate_var,   var ())
  |  |  ------------------
  |  |  |  |  673|   204k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   204k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  596|   204k|}
hb-ot-shape.cc:_ZL34_hb_buffer_deallocate_unicode_varsP11hb_buffer_t:
  574|   204k|{
  575|   204k|  HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props);
  ------------------
  |  |  677|   204k|#define HB_BUFFER_DEALLOCATE_VAR(b, var)	HB_BUFFER_XALLOCATE_VAR (b, deallocate_var,   var ())
  |  |  ------------------
  |  |  |  |  673|   204k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   204k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  576|   204k|}
hb-ot-layout.cc:_ZL31_hb_buffer_assert_gsubgpos_varsP11hb_buffer_t:
  600|   409k|{
  601|   409k|  HB_BUFFER_ASSERT_VAR (buffer, glyph_props);
  ------------------
  |  |  678|   409k|#define HB_BUFFER_ASSERT_VAR(b, var)		HB_BUFFER_XALLOCATE_VAR (b, assert_var,       var ())
  |  |  ------------------
  |  |  |  |  673|   409k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   409k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  602|   409k|  HB_BUFFER_ASSERT_VAR (buffer, lig_props);
  ------------------
  |  |  678|   409k|#define HB_BUFFER_ASSERT_VAR(b, var)		HB_BUFFER_XALLOCATE_VAR (b, assert_var,       var ())
  |  |  ------------------
  |  |  |  |  673|   409k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   409k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  603|   409k|}
hb-ot-layout.cc:_ZL30_hb_glyph_info_set_glyph_propsP15hb_glyph_info_tj:
  486|  2.93M|{
  487|  2.93M|  info->glyph_props() = props;
  ------------------
  |  |  145|  2.93M|#define glyph_props()		var1.u16[0] /* GDEF glyph properties */
  ------------------
  488|  2.93M|}
hb-ot-layout.cc:_ZL30_hb_glyph_info_clear_lig_propsP15hb_glyph_info_t:
  414|  2.93M|{
  415|  2.93M|  info->lig_props() = 0;
  ------------------
  |  |  146|  2.93M|#define lig_props()		var1.u8[2] /* GSUB/GPOS ligature tracking */
  ------------------
  416|  2.93M|}
hb-ot-shape-normalize.cc:_ZL30_hb_buffer_assert_unicode_varsP11hb_buffer_t:
  580|   204k|{
  581|   204k|  HB_BUFFER_ASSERT_VAR (buffer, unicode_props);
  ------------------
  |  |  678|   204k|#define HB_BUFFER_ASSERT_VAR(b, var)		HB_BUFFER_XALLOCATE_VAR (b, assert_var,       var ())
  |  |  ------------------
  |  |  |  |  673|   204k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   204k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  582|   204k|}
hb-ot-shape-normalize.cc:_ZL30_hb_glyph_info_is_unicode_markPK15hb_glyph_info_t:
  267|  2.72M|{
  268|  2.72M|  return HB_UNICODE_GENERAL_CATEGORY_IS_MARK (info->unicode_props() & UPROPS_MASK_GEN_CAT);
  ------------------
  |  |  355|  2.72M|	(FLAG_UNSAFE (gen_cat) & \
  |  |  ------------------
  |  |  |  |   74|  2.72M|#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (74:25): [True: 2.72M, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  356|  2.72M|	 (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
  |  |  ------------------
  |  |  |  |   73|  2.72M|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|  2.72M|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  357|  2.72M|	  FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
  |  |  ------------------
  |  |  |  |   73|  2.72M|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|  2.72M|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  358|  2.72M|	  FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
  |  |  ------------------
  |  |  |  |   73|  2.72M|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|  2.72M|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  269|  2.72M|}
hb-ot-shape-normalize.cc:_ZL31_hb_glyph_info_is_unicode_spacePK15hb_glyph_info_t:
  287|   485k|{
  288|   485k|  return _hb_glyph_info_get_general_category (info) ==
  289|   485k|	 HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
  290|   485k|}
hb-ot-shape-normalize.cc:_ZL35_hb_glyph_info_get_general_categoryPK15hb_glyph_info_t:
  261|   485k|{
  262|   485k|  return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
  ------------------
  |  |  142|   485k|#define unicode_props()		var2.u16[0]
  ------------------
  263|   485k|}

_ZN19hb_ot_map_builder_tC2EP9hb_face_tRK23hb_segment_properties_t:
   47|     13|{
   48|     13|  hb_memset (this, 0, sizeof (*this));
   49|       |
   50|     13|  feature_infos.init ();
   51|     39|  for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (51:38): [True: 26, False: 13]
  ------------------
   52|     26|    stages[table_index].init ();
   53|       |
   54|     13|  face = face_;
   55|     13|  props = props_;
   56|       |
   57|       |  /* Fetch script/language indices for GSUB/GPOS.  We need these later to skip
   58|       |   * features not available in either table and not waste precious bits for them. */
   59|       |
   60|     13|  unsigned int script_count = HB_OT_MAX_TAGS_PER_SCRIPT;
  ------------------
  |  |   99|     13|#define HB_OT_MAX_TAGS_PER_SCRIPT	3u
  ------------------
   61|     13|  unsigned int language_count = HB_OT_MAX_TAGS_PER_LANGUAGE;
  ------------------
  |  |  107|     13|#define HB_OT_MAX_TAGS_PER_LANGUAGE	3u
  ------------------
   62|     13|  hb_tag_t script_tags[HB_OT_MAX_TAGS_PER_SCRIPT];
   63|     13|  hb_tag_t language_tags[HB_OT_MAX_TAGS_PER_LANGUAGE];
   64|       |
   65|     13|  hb_ot_tags_from_script_and_language (props.script,
   66|     13|				       props.language,
   67|     13|				       &script_count,
   68|     13|				       script_tags,
   69|     13|				       &language_count,
   70|     13|				       language_tags);
   71|       |
   72|     39|  for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (72:38): [True: 26, False: 13]
  ------------------
   73|     26|  {
   74|     26|    hb_tag_t table_tag = table_tags[table_index];
   75|     26|    found_script[table_index] = (bool) hb_ot_layout_table_select_script (face,
   76|     26|									 table_tag,
   77|     26|									 script_count,
   78|     26|									 script_tags,
   79|     26|									 &script_index[table_index],
   80|     26|									 &chosen_script[table_index]);
   81|     26|    hb_ot_layout_script_select_language (face,
   82|     26|					 table_tag,
   83|     26|					 script_index[table_index],
   84|     26|					 language_count,
   85|     26|					 language_tags,
   86|     26|					 &language_index[table_index]);
   87|     26|  }
   88|     13|}
_ZN19hb_ot_map_builder_tD2Ev:
   91|     13|{
   92|     13|  feature_infos.fini ();
   93|     39|  for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (93:38): [True: 26, False: 13]
  ------------------
   94|     26|    stages[table_index].fini ();
   95|     13|}
_ZN19hb_ot_map_builder_t11add_featureEj25hb_ot_map_feature_flags_tj:
  100|    403|{
  101|    403|  if (unlikely (!tag)) return;
  ------------------
  |  |  260|    403|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 403]
  |  |  ------------------
  ------------------
  102|    403|  feature_info_t *info = feature_infos.push();
  103|    403|  info->tag = tag;
  104|    403|  info->seq = feature_infos.length;
  105|    403|  info->max_value = value;
  106|    403|  info->flags = flags;
  107|    403|  info->default_value = (flags & F_GLOBAL) ? value : 0;
  ------------------
  |  Branch (107:25): [True: 364, False: 39]
  ------------------
  108|    403|  info->stage[0] = current_stage[0];
  109|    403|  info->stage[1] = current_stage[1];
  110|    403|}
_ZN19hb_ot_map_builder_t11add_lookupsER11hb_ot_map_tjjjjbbbbj:
  138|     34|{
  139|     34|  unsigned int lookup_indices[32];
  140|     34|  unsigned int offset, len;
  141|     34|  unsigned int table_lookup_count;
  142|       |
  143|     34|  table_lookup_count = hb_ot_layout_table_get_lookup_count (face, table_tags[table_index]);
  144|       |
  145|     34|  offset = 0;
  146|     34|  do {
  147|     34|    len = ARRAY_LENGTH (lookup_indices);
  148|     34|    hb_ot_layout_feature_with_variations_get_lookups (face,
  149|     34|						      table_tags[table_index],
  150|     34|						      feature_index,
  151|     34|						      variations_index,
  152|     34|						      offset, &len,
  153|     34|						      lookup_indices);
  154|       |
  155|     39|    for (unsigned int i = 0; i < len; i++)
  ------------------
  |  Branch (155:30): [True: 5, False: 34]
  ------------------
  156|      5|    {
  157|      5|      if (lookup_indices[i] >= table_lookup_count)
  ------------------
  |  Branch (157:11): [True: 0, False: 5]
  ------------------
  158|      0|	continue;
  159|      5|      hb_ot_map_t::lookup_map_t *lookup = m.lookups[table_index].push ();
  160|      5|      lookup->mask = mask;
  161|      5|      lookup->index = lookup_indices[i];
  162|      5|      lookup->auto_zwnj = auto_zwnj;
  163|      5|      lookup->auto_zwj = auto_zwj;
  164|      5|      lookup->random = random;
  165|      5|      lookup->per_syllable = per_syllable;
  166|      5|      lookup->feature_tag = feature_tag;
  167|      5|    }
  168|       |
  169|     34|    offset += len;
  170|     34|  } while (len == ARRAY_LENGTH (lookup_indices));
  ------------------
  |  Branch (170:12): [True: 0, False: 34]
  ------------------
  171|     34|}
_ZN19hb_ot_map_builder_t9add_pauseEjPFbPK18hb_ot_shape_plan_tP9hb_font_tP11hb_buffer_tE:
  175|     39|{
  176|     39|  stage_info_t *s = stages[table_index].push ();
  177|     39|  s->index = current_stage[table_index];
  178|     39|  s->pause_func = pause_func;
  179|       |
  180|     39|  current_stage[table_index]++;
  181|     39|}
_ZN19hb_ot_map_builder_t7compileER11hb_ot_map_tRK22hb_ot_shape_plan_key_t:
  186|     13|{
  187|     13|  unsigned int global_bit_shift = 8 * sizeof (hb_mask_t) - 1;
  188|     13|  unsigned int global_bit_mask = 1u << global_bit_shift;
  189|       |
  190|     13|  m.global_mask = global_bit_mask;
  191|       |
  192|     13|  unsigned int required_feature_index[2];
  193|     13|  hb_tag_t required_feature_tag[2];
  194|       |  /* We default to applying required feature in stage 0.  If the required
  195|       |   * feature has a tag that is known to the shaper, we apply required feature
  196|       |   * in the stage for that tag.
  197|       |   */
  198|     13|  unsigned int required_feature_stage[2] = {0, 0};
  199|       |
  200|     39|  for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (200:38): [True: 26, False: 13]
  ------------------
  201|     26|  {
  202|     26|    m.chosen_script[table_index] = chosen_script[table_index];
  203|     26|    m.found_script[table_index] = found_script[table_index];
  204|       |
  205|     26|    hb_ot_layout_language_get_required_feature (face,
  206|     26|						table_tags[table_index],
  207|     26|						script_index[table_index],
  208|     26|						language_index[table_index],
  209|     26|						&required_feature_index[table_index],
  210|     26|						&required_feature_tag[table_index]);
  211|     26|  }
  212|       |
  213|       |  /* Sort features and merge duplicates */
  214|     13|  if (feature_infos.length)
  ------------------
  |  Branch (214:7): [True: 13, False: 0]
  ------------------
  215|     13|  {
  216|     13|    if (!is_simple)
  ------------------
  |  Branch (216:9): [True: 13, False: 0]
  ------------------
  217|     13|      feature_infos.qsort ();
  218|     13|    auto *f = feature_infos.arrayZ;
  219|     13|    unsigned int j = 0;
  220|     13|    unsigned count = feature_infos.length;
  221|    403|    for (unsigned int i = 1; i < count; i++)
  ------------------
  |  Branch (221:30): [True: 390, False: 13]
  ------------------
  222|    390|      if (f[i].tag != f[j].tag)
  ------------------
  |  Branch (222:11): [True: 351, False: 39]
  ------------------
  223|    351|	f[++j] = f[i];
  224|     39|      else {
  225|     39|	if (f[i].flags & F_GLOBAL) {
  ------------------
  |  Branch (225:6): [True: 39, False: 0]
  ------------------
  226|     39|	  f[j].flags |= F_GLOBAL;
  227|     39|	  f[j].max_value = f[i].max_value;
  228|     39|	  f[j].default_value = f[i].default_value;
  229|     39|	} else {
  230|      0|	  if (f[j].flags & F_GLOBAL)
  ------------------
  |  Branch (230:8): [True: 0, False: 0]
  ------------------
  231|      0|	    f[j].flags ^= F_GLOBAL;
  232|      0|	  f[j].max_value = hb_max (f[j].max_value, f[i].max_value);
  233|       |	  /* Inherit default_value from j */
  234|      0|	}
  235|     39|	f[j].flags |= (f[i].flags & F_HAS_FALLBACK);
  236|     39|	f[j].stage[0] = hb_min (f[j].stage[0], f[i].stage[0]);
  237|     39|	f[j].stage[1] = hb_min (f[j].stage[1], f[i].stage[1]);
  238|     39|      }
  239|     13|    feature_infos.shrink (j + 1);
  240|     13|  }
  241|       |
  242|     13|  hb_map_t feature_indices[2];
  243|     39|  for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (243:38): [True: 26, False: 13]
  ------------------
  244|     26|    hb_ot_layout_collect_features_map (face,
  245|     26|				       table_tags[table_index],
  246|     26|				       script_index[table_index],
  247|     26|				       language_index[table_index],
  248|     26|				       &feature_indices[table_index]);
  249|       |
  250|       |  /* Allocate bits now */
  251|     13|  static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), "");
  252|     13|  unsigned int next_bit = hb_popcount (HB_GLYPH_FLAG_DEFINED) + 1;
  253|       |
  254|     13|  unsigned count = feature_infos.length;
  255|    377|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (255:28): [True: 364, False: 13]
  ------------------
  256|    364|  {
  257|    364|    const feature_info_t *info = &feature_infos[i];
  258|       |
  259|    364|    unsigned int bits_needed;
  260|       |
  261|    364|    if ((info->flags & F_GLOBAL) && info->max_value == 1)
  ------------------
  |  Branch (261:9): [True: 325, False: 39]
  |  Branch (261:37): [True: 273, False: 52]
  ------------------
  262|       |      /* Uses the global bit */
  263|    273|      bits_needed = 0;
  264|     91|    else
  265|       |      /* Limit bits per feature. */
  266|     91|      bits_needed = hb_min (HB_OT_MAP_MAX_BITS, hb_bit_storage (info->max_value));
  ------------------
  |  |   35|     91|#define HB_OT_MAP_MAX_BITS 8u
  ------------------
  267|       |
  268|    364|    if (!info->max_value || next_bit + bits_needed >= global_bit_shift)
  ------------------
  |  Branch (268:9): [True: 39, False: 325]
  |  Branch (268:29): [True: 0, False: 325]
  ------------------
  269|     39|      continue; /* Feature disabled, or not enough bits. */
  270|       |
  271|    325|    bool found = false;
  272|    325|    unsigned int feature_index[2];
  273|    975|    for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (273:40): [True: 650, False: 325]
  ------------------
  274|    650|    {
  275|    650|      if (required_feature_tag[table_index] == info->tag)
  ------------------
  |  Branch (275:11): [True: 0, False: 650]
  ------------------
  276|      0|	required_feature_stage[table_index] = info->stage[table_index];
  277|       |
  278|    650|      hb_codepoint_t *index;
  279|    650|      if (feature_indices[table_index].has (info->tag, &index))
  ------------------
  |  Branch (279:11): [True: 4, False: 646]
  ------------------
  280|      4|      {
  281|      4|        feature_index[table_index] = *index;
  282|      4|        found = true;
  283|      4|      }
  284|    646|      else
  285|    646|        feature_index[table_index] = HB_OT_LAYOUT_NO_FEATURE_INDEX;
  ------------------
  |  |  199|    646|#define HB_OT_LAYOUT_NO_FEATURE_INDEX		0xFFFFu
  ------------------
  286|    650|    }
  287|    325|    if (!found && (info->flags & F_GLOBAL_SEARCH))
  ------------------
  |  Branch (287:9): [True: 321, False: 4]
  |  Branch (287:19): [True: 0, False: 321]
  ------------------
  288|      0|    {
  289|      0|      for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (289:42): [True: 0, False: 0]
  ------------------
  290|      0|      {
  291|      0|	found |= (bool) hb_ot_layout_table_find_feature (face,
  292|      0|							 table_tags[table_index],
  293|      0|							 info->tag,
  294|      0|							 &feature_index[table_index]);
  295|      0|      }
  296|      0|    }
  297|    325|    if (!found && !(info->flags & F_HAS_FALLBACK))
  ------------------
  |  Branch (297:9): [True: 321, False: 4]
  |  Branch (297:19): [True: 308, False: 13]
  ------------------
  298|    308|      continue;
  299|       |
  300|       |
  301|     17|    hb_ot_map_t::feature_map_t *map = m.features.push ();
  302|       |
  303|     17|    map->tag = info->tag;
  304|     17|    map->index[0] = feature_index[0];
  305|     17|    map->index[1] = feature_index[1];
  306|     17|    map->stage[0] = info->stage[0];
  307|     17|    map->stage[1] = info->stage[1];
  308|     17|    map->auto_zwnj = !(info->flags & F_MANUAL_ZWNJ);
  309|     17|    map->auto_zwj = !(info->flags & F_MANUAL_ZWJ);
  310|     17|    map->random = !!(info->flags & F_RANDOM);
  311|     17|    map->per_syllable = !!(info->flags & F_PER_SYLLABLE);
  312|     17|    if ((info->flags & F_GLOBAL) && info->max_value == 1) {
  ------------------
  |  Branch (312:9): [True: 17, False: 0]
  |  Branch (312:37): [True: 17, False: 0]
  ------------------
  313|       |      /* Uses the global bit */
  314|     17|      map->shift = global_bit_shift;
  315|     17|      map->mask = global_bit_mask;
  316|     17|    } else {
  317|      0|      map->shift = next_bit;
  318|      0|      map->mask = (1u << (next_bit + bits_needed)) - (1u << next_bit);
  319|      0|      next_bit += bits_needed;
  320|      0|      m.global_mask |= (info->default_value << map->shift) & map->mask;
  321|      0|    }
  322|     17|    map->_1_mask = (1u << map->shift) & map->mask;
  323|     17|    map->needs_fallback = !found;
  324|     17|  }
  325|       |  //feature_infos.shrink (0); /* Done with these */
  326|     13|  if (is_simple)
  ------------------
  |  Branch (326:7): [True: 0, False: 13]
  ------------------
  327|      0|    m.features.qsort ();
  328|       |
  329|     13|  add_gsub_pause (nullptr);
  330|     13|  add_gpos_pause (nullptr);
  331|       |
  332|     39|  for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (332:38): [True: 26, False: 13]
  ------------------
  333|     26|  {
  334|       |    /* Collect lookup indices for features */
  335|     26|    auto &lookups = m.lookups[table_index];
  336|       |
  337|     26|    unsigned int stage_index = 0;
  338|     26|    unsigned int last_num_lookups = 0;
  339|     65|    for (unsigned stage = 0; stage < current_stage[table_index]; stage++)
  ------------------
  |  Branch (339:30): [True: 39, False: 26]
  ------------------
  340|     39|    {
  341|     39|      if (required_feature_index[table_index] != HB_OT_LAYOUT_NO_FEATURE_INDEX &&
  ------------------
  |  |  199|     78|#define HB_OT_LAYOUT_NO_FEATURE_INDEX		0xFFFFu
  ------------------
  |  Branch (341:11): [True: 0, False: 39]
  ------------------
  342|     39|	  required_feature_stage[table_index] == stage)
  ------------------
  |  Branch (342:4): [True: 0, False: 0]
  ------------------
  343|      0|	add_lookups (m, table_index,
  344|      0|		     required_feature_index[table_index],
  345|      0|		     key.variations_index[table_index],
  346|      0|		     global_bit_mask);
  347|       |
  348|     39|      for (auto &feature : m.features)
  ------------------
  |  Branch (348:26): [True: 51, False: 39]
  ------------------
  349|     51|      {
  350|     51|	if (feature.stage[table_index] == stage)
  ------------------
  |  Branch (350:6): [True: 34, False: 17]
  ------------------
  351|     34|	  add_lookups (m, table_index,
  352|     34|		       feature.index[table_index],
  353|     34|		       key.variations_index[table_index],
  354|     34|		       feature.mask,
  355|     34|		       feature.auto_zwnj,
  356|     34|		       feature.auto_zwj,
  357|     34|		       feature.random,
  358|     34|		       feature.per_syllable,
  359|     34|		       feature.tag);
  360|     51|      }
  361|       |
  362|       |      /* Sort lookups and merge duplicates */
  363|     39|      if (last_num_lookups + 1 < lookups.length)
  ------------------
  |  Branch (363:11): [True: 2, False: 37]
  ------------------
  364|      2|      {
  365|      2|	lookups.as_array ().sub_array (last_num_lookups, lookups.length - last_num_lookups).qsort ();
  366|       |
  367|      2|	unsigned int j = last_num_lookups;
  368|      5|	for (unsigned int i = j + 1; i < lookups.length; i++)
  ------------------
  |  Branch (368:31): [True: 3, False: 2]
  ------------------
  369|      3|	  if (lookups.arrayZ[i].index != lookups.arrayZ[j].index)
  ------------------
  |  Branch (369:8): [True: 3, False: 0]
  ------------------
  370|      3|	    lookups.arrayZ[++j] = lookups.arrayZ[i];
  371|      0|	  else
  372|      0|	  {
  373|      0|	    lookups.arrayZ[j].mask |= lookups.arrayZ[i].mask;
  374|      0|	    lookups.arrayZ[j].auto_zwnj &= lookups.arrayZ[i].auto_zwnj;
  375|      0|	    lookups.arrayZ[j].auto_zwj &= lookups.arrayZ[i].auto_zwj;
  376|      0|	  }
  377|      2|	lookups.shrink (j + 1);
  378|      2|      }
  379|       |
  380|     39|      last_num_lookups = lookups.length;
  381|       |
  382|     39|      if (stage_index < stages[table_index].length && stages[table_index][stage_index].index == stage) {
  ------------------
  |  Branch (382:11): [True: 39, False: 0]
  |  Branch (382:55): [True: 39, False: 0]
  ------------------
  383|     39|	hb_ot_map_t::stage_map_t *stage_map = m.stages[table_index].push ();
  384|     39|	stage_map->last_lookup = last_num_lookups;
  385|     39|	stage_map->pause_func = stages[table_index][stage_index].pause_func;
  386|       |
  387|     39|	stage_index++;
  388|     39|      }
  389|     39|    }
  390|     26|  }
  391|     13|}

_ZNK11hb_ot_map_t13feature_map_t3cmpEj:
   62|    133|    { return tag_ < tag ? -1 : tag_ > tag ? 1 : 0; }
  ------------------
  |  Branch (62:14): [True: 94, False: 39]
  |  Branch (62:32): [True: 25, False: 14]
  ------------------
_ZN11hb_ot_map_t12lookup_map_t3cmpEPKvS2_:
   82|      4|    {
   83|      4|      const lookup_map_t *a = (const lookup_map_t *) pa;
   84|      4|      const lookup_map_t *b = (const lookup_map_t *) pb;
   85|      4|      return a->index < b->index ? -1 : a->index > b->index ? 1 : 0;
  ------------------
  |  Branch (85:14): [True: 2, False: 2]
  |  Branch (85:41): [True: 2, False: 0]
  ------------------
   86|      4|    }
_ZN11hb_ot_map_t4initEv:
   99|     13|  {
  100|     13|    hb_memset (this, 0, sizeof (*this));
  101|       |
  102|     13|    features.init0 ();
  103|     39|    for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (103:40): [True: 26, False: 13]
  ------------------
  104|     26|    {
  105|     26|      lookups[table_index].init0 ();
  106|     26|      stages[table_index].init0 ();
  107|     26|    }
  108|     13|  }
_ZN11hb_ot_map_t4finiEv:
  110|     13|  {
  111|     13|    features.fini ();
  112|     39|    for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (112:40): [True: 26, False: 13]
  ------------------
  113|     26|    {
  114|     26|      lookups[table_index].fini ();
  115|     26|      stages[table_index].fini ();
  116|     26|    }
  117|     13|  }
_ZNK11hb_ot_map_t15get_global_maskEv:
  119|   204k|  hb_mask_t get_global_mask () const { return global_mask; }
_ZNK11hb_ot_map_t8get_maskEjPj:
  122|     26|  {
  123|     26|    const feature_map_t *map = features.bsearch (feature_tag);
  124|     26|    if (shift) *shift = map ? map->shift : 0;
  ------------------
  |  Branch (124:9): [True: 0, False: 26]
  |  Branch (124:25): [True: 0, False: 0]
  ------------------
  125|     26|    return map ? map->mask : 0;
  ------------------
  |  Branch (125:12): [True: 13, False: 13]
  ------------------
  126|     26|  }
_ZNK11hb_ot_map_t10get_1_maskEj:
  135|     78|  {
  136|     78|    const feature_map_t *map = features.bsearch (feature_tag);
  137|     78|    return map ? map->_1_mask : 0;
  ------------------
  |  Branch (137:12): [True: 1, False: 77]
  ------------------
  138|     78|  }
_ZNK11hb_ot_map_t17get_feature_indexEjj:
  141|     13|  {
  142|     13|    const feature_map_t *map = features.bsearch (feature_tag);
  143|     13|    return map ? map->index[table_index] : HB_OT_LAYOUT_NO_FEATURE_INDEX;
  ------------------
  |  |  199|     13|#define HB_OT_LAYOUT_NO_FEATURE_INDEX		0xFFFFu
  ------------------
  |  Branch (143:12): [True: 0, False: 13]
  ------------------
  144|     13|  }
_ZN19hb_ot_map_builder_t11add_featureERK19hb_ot_map_feature_t:
  224|    182|  { add_feature (feat.tag, feat.flags); }
_ZN19hb_ot_map_builder_t14enable_featureEj25hb_ot_map_feature_flags_tj:
  229|    117|  { add_feature (tag, F_GLOBAL | flags, value); }
_ZN19hb_ot_map_builder_t14add_gsub_pauseEPFbPK18hb_ot_shape_plan_tP9hb_font_tP11hb_buffer_tE:
  235|     26|  { add_pause (0, pause_func); }
_ZN19hb_ot_map_builder_t14add_gpos_pauseEPFbPK18hb_ot_shape_plan_tP9hb_font_tP11hb_buffer_tE:
  237|     13|  { add_pause (1, pause_func); }
_ZN19hb_ot_map_builder_t14feature_info_t3cmpEPKvS2_:
  264|  1.76k|    {
  265|  1.76k|      const feature_info_t *a = (const feature_info_t *) pa;
  266|  1.76k|      const feature_info_t *b = (const feature_info_t *) pb;
  267|  1.76k|      return (a->tag != b->tag) ?  (a->tag < b->tag ? -1 : 1) :
  ------------------
  |  Branch (267:14): [True: 1.72k, False: 39]
  |  Branch (267:37): [True: 624, False: 1.10k]
  ------------------
  268|  1.76k|	     (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
  ------------------
  |  Branch (268:8): [True: 26, False: 13]
  |  Branch (268:31): [True: 13, False: 0]
  ------------------
  269|  1.76k|    }

_ZNK2OT10maxpV1Tail8sanitizeEP21hb_sanitize_context_t:
   45|     11|  {
   46|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   47|     11|    return_trace (c->check_struct (this));
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   48|     11|  }
_ZNK2OT4maxp14get_num_glyphsEv:
   76|     11|  unsigned int get_num_glyphs () const { return numGlyphs; }
_ZNK2OT4maxp8sanitizeEP21hb_sanitize_context_t:
   84|     11|  {
   85|     11|    TRACE_SANITIZE (this);
  ------------------
  |  |  423|     11|#define TRACE_SANITIZE(this) hb_no_trace_t<bool> trace
  ------------------
   86|     11|    if (unlikely (!c->check_struct (this)))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
   87|      0|      return_trace (false);
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   88|       |
   89|     11|    if (version.major == 1)
  ------------------
  |  Branch (89:9): [True: 11, False: 0]
  ------------------
   90|     11|    {
   91|     11|      const maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*this);
   92|     11|      return_trace (v1.sanitize (c));
  ------------------
  |  |  350|     11|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
   93|     11|    }
   94|      0|    return_trace (likely (version.major == 0 && version.minor == 0x5000u));
  ------------------
  |  |  350|      0|#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  |  Branch (350:45): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   95|     11|  }

_Z22_hb_ot_shape_normalizePK18hb_ot_shape_plan_tP11hb_buffer_tP9hb_font_t:
  294|   204k|{
  295|   204k|  if (unlikely (!buffer->len)) return;
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  296|       |
  297|   204k|  _hb_buffer_assert_unicode_vars (buffer);
  298|       |
  299|   204k|  hb_ot_shape_normalization_mode_t mode = plan->shaper->normalization_preference;
  300|   204k|  if (mode == HB_OT_SHAPE_NORMALIZATION_MODE_AUTO)
  ------------------
  |  Branch (300:7): [True: 204k, False: 0]
  ------------------
  301|   204k|  {
  302|   204k|    if (plan->has_gpos_mark)
  ------------------
  |  Branch (302:9): [True: 9, False: 204k]
  ------------------
  303|       |      // https://github.com/harfbuzz/harfbuzz/issues/653#issuecomment-423905920
  304|       |      //mode = HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED;
  305|      9|      mode = HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS;
  306|   204k|    else
  307|   204k|      mode = HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS;
  308|   204k|  }
  309|       |
  310|   204k|  const hb_ot_shape_normalize_context_t c = {
  311|   204k|    plan,
  312|   204k|    buffer,
  313|   204k|    font,
  314|   204k|    buffer->unicode,
  315|   204k|    buffer->not_found,
  316|   204k|    plan->shaper->decompose ? plan->shaper->decompose : decompose_unicode,
  ------------------
  |  Branch (316:5): [True: 0, False: 204k]
  ------------------
  317|   204k|    plan->shaper->compose   ? plan->shaper->compose   : compose_unicode
  ------------------
  |  Branch (317:5): [True: 0, False: 204k]
  ------------------
  318|   204k|  };
  319|       |
  320|   204k|  bool always_short_circuit = mode == HB_OT_SHAPE_NORMALIZATION_MODE_NONE;
  321|   204k|  bool might_short_circuit = always_short_circuit ||
  ------------------
  |  Branch (321:30): [True: 0, False: 204k]
  ------------------
  322|   204k|			     (mode != HB_OT_SHAPE_NORMALIZATION_MODE_DECOMPOSED &&
  ------------------
  |  Branch (322:10): [True: 204k, False: 0]
  ------------------
  323|   204k|			      mode != HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT);
  ------------------
  |  Branch (323:10): [True: 204k, False: 0]
  ------------------
  324|   204k|  unsigned int count;
  325|       |
  326|       |  /* We do a fairly straightforward yet custom normalization process in three
  327|       |   * separate rounds: decompose, reorder, recompose (if desired).  Currently
  328|       |   * this makes two buffer swaps.  We can make it faster by moving the last
  329|       |   * two rounds into the inner loop for the first round, but it's more readable
  330|       |   * this way. */
  331|       |
  332|       |
  333|       |  /* First round, decompose */
  334|       |
  335|   204k|  bool all_simple = true;
  336|   204k|  {
  337|   204k|    buffer->clear_output ();
  338|   204k|    count = buffer->len;
  339|   204k|    buffer->idx = 0;
  340|   204k|    do
  341|   204k|    {
  342|   204k|      unsigned int end;
  343|  2.93M|      for (end = buffer->idx + 1; end < count; end++)
  ------------------
  |  Branch (343:35): [True: 2.72M, False: 204k]
  ------------------
  344|  2.72M|	if (_hb_glyph_info_is_unicode_mark (&buffer->info[end]))
  ------------------
  |  Branch (344:6): [True: 0, False: 2.72M]
  ------------------
  345|      0|	  break;
  346|       |
  347|   204k|      if (end < count)
  ------------------
  |  Branch (347:11): [True: 0, False: 204k]
  ------------------
  348|      0|	end--; /* Leave one base for the marks to cluster with. */
  349|       |
  350|       |      /* From idx to end are simple clusters. */
  351|   204k|      if (might_short_circuit)
  ------------------
  |  Branch (351:11): [True: 204k, False: 0]
  ------------------
  352|   204k|      {
  353|   204k|	unsigned int done = font->get_nominal_glyphs (end - buffer->idx,
  354|   204k|						      &buffer->cur().codepoint,
  355|   204k|						      sizeof (buffer->info[0]),
  356|   204k|						      &buffer->cur().glyph_index(),
  ------------------
  |  |   34|   204k|#define glyph_index()	var1.u32
  ------------------
  357|   204k|						      sizeof (buffer->info[0]));
  358|   204k|	if (unlikely (!buffer->next_glyphs (done))) break;
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  359|   204k|      }
  360|  1.58M|      while (buffer->idx < end && buffer->successful)
  ------------------
  |  Branch (360:14): [True: 1.38M, False: 204k]
  |  Branch (360:35): [True: 1.38M, False: 0]
  ------------------
  361|  1.38M|	decompose_current_character (&c, might_short_circuit);
  362|       |
  363|   204k|      if (buffer->idx == count || !buffer->successful)
  ------------------
  |  Branch (363:11): [True: 204k, False: 0]
  |  Branch (363:35): [True: 0, False: 0]
  ------------------
  364|   204k|	break;
  365|       |
  366|      0|      all_simple = false;
  367|       |
  368|       |      /* Find all the marks now. */
  369|      0|      for (end = buffer->idx + 1; end < count; end++)
  ------------------
  |  Branch (369:35): [True: 0, False: 0]
  ------------------
  370|      0|	if (!_hb_glyph_info_is_unicode_mark(&buffer->info[end]))
  ------------------
  |  Branch (370:6): [True: 0, False: 0]
  ------------------
  371|      0|	  break;
  372|       |
  373|       |      /* idx to end is one non-simple cluster. */
  374|      0|      decompose_multi_char_cluster (&c, end, always_short_circuit);
  375|      0|    }
  376|   204k|    while (buffer->idx < count && buffer->successful);
  ------------------
  |  Branch (376:12): [True: 0, False: 0]
  |  Branch (376:35): [True: 0, False: 0]
  ------------------
  377|      0|    buffer->sync ();
  378|   204k|  }
  379|       |
  380|       |
  381|       |  /* Second round, reorder (inplace) */
  382|       |
  383|   204k|  if (!all_simple && buffer->message(font, "start reorder"))
  ------------------
  |  Branch (383:7): [True: 0, False: 204k]
  |  Branch (383:22): [True: 0, False: 0]
  ------------------
  384|      0|  {
  385|      0|    count = buffer->len;
  386|      0|    hb_glyph_info_t *info = buffer->info;
  387|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (387:30): [True: 0, False: 0]
  ------------------
  388|      0|    {
  389|      0|      if (_hb_glyph_info_get_modified_combining_class (&info[i]) == 0)
  ------------------
  |  Branch (389:11): [True: 0, False: 0]
  ------------------
  390|      0|	continue;
  391|       |
  392|      0|      unsigned int end;
  393|      0|      for (end = i + 1; end < count; end++)
  ------------------
  |  Branch (393:25): [True: 0, False: 0]
  ------------------
  394|      0|	if (_hb_glyph_info_get_modified_combining_class (&info[end]) == 0)
  ------------------
  |  Branch (394:6): [True: 0, False: 0]
  ------------------
  395|      0|	  break;
  396|       |
  397|       |      /* We are going to do a O(n^2).  Only do this if the sequence is short. */
  398|      0|      if (end - i > HB_OT_SHAPE_MAX_COMBINING_MARKS) {
  ------------------
  |  |   42|      0|#define HB_OT_SHAPE_MAX_COMBINING_MARKS 32
  ------------------
  |  Branch (398:11): [True: 0, False: 0]
  ------------------
  399|      0|	i = end;
  400|      0|	continue;
  401|      0|      }
  402|       |
  403|      0|      buffer->sort (i, end, compare_combining_class);
  404|       |
  405|      0|      if (plan->shaper->reorder_marks)
  ------------------
  |  Branch (405:11): [True: 0, False: 0]
  ------------------
  406|      0|	plan->shaper->reorder_marks (plan, buffer, i, end);
  407|       |
  408|      0|      i = end;
  409|      0|    }
  410|      0|    (void) buffer->message(font, "end reorder");
  411|      0|  }
  412|   204k|  if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_CGJ)
  ------------------
  |  Branch (412:7): [True: 0, False: 204k]
  ------------------
  413|      0|  {
  414|       |    /* For all CGJ, check if it prevented any reordering at all.
  415|       |     * If it did NOT, then make it skippable.
  416|       |     * https://github.com/harfbuzz/harfbuzz/issues/554
  417|       |     */
  418|      0|    unsigned count = buffer->len;
  419|      0|    hb_glyph_info_t *info = buffer->info;
  420|      0|    for (unsigned int i = 1; i + 1 < count; i++)
  ------------------
  |  Branch (420:30): [True: 0, False: 0]
  ------------------
  421|      0|      if (info[i].codepoint == 0x034Fu/*CGJ*/ &&
  ------------------
  |  Branch (421:11): [True: 0, False: 0]
  ------------------
  422|      0|	  (info_cc(info[i+1]) == 0 || info_cc(info[i-1]) <= info_cc(info[i+1])))
  ------------------
  |  |  283|      0|#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
  ------------------
              	  (info_cc(info[i+1]) == 0 || info_cc(info[i-1]) <= info_cc(info[i+1])))
  ------------------
  |  |  283|      0|#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
  ------------------
              	  (info_cc(info[i+1]) == 0 || info_cc(info[i-1]) <= info_cc(info[i+1])))
  ------------------
  |  |  283|      0|#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
  ------------------
  |  Branch (422:5): [True: 0, False: 0]
  |  Branch (422:32): [True: 0, False: 0]
  ------------------
  423|      0|      {
  424|      0|	_hb_glyph_info_unhide (&info[i]);
  425|      0|      }
  426|      0|  }
  427|       |
  428|       |
  429|       |  /* Third round, recompose */
  430|       |
  431|   204k|  if (!all_simple &&
  ------------------
  |  Branch (431:7): [True: 0, False: 204k]
  ------------------
  432|   204k|      buffer->successful &&
  ------------------
  |  Branch (432:7): [True: 0, False: 0]
  ------------------
  433|   204k|      (mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS ||
  ------------------
  |  Branch (433:8): [True: 0, False: 0]
  ------------------
  434|      0|       mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT))
  ------------------
  |  Branch (434:8): [True: 0, False: 0]
  ------------------
  435|      0|  {
  436|       |    /* As noted in the comment earlier, we don't try to combine
  437|       |     * ccc=0 chars with their previous Starter. */
  438|       |
  439|      0|    buffer->clear_output ();
  440|      0|    count = buffer->len;
  441|      0|    unsigned int starter = 0;
  442|      0|    (void) buffer->next_glyph ();
  443|      0|    while (buffer->idx < count /* No need for: && buffer->successful */)
  ------------------
  |  Branch (443:12): [True: 0, False: 0]
  ------------------
  444|      0|    {
  445|      0|      hb_codepoint_t composed, glyph;
  446|      0|      if (/* We don't try to compose a non-mark character with it's preceding starter.
  447|       |	   * This is both an optimization to avoid trying to compose every two neighboring
  448|       |	   * glyphs in most scripts AND a desired feature for Hangul.  Apparently Hangul
  449|       |	   * fonts are not designed to mix-and-match pre-composed syllables and Jamo. */
  450|      0|	  _hb_glyph_info_is_unicode_mark(&buffer->cur()))
  ------------------
  |  Branch (450:4): [True: 0, False: 0]
  ------------------
  451|      0|      {
  452|      0|	if (/* If there's anything between the starter and this char, they should have CCC
  453|       |	     * smaller than this character's. */
  454|      0|	    (starter == buffer->out_len - 1 ||
  ------------------
  |  Branch (454:7): [True: 0, False: 0]
  ------------------
  455|      0|	     info_cc (buffer->prev()) < info_cc (buffer->cur())) &&
  ------------------
  |  |  283|      0|#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
  ------------------
              	     info_cc (buffer->prev()) < info_cc (buffer->cur())) &&
  ------------------
  |  |  283|      0|#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
  ------------------
  |  Branch (455:7): [True: 0, False: 0]
  ------------------
  456|       |	    /* And compose. */
  457|      0|	    c.compose (&c,
  ------------------
  |  Branch (457:6): [True: 0, False: 0]
  ------------------
  458|      0|		       buffer->out_info[starter].codepoint,
  459|      0|		       buffer->cur().codepoint,
  460|      0|		       &composed) &&
  461|       |	    /* And the font has glyph for the composite. */
  462|      0|	    font->get_nominal_glyph (composed, &glyph))
  ------------------
  |  Branch (462:6): [True: 0, False: 0]
  ------------------
  463|      0|	{
  464|       |	  /* Composes. */
  465|      0|	  if (unlikely (!buffer->next_glyph ())) break; /* Copy to out-buffer. */
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  466|      0|	  buffer->merge_out_clusters (starter, buffer->out_len);
  467|      0|	  buffer->out_len--; /* Remove the second composable. */
  468|       |	  /* Modify starter and carry on. */
  469|      0|	  buffer->out_info[starter].codepoint = composed;
  470|      0|	  buffer->out_info[starter].glyph_index() = glyph;
  ------------------
  |  |   34|      0|#define glyph_index()	var1.u32
  ------------------
  471|      0|	  _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer);
  472|       |
  473|      0|	  continue;
  474|      0|	}
  475|      0|      }
  476|       |
  477|       |      /* Blocked, or doesn't compose. */
  478|      0|      if (unlikely (!buffer->next_glyph ())) break;
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  479|       |
  480|      0|      if (info_cc (buffer->prev()) == 0)
  ------------------
  |  |  283|      0|#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
  ------------------
  |  Branch (480:11): [True: 0, False: 0]
  ------------------
  481|      0|	starter = buffer->out_len - 1;
  482|      0|    }
  483|      0|    buffer->sync ();
  484|      0|  }
  485|   204k|}
hb-ot-shape-normalize.cc:_ZL17decompose_unicodePK31hb_ot_shape_normalize_context_tjPjS2_:
   82|   485k|{
   83|   485k|  return (bool) c->unicode->decompose (ab, a, b);
   84|   485k|}
hb-ot-shape-normalize.cc:_ZL27decompose_current_characterPK31hb_ot_shape_normalize_context_tb:
  168|  1.38M|{
  169|  1.38M|  hb_buffer_t * const buffer = c->buffer;
  170|  1.38M|  hb_codepoint_t u = buffer->cur().codepoint;
  171|  1.38M|  hb_codepoint_t glyph = 0;
  172|       |
  173|  1.38M|  if (shortest && c->font->get_nominal_glyph (u, &glyph, c->not_found))
  ------------------
  |  Branch (173:7): [True: 1.38M, False: 0]
  |  Branch (173:19): [True: 897k, False: 485k]
  ------------------
  174|   897k|  {
  175|   897k|    next_char (buffer, glyph);
  176|   897k|    return;
  177|   897k|  }
  178|       |
  179|   485k|  if (decompose (c, shortest, u))
  ------------------
  |  Branch (179:7): [True: 0, False: 485k]
  ------------------
  180|      0|  {
  181|      0|    skip_char (buffer);
  182|      0|    return;
  183|      0|  }
  184|       |
  185|   485k|  if (!shortest && c->font->get_nominal_glyph (u, &glyph, c->not_found))
  ------------------
  |  Branch (185:7): [True: 0, False: 485k]
  |  Branch (185:20): [True: 0, False: 0]
  ------------------
  186|      0|  {
  187|      0|    next_char (buffer, glyph);
  188|      0|    return;
  189|      0|  }
  190|       |
  191|   485k|  if (_hb_glyph_info_is_unicode_space (&buffer->cur()))
  ------------------
  |  Branch (191:7): [True: 0, False: 485k]
  ------------------
  192|      0|  {
  193|      0|    hb_codepoint_t space_glyph;
  194|      0|    hb_unicode_funcs_t::space_t space_type = buffer->unicode->space_fallback_type (u);
  195|      0|    if (space_type != hb_unicode_funcs_t::NOT_SPACE &&
  ------------------
  |  Branch (195:9): [True: 0, False: 0]
  ------------------
  196|      0|	(c->font->get_nominal_glyph (0x0020, &space_glyph) || (space_glyph = buffer->invisible)))
  ------------------
  |  Branch (196:3): [True: 0, False: 0]
  |  Branch (196:56): [True: 0, False: 0]
  ------------------
  197|      0|    {
  198|      0|      _hb_glyph_info_set_unicode_space_fallback_type (&buffer->cur(), space_type);
  199|      0|      next_char (buffer, space_glyph);
  200|      0|      buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK;
  201|      0|      return;
  202|      0|    }
  203|      0|  }
  204|       |
  205|   485k|  if (u == 0x2011u)
  ------------------
  |  Branch (205:7): [True: 0, False: 485k]
  ------------------
  206|      0|  {
  207|       |    /* U+2011 is the only sensible character that is a no-break version of another character
  208|       |     * and not a space.  The space ones are handled already.  Handle this lone one. */
  209|      0|    hb_codepoint_t other_glyph;
  210|      0|    if (c->font->get_nominal_glyph (0x2010u, &other_glyph))
  ------------------
  |  Branch (210:9): [True: 0, False: 0]
  ------------------
  211|      0|    {
  212|      0|      next_char (buffer, other_glyph);
  213|      0|      return;
  214|      0|    }
  215|      0|  }
  216|       |
  217|   485k|  next_char (buffer, glyph); /* glyph is initialized in earlier branches. */
  218|   485k|}
hb-ot-shape-normalize.cc:_ZL9next_charP11hb_buffer_tj:
  112|  1.38M|{
  113|  1.38M|  buffer->cur().glyph_index() = glyph;
  ------------------
  |  |   34|  1.38M|#define glyph_index()	var1.u32
  ------------------
  114|  1.38M|  (void) buffer->next_glyph ();
  115|  1.38M|}
hb-ot-shape-normalize.cc:_ZL9decomposePK31hb_ot_shape_normalize_context_tbj:
  126|   485k|{
  127|   485k|  hb_codepoint_t a = 0, b = 0, a_glyph = 0, b_glyph = 0;
  128|   485k|  hb_buffer_t * const buffer = c->buffer;
  129|   485k|  hb_font_t * const font = c->font;
  130|       |
  131|   485k|  if (!c->decompose (c, ab, &a, &b) ||
  ------------------
  |  Branch (131:7): [True: 485k, False: 0]
  ------------------
  132|   485k|      (b && !font->get_nominal_glyph (b, &b_glyph)))
  ------------------
  |  Branch (132:8): [True: 0, False: 0]
  |  Branch (132:13): [True: 0, False: 0]
  ------------------
  133|   485k|    return 0;
  134|       |
  135|      0|  bool has_a = (bool) font->get_nominal_glyph (a, &a_glyph);
  136|      0|  if (shortest && has_a) {
  ------------------
  |  Branch (136:7): [True: 0, False: 0]
  |  Branch (136:19): [True: 0, False: 0]
  ------------------
  137|       |    /* Output a and b */
  138|      0|    output_char (buffer, a, a_glyph);
  139|      0|    if (likely (b)) {
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  140|      0|      output_char (buffer, b, b_glyph);
  141|      0|      return 2;
  142|      0|    }
  143|      0|    return 1;
  144|      0|  }
  145|       |
  146|      0|  if (unsigned ret = decompose (c, shortest, a)) {
  ------------------
  |  Branch (146:16): [True: 0, False: 0]
  ------------------
  147|      0|    if (b) {
  ------------------
  |  Branch (147:9): [True: 0, False: 0]
  ------------------
  148|      0|      output_char (buffer, b, b_glyph);
  149|      0|      return ret + 1;
  150|      0|    }
  151|      0|    return ret;
  152|      0|  }
  153|       |
  154|      0|  if (has_a) {
  ------------------
  |  Branch (154:7): [True: 0, False: 0]
  ------------------
  155|      0|    output_char (buffer, a, a_glyph);
  156|      0|    if (likely (b)) {
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  157|      0|      output_char (buffer, b, b_glyph);
  158|      0|      return 2;
  159|      0|    }
  160|      0|    return 1;
  161|      0|  }
  162|       |
  163|      0|  return 0;
  164|      0|}

_ZN21hb_ot_shape_planner_tC2EP9hb_face_tRK23hb_segment_properties_t:
   87|     13|{
   88|     13|  shaper = hb_ot_shaper_categorize (this);
   89|       |
   90|     13|  script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE;
   91|     13|  script_fallback_mark_positioning = shaper->fallback_position;
   92|       |
   93|     13|#ifndef HB_NO_AAT_SHAPE
   94|       |  /* https://github.com/harfbuzz/harfbuzz/issues/1528 */
   95|     13|  if (apply_morx && shaper != &_hb_ot_shaper_default)
  ------------------
  |  Branch (95:7): [True: 0, False: 13]
  |  Branch (95:21): [True: 0, False: 0]
  ------------------
   96|      0|    shaper = &_hb_ot_shaper_dumber;
   97|     13|#endif
   98|     13|}
_ZN21hb_ot_shape_planner_t7compileER18hb_ot_shape_plan_tRK22hb_ot_shape_plan_key_t:
  103|     13|{
  104|     13|  plan.props = props;
  105|     13|  plan.shaper = shaper;
  106|     13|  map.compile (plan.map, key);
  107|       |
  108|     13|#ifndef HB_NO_OT_SHAPE_FRACTIONS
  109|     13|  plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  110|     13|  plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  111|     13|  plan.dnom_mask = plan.map.get_1_mask (HB_TAG ('d','n','o','m'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  112|     13|  plan.has_frac = plan.frac_mask || (plan.numr_mask && plan.dnom_mask);
  ------------------
  |  Branch (112:19): [True: 0, False: 13]
  |  Branch (112:38): [True: 0, False: 13]
  |  Branch (112:56): [True: 0, False: 0]
  ------------------
  113|     13|#endif
  114|       |
  115|     13|  plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  116|     13|  plan.has_vert = !!plan.map.get_1_mask (HB_TAG ('v','e','r','t'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  117|       |
  118|     13|  hb_tag_t kern_tag = HB_DIRECTION_IS_HORIZONTAL (props.direction) ?
  ------------------
  |  |  271|     13|#define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
  |  |  ------------------
  |  |  |  Branch (271:41): [True: 13, False: 0]
  |  |  ------------------
  ------------------
  119|     13|		      HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n');
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
              		      HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  120|     13|#ifndef HB_NO_OT_KERN
  121|     13|  plan.kern_mask = plan.map.get_mask (kern_tag);
  122|     13|  plan.requested_kerning = !!plan.kern_mask;
  123|     13|#endif
  124|     13|#ifndef HB_NO_AAT_SHAPE
  125|     13|  plan.trak_mask = plan.map.get_mask (HB_TAG ('t','r','a','k'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  126|     13|  plan.requested_tracking = !!plan.trak_mask;
  127|     13|#endif
  128|       |
  129|     13|  bool has_gpos_kern = plan.map.get_feature_index (1, kern_tag) != HB_OT_LAYOUT_NO_FEATURE_INDEX;
  ------------------
  |  |  199|     13|#define HB_OT_LAYOUT_NO_FEATURE_INDEX		0xFFFFu
  ------------------
  130|     13|  bool disable_gpos = plan.shaper->gpos_tag &&
  ------------------
  |  Branch (130:23): [True: 0, False: 13]
  ------------------
  131|     13|		      plan.shaper->gpos_tag != plan.map.chosen_script[1];
  ------------------
  |  Branch (131:9): [True: 0, False: 0]
  ------------------
  132|       |
  133|       |  /*
  134|       |   * Decide who provides glyph classes. GDEF or Unicode.
  135|       |   */
  136|       |
  137|     13|  if (!hb_ot_layout_has_glyph_classes (face))
  ------------------
  |  Branch (137:7): [True: 12, False: 1]
  ------------------
  138|     12|    plan.fallback_glyph_classes = true;
  139|       |
  140|       |  /*
  141|       |   * Decide who does substitutions. GSUB, morx, or fallback.
  142|       |   */
  143|       |
  144|     13|#ifndef HB_NO_AAT_SHAPE
  145|     13|  plan.apply_morx = apply_morx;
  146|     13|#endif
  147|       |
  148|       |  /*
  149|       |   * Decide who does positioning. GPOS, kerx, kern, or fallback.
  150|       |   */
  151|       |
  152|     13|#ifndef HB_NO_AAT_SHAPE
  153|     13|  bool has_kerx = hb_aat_layout_has_positioning (face);
  154|     13|  bool has_gsub = !apply_morx && hb_ot_layout_has_substitution (face);
  ------------------
  |  Branch (154:19): [True: 13, False: 0]
  |  Branch (154:34): [True: 13, False: 0]
  ------------------
  155|     13|#endif
  156|     13|  bool has_gpos = !disable_gpos && hb_ot_layout_has_positioning (face);
  ------------------
  |  Branch (156:19): [True: 13, False: 0]
  |  Branch (156:36): [True: 13, False: 0]
  ------------------
  157|     13|  if (false)
  ------------------
  |  Branch (157:7): [Folded - Ignored]
  ------------------
  158|      0|    ;
  159|     13|#ifndef HB_NO_AAT_SHAPE
  160|       |  /* Prefer GPOS over kerx if GSUB is present;
  161|       |   * https://github.com/harfbuzz/harfbuzz/issues/3008 */
  162|     13|  else if (has_kerx && !(has_gsub && has_gpos))
  ------------------
  |  Branch (162:12): [True: 0, False: 13]
  |  Branch (162:26): [True: 0, False: 0]
  |  Branch (162:38): [True: 0, False: 0]
  ------------------
  163|      0|    plan.apply_kerx = true;
  164|     13|#endif
  165|     13|  else if (has_gpos)
  ------------------
  |  Branch (165:12): [True: 13, False: 0]
  ------------------
  166|     13|    plan.apply_gpos = true;
  167|       |
  168|     13|  if (!plan.apply_kerx && (!has_gpos_kern || !plan.apply_gpos))
  ------------------
  |  Branch (168:7): [True: 13, False: 0]
  |  Branch (168:28): [True: 13, False: 0]
  |  Branch (168:46): [True: 0, False: 0]
  ------------------
  169|     13|  {
  170|     13|#ifndef HB_NO_AAT_SHAPE
  171|     13|    if (has_kerx)
  ------------------
  |  Branch (171:9): [True: 0, False: 13]
  ------------------
  172|      0|      plan.apply_kerx = true;
  173|     13|    else
  174|     13|#endif
  175|     13|#ifndef HB_NO_OT_KERN
  176|     13|    if (hb_ot_layout_has_kerning (face))
  ------------------
  |  Branch (176:9): [True: 1, False: 12]
  ------------------
  177|      1|      plan.apply_kern = true;
  178|     13|#endif
  179|     13|  }
  180|       |
  181|     13|  plan.apply_fallback_kern = !(plan.apply_gpos || plan.apply_kerx || plan.apply_kern);
  ------------------
  |  Branch (181:32): [True: 13, False: 0]
  |  Branch (181:51): [True: 0, False: 0]
  |  Branch (181:70): [True: 0, False: 0]
  ------------------
  182|       |
  183|     13|  plan.zero_marks = script_zero_marks &&
  ------------------
  |  Branch (183:21): [True: 13, False: 0]
  ------------------
  184|     13|		    !plan.apply_kerx &&
  ------------------
  |  Branch (184:7): [True: 13, False: 0]
  ------------------
  185|     13|		    (!plan.apply_kern
  ------------------
  |  Branch (185:8): [True: 12, False: 1]
  ------------------
  186|     13|#ifndef HB_NO_OT_KERN
  187|     13|		     || !hb_ot_layout_has_machine_kerning (face)
  ------------------
  |  Branch (187:11): [True: 1, False: 0]
  ------------------
  188|     13|#endif
  189|     13|		    );
  190|     13|  plan.has_gpos_mark = !!plan.map.get_1_mask (HB_TAG ('m','a','r','k'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  191|       |
  192|     13|  plan.adjust_mark_positioning_when_zeroing = !plan.apply_gpos &&
  ------------------
  |  Branch (192:47): [True: 0, False: 13]
  ------------------
  193|     13|					      !plan.apply_kerx &&
  ------------------
  |  Branch (193:12): [True: 0, False: 0]
  ------------------
  194|     13|					      (!plan.apply_kern
  ------------------
  |  Branch (194:13): [True: 0, False: 0]
  ------------------
  195|      0|#ifndef HB_NO_OT_KERN
  196|      0|					       || !hb_ot_layout_has_cross_kerning (face)
  ------------------
  |  Branch (196:16): [True: 0, False: 0]
  ------------------
  197|      0|#endif
  198|      0|					      );
  199|       |
  200|     13|  plan.fallback_mark_positioning = plan.adjust_mark_positioning_when_zeroing &&
  ------------------
  |  Branch (200:36): [True: 0, False: 13]
  ------------------
  201|     13|				   script_fallback_mark_positioning;
  ------------------
  |  Branch (201:8): [True: 0, False: 0]
  ------------------
  202|       |
  203|     13|#ifndef HB_NO_AAT_SHAPE
  204|       |  /* If we're using morx shaping, we cancel mark position adjustment because
  205|       |     Apple Color Emoji assumes this will NOT be done when forming emoji sequences;
  206|       |     https://github.com/harfbuzz/harfbuzz/issues/2967. */
  207|     13|  if (plan.apply_morx)
  ------------------
  |  Branch (207:7): [True: 0, False: 13]
  ------------------
  208|      0|    plan.adjust_mark_positioning_when_zeroing = false;
  209|       |
  210|       |  /* Currently we always apply trak. */
  211|     13|  plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face);
  ------------------
  |  Branch (211:21): [True: 13, False: 0]
  |  Branch (211:48): [True: 0, False: 13]
  ------------------
  212|     13|#endif
  213|     13|}
_ZN18hb_ot_shape_plan_t5init0EP9hb_face_tPK19hb_shape_plan_key_t:
  218|     13|{
  219|     13|  map.init ();
  220|       |
  221|     13|  hb_ot_shape_planner_t planner (face,
  222|     13|				 key->props);
  223|       |
  224|     13|  hb_ot_shape_collect_features (&planner,
  225|     13|				key->user_features,
  226|     13|				key->num_user_features);
  227|       |
  228|     13|  planner.compile (*this, key->ot);
  229|       |
  230|     13|  if (shaper->data_create)
  ------------------
  |  Branch (230:7): [True: 0, False: 13]
  ------------------
  231|      0|  {
  232|      0|    data = shaper->data_create (this);
  233|      0|    if (unlikely (!data))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  234|      0|    {
  235|      0|      map.fini ();
  236|      0|      return false;
  237|      0|    }
  238|      0|  }
  239|       |
  240|     13|  return true;
  241|     13|}
_ZN18hb_ot_shape_plan_t4finiEv:
  245|     13|{
  246|     13|  if (shaper->data_destroy)
  ------------------
  |  Branch (246:7): [True: 0, False: 13]
  ------------------
  247|      0|    shaper->data_destroy (const_cast<void *> (data));
  248|       |
  249|     13|  map.fini ();
  250|     13|}
_ZNK18hb_ot_shape_plan_t10substituteEP9hb_font_tP11hb_buffer_t:
  255|   204k|{
  256|   204k|  map.substitute (this, font, buffer);
  257|   204k|}
_ZNK18hb_ot_shape_plan_t8positionEP9hb_font_tP11hb_buffer_t:
  262|   204k|{
  263|   204k|  if (this->apply_gpos)
  ------------------
  |  Branch (263:7): [True: 204k, False: 0]
  ------------------
  264|   204k|    map.position (this, font, buffer);
  265|      0|#ifndef HB_NO_AAT_SHAPE
  266|      0|  else if (this->apply_kerx)
  ------------------
  |  Branch (266:12): [True: 0, False: 0]
  ------------------
  267|      0|    hb_aat_layout_position (this, font, buffer);
  268|   204k|#endif
  269|       |
  270|   204k|#ifndef HB_NO_OT_KERN
  271|   204k|  if (this->apply_kern)
  ------------------
  |  Branch (271:7): [True: 9, False: 204k]
  ------------------
  272|      9|    hb_ot_layout_kern (this, font, buffer);
  273|   204k|#endif
  274|   204k|  else if (this->apply_fallback_kern)
  ------------------
  |  Branch (274:12): [True: 0, False: 204k]
  ------------------
  275|      0|    _hb_ot_shape_fallback_kern (this, font, buffer);
  276|       |
  277|   204k|#ifndef HB_NO_AAT_SHAPE
  278|   204k|  if (this->apply_trak)
  ------------------
  |  Branch (278:7): [True: 0, False: 204k]
  ------------------
  279|      0|    hb_aat_layout_track (this, font, buffer);
  280|   204k|#endif
  281|   204k|}
_hb_ot_shaper_face_data_create:
  410|     11|{
  411|     11|  return (hb_ot_face_data_t *) HB_SHAPER_DATA_SUCCEEDED;
  ------------------
  |  |   71|     11|#define HB_SHAPER_DATA_SUCCEEDED ((void *) +1)
  ------------------
  412|     11|}
_hb_ot_shaper_face_data_destroy:
  416|     11|{
  417|     11|}
_hb_ot_shaper_font_data_create:
  428|     11|{
  429|     11|  return (hb_ot_font_data_t *) HB_SHAPER_DATA_SUCCEEDED;
  ------------------
  |  |   71|     11|#define HB_SHAPER_DATA_SUCCEEDED ((void *) +1)
  ------------------
  430|     11|}
_hb_ot_shaper_font_data_destroy:
  434|     11|{
  435|     11|}
_hb_ot_shape:
 1228|   204k|{
 1229|   204k|  hb_ot_shape_context_t c = {&shape_plan->ot, font, font->face, buffer, features, num_features};
 1230|   204k|  hb_ot_shape_internal (&c);
 1231|       |
 1232|   204k|  return true;
 1233|   204k|}
hb-ot-shape.cc:_ZL14_hb_apply_morxP9hb_face_tRK23hb_segment_properties_t:
   57|     13|{
   58|       |  /* https://github.com/harfbuzz/harfbuzz/issues/2124 */
   59|     13|  return hb_aat_layout_has_substitution (face) &&
  ------------------
  |  Branch (59:10): [True: 0, False: 13]
  ------------------
   60|     13|	 (HB_DIRECTION_IS_HORIZONTAL (props.direction) || !hb_ot_layout_has_substitution (face));
  ------------------
  |  |  271|      0|#define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
  |  |  ------------------
  |  |  |  Branch (271:41): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (60:52): [True: 0, False: 0]
  ------------------
   61|     13|}
hb-ot-shape.cc:_ZL28hb_ot_shape_collect_featuresP21hb_ot_shape_planner_tPK12hb_feature_tj:
  313|     13|{
  314|     13|  hb_ot_map_builder_t *map = &planner->map;
  315|       |
  316|     13|  map->is_simple = true;
  317|       |
  318|     13|  map->enable_feature (HB_TAG('r','v','r','n'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  319|     13|  map->add_gsub_pause (nullptr);
  320|       |
  321|     13|  switch (planner->props.direction)
  322|     13|  {
  323|     13|    case HB_DIRECTION_LTR:
  ------------------
  |  Branch (323:5): [True: 13, False: 0]
  ------------------
  324|     13|      map->enable_feature (HB_TAG ('l','t','r','a'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  325|     13|      map->enable_feature (HB_TAG ('l','t','r','m'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  326|     13|      break;
  327|      0|    case HB_DIRECTION_RTL:
  ------------------
  |  Branch (327:5): [True: 0, False: 13]
  ------------------
  328|      0|      map->enable_feature (HB_TAG ('r','t','l','a'));
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  329|      0|      map->add_feature (HB_TAG ('r','t','l','m'));
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  330|      0|      break;
  331|      0|    case HB_DIRECTION_TTB:
  ------------------
  |  Branch (331:5): [True: 0, False: 13]
  ------------------
  332|      0|    case HB_DIRECTION_BTT:
  ------------------
  |  Branch (332:5): [True: 0, False: 13]
  ------------------
  333|      0|    case HB_DIRECTION_INVALID:
  ------------------
  |  Branch (333:5): [True: 0, False: 13]
  ------------------
  334|      0|    default:
  ------------------
  |  Branch (334:5): [True: 0, False: 13]
  ------------------
  335|      0|      break;
  336|     13|  }
  337|       |
  338|     13|#ifndef HB_NO_OT_SHAPE_FRACTIONS
  339|       |  /* Automatic fractions. */
  340|     13|  map->add_feature (HB_TAG ('f','r','a','c'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  341|     13|  map->add_feature (HB_TAG ('n','u','m','r'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  342|     13|  map->add_feature (HB_TAG ('d','n','o','m'));
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  343|     13|#endif
  344|       |
  345|       |  /* Random! */
  346|     13|  map->enable_feature (HB_TAG ('r','a','n','d'), F_RANDOM, HB_OT_MAP_MAX_VALUE);
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
                map->enable_feature (HB_TAG ('r','a','n','d'), F_RANDOM, HB_OT_MAP_MAX_VALUE);
  ------------------
  |  |   36|     13|#define HB_OT_MAP_MAX_VALUE ((1u << HB_OT_MAP_MAX_BITS) - 1u)
  |  |  ------------------
  |  |  |  |   35|     13|#define HB_OT_MAP_MAX_BITS 8u
  |  |  ------------------
  ------------------
  347|       |
  348|     13|#ifndef HB_NO_AAT_SHAPE
  349|       |  /* Tracking.  We enable dummy feature here just to allow disabling
  350|       |   * AAT 'trak' table using features.
  351|       |   * https://github.com/harfbuzz/harfbuzz/issues/1303 */
  352|     13|  map->enable_feature (HB_TAG ('t','r','a','k'), F_HAS_FALLBACK);
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  353|     13|#endif
  354|       |
  355|     13|  map->enable_feature (HB_TAG ('H','a','r','f')); /* Considered required. */
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  356|     13|  map->enable_feature (HB_TAG ('H','A','R','F')); /* Considered discretionary. */
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  357|       |
  358|     13|  if (planner->shaper->collect_features)
  ------------------
  |  Branch (358:7): [True: 0, False: 13]
  ------------------
  359|      0|  {
  360|      0|    map->is_simple = false;
  361|      0|    planner->shaper->collect_features (planner);
  362|      0|  }
  363|       |
  364|     13|  map->enable_feature (HB_TAG ('B','u','z','z')); /* Considered required. */
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  365|     13|  map->enable_feature (HB_TAG ('B','U','Z','Z')); /* Considered discretionary. */
  ------------------
  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  366|       |
  367|    104|  for (unsigned int i = 0; i < ARRAY_LENGTH (common_features); i++)
  ------------------
  |  Branch (367:28): [True: 91, False: 13]
  ------------------
  368|     91|    map->add_feature (common_features[i]);
  369|       |
  370|     13|  if (HB_DIRECTION_IS_HORIZONTAL (planner->props.direction))
  ------------------
  |  |  271|     13|#define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
  |  |  ------------------
  |  |  |  Branch (271:41): [True: 13, False: 0]
  |  |  ------------------
  ------------------
  371|    104|    for (unsigned int i = 0; i < ARRAY_LENGTH (horizontal_features); i++)
  ------------------
  |  Branch (371:30): [True: 91, False: 13]
  ------------------
  372|     91|      map->add_feature (horizontal_features[i]);
  373|      0|  else
  374|      0|  {
  375|       |    /* We only apply `vert` feature. See:
  376|       |     * https://github.com/harfbuzz/harfbuzz/commit/d71c0df2d17f4590d5611239577a6cb532c26528
  377|       |     * https://lists.freedesktop.org/archives/harfbuzz/2013-August/003490.html */
  378|       |
  379|       |    /* We really want to find a 'vert' feature if there's any in the font, no
  380|       |     * matter which script/langsys it is listed (or not) under.
  381|       |     * See various bugs referenced from:
  382|       |     * https://github.com/harfbuzz/harfbuzz/issues/63 */
  383|      0|    map->enable_feature (HB_TAG ('v','e','r','t'), F_GLOBAL_SEARCH);
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  384|      0|  }
  385|       |
  386|     13|  if (num_user_features)
  ------------------
  |  Branch (386:7): [True: 13, False: 0]
  ------------------
  387|     13|    map->is_simple = false;
  388|     78|  for (unsigned int i = 0; i < num_user_features; i++)
  ------------------
  |  Branch (388:28): [True: 65, False: 13]
  ------------------
  389|     65|  {
  390|     65|    const hb_feature_t *feature = &user_features[i];
  391|     65|    map->add_feature (feature->tag,
  392|     65|		      (feature->start == HB_FEATURE_GLOBAL_START &&
  ------------------
  |  |  805|    130|#define HB_FEATURE_GLOBAL_START	0
  ------------------
  |  Branch (392:10): [True: 65, False: 0]
  ------------------
  393|     65|		       feature->end == HB_FEATURE_GLOBAL_END) ?  F_GLOBAL : F_NONE,
  ------------------
  |  |  815|     65|#define HB_FEATURE_GLOBAL_END	((unsigned int) -1)
  ------------------
  |  Branch (393:10): [True: 65, False: 0]
  ------------------
  394|     65|		      feature->value);
  395|     65|  }
  396|       |
  397|     13|  if (planner->shaper->override_features)
  ------------------
  |  Branch (397:7): [True: 0, False: 13]
  ------------------
  398|      0|    planner->shaper->override_features (planner);
  399|     13|}
hb-ot-shape.cc:_ZL20hb_ot_shape_internalP21hb_ot_shape_context_t:
 1187|   204k|{
 1188|       |  /* Save the original direction, we use it later. */
 1189|   204k|  c->target_direction = c->buffer->props.direction;
 1190|       |
 1191|   204k|  _hb_buffer_allocate_unicode_vars (c->buffer);
 1192|       |
 1193|   204k|  hb_ot_shape_initialize_masks (c);
 1194|   204k|  hb_set_unicode_props (c->buffer);
 1195|   204k|  hb_insert_dotted_circle (c->buffer, c->font);
 1196|       |
 1197|   204k|  hb_form_clusters (c->buffer);
 1198|       |
 1199|   204k|  hb_ensure_native_direction (c->buffer);
 1200|       |
 1201|   204k|  if (c->plan->shaper->preprocess_text &&
  ------------------
  |  Branch (1201:7): [True: 0, False: 204k]
  ------------------
 1202|   204k|      c->buffer->message(c->font, "start preprocess-text"))
  ------------------
  |  Branch (1202:7): [True: 0, False: 0]
  ------------------
 1203|      0|  {
 1204|      0|    c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font);
 1205|      0|    (void) c->buffer->message(c->font, "end preprocess-text");
 1206|      0|  }
 1207|       |
 1208|   204k|  hb_ot_substitute_pre (c);
 1209|   204k|  hb_ot_position (c);
 1210|   204k|  hb_ot_substitute_post (c);
 1211|       |
 1212|   204k|  hb_propagate_flags (c->buffer);
 1213|       |
 1214|   204k|  _hb_buffer_deallocate_unicode_vars (c->buffer);
 1215|       |
 1216|   204k|  c->buffer->props.direction = c->target_direction;
 1217|       |
 1218|   204k|  c->buffer->leave ();
 1219|   204k|}
hb-ot-shape.cc:_ZL28hb_ot_shape_initialize_masksPK21hb_ot_shape_context_t:
  792|   204k|{
  793|   204k|  hb_ot_map_t *map = &c->plan->map;
  794|   204k|  hb_buffer_t *buffer = c->buffer;
  795|       |
  796|   204k|  hb_mask_t global_mask = map->get_global_mask ();
  797|   204k|  buffer->reset_masks (global_mask);
  798|   204k|}
hb-ot-shape.cc:_ZL20hb_set_unicode_propsP11hb_buffer_t:
  464|   204k|{
  465|       |  /* Implement enough of Unicode Graphemes here that shaping
  466|       |   * in reverse-direction wouldn't break graphemes.  Namely,
  467|       |   * we mark all marks and ZWJ and ZWJ,Extended_Pictographic
  468|       |   * sequences as continuations.  The foreach_grapheme()
  469|       |   * macro uses this bit.
  470|       |   *
  471|       |   * https://www.unicode.org/reports/tr29/#Regex_Definitions
  472|       |   */
  473|   204k|  unsigned int count = buffer->len;
  474|   204k|  hb_glyph_info_t *info = buffer->info;
  475|  3.13M|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (475:28): [True: 2.93M, False: 204k]
  ------------------
  476|  2.93M|  {
  477|  2.93M|    _hb_glyph_info_set_unicode_props (&info[i], buffer);
  478|       |
  479|  2.93M|    unsigned gen_cat = _hb_glyph_info_get_general_category (&info[i]);
  480|  2.93M|    if (FLAG_UNSAFE (gen_cat) &
  ------------------
  |  |   74|  2.93M|#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
  |  |  ------------------
  |  |  |  Branch (74:25): [True: 2.93M, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (480:9): [True: 597k, False: 2.33M]
  ------------------
  481|  2.93M|	(FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |
  ------------------
  |  |   73|  2.93M|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  ------------------
  |  |  |  |   59|  2.93M|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  ------------------
  ------------------
  482|  2.93M|	 FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER) |
  ------------------
  |  |   73|  2.93M|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  ------------------
  |  |  |  |   59|  2.93M|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  ------------------
  ------------------
  483|  2.93M|	 FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) |
  ------------------
  |  |   73|  2.93M|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  ------------------
  |  |  |  |   59|  2.93M|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  ------------------
  ------------------
  484|  2.93M|	 FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) |
  ------------------
  |  |   73|  2.93M|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  ------------------
  |  |  |  |   59|  2.93M|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  ------------------
  ------------------
  485|  2.93M|	 FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR)))
  ------------------
  |  |   73|  2.93M|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  ------------------
  |  |  |  |   59|  2.93M|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  ------------------
  ------------------
  486|   597k|      continue;
  487|       |
  488|       |    /* Marks are already set as continuation by the above line.
  489|       |     * Handle Emoji_Modifier and ZWJ-continuation. */
  490|  2.33M|    if (unlikely (gen_cat == HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL &&
  ------------------
  |  |  260|  2.33M|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2.33M]
  |  |  |  Branch (260:47): [True: 0, False: 2.33M]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  491|  2.33M|		  hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x1F3FBu, 0x1F3FFu)))
  492|      0|    {
  493|      0|      _hb_glyph_info_set_continuation (&info[i]);
  494|      0|    }
  495|       |    /* Regional_Indicators are hairy as hell...
  496|       |     * https://github.com/harfbuzz/harfbuzz/issues/2265 */
  497|  2.33M|    else if (unlikely (i && _hb_codepoint_is_regional_indicator (info[i].codepoint)))
  ------------------
  |  |  260|  4.56M|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2.33M]
  |  |  |  Branch (260:47): [True: 2.23M, False: 102k]
  |  |  |  Branch (260:47): [True: 0, False: 2.23M]
  |  |  ------------------
  ------------------
  498|      0|    {
  499|      0|      if (_hb_codepoint_is_regional_indicator (info[i - 1].codepoint) &&
  ------------------
  |  Branch (499:11): [True: 0, False: 0]
  ------------------
  500|      0|	  !_hb_glyph_info_is_continuation (&info[i - 1]))
  ------------------
  |  Branch (500:4): [True: 0, False: 0]
  ------------------
  501|      0|	_hb_glyph_info_set_continuation (&info[i]);
  502|      0|    }
  503|  2.33M|#ifndef HB_NO_EMOJI_SEQUENCES
  504|  2.33M|    else if (unlikely (_hb_glyph_info_is_zwj (&info[i])))
  ------------------
  |  |  260|  2.33M|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2.33M]
  |  |  ------------------
  ------------------
  505|      0|    {
  506|      0|      _hb_glyph_info_set_continuation (&info[i]);
  507|      0|      if (i + 1 < count &&
  ------------------
  |  Branch (507:11): [True: 0, False: 0]
  ------------------
  508|      0|	  _hb_unicode_is_emoji_Extended_Pictographic (info[i + 1].codepoint))
  ------------------
  |  Branch (508:4): [True: 0, False: 0]
  ------------------
  509|      0|      {
  510|      0|	i++;
  511|      0|	_hb_glyph_info_set_unicode_props (&info[i], buffer);
  512|      0|	_hb_glyph_info_set_continuation (&info[i]);
  513|      0|      }
  514|      0|    }
  515|  2.33M|#endif
  516|       |    /* Or part of the Other_Grapheme_Extend that is not marks.
  517|       |     * As of Unicode 15 that is just:
  518|       |     *
  519|       |     * 200C          ; Other_Grapheme_Extend # Cf       ZERO WIDTH NON-JOINER
  520|       |     * FF9E..FF9F    ; Other_Grapheme_Extend # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
  521|       |     * E0020..E007F  ; Other_Grapheme_Extend # Cf  [96] TAG SPACE..CANCEL TAG
  522|       |     *
  523|       |     * ZWNJ is special, we don't want to merge it as there's no need, and keeping
  524|       |     * it separate results in more granular clusters.
  525|       |     * Tags are used for Emoji sub-region flag sequences:
  526|       |     * https://github.com/harfbuzz/harfbuzz/issues/1556
  527|       |     * Katakana ones were requested:
  528|       |     * https://github.com/harfbuzz/harfbuzz/issues/3844
  529|       |     */
  530|  2.33M|    else if (unlikely (hb_in_ranges<hb_codepoint_t> (info[i].codepoint, 0xFF9Eu, 0xFF9Fu, 0xE0020u, 0xE007Fu)))
  ------------------
  |  |  260|  2.33M|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 3, False: 2.33M]
  |  |  ------------------
  ------------------
  531|      3|      _hb_glyph_info_set_continuation (&info[i]);
  532|  2.33M|  }
  533|   204k|}
hb-ot-shape.cc:_ZL35_hb_codepoint_is_regional_indicatorj:
   52|  2.23M|{ return hb_in_range<hb_codepoint_t> (u, 0x1F1E6u, 0x1F1FFu); }
hb-ot-shape.cc:_ZL23hb_insert_dotted_circleP11hb_buffer_tP9hb_font_t:
  537|   204k|{
  538|   204k|  if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  539|      0|    return;
  540|       |
  541|   204k|  if (!(buffer->flags & HB_BUFFER_FLAG_BOT) ||
  ------------------
  |  Branch (541:7): [True: 204k, False: 0]
  ------------------
  542|   204k|      buffer->context_len[0] ||
  ------------------
  |  Branch (542:7): [True: 0, False: 0]
  ------------------
  543|   204k|      !_hb_glyph_info_is_unicode_mark (&buffer->info[0]))
  ------------------
  |  Branch (543:7): [True: 0, False: 0]
  ------------------
  544|   204k|    return;
  545|       |
  546|      0|  if (!font->has_glyph (0x25CCu))
  ------------------
  |  Branch (546:7): [True: 0, False: 0]
  ------------------
  547|      0|    return;
  548|       |
  549|      0|  hb_glyph_info_t dottedcircle = {0};
  550|      0|  dottedcircle.codepoint = 0x25CCu;
  551|      0|  _hb_glyph_info_set_unicode_props (&dottedcircle, buffer);
  552|       |
  553|      0|  buffer->clear_output ();
  554|       |
  555|      0|  buffer->idx = 0;
  556|      0|  hb_glyph_info_t info = dottedcircle;
  557|      0|  info.cluster = buffer->cur().cluster;
  558|      0|  info.mask = buffer->cur().mask;
  559|      0|  (void) buffer->output_info (info);
  560|       |
  561|      0|  buffer->sync ();
  562|      0|}
hb-ot-shape.cc:_ZL16hb_form_clustersP11hb_buffer_t:
  566|   204k|{
  567|   204k|  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII))
  ------------------
  |  Branch (567:7): [True: 102k, False: 102k]
  ------------------
  568|   102k|    return;
  569|       |
  570|   102k|  if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
  ------------------
  |  Branch (570:7): [True: 102k, False: 0]
  ------------------
  571|   102k|    foreach_grapheme (buffer, start, end)
  ------------------
  |  |  349|   102k|	foreach_group (buffer, start, end, _hb_grapheme_group_func)
  |  |  ------------------
  |  |  |  |  662|   102k|  for (unsigned int \
  |  |  |  |  663|   102k|       _count = buffer->len, \
  |  |  |  |  664|   102k|       start = 0, end = _count ? buffer->group_end (0, group_func) : 0; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (664:25): [True: 102k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  665|  2.93M|       start < _count; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (665:8): [True: 2.82M, False: 102k]
  |  |  |  |  ------------------
  |  |  |  |  666|  2.82M|       start = end, end = buffer->group_end (start, group_func))
  |  |  ------------------
  ------------------
  572|  2.82M|      buffer->merge_clusters (start, end);
  573|      0|  else
  574|      0|    foreach_grapheme (buffer, start, end)
  ------------------
  |  |  349|      0|	foreach_group (buffer, start, end, _hb_grapheme_group_func)
  |  |  ------------------
  |  |  |  |  662|      0|  for (unsigned int \
  |  |  |  |  663|      0|       _count = buffer->len, \
  |  |  |  |  664|      0|       start = 0, end = _count ? buffer->group_end (0, group_func) : 0; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (664:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  665|      0|       start < _count; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (665:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  666|      0|       start = end, end = buffer->group_end (start, group_func))
  |  |  ------------------
  ------------------
  575|      0|      buffer->unsafe_to_break (start, end);
  576|   102k|}
hb-ot-shape.cc:_ZL26hb_ensure_native_directionP11hb_buffer_t:
  580|   204k|{
  581|   204k|  hb_direction_t direction = buffer->props.direction;
  582|   204k|  hb_direction_t horiz_dir = hb_script_get_horizontal_direction (buffer->props.script);
  583|       |
  584|       |  /* Numeric runs in natively-RTL scripts are actually native-LTR, so we reset
  585|       |   * the horiz_dir if the run contains at least one decimal-number char, and no
  586|       |   * letter chars (ideally we should be checking for chars with strong
  587|       |   * directionality but hb-unicode currently lacks bidi categories).
  588|       |   *
  589|       |   * This allows digit sequences in Arabic etc to be shaped in "native"
  590|       |   * direction, so that features like ligatures will work as intended.
  591|       |   *
  592|       |   * https://github.com/harfbuzz/harfbuzz/issues/501
  593|       |   *
  594|       |   * Similar thing about Regional_Indicators; They are bidi=L, but Script=Common.
  595|       |   * If they are present in a run of natively-RTL text, they get assigned a script
  596|       |   * with natively RTL direction, which would result in wrong shaping if we
  597|       |   * assign such native RTL direction to them then. Detect that as well.
  598|       |   *
  599|       |   * https://github.com/harfbuzz/harfbuzz/issues/3314
  600|       |   */
  601|   204k|  if (unlikely (horiz_dir == HB_DIRECTION_RTL && direction == HB_DIRECTION_LTR))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 204k]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  602|      0|  {
  603|      0|    bool found_number = false, found_letter = false, found_ri = false;
  604|      0|    const auto* info = buffer->info;
  605|      0|    const auto count = buffer->len;
  606|      0|    for (unsigned i = 0; i < count; i++)
  ------------------
  |  Branch (606:26): [True: 0, False: 0]
  ------------------
  607|      0|    {
  608|      0|      auto gc = _hb_glyph_info_get_general_category (&info[i]);
  609|      0|      if (gc == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
  ------------------
  |  Branch (609:11): [True: 0, False: 0]
  ------------------
  610|      0|	found_number = true;
  611|      0|      else if (HB_UNICODE_GENERAL_CATEGORY_IS_LETTER (gc))
  ------------------
  |  |  361|      0|	(FLAG_UNSAFE (gen_cat) & \
  |  |  ------------------
  |  |  |  |   74|      0|#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (74:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (361:2): [True: 0, False: 0]
  |  |  ------------------
  |  |  362|      0|	 (FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) | \
  |  |  ------------------
  |  |  |  |   73|      0|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      0|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  363|      0|	  FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER) | \
  |  |  ------------------
  |  |  |  |   73|      0|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      0|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  364|      0|	  FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) | \
  |  |  ------------------
  |  |  |  |   73|      0|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      0|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  365|      0|	  FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) | \
  |  |  ------------------
  |  |  |  |   73|      0|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      0|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  366|      0|	  FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER)))
  |  |  ------------------
  |  |  |  |   73|      0|#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      0|#define static_assert_expr(C) static_assert_expr<C>::value
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  612|      0|      {
  613|      0|	found_letter = true;
  614|      0|	break;
  615|      0|      }
  616|      0|      else if (_hb_codepoint_is_regional_indicator (info[i].codepoint))
  ------------------
  |  Branch (616:16): [True: 0, False: 0]
  ------------------
  617|      0|	found_ri = true;
  618|      0|    }
  619|      0|    if ((found_number || found_ri) && !found_letter)
  ------------------
  |  Branch (619:10): [True: 0, False: 0]
  |  Branch (619:26): [True: 0, False: 0]
  |  Branch (619:39): [True: 0, False: 0]
  ------------------
  620|      0|      horiz_dir = HB_DIRECTION_LTR;
  621|      0|  }
  622|       |
  623|       |  /* TODO vertical:
  624|       |   * The only BTT vertical script is Ogham, but it's not clear to me whether OpenType
  625|       |   * Ogham fonts are supposed to be implemented BTT or not.  Need to research that
  626|       |   * first. */
  627|   204k|  if ((HB_DIRECTION_IS_HORIZONTAL (direction) &&
  ------------------
  |  |  271|   409k|#define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
  |  |  ------------------
  |  |  |  Branch (271:41): [True: 204k, False: 0]
  |  |  ------------------
  ------------------
  628|   204k|       direction != horiz_dir && horiz_dir != HB_DIRECTION_INVALID) ||
  ------------------
  |  Branch (628:8): [True: 0, False: 204k]
  |  Branch (628:34): [True: 0, False: 0]
  ------------------
  629|   204k|      (HB_DIRECTION_IS_VERTICAL   (direction) &&
  ------------------
  |  |  280|   409k|#define HB_DIRECTION_IS_VERTICAL(dir)	((((unsigned int) (dir)) & ~1U) == 6)
  |  |  ------------------
  |  |  |  Branch (280:39): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  630|   204k|       direction != HB_DIRECTION_TTB))
  ------------------
  |  Branch (630:8): [True: 0, False: 0]
  ------------------
  631|      0|  {
  632|      0|    _hb_ot_layout_reverse_graphemes (buffer);
  633|      0|    buffer->props.direction = HB_DIRECTION_REVERSE (buffer->props.direction);
  ------------------
  |  |  307|      0|#define HB_DIRECTION_REVERSE(dir)	((hb_direction_t) (((unsigned int) (dir)) ^ 1))
  ------------------
  634|      0|  }
  635|   204k|}
hb-ot-shape.cc:_ZL20hb_ot_substitute_prePK21hb_ot_shape_context_t:
  947|   204k|{
  948|   204k|  hb_ot_substitute_default (c);
  949|       |
  950|   204k|  _hb_buffer_allocate_gsubgpos_vars (c->buffer);
  951|       |
  952|   204k|  hb_ot_substitute_plan (c);
  953|       |
  954|   204k|#ifndef HB_NO_AAT_SHAPE
  955|   204k|  if (c->plan->apply_morx && c->plan->apply_gpos)
  ------------------
  |  Branch (955:7): [True: 0, False: 204k]
  |  Branch (955:30): [True: 0, False: 0]
  ------------------
  956|      0|    hb_aat_layout_remove_deleted_glyphs (c->buffer);
  957|   204k|#endif
  958|   204k|}
hb-ot-shape.cc:_ZL24hb_ot_substitute_defaultPK21hb_ot_shape_context_t:
  906|   204k|{
  907|   204k|  hb_buffer_t *buffer = c->buffer;
  908|       |
  909|   204k|  hb_ot_rotate_chars (c);
  910|       |
  911|   204k|  HB_BUFFER_ALLOCATE_VAR (buffer, glyph_index);
  ------------------
  |  |  675|   204k|#define HB_BUFFER_ALLOCATE_VAR(b, var)		HB_BUFFER_XALLOCATE_VAR (b, allocate_var,     var ())
  |  |  ------------------
  |  |  |  |  673|   204k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   204k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  912|       |
  913|   204k|  _hb_ot_shape_normalize (c->plan, buffer, c->font);
  914|       |
  915|   204k|  hb_ot_shape_setup_masks (c);
  916|       |
  917|       |  /* This is unfortunate to go here, but necessary... */
  918|   204k|  if (c->plan->fallback_mark_positioning)
  ------------------
  |  Branch (918:7): [True: 0, False: 204k]
  ------------------
  919|      0|    _hb_ot_shape_fallback_mark_position_recategorize_marks (c->plan, c->font, buffer);
  920|       |
  921|   204k|  hb_ot_map_glyphs_fast (buffer);
  922|       |
  923|   204k|  HB_BUFFER_DEALLOCATE_VAR (buffer, glyph_index);
  ------------------
  |  |  677|   204k|#define HB_BUFFER_DEALLOCATE_VAR(b, var)	HB_BUFFER_XALLOCATE_VAR (b, deallocate_var,   var ())
  |  |  ------------------
  |  |  |  |  673|   204k|  b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \
  |  |  |  |  674|   204k|	   sizeof (b->info[0].var))
  |  |  ------------------
  ------------------
  924|   204k|}
hb-ot-shape.cc:_ZL18hb_ot_rotate_charsPK21hb_ot_shape_context_t:
  697|   204k|{
  698|   204k|  hb_buffer_t *buffer = c->buffer;
  699|   204k|  unsigned int count = buffer->len;
  700|   204k|  hb_glyph_info_t *info = buffer->info;
  701|       |
  702|   204k|  if (HB_DIRECTION_IS_BACKWARD (c->target_direction))
  ------------------
  |  |  298|   204k|#define HB_DIRECTION_IS_BACKWARD(dir)	((((unsigned int) (dir)) & ~2U) == 5)
  |  |  ------------------
  |  |  |  Branch (298:39): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  703|      0|  {
  704|      0|    hb_unicode_funcs_t *unicode = buffer->unicode;
  705|      0|    hb_mask_t rtlm_mask = c->plan->rtlm_mask;
  706|       |
  707|      0|    for (unsigned int i = 0; i < count; i++) {
  ------------------
  |  Branch (707:30): [True: 0, False: 0]
  ------------------
  708|      0|      hb_codepoint_t codepoint = unicode->mirroring (info[i].codepoint);
  709|      0|      if (unlikely (codepoint != info[i].codepoint && c->font->has_glyph (codepoint)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  710|      0|	info[i].codepoint = codepoint;
  711|      0|      else
  712|      0|	info[i].mask |= rtlm_mask;
  713|      0|    }
  714|      0|  }
  715|       |
  716|   204k|#ifndef HB_NO_VERTICAL
  717|   204k|  if (HB_DIRECTION_IS_VERTICAL (c->target_direction) && !c->plan->has_vert)
  ------------------
  |  |  280|   409k|#define HB_DIRECTION_IS_VERTICAL(dir)	((((unsigned int) (dir)) & ~1U) == 6)
  |  |  ------------------
  |  |  |  Branch (280:39): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  |  Branch (717:57): [True: 0, False: 0]
  ------------------
  718|      0|  {
  719|      0|    for (unsigned int i = 0; i < count; i++) {
  ------------------
  |  Branch (719:30): [True: 0, False: 0]
  ------------------
  720|      0|      hb_codepoint_t codepoint = hb_vert_char_for (info[i].codepoint);
  721|      0|      if (unlikely (codepoint != info[i].codepoint && c->font->has_glyph (codepoint)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  722|      0|	info[i].codepoint = codepoint;
  723|      0|    }
  724|      0|  }
  725|   204k|#endif
  726|   204k|}
hb-ot-shape.cc:_ZL23hb_ot_shape_setup_masksPK21hb_ot_shape_context_t:
  802|   204k|{
  803|   204k|  hb_ot_map_t *map = &c->plan->map;
  804|   204k|  hb_buffer_t *buffer = c->buffer;
  805|       |
  806|   204k|  hb_ot_shape_setup_masks_fraction (c);
  807|       |
  808|   204k|  if (c->plan->shaper->setup_masks)
  ------------------
  |  Branch (808:7): [True: 0, False: 204k]
  ------------------
  809|      0|    c->plan->shaper->setup_masks (c->plan, buffer, c->font);
  810|       |
  811|  1.22M|  for (unsigned int i = 0; i < c->num_user_features; i++)
  ------------------
  |  Branch (811:28): [True: 1.02M, False: 204k]
  ------------------
  812|  1.02M|  {
  813|  1.02M|    const hb_feature_t *feature = &c->user_features[i];
  814|  1.02M|    if (!(feature->start == HB_FEATURE_GLOBAL_START && feature->end == HB_FEATURE_GLOBAL_END)) {
  ------------------
  |  |  805|  2.04M|#define HB_FEATURE_GLOBAL_START	0
  ------------------
                  if (!(feature->start == HB_FEATURE_GLOBAL_START && feature->end == HB_FEATURE_GLOBAL_END)) {
  ------------------
  |  |  815|  1.02M|#define HB_FEATURE_GLOBAL_END	((unsigned int) -1)
  ------------------
  |  Branch (814:11): [True: 1.02M, False: 0]
  |  Branch (814:56): [True: 1.02M, False: 0]
  ------------------
  815|      0|      unsigned int shift;
  816|      0|      hb_mask_t mask = map->get_mask (feature->tag, &shift);
  817|      0|      buffer->set_masks (feature->value << shift, mask, feature->start, feature->end);
  818|      0|    }
  819|  1.02M|  }
  820|   204k|}
hb-ot-shape.cc:_ZL32hb_ot_shape_setup_masks_fractionPK21hb_ot_shape_context_t:
  730|   204k|{
  731|       |#ifdef HB_NO_OT_SHAPE_FRACTIONS
  732|       |  return;
  733|       |#endif
  734|       |
  735|   204k|  if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) ||
  ------------------
  |  Branch (735:7): [True: 102k, False: 102k]
  ------------------
  736|   204k|      !c->plan->has_frac)
  ------------------
  |  Branch (736:7): [True: 102k, False: 0]
  ------------------
  737|   204k|    return;
  738|       |
  739|      0|  hb_buffer_t *buffer = c->buffer;
  740|       |
  741|      0|  hb_mask_t pre_mask, post_mask;
  742|      0|  if (HB_DIRECTION_IS_FORWARD (buffer->props.direction))
  ------------------
  |  |  289|      0|#define HB_DIRECTION_IS_FORWARD(dir)	((((unsigned int) (dir)) & ~2U) == 4)
  |  |  ------------------
  |  |  |  Branch (289:38): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  743|      0|  {
  744|      0|    pre_mask = c->plan->numr_mask | c->plan->frac_mask;
  745|      0|    post_mask = c->plan->frac_mask | c->plan->dnom_mask;
  746|      0|  }
  747|      0|  else
  748|      0|  {
  749|      0|    pre_mask = c->plan->frac_mask | c->plan->dnom_mask;
  750|      0|    post_mask = c->plan->numr_mask | c->plan->frac_mask;
  751|      0|  }
  752|       |
  753|      0|  unsigned int count = buffer->len;
  754|      0|  hb_glyph_info_t *info = buffer->info;
  755|      0|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (755:28): [True: 0, False: 0]
  ------------------
  756|      0|  {
  757|      0|    if (info[i].codepoint == 0x2044u) /* FRACTION SLASH */
  ------------------
  |  Branch (757:9): [True: 0, False: 0]
  ------------------
  758|      0|    {
  759|      0|      unsigned int start = i, end = i + 1;
  760|      0|      while (start &&
  ------------------
  |  Branch (760:14): [True: 0, False: 0]
  ------------------
  761|      0|	     _hb_glyph_info_get_general_category (&info[start - 1]) ==
  ------------------
  |  Branch (761:7): [True: 0, False: 0]
  ------------------
  762|      0|	     HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
  763|      0|	start--;
  764|      0|      while (end < count &&
  ------------------
  |  Branch (764:14): [True: 0, False: 0]
  ------------------
  765|      0|	     _hb_glyph_info_get_general_category (&info[end]) ==
  ------------------
  |  Branch (765:7): [True: 0, False: 0]
  ------------------
  766|      0|	     HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
  767|      0|	end++;
  768|      0|      if (start == i || end == i + 1)
  ------------------
  |  Branch (768:11): [True: 0, False: 0]
  |  Branch (768:25): [True: 0, False: 0]
  ------------------
  769|      0|      {
  770|      0|        if (start == i)
  ------------------
  |  Branch (770:13): [True: 0, False: 0]
  ------------------
  771|      0|	  buffer->unsafe_to_concat (start, start + 1);
  772|      0|	if (end == i + 1)
  ------------------
  |  Branch (772:6): [True: 0, False: 0]
  ------------------
  773|      0|	  buffer->unsafe_to_concat (end - 1, end);
  774|      0|	continue;
  775|      0|      }
  776|       |
  777|      0|      buffer->unsafe_to_break (start, end);
  778|       |
  779|      0|      for (unsigned int j = start; j < i; j++)
  ------------------
  |  Branch (779:36): [True: 0, False: 0]
  ------------------
  780|      0|	info[j].mask |= pre_mask;
  781|      0|      info[i].mask |= c->plan->frac_mask;
  782|      0|      for (unsigned int j = i + 1; j < end; j++)
  ------------------
  |  Branch (782:36): [True: 0, False: 0]
  ------------------
  783|      0|	info[j].mask |= post_mask;
  784|       |
  785|      0|      i = end - 1;
  786|      0|    }
  787|      0|  }
  788|      0|}
hb-ot-shape.cc:_ZL21hb_ot_map_glyphs_fastP11hb_buffer_t:
  868|   204k|{
  869|       |  /* Normalization process sets up glyph_index(), we just copy it. */
  870|   204k|  unsigned int count = buffer->len;
  871|   204k|  hb_glyph_info_t *info = buffer->info;
  872|  3.13M|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (872:28): [True: 2.93M, False: 204k]
  ------------------
  873|  2.93M|    info[i].codepoint = info[i].glyph_index();
  ------------------
  |  |   34|  2.93M|#define glyph_index()	var1.u32
  ------------------
  874|       |
  875|   204k|  buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
  876|   204k|}
hb-ot-shape.cc:_ZL21hb_ot_substitute_planPK21hb_ot_shape_context_t:
  928|   204k|{
  929|   204k|  hb_buffer_t *buffer = c->buffer;
  930|       |
  931|   204k|  hb_ot_layout_substitute_start (c->font, buffer);
  932|       |
  933|   204k|  if (c->plan->fallback_glyph_classes)
  ------------------
  |  Branch (933:7): [True: 204k, False: 9]
  ------------------
  934|   204k|    hb_synthesize_glyph_classes (c->buffer);
  935|       |
  936|   204k|#ifndef HB_NO_AAT_SHAPE
  937|   204k|  if (unlikely (c->plan->apply_morx))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  938|      0|    hb_aat_layout_substitute (c->plan, c->font, c->buffer,
  939|      0|			      c->user_features, c->num_user_features);
  940|   204k|  else
  941|   204k|#endif
  942|   204k|    c->plan->substitute (c->font, buffer);
  943|   204k|}
hb-ot-shape.cc:_ZL27hb_synthesize_glyph_classesP11hb_buffer_t:
  880|   204k|{
  881|   204k|  unsigned int count = buffer->len;
  882|   204k|  hb_glyph_info_t *info = buffer->info;
  883|  3.13M|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (883:28): [True: 2.93M, False: 204k]
  ------------------
  884|  2.93M|  {
  885|  2.93M|    hb_ot_layout_glyph_props_flags_t klass;
  886|       |
  887|       |    /* Never mark default-ignorables as marks.
  888|       |     * They won't get in the way of lookups anyway,
  889|       |     * but having them as mark will cause them to be skipped
  890|       |     * over if the lookup-flag says so, but at least for the
  891|       |     * Mongolian variation selectors, looks like Uniscribe
  892|       |     * marks them as non-mark.  Some Mongolian fonts without
  893|       |     * GDEF rely on this.  Another notable character that
  894|       |     * this applies to is COMBINING GRAPHEME JOINER. */
  895|  2.93M|    klass = (_hb_glyph_info_get_general_category (&info[i]) !=
  ------------------
  |  Branch (895:14): [True: 2.93M, False: 0]
  ------------------
  896|  2.93M|	     HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK ||
  897|  2.93M|	     _hb_glyph_info_is_default_ignorable (&info[i])) ?
  ------------------
  |  Branch (897:7): [True: 0, False: 0]
  ------------------
  898|  2.93M|	    HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH :
  899|  2.93M|	    HB_OT_LAYOUT_GLYPH_PROPS_MARK;
  900|  2.93M|    _hb_glyph_info_set_glyph_props (&info[i], klass);
  901|  2.93M|  }
  902|   204k|}
hb-ot-shape.cc:_ZL14hb_ot_positionPK21hb_ot_shape_context_t:
 1125|   204k|{
 1126|   204k|  c->buffer->clear_positions ();
 1127|       |
 1128|   204k|  hb_ot_position_default (c);
 1129|       |
 1130|   204k|  hb_ot_position_plan (c);
 1131|       |
 1132|   204k|  if (HB_DIRECTION_IS_BACKWARD (c->buffer->props.direction))
  ------------------
  |  |  298|   204k|#define HB_DIRECTION_IS_BACKWARD(dir)	((((unsigned int) (dir)) & ~2U) == 5)
  |  |  ------------------
  |  |  |  Branch (298:39): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
 1133|      0|    hb_buffer_reverse (c->buffer);
 1134|       |
 1135|   204k|  _hb_buffer_deallocate_gsubgpos_vars (c->buffer);
 1136|   204k|}
hb-ot-shape.cc:_ZL22hb_ot_position_defaultPK21hb_ot_shape_context_t:
 1012|   204k|{
 1013|   204k|  hb_direction_t direction = c->buffer->props.direction;
 1014|   204k|  unsigned int count = c->buffer->len;
 1015|   204k|  hb_glyph_info_t *info = c->buffer->info;
 1016|   204k|  hb_glyph_position_t *pos = c->buffer->pos;
 1017|       |
 1018|   204k|  if (HB_DIRECTION_IS_HORIZONTAL (direction))
  ------------------
  |  |  271|   204k|#define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
  |  |  ------------------
  |  |  |  Branch (271:41): [True: 204k, False: 0]
  |  |  ------------------
  ------------------
 1019|   204k|  {
 1020|   204k|    c->font->get_glyph_h_advances (count, &info[0].codepoint, sizeof(info[0]),
 1021|   204k|				   &pos[0].x_advance, sizeof(pos[0]));
 1022|       |    /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
 1023|   204k|    if (c->font->has_glyph_h_origin_func ())
  ------------------
  |  Branch (1023:9): [True: 204k, False: 0]
  ------------------
 1024|  3.13M|      for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (1024:32): [True: 2.93M, False: 204k]
  ------------------
 1025|  2.93M|	c->font->subtract_glyph_h_origin (info[i].codepoint,
 1026|  2.93M|					  &pos[i].x_offset,
 1027|  2.93M|					  &pos[i].y_offset);
 1028|   204k|  }
 1029|      0|  else
 1030|      0|  {
 1031|      0|    c->font->get_glyph_v_advances (count, &info[0].codepoint, sizeof(info[0]),
 1032|      0|				   &pos[0].y_advance, sizeof(pos[0]));
 1033|      0|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (1033:30): [True: 0, False: 0]
  ------------------
 1034|      0|    {
 1035|      0|      c->font->subtract_glyph_v_origin (info[i].codepoint,
 1036|      0|					&pos[i].x_offset,
 1037|      0|					&pos[i].y_offset);
 1038|      0|    }
 1039|      0|  }
 1040|   204k|  if (c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK)
  ------------------
  |  Branch (1040:7): [True: 0, False: 204k]
  ------------------
 1041|      0|    _hb_ot_shape_fallback_spaces (c->plan, c->font, c->buffer);
 1042|   204k|}
hb-ot-shape.cc:_ZL19hb_ot_position_planPK21hb_ot_shape_context_t:
 1046|   204k|{
 1047|   204k|  unsigned int count = c->buffer->len;
 1048|   204k|  hb_glyph_info_t *info = c->buffer->info;
 1049|   204k|  hb_glyph_position_t *pos = c->buffer->pos;
 1050|       |
 1051|       |  /* If the font has no GPOS and direction is forward, then when
 1052|       |   * zeroing mark widths, we shift the mark with it, such that the
 1053|       |   * mark is positioned hanging over the previous glyph.  When
 1054|       |   * direction is backward we don't shift and it will end up
 1055|       |   * hanging over the next glyph after the final reordering.
 1056|       |   *
 1057|       |   * Note: If fallback positioning happens, we don't care about
 1058|       |   * this as it will be overridden.
 1059|       |   */
 1060|   204k|  bool adjust_offsets_when_zeroing = c->plan->adjust_mark_positioning_when_zeroing &&
  ------------------
  |  Branch (1060:38): [True: 0, False: 204k]
  ------------------
 1061|   204k|				     HB_DIRECTION_IS_FORWARD (c->buffer->props.direction);
  ------------------
  |  |  289|      0|#define HB_DIRECTION_IS_FORWARD(dir)	((((unsigned int) (dir)) & ~2U) == 4)
  |  |  ------------------
  |  |  |  Branch (289:38): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1062|       |
 1063|       |  /* We change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
 1064|       |
 1065|       |  /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
 1066|   204k|  if (c->font->has_glyph_h_origin_func ())
  ------------------
  |  Branch (1066:7): [True: 204k, False: 0]
  ------------------
 1067|  3.13M|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (1067:30): [True: 2.93M, False: 204k]
  ------------------
 1068|  2.93M|      c->font->add_glyph_h_origin (info[i].codepoint,
 1069|  2.93M|				   &pos[i].x_offset,
 1070|  2.93M|				   &pos[i].y_offset);
 1071|       |
 1072|   204k|  hb_ot_layout_position_start (c->font, c->buffer);
 1073|       |
 1074|   204k|  if (c->plan->zero_marks)
  ------------------
  |  Branch (1074:7): [True: 204k, False: 0]
  ------------------
 1075|   204k|    switch (c->plan->shaper->zero_width_marks)
 1076|   204k|    {
 1077|      0|      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
  ------------------
  |  Branch (1077:7): [True: 0, False: 204k]
  ------------------
 1078|      0|	zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
 1079|      0|	break;
 1080|       |
 1081|      0|      default:
  ------------------
  |  Branch (1081:7): [True: 0, False: 204k]
  ------------------
 1082|      0|      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
  ------------------
  |  Branch (1082:7): [True: 0, False: 204k]
  ------------------
 1083|   204k|      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
  ------------------
  |  Branch (1083:7): [True: 204k, False: 0]
  ------------------
 1084|   204k|	break;
 1085|   204k|    }
 1086|       |
 1087|   204k|  c->plan->position (c->font, c->buffer);
 1088|       |
 1089|   204k|  if (c->plan->zero_marks)
  ------------------
  |  Branch (1089:7): [True: 204k, False: 0]
  ------------------
 1090|   204k|    switch (c->plan->shaper->zero_width_marks)
 1091|   204k|    {
 1092|   204k|      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE:
  ------------------
  |  Branch (1092:7): [True: 204k, False: 0]
  ------------------
 1093|   204k|	zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing);
 1094|   204k|	break;
 1095|       |
 1096|      0|      default:
  ------------------
  |  Branch (1096:7): [True: 0, False: 204k]
  ------------------
 1097|      0|      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE:
  ------------------
  |  Branch (1097:7): [True: 0, False: 204k]
  ------------------
 1098|      0|      case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY:
  ------------------
  |  Branch (1098:7): [True: 0, False: 204k]
  ------------------
 1099|      0|	break;
 1100|   204k|    }
 1101|       |
 1102|       |  /* Finish off.  Has to follow a certain order. */
 1103|   204k|  hb_ot_layout_position_finish_advances (c->font, c->buffer);
 1104|   204k|  hb_ot_zero_width_default_ignorables (c->buffer);
 1105|   204k|#ifndef HB_NO_AAT_SHAPE
 1106|   204k|  if (c->plan->apply_morx)
  ------------------
  |  Branch (1106:7): [True: 0, False: 204k]
  ------------------
 1107|      0|    hb_aat_layout_zero_width_deleted_glyphs (c->buffer);
 1108|   204k|#endif
 1109|   204k|  hb_ot_layout_position_finish_offsets (c->font, c->buffer);
 1110|       |
 1111|       |  /* The nil glyph_h_origin() func returns 0, so no need to apply it. */
 1112|   204k|  if (c->font->has_glyph_h_origin_func ())
  ------------------
  |  Branch (1112:7): [True: 204k, False: 0]
  ------------------
 1113|  3.13M|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (1113:30): [True: 2.93M, False: 204k]
  ------------------
 1114|  2.93M|      c->font->subtract_glyph_h_origin (info[i].codepoint,
 1115|  2.93M|					&pos[i].x_offset,
 1116|  2.93M|					&pos[i].y_offset);
 1117|       |
 1118|   204k|  if (c->plan->fallback_mark_positioning)
  ------------------
  |  Branch (1118:7): [True: 0, False: 204k]
  ------------------
 1119|      0|    _hb_ot_shape_fallback_mark_position (c->plan, c->font, c->buffer,
 1120|      0|					 adjust_offsets_when_zeroing);
 1121|   204k|}
hb-ot-shape.cc:_ZL24zero_mark_widths_by_gdefP11hb_buffer_tb:
  998|   204k|{
  999|   204k|  unsigned int count = buffer->len;
 1000|   204k|  hb_glyph_info_t *info = buffer->info;
 1001|  3.13M|  for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (1001:28): [True: 2.93M, False: 204k]
  ------------------
 1002|  2.93M|    if (_hb_glyph_info_is_mark (&info[i]))
  ------------------
  |  Branch (1002:9): [True: 0, False: 2.93M]
  ------------------
 1003|      0|    {
 1004|      0|      if (adjust_offsets)
  ------------------
  |  Branch (1004:11): [True: 0, False: 0]
  ------------------
 1005|      0|	adjust_mark_offsets (&buffer->pos[i]);
 1006|      0|      zero_mark_width (&buffer->pos[i]);
 1007|      0|    }
 1008|   204k|}
hb-ot-shape.cc:_ZL35hb_ot_zero_width_default_ignorablesPK11hb_buffer_t:
  824|   204k|{
  825|   204k|  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
  ------------------
  |  Branch (825:7): [True: 204k, False: 3]
  ------------------
  826|   204k|      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES) ||
  ------------------
  |  Branch (826:7): [True: 0, False: 3]
  ------------------
  827|   204k|      (buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES))
  ------------------
  |  Branch (827:7): [True: 0, False: 3]
  ------------------
  828|   204k|    return;
  829|       |
  830|      3|  unsigned int count = buffer->len;
  831|      3|  hb_glyph_info_t *info = buffer->info;
  832|      3|  hb_glyph_position_t *pos = buffer->pos;
  833|      3|  unsigned int i = 0;
  834|   247k|  for (i = 0; i < count; i++)
  ------------------
  |  Branch (834:15): [True: 247k, False: 3]
  ------------------
  835|   247k|    if (unlikely (_hb_glyph_info_is_default_ignorable (&info[i])))
  ------------------
  |  |  260|   247k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 9, False: 247k]
  |  |  ------------------
  ------------------
  836|      9|      pos[i].x_advance = pos[i].y_advance = pos[i].x_offset = pos[i].y_offset = 0;
  837|      3|}
hb-ot-shape.cc:_ZL21hb_ot_substitute_postPK21hb_ot_shape_context_t:
  962|   204k|{
  963|   204k|#ifndef HB_NO_AAT_SHAPE
  964|   204k|  if (c->plan->apply_morx && !c->plan->apply_gpos)
  ------------------
  |  Branch (964:7): [True: 0, False: 204k]
  |  Branch (964:30): [True: 0, False: 0]
  ------------------
  965|      0|    hb_aat_layout_remove_deleted_glyphs (c->buffer);
  966|   204k|#endif
  967|       |
  968|   204k|  hb_ot_hide_default_ignorables (c->buffer, c->font);
  969|       |
  970|   204k|  if (c->plan->shaper->postprocess_glyphs &&
  ------------------
  |  Branch (970:7): [True: 0, False: 204k]
  ------------------
  971|   204k|    c->buffer->message(c->font, "start postprocess-glyphs")) {
  ------------------
  |  Branch (971:5): [True: 0, False: 0]
  ------------------
  972|      0|    c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font);
  973|      0|    (void) c->buffer->message(c->font, "end postprocess-glyphs");
  974|      0|  }
  975|   204k|}
hb-ot-shape.cc:_ZL29hb_ot_hide_default_ignorablesP11hb_buffer_tP9hb_font_t:
  842|   204k|{
  843|   204k|  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) ||
  ------------------
  |  Branch (843:7): [True: 204k, False: 3]
  ------------------
  844|   204k|      (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES))
  ------------------
  |  Branch (844:7): [True: 0, False: 3]
  ------------------
  845|   204k|    return;
  846|       |
  847|      3|  unsigned int count = buffer->len;
  848|      3|  hb_glyph_info_t *info = buffer->info;
  849|       |
  850|      3|  hb_codepoint_t invisible = buffer->invisible;
  851|      3|  if (!(buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) &&
  ------------------
  |  Branch (851:7): [True: 3, False: 0]
  ------------------
  852|      3|      (invisible || font->get_nominal_glyph (' ', &invisible)))
  ------------------
  |  Branch (852:8): [True: 0, False: 3]
  |  Branch (852:21): [True: 3, False: 0]
  ------------------
  853|      3|  {
  854|       |    /* Replace default-ignorables with a zero-advance invisible glyph. */
  855|   247k|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (855:30): [True: 247k, False: 3]
  ------------------
  856|   247k|    {
  857|   247k|      if (_hb_glyph_info_is_default_ignorable (&info[i]))
  ------------------
  |  Branch (857:11): [True: 9, False: 247k]
  ------------------
  858|      9|	info[i].codepoint = invisible;
  859|   247k|    }
  860|      3|  }
  861|      0|  else
  862|      0|    buffer->delete_glyphs_inplace (_hb_glyph_info_is_default_ignorable);
  863|      3|}
hb-ot-shape.cc:_ZL18hb_propagate_flagsP11hb_buffer_t:
 1140|   204k|{
 1141|       |  /* Propagate cluster-level glyph flags to be the same on all cluster glyphs.
 1142|       |   * Simplifies using them. */
 1143|       |
 1144|   204k|  if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS))
  ------------------
  |  Branch (1144:7): [True: 204k, False: 0]
  ------------------
 1145|   204k|    return;
 1146|       |
 1147|       |  /* If we are producing SAFE_TO_INSERT_TATWEEL, then do two things:
 1148|       |   *
 1149|       |   * - If the places that the Arabic shaper marked as SAFE_TO_INSERT_TATWEEL,
 1150|       |   *   are UNSAFE_TO_BREAK, then clear the SAFE_TO_INSERT_TATWEEL,
 1151|       |   * - Any place that is SAFE_TO_INSERT_TATWEEL, is also now UNSAFE_TO_BREAK.
 1152|       |   *
 1153|       |   * We couldn't make this interaction earlier. It has to be done here.
 1154|       |   */
 1155|      0|  bool flip_tatweel = buffer->flags & HB_BUFFER_FLAG_PRODUCE_SAFE_TO_INSERT_TATWEEL;
 1156|       |
 1157|      0|  bool clear_concat = (buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) == 0;
 1158|       |
 1159|      0|  hb_glyph_info_t *info = buffer->info;
 1160|       |
 1161|      0|  foreach_cluster (buffer, start, end)
  ------------------
  |  |  669|      0|	foreach_group (buffer, start, end, hb_buffer_t::_cluster_group_func)
  |  |  ------------------
  |  |  |  |  662|      0|  for (unsigned int \
  |  |  |  |  663|      0|       _count = buffer->len, \
  |  |  |  |  664|      0|       start = 0, end = _count ? buffer->group_end (0, group_func) : 0; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (664:25): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  665|      0|       start < _count; \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (665:8): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  666|      0|       start = end, end = buffer->group_end (start, group_func))
  |  |  ------------------
  ------------------
 1162|      0|  {
 1163|      0|    unsigned int mask = 0;
 1164|      0|    for (unsigned int i = start; i < end; i++)
  ------------------
  |  Branch (1164:34): [True: 0, False: 0]
  ------------------
 1165|      0|      mask |= info[i].mask & HB_GLYPH_FLAG_DEFINED;
 1166|       |
 1167|      0|    if (flip_tatweel)
  ------------------
  |  Branch (1167:9): [True: 0, False: 0]
  ------------------
 1168|      0|    {
 1169|      0|      if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK)
  ------------------
  |  Branch (1169:11): [True: 0, False: 0]
  ------------------
 1170|      0|	mask &= ~HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL;
 1171|      0|      if (mask & HB_GLYPH_FLAG_SAFE_TO_INSERT_TATWEEL)
  ------------------
  |  Branch (1171:11): [True: 0, False: 0]
  ------------------
 1172|      0|	mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK | HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
 1173|      0|    }
 1174|       |
 1175|      0|    if (clear_concat)
  ------------------
  |  Branch (1175:9): [True: 0, False: 0]
  ------------------
 1176|      0|	mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_CONCAT;
 1177|       |
 1178|      0|    for (unsigned int i = start; i < end; i++)
  ------------------
  |  Branch (1178:34): [True: 0, False: 0]
  ------------------
 1179|      0|      info[i].mask = mask;
 1180|      0|  }
 1181|      0|}

_ZN22hb_ot_shape_plan_key_t4initEP9hb_face_tPKij:
   43|   204k|  {
   44|   614k|    for (unsigned int table_index = 0; table_index < 2; table_index++)
  ------------------
  |  Branch (44:40): [True: 409k, False: 204k]
  ------------------
   45|   409k|      hb_ot_layout_table_find_feature_variations (face,
   46|   409k|						  table_tags[table_index],
   47|   409k|						  coords,
   48|   409k|						  num_coords,
   49|   409k|						  &variations_index[table_index]);
   50|   204k|  }
_ZN22hb_ot_shape_plan_key_t5equalEPKS_:
   53|   204k|  {
   54|   204k|    return 0 == hb_memcmp (this, other, sizeof (*this));
   55|   204k|  }
_ZN18hb_ot_shape_plan_tD2Ev:
   63|     13|  ~hb_ot_shape_plan_t () { fini (); }

hb-ot-shape.cc:_ZL23hb_ot_shaper_categorizePK21hb_ot_shape_planner_t:
  178|     13|{
  179|     13|  switch ((hb_tag_t) planner->props.script)
  180|     13|  {
  181|     13|    default:
  ------------------
  |  Branch (181:5): [True: 13, False: 0]
  ------------------
  182|     13|      return &_hb_ot_shaper_default;
  183|       |
  184|       |
  185|       |    /* Unicode-1.1 additions */
  186|      0|    case HB_SCRIPT_ARABIC:
  ------------------
  |  Branch (186:5): [True: 0, False: 13]
  ------------------
  187|       |
  188|       |    /* Unicode-3.0 additions */
  189|      0|    case HB_SCRIPT_SYRIAC:
  ------------------
  |  Branch (189:5): [True: 0, False: 13]
  ------------------
  190|       |
  191|       |      /* For Arabic script, use the Arabic shaper even if no OT script tag was found.
  192|       |       * This is because we do fallback shaping for Arabic script (and not others).
  193|       |       * But note that Arabic shaping is applicable only to horizontal layout; for
  194|       |       * vertical text, just use the generic shaper instead. */
  195|      0|      if ((planner->map.chosen_script[0] != HB_OT_TAG_DEFAULT_SCRIPT ||
  ------------------
  |  |   83|      0|#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (195:12): [True: 0, False: 0]
  ------------------
  196|      0|	   planner->props.script == HB_SCRIPT_ARABIC) &&
  ------------------
  |  Branch (196:5): [True: 0, False: 0]
  ------------------
  197|      0|	  HB_DIRECTION_IS_HORIZONTAL(planner->props.direction))
  ------------------
  |  |  271|      0|#define HB_DIRECTION_IS_HORIZONTAL(dir)	((((unsigned int) (dir)) & ~1U) == 4)
  |  |  ------------------
  |  |  |  Branch (271:41): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  198|      0|	return &_hb_ot_shaper_arabic;
  199|      0|      else
  200|      0|	return &_hb_ot_shaper_default;
  201|       |
  202|       |
  203|       |    /* Unicode-1.1 additions */
  204|      0|    case HB_SCRIPT_THAI:
  ------------------
  |  Branch (204:5): [True: 0, False: 13]
  ------------------
  205|      0|    case HB_SCRIPT_LAO:
  ------------------
  |  Branch (205:5): [True: 0, False: 13]
  ------------------
  206|       |
  207|      0|      return &_hb_ot_shaper_thai;
  208|       |
  209|       |
  210|       |    /* Unicode-1.1 additions */
  211|      0|    case HB_SCRIPT_HANGUL:
  ------------------
  |  Branch (211:5): [True: 0, False: 13]
  ------------------
  212|       |
  213|      0|      return &_hb_ot_shaper_hangul;
  214|       |
  215|       |
  216|       |    /* Unicode-1.1 additions */
  217|      0|    case HB_SCRIPT_HEBREW:
  ------------------
  |  Branch (217:5): [True: 0, False: 13]
  ------------------
  218|       |
  219|      0|      return &_hb_ot_shaper_hebrew;
  220|       |
  221|       |
  222|       |    /* Unicode-1.1 additions */
  223|      0|    case HB_SCRIPT_BENGALI:
  ------------------
  |  Branch (223:5): [True: 0, False: 13]
  ------------------
  224|      0|    case HB_SCRIPT_DEVANAGARI:
  ------------------
  |  Branch (224:5): [True: 0, False: 13]
  ------------------
  225|      0|    case HB_SCRIPT_GUJARATI:
  ------------------
  |  Branch (225:5): [True: 0, False: 13]
  ------------------
  226|      0|    case HB_SCRIPT_GURMUKHI:
  ------------------
  |  Branch (226:5): [True: 0, False: 13]
  ------------------
  227|      0|    case HB_SCRIPT_KANNADA:
  ------------------
  |  Branch (227:5): [True: 0, False: 13]
  ------------------
  228|      0|    case HB_SCRIPT_MALAYALAM:
  ------------------
  |  Branch (228:5): [True: 0, False: 13]
  ------------------
  229|      0|    case HB_SCRIPT_ORIYA:
  ------------------
  |  Branch (229:5): [True: 0, False: 13]
  ------------------
  230|      0|    case HB_SCRIPT_TAMIL:
  ------------------
  |  Branch (230:5): [True: 0, False: 13]
  ------------------
  231|      0|    case HB_SCRIPT_TELUGU:
  ------------------
  |  Branch (231:5): [True: 0, False: 13]
  ------------------
  232|       |
  233|       |      /* If the designer designed the font for the 'DFLT' script,
  234|       |       * (or we ended up arbitrarily pick 'latn'), use the default shaper.
  235|       |       * Otherwise, use the specific shaper.
  236|       |       *
  237|       |       * If it's indy3 tag, send to USE. */
  238|      0|      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (238:11): [True: 0, False: 0]
  ------------------
  239|      0|	  planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (239:4): [True: 0, False: 0]
  ------------------
  240|      0|	return &_hb_ot_shaper_default;
  241|      0|      else if ((planner->map.chosen_script[0] & 0x000000FF) == '3')
  ------------------
  |  Branch (241:16): [True: 0, False: 0]
  ------------------
  242|      0|	return &_hb_ot_shaper_use;
  243|      0|      else
  244|      0|	return &_hb_ot_shaper_indic;
  245|       |
  246|      0|    case HB_SCRIPT_KHMER:
  ------------------
  |  Branch (246:5): [True: 0, False: 13]
  ------------------
  247|      0|	return &_hb_ot_shaper_khmer;
  248|       |
  249|      0|    case HB_SCRIPT_MYANMAR:
  ------------------
  |  Branch (249:5): [True: 0, False: 13]
  ------------------
  250|       |      /* If the designer designed the font for the 'DFLT' script,
  251|       |       * (or we ended up arbitrarily pick 'latn'), use the default shaper.
  252|       |       * Otherwise, use the specific shaper.
  253|       |       *
  254|       |       * If designer designed for 'mymr' tag, also send to default
  255|       |       * shaper.  That's tag used from before Myanmar shaping spec
  256|       |       * was developed.  The shaping spec uses 'mym2' tag. */
  257|      0|      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (257:11): [True: 0, False: 0]
  ------------------
  258|      0|	  planner->map.chosen_script[0] == HB_TAG ('l','a','t','n') ||
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (258:4): [True: 0, False: 0]
  ------------------
  259|      0|	  planner->map.chosen_script[0] == HB_TAG ('m','y','m','r'))
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (259:4): [True: 0, False: 0]
  ------------------
  260|      0|	return &_hb_ot_shaper_default;
  261|      0|      else
  262|      0|	return &_hb_ot_shaper_myanmar;
  263|       |
  264|       |
  265|      0|#ifndef HB_NO_OT_SHAPER_MYANMAR_ZAWGYI
  266|      0|#define HB_SCRIPT_MYANMAR_ZAWGYI	((hb_script_t) HB_TAG ('Q','a','a','g'))
  267|      0|    case HB_SCRIPT_MYANMAR_ZAWGYI:
  ------------------
  |  |  266|      0|#define HB_SCRIPT_MYANMAR_ZAWGYI	((hb_script_t) HB_TAG ('Q','a','a','g'))
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (267:5): [True: 0, False: 13]
  ------------------
  268|       |    /* https://github.com/harfbuzz/harfbuzz/issues/1162 */
  269|       |
  270|      0|      return &_hb_ot_shaper_myanmar_zawgyi;
  271|      0|#endif
  272|       |
  273|       |
  274|       |    /* Unicode-2.0 additions */
  275|      0|    case HB_SCRIPT_TIBETAN:
  ------------------
  |  Branch (275:5): [True: 0, False: 13]
  ------------------
  276|       |
  277|       |    /* Unicode-3.0 additions */
  278|      0|    case HB_SCRIPT_MONGOLIAN:
  ------------------
  |  Branch (278:5): [True: 0, False: 13]
  ------------------
  279|      0|    case HB_SCRIPT_SINHALA:
  ------------------
  |  Branch (279:5): [True: 0, False: 13]
  ------------------
  280|       |
  281|       |    /* Unicode-3.2 additions */
  282|      0|    case HB_SCRIPT_BUHID:
  ------------------
  |  Branch (282:5): [True: 0, False: 13]
  ------------------
  283|      0|    case HB_SCRIPT_HANUNOO:
  ------------------
  |  Branch (283:5): [True: 0, False: 13]
  ------------------
  284|      0|    case HB_SCRIPT_TAGALOG:
  ------------------
  |  Branch (284:5): [True: 0, False: 13]
  ------------------
  285|      0|    case HB_SCRIPT_TAGBANWA:
  ------------------
  |  Branch (285:5): [True: 0, False: 13]
  ------------------
  286|       |
  287|       |    /* Unicode-4.0 additions */
  288|      0|    case HB_SCRIPT_LIMBU:
  ------------------
  |  Branch (288:5): [True: 0, False: 13]
  ------------------
  289|      0|    case HB_SCRIPT_TAI_LE:
  ------------------
  |  Branch (289:5): [True: 0, False: 13]
  ------------------
  290|       |
  291|       |    /* Unicode-4.1 additions */
  292|      0|    case HB_SCRIPT_BUGINESE:
  ------------------
  |  Branch (292:5): [True: 0, False: 13]
  ------------------
  293|      0|    case HB_SCRIPT_KHAROSHTHI:
  ------------------
  |  Branch (293:5): [True: 0, False: 13]
  ------------------
  294|      0|    case HB_SCRIPT_SYLOTI_NAGRI:
  ------------------
  |  Branch (294:5): [True: 0, False: 13]
  ------------------
  295|      0|    case HB_SCRIPT_TIFINAGH:
  ------------------
  |  Branch (295:5): [True: 0, False: 13]
  ------------------
  296|       |
  297|       |    /* Unicode-5.0 additions */
  298|      0|    case HB_SCRIPT_BALINESE:
  ------------------
  |  Branch (298:5): [True: 0, False: 13]
  ------------------
  299|      0|    case HB_SCRIPT_NKO:
  ------------------
  |  Branch (299:5): [True: 0, False: 13]
  ------------------
  300|      0|    case HB_SCRIPT_PHAGS_PA:
  ------------------
  |  Branch (300:5): [True: 0, False: 13]
  ------------------
  301|       |
  302|       |    /* Unicode-5.1 additions */
  303|      0|    case HB_SCRIPT_CHAM:
  ------------------
  |  Branch (303:5): [True: 0, False: 13]
  ------------------
  304|      0|    case HB_SCRIPT_KAYAH_LI:
  ------------------
  |  Branch (304:5): [True: 0, False: 13]
  ------------------
  305|      0|    case HB_SCRIPT_LEPCHA:
  ------------------
  |  Branch (305:5): [True: 0, False: 13]
  ------------------
  306|      0|    case HB_SCRIPT_REJANG:
  ------------------
  |  Branch (306:5): [True: 0, False: 13]
  ------------------
  307|      0|    case HB_SCRIPT_SAURASHTRA:
  ------------------
  |  Branch (307:5): [True: 0, False: 13]
  ------------------
  308|      0|    case HB_SCRIPT_SUNDANESE:
  ------------------
  |  Branch (308:5): [True: 0, False: 13]
  ------------------
  309|       |
  310|       |    /* Unicode-5.2 additions */
  311|      0|    case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS:
  ------------------
  |  Branch (311:5): [True: 0, False: 13]
  ------------------
  312|      0|    case HB_SCRIPT_JAVANESE:
  ------------------
  |  Branch (312:5): [True: 0, False: 13]
  ------------------
  313|      0|    case HB_SCRIPT_KAITHI:
  ------------------
  |  Branch (313:5): [True: 0, False: 13]
  ------------------
  314|      0|    case HB_SCRIPT_MEETEI_MAYEK:
  ------------------
  |  Branch (314:5): [True: 0, False: 13]
  ------------------
  315|      0|    case HB_SCRIPT_TAI_THAM:
  ------------------
  |  Branch (315:5): [True: 0, False: 13]
  ------------------
  316|      0|    case HB_SCRIPT_TAI_VIET:
  ------------------
  |  Branch (316:5): [True: 0, False: 13]
  ------------------
  317|       |
  318|       |    /* Unicode-6.0 additions */
  319|      0|    case HB_SCRIPT_BATAK:
  ------------------
  |  Branch (319:5): [True: 0, False: 13]
  ------------------
  320|      0|    case HB_SCRIPT_BRAHMI:
  ------------------
  |  Branch (320:5): [True: 0, False: 13]
  ------------------
  321|      0|    case HB_SCRIPT_MANDAIC:
  ------------------
  |  Branch (321:5): [True: 0, False: 13]
  ------------------
  322|       |
  323|       |    /* Unicode-6.1 additions */
  324|      0|    case HB_SCRIPT_CHAKMA:
  ------------------
  |  Branch (324:5): [True: 0, False: 13]
  ------------------
  325|      0|    case HB_SCRIPT_MIAO:
  ------------------
  |  Branch (325:5): [True: 0, False: 13]
  ------------------
  326|      0|    case HB_SCRIPT_SHARADA:
  ------------------
  |  Branch (326:5): [True: 0, False: 13]
  ------------------
  327|      0|    case HB_SCRIPT_TAKRI:
  ------------------
  |  Branch (327:5): [True: 0, False: 13]
  ------------------
  328|       |
  329|       |    /* Unicode-7.0 additions */
  330|      0|    case HB_SCRIPT_DUPLOYAN:
  ------------------
  |  Branch (330:5): [True: 0, False: 13]
  ------------------
  331|      0|    case HB_SCRIPT_GRANTHA:
  ------------------
  |  Branch (331:5): [True: 0, False: 13]
  ------------------
  332|      0|    case HB_SCRIPT_KHOJKI:
  ------------------
  |  Branch (332:5): [True: 0, False: 13]
  ------------------
  333|      0|    case HB_SCRIPT_KHUDAWADI:
  ------------------
  |  Branch (333:5): [True: 0, False: 13]
  ------------------
  334|      0|    case HB_SCRIPT_MAHAJANI:
  ------------------
  |  Branch (334:5): [True: 0, False: 13]
  ------------------
  335|      0|    case HB_SCRIPT_MANICHAEAN:
  ------------------
  |  Branch (335:5): [True: 0, False: 13]
  ------------------
  336|      0|    case HB_SCRIPT_MODI:
  ------------------
  |  Branch (336:5): [True: 0, False: 13]
  ------------------
  337|      0|    case HB_SCRIPT_PAHAWH_HMONG:
  ------------------
  |  Branch (337:5): [True: 0, False: 13]
  ------------------
  338|      0|    case HB_SCRIPT_PSALTER_PAHLAVI:
  ------------------
  |  Branch (338:5): [True: 0, False: 13]
  ------------------
  339|      0|    case HB_SCRIPT_SIDDHAM:
  ------------------
  |  Branch (339:5): [True: 0, False: 13]
  ------------------
  340|      0|    case HB_SCRIPT_TIRHUTA:
  ------------------
  |  Branch (340:5): [True: 0, False: 13]
  ------------------
  341|       |
  342|       |    /* Unicode-8.0 additions */
  343|      0|    case HB_SCRIPT_AHOM:
  ------------------
  |  Branch (343:5): [True: 0, False: 13]
  ------------------
  344|      0|    case HB_SCRIPT_MULTANI:
  ------------------
  |  Branch (344:5): [True: 0, False: 13]
  ------------------
  345|       |
  346|       |    /* Unicode-9.0 additions */
  347|      0|    case HB_SCRIPT_ADLAM:
  ------------------
  |  Branch (347:5): [True: 0, False: 13]
  ------------------
  348|      0|    case HB_SCRIPT_BHAIKSUKI:
  ------------------
  |  Branch (348:5): [True: 0, False: 13]
  ------------------
  349|      0|    case HB_SCRIPT_MARCHEN:
  ------------------
  |  Branch (349:5): [True: 0, False: 13]
  ------------------
  350|      0|    case HB_SCRIPT_NEWA:
  ------------------
  |  Branch (350:5): [True: 0, False: 13]
  ------------------
  351|       |
  352|       |    /* Unicode-10.0 additions */
  353|      0|    case HB_SCRIPT_MASARAM_GONDI:
  ------------------
  |  Branch (353:5): [True: 0, False: 13]
  ------------------
  354|      0|    case HB_SCRIPT_SOYOMBO:
  ------------------
  |  Branch (354:5): [True: 0, False: 13]
  ------------------
  355|      0|    case HB_SCRIPT_ZANABAZAR_SQUARE:
  ------------------
  |  Branch (355:5): [True: 0, False: 13]
  ------------------
  356|       |
  357|       |    /* Unicode-11.0 additions */
  358|      0|    case HB_SCRIPT_DOGRA:
  ------------------
  |  Branch (358:5): [True: 0, False: 13]
  ------------------
  359|      0|    case HB_SCRIPT_GUNJALA_GONDI:
  ------------------
  |  Branch (359:5): [True: 0, False: 13]
  ------------------
  360|      0|    case HB_SCRIPT_HANIFI_ROHINGYA:
  ------------------
  |  Branch (360:5): [True: 0, False: 13]
  ------------------
  361|      0|    case HB_SCRIPT_MAKASAR:
  ------------------
  |  Branch (361:5): [True: 0, False: 13]
  ------------------
  362|      0|    case HB_SCRIPT_MEDEFAIDRIN:
  ------------------
  |  Branch (362:5): [True: 0, False: 13]
  ------------------
  363|      0|    case HB_SCRIPT_OLD_SOGDIAN:
  ------------------
  |  Branch (363:5): [True: 0, False: 13]
  ------------------
  364|      0|    case HB_SCRIPT_SOGDIAN:
  ------------------
  |  Branch (364:5): [True: 0, False: 13]
  ------------------
  365|       |
  366|       |    /* Unicode-12.0 additions */
  367|      0|    case HB_SCRIPT_ELYMAIC:
  ------------------
  |  Branch (367:5): [True: 0, False: 13]
  ------------------
  368|      0|    case HB_SCRIPT_NANDINAGARI:
  ------------------
  |  Branch (368:5): [True: 0, False: 13]
  ------------------
  369|      0|    case HB_SCRIPT_NYIAKENG_PUACHUE_HMONG:
  ------------------
  |  Branch (369:5): [True: 0, False: 13]
  ------------------
  370|      0|    case HB_SCRIPT_WANCHO:
  ------------------
  |  Branch (370:5): [True: 0, False: 13]
  ------------------
  371|       |
  372|       |    /* Unicode-13.0 additions */
  373|      0|    case HB_SCRIPT_CHORASMIAN:
  ------------------
  |  Branch (373:5): [True: 0, False: 13]
  ------------------
  374|      0|    case HB_SCRIPT_DIVES_AKURU:
  ------------------
  |  Branch (374:5): [True: 0, False: 13]
  ------------------
  375|      0|    case HB_SCRIPT_KHITAN_SMALL_SCRIPT:
  ------------------
  |  Branch (375:5): [True: 0, False: 13]
  ------------------
  376|      0|    case HB_SCRIPT_YEZIDI:
  ------------------
  |  Branch (376:5): [True: 0, False: 13]
  ------------------
  377|       |
  378|       |    /* Unicode-14.0 additions */
  379|      0|    case HB_SCRIPT_CYPRO_MINOAN:
  ------------------
  |  Branch (379:5): [True: 0, False: 13]
  ------------------
  380|      0|    case HB_SCRIPT_OLD_UYGHUR:
  ------------------
  |  Branch (380:5): [True: 0, False: 13]
  ------------------
  381|      0|    case HB_SCRIPT_TANGSA:
  ------------------
  |  Branch (381:5): [True: 0, False: 13]
  ------------------
  382|      0|    case HB_SCRIPT_TOTO:
  ------------------
  |  Branch (382:5): [True: 0, False: 13]
  ------------------
  383|      0|    case HB_SCRIPT_VITHKUQI:
  ------------------
  |  Branch (383:5): [True: 0, False: 13]
  ------------------
  384|       |
  385|       |    /* Unicode-15.0 additions */
  386|      0|    case HB_SCRIPT_KAWI:
  ------------------
  |  Branch (386:5): [True: 0, False: 13]
  ------------------
  387|      0|    case HB_SCRIPT_NAG_MUNDARI:
  ------------------
  |  Branch (387:5): [True: 0, False: 13]
  ------------------
  388|       |
  389|       |      /* If the designer designed the font for the 'DFLT' script,
  390|       |       * (or we ended up arbitrarily pick 'latn'), use the default shaper.
  391|       |       * Otherwise, use the specific shaper.
  392|       |       * Note that for some simple scripts, there may not be *any*
  393|       |       * GSUB/GPOS needed, so there may be no scripts found! */
  394|      0|      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (394:11): [True: 0, False: 0]
  ------------------
  395|      0|	  planner->map.chosen_script[0] == HB_TAG ('l','a','t','n'))
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (395:4): [True: 0, False: 0]
  ------------------
  396|      0|	return &_hb_ot_shaper_default;
  397|      0|      else
  398|      0|	return &_hb_ot_shaper_use;
  399|     13|  }
  400|     13|}

hb-ot-tag.cc:_ZL32hb_ot_tags_from_complex_languagePKcS0_PjS1_:
 1649|     13|{
 1650|     13|  if (limit - lang_str >= 7)
  ------------------
  |  Branch (1650:7): [True: 0, False: 13]
  ------------------
 1651|      0|  {
 1652|      0|    const char *p = strchr (lang_str, '-');
 1653|      0|    if (!p || p >= limit || limit - p < 5) goto out;
  ------------------
  |  Branch (1653:9): [True: 0, False: 0]
  |  Branch (1653:15): [True: 0, False: 0]
  |  Branch (1653:29): [True: 0, False: 0]
  ------------------
 1654|      0|    if (subtag_matches (p, limit, "-fonnapa", 8))
  ------------------
  |  Branch (1654:9): [True: 0, False: 0]
  ------------------
 1655|      0|    {
 1656|       |      /* Undetermined; North American Phonetic Alphabet */
 1657|      0|      tags[0] = HB_TAG('A','P','P','H');  /* Phonetic transcription—Americanist conventions */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1658|      0|      *count = 1;
 1659|      0|      return true;
 1660|      0|    }
 1661|      0|    if (subtag_matches (p, limit, "-polyton", 8))
  ------------------
  |  Branch (1661:9): [True: 0, False: 0]
  ------------------
 1662|      0|    {
 1663|       |      /* Modern Greek (1453-); Polytonic Greek */
 1664|      0|      tags[0] = HB_TAG('P','G','R',' ');  /* Polytonic Greek */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1665|      0|      *count = 1;
 1666|      0|      return true;
 1667|      0|    }
 1668|      0|    if (subtag_matches (p, limit, "-arevmda", 8))
  ------------------
  |  Branch (1668:9): [True: 0, False: 0]
  ------------------
 1669|      0|    {
 1670|       |      /* Armenian; Western Armenian (retired code) */
 1671|      0|      tags[0] = HB_TAG('H','Y','E',' ');  /* Armenian */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1672|      0|      *count = 1;
 1673|      0|      return true;
 1674|      0|    }
 1675|      0|    if (subtag_matches (p, limit, "-provenc", 8))
  ------------------
  |  Branch (1675:9): [True: 0, False: 0]
  ------------------
 1676|      0|    {
 1677|       |      /* Occitan (post 1500); Provençal */
 1678|      0|      tags[0] = HB_TAG('P','R','O',' ');  /* Provençal / Old Provençal */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1679|      0|      *count = 1;
 1680|      0|      return true;
 1681|      0|    }
 1682|      0|    if (subtag_matches (p, limit, "-fonipa", 7))
  ------------------
  |  Branch (1682:9): [True: 0, False: 0]
  ------------------
 1683|      0|    {
 1684|       |      /* Undetermined; International Phonetic Alphabet */
 1685|      0|      tags[0] = HB_TAG('I','P','P','H');  /* Phonetic transcription—IPA conventions */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1686|      0|      *count = 1;
 1687|      0|      return true;
 1688|      0|    }
 1689|      0|    if (subtag_matches (p, limit, "-geok", 5))
  ------------------
  |  Branch (1689:9): [True: 0, False: 0]
  ------------------
 1690|      0|    {
 1691|       |      /* Undetermined; Khutsuri (Asomtavruli and Nuskhuri) */
 1692|      0|      tags[0] = HB_TAG('K','G','E',' ');  /* Khutsuri Georgian */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1693|      0|      *count = 1;
 1694|      0|      return true;
 1695|      0|    }
 1696|      0|    if (subtag_matches (p, limit, "-syre", 5))
  ------------------
  |  Branch (1696:9): [True: 0, False: 0]
  ------------------
 1697|      0|    {
 1698|       |      /* Undetermined; Syriac (Estrangelo variant) */
 1699|      0|      tags[0] = HB_TAG('S','Y','R','E');  /* Syriac, Estrangela script-variant (equivalent to ISO 15924 'Syre') */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1700|      0|      *count = 1;
 1701|      0|      return true;
 1702|      0|    }
 1703|      0|    if (subtag_matches (p, limit, "-syrj", 5))
  ------------------
  |  Branch (1703:9): [True: 0, False: 0]
  ------------------
 1704|      0|    {
 1705|       |      /* Undetermined; Syriac (Western variant) */
 1706|      0|      tags[0] = HB_TAG('S','Y','R','J');  /* Syriac, Western script-variant (equivalent to ISO 15924 'Syrj') */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1707|      0|      *count = 1;
 1708|      0|      return true;
 1709|      0|    }
 1710|      0|    if (subtag_matches (p, limit, "-syrn", 5))
  ------------------
  |  Branch (1710:9): [True: 0, False: 0]
  ------------------
 1711|      0|    {
 1712|       |      /* Undetermined; Syriac (Eastern variant) */
 1713|      0|      tags[0] = HB_TAG('S','Y','R','N');  /* Syriac, Eastern script-variant (equivalent to ISO 15924 'Syrn') */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1714|      0|      *count = 1;
 1715|      0|      return true;
 1716|      0|    }
 1717|      0|  }
 1718|     13|out:
 1719|     13|  switch (lang_str[0])
  ------------------
  |  Branch (1719:11): [True: 11, False: 2]
  ------------------
 1720|     13|  {
 1721|      0|  case 'a':
  ------------------
  |  Branch (1721:3): [True: 0, False: 13]
  ------------------
 1722|      0|    if (0 == strcmp (&lang_str[1], "rt-lojban"))
  ------------------
  |  Branch (1722:9): [True: 0, False: 0]
  ------------------
 1723|      0|    {
 1724|       |      /* Lojban (retired code) */
 1725|      0|      tags[0] = HB_TAG('J','B','O',' ');  /* Lojban */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1726|      0|      *count = 1;
 1727|      0|      return true;
 1728|      0|    }
 1729|      0|    break;
 1730|      2|  case 'c':
  ------------------
  |  Branch (1730:3): [True: 2, False: 11]
  ------------------
 1731|      2|    if (lang_matches (&lang_str[1], limit, "do-hant-hk", 10))
  ------------------
  |  Branch (1731:9): [True: 0, False: 2]
  ------------------
 1732|      0|    {
 1733|       |      /* Min Dong Chinese; Han (Traditional variant); Hong Kong */
 1734|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1735|      0|      *count = 1;
 1736|      0|      return true;
 1737|      0|    }
 1738|      2|    if (lang_matches (&lang_str[1], limit, "do-hant-mo", 10))
  ------------------
  |  Branch (1738:9): [True: 0, False: 2]
  ------------------
 1739|      0|    {
 1740|       |      /* Min Dong Chinese; Han (Traditional variant); Macao */
 1741|      0|      unsigned int i;
 1742|      0|      hb_tag_t possible_tags[] = {
 1743|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1744|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1745|      0|      };
 1746|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (1746:19): [True: 0, False: 0]
  |  Branch (1746:28): [True: 0, False: 0]
  ------------------
 1747|      0|	tags[i] = possible_tags[i];
 1748|      0|      *count = i;
 1749|      0|      return true;
 1750|      0|    }
 1751|      2|    if (lang_matches (&lang_str[1], limit, "jy-hant-hk", 10))
  ------------------
  |  Branch (1751:9): [True: 0, False: 2]
  ------------------
 1752|      0|    {
 1753|       |      /* Jinyu Chinese; Han (Traditional variant); Hong Kong */
 1754|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1755|      0|      *count = 1;
 1756|      0|      return true;
 1757|      0|    }
 1758|      2|    if (lang_matches (&lang_str[1], limit, "jy-hant-mo", 10))
  ------------------
  |  Branch (1758:9): [True: 0, False: 2]
  ------------------
 1759|      0|    {
 1760|       |      /* Jinyu Chinese; Han (Traditional variant); Macao */
 1761|      0|      unsigned int i;
 1762|      0|      hb_tag_t possible_tags[] = {
 1763|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1764|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1765|      0|      };
 1766|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (1766:19): [True: 0, False: 0]
  |  Branch (1766:28): [True: 0, False: 0]
  ------------------
 1767|      0|	tags[i] = possible_tags[i];
 1768|      0|      *count = i;
 1769|      0|      return true;
 1770|      0|    }
 1771|      2|    if (lang_matches (&lang_str[1], limit, "mn-hant-hk", 10))
  ------------------
  |  Branch (1771:9): [True: 0, False: 2]
  ------------------
 1772|      0|    {
 1773|       |      /* Mandarin Chinese; Han (Traditional variant); Hong Kong */
 1774|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1775|      0|      *count = 1;
 1776|      0|      return true;
 1777|      0|    }
 1778|      2|    if (lang_matches (&lang_str[1], limit, "mn-hant-mo", 10))
  ------------------
  |  Branch (1778:9): [True: 0, False: 2]
  ------------------
 1779|      0|    {
 1780|       |      /* Mandarin Chinese; Han (Traditional variant); Macao */
 1781|      0|      unsigned int i;
 1782|      0|      hb_tag_t possible_tags[] = {
 1783|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1784|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1785|      0|      };
 1786|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (1786:19): [True: 0, False: 0]
  |  Branch (1786:28): [True: 0, False: 0]
  ------------------
 1787|      0|	tags[i] = possible_tags[i];
 1788|      0|      *count = i;
 1789|      0|      return true;
 1790|      0|    }
 1791|      2|    if (lang_matches (&lang_str[1], limit, "np-hant-hk", 10))
  ------------------
  |  Branch (1791:9): [True: 0, False: 2]
  ------------------
 1792|      0|    {
 1793|       |      /* Northern Ping Chinese; Han (Traditional variant); Hong Kong */
 1794|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1795|      0|      *count = 1;
 1796|      0|      return true;
 1797|      0|    }
 1798|      2|    if (lang_matches (&lang_str[1], limit, "np-hant-mo", 10))
  ------------------
  |  Branch (1798:9): [True: 0, False: 2]
  ------------------
 1799|      0|    {
 1800|       |      /* Northern Ping Chinese; Han (Traditional variant); Macao */
 1801|      0|      unsigned int i;
 1802|      0|      hb_tag_t possible_tags[] = {
 1803|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1804|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1805|      0|      };
 1806|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (1806:19): [True: 0, False: 0]
  |  Branch (1806:28): [True: 0, False: 0]
  ------------------
 1807|      0|	tags[i] = possible_tags[i];
 1808|      0|      *count = i;
 1809|      0|      return true;
 1810|      0|    }
 1811|      2|    if (lang_matches (&lang_str[1], limit, "px-hant-hk", 10))
  ------------------
  |  Branch (1811:9): [True: 0, False: 2]
  ------------------
 1812|      0|    {
 1813|       |      /* Pu-Xian Chinese; Han (Traditional variant); Hong Kong */
 1814|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1815|      0|      *count = 1;
 1816|      0|      return true;
 1817|      0|    }
 1818|      2|    if (lang_matches (&lang_str[1], limit, "px-hant-mo", 10))
  ------------------
  |  Branch (1818:9): [True: 0, False: 2]
  ------------------
 1819|      0|    {
 1820|       |      /* Pu-Xian Chinese; Han (Traditional variant); Macao */
 1821|      0|      unsigned int i;
 1822|      0|      hb_tag_t possible_tags[] = {
 1823|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1824|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1825|      0|      };
 1826|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (1826:19): [True: 0, False: 0]
  |  Branch (1826:28): [True: 0, False: 0]
  ------------------
 1827|      0|	tags[i] = possible_tags[i];
 1828|      0|      *count = i;
 1829|      0|      return true;
 1830|      0|    }
 1831|      2|    if (lang_matches (&lang_str[1], limit, "sp-hant-hk", 10))
  ------------------
  |  Branch (1831:9): [True: 0, False: 2]
  ------------------
 1832|      0|    {
 1833|       |      /* Southern Ping Chinese; Han (Traditional variant); Hong Kong */
 1834|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1835|      0|      *count = 1;
 1836|      0|      return true;
 1837|      0|    }
 1838|      2|    if (lang_matches (&lang_str[1], limit, "sp-hant-mo", 10))
  ------------------
  |  Branch (1838:9): [True: 0, False: 2]
  ------------------
 1839|      0|    {
 1840|       |      /* Southern Ping Chinese; Han (Traditional variant); Macao */
 1841|      0|      unsigned int i;
 1842|      0|      hb_tag_t possible_tags[] = {
 1843|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1844|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1845|      0|      };
 1846|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (1846:19): [True: 0, False: 0]
  |  Branch (1846:28): [True: 0, False: 0]
  ------------------
 1847|      0|	tags[i] = possible_tags[i];
 1848|      0|      *count = i;
 1849|      0|      return true;
 1850|      0|    }
 1851|      2|    if (lang_matches (&lang_str[1], limit, "zh-hant-hk", 10))
  ------------------
  |  Branch (1851:9): [True: 0, False: 2]
  ------------------
 1852|      0|    {
 1853|       |      /* Huizhou Chinese; Han (Traditional variant); Hong Kong */
 1854|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1855|      0|      *count = 1;
 1856|      0|      return true;
 1857|      0|    }
 1858|      2|    if (lang_matches (&lang_str[1], limit, "zh-hant-mo", 10))
  ------------------
  |  Branch (1858:9): [True: 0, False: 2]
  ------------------
 1859|      0|    {
 1860|       |      /* Huizhou Chinese; Han (Traditional variant); Macao */
 1861|      0|      unsigned int i;
 1862|      0|      hb_tag_t possible_tags[] = {
 1863|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1864|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1865|      0|      };
 1866|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (1866:19): [True: 0, False: 0]
  |  Branch (1866:28): [True: 0, False: 0]
  ------------------
 1867|      0|	tags[i] = possible_tags[i];
 1868|      0|      *count = i;
 1869|      0|      return true;
 1870|      0|    }
 1871|      2|    if (lang_matches (&lang_str[1], limit, "zo-hant-hk", 10))
  ------------------
  |  Branch (1871:9): [True: 0, False: 2]
  ------------------
 1872|      0|    {
 1873|       |      /* Min Zhong Chinese; Han (Traditional variant); Hong Kong */
 1874|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1875|      0|      *count = 1;
 1876|      0|      return true;
 1877|      0|    }
 1878|      2|    if (lang_matches (&lang_str[1], limit, "zo-hant-mo", 10))
  ------------------
  |  Branch (1878:9): [True: 0, False: 2]
  ------------------
 1879|      0|    {
 1880|       |      /* Min Zhong Chinese; Han (Traditional variant); Macao */
 1881|      0|      unsigned int i;
 1882|      0|      hb_tag_t possible_tags[] = {
 1883|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1884|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1885|      0|      };
 1886|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (1886:19): [True: 0, False: 0]
  |  Branch (1886:28): [True: 0, False: 0]
  ------------------
 1887|      0|	tags[i] = possible_tags[i];
 1888|      0|      *count = i;
 1889|      0|      return true;
 1890|      0|    }
 1891|      2|    if (lang_matches (&lang_str[1], limit, "do-hans", 7))
  ------------------
  |  Branch (1891:9): [True: 0, False: 2]
  ------------------
 1892|      0|    {
 1893|       |      /* Min Dong Chinese; Han (Simplified variant) */
 1894|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1895|      0|      *count = 1;
 1896|      0|      return true;
 1897|      0|    }
 1898|      2|    if (lang_matches (&lang_str[1], limit, "do-hant", 7))
  ------------------
  |  Branch (1898:9): [True: 0, False: 2]
  ------------------
 1899|      0|    {
 1900|       |      /* Min Dong Chinese; Han (Traditional variant) */
 1901|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1902|      0|      *count = 1;
 1903|      0|      return true;
 1904|      0|    }
 1905|      2|    if (lang_matches (&lang_str[1], limit, "jy-hans", 7))
  ------------------
  |  Branch (1905:9): [True: 0, False: 2]
  ------------------
 1906|      0|    {
 1907|       |      /* Jinyu Chinese; Han (Simplified variant) */
 1908|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1909|      0|      *count = 1;
 1910|      0|      return true;
 1911|      0|    }
 1912|      2|    if (lang_matches (&lang_str[1], limit, "jy-hant", 7))
  ------------------
  |  Branch (1912:9): [True: 0, False: 2]
  ------------------
 1913|      0|    {
 1914|       |      /* Jinyu Chinese; Han (Traditional variant) */
 1915|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1916|      0|      *count = 1;
 1917|      0|      return true;
 1918|      0|    }
 1919|      2|    if (lang_matches (&lang_str[1], limit, "mn-hans", 7))
  ------------------
  |  Branch (1919:9): [True: 0, False: 2]
  ------------------
 1920|      0|    {
 1921|       |      /* Mandarin Chinese; Han (Simplified variant) */
 1922|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1923|      0|      *count = 1;
 1924|      0|      return true;
 1925|      0|    }
 1926|      2|    if (lang_matches (&lang_str[1], limit, "mn-hant", 7))
  ------------------
  |  Branch (1926:9): [True: 0, False: 2]
  ------------------
 1927|      0|    {
 1928|       |      /* Mandarin Chinese; Han (Traditional variant) */
 1929|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1930|      0|      *count = 1;
 1931|      0|      return true;
 1932|      0|    }
 1933|      2|    if (lang_matches (&lang_str[1], limit, "np-hans", 7))
  ------------------
  |  Branch (1933:9): [True: 0, False: 2]
  ------------------
 1934|      0|    {
 1935|       |      /* Northern Ping Chinese; Han (Simplified variant) */
 1936|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1937|      0|      *count = 1;
 1938|      0|      return true;
 1939|      0|    }
 1940|      2|    if (lang_matches (&lang_str[1], limit, "np-hant", 7))
  ------------------
  |  Branch (1940:9): [True: 0, False: 2]
  ------------------
 1941|      0|    {
 1942|       |      /* Northern Ping Chinese; Han (Traditional variant) */
 1943|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1944|      0|      *count = 1;
 1945|      0|      return true;
 1946|      0|    }
 1947|      2|    if (lang_matches (&lang_str[1], limit, "px-hans", 7))
  ------------------
  |  Branch (1947:9): [True: 0, False: 2]
  ------------------
 1948|      0|    {
 1949|       |      /* Pu-Xian Chinese; Han (Simplified variant) */
 1950|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1951|      0|      *count = 1;
 1952|      0|      return true;
 1953|      0|    }
 1954|      2|    if (lang_matches (&lang_str[1], limit, "px-hant", 7))
  ------------------
  |  Branch (1954:9): [True: 0, False: 2]
  ------------------
 1955|      0|    {
 1956|       |      /* Pu-Xian Chinese; Han (Traditional variant) */
 1957|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1958|      0|      *count = 1;
 1959|      0|      return true;
 1960|      0|    }
 1961|      2|    if (lang_matches (&lang_str[1], limit, "sp-hans", 7))
  ------------------
  |  Branch (1961:9): [True: 0, False: 2]
  ------------------
 1962|      0|    {
 1963|       |      /* Southern Ping Chinese; Han (Simplified variant) */
 1964|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1965|      0|      *count = 1;
 1966|      0|      return true;
 1967|      0|    }
 1968|      2|    if (lang_matches (&lang_str[1], limit, "sp-hant", 7))
  ------------------
  |  Branch (1968:9): [True: 0, False: 2]
  ------------------
 1969|      0|    {
 1970|       |      /* Southern Ping Chinese; Han (Traditional variant) */
 1971|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1972|      0|      *count = 1;
 1973|      0|      return true;
 1974|      0|    }
 1975|      2|    if (lang_matches (&lang_str[1], limit, "zh-hans", 7))
  ------------------
  |  Branch (1975:9): [True: 0, False: 2]
  ------------------
 1976|      0|    {
 1977|       |      /* Huizhou Chinese; Han (Simplified variant) */
 1978|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1979|      0|      *count = 1;
 1980|      0|      return true;
 1981|      0|    }
 1982|      2|    if (lang_matches (&lang_str[1], limit, "zh-hant", 7))
  ------------------
  |  Branch (1982:9): [True: 0, False: 2]
  ------------------
 1983|      0|    {
 1984|       |      /* Huizhou Chinese; Han (Traditional variant) */
 1985|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1986|      0|      *count = 1;
 1987|      0|      return true;
 1988|      0|    }
 1989|      2|    if (lang_matches (&lang_str[1], limit, "zo-hans", 7))
  ------------------
  |  Branch (1989:9): [True: 0, False: 2]
  ------------------
 1990|      0|    {
 1991|       |      /* Min Zhong Chinese; Han (Simplified variant) */
 1992|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 1993|      0|      *count = 1;
 1994|      0|      return true;
 1995|      0|    }
 1996|      2|    if (lang_matches (&lang_str[1], limit, "zo-hant", 7))
  ------------------
  |  Branch (1996:9): [True: 0, False: 2]
  ------------------
 1997|      0|    {
 1998|       |      /* Min Zhong Chinese; Han (Traditional variant) */
 1999|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2000|      0|      *count = 1;
 2001|      0|      return true;
 2002|      0|    }
 2003|      2|    if (0 == strncmp (&lang_str[1], "do-", 3)
  ------------------
  |  Branch (2003:9): [True: 0, False: 2]
  ------------------
 2004|      2|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2004:5): [True: 0, False: 0]
  ------------------
 2005|      0|    {
 2006|       |      /* Min Dong Chinese; Hong Kong */
 2007|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2008|      0|      *count = 1;
 2009|      0|      return true;
 2010|      0|    }
 2011|      2|    if (0 == strncmp (&lang_str[1], "do-", 3)
  ------------------
  |  Branch (2011:9): [True: 0, False: 2]
  ------------------
 2012|      2|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2012:5): [True: 0, False: 0]
  ------------------
 2013|      0|    {
 2014|       |      /* Min Dong Chinese; Macao */
 2015|      0|      unsigned int i;
 2016|      0|      hb_tag_t possible_tags[] = {
 2017|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2018|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2019|      0|      };
 2020|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2020:19): [True: 0, False: 0]
  |  Branch (2020:28): [True: 0, False: 0]
  ------------------
 2021|      0|	tags[i] = possible_tags[i];
 2022|      0|      *count = i;
 2023|      0|      return true;
 2024|      0|    }
 2025|      2|    if (0 == strncmp (&lang_str[1], "do-", 3)
  ------------------
  |  Branch (2025:9): [True: 0, False: 2]
  ------------------
 2026|      2|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2026:5): [True: 0, False: 0]
  ------------------
 2027|      0|    {
 2028|       |      /* Min Dong Chinese; Taiwan, Province of China */
 2029|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2030|      0|      *count = 1;
 2031|      0|      return true;
 2032|      0|    }
 2033|      2|    if (0 == strncmp (&lang_str[1], "jy-", 3)
  ------------------
  |  Branch (2033:9): [True: 0, False: 2]
  ------------------
 2034|      2|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2034:5): [True: 0, False: 0]
  ------------------
 2035|      0|    {
 2036|       |      /* Jinyu Chinese; Hong Kong */
 2037|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2038|      0|      *count = 1;
 2039|      0|      return true;
 2040|      0|    }
 2041|      2|    if (0 == strncmp (&lang_str[1], "jy-", 3)
  ------------------
  |  Branch (2041:9): [True: 0, False: 2]
  ------------------
 2042|      2|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2042:5): [True: 0, False: 0]
  ------------------
 2043|      0|    {
 2044|       |      /* Jinyu Chinese; Macao */
 2045|      0|      unsigned int i;
 2046|      0|      hb_tag_t possible_tags[] = {
 2047|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2048|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2049|      0|      };
 2050|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2050:19): [True: 0, False: 0]
  |  Branch (2050:28): [True: 0, False: 0]
  ------------------
 2051|      0|	tags[i] = possible_tags[i];
 2052|      0|      *count = i;
 2053|      0|      return true;
 2054|      0|    }
 2055|      2|    if (0 == strncmp (&lang_str[1], "jy-", 3)
  ------------------
  |  Branch (2055:9): [True: 0, False: 2]
  ------------------
 2056|      2|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2056:5): [True: 0, False: 0]
  ------------------
 2057|      0|    {
 2058|       |      /* Jinyu Chinese; Taiwan, Province of China */
 2059|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2060|      0|      *count = 1;
 2061|      0|      return true;
 2062|      0|    }
 2063|      2|    if (0 == strncmp (&lang_str[1], "mn-", 3)
  ------------------
  |  Branch (2063:9): [True: 0, False: 2]
  ------------------
 2064|      2|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2064:5): [True: 0, False: 0]
  ------------------
 2065|      0|    {
 2066|       |      /* Mandarin Chinese; Hong Kong */
 2067|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2068|      0|      *count = 1;
 2069|      0|      return true;
 2070|      0|    }
 2071|      2|    if (0 == strncmp (&lang_str[1], "mn-", 3)
  ------------------
  |  Branch (2071:9): [True: 0, False: 2]
  ------------------
 2072|      2|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2072:5): [True: 0, False: 0]
  ------------------
 2073|      0|    {
 2074|       |      /* Mandarin Chinese; Macao */
 2075|      0|      unsigned int i;
 2076|      0|      hb_tag_t possible_tags[] = {
 2077|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2078|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2079|      0|      };
 2080|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2080:19): [True: 0, False: 0]
  |  Branch (2080:28): [True: 0, False: 0]
  ------------------
 2081|      0|	tags[i] = possible_tags[i];
 2082|      0|      *count = i;
 2083|      0|      return true;
 2084|      0|    }
 2085|      2|    if (0 == strncmp (&lang_str[1], "mn-", 3)
  ------------------
  |  Branch (2085:9): [True: 0, False: 2]
  ------------------
 2086|      2|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2086:5): [True: 0, False: 0]
  ------------------
 2087|      0|    {
 2088|       |      /* Mandarin Chinese; Taiwan, Province of China */
 2089|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2090|      0|      *count = 1;
 2091|      0|      return true;
 2092|      0|    }
 2093|      2|    if (0 == strncmp (&lang_str[1], "np-", 3)
  ------------------
  |  Branch (2093:9): [True: 0, False: 2]
  ------------------
 2094|      2|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2094:5): [True: 0, False: 0]
  ------------------
 2095|      0|    {
 2096|       |      /* Northern Ping Chinese; Hong Kong */
 2097|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2098|      0|      *count = 1;
 2099|      0|      return true;
 2100|      0|    }
 2101|      2|    if (0 == strncmp (&lang_str[1], "np-", 3)
  ------------------
  |  Branch (2101:9): [True: 0, False: 2]
  ------------------
 2102|      2|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2102:5): [True: 0, False: 0]
  ------------------
 2103|      0|    {
 2104|       |      /* Northern Ping Chinese; Macao */
 2105|      0|      unsigned int i;
 2106|      0|      hb_tag_t possible_tags[] = {
 2107|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2108|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2109|      0|      };
 2110|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2110:19): [True: 0, False: 0]
  |  Branch (2110:28): [True: 0, False: 0]
  ------------------
 2111|      0|	tags[i] = possible_tags[i];
 2112|      0|      *count = i;
 2113|      0|      return true;
 2114|      0|    }
 2115|      2|    if (0 == strncmp (&lang_str[1], "np-", 3)
  ------------------
  |  Branch (2115:9): [True: 0, False: 2]
  ------------------
 2116|      2|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2116:5): [True: 0, False: 0]
  ------------------
 2117|      0|    {
 2118|       |      /* Northern Ping Chinese; Taiwan, Province of China */
 2119|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2120|      0|      *count = 1;
 2121|      0|      return true;
 2122|      0|    }
 2123|      2|    if (0 == strncmp (&lang_str[1], "px-", 3)
  ------------------
  |  Branch (2123:9): [True: 0, False: 2]
  ------------------
 2124|      2|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2124:5): [True: 0, False: 0]
  ------------------
 2125|      0|    {
 2126|       |      /* Pu-Xian Chinese; Hong Kong */
 2127|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2128|      0|      *count = 1;
 2129|      0|      return true;
 2130|      0|    }
 2131|      2|    if (0 == strncmp (&lang_str[1], "px-", 3)
  ------------------
  |  Branch (2131:9): [True: 0, False: 2]
  ------------------
 2132|      2|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2132:5): [True: 0, False: 0]
  ------------------
 2133|      0|    {
 2134|       |      /* Pu-Xian Chinese; Macao */
 2135|      0|      unsigned int i;
 2136|      0|      hb_tag_t possible_tags[] = {
 2137|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2138|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2139|      0|      };
 2140|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2140:19): [True: 0, False: 0]
  |  Branch (2140:28): [True: 0, False: 0]
  ------------------
 2141|      0|	tags[i] = possible_tags[i];
 2142|      0|      *count = i;
 2143|      0|      return true;
 2144|      0|    }
 2145|      2|    if (0 == strncmp (&lang_str[1], "px-", 3)
  ------------------
  |  Branch (2145:9): [True: 0, False: 2]
  ------------------
 2146|      2|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2146:5): [True: 0, False: 0]
  ------------------
 2147|      0|    {
 2148|       |      /* Pu-Xian Chinese; Taiwan, Province of China */
 2149|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2150|      0|      *count = 1;
 2151|      0|      return true;
 2152|      0|    }
 2153|      2|    if (0 == strncmp (&lang_str[1], "sp-", 3)
  ------------------
  |  Branch (2153:9): [True: 0, False: 2]
  ------------------
 2154|      2|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2154:5): [True: 0, False: 0]
  ------------------
 2155|      0|    {
 2156|       |      /* Southern Ping Chinese; Hong Kong */
 2157|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2158|      0|      *count = 1;
 2159|      0|      return true;
 2160|      0|    }
 2161|      2|    if (0 == strncmp (&lang_str[1], "sp-", 3)
  ------------------
  |  Branch (2161:9): [True: 0, False: 2]
  ------------------
 2162|      2|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2162:5): [True: 0, False: 0]
  ------------------
 2163|      0|    {
 2164|       |      /* Southern Ping Chinese; Macao */
 2165|      0|      unsigned int i;
 2166|      0|      hb_tag_t possible_tags[] = {
 2167|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2168|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2169|      0|      };
 2170|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2170:19): [True: 0, False: 0]
  |  Branch (2170:28): [True: 0, False: 0]
  ------------------
 2171|      0|	tags[i] = possible_tags[i];
 2172|      0|      *count = i;
 2173|      0|      return true;
 2174|      0|    }
 2175|      2|    if (0 == strncmp (&lang_str[1], "sp-", 3)
  ------------------
  |  Branch (2175:9): [True: 0, False: 2]
  ------------------
 2176|      2|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2176:5): [True: 0, False: 0]
  ------------------
 2177|      0|    {
 2178|       |      /* Southern Ping Chinese; Taiwan, Province of China */
 2179|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2180|      0|      *count = 1;
 2181|      0|      return true;
 2182|      0|    }
 2183|      2|    if (0 == strncmp (&lang_str[1], "zh-", 3)
  ------------------
  |  Branch (2183:9): [True: 0, False: 2]
  ------------------
 2184|      2|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2184:5): [True: 0, False: 0]
  ------------------
 2185|      0|    {
 2186|       |      /* Huizhou Chinese; Hong Kong */
 2187|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2188|      0|      *count = 1;
 2189|      0|      return true;
 2190|      0|    }
 2191|      2|    if (0 == strncmp (&lang_str[1], "zh-", 3)
  ------------------
  |  Branch (2191:9): [True: 0, False: 2]
  ------------------
 2192|      2|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2192:5): [True: 0, False: 0]
  ------------------
 2193|      0|    {
 2194|       |      /* Huizhou Chinese; Macao */
 2195|      0|      unsigned int i;
 2196|      0|      hb_tag_t possible_tags[] = {
 2197|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2198|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2199|      0|      };
 2200|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2200:19): [True: 0, False: 0]
  |  Branch (2200:28): [True: 0, False: 0]
  ------------------
 2201|      0|	tags[i] = possible_tags[i];
 2202|      0|      *count = i;
 2203|      0|      return true;
 2204|      0|    }
 2205|      2|    if (0 == strncmp (&lang_str[1], "zh-", 3)
  ------------------
  |  Branch (2205:9): [True: 0, False: 2]
  ------------------
 2206|      2|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2206:5): [True: 0, False: 0]
  ------------------
 2207|      0|    {
 2208|       |      /* Huizhou Chinese; Taiwan, Province of China */
 2209|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2210|      0|      *count = 1;
 2211|      0|      return true;
 2212|      0|    }
 2213|      2|    if (0 == strncmp (&lang_str[1], "zo-", 3)
  ------------------
  |  Branch (2213:9): [True: 0, False: 2]
  ------------------
 2214|      2|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2214:5): [True: 0, False: 0]
  ------------------
 2215|      0|    {
 2216|       |      /* Min Zhong Chinese; Hong Kong */
 2217|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2218|      0|      *count = 1;
 2219|      0|      return true;
 2220|      0|    }
 2221|      2|    if (0 == strncmp (&lang_str[1], "zo-", 3)
  ------------------
  |  Branch (2221:9): [True: 0, False: 2]
  ------------------
 2222|      2|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2222:5): [True: 0, False: 0]
  ------------------
 2223|      0|    {
 2224|       |      /* Min Zhong Chinese; Macao */
 2225|      0|      unsigned int i;
 2226|      0|      hb_tag_t possible_tags[] = {
 2227|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2228|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2229|      0|      };
 2230|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2230:19): [True: 0, False: 0]
  |  Branch (2230:28): [True: 0, False: 0]
  ------------------
 2231|      0|	tags[i] = possible_tags[i];
 2232|      0|      *count = i;
 2233|      0|      return true;
 2234|      0|    }
 2235|      2|    if (0 == strncmp (&lang_str[1], "zo-", 3)
  ------------------
  |  Branch (2235:9): [True: 0, False: 2]
  ------------------
 2236|      2|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2236:5): [True: 0, False: 0]
  ------------------
 2237|      0|    {
 2238|       |      /* Min Zhong Chinese; Taiwan, Province of China */
 2239|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2240|      0|      *count = 1;
 2241|      0|      return true;
 2242|      0|    }
 2243|      2|    break;
 2244|      2|  case 'g':
  ------------------
  |  Branch (2244:3): [True: 0, False: 13]
  ------------------
 2245|      0|    if (lang_matches (&lang_str[1], limit, "an-hant-hk", 10))
  ------------------
  |  Branch (2245:9): [True: 0, False: 0]
  ------------------
 2246|      0|    {
 2247|       |      /* Gan Chinese; Han (Traditional variant); Hong Kong */
 2248|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2249|      0|      *count = 1;
 2250|      0|      return true;
 2251|      0|    }
 2252|      0|    if (lang_matches (&lang_str[1], limit, "an-hant-mo", 10))
  ------------------
  |  Branch (2252:9): [True: 0, False: 0]
  ------------------
 2253|      0|    {
 2254|       |      /* Gan Chinese; Han (Traditional variant); Macao */
 2255|      0|      unsigned int i;
 2256|      0|      hb_tag_t possible_tags[] = {
 2257|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2258|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2259|      0|      };
 2260|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2260:19): [True: 0, False: 0]
  |  Branch (2260:28): [True: 0, False: 0]
  ------------------
 2261|      0|	tags[i] = possible_tags[i];
 2262|      0|      *count = i;
 2263|      0|      return true;
 2264|      0|    }
 2265|      0|    if (lang_matches (&lang_str[1], limit, "an-hans", 7))
  ------------------
  |  Branch (2265:9): [True: 0, False: 0]
  ------------------
 2266|      0|    {
 2267|       |      /* Gan Chinese; Han (Simplified variant) */
 2268|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2269|      0|      *count = 1;
 2270|      0|      return true;
 2271|      0|    }
 2272|      0|    if (lang_matches (&lang_str[1], limit, "an-hant", 7))
  ------------------
  |  Branch (2272:9): [True: 0, False: 0]
  ------------------
 2273|      0|    {
 2274|       |      /* Gan Chinese; Han (Traditional variant) */
 2275|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2276|      0|      *count = 1;
 2277|      0|      return true;
 2278|      0|    }
 2279|      0|    if (lang_matches (&lang_str[1], limit, "a-latg", 6))
  ------------------
  |  Branch (2279:9): [True: 0, False: 0]
  ------------------
 2280|      0|    {
 2281|       |      /* Irish; Latin (Gaelic variant) */
 2282|      0|      tags[0] = HB_TAG('I','R','T',' ');  /* Irish Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2283|      0|      *count = 1;
 2284|      0|      return true;
 2285|      0|    }
 2286|      0|    if (0 == strncmp (&lang_str[1], "an-", 3)
  ------------------
  |  Branch (2286:9): [True: 0, False: 0]
  ------------------
 2287|      0|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2287:5): [True: 0, False: 0]
  ------------------
 2288|      0|    {
 2289|       |      /* Gan Chinese; Hong Kong */
 2290|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2291|      0|      *count = 1;
 2292|      0|      return true;
 2293|      0|    }
 2294|      0|    if (0 == strncmp (&lang_str[1], "an-", 3)
  ------------------
  |  Branch (2294:9): [True: 0, False: 0]
  ------------------
 2295|      0|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2295:5): [True: 0, False: 0]
  ------------------
 2296|      0|    {
 2297|       |      /* Gan Chinese; Macao */
 2298|      0|      unsigned int i;
 2299|      0|      hb_tag_t possible_tags[] = {
 2300|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2301|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2302|      0|      };
 2303|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2303:19): [True: 0, False: 0]
  |  Branch (2303:28): [True: 0, False: 0]
  ------------------
 2304|      0|	tags[i] = possible_tags[i];
 2305|      0|      *count = i;
 2306|      0|      return true;
 2307|      0|    }
 2308|      0|    if (0 == strncmp (&lang_str[1], "an-", 3)
  ------------------
  |  Branch (2308:9): [True: 0, False: 0]
  ------------------
 2309|      0|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2309:5): [True: 0, False: 0]
  ------------------
 2310|      0|    {
 2311|       |      /* Gan Chinese; Taiwan, Province of China */
 2312|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2313|      0|      *count = 1;
 2314|      0|      return true;
 2315|      0|    }
 2316|      0|    break;
 2317|      0|  case 'h':
  ------------------
  |  Branch (2317:3): [True: 0, False: 13]
  ------------------
 2318|      0|    if (lang_matches (&lang_str[1], limit, "ak-hant-hk", 10))
  ------------------
  |  Branch (2318:9): [True: 0, False: 0]
  ------------------
 2319|      0|    {
 2320|       |      /* Hakka Chinese; Han (Traditional variant); Hong Kong */
 2321|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2322|      0|      *count = 1;
 2323|      0|      return true;
 2324|      0|    }
 2325|      0|    if (lang_matches (&lang_str[1], limit, "ak-hant-mo", 10))
  ------------------
  |  Branch (2325:9): [True: 0, False: 0]
  ------------------
 2326|      0|    {
 2327|       |      /* Hakka Chinese; Han (Traditional variant); Macao */
 2328|      0|      unsigned int i;
 2329|      0|      hb_tag_t possible_tags[] = {
 2330|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2331|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2332|      0|      };
 2333|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2333:19): [True: 0, False: 0]
  |  Branch (2333:28): [True: 0, False: 0]
  ------------------
 2334|      0|	tags[i] = possible_tags[i];
 2335|      0|      *count = i;
 2336|      0|      return true;
 2337|      0|    }
 2338|      0|    if (lang_matches (&lang_str[1], limit, "sn-hant-hk", 10))
  ------------------
  |  Branch (2338:9): [True: 0, False: 0]
  ------------------
 2339|      0|    {
 2340|       |      /* Xiang Chinese; Han (Traditional variant); Hong Kong */
 2341|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2342|      0|      *count = 1;
 2343|      0|      return true;
 2344|      0|    }
 2345|      0|    if (lang_matches (&lang_str[1], limit, "sn-hant-mo", 10))
  ------------------
  |  Branch (2345:9): [True: 0, False: 0]
  ------------------
 2346|      0|    {
 2347|       |      /* Xiang Chinese; Han (Traditional variant); Macao */
 2348|      0|      unsigned int i;
 2349|      0|      hb_tag_t possible_tags[] = {
 2350|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2351|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2352|      0|      };
 2353|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2353:19): [True: 0, False: 0]
  |  Branch (2353:28): [True: 0, False: 0]
  ------------------
 2354|      0|	tags[i] = possible_tags[i];
 2355|      0|      *count = i;
 2356|      0|      return true;
 2357|      0|    }
 2358|      0|    if (lang_matches (&lang_str[1], limit, "ak-hans", 7))
  ------------------
  |  Branch (2358:9): [True: 0, False: 0]
  ------------------
 2359|      0|    {
 2360|       |      /* Hakka Chinese; Han (Simplified variant) */
 2361|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2362|      0|      *count = 1;
 2363|      0|      return true;
 2364|      0|    }
 2365|      0|    if (lang_matches (&lang_str[1], limit, "ak-hant", 7))
  ------------------
  |  Branch (2365:9): [True: 0, False: 0]
  ------------------
 2366|      0|    {
 2367|       |      /* Hakka Chinese; Han (Traditional variant) */
 2368|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2369|      0|      *count = 1;
 2370|      0|      return true;
 2371|      0|    }
 2372|      0|    if (lang_matches (&lang_str[1], limit, "sn-hans", 7))
  ------------------
  |  Branch (2372:9): [True: 0, False: 0]
  ------------------
 2373|      0|    {
 2374|       |      /* Xiang Chinese; Han (Simplified variant) */
 2375|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2376|      0|      *count = 1;
 2377|      0|      return true;
 2378|      0|    }
 2379|      0|    if (lang_matches (&lang_str[1], limit, "sn-hant", 7))
  ------------------
  |  Branch (2379:9): [True: 0, False: 0]
  ------------------
 2380|      0|    {
 2381|       |      /* Xiang Chinese; Han (Traditional variant) */
 2382|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2383|      0|      *count = 1;
 2384|      0|      return true;
 2385|      0|    }
 2386|      0|    if (0 == strncmp (&lang_str[1], "ak-", 3)
  ------------------
  |  Branch (2386:9): [True: 0, False: 0]
  ------------------
 2387|      0|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2387:5): [True: 0, False: 0]
  ------------------
 2388|      0|    {
 2389|       |      /* Hakka Chinese; Hong Kong */
 2390|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2391|      0|      *count = 1;
 2392|      0|      return true;
 2393|      0|    }
 2394|      0|    if (0 == strncmp (&lang_str[1], "ak-", 3)
  ------------------
  |  Branch (2394:9): [True: 0, False: 0]
  ------------------
 2395|      0|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2395:5): [True: 0, False: 0]
  ------------------
 2396|      0|    {
 2397|       |      /* Hakka Chinese; Macao */
 2398|      0|      unsigned int i;
 2399|      0|      hb_tag_t possible_tags[] = {
 2400|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2401|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2402|      0|      };
 2403|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2403:19): [True: 0, False: 0]
  |  Branch (2403:28): [True: 0, False: 0]
  ------------------
 2404|      0|	tags[i] = possible_tags[i];
 2405|      0|      *count = i;
 2406|      0|      return true;
 2407|      0|    }
 2408|      0|    if (0 == strncmp (&lang_str[1], "ak-", 3)
  ------------------
  |  Branch (2408:9): [True: 0, False: 0]
  ------------------
 2409|      0|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2409:5): [True: 0, False: 0]
  ------------------
 2410|      0|    {
 2411|       |      /* Hakka Chinese; Taiwan, Province of China */
 2412|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2413|      0|      *count = 1;
 2414|      0|      return true;
 2415|      0|    }
 2416|      0|    if (0 == strncmp (&lang_str[1], "sn-", 3)
  ------------------
  |  Branch (2416:9): [True: 0, False: 0]
  ------------------
 2417|      0|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2417:5): [True: 0, False: 0]
  ------------------
 2418|      0|    {
 2419|       |      /* Xiang Chinese; Hong Kong */
 2420|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2421|      0|      *count = 1;
 2422|      0|      return true;
 2423|      0|    }
 2424|      0|    if (0 == strncmp (&lang_str[1], "sn-", 3)
  ------------------
  |  Branch (2424:9): [True: 0, False: 0]
  ------------------
 2425|      0|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2425:5): [True: 0, False: 0]
  ------------------
 2426|      0|    {
 2427|       |      /* Xiang Chinese; Macao */
 2428|      0|      unsigned int i;
 2429|      0|      hb_tag_t possible_tags[] = {
 2430|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2431|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2432|      0|      };
 2433|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2433:19): [True: 0, False: 0]
  |  Branch (2433:28): [True: 0, False: 0]
  ------------------
 2434|      0|	tags[i] = possible_tags[i];
 2435|      0|      *count = i;
 2436|      0|      return true;
 2437|      0|    }
 2438|      0|    if (0 == strncmp (&lang_str[1], "sn-", 3)
  ------------------
  |  Branch (2438:9): [True: 0, False: 0]
  ------------------
 2439|      0|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2439:5): [True: 0, False: 0]
  ------------------
 2440|      0|    {
 2441|       |      /* Xiang Chinese; Taiwan, Province of China */
 2442|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2443|      0|      *count = 1;
 2444|      0|      return true;
 2445|      0|    }
 2446|      0|    break;
 2447|      0|  case 'i':
  ------------------
  |  Branch (2447:3): [True: 0, False: 13]
  ------------------
 2448|      0|    if (0 == strcmp (&lang_str[1], "-navajo"))
  ------------------
  |  Branch (2448:9): [True: 0, False: 0]
  ------------------
 2449|      0|    {
 2450|       |      /* Navajo (retired code) */
 2451|      0|      unsigned int i;
 2452|      0|      hb_tag_t possible_tags[] = {
 2453|      0|	HB_TAG('N','A','V',' '),  /* Navajo */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2454|      0|	HB_TAG('A','T','H',' '),  /* Athapaskan */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2455|      0|      };
 2456|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2456:19): [True: 0, False: 0]
  |  Branch (2456:28): [True: 0, False: 0]
  ------------------
 2457|      0|	tags[i] = possible_tags[i];
 2458|      0|      *count = i;
 2459|      0|      return true;
 2460|      0|    }
 2461|      0|    if (0 == strcmp (&lang_str[1], "-hak"))
  ------------------
  |  Branch (2461:9): [True: 0, False: 0]
  ------------------
 2462|      0|    {
 2463|       |      /* Hakka (retired code) */
 2464|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2465|      0|      *count = 1;
 2466|      0|      return true;
 2467|      0|    }
 2468|      0|    if (0 == strcmp (&lang_str[1], "-lux"))
  ------------------
  |  Branch (2468:9): [True: 0, False: 0]
  ------------------
 2469|      0|    {
 2470|       |      /* Luxembourgish (retired code) */
 2471|      0|      tags[0] = HB_TAG('L','T','Z',' ');  /* Luxembourgish */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2472|      0|      *count = 1;
 2473|      0|      return true;
 2474|      0|    }
 2475|      0|    break;
 2476|      0|  case 'l':
  ------------------
  |  Branch (2476:3): [True: 0, False: 13]
  ------------------
 2477|      0|    if (lang_matches (&lang_str[1], limit, "zh-hans", 7))
  ------------------
  |  Branch (2477:9): [True: 0, False: 0]
  ------------------
 2478|      0|    {
 2479|       |      /* Literary Chinese; Han (Simplified variant) */
 2480|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2481|      0|      *count = 1;
 2482|      0|      return true;
 2483|      0|    }
 2484|      0|    break;
 2485|      0|  case 'm':
  ------------------
  |  Branch (2485:3): [True: 0, False: 13]
  ------------------
 2486|      0|    if (lang_matches (&lang_str[1], limit, "np-hant-hk", 10))
  ------------------
  |  Branch (2486:9): [True: 0, False: 0]
  ------------------
 2487|      0|    {
 2488|       |      /* Min Bei Chinese; Han (Traditional variant); Hong Kong */
 2489|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2490|      0|      *count = 1;
 2491|      0|      return true;
 2492|      0|    }
 2493|      0|    if (lang_matches (&lang_str[1], limit, "np-hant-mo", 10))
  ------------------
  |  Branch (2493:9): [True: 0, False: 0]
  ------------------
 2494|      0|    {
 2495|       |      /* Min Bei Chinese; Han (Traditional variant); Macao */
 2496|      0|      unsigned int i;
 2497|      0|      hb_tag_t possible_tags[] = {
 2498|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2499|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2500|      0|      };
 2501|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2501:19): [True: 0, False: 0]
  |  Branch (2501:28): [True: 0, False: 0]
  ------------------
 2502|      0|	tags[i] = possible_tags[i];
 2503|      0|      *count = i;
 2504|      0|      return true;
 2505|      0|    }
 2506|      0|    if (lang_matches (&lang_str[1], limit, "np-hans", 7))
  ------------------
  |  Branch (2506:9): [True: 0, False: 0]
  ------------------
 2507|      0|    {
 2508|       |      /* Min Bei Chinese; Han (Simplified variant) */
 2509|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2510|      0|      *count = 1;
 2511|      0|      return true;
 2512|      0|    }
 2513|      0|    if (lang_matches (&lang_str[1], limit, "np-hant", 7))
  ------------------
  |  Branch (2513:9): [True: 0, False: 0]
  ------------------
 2514|      0|    {
 2515|       |      /* Min Bei Chinese; Han (Traditional variant) */
 2516|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2517|      0|      *count = 1;
 2518|      0|      return true;
 2519|      0|    }
 2520|      0|    if (0 == strncmp (&lang_str[1], "np-", 3)
  ------------------
  |  Branch (2520:9): [True: 0, False: 0]
  ------------------
 2521|      0|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2521:5): [True: 0, False: 0]
  ------------------
 2522|      0|    {
 2523|       |      /* Min Bei Chinese; Hong Kong */
 2524|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2525|      0|      *count = 1;
 2526|      0|      return true;
 2527|      0|    }
 2528|      0|    if (0 == strncmp (&lang_str[1], "np-", 3)
  ------------------
  |  Branch (2528:9): [True: 0, False: 0]
  ------------------
 2529|      0|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2529:5): [True: 0, False: 0]
  ------------------
 2530|      0|    {
 2531|       |      /* Min Bei Chinese; Macao */
 2532|      0|      unsigned int i;
 2533|      0|      hb_tag_t possible_tags[] = {
 2534|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2535|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2536|      0|      };
 2537|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2537:19): [True: 0, False: 0]
  |  Branch (2537:28): [True: 0, False: 0]
  ------------------
 2538|      0|	tags[i] = possible_tags[i];
 2539|      0|      *count = i;
 2540|      0|      return true;
 2541|      0|    }
 2542|      0|    if (0 == strncmp (&lang_str[1], "np-", 3)
  ------------------
  |  Branch (2542:9): [True: 0, False: 0]
  ------------------
 2543|      0|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2543:5): [True: 0, False: 0]
  ------------------
 2544|      0|    {
 2545|       |      /* Min Bei Chinese; Taiwan, Province of China */
 2546|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2547|      0|      *count = 1;
 2548|      0|      return true;
 2549|      0|    }
 2550|      0|    if (0 == strncmp (&lang_str[1], "nw-", 3)
  ------------------
  |  Branch (2550:9): [True: 0, False: 0]
  ------------------
 2551|      0|	&& subtag_matches (lang_str, limit, "-th", 3))
  ------------------
  |  Branch (2551:5): [True: 0, False: 0]
  ------------------
 2552|      0|    {
 2553|       |      /* Mon; Thailand */
 2554|      0|      tags[0] = HB_TAG('M','O','N','T');  /* Thailand Mon */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2555|      0|      *count = 1;
 2556|      0|      return true;
 2557|      0|    }
 2558|      0|    break;
 2559|      0|  case 'n':
  ------------------
  |  Branch (2559:3): [True: 0, False: 13]
  ------------------
 2560|      0|    if (lang_matches (&lang_str[1], limit, "an-hant-hk", 10))
  ------------------
  |  Branch (2560:9): [True: 0, False: 0]
  ------------------
 2561|      0|    {
 2562|       |      /* Min Nan Chinese; Han (Traditional variant); Hong Kong */
 2563|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2564|      0|      *count = 1;
 2565|      0|      return true;
 2566|      0|    }
 2567|      0|    if (lang_matches (&lang_str[1], limit, "an-hant-mo", 10))
  ------------------
  |  Branch (2567:9): [True: 0, False: 0]
  ------------------
 2568|      0|    {
 2569|       |      /* Min Nan Chinese; Han (Traditional variant); Macao */
 2570|      0|      unsigned int i;
 2571|      0|      hb_tag_t possible_tags[] = {
 2572|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2573|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2574|      0|      };
 2575|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2575:19): [True: 0, False: 0]
  |  Branch (2575:28): [True: 0, False: 0]
  ------------------
 2576|      0|	tags[i] = possible_tags[i];
 2577|      0|      *count = i;
 2578|      0|      return true;
 2579|      0|    }
 2580|      0|    if (lang_matches (&lang_str[1], limit, "an-hans", 7))
  ------------------
  |  Branch (2580:9): [True: 0, False: 0]
  ------------------
 2581|      0|    {
 2582|       |      /* Min Nan Chinese; Han (Simplified variant) */
 2583|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2584|      0|      *count = 1;
 2585|      0|      return true;
 2586|      0|    }
 2587|      0|    if (lang_matches (&lang_str[1], limit, "an-hant", 7))
  ------------------
  |  Branch (2587:9): [True: 0, False: 0]
  ------------------
 2588|      0|    {
 2589|       |      /* Min Nan Chinese; Han (Traditional variant) */
 2590|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2591|      0|      *count = 1;
 2592|      0|      return true;
 2593|      0|    }
 2594|      0|    if (0 == strncmp (&lang_str[1], "an-", 3)
  ------------------
  |  Branch (2594:9): [True: 0, False: 0]
  ------------------
 2595|      0|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2595:5): [True: 0, False: 0]
  ------------------
 2596|      0|    {
 2597|       |      /* Min Nan Chinese; Hong Kong */
 2598|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2599|      0|      *count = 1;
 2600|      0|      return true;
 2601|      0|    }
 2602|      0|    if (0 == strncmp (&lang_str[1], "an-", 3)
  ------------------
  |  Branch (2602:9): [True: 0, False: 0]
  ------------------
 2603|      0|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2603:5): [True: 0, False: 0]
  ------------------
 2604|      0|    {
 2605|       |      /* Min Nan Chinese; Macao */
 2606|      0|      unsigned int i;
 2607|      0|      hb_tag_t possible_tags[] = {
 2608|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2609|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2610|      0|      };
 2611|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2611:19): [True: 0, False: 0]
  |  Branch (2611:28): [True: 0, False: 0]
  ------------------
 2612|      0|	tags[i] = possible_tags[i];
 2613|      0|      *count = i;
 2614|      0|      return true;
 2615|      0|    }
 2616|      0|    if (0 == strncmp (&lang_str[1], "an-", 3)
  ------------------
  |  Branch (2616:9): [True: 0, False: 0]
  ------------------
 2617|      0|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2617:5): [True: 0, False: 0]
  ------------------
 2618|      0|    {
 2619|       |      /* Min Nan Chinese; Taiwan, Province of China */
 2620|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2621|      0|      *count = 1;
 2622|      0|      return true;
 2623|      0|    }
 2624|      0|    if (0 == strcmp (&lang_str[1], "o-bok"))
  ------------------
  |  Branch (2624:9): [True: 0, False: 0]
  ------------------
 2625|      0|    {
 2626|       |      /* Norwegian Bokmal (retired code) */
 2627|      0|      tags[0] = HB_TAG('N','O','R',' ');  /* Norwegian */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2628|      0|      *count = 1;
 2629|      0|      return true;
 2630|      0|    }
 2631|      0|    if (0 == strcmp (&lang_str[1], "o-nyn"))
  ------------------
  |  Branch (2631:9): [True: 0, False: 0]
  ------------------
 2632|      0|    {
 2633|       |      /* Norwegian Nynorsk (retired code) */
 2634|      0|      tags[0] = HB_TAG('N','Y','N',' ');  /* Norwegian Nynorsk (Nynorsk, Norwegian) */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2635|      0|      *count = 1;
 2636|      0|      return true;
 2637|      0|    }
 2638|      0|    break;
 2639|      0|  case 'r':
  ------------------
  |  Branch (2639:3): [True: 0, False: 13]
  ------------------
 2640|      0|    if (0 == strncmp (&lang_str[1], "o-", 2)
  ------------------
  |  Branch (2640:9): [True: 0, False: 0]
  ------------------
 2641|      0|	&& subtag_matches (lang_str, limit, "-md", 3))
  ------------------
  |  Branch (2641:5): [True: 0, False: 0]
  ------------------
 2642|      0|    {
 2643|       |      /* Romanian; Moldova */
 2644|      0|      unsigned int i;
 2645|      0|      hb_tag_t possible_tags[] = {
 2646|      0|	HB_TAG('M','O','L',' '),  /* Moldavian */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2647|      0|	HB_TAG('R','O','M',' '),  /* Romanian */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2648|      0|      };
 2649|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2649:19): [True: 0, False: 0]
  |  Branch (2649:28): [True: 0, False: 0]
  ------------------
 2650|      0|	tags[i] = possible_tags[i];
 2651|      0|      *count = i;
 2652|      0|      return true;
 2653|      0|    }
 2654|      0|    break;
 2655|      0|  case 'w':
  ------------------
  |  Branch (2655:3): [True: 0, False: 13]
  ------------------
 2656|      0|    if (lang_matches (&lang_str[1], limit, "uu-hant-hk", 10))
  ------------------
  |  Branch (2656:9): [True: 0, False: 0]
  ------------------
 2657|      0|    {
 2658|       |      /* Wu Chinese; Han (Traditional variant); Hong Kong */
 2659|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2660|      0|      *count = 1;
 2661|      0|      return true;
 2662|      0|    }
 2663|      0|    if (lang_matches (&lang_str[1], limit, "uu-hant-mo", 10))
  ------------------
  |  Branch (2663:9): [True: 0, False: 0]
  ------------------
 2664|      0|    {
 2665|       |      /* Wu Chinese; Han (Traditional variant); Macao */
 2666|      0|      unsigned int i;
 2667|      0|      hb_tag_t possible_tags[] = {
 2668|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2669|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2670|      0|      };
 2671|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2671:19): [True: 0, False: 0]
  |  Branch (2671:28): [True: 0, False: 0]
  ------------------
 2672|      0|	tags[i] = possible_tags[i];
 2673|      0|      *count = i;
 2674|      0|      return true;
 2675|      0|    }
 2676|      0|    if (lang_matches (&lang_str[1], limit, "uu-hans", 7))
  ------------------
  |  Branch (2676:9): [True: 0, False: 0]
  ------------------
 2677|      0|    {
 2678|       |      /* Wu Chinese; Han (Simplified variant) */
 2679|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2680|      0|      *count = 1;
 2681|      0|      return true;
 2682|      0|    }
 2683|      0|    if (lang_matches (&lang_str[1], limit, "uu-hant", 7))
  ------------------
  |  Branch (2683:9): [True: 0, False: 0]
  ------------------
 2684|      0|    {
 2685|       |      /* Wu Chinese; Han (Traditional variant) */
 2686|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2687|      0|      *count = 1;
 2688|      0|      return true;
 2689|      0|    }
 2690|      0|    if (0 == strncmp (&lang_str[1], "uu-", 3)
  ------------------
  |  Branch (2690:9): [True: 0, False: 0]
  ------------------
 2691|      0|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2691:5): [True: 0, False: 0]
  ------------------
 2692|      0|    {
 2693|       |      /* Wu Chinese; Hong Kong */
 2694|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2695|      0|      *count = 1;
 2696|      0|      return true;
 2697|      0|    }
 2698|      0|    if (0 == strncmp (&lang_str[1], "uu-", 3)
  ------------------
  |  Branch (2698:9): [True: 0, False: 0]
  ------------------
 2699|      0|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2699:5): [True: 0, False: 0]
  ------------------
 2700|      0|    {
 2701|       |      /* Wu Chinese; Macao */
 2702|      0|      unsigned int i;
 2703|      0|      hb_tag_t possible_tags[] = {
 2704|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2705|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2706|      0|      };
 2707|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2707:19): [True: 0, False: 0]
  |  Branch (2707:28): [True: 0, False: 0]
  ------------------
 2708|      0|	tags[i] = possible_tags[i];
 2709|      0|      *count = i;
 2710|      0|      return true;
 2711|      0|    }
 2712|      0|    if (0 == strncmp (&lang_str[1], "uu-", 3)
  ------------------
  |  Branch (2712:9): [True: 0, False: 0]
  ------------------
 2713|      0|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2713:5): [True: 0, False: 0]
  ------------------
 2714|      0|    {
 2715|       |      /* Wu Chinese; Taiwan, Province of China */
 2716|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2717|      0|      *count = 1;
 2718|      0|      return true;
 2719|      0|    }
 2720|      0|    break;
 2721|      0|  case 'y':
  ------------------
  |  Branch (2721:3): [True: 0, False: 13]
  ------------------
 2722|      0|    if (lang_matches (&lang_str[1], limit, "ue-hans", 7))
  ------------------
  |  Branch (2722:9): [True: 0, False: 0]
  ------------------
 2723|      0|    {
 2724|       |      /* Yue Chinese; Han (Simplified variant) */
 2725|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2726|      0|      *count = 1;
 2727|      0|      return true;
 2728|      0|    }
 2729|      0|    break;
 2730|      0|  case 'z':
  ------------------
  |  Branch (2730:3): [True: 0, False: 13]
  ------------------
 2731|      0|    if (lang_matches (&lang_str[1], limit, "h-hant-hk", 9))
  ------------------
  |  Branch (2731:9): [True: 0, False: 0]
  ------------------
 2732|      0|    {
 2733|       |      /* Chinese [macrolanguage]; Han (Traditional variant); Hong Kong */
 2734|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2735|      0|      *count = 1;
 2736|      0|      return true;
 2737|      0|    }
 2738|      0|    if (lang_matches (&lang_str[1], limit, "h-hant-mo", 9))
  ------------------
  |  Branch (2738:9): [True: 0, False: 0]
  ------------------
 2739|      0|    {
 2740|       |      /* Chinese [macrolanguage]; Han (Traditional variant); Macao */
 2741|      0|      unsigned int i;
 2742|      0|      hb_tag_t possible_tags[] = {
 2743|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2744|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2745|      0|      };
 2746|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2746:19): [True: 0, False: 0]
  |  Branch (2746:28): [True: 0, False: 0]
  ------------------
 2747|      0|	tags[i] = possible_tags[i];
 2748|      0|      *count = i;
 2749|      0|      return true;
 2750|      0|    }
 2751|      0|    if (0 == strcmp (&lang_str[1], "h-min-nan"))
  ------------------
  |  Branch (2751:9): [True: 0, False: 0]
  ------------------
 2752|      0|    {
 2753|       |      /* Minnan, Hokkien, Amoy, Taiwanese, Southern Min, Southern Fujian, Hoklo, Southern Fukien, Ho-lo (retired code) */
 2754|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2755|      0|      *count = 1;
 2756|      0|      return true;
 2757|      0|    }
 2758|      0|    if (lang_matches (&lang_str[1], limit, "h-hans", 6))
  ------------------
  |  Branch (2758:9): [True: 0, False: 0]
  ------------------
 2759|      0|    {
 2760|       |      /* Chinese [macrolanguage]; Han (Simplified variant) */
 2761|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2762|      0|      *count = 1;
 2763|      0|      return true;
 2764|      0|    }
 2765|      0|    if (lang_matches (&lang_str[1], limit, "h-hant", 6))
  ------------------
  |  Branch (2765:9): [True: 0, False: 0]
  ------------------
 2766|      0|    {
 2767|       |      /* Chinese [macrolanguage]; Han (Traditional variant) */
 2768|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2769|      0|      *count = 1;
 2770|      0|      return true;
 2771|      0|    }
 2772|      0|    if (0 == strcmp (&lang_str[1], "h-min"))
  ------------------
  |  Branch (2772:9): [True: 0, False: 0]
  ------------------
 2773|      0|    {
 2774|       |      /* Min, Fuzhou, Hokkien, Amoy, or Taiwanese (retired code) */
 2775|      0|      tags[0] = HB_TAG('Z','H','S',' ');  /* Chinese, Simplified */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2776|      0|      *count = 1;
 2777|      0|      return true;
 2778|      0|    }
 2779|      0|    if (0 == strncmp (&lang_str[1], "h-", 2)
  ------------------
  |  Branch (2779:9): [True: 0, False: 0]
  ------------------
 2780|      0|	&& subtag_matches (lang_str, limit, "-hk", 3))
  ------------------
  |  Branch (2780:5): [True: 0, False: 0]
  ------------------
 2781|      0|    {
 2782|       |      /* Chinese [macrolanguage]; Hong Kong */
 2783|      0|      tags[0] = HB_TAG('Z','H','H',' ');  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2784|      0|      *count = 1;
 2785|      0|      return true;
 2786|      0|    }
 2787|      0|    if (0 == strncmp (&lang_str[1], "h-", 2)
  ------------------
  |  Branch (2787:9): [True: 0, False: 0]
  ------------------
 2788|      0|	&& subtag_matches (lang_str, limit, "-mo", 3))
  ------------------
  |  Branch (2788:5): [True: 0, False: 0]
  ------------------
 2789|      0|    {
 2790|       |      /* Chinese [macrolanguage]; Macao */
 2791|      0|      unsigned int i;
 2792|      0|      hb_tag_t possible_tags[] = {
 2793|      0|	HB_TAG('Z','H','T','M'),  /* Chinese, Traditional, Macao SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2794|      0|	HB_TAG('Z','H','H',' '),  /* Chinese, Traditional, Hong Kong SAR */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2795|      0|      };
 2796|      0|      for (i = 0; i < 2 && i < *count; i++)
  ------------------
  |  Branch (2796:19): [True: 0, False: 0]
  |  Branch (2796:28): [True: 0, False: 0]
  ------------------
 2797|      0|	tags[i] = possible_tags[i];
 2798|      0|      *count = i;
 2799|      0|      return true;
 2800|      0|    }
 2801|      0|    if (0 == strncmp (&lang_str[1], "h-", 2)
  ------------------
  |  Branch (2801:9): [True: 0, False: 0]
  ------------------
 2802|      0|	&& subtag_matches (lang_str, limit, "-tw", 3))
  ------------------
  |  Branch (2802:5): [True: 0, False: 0]
  ------------------
 2803|      0|    {
 2804|       |      /* Chinese [macrolanguage]; Taiwan, Province of China */
 2805|      0|      tags[0] = HB_TAG('Z','H','T',' ');  /* Chinese, Traditional */
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
 2806|      0|      *count = 1;
 2807|      0|      return true;
 2808|      0|    }
 2809|      0|    break;
 2810|     13|  }
 2811|     13|  return false;
 2812|     13|}

hb_ot_tags_from_script_and_language:
  436|     13|{
  437|     13|  bool needs_script = true;
  438|       |
  439|     13|  if (language == HB_LANGUAGE_INVALID)
  ------------------
  |  |  334|     13|#define HB_LANGUAGE_INVALID ((hb_language_t) 0)
  ------------------
  |  Branch (439:7): [True: 0, False: 13]
  ------------------
  440|      0|  {
  441|      0|    if (language_count && language_tags && *language_count)
  ------------------
  |  Branch (441:9): [True: 0, False: 0]
  |  Branch (441:27): [True: 0, False: 0]
  |  Branch (441:44): [True: 0, False: 0]
  ------------------
  442|      0|      *language_count = 0;
  443|      0|  }
  444|     13|  else
  445|     13|  {
  446|     13|    const char *lang_str, *s, *limit, *private_use_subtag;
  447|     13|    bool needs_language;
  448|       |
  449|     13|    lang_str = hb_language_to_string (language);
  450|     13|    limit = nullptr;
  451|     13|    private_use_subtag = nullptr;
  452|     13|    if (lang_str[0] == 'x' && lang_str[1] == '-')
  ------------------
  |  Branch (452:9): [True: 0, False: 13]
  |  Branch (452:31): [True: 0, False: 0]
  ------------------
  453|      0|    {
  454|      0|      private_use_subtag = lang_str;
  455|     13|    } else {
  456|     24|      for (s = lang_str + 1; *s; s++)
  ------------------
  |  Branch (456:30): [True: 11, False: 13]
  ------------------
  457|     11|      {
  458|     11|	if (s[-1] == '-' && s[1] == '-')
  ------------------
  |  Branch (458:6): [True: 0, False: 11]
  |  Branch (458:22): [True: 0, False: 0]
  ------------------
  459|      0|	{
  460|      0|	  if (s[0] == 'x')
  ------------------
  |  Branch (460:8): [True: 0, False: 0]
  ------------------
  461|      0|	  {
  462|      0|	    private_use_subtag = s;
  463|      0|	    if (!limit)
  ------------------
  |  Branch (463:10): [True: 0, False: 0]
  ------------------
  464|      0|	      limit = s - 1;
  465|      0|	    break;
  466|      0|	  } else if (!limit)
  ------------------
  |  Branch (466:15): [True: 0, False: 0]
  ------------------
  467|      0|	  {
  468|      0|	    limit = s - 1;
  469|      0|	  }
  470|      0|	}
  471|     11|      }
  472|     13|      if (!limit)
  ------------------
  |  Branch (472:11): [True: 13, False: 0]
  ------------------
  473|     13|	limit = s;
  474|     13|    }
  475|       |
  476|     13|    needs_script = !parse_private_use_subtag (private_use_subtag, script_count, script_tags, "-hbsc", TOLOWER);
  477|     13|    needs_language = !parse_private_use_subtag (private_use_subtag, language_count, language_tags, "-hbot", TOUPPER);
  478|       |
  479|     13|    if (needs_language && language_count && language_tags && *language_count)
  ------------------
  |  Branch (479:9): [True: 13, False: 0]
  |  Branch (479:27): [True: 13, False: 0]
  |  Branch (479:45): [True: 13, False: 0]
  |  Branch (479:62): [True: 13, False: 0]
  ------------------
  480|     13|      hb_ot_tags_from_language (lang_str, limit, language_count, language_tags);
  481|     13|  }
  482|       |
  483|     13|  if (needs_script && script_count && script_tags && *script_count)
  ------------------
  |  Branch (483:7): [True: 13, False: 0]
  |  Branch (483:23): [True: 13, False: 0]
  |  Branch (483:39): [True: 13, False: 0]
  |  Branch (483:54): [True: 13, False: 0]
  ------------------
  484|     13|    hb_ot_all_tags_from_script (script, script_count, script_tags);
  485|     13|}
hb-ot-tag.cc:_ZL24parse_private_use_subtagPKcPjS1_S0_PFhhE:
  372|     26|{
  373|       |#ifdef HB_NO_LANGUAGE_PRIVATE_SUBTAG
  374|       |  return false;
  375|       |#endif
  376|       |
  377|     26|  if (!(private_use_subtag && count && tags && *count)) return false;
  ------------------
  |  Branch (377:9): [True: 0, False: 26]
  |  Branch (377:31): [True: 0, False: 0]
  |  Branch (377:40): [True: 0, False: 0]
  |  Branch (377:48): [True: 0, False: 0]
  ------------------
  378|       |
  379|      0|  const char *s = strstr (private_use_subtag, prefix);
  380|      0|  if (!s) return false;
  ------------------
  |  Branch (380:7): [True: 0, False: 0]
  ------------------
  381|       |
  382|      0|  char tag[4];
  383|      0|  int i;
  384|      0|  s += strlen (prefix);
  385|      0|  if (s[0] == '-') {
  ------------------
  |  Branch (385:7): [True: 0, False: 0]
  ------------------
  386|      0|    s += 1;
  387|      0|    char c;
  388|      0|    for (i = 0; i < 8 && ISHEX (s[i]); i++)
  ------------------
  |  Branch (388:17): [True: 0, False: 0]
  |  Branch (388:26): [True: 0, False: 0]
  ------------------
  389|      0|    {
  390|      0|      c = FROMHEX (s[i]);
  391|      0|      if (i % 2 == 0)
  ------------------
  |  Branch (391:11): [True: 0, False: 0]
  ------------------
  392|      0|	tag[i / 2] = c << 4;
  393|      0|      else
  394|      0|	tag[i / 2] += c;
  395|      0|    }
  396|      0|    if (i != 8) return false;
  ------------------
  |  Branch (396:9): [True: 0, False: 0]
  ------------------
  397|      0|  } else {
  398|      0|    for (i = 0; i < 4 && ISALNUM (s[i]); i++)
  ------------------
  |  Branch (398:17): [True: 0, False: 0]
  |  Branch (398:26): [True: 0, False: 0]
  ------------------
  399|      0|      tag[i] = normalize (s[i]);
  400|      0|    if (!i) return false;
  ------------------
  |  Branch (400:9): [True: 0, False: 0]
  ------------------
  401|       |
  402|      0|    for (; i < 4; i++)
  ------------------
  |  Branch (402:12): [True: 0, False: 0]
  ------------------
  403|      0|      tag[i] = ' ';
  404|      0|  }
  405|      0|  tags[0] = HB_TAG (tag[0], tag[1], tag[2], tag[3]);
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  406|      0|  if ((tags[0] & 0xDFDFDFDF) == HB_OT_TAG_DEFAULT_SCRIPT)
  ------------------
  |  |   83|      0|#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (406:7): [True: 0, False: 0]
  ------------------
  407|      0|    tags[0] ^= ~0xDFDFDFDF;
  408|      0|  *count = 1;
  409|      0|  return true;
  410|      0|}
hb-ot-tag.cc:_ZL24hb_ot_tags_from_languagePKcS0_PjS1_:
  287|     13|{
  288|       |
  289|     13|#ifndef HB_NO_LANGUAGE_LONG
  290|       |  /* Check for matches of multiple subtags. */
  291|     13|  if (hb_ot_tags_from_complex_language (lang_str, limit, count, tags))
  ------------------
  |  Branch (291:7): [True: 0, False: 13]
  ------------------
  292|      0|    return;
  293|     13|#endif
  294|       |
  295|       |  /* Find a language matching in the first component. */
  296|     13|#ifndef HB_NO_LANGUAGE_LONG
  297|     13|  const char *s; s = strchr (lang_str, '-');
  298|     13|#endif
  299|     13|  {
  300|     13|#ifndef HB_NO_LANGUAGE_LONG
  301|     13|    if (s && limit - lang_str >= 6)
  ------------------
  |  Branch (301:9): [True: 0, False: 13]
  |  Branch (301:14): [True: 0, False: 0]
  ------------------
  302|      0|    {
  303|      0|      const char *extlang_end = strchr (s + 1, '-');
  304|       |      /* If there is an extended language tag, use it. */
  305|      0|      if (3 == (extlang_end ? extlang_end - s - 1 : strlen (s + 1)) &&
  ------------------
  |  Branch (305:11): [True: 0, False: 0]
  |  Branch (305:17): [True: 0, False: 0]
  ------------------
  306|      0|	  ISALPHA (s[1]))
  ------------------
  |  Branch (306:4): [True: 0, False: 0]
  ------------------
  307|      0|	lang_str = s + 1;
  308|      0|    }
  309|     13|#endif
  310|     13|    const LangTag *ot_languages = nullptr;
  311|     13|    unsigned ot_languages_len = 0;
  312|     13|    const char *dash = strchr (lang_str, '-');
  313|     13|    unsigned first_len = dash ? dash - lang_str : limit - lang_str;
  ------------------
  |  Branch (313:26): [True: 0, False: 13]
  ------------------
  314|     13|    if (first_len == 2)
  ------------------
  |  Branch (314:9): [True: 11, False: 2]
  ------------------
  315|     11|    {
  316|     11|      ot_languages = ot_languages2;
  317|     11|      ot_languages_len = ARRAY_LENGTH (ot_languages2);
  318|     11|    }
  319|      2|#ifndef HB_NO_LANGUAGE_LONG
  320|      2|    else if (first_len == 3)
  ------------------
  |  Branch (320:14): [True: 0, False: 2]
  ------------------
  321|      0|    {
  322|      0|      ot_languages = ot_languages3;
  323|      0|      ot_languages_len = ARRAY_LENGTH (ot_languages3);
  324|      0|    }
  325|     13|#endif
  326|       |
  327|     13|    hb_tag_t lang_tag = hb_tag_from_string (lang_str, first_len);
  328|       |
  329|     13|    static hb_atomic_int_t last_tag_idx; /* Poor man's cache. */
  330|     13|    unsigned tag_idx = last_tag_idx;
  331|       |
  332|     13|    if (likely (tag_idx < ot_languages_len && ot_languages[tag_idx].language == lang_tag) ||
  ------------------
  |  |  259|     26|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 10, False: 3]
  |  |  |  Branch (259:45): [True: 11, False: 2]
  |  |  |  Branch (259:45): [True: 10, False: 1]
  |  |  ------------------
  ------------------
  |  Branch (332:9): [True: 11, False: 2]
  ------------------
  333|     13|	hb_sorted_array (ot_languages, ot_languages_len).bfind (lang_tag, &tag_idx))
  ------------------
  |  Branch (333:2): [True: 1, False: 2]
  ------------------
  334|     11|    {
  335|     11|      last_tag_idx = tag_idx;
  336|     11|      unsigned int i;
  337|     11|      while (tag_idx != 0 &&
  ------------------
  |  Branch (337:14): [True: 11, False: 0]
  ------------------
  338|     11|	     ot_languages[tag_idx].language == ot_languages[tag_idx - 1].language)
  ------------------
  |  Branch (338:7): [True: 0, False: 11]
  ------------------
  339|      0|	tag_idx--;
  340|     11|      for (i = 0;
  341|     22|	   i < *count &&
  ------------------
  |  Branch (341:5): [True: 22, False: 0]
  ------------------
  342|     22|	   tag_idx + i < ot_languages_len &&
  ------------------
  |  Branch (342:5): [True: 22, False: 0]
  ------------------
  343|     22|	   ot_languages[tag_idx + i].tag != HB_TAG_NONE &&
  ------------------
  |  |  197|     22|#define HB_TAG_NONE HB_TAG(0,0,0,0)
  |  |  ------------------
  |  |  |  |  179|     44|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (343:5): [True: 22, False: 0]
  ------------------
  344|     22|	   ot_languages[tag_idx + i].language == ot_languages[tag_idx].language;
  ------------------
  |  Branch (344:5): [True: 11, False: 11]
  ------------------
  345|     11|	   i++)
  346|     11|	tags[i] = ot_languages[tag_idx + i].tag;
  347|     11|      *count = i;
  348|     11|      return;
  349|     11|    }
  350|     13|  }
  351|       |
  352|      2|#ifndef HB_NO_LANGUAGE_LONG
  353|      2|  if (!s)
  ------------------
  |  Branch (353:7): [True: 2, False: 0]
  ------------------
  354|      2|    s = lang_str + strlen (lang_str);
  355|      2|  if (s - lang_str == 3) {
  ------------------
  |  Branch (355:7): [True: 0, False: 2]
  ------------------
  356|       |    /* Assume it's ISO-639-3 and upper-case and use it. */
  357|      0|    tags[0] = hb_tag_from_string (lang_str, s - lang_str) & ~0x20202000u;
  358|      0|    *count = 1;
  359|      0|    return;
  360|      0|  }
  361|      2|#endif
  362|       |
  363|      2|  *count = 0;
  364|      2|}
hb-ot-tag.cc:_ZL12lang_matchesPKcS0_S0_j:
  227|     64|{
  228|       |  /* Same as hb_language_matches(); duplicated. */
  229|       |
  230|     64|  if (likely ((unsigned) (limit - lang_str) < spec_len))
  ------------------
  |  |  259|     64|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 64, False: 0]
  |  |  ------------------
  ------------------
  231|     64|    return false;
  232|       |
  233|      0|  return strncmp (lang_str, spec, spec_len) == 0 &&
  ------------------
  |  Branch (233:10): [True: 0, False: 0]
  ------------------
  234|      0|	 (lang_str[spec_len] == '\0' || lang_str[spec_len] == '-');
  ------------------
  |  Branch (234:4): [True: 0, False: 0]
  |  Branch (234:34): [True: 0, False: 0]
  ------------------
  235|     64|}
_ZNK7LangTag3cmpEj:
  243|      4|  {
  244|      4|    return a < this->language ? -1 : a > this->language ? +1 : 0;
  ------------------
  |  Branch (244:12): [True: 2, False: 2]
  |  Branch (244:38): [True: 1, False: 1]
  ------------------
  245|      4|  }
hb-ot-tag.cc:_ZL26hb_ot_all_tags_from_script11hb_script_tPjS0_:
  158|     13|{
  159|     13|  unsigned int i = 0;
  160|       |
  161|     13|  hb_tag_t new_tag = hb_ot_new_tag_from_script (script);
  162|     13|  if (unlikely (new_tag != HB_OT_TAG_DEFAULT_SCRIPT))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  163|      0|  {
  164|       |    /* HB_SCRIPT_MYANMAR maps to 'mym2', but there is no 'mym3'. */
  165|      0|    if (new_tag != HB_TAG('m','y','m','2'))
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (165:9): [True: 0, False: 0]
  ------------------
  166|      0|      tags[i++] = new_tag | '3';
  167|      0|    if (*count > i)
  ------------------
  |  Branch (167:9): [True: 0, False: 0]
  ------------------
  168|      0|      tags[i++] = new_tag;
  169|      0|  }
  170|       |
  171|     13|  if (*count > i)
  ------------------
  |  Branch (171:7): [True: 13, False: 0]
  ------------------
  172|     13|  {
  173|     13|    hb_tag_t old_tag = hb_ot_old_tag_from_script (script);
  174|     13|    if (old_tag != HB_OT_TAG_DEFAULT_SCRIPT)
  ------------------
  |  |   83|     13|#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
  |  |  ------------------
  |  |  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (174:9): [True: 13, False: 0]
  ------------------
  175|     13|      tags[i++] = old_tag;
  176|     13|  }
  177|       |
  178|     13|  *count = i;
  179|     13|}
hb-ot-tag.cc:_ZL25hb_ot_new_tag_from_script11hb_script_t:
   85|     13|{
   86|     13|  switch ((hb_tag_t) script) {
  ------------------
  |  Branch (86:11): [True: 13, False: 0]
  ------------------
   87|      0|    case HB_SCRIPT_BENGALI:		return HB_TAG('b','n','g','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (87:5): [True: 0, False: 13]
  ------------------
   88|      0|    case HB_SCRIPT_DEVANAGARI:		return HB_TAG('d','e','v','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (88:5): [True: 0, False: 13]
  ------------------
   89|      0|    case HB_SCRIPT_GUJARATI:		return HB_TAG('g','j','r','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (89:5): [True: 0, False: 13]
  ------------------
   90|      0|    case HB_SCRIPT_GURMUKHI:		return HB_TAG('g','u','r','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (90:5): [True: 0, False: 13]
  ------------------
   91|      0|    case HB_SCRIPT_KANNADA:		return HB_TAG('k','n','d','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (91:5): [True: 0, False: 13]
  ------------------
   92|      0|    case HB_SCRIPT_MALAYALAM:		return HB_TAG('m','l','m','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (92:5): [True: 0, False: 13]
  ------------------
   93|      0|    case HB_SCRIPT_ORIYA:		return HB_TAG('o','r','y','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (93:5): [True: 0, False: 13]
  ------------------
   94|      0|    case HB_SCRIPT_TAMIL:		return HB_TAG('t','m','l','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (94:5): [True: 0, False: 13]
  ------------------
   95|      0|    case HB_SCRIPT_TELUGU:		return HB_TAG('t','e','l','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (95:5): [True: 0, False: 13]
  ------------------
   96|      0|    case HB_SCRIPT_MYANMAR:		return HB_TAG('m','y','m','2');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (96:5): [True: 0, False: 13]
  ------------------
   97|     13|  }
   98|       |
   99|     13|  return HB_OT_TAG_DEFAULT_SCRIPT;
  ------------------
  |  |   83|     13|#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
  |  |  ------------------
  |  |  |  |  179|     13|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  100|     13|}
hb-ot-tag.cc:_ZL25hb_ot_old_tag_from_script11hb_script_t:
   38|     13|{
   39|       |  /* This seems to be accurate as of end of 2012. */
   40|       |
   41|     13|  switch ((hb_tag_t) script)
  ------------------
  |  Branch (41:11): [True: 13, False: 0]
  ------------------
   42|     13|  {
   43|      0|    case HB_SCRIPT_INVALID:		return HB_OT_TAG_DEFAULT_SCRIPT;
  ------------------
  |  |   83|      0|#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (43:5): [True: 0, False: 13]
  ------------------
   44|      0|    case HB_SCRIPT_MATH:		return HB_OT_TAG_MATH_SCRIPT;
  ------------------
  |  |   64|      0|#define HB_OT_TAG_MATH_SCRIPT HB_TAG('m','a','t','h')
  |  |  ------------------
  |  |  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  |  |  ------------------
  ------------------
  |  Branch (44:5): [True: 0, False: 13]
  ------------------
   45|       |
   46|       |    /* KATAKANA and HIRAGANA both map to 'kana' */
   47|      0|    case HB_SCRIPT_HIRAGANA:		return HB_TAG('k','a','n','a');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (47:5): [True: 0, False: 13]
  ------------------
   48|       |
   49|       |    /* Spaces at the end are preserved, unlike ISO 15924 */
   50|      0|    case HB_SCRIPT_LAO:			return HB_TAG('l','a','o',' ');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (50:5): [True: 0, False: 13]
  ------------------
   51|      0|    case HB_SCRIPT_YI:			return HB_TAG('y','i',' ',' ');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (51:5): [True: 0, False: 13]
  ------------------
   52|       |    /* Unicode-5.0 additions */
   53|      0|    case HB_SCRIPT_NKO:			return HB_TAG('n','k','o',' ');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (53:5): [True: 0, False: 13]
  ------------------
   54|       |    /* Unicode-5.1 additions */
   55|      0|    case HB_SCRIPT_VAI:			return HB_TAG('v','a','i',' ');
  ------------------
  |  |  179|      0|#define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
  ------------------
  |  Branch (55:5): [True: 0, False: 13]
  ------------------
   56|     13|  }
   57|       |
   58|       |  /* Else, just change first char to lowercase and return */
   59|     13|  return ((hb_tag_t) script) | 0x20000000u;
   60|     13|}

_ZN21hb_sanitize_context_tC2Ev:
  132|   409k|	lazy_some_gpos (false) {}
_ZN21hb_sanitize_context_t15visit_subtablesEj:
  143|     42|  {
  144|     42|    max_subtables += count;
  145|     42|    return max_subtables < HB_SANITIZE_MAX_SUBTABLES;
  ------------------
  |  |  117|     42|#define HB_SANITIZE_MAX_SUBTABLES 0x4000
  ------------------
  146|     42|  }
_ZN21hb_sanitize_context_tC2EP9hb_blob_t:
  161|   409k|  {
  162|   409k|    init (b);
  163|       |
  164|   409k|    if (blob)
  ------------------
  |  Branch (164:9): [True: 409k, False: 0]
  ------------------
  165|   409k|      start_processing ();
  166|   409k|  }
_ZN21hb_sanitize_context_tD2Ev:
  169|   409k|  {
  170|   409k|    if (blob)
  ------------------
  |  Branch (170:9): [True: 409k, False: 108]
  ------------------
  171|   409k|      end_processing ();
  172|   409k|  }
_ZN21hb_sanitize_context_t4initEP9hb_blob_t:
  175|   409k|  {
  176|   409k|    this->blob = hb_blob_reference (b);
  177|   409k|    this->writable = false;
  178|   409k|  }
_ZN21hb_sanitize_context_t14set_num_glyphsEj:
  181|    108|  {
  182|    108|    num_glyphs = num_glyphs_;
  183|    108|    num_glyphs_set = true;
  184|    108|  }
_ZN21hb_sanitize_context_t11set_max_opsEi:
  187|      9|  void set_max_ops (int max_ops_) { max_ops = max_ops_; }
_ZN21hb_sanitize_context_t12reset_objectEv:
  211|   409k|  {
  212|   409k|    this->start = this->blob->data;
  213|   409k|    this->end = this->start + this->blob->length;
  214|   409k|    this->length = this->end - this->start;
  215|   409k|    assert (this->start <= this->end); /* Must not overflow. */
  216|   409k|  }
_ZN21hb_sanitize_context_t16start_processingEv:
  219|   409k|  {
  220|   409k|    reset_object ();
  221|   409k|    unsigned m;
  222|   409k|    if (unlikely (hb_unsigned_mul_overflows (this->end - this->start, HB_SANITIZE_MAX_OPS_FACTOR, &m)))
  ------------------
  |  |  260|   409k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 409k]
  |  |  ------------------
  ------------------
  223|      0|      this->max_ops = HB_SANITIZE_MAX_OPS_MAX;
  ------------------
  |  |  114|      0|#define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF
  ------------------
  224|   409k|    else
  225|   409k|      this->max_ops = hb_clamp (m,
  226|   409k|				(unsigned) HB_SANITIZE_MAX_OPS_MIN,
  ------------------
  |  |  111|   409k|#define HB_SANITIZE_MAX_OPS_MIN 16384
  ------------------
  227|   409k|				(unsigned) HB_SANITIZE_MAX_OPS_MAX);
  ------------------
  |  |  114|   409k|#define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF
  ------------------
  228|   409k|    this->edit_count = 0;
  229|   409k|    this->debug_depth = 0;
  230|   409k|    this->recursion_depth = 0;
  231|       |
  232|   409k|    DEBUG_MSG_LEVEL (SANITIZE, start, 0, +1,
  ------------------
  |  |  231|   409k|#define DEBUG_MSG_LEVEL(WHAT, OBJ, LEVEL, LEVEL_DIR, ...)	_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    true, (LEVEL), (LEVEL_DIR), __VA_ARGS__)
  ------------------
  233|   409k|		     "start [%p..%p] (%lu bytes)",
  234|   409k|		     this->start, this->end,
  235|   409k|		     (unsigned long) (this->end - this->start));
  236|   409k|  }
_ZN21hb_sanitize_context_t14end_processingEv:
  239|   409k|  {
  240|   409k|    DEBUG_MSG_LEVEL (SANITIZE, this->start, 0, -1,
  ------------------
  |  |  231|   409k|#define DEBUG_MSG_LEVEL(WHAT, OBJ, LEVEL, LEVEL_DIR, ...)	_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    true, (LEVEL), (LEVEL_DIR), __VA_ARGS__)
  ------------------
  241|   409k|		     "end [%p..%p] %u edit requests",
  242|   409k|		     this->start, this->end, this->edit_count);
  243|       |
  244|   409k|    hb_blob_destroy (this->blob);
  245|   409k|    this->blob = nullptr;
  246|   409k|    this->start = this->end = nullptr;
  247|   409k|    this->length = 0;
  248|   409k|  }
_ZN21hb_sanitize_context_t9check_opsEj:
  254|      1|  {
  255|       |    /* Avoid underflow */
  256|      1|    if (unlikely (this->max_ops < 0 || count >= (unsigned) this->max_ops))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 1]
  |  |  |  Branch (260:47): [True: 0, False: 1]
  |  |  |  Branch (260:47): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  257|      0|    {
  258|      0|      this->max_ops = -1;
  259|      0|      return false;
  260|      0|    }
  261|      1|    this->max_ops -= (int) count;
  262|      1|    return true;
  263|      1|  }
_ZNK21hb_sanitize_context_t11check_rangeEPKvj:
  270|  14.3k|  {
  271|  14.3k|    const char *p = (const char *) base;
  272|  14.3k|    bool ok = (uintptr_t) (p - this->start) <= this->length &&
  ------------------
  |  Branch (272:15): [True: 14.3k, False: 0]
  ------------------
  273|  14.3k|	      (unsigned int) (this->end - p) >= len &&
  ------------------
  |  Branch (273:8): [True: 14.3k, False: 0]
  ------------------
  274|  14.3k|	      ((this->max_ops -= len) > 0);
  ------------------
  |  Branch (274:8): [True: 14.3k, False: 0]
  ------------------
  275|       |
  276|  14.3k|    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
  ------------------
  |  |  231|  28.6k|#define DEBUG_MSG_LEVEL(WHAT, OBJ, LEVEL, LEVEL_DIR, ...)	_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    true, (LEVEL), (LEVEL_DIR), __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (231:145): [True: 14.3k, False: 0]
  |  |  ------------------
  ------------------
  277|  14.3k|		     "check_range [%p..%p]"
  278|  14.3k|		     " (%u bytes) in [%p..%p] -> %s",
  279|  14.3k|		     p, p + len, len,
  280|  14.3k|		     this->start, this->end,
  281|  14.3k|		     ok ? "OK" : "OUT-OF-RANGE");
  282|       |
  283|  14.3k|    return likely (ok);
  ------------------
  |  |  259|  14.3k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  284|  14.3k|  }
_ZNK21hb_sanitize_context_t11check_pointEPKv:
  309|  29.4k|  {
  310|  29.4k|    const char *p = (const char *) base;
  311|  29.4k|    bool ok = (uintptr_t) (p - this->start) <= this->length;
  312|       |
  313|  29.4k|    DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
  ------------------
  |  |  231|  58.8k|#define DEBUG_MSG_LEVEL(WHAT, OBJ, LEVEL, LEVEL_DIR, ...)	_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), nullptr,    true, (LEVEL), (LEVEL_DIR), __VA_ARGS__)
  |  |  ------------------
  |  |  |  Branch (231:145): [True: 29.4k, False: 0]
  |  |  ------------------
  ------------------
  314|  29.4k|		     "check_point [%p]"
  315|  29.4k|		     " in [%p..%p] -> %s",
  316|  29.4k|		     p,
  317|  29.4k|		     this->start, this->end,
  318|  29.4k|		     ok ? "OK" : "OUT-OF-RANGE");
  319|       |
  320|  29.4k|    return likely (ok);
  ------------------
  |  |  259|  29.4k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  321|  29.4k|  }
_ZN25hb_sanitize_with_object_tD2Ev:
  520|     40|  { c->reset_object (); }
_ZNK21hb_sanitize_context_t12check_structIN2OT7IntTypeIjLj4EEEEEbPKT_:
  389|      1|  {
  390|      1|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      1|    else
  393|      1|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      1|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      1|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT15BinSearchHeaderINS1_7IntTypeItLj2EEEEEEEbPKT_:
  389|      4|  {
  390|      4|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      4|    else
  393|      4|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      4|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      4|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT12FixedVersionINS1_7IntTypeItLj2EEEEEEEbPKT_:
  389|     24|  {
  390|     24|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     24|    else
  393|     24|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     24|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     24|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT7IntTypeItLj2EEEEEbPKT_:
  389|  14.5k|  {
  390|  14.5k|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|  14.5k|    else
  393|  14.5k|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|  14.5k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|  14.5k|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT11HBGlyphID16EEEbPKT_jj:
  347|  13.9k|  {
  348|  13.9k|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 13.9k]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|  13.9k|    else
  354|  13.9k|      len = len * hb_static_size (T);
  ------------------
  |  |   91|  13.9k|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|  13.9k|    return this->check_range (base, len);
  356|  13.9k|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT6Layout6Common11RangeRecordINS2_10SmallTypesEEEEEbPKT_jj:
  347|     35|  {
  348|     35|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 35]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     35|    else
  354|     35|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     35|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     35|    return this->check_range (base, len);
  356|     35|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT7FeatureEEEbPKT_:
  389|     39|  {
  390|     39|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     39|    else
  393|     39|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     39|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     39|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT5IndexEEEbPKT_jj:
  347|     78|  {
  348|     78|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 78]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     78|    else
  354|     78|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     78|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     78|    return this->check_range (base, len);
  356|     78|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT7LangSysEEEbPKT_:
  389|     39|  {
  390|     39|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     39|    else
  393|     39|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     39|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     39|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_7LangSysENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|     39|  {
  390|     39|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     39|    else
  393|     39|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     39|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     39|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT6RecordINS1_7LangSysEEEEEbPKT_jj:
  347|     28|  {
  348|     28|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 28]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     28|    else
  354|     28|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     28|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     28|    return this->check_range (base, len);
  356|     28|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT6RecordINS1_7LangSysEEEEEbPKT_:
  389|     11|  {
  390|     11|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     11|    else
  393|     11|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     11|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT10maxpV1TailEEEbPKT_:
  389|     11|  {
  390|     11|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     11|    else
  393|     11|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     11|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT4maxpEEEbPKT_:
  389|     11|  {
  390|     11|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     11|    else
  393|     11|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     11|  }
_ZN21hb_sanitize_context_t15reference_tableIN2OT4maxpEEEP9hb_blob_tPK9hb_face_tj:
  494|     11|  {
  495|     11|    if (!num_glyphs_set)
  ------------------
  |  Branch (495:9): [True: 0, False: 11]
  ------------------
  496|      0|      set_num_glyphs (hb_face_get_glyph_count (face));
  497|     11|    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
  498|     11|  }
_ZN21hb_sanitize_context_t13sanitize_blobIN2OT4maxpEEEP9hb_blob_tS4_:
  427|     11|  {
  428|     11|    bool sane;
  429|       |
  430|     11|    init (blob);
  431|       |
  432|     11|  retry:
  433|     11|    DEBUG_MSG_FUNC (SANITIZE, start, "start");
  ------------------
  |  |  233|     11|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  434|       |
  435|     11|    start_processing ();
  436|       |
  437|     11|    if (unlikely (!start))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  438|      0|    {
  439|      0|      end_processing ();
  440|      0|      return blob;
  441|      0|    }
  442|       |
  443|     11|    Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
  444|       |
  445|     11|    sane = t->sanitize (this);
  446|     11|    if (sane)
  ------------------
  |  Branch (446:9): [True: 11, False: 0]
  ------------------
  447|     11|    {
  448|     11|      if (edit_count)
  ------------------
  |  Branch (448:11): [True: 0, False: 11]
  ------------------
  449|      0|      {
  450|      0|	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  451|       |
  452|       |	/* sanitize again to ensure no toe-stepping */
  453|      0|	edit_count = 0;
  454|      0|	sane = t->sanitize (this);
  455|      0|	if (edit_count) {
  ------------------
  |  Branch (455:6): [True: 0, False: 0]
  ------------------
  456|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  457|      0|	  sane = false;
  458|      0|	}
  459|      0|      }
  460|     11|    }
  461|      0|    else
  462|      0|    {
  463|      0|      if (edit_count && !writable) {
  ------------------
  |  Branch (463:11): [True: 0, False: 0]
  |  Branch (463:25): [True: 0, False: 0]
  ------------------
  464|      0|	start = hb_blob_get_data_writable (blob, nullptr);
  465|      0|	end = start + blob->length;
  466|       |
  467|      0|	if (start)
  ------------------
  |  Branch (467:6): [True: 0, False: 0]
  ------------------
  468|      0|	{
  469|      0|	  writable = true;
  470|       |	  /* ok, we made it writable by relocating.  try again */
  471|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  472|      0|	  goto retry;
  473|      0|	}
  474|      0|      }
  475|      0|    }
  476|       |
  477|     11|    end_processing ();
  478|       |
  479|     11|    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
  ------------------
  |  |  233|     22|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (233:111): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  480|     11|    if (sane)
  ------------------
  |  Branch (480:9): [True: 11, False: 0]
  ------------------
  481|     11|    {
  482|     11|      hb_blob_make_immutable (blob);
  483|     11|      return blob;
  484|     11|    }
  485|      0|    else
  486|      0|    {
  487|      0|      hb_blob_destroy (blob);
  488|      0|      return hb_blob_get_empty ();
  489|      0|    }
  490|     11|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout6Common8CoverageENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|     52|  {
  390|     52|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     52|    else
  393|     52|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     52|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     52|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_8LigGlyphENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|      1|  {
  348|      1|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 1]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|      1|    else
  354|      1|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      1|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      1|    return this->check_range (base, len);
  356|      1|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_8ClassDefENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      7|  {
  390|      7|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      7|    else
  393|      7|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      7|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      7|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_10AttachListENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      1|  {
  390|      1|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      1|    else
  393|      1|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      1|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      1|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_12LigCaretListENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      1|  {
  390|      1|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      1|    else
  393|      1|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      1|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      1|  }
_ZN21hb_sanitize_context_t15reference_tableIN2OT4GDEFEEEP9hb_blob_tPK9hb_face_tj:
  494|     11|  {
  495|     11|    if (!num_glyphs_set)
  ------------------
  |  Branch (495:9): [True: 11, False: 0]
  ------------------
  496|     11|      set_num_glyphs (hb_face_get_glyph_count (face));
  497|     11|    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
  498|     11|  }
_ZN21hb_sanitize_context_t13sanitize_blobIN2OT4GDEFEEEP9hb_blob_tS4_:
  427|     11|  {
  428|     11|    bool sane;
  429|       |
  430|     11|    init (blob);
  431|       |
  432|     11|  retry:
  433|     11|    DEBUG_MSG_FUNC (SANITIZE, start, "start");
  ------------------
  |  |  233|     11|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  434|       |
  435|     11|    start_processing ();
  436|       |
  437|     11|    if (unlikely (!start))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 10, False: 1]
  |  |  ------------------
  ------------------
  438|     10|    {
  439|     10|      end_processing ();
  440|     10|      return blob;
  441|     10|    }
  442|       |
  443|      1|    Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
  444|       |
  445|      1|    sane = t->sanitize (this);
  446|      1|    if (sane)
  ------------------
  |  Branch (446:9): [True: 1, False: 0]
  ------------------
  447|      1|    {
  448|      1|      if (edit_count)
  ------------------
  |  Branch (448:11): [True: 0, False: 1]
  ------------------
  449|      0|      {
  450|      0|	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  451|       |
  452|       |	/* sanitize again to ensure no toe-stepping */
  453|      0|	edit_count = 0;
  454|      0|	sane = t->sanitize (this);
  455|      0|	if (edit_count) {
  ------------------
  |  Branch (455:6): [True: 0, False: 0]
  ------------------
  456|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  457|      0|	  sane = false;
  458|      0|	}
  459|      0|      }
  460|      1|    }
  461|      0|    else
  462|      0|    {
  463|      0|      if (edit_count && !writable) {
  ------------------
  |  Branch (463:11): [True: 0, False: 0]
  |  Branch (463:25): [True: 0, False: 0]
  ------------------
  464|      0|	start = hb_blob_get_data_writable (blob, nullptr);
  465|      0|	end = start + blob->length;
  466|       |
  467|      0|	if (start)
  ------------------
  |  Branch (467:6): [True: 0, False: 0]
  ------------------
  468|      0|	{
  469|      0|	  writable = true;
  470|       |	  /* ok, we made it writable by relocating.  try again */
  471|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  472|      0|	  goto retry;
  473|      0|	}
  474|      0|      }
  475|      0|    }
  476|       |
  477|      1|    end_processing ();
  478|       |
  479|      1|    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
  ------------------
  |  |  233|      2|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (233:111): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  480|      1|    if (sane)
  ------------------
  |  Branch (480:9): [True: 1, False: 0]
  ------------------
  481|      1|    {
  482|      1|      hb_blob_make_immutable (blob);
  483|      1|      return blob;
  484|      1|    }
  485|      0|    else
  486|      0|    {
  487|      0|      hb_blob_destroy (blob);
  488|      0|      return hb_blob_get_empty ();
  489|      0|    }
  490|      1|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT12LookupRecordEEEbPKT_jj:
  347|      6|  {
  348|      6|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 6]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|      6|    else
  354|      6|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      6|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      6|    return this->check_range (base, len);
  356|      6|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT6Layout9GPOS_impl13AnchorFormat1EEEbPKT_:
  389|     96|  {
  390|     96|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     96|    else
  393|     96|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     96|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     96|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GPOS_impl6AnchorENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|     96|  {
  390|     96|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     96|    else
  393|     96|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     96|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     96|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT6Layout9GPOS_impl12AnchorMatrixEEEbPKT_:
  389|      6|  {
  390|      6|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      6|    else
  393|      6|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      6|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      6|  }
_ZNK21hb_sanitize_context_t11check_arrayIN2OT8OffsetToINS1_6Layout9GPOS_impl6AnchorENS1_7IntTypeItLj2EEELb1EEEEEbPKT_j:
  360|      6|  {
  361|      6|    return this->check_range (base, len, hb_static_size (T));
  ------------------
  |  |   91|      6|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  362|      6|  }
_ZNK21hb_sanitize_context_t11check_rangeIN2OT8OffsetToINS1_6Layout9GPOS_impl6AnchorENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  327|      6|  {
  328|      6|    unsigned m;
  329|      6|    return !hb_unsigned_mul_overflows (a, b, &m) &&
  ------------------
  |  Branch (329:12): [True: 6, False: 0]
  ------------------
  330|      6|	   this->check_range (base, m);
  ------------------
  |  Branch (330:5): [True: 6, False: 0]
  ------------------
  331|      6|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT6Layout9GPOS_impl10MarkRecordEEEbPKT_:
  389|     96|  {
  390|     96|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     96|    else
  393|     96|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     96|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     96|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT6Layout9GPOS_impl10MarkRecordEEEbPKT_jj:
  347|      6|  {
  348|      6|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 6]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|      6|    else
  354|      6|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      6|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      6|    return this->check_range (base, len);
  356|      6|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT6LookupEEEbPKT_:
  389|     42|  {
  390|     42|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     42|    else
  393|     42|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     42|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     42|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT6OffsetINS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|     42|  {
  348|     42|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 42]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     42|    else
  354|     42|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     42|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     42|    return this->check_range (base, len);
  356|     42|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_6Layout9GPOS_impl17PosLookupSubTableENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|      4|  {
  348|      4|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 4]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|      4|    else
  354|      4|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      4|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      4|    return this->check_range (base, len);
  356|      4|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GPOS_impl17PosLookupSubTableENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      7|  {
  390|      7|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      7|    else
  393|      7|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      7|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      7|  }
_ZN21hb_sanitize_context_t12may_dispatchIN2OT6Layout9GPOS_impl7PairPosENS1_7IntTypeItLj2EEEEEbPKT_PKT0_:
  137|      1|  { return format->sanitize (this); }
_ZNK21hb_sanitize_context_t12check_structIN2OT6Layout9GPOS_impl16PairPosFormat2_4INS2_10SmallTypesEEEEEbPKT_:
  389|      1|  {
  390|      1|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      1|    else
  393|      1|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      1|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      1|  }
_ZNK21hb_sanitize_context_t11check_rangeIvEEbPKT_jj:
  327|      1|  {
  328|      1|    unsigned m;
  329|      1|    return !hb_unsigned_mul_overflows (a, b, &m) &&
  ------------------
  |  Branch (329:12): [True: 1, False: 0]
  ------------------
  330|      1|	   this->check_range (base, m);
  ------------------
  |  Branch (330:5): [True: 1, False: 0]
  ------------------
  331|      1|  }
_ZN21hb_sanitize_context_t12may_dispatchIN2OT6Layout9GPOS_impl11MarkBasePosENS1_7IntTypeItLj2EEEEEbPKT_PKT0_:
  137|      4|  { return format->sanitize (this); }
_ZNK21hb_sanitize_context_t12check_structIN2OT6Layout9GPOS_impl20MarkBasePosFormat1_2INS2_10SmallTypesEEEEEbPKT_:
  389|      4|  {
  390|      4|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      4|    else
  393|      4|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      4|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      4|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GPOS_impl9MarkArrayENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      6|  {
  390|      6|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      6|    else
  393|      6|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      6|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      6|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GPOS_impl12AnchorMatrixENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      6|  {
  390|      6|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      6|    else
  393|      6|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      6|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      6|  }
_ZN21hb_sanitize_context_t12may_dispatchIN2OT6Layout9GPOS_impl10MarkLigPosENS1_7IntTypeItLj2EEEEEbPKT_PKT0_:
  137|      1|  { return format->sanitize (this); }
_ZNK21hb_sanitize_context_t12check_structIN2OT6Layout9GPOS_impl19MarkLigPosFormat1_2INS2_10SmallTypesEEEEEbPKT_:
  389|      1|  {
  390|      1|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      1|    else
  393|      1|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      1|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      1|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GPOS_impl13LigatureArrayENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      1|  {
  390|      1|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      1|    else
  393|      1|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      1|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      1|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_6Layout9GPOS_impl12AnchorMatrixENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|      1|  {
  348|      1|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 1]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|      1|    else
  354|      1|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      1|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      1|    return this->check_range (base, len);
  356|      1|  }
_ZN21hb_sanitize_context_t12may_dispatchIN2OT6Layout9GPOS_impl11MarkMarkPosENS1_7IntTypeItLj2EEEEEbPKT_PKT0_:
  137|      1|  { return format->sanitize (this); }
_ZNK21hb_sanitize_context_t12check_structIN2OT6Layout9GPOS_impl20MarkMarkPosFormat1_2INS2_10SmallTypesEEEEEbPKT_:
  389|      1|  {
  390|      1|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      1|    else
  393|      1|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      1|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      1|  }
_ZN21hb_sanitize_context_t12may_dispatchIN2OT12ChainContextENS1_7IntTypeItLj2EEEEEbPKT_PKT0_:
  137|      1|  { return format->sanitize (this); }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_12ChainRuleSetINS1_6Layout10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|      1|  {
  348|      1|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 1]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|      1|    else
  354|      1|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      1|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      1|    return this->check_range (base, len);
  356|      1|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_12ChainRuleSetINS1_6Layout10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      5|  {
  390|      5|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      5|    else
  393|      5|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      5|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      5|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_9ChainRuleINS1_6Layout10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|      2|  {
  348|      2|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 2]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|      2|    else
  354|      2|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      2|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      2|    return this->check_range (base, len);
  356|      2|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_9ChainRuleINS1_6Layout10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      6|  {
  390|      6|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      6|    else
  393|      6|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      6|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      6|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_18RecordListOfScriptENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|     22|  {
  390|     22|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     22|    else
  393|     22|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     22|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     22|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT6RecordINS1_6ScriptEEEEEbPKT_jj:
  347|     22|  {
  348|     22|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 22]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     22|    else
  354|     22|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     22|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     22|    return this->check_range (base, len);
  356|     22|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT6RecordINS1_6ScriptEEEEEbPKT_:
  389|     28|  {
  390|     28|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     28|    else
  393|     28|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     28|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     28|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6ScriptENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|     28|  {
  390|     28|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     28|    else
  393|     28|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     28|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     28|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_12RecordListOfINS1_7FeatureEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|     22|  {
  390|     22|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     22|    else
  393|     22|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     22|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     22|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT6RecordINS1_7FeatureEEEEEbPKT_jj:
  347|     22|  {
  348|     22|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 22]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     22|    else
  354|     22|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     22|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     22|    return this->check_range (base, len);
  356|     22|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT6RecordINS1_7FeatureEEEEEbPKT_:
  389|     39|  {
  390|     39|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     39|    else
  393|     39|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     39|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     39|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_7FeatureENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|     39|  {
  390|     39|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     39|    else
  393|     39|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     39|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     39|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_16List16OfOffsetToINS1_6Layout9GPOS_impl9PosLookupENS1_7IntTypeItLj2EEEEES8_Lb1EEEEEbPKT_:
  389|     11|  {
  390|     11|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     11|    else
  393|     11|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     11|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_6Layout9GPOS_impl9PosLookupENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|     11|  {
  348|     11|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 11]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     11|    else
  354|     11|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     11|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     11|    return this->check_range (base, len);
  356|     11|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GPOS_impl9PosLookupENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      4|  {
  390|      4|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      4|    else
  393|      4|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      4|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      4|  }
_ZN21hb_sanitize_context_t15reference_tableIN2OT6Layout4GPOSEEEP9hb_blob_tPK9hb_face_tj:
  494|     11|  {
  495|     11|    if (!num_glyphs_set)
  ------------------
  |  Branch (495:9): [True: 11, False: 0]
  ------------------
  496|     11|      set_num_glyphs (hb_face_get_glyph_count (face));
  497|     11|    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
  498|     11|  }
_ZN21hb_sanitize_context_t13sanitize_blobIN2OT6Layout4GPOSEEEP9hb_blob_tS5_:
  427|     11|  {
  428|     11|    bool sane;
  429|       |
  430|     11|    init (blob);
  431|       |
  432|     11|  retry:
  433|     11|    DEBUG_MSG_FUNC (SANITIZE, start, "start");
  ------------------
  |  |  233|     11|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  434|       |
  435|     11|    start_processing ();
  436|       |
  437|     11|    if (unlikely (!start))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  438|      0|    {
  439|      0|      end_processing ();
  440|      0|      return blob;
  441|      0|    }
  442|       |
  443|     11|    Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
  444|       |
  445|     11|    sane = t->sanitize (this);
  446|     11|    if (sane)
  ------------------
  |  Branch (446:9): [True: 11, False: 0]
  ------------------
  447|     11|    {
  448|     11|      if (edit_count)
  ------------------
  |  Branch (448:11): [True: 0, False: 11]
  ------------------
  449|      0|      {
  450|      0|	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  451|       |
  452|       |	/* sanitize again to ensure no toe-stepping */
  453|      0|	edit_count = 0;
  454|      0|	sane = t->sanitize (this);
  455|      0|	if (edit_count) {
  ------------------
  |  Branch (455:6): [True: 0, False: 0]
  ------------------
  456|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  457|      0|	  sane = false;
  458|      0|	}
  459|      0|      }
  460|     11|    }
  461|      0|    else
  462|      0|    {
  463|      0|      if (edit_count && !writable) {
  ------------------
  |  Branch (463:11): [True: 0, False: 0]
  |  Branch (463:25): [True: 0, False: 0]
  ------------------
  464|      0|	start = hb_blob_get_data_writable (blob, nullptr);
  465|      0|	end = start + blob->length;
  466|       |
  467|      0|	if (start)
  ------------------
  |  Branch (467:6): [True: 0, False: 0]
  ------------------
  468|      0|	{
  469|      0|	  writable = true;
  470|       |	  /* ok, we made it writable by relocating.  try again */
  471|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  472|      0|	  goto retry;
  473|      0|	}
  474|      0|      }
  475|      0|    }
  476|       |
  477|     11|    end_processing ();
  478|       |
  479|     11|    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
  ------------------
  |  |  233|     22|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (233:111): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  480|     11|    if (sane)
  ------------------
  |  Branch (480:9): [True: 11, False: 0]
  ------------------
  481|     11|    {
  482|     11|      hb_blob_make_immutable (blob);
  483|     11|      return blob;
  484|     11|    }
  485|      0|    else
  486|      0|    {
  487|      0|      hb_blob_destroy (blob);
  488|      0|      return hb_blob_get_empty ();
  489|      0|    }
  490|     11|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN3AAT8KernPairEEEbPKT_jj:
  347|      4|  {
  348|      4|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 4, False: 0]
  ------------------
  349|      4|    {
  350|      4|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      4|    }
  353|      0|    else
  354|      0|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      0|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      4|    return this->check_range (base, len);
  356|      4|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT20KernOTSubTableHeaderEEEbPKT_:
  389|      8|  {
  390|      8|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      8|    else
  393|      8|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      8|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      8|  }
_ZN21hb_sanitize_context_t10set_objectIN2OT12KernSubTableINS1_20KernOTSubTableHeaderEEEEEvPKT_:
  191|     40|  {
  192|     40|    reset_object ();
  193|       |
  194|     40|    if (!obj) return;
  ------------------
  |  Branch (194:9): [True: 10, False: 30]
  ------------------
  195|       |
  196|     30|    const char *obj_start = (const char *) obj;
  197|     30|    if (unlikely (obj_start < this->start || this->end <= obj_start))
  ------------------
  |  |  260|     60|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 30]
  |  |  |  Branch (260:47): [True: 0, False: 30]
  |  |  |  Branch (260:47): [True: 0, False: 30]
  |  |  ------------------
  ------------------
  198|      0|    {
  199|      0|      this->start = this->end = nullptr;
  200|      0|      this->length = 0;
  201|      0|    }
  202|     30|    else
  203|     30|    {
  204|     30|      this->start = obj_start;
  205|     30|      this->end   = obj_start + hb_min (size_t (this->end - obj_start), obj->get_size ());
  206|     30|      this->length = this->end - this->start;
  207|     30|    }
  208|     30|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_6Layout9GSUB_impl19SubstLookupSubTableENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|     38|  {
  348|     38|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 38]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     38|    else
  354|     38|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     38|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     38|    return this->check_range (base, len);
  356|     38|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GSUB_impl19SubstLookupSubTableENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|     38|  {
  390|     38|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     38|    else
  393|     38|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     38|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     38|  }
_ZN21hb_sanitize_context_t12may_dispatchIN2OT6Layout9GSUB_impl11SingleSubstENS1_7IntTypeItLj2EEEEEbPKT_PKT0_:
  137|     14|  { return format->sanitize (this); }
_ZNK21hb_sanitize_context_t12check_structIN2OT6Layout9GSUB_impl20SingleSubstFormat1_3INS2_10SmallTypesEEEEEbPKT_:
  389|      1|  {
  390|      1|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      1|    else
  393|      1|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      1|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      1|  }
_ZN21hb_sanitize_context_t12may_dispatchIN2OT6Layout9GSUB_impl14AlternateSubstENS1_7IntTypeItLj2EEEEEbPKT_PKT0_:
  137|     21|  { return format->sanitize (this); }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_6Layout9GSUB_impl12AlternateSetINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|     21|  {
  348|     21|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 21]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     21|    else
  354|     21|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     21|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     21|    return this->check_range (base, len);
  356|     21|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GSUB_impl12AlternateSetINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|  13.9k|  {
  390|  13.9k|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|  13.9k|    else
  393|  13.9k|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|  13.9k|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|  13.9k|  }
_ZN21hb_sanitize_context_t12may_dispatchIN2OT6Layout9GSUB_impl13LigatureSubstENS1_7IntTypeItLj2EEEEEbPKT_PKT0_:
  137|      2|  { return format->sanitize (this); }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_6Layout9GSUB_impl11LigatureSetINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|      2|  {
  348|      2|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 2]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|      2|    else
  354|      2|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      2|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      2|    return this->check_range (base, len);
  356|      2|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GSUB_impl11LigatureSetINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      3|  {
  390|      3|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      3|    else
  393|      3|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      3|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      3|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_6Layout9GSUB_impl8LigatureINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|      3|  {
  348|      3|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 3]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|      3|    else
  354|      3|      len = len * hb_static_size (T);
  ------------------
  |  |   91|      3|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|      3|    return this->check_range (base, len);
  356|      3|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GSUB_impl8LigatureINS3_10SmallTypesEEENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|      9|  {
  390|      9|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|      9|    else
  393|      9|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|      9|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|      9|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_16List16OfOffsetToINS1_6Layout9GSUB_impl11SubstLookupENS1_7IntTypeItLj2EEEEES8_Lb1EEEEEbPKT_:
  389|     11|  {
  390|     11|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     11|    else
  393|     11|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     11|  }
_ZNK21hb_sanitize_context_t17check_array_sizedIN2OT8OffsetToINS1_6Layout9GSUB_impl11SubstLookupENS1_7IntTypeItLj2EEELb1EEEEEbPKT_jj:
  347|     11|  {
  348|     11|    if (len_size >= 4)
  ------------------
  |  Branch (348:9): [True: 0, False: 11]
  ------------------
  349|      0|    {
  350|      0|      if (unlikely (hb_unsigned_mul_overflows (len, hb_static_size (T), &len)))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  351|      0|	return false;
  352|      0|    }
  353|     11|    else
  354|     11|      len = len * hb_static_size (T);
  ------------------
  |  |   91|     11|#define hb_static_size(T) hb_static_size<T>::value
  ------------------
  355|     11|    return this->check_range (base, len);
  356|     11|  }
_ZNK21hb_sanitize_context_t12check_structIN2OT8OffsetToINS1_6Layout9GSUB_impl11SubstLookupENS1_7IntTypeItLj2EEELb1EEEEEbPKT_:
  389|     38|  {
  390|     38|    if (sizeof (uintptr_t) == sizeof (uint32_t))
  ------------------
  |  Branch (390:9): [Folded - Ignored]
  ------------------
  391|      0|      return likely (this->check_range_fast (obj, obj->min_size));
  ------------------
  |  |  259|      0|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  392|     38|    else
  393|     38|      return likely (this->check_point ((const char *) obj + obj->min_size));
  ------------------
  |  |  259|     38|#define likely(expr) __builtin_expect (bool(expr), 1)
  ------------------
  394|     38|  }
_ZN21hb_sanitize_context_t15reference_tableIN2OT6Layout4GSUBEEEP9hb_blob_tPK9hb_face_tj:
  494|     11|  {
  495|     11|    if (!num_glyphs_set)
  ------------------
  |  Branch (495:9): [True: 11, False: 0]
  ------------------
  496|     11|      set_num_glyphs (hb_face_get_glyph_count (face));
  497|     11|    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
  498|     11|  }
_ZN21hb_sanitize_context_t13sanitize_blobIN2OT6Layout4GSUBEEEP9hb_blob_tS5_:
  427|     11|  {
  428|     11|    bool sane;
  429|       |
  430|     11|    init (blob);
  431|       |
  432|     11|  retry:
  433|     11|    DEBUG_MSG_FUNC (SANITIZE, start, "start");
  ------------------
  |  |  233|     11|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  434|       |
  435|     11|    start_processing ();
  436|       |
  437|     11|    if (unlikely (!start))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  438|      0|    {
  439|      0|      end_processing ();
  440|      0|      return blob;
  441|      0|    }
  442|       |
  443|     11|    Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
  444|       |
  445|     11|    sane = t->sanitize (this);
  446|     11|    if (sane)
  ------------------
  |  Branch (446:9): [True: 11, False: 0]
  ------------------
  447|     11|    {
  448|     11|      if (edit_count)
  ------------------
  |  Branch (448:11): [True: 0, False: 11]
  ------------------
  449|      0|      {
  450|      0|	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  451|       |
  452|       |	/* sanitize again to ensure no toe-stepping */
  453|      0|	edit_count = 0;
  454|      0|	sane = t->sanitize (this);
  455|      0|	if (edit_count) {
  ------------------
  |  Branch (455:6): [True: 0, False: 0]
  ------------------
  456|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  457|      0|	  sane = false;
  458|      0|	}
  459|      0|      }
  460|     11|    }
  461|      0|    else
  462|      0|    {
  463|      0|      if (edit_count && !writable) {
  ------------------
  |  Branch (463:11): [True: 0, False: 0]
  |  Branch (463:25): [True: 0, False: 0]
  ------------------
  464|      0|	start = hb_blob_get_data_writable (blob, nullptr);
  465|      0|	end = start + blob->length;
  466|       |
  467|      0|	if (start)
  ------------------
  |  Branch (467:6): [True: 0, False: 0]
  ------------------
  468|      0|	{
  469|      0|	  writable = true;
  470|       |	  /* ok, we made it writable by relocating.  try again */
  471|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  472|      0|	  goto retry;
  473|      0|	}
  474|      0|      }
  475|      0|    }
  476|       |
  477|     11|    end_processing ();
  478|       |
  479|     11|    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
  ------------------
  |  |  233|     22|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (233:111): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  480|     11|    if (sane)
  ------------------
  |  Branch (480:9): [True: 11, False: 0]
  ------------------
  481|     11|    {
  482|     11|      hb_blob_make_immutable (blob);
  483|     11|      return blob;
  484|     11|    }
  485|      0|    else
  486|      0|    {
  487|      0|      hb_blob_destroy (blob);
  488|      0|      return hb_blob_get_empty ();
  489|      0|    }
  490|     11|  }
_ZN21hb_sanitize_context_t15reference_tableIN3AAT4morxEEEP9hb_blob_tPK9hb_face_tj:
  494|     11|  {
  495|     11|    if (!num_glyphs_set)
  ------------------
  |  Branch (495:9): [True: 11, False: 0]
  ------------------
  496|     11|      set_num_glyphs (hb_face_get_glyph_count (face));
  497|     11|    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
  498|     11|  }
_ZN21hb_sanitize_context_t13sanitize_blobIN3AAT4morxEEEP9hb_blob_tS4_:
  427|     11|  {
  428|     11|    bool sane;
  429|       |
  430|     11|    init (blob);
  431|       |
  432|     11|  retry:
  433|     11|    DEBUG_MSG_FUNC (SANITIZE, start, "start");
  ------------------
  |  |  233|     11|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  434|       |
  435|     11|    start_processing ();
  436|       |
  437|     11|    if (unlikely (!start))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  438|     11|    {
  439|     11|      end_processing ();
  440|     11|      return blob;
  441|     11|    }
  442|       |
  443|      0|    Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
  444|       |
  445|      0|    sane = t->sanitize (this);
  446|      0|    if (sane)
  ------------------
  |  Branch (446:9): [True: 0, False: 0]
  ------------------
  447|      0|    {
  448|      0|      if (edit_count)
  ------------------
  |  Branch (448:11): [True: 0, False: 0]
  ------------------
  449|      0|      {
  450|      0|	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  451|       |
  452|       |	/* sanitize again to ensure no toe-stepping */
  453|      0|	edit_count = 0;
  454|      0|	sane = t->sanitize (this);
  455|      0|	if (edit_count) {
  ------------------
  |  Branch (455:6): [True: 0, False: 0]
  ------------------
  456|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  457|      0|	  sane = false;
  458|      0|	}
  459|      0|      }
  460|      0|    }
  461|      0|    else
  462|      0|    {
  463|      0|      if (edit_count && !writable) {
  ------------------
  |  Branch (463:11): [True: 0, False: 0]
  |  Branch (463:25): [True: 0, False: 0]
  ------------------
  464|      0|	start = hb_blob_get_data_writable (blob, nullptr);
  465|      0|	end = start + blob->length;
  466|       |
  467|      0|	if (start)
  ------------------
  |  Branch (467:6): [True: 0, False: 0]
  ------------------
  468|      0|	{
  469|      0|	  writable = true;
  470|       |	  /* ok, we made it writable by relocating.  try again */
  471|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  472|      0|	  goto retry;
  473|      0|	}
  474|      0|      }
  475|      0|    }
  476|       |
  477|      0|    end_processing ();
  478|       |
  479|      0|    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (233:111): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  480|      0|    if (sane)
  ------------------
  |  Branch (480:9): [True: 0, False: 0]
  ------------------
  481|      0|    {
  482|      0|      hb_blob_make_immutable (blob);
  483|      0|      return blob;
  484|      0|    }
  485|      0|    else
  486|      0|    {
  487|      0|      hb_blob_destroy (blob);
  488|      0|      return hb_blob_get_empty ();
  489|      0|    }
  490|      0|  }
_ZN21hb_sanitize_context_t15reference_tableIN3AAT4mortEEEP9hb_blob_tPK9hb_face_tj:
  494|     11|  {
  495|     11|    if (!num_glyphs_set)
  ------------------
  |  Branch (495:9): [True: 11, False: 0]
  ------------------
  496|     11|      set_num_glyphs (hb_face_get_glyph_count (face));
  497|     11|    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
  498|     11|  }
_ZN21hb_sanitize_context_t13sanitize_blobIN3AAT4mortEEEP9hb_blob_tS4_:
  427|     11|  {
  428|     11|    bool sane;
  429|       |
  430|     11|    init (blob);
  431|       |
  432|     11|  retry:
  433|     11|    DEBUG_MSG_FUNC (SANITIZE, start, "start");
  ------------------
  |  |  233|     11|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  434|       |
  435|     11|    start_processing ();
  436|       |
  437|     11|    if (unlikely (!start))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  438|     11|    {
  439|     11|      end_processing ();
  440|     11|      return blob;
  441|     11|    }
  442|       |
  443|      0|    Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
  444|       |
  445|      0|    sane = t->sanitize (this);
  446|      0|    if (sane)
  ------------------
  |  Branch (446:9): [True: 0, False: 0]
  ------------------
  447|      0|    {
  448|      0|      if (edit_count)
  ------------------
  |  Branch (448:11): [True: 0, False: 0]
  ------------------
  449|      0|      {
  450|      0|	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  451|       |
  452|       |	/* sanitize again to ensure no toe-stepping */
  453|      0|	edit_count = 0;
  454|      0|	sane = t->sanitize (this);
  455|      0|	if (edit_count) {
  ------------------
  |  Branch (455:6): [True: 0, False: 0]
  ------------------
  456|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  457|      0|	  sane = false;
  458|      0|	}
  459|      0|      }
  460|      0|    }
  461|      0|    else
  462|      0|    {
  463|      0|      if (edit_count && !writable) {
  ------------------
  |  Branch (463:11): [True: 0, False: 0]
  |  Branch (463:25): [True: 0, False: 0]
  ------------------
  464|      0|	start = hb_blob_get_data_writable (blob, nullptr);
  465|      0|	end = start + blob->length;
  466|       |
  467|      0|	if (start)
  ------------------
  |  Branch (467:6): [True: 0, False: 0]
  ------------------
  468|      0|	{
  469|      0|	  writable = true;
  470|       |	  /* ok, we made it writable by relocating.  try again */
  471|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  472|      0|	  goto retry;
  473|      0|	}
  474|      0|      }
  475|      0|    }
  476|       |
  477|      0|    end_processing ();
  478|       |
  479|      0|    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (233:111): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  480|      0|    if (sane)
  ------------------
  |  Branch (480:9): [True: 0, False: 0]
  ------------------
  481|      0|    {
  482|      0|      hb_blob_make_immutable (blob);
  483|      0|      return blob;
  484|      0|    }
  485|      0|    else
  486|      0|    {
  487|      0|      hb_blob_destroy (blob);
  488|      0|      return hb_blob_get_empty ();
  489|      0|    }
  490|      0|  }
_ZN21hb_sanitize_context_t15reference_tableIN3AAT4kerxEEEP9hb_blob_tPK9hb_face_tj:
  494|     11|  {
  495|     11|    if (!num_glyphs_set)
  ------------------
  |  Branch (495:9): [True: 11, False: 0]
  ------------------
  496|     11|      set_num_glyphs (hb_face_get_glyph_count (face));
  497|     11|    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
  498|     11|  }
_ZN21hb_sanitize_context_t13sanitize_blobIN3AAT4kerxEEEP9hb_blob_tS4_:
  427|     11|  {
  428|     11|    bool sane;
  429|       |
  430|     11|    init (blob);
  431|       |
  432|     11|  retry:
  433|     11|    DEBUG_MSG_FUNC (SANITIZE, start, "start");
  ------------------
  |  |  233|     11|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  434|       |
  435|     11|    start_processing ();
  436|       |
  437|     11|    if (unlikely (!start))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  438|     11|    {
  439|     11|      end_processing ();
  440|     11|      return blob;
  441|     11|    }
  442|       |
  443|      0|    Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
  444|       |
  445|      0|    sane = t->sanitize (this);
  446|      0|    if (sane)
  ------------------
  |  Branch (446:9): [True: 0, False: 0]
  ------------------
  447|      0|    {
  448|      0|      if (edit_count)
  ------------------
  |  Branch (448:11): [True: 0, False: 0]
  ------------------
  449|      0|      {
  450|      0|	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  451|       |
  452|       |	/* sanitize again to ensure no toe-stepping */
  453|      0|	edit_count = 0;
  454|      0|	sane = t->sanitize (this);
  455|      0|	if (edit_count) {
  ------------------
  |  Branch (455:6): [True: 0, False: 0]
  ------------------
  456|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  457|      0|	  sane = false;
  458|      0|	}
  459|      0|      }
  460|      0|    }
  461|      0|    else
  462|      0|    {
  463|      0|      if (edit_count && !writable) {
  ------------------
  |  Branch (463:11): [True: 0, False: 0]
  |  Branch (463:25): [True: 0, False: 0]
  ------------------
  464|      0|	start = hb_blob_get_data_writable (blob, nullptr);
  465|      0|	end = start + blob->length;
  466|       |
  467|      0|	if (start)
  ------------------
  |  Branch (467:6): [True: 0, False: 0]
  ------------------
  468|      0|	{
  469|      0|	  writable = true;
  470|       |	  /* ok, we made it writable by relocating.  try again */
  471|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  472|      0|	  goto retry;
  473|      0|	}
  474|      0|      }
  475|      0|    }
  476|       |
  477|      0|    end_processing ();
  478|       |
  479|      0|    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (233:111): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  480|      0|    if (sane)
  ------------------
  |  Branch (480:9): [True: 0, False: 0]
  ------------------
  481|      0|    {
  482|      0|      hb_blob_make_immutable (blob);
  483|      0|      return blob;
  484|      0|    }
  485|      0|    else
  486|      0|    {
  487|      0|      hb_blob_destroy (blob);
  488|      0|      return hb_blob_get_empty ();
  489|      0|    }
  490|      0|  }
_ZN21hb_sanitize_context_t15reference_tableIN3AAT4trakEEEP9hb_blob_tPK9hb_face_tj:
  494|     11|  {
  495|     11|    if (!num_glyphs_set)
  ------------------
  |  Branch (495:9): [True: 11, False: 0]
  ------------------
  496|     11|      set_num_glyphs (hb_face_get_glyph_count (face));
  497|     11|    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
  498|     11|  }
_ZN21hb_sanitize_context_t13sanitize_blobIN3AAT4trakEEEP9hb_blob_tS4_:
  427|     11|  {
  428|     11|    bool sane;
  429|       |
  430|     11|    init (blob);
  431|       |
  432|     11|  retry:
  433|     11|    DEBUG_MSG_FUNC (SANITIZE, start, "start");
  ------------------
  |  |  233|     11|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  434|       |
  435|     11|    start_processing ();
  436|       |
  437|     11|    if (unlikely (!start))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 11, False: 0]
  |  |  ------------------
  ------------------
  438|     11|    {
  439|     11|      end_processing ();
  440|     11|      return blob;
  441|     11|    }
  442|       |
  443|      0|    Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
  444|       |
  445|      0|    sane = t->sanitize (this);
  446|      0|    if (sane)
  ------------------
  |  Branch (446:9): [True: 0, False: 0]
  ------------------
  447|      0|    {
  448|      0|      if (edit_count)
  ------------------
  |  Branch (448:11): [True: 0, False: 0]
  ------------------
  449|      0|      {
  450|      0|	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  451|       |
  452|       |	/* sanitize again to ensure no toe-stepping */
  453|      0|	edit_count = 0;
  454|      0|	sane = t->sanitize (this);
  455|      0|	if (edit_count) {
  ------------------
  |  Branch (455:6): [True: 0, False: 0]
  ------------------
  456|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  457|      0|	  sane = false;
  458|      0|	}
  459|      0|      }
  460|      0|    }
  461|      0|    else
  462|      0|    {
  463|      0|      if (edit_count && !writable) {
  ------------------
  |  Branch (463:11): [True: 0, False: 0]
  |  Branch (463:25): [True: 0, False: 0]
  ------------------
  464|      0|	start = hb_blob_get_data_writable (blob, nullptr);
  465|      0|	end = start + blob->length;
  466|       |
  467|      0|	if (start)
  ------------------
  |  Branch (467:6): [True: 0, False: 0]
  ------------------
  468|      0|	{
  469|      0|	  writable = true;
  470|       |	  /* ok, we made it writable by relocating.  try again */
  471|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  472|      0|	  goto retry;
  473|      0|	}
  474|      0|      }
  475|      0|    }
  476|       |
  477|      0|    end_processing ();
  478|       |
  479|      0|    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (233:111): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  480|      0|    if (sane)
  ------------------
  |  Branch (480:9): [True: 0, False: 0]
  ------------------
  481|      0|    {
  482|      0|      hb_blob_make_immutable (blob);
  483|      0|      return blob;
  484|      0|    }
  485|      0|    else
  486|      0|    {
  487|      0|      hb_blob_destroy (blob);
  488|      0|      return hb_blob_get_empty ();
  489|      0|    }
  490|      0|  }
_ZN25hb_sanitize_with_object_tC2IPKN2OT12KernSubTableINS1_20KernOTSubTableHeaderEEEEEP21hb_sanitize_context_tRKT_:
  518|     40|  { c->set_object (obj); }
_ZN21hb_sanitize_context_t15reference_tableIN2OT4kernEEEP9hb_blob_tPK9hb_face_tj:
  494|     11|  {
  495|     11|    if (!num_glyphs_set)
  ------------------
  |  Branch (495:9): [True: 0, False: 11]
  ------------------
  496|      0|      set_num_glyphs (hb_face_get_glyph_count (face));
  497|     11|    return sanitize_blob<Type> (hb_face_reference_table (face, tableTag));
  498|     11|  }
_ZN21hb_sanitize_context_t13sanitize_blobIN2OT4kernEEEP9hb_blob_tS4_:
  427|     11|  {
  428|     11|    bool sane;
  429|       |
  430|     11|    init (blob);
  431|       |
  432|     11|  retry:
  433|     11|    DEBUG_MSG_FUNC (SANITIZE, start, "start");
  ------------------
  |  |  233|     11|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     11|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  434|       |
  435|     11|    start_processing ();
  436|       |
  437|     11|    if (unlikely (!start))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 10, False: 1]
  |  |  ------------------
  ------------------
  438|     10|    {
  439|     10|      end_processing ();
  440|     10|      return blob;
  441|     10|    }
  442|       |
  443|      1|    Type *t = reinterpret_cast<Type *> (const_cast<char *> (start));
  444|       |
  445|      1|    sane = t->sanitize (this);
  446|      1|    if (sane)
  ------------------
  |  Branch (446:9): [True: 1, False: 0]
  ------------------
  447|      1|    {
  448|      1|      if (edit_count)
  ------------------
  |  Branch (448:11): [True: 0, False: 1]
  ------------------
  449|      0|      {
  450|      0|	DEBUG_MSG_FUNC (SANITIZE, start, "passed first round with %u edits; going for second round", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  451|       |
  452|       |	/* sanitize again to ensure no toe-stepping */
  453|      0|	edit_count = 0;
  454|      0|	sane = t->sanitize (this);
  455|      0|	if (edit_count) {
  ------------------
  |  Branch (455:6): [True: 0, False: 0]
  ------------------
  456|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "requested %u edits in second round; FAILING", edit_count);
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  457|      0|	  sane = false;
  458|      0|	}
  459|      0|      }
  460|      1|    }
  461|      0|    else
  462|      0|    {
  463|      0|      if (edit_count && !writable) {
  ------------------
  |  Branch (463:11): [True: 0, False: 0]
  |  Branch (463:25): [True: 0, False: 0]
  ------------------
  464|      0|	start = hb_blob_get_data_writable (blob, nullptr);
  465|      0|	end = start + blob->length;
  466|       |
  467|      0|	if (start)
  ------------------
  |  Branch (467:6): [True: 0, False: 0]
  ------------------
  468|      0|	{
  469|      0|	  writable = true;
  470|       |	  /* ok, we made it writable by relocating.  try again */
  471|      0|	  DEBUG_MSG_FUNC (SANITIZE, start, "retry");
  ------------------
  |  |  233|      0|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      0|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  472|      0|	  goto retry;
  473|      0|	}
  474|      0|      }
  475|      0|    }
  476|       |
  477|      1|    end_processing ();
  478|       |
  479|      1|    DEBUG_MSG_FUNC (SANITIZE, start, sane ? "PASSED" : "FAILED");
  ------------------
  |  |  233|      2|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|      1|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  |  |  |  Branch (233:111): [True: 1, False: 0]
  |  |  ------------------
  ------------------
  480|      1|    if (sane)
  ------------------
  |  Branch (480:9): [True: 1, False: 0]
  ------------------
  481|      1|    {
  482|      1|      hb_blob_make_immutable (blob);
  483|      1|      return blob;
  484|      1|    }
  485|      0|    else
  486|      0|    {
  487|      0|      hb_blob_destroy (blob);
  488|      0|      return hb_blob_get_empty ();
  489|      0|    }
  490|      1|  }

_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES_IS0_ImLj0EES0_ImLj9EEEE4initEv:
  143|   409k|  {
  144|   409k|    head.init ();
  145|   409k|    tail.init ();
  146|   409k|  }
_ZN28hb_set_digest_bits_pattern_tImLj4EE4initEv:
   83|   409k|  void init () { mask = 0; }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj0EES0_ImLj9EEE4initEv:
  143|   409k|  {
  144|   409k|    head.init ();
  145|   409k|    tail.init ();
  146|   409k|  }
_ZN28hb_set_digest_bits_pattern_tImLj0EE4initEv:
   83|   409k|  void init () { mask = 0; }
_ZN28hb_set_digest_bits_pattern_tImLj9EE4initEv:
   83|   409k|  void init () { mask = 0; }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES_IS0_ImLj0EES0_ImLj9EEEE9add_arrayIjEEvPKT_jj:
  166|   409k|  {
  167|   409k|    head.add_array (array, count, stride);
  168|   409k|    tail.add_array (array, count, stride);
  169|   409k|  }
_ZN28hb_set_digest_bits_pattern_tImLj4EE9add_arrayIjEEvPKT_jj:
  108|   409k|  {
  109|  6.27M|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (109:30): [True: 5.86M, False: 409k]
  ------------------
  110|  5.86M|    {
  111|  5.86M|      add (*array);
  112|  5.86M|      array = &StructAtOffsetUnaligned<T> ((const void *) array, stride);
  113|  5.86M|    }
  114|   409k|  }
_ZN28hb_set_digest_bits_pattern_tImLj4EE3addEj:
   87|  5.86M|  void add (hb_codepoint_t g) { mask |= mask_for (g); }
_ZN28hb_set_digest_bits_pattern_tImLj4EE8mask_forEj:
  135|  5.86M|  { return ((mask_t) 1) << ((g >> shift) & (mask_bits - 1)); }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj0EES0_ImLj9EEE9add_arrayIjEEvPKT_jj:
  166|   409k|  {
  167|   409k|    head.add_array (array, count, stride);
  168|   409k|    tail.add_array (array, count, stride);
  169|   409k|  }
_ZN28hb_set_digest_bits_pattern_tImLj0EE9add_arrayIjEEvPKT_jj:
  108|   409k|  {
  109|  6.27M|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (109:30): [True: 5.86M, False: 409k]
  ------------------
  110|  5.86M|    {
  111|  5.86M|      add (*array);
  112|  5.86M|      array = &StructAtOffsetUnaligned<T> ((const void *) array, stride);
  113|  5.86M|    }
  114|   409k|  }
_ZN28hb_set_digest_bits_pattern_tImLj0EE3addEj:
   87|  5.86M|  void add (hb_codepoint_t g) { mask |= mask_for (g); }
_ZN28hb_set_digest_bits_pattern_tImLj0EE8mask_forEj:
  135|  5.86M|  { return ((mask_t) 1) << ((g >> shift) & (mask_bits - 1)); }
_ZN28hb_set_digest_bits_pattern_tImLj9EE9add_arrayIjEEvPKT_jj:
  108|   409k|  {
  109|  6.27M|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (109:30): [True: 5.86M, False: 409k]
  ------------------
  110|  5.86M|    {
  111|  5.86M|      add (*array);
  112|  5.86M|      array = &StructAtOffsetUnaligned<T> ((const void *) array, stride);
  113|  5.86M|    }
  114|   409k|  }
_ZN28hb_set_digest_bits_pattern_tImLj9EE3addEj:
   87|  5.86M|  void add (hb_codepoint_t g) { mask |= mask_for (g); }
_ZN28hb_set_digest_bits_pattern_tImLj9EE8mask_forEj:
  135|  5.86M|  { return ((mask_t) 1) << ((g >> shift) & (mask_bits - 1)); }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES_IS0_ImLj0EES0_ImLj9EEEE16add_sorted_arrayIN2OT11HBGlyphID16EEEbRK17hb_sorted_array_tIKT_E:
  179|      3|  bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES_IS0_ImLj0EES0_ImLj9EEEE16add_sorted_arrayIN2OT11HBGlyphID16EEEbPKT_jj:
  174|      3|  {
  175|      3|    return head.add_sorted_array (array, count, stride) &&
  ------------------
  |  Branch (175:12): [True: 3, False: 0]
  ------------------
  176|      3|	   tail.add_sorted_array (array, count, stride);
  ------------------
  |  Branch (176:5): [True: 3, False: 0]
  ------------------
  177|      3|  }
_ZN28hb_set_digest_bits_pattern_tImLj4EE16add_sorted_arrayIN2OT11HBGlyphID16EEEbPKT_jj:
  119|      3|  {
  120|      3|    add_array (array, count, stride);
  121|      3|    return true;
  122|      3|  }
_ZN28hb_set_digest_bits_pattern_tImLj4EE9add_arrayIN2OT11HBGlyphID16EEEvPKT_jj:
  108|      3|  {
  109|      7|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (109:30): [True: 4, False: 3]
  ------------------
  110|      4|    {
  111|      4|      add (*array);
  112|      4|      array = &StructAtOffsetUnaligned<T> ((const void *) array, stride);
  113|      4|    }
  114|      3|  }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj0EES0_ImLj9EEE16add_sorted_arrayIN2OT11HBGlyphID16EEEbPKT_jj:
  174|      3|  {
  175|      3|    return head.add_sorted_array (array, count, stride) &&
  ------------------
  |  Branch (175:12): [True: 3, False: 0]
  ------------------
  176|      3|	   tail.add_sorted_array (array, count, stride);
  ------------------
  |  Branch (176:5): [True: 3, False: 0]
  ------------------
  177|      3|  }
_ZN28hb_set_digest_bits_pattern_tImLj0EE16add_sorted_arrayIN2OT11HBGlyphID16EEEbPKT_jj:
  119|      3|  {
  120|      3|    add_array (array, count, stride);
  121|      3|    return true;
  122|      3|  }
_ZN28hb_set_digest_bits_pattern_tImLj0EE9add_arrayIN2OT11HBGlyphID16EEEvPKT_jj:
  108|      3|  {
  109|      7|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (109:30): [True: 4, False: 3]
  ------------------
  110|      4|    {
  111|      4|      add (*array);
  112|      4|      array = &StructAtOffsetUnaligned<T> ((const void *) array, stride);
  113|      4|    }
  114|      3|  }
_ZN28hb_set_digest_bits_pattern_tImLj9EE16add_sorted_arrayIN2OT11HBGlyphID16EEEbPKT_jj:
  119|      3|  {
  120|      3|    add_array (array, count, stride);
  121|      3|    return true;
  122|      3|  }
_ZN28hb_set_digest_bits_pattern_tImLj9EE9add_arrayIN2OT11HBGlyphID16EEEvPKT_jj:
  108|      3|  {
  109|      7|    for (unsigned int i = 0; i < count; i++)
  ------------------
  |  Branch (109:30): [True: 4, False: 3]
  ------------------
  110|      4|    {
  111|      4|      add (*array);
  112|      4|      array = &StructAtOffsetUnaligned<T> ((const void *) array, stride);
  113|      4|    }
  114|      3|  }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES_IS0_ImLj0EES0_ImLj9EEEE9add_rangeEjj:
  161|     24|  {
  162|     24|    return (int) head.add_range (a, b) | (int) tail.add_range (a, b);
  163|     24|  }
_ZN28hb_set_digest_bits_pattern_tImLj4EE9add_rangeEjj:
   90|     24|  {
   91|     24|    if (mask == (mask_t) -1) return false;
  ------------------
  |  Branch (91:9): [True: 0, False: 24]
  ------------------
   92|     24|    if ((b >> shift) - (a >> shift) >= mask_bits - 1)
  ------------------
  |  Branch (92:9): [True: 0, False: 24]
  ------------------
   93|      0|    {
   94|      0|      mask = (mask_t) -1;
   95|      0|      return false;
   96|      0|    }
   97|     24|    else
   98|     24|    {
   99|     24|      mask_t ma = mask_for (a);
  100|     24|      mask_t mb = mask_for (b);
  101|     24|      mask |= mb + (mb - ma) - (mb < ma);
  102|     24|      return true;
  103|     24|    }
  104|     24|  }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj0EES0_ImLj9EEE9add_rangeEjj:
  161|     24|  {
  162|     24|    return (int) head.add_range (a, b) | (int) tail.add_range (a, b);
  163|     24|  }
_ZN28hb_set_digest_bits_pattern_tImLj0EE9add_rangeEjj:
   90|     24|  {
   91|     24|    if (mask == (mask_t) -1) return false;
  ------------------
  |  Branch (91:9): [True: 0, False: 24]
  ------------------
   92|     24|    if ((b >> shift) - (a >> shift) >= mask_bits - 1)
  ------------------
  |  Branch (92:9): [True: 0, False: 24]
  ------------------
   93|      0|    {
   94|      0|      mask = (mask_t) -1;
   95|      0|      return false;
   96|      0|    }
   97|     24|    else
   98|     24|    {
   99|     24|      mask_t ma = mask_for (a);
  100|     24|      mask_t mb = mask_for (b);
  101|     24|      mask |= mb + (mb - ma) - (mb < ma);
  102|     24|      return true;
  103|     24|    }
  104|     24|  }
_ZN28hb_set_digest_bits_pattern_tImLj9EE9add_rangeEjj:
   90|     24|  {
   91|     24|    if (mask == (mask_t) -1) return false;
  ------------------
  |  Branch (91:9): [True: 0, False: 24]
  ------------------
   92|     24|    if ((b >> shift) - (a >> shift) >= mask_bits - 1)
  ------------------
  |  Branch (92:9): [True: 0, False: 24]
  ------------------
   93|      0|    {
   94|      0|      mask = (mask_t) -1;
   95|      0|      return false;
   96|      0|    }
   97|     24|    else
   98|     24|    {
   99|     24|      mask_t ma = mask_for (a);
  100|     24|      mask_t mb = mask_for (b);
  101|     24|      mask |= mb + (mb - ma) - (mb < ma);
  102|     24|      return true;
  103|     24|    }
  104|     24|  }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES_IS0_ImLj0EES0_ImLj9EEEE3addERKS5_:
  149|      8|  {
  150|      8|    head.add (o.head);
  151|      8|    tail.add (o.tail);
  152|      8|  }
_ZN28hb_set_digest_bits_pattern_tImLj4EE3addERKS0_:
   85|      8|  void add (const hb_set_digest_bits_pattern_t &o) { mask |= o.mask; }
_ZN24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj0EES0_ImLj9EEE3addERKS3_:
  149|      8|  {
  150|      8|    head.add (o.head);
  151|      8|    tail.add (o.tail);
  152|      8|  }
_ZN28hb_set_digest_bits_pattern_tImLj0EE3addERKS0_:
   85|      8|  void add (const hb_set_digest_bits_pattern_t &o) { mask |= o.mask; }
_ZN28hb_set_digest_bits_pattern_tImLj9EE3addERKS0_:
   85|      8|  void add (const hb_set_digest_bits_pattern_t &o) { mask |= o.mask; }
_ZNK24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES_IS0_ImLj0EES0_ImLj9EEEE8may_haveERKS5_:
  182|     45|  {
  183|     45|    return head.may_have (o.head) && tail.may_have (o.tail);
  ------------------
  |  Branch (183:12): [True: 0, False: 45]
  |  Branch (183:38): [True: 0, False: 0]
  ------------------
  184|     45|  }
_ZNK28hb_set_digest_bits_pattern_tImLj4EE8may_haveERKS0_:
  127|     45|  { return mask & o.mask; }

_ZN19hb_shape_plan_key_t4initEbP9hb_face_tPK23hb_segment_properties_tPK12hb_feature_tjPKijPKPKc:
   69|   204k|{
   70|   204k|  hb_feature_t *features = nullptr;
   71|   204k|  if (copy && num_user_features && !(features = (hb_feature_t *) hb_calloc (num_user_features, sizeof (hb_feature_t))))
  ------------------
  |  |  235|     13|#define hb_calloc hb_calloc_impl
  ------------------
  |  Branch (71:7): [True: 13, False: 204k]
  |  Branch (71:15): [True: 13, False: 0]
  |  Branch (71:36): [True: 0, False: 13]
  ------------------
   72|      0|    goto bail;
   73|       |
   74|   204k|  this->props = *props;
   75|   204k|  this->num_user_features = num_user_features;
   76|   204k|  this->user_features = copy ? features : user_features;
  ------------------
  |  Branch (76:25): [True: 13, False: 204k]
  ------------------
   77|   204k|  if (copy && num_user_features)
  ------------------
  |  Branch (77:7): [True: 13, False: 204k]
  |  Branch (77:15): [True: 13, False: 0]
  ------------------
   78|     13|  {
   79|     13|    hb_memcpy (features, user_features, num_user_features * sizeof (hb_feature_t));
   80|       |    /* Make start/end uniform to easier catch bugs. */
   81|     78|    for (unsigned int i = 0; i < num_user_features; i++)
  ------------------
  |  Branch (81:30): [True: 65, False: 13]
  ------------------
   82|     65|    {
   83|     65|      if (features[0].start != HB_FEATURE_GLOBAL_START)
  ------------------
  |  |  805|     65|#define HB_FEATURE_GLOBAL_START	0
  ------------------
  |  Branch (83:11): [True: 0, False: 65]
  ------------------
   84|      0|	features[0].start = 1;
   85|     65|      if (features[0].end   != HB_FEATURE_GLOBAL_END)
  ------------------
  |  |  815|     65|#define HB_FEATURE_GLOBAL_END	((unsigned int) -1)
  ------------------
  |  Branch (85:11): [True: 0, False: 65]
  ------------------
   86|      0|	features[0].end   = 2;
   87|     65|    }
   88|     13|  }
   89|   204k|  this->shaper_func = nullptr;
   90|   204k|  this->shaper_name = nullptr;
   91|   204k|#ifndef HB_NO_OT_SHAPE
   92|   204k|  this->ot.init (face, coords, num_coords);
   93|   204k|#endif
   94|       |
   95|       |  /*
   96|       |   * Choose shaper.
   97|       |   */
   98|       |
   99|   204k|#define HB_SHAPER_PLAN(shaper) \
  100|   204k|	HB_STMT_START { \
  101|   204k|	  if (face->data.shaper) \
  102|   204k|	  { \
  103|   204k|	    this->shaper_func = _hb_##shaper##_shape; \
  104|   204k|	    this->shaper_name = #shaper; \
  105|   204k|	    return true; \
  106|   204k|	  } \
  107|   204k|	} HB_STMT_END
  108|       |
  109|   204k|  if (unlikely (shaper_list))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  110|      0|  {
  111|      0|    for (; *shaper_list; shaper_list++)
  ------------------
  |  Branch (111:12): [True: 0, False: 0]
  ------------------
  112|      0|      if (false)
  ------------------
  |  Branch (112:11): [Folded - Ignored]
  ------------------
  113|      0|	;
  114|      0|#define HB_SHAPER_IMPLEMENT(shaper) \
  115|      0|      else if (0 == strcmp (*shaper_list, #shaper)) \
  116|      0|	HB_SHAPER_PLAN (shaper);
  117|      0|#include "hb-shaper-list.hh"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright © 2012  Google, Inc.
  |  |    3|       | *
  |  |    4|       | *  This is part of HarfBuzz, a text shaping 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|       | * Google Author(s): Behdad Esfahbod
  |  |   25|       | */
  |  |   26|       |
  |  |   27|       |#ifndef HB_SHAPER_LIST_HH
  |  |   28|       |#define HB_SHAPER_LIST_HH
  |  |   29|       |#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
  |  |   30|       |
  |  |   31|      0|#ifndef HB_NO_SHAPER
  |  |   32|       |
  |  |   33|       |
  |  |   34|       |/* v--- Add new shapers in the right place here. */
  |  |   35|       |
  |  |   36|       |#ifdef HAVE_WASM
  |  |   37|       |/* Only picks up fonts that have a "Wasm" table. */
  |  |   38|       |HB_SHAPER_IMPLEMENT (wasm)
  |  |   39|       |#endif
  |  |   40|       |
  |  |   41|       |#ifdef HAVE_GRAPHITE2
  |  |   42|       |/* Only picks up fonts that have a "Silf" table. */
  |  |   43|       |HB_SHAPER_IMPLEMENT (graphite2)
  |  |   44|       |#endif
  |  |   45|       |
  |  |   46|      0|#ifndef HB_NO_OT_SHAPE
  |  |   47|      0|HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main shaper. */
  |  |  ------------------
  |  |  |  |  115|      0|      else if (0 == strcmp (*shaper_list, #shaper)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (115:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  116|      0|	HB_SHAPER_PLAN (shaper);
  |  |  |  |  ------------------
  |  |  |  |  |  |  100|      0|	HB_STMT_START { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  432|      0|#define HB_STMT_START do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  101|      0|	  if (face->data.shaper) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (101:8): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  102|      0|	  { \
  |  |  |  |  |  |  103|      0|	    this->shaper_func = _hb_##shaper##_shape; \
  |  |  |  |  |  |  104|      0|	    this->shaper_name = #shaper; \
  |  |  |  |  |  |  105|      0|	    return true; \
  |  |  |  |  |  |  106|      0|	  } \
  |  |  |  |  |  |  107|      0|	} HB_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  433|      0|#define HB_STMT_END   while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (433:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   48|      0|#endif
  |  |   49|       |
  |  |   50|       |#ifdef HAVE_UNISCRIBE
  |  |   51|       |HB_SHAPER_IMPLEMENT (uniscribe)
  |  |   52|       |#endif
  |  |   53|       |#ifdef HAVE_DIRECTWRITE
  |  |   54|       |HB_SHAPER_IMPLEMENT (directwrite)
  |  |   55|       |#endif
  |  |   56|       |#ifdef HAVE_CORETEXT
  |  |   57|       |HB_SHAPER_IMPLEMENT (coretext)
  |  |   58|       |#endif
  |  |   59|       |
  |  |   60|      0|#ifndef HB_NO_FALLBACK_SHAPE
  |  |   61|      0|HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
  |  |  ------------------
  |  |  |  |  115|      0|      else if (0 == strcmp (*shaper_list, #shaper)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (115:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  116|      0|	HB_SHAPER_PLAN (shaper);
  |  |  |  |  ------------------
  |  |  |  |  |  |  100|      0|	HB_STMT_START { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  432|      0|#define HB_STMT_START do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  101|      0|	  if (face->data.shaper) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (101:8): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  102|      0|	  { \
  |  |  |  |  |  |  103|      0|	    this->shaper_func = _hb_##shaper##_shape; \
  |  |  |  |  |  |  104|      0|	    this->shaper_name = #shaper; \
  |  |  |  |  |  |  105|      0|	    return true; \
  |  |  |  |  |  |  106|      0|	  } \
  |  |  |  |  |  |  107|      0|	} HB_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  433|      0|#define HB_STMT_END   while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (433:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   62|      0|#endif
  |  |   63|       |
  |  |   64|       |
  |  |   65|      0|#endif
  ------------------
  118|      0|#undef HB_SHAPER_IMPLEMENT
  119|      0|  }
  120|   204k|  else
  121|   204k|  {
  122|   204k|    const HB_UNUSED hb_shaper_entry_t *shapers = _hb_shapers_get ();
  123|   204k|    for (unsigned int i = 0; i < HB_SHAPERS_COUNT; i++)
  ------------------
  |  Branch (123:30): [True: 204k, False: 0]
  ------------------
  124|   204k|      if (false)
  ------------------
  |  Branch (124:11): [Folded - Ignored]
  ------------------
  125|      0|	;
  126|   204k|#define HB_SHAPER_IMPLEMENT(shaper) \
  127|   204k|      else if (shapers[i].func == _hb_##shaper##_shape) \
  128|   204k|	HB_SHAPER_PLAN (shaper);
  129|   204k|#include "hb-shaper-list.hh"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright © 2012  Google, Inc.
  |  |    3|       | *
  |  |    4|       | *  This is part of HarfBuzz, a text shaping 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|       | * Google Author(s): Behdad Esfahbod
  |  |   25|       | */
  |  |   26|       |
  |  |   27|       |#ifndef HB_SHAPER_LIST_HH
  |  |   28|       |#define HB_SHAPER_LIST_HH
  |  |   29|       |#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
  |  |   30|       |
  |  |   31|   204k|#ifndef HB_NO_SHAPER
  |  |   32|       |
  |  |   33|       |
  |  |   34|       |/* v--- Add new shapers in the right place here. */
  |  |   35|       |
  |  |   36|       |#ifdef HAVE_WASM
  |  |   37|       |/* Only picks up fonts that have a "Wasm" table. */
  |  |   38|       |HB_SHAPER_IMPLEMENT (wasm)
  |  |   39|       |#endif
  |  |   40|       |
  |  |   41|       |#ifdef HAVE_GRAPHITE2
  |  |   42|       |/* Only picks up fonts that have a "Silf" table. */
  |  |   43|       |HB_SHAPER_IMPLEMENT (graphite2)
  |  |   44|       |#endif
  |  |   45|       |
  |  |   46|   204k|#ifndef HB_NO_OT_SHAPE
  |  |   47|   204k|HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main shaper. */
  |  |  ------------------
  |  |  |  |  127|   204k|      else if (shapers[i].func == _hb_##shaper##_shape) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (127:16): [True: 204k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  128|   204k|	HB_SHAPER_PLAN (shaper);
  |  |  |  |  ------------------
  |  |  |  |  |  |  100|   204k|	HB_STMT_START { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  432|   204k|#define HB_STMT_START do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  101|   204k|	  if (face->data.shaper) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (101:8): [True: 204k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  102|   204k|	  { \
  |  |  |  |  |  |  103|   204k|	    this->shaper_func = _hb_##shaper##_shape; \
  |  |  |  |  |  |  104|   204k|	    this->shaper_name = #shaper; \
  |  |  |  |  |  |  105|   204k|	    return true; \
  |  |  |  |  |  |  106|   204k|	  } \
  |  |  |  |  |  |  107|   204k|	} HB_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  433|   204k|#define HB_STMT_END   while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (433:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   48|      0|#endif
  |  |   49|       |
  |  |   50|       |#ifdef HAVE_UNISCRIBE
  |  |   51|       |HB_SHAPER_IMPLEMENT (uniscribe)
  |  |   52|       |#endif
  |  |   53|       |#ifdef HAVE_DIRECTWRITE
  |  |   54|       |HB_SHAPER_IMPLEMENT (directwrite)
  |  |   55|       |#endif
  |  |   56|       |#ifdef HAVE_CORETEXT
  |  |   57|       |HB_SHAPER_IMPLEMENT (coretext)
  |  |   58|       |#endif
  |  |   59|       |
  |  |   60|      0|#ifndef HB_NO_FALLBACK_SHAPE
  |  |   61|   204k|HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
  |  |  ------------------
  |  |  |  |  127|   204k|      else if (shapers[i].func == _hb_##shaper##_shape) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (127:16): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  128|      0|	HB_SHAPER_PLAN (shaper);
  |  |  |  |  ------------------
  |  |  |  |  |  |  100|      0|	HB_STMT_START { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  432|      0|#define HB_STMT_START do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  101|      0|	  if (face->data.shaper) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (101:8): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  102|      0|	  { \
  |  |  |  |  |  |  103|      0|	    this->shaper_func = _hb_##shaper##_shape; \
  |  |  |  |  |  |  104|      0|	    this->shaper_name = #shaper; \
  |  |  |  |  |  |  105|      0|	    return true; \
  |  |  |  |  |  |  106|      0|	  } \
  |  |  |  |  |  |  107|      0|	} HB_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  433|      0|#define HB_STMT_END   while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (433:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   62|   204k|#endif
  |  |   63|       |
  |  |   64|       |
  |  |   65|   204k|#endif
  ------------------
  130|   204k|#undef HB_SHAPER_IMPLEMENT
  131|   204k|  }
  132|      0|#undef HB_SHAPER_PLAN
  133|       |
  134|      0|bail:
  135|      0|  ::hb_free (features);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  136|      0|  return false;
  137|   204k|}
_ZN19hb_shape_plan_key_t19user_features_matchEPKS_:
  141|   204k|{
  142|   204k|  if (this->num_user_features != other->num_user_features)
  ------------------
  |  Branch (142:7): [True: 0, False: 204k]
  ------------------
  143|      0|    return false;
  144|  1.22M|  for (unsigned int i = 0; i < num_user_features; i++)
  ------------------
  |  Branch (144:28): [True: 1.02M, False: 204k]
  ------------------
  145|  1.02M|  {
  146|  1.02M|    if (this->user_features[i].tag   != other->user_features[i].tag   ||
  ------------------
  |  Branch (146:9): [True: 0, False: 1.02M]
  ------------------
  147|  1.02M|	this->user_features[i].value != other->user_features[i].value ||
  ------------------
  |  Branch (147:2): [True: 0, False: 1.02M]
  ------------------
  148|  1.02M|	(this->user_features[i].start == HB_FEATURE_GLOBAL_START &&
  ------------------
  |  |  805|  2.04M|#define HB_FEATURE_GLOBAL_START	0
  ------------------
  |  Branch (148:2): [True: 0, False: 1.02M]
  |  Branch (148:3): [True: 1.02M, False: 0]
  ------------------
  149|  1.02M|	 this->user_features[i].end   == HB_FEATURE_GLOBAL_END) !=
  ------------------
  |  |  815|  1.02M|#define HB_FEATURE_GLOBAL_END	((unsigned int) -1)
  ------------------
  |  Branch (149:3): [True: 1.02M, False: 0]
  ------------------
  150|  1.02M|	(other->user_features[i].start == HB_FEATURE_GLOBAL_START &&
  ------------------
  |  |  805|  2.04M|#define HB_FEATURE_GLOBAL_START	0
  ------------------
  |  Branch (150:3): [True: 1.02M, False: 0]
  ------------------
  151|  1.02M|	 other->user_features[i].end   == HB_FEATURE_GLOBAL_END))
  ------------------
  |  |  815|  1.02M|#define HB_FEATURE_GLOBAL_END	((unsigned int) -1)
  ------------------
  |  Branch (151:3): [True: 1.02M, False: 0]
  ------------------
  152|      0|      return false;
  153|  1.02M|  }
  154|   204k|  return true;
  155|   204k|}
_ZN19hb_shape_plan_key_t5equalEPKS_:
  159|   307k|{
  160|   307k|  return hb_segment_properties_equal (&this->props, &other->props) &&
  ------------------
  |  Branch (160:10): [True: 204k, False: 102k]
  ------------------
  161|   307k|	 this->user_features_match (other) &&
  ------------------
  |  Branch (161:3): [True: 204k, False: 0]
  ------------------
  162|   307k|#ifndef HB_NO_OT_SHAPE
  163|   307k|	 this->ot.equal (&other->ot) &&
  ------------------
  |  Branch (163:3): [True: 204k, False: 0]
  ------------------
  164|   307k|#endif
  165|   307k|	 this->shaper_func == other->shaper_func;
  ------------------
  |  Branch (165:3): [True: 204k, False: 0]
  ------------------
  166|   307k|}
hb_shape_plan_create2:
  228|     13|{
  229|     13|  DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr,
  ------------------
  |  |  233|     13|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     13|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  230|     13|		  "face=%p num_features=%u num_coords=%u shaper_list=%p",
  231|     13|		  face,
  232|     13|		  num_user_features,
  233|     13|		  num_coords,
  234|     13|		  shaper_list);
  235|       |
  236|     13|  if (unlikely (props->direction == HB_DIRECTION_INVALID))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  237|      0|    return hb_shape_plan_get_empty ();
  238|       |
  239|     13|  hb_shape_plan_t *shape_plan;
  240|       |
  241|     13|  if (unlikely (!props))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  242|      0|    goto bail;
  243|     13|  if (!(shape_plan = hb_object_create<hb_shape_plan_t> ()))
  ------------------
  |  Branch (243:7): [True: 0, False: 13]
  ------------------
  244|      0|    goto bail;
  245|       |
  246|     13|  if (unlikely (!face))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  247|      0|    face = hb_face_get_empty ();
  248|     13|  hb_face_make_immutable (face);
  249|     13|  shape_plan->face_unsafe = face;
  250|       |
  251|     13|  if (unlikely (!shape_plan->key.init (true,
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  252|     13|				       face,
  253|     13|				       props,
  254|     13|				       user_features,
  255|     13|				       num_user_features,
  256|     13|				       coords,
  257|     13|				       num_coords,
  258|     13|				       shaper_list)))
  259|      0|    goto bail2;
  260|     13|#ifndef HB_NO_OT_SHAPE
  261|     13|  if (unlikely (!shape_plan->ot.init0 (face, &shape_plan->key)))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  262|      0|    goto bail3;
  263|     13|#endif
  264|       |
  265|     13|  return shape_plan;
  266|       |
  267|      0|#ifndef HB_NO_OT_SHAPE
  268|      0|bail3:
  269|      0|#endif
  270|      0|  shape_plan->key.fini ();
  271|      0|bail2:
  272|      0|  hb_free (shape_plan);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  273|      0|bail:
  274|      0|  return hb_shape_plan_get_empty ();
  275|      0|}
hb_shape_plan_reference:
  304|   204k|{
  305|   204k|  return hb_object_reference (shape_plan);
  306|   204k|}
hb_shape_plan_destroy:
  320|   204k|{
  321|   204k|  if (!hb_object_destroy (shape_plan)) return;
  ------------------
  |  Branch (321:7): [True: 204k, False: 13]
  ------------------
  322|       |
  323|     13|  hb_free (shape_plan);
  ------------------
  |  |  237|     13|#define hb_free hb_free_impl
  ------------------
  324|     13|}
hb_shape_plan_execute:
  451|   204k|{
  452|   204k|  bool ret = _hb_shape_plan_execute_internal (shape_plan, font, buffer,
  453|   204k|					      features, num_features);
  454|       |
  455|   204k|  if (ret && buffer->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE)
  ------------------
  |  Branch (455:7): [True: 204k, False: 0]
  |  Branch (455:14): [True: 0, False: 204k]
  ------------------
  456|      0|    buffer->content_type = HB_BUFFER_CONTENT_TYPE_GLYPHS;
  457|       |
  458|   204k|  return ret;
  459|   204k|}
hb_shape_plan_create_cached2:
  521|   204k|{
  522|   204k|  DEBUG_MSG_FUNC (SHAPE_PLAN, nullptr,
  ------------------
  |  |  233|   204k|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|   204k|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  523|   204k|		  "face=%p num_features=%u shaper_list=%p",
  524|   204k|		  face,
  525|   204k|		  num_user_features,
  526|   204k|		  shaper_list);
  527|       |
  528|   204k|retry:
  529|   204k|  hb_face_t::plan_node_t *cached_plan_nodes = face->shape_plans;
  530|       |
  531|   204k|  bool dont_cache = !hb_object_is_valid (face);
  532|       |
  533|   204k|  if (likely (!dont_cache))
  ------------------
  |  |  259|   204k|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 204k, False: 0]
  |  |  ------------------
  ------------------
  534|   204k|  {
  535|   204k|    hb_shape_plan_key_t key;
  536|   204k|    if (!key.init (false,
  ------------------
  |  Branch (536:9): [True: 0, False: 204k]
  ------------------
  537|   204k|		   face,
  538|   204k|		   props,
  539|   204k|		   user_features,
  540|   204k|		   num_user_features,
  541|   204k|		   coords,
  542|   204k|		   num_coords,
  543|   204k|		   shaper_list))
  544|      0|      return hb_shape_plan_get_empty ();
  545|       |
  546|   307k|    for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next)
  ------------------
  |  Branch (546:60): [True: 307k, False: 13]
  ------------------
  547|   307k|      if (node->shape_plan->key.equal (&key))
  ------------------
  |  Branch (547:11): [True: 204k, False: 102k]
  ------------------
  548|   204k|      {
  549|   204k|	DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache");
  ------------------
  |  |  233|   204k|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|   204k|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  550|   204k|	return hb_shape_plan_reference (node->shape_plan);
  551|   204k|      }
  552|   204k|  }
  553|       |
  554|     13|  hb_shape_plan_t *shape_plan = hb_shape_plan_create2 (face, props,
  555|     13|						       user_features, num_user_features,
  556|     13|						       coords, num_coords,
  557|     13|						       shaper_list);
  558|       |
  559|     13|  if (unlikely (dont_cache))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  560|      0|    return shape_plan;
  561|       |
  562|     13|  hb_face_t::plan_node_t *node = (hb_face_t::plan_node_t *) hb_calloc (1, sizeof (hb_face_t::plan_node_t));
  ------------------
  |  |  235|     13|#define hb_calloc hb_calloc_impl
  ------------------
  563|     13|  if (unlikely (!node))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  564|      0|    return shape_plan;
  565|       |
  566|     13|  node->shape_plan = shape_plan;
  567|     13|  node->next = cached_plan_nodes;
  568|       |
  569|     13|  if (unlikely (!face->shape_plans.cmpexch (cached_plan_nodes, node)))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  570|      0|  {
  571|      0|    hb_shape_plan_destroy (shape_plan);
  572|      0|    hb_free (node);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  573|      0|    goto retry;
  574|      0|  }
  575|     13|  DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan, "inserted into cache");
  ------------------
  |  |  233|     13|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|     13|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  576|       |
  577|     13|  return hb_shape_plan_reference (shape_plan);
  578|     13|}
hb-shape-plan.cc:_ZL31_hb_shape_plan_execute_internalP15hb_shape_plan_tP9hb_font_tP11hb_buffer_tPK12hb_feature_tj:
  392|   204k|{
  393|   204k|  DEBUG_MSG_FUNC (SHAPE_PLAN, shape_plan,
  ------------------
  |  |  233|   204k|#define DEBUG_MSG_FUNC(WHAT, OBJ, ...)				_hb_debug_msg<HB_DEBUG_##WHAT> (#WHAT, (OBJ), HB_FUNC, false, 0, 0, __VA_ARGS__)
  |  |  ------------------
  |  |  |  |  307|   204k|#define HB_FUNC __PRETTY_FUNCTION__
  |  |  ------------------
  ------------------
  394|   204k|		  "num_features=%u shaper_func=%p, shaper_name=%s",
  395|   204k|		  num_features,
  396|   204k|		  shape_plan->key.shaper_func,
  397|   204k|		  shape_plan->key.shaper_name);
  398|       |
  399|   204k|  if (unlikely (!buffer->len))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  400|      0|    return true;
  401|       |
  402|   204k|  assert (!hb_object_is_immutable (buffer));
  403|       |
  404|      0|  buffer->assert_unicode ();
  405|       |
  406|   204k|  if (unlikely (!hb_object_is_valid (shape_plan)))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  407|      0|    return false;
  408|       |
  409|   204k|  assert (shape_plan->face_unsafe == font->face);
  410|      0|  assert (hb_segment_properties_equal (&shape_plan->key.props, &buffer->props));
  411|       |
  412|      0|#define HB_SHAPER_EXECUTE(shaper) \
  413|      0|	HB_STMT_START { \
  414|      0|	  return font->data.shaper && \
  415|      0|		 _hb_##shaper##_shape (shape_plan, font, buffer, features, num_features); \
  416|      0|	} HB_STMT_END
  417|       |
  418|   204k|  if (false)
  ------------------
  |  Branch (418:7): [Folded - Ignored]
  ------------------
  419|      0|    ;
  420|   204k|#define HB_SHAPER_IMPLEMENT(shaper) \
  421|   204k|  else if (shape_plan->key.shaper_func == _hb_##shaper##_shape) \
  422|   204k|    HB_SHAPER_EXECUTE (shaper);
  423|   204k|#include "hb-shaper-list.hh"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright © 2012  Google, Inc.
  |  |    3|       | *
  |  |    4|       | *  This is part of HarfBuzz, a text shaping 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|       | * Google Author(s): Behdad Esfahbod
  |  |   25|       | */
  |  |   26|       |
  |  |   27|       |#ifndef HB_SHAPER_LIST_HH
  |  |   28|       |#define HB_SHAPER_LIST_HH
  |  |   29|       |#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
  |  |   30|       |
  |  |   31|   204k|#ifndef HB_NO_SHAPER
  |  |   32|       |
  |  |   33|       |
  |  |   34|       |/* v--- Add new shapers in the right place here. */
  |  |   35|       |
  |  |   36|       |#ifdef HAVE_WASM
  |  |   37|       |/* Only picks up fonts that have a "Wasm" table. */
  |  |   38|       |HB_SHAPER_IMPLEMENT (wasm)
  |  |   39|       |#endif
  |  |   40|       |
  |  |   41|       |#ifdef HAVE_GRAPHITE2
  |  |   42|       |/* Only picks up fonts that have a "Silf" table. */
  |  |   43|       |HB_SHAPER_IMPLEMENT (graphite2)
  |  |   44|       |#endif
  |  |   45|       |
  |  |   46|   204k|#ifndef HB_NO_OT_SHAPE
  |  |   47|   204k|HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main shaper. */
  |  |  ------------------
  |  |  |  |  421|   204k|  else if (shape_plan->key.shaper_func == _hb_##shaper##_shape) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (421:12): [True: 204k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  422|   204k|    HB_SHAPER_EXECUTE (shaper);
  |  |  |  |  ------------------
  |  |  |  |  |  |  413|   204k|	HB_STMT_START { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  432|   204k|#define HB_STMT_START do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  414|   204k|	  return font->data.shaper && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (414:11): [True: 204k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  415|   204k|		 _hb_##shaper##_shape (shape_plan, font, buffer, features, num_features); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (415:4): [True: 204k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  416|   204k|	} HB_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  433|   204k|#define HB_STMT_END   while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (433:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   48|      0|#endif
  |  |   49|       |
  |  |   50|       |#ifdef HAVE_UNISCRIBE
  |  |   51|       |HB_SHAPER_IMPLEMENT (uniscribe)
  |  |   52|       |#endif
  |  |   53|       |#ifdef HAVE_DIRECTWRITE
  |  |   54|       |HB_SHAPER_IMPLEMENT (directwrite)
  |  |   55|       |#endif
  |  |   56|       |#ifdef HAVE_CORETEXT
  |  |   57|       |HB_SHAPER_IMPLEMENT (coretext)
  |  |   58|       |#endif
  |  |   59|       |
  |  |   60|      0|#ifndef HB_NO_FALLBACK_SHAPE
  |  |   61|   204k|HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
  |  |  ------------------
  |  |  |  |  421|   204k|  else if (shape_plan->key.shaper_func == _hb_##shaper##_shape) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (421:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  422|      0|    HB_SHAPER_EXECUTE (shaper);
  |  |  |  |  ------------------
  |  |  |  |  |  |  413|      0|	HB_STMT_START { \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  432|      0|#define HB_STMT_START do
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  414|      0|	  return font->data.shaper && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (414:11): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  415|      0|		 _hb_##shaper##_shape (shape_plan, font, buffer, features, num_features); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (415:4): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  416|      0|	} HB_STMT_END
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  433|      0|#define HB_STMT_END   while (0)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (433:30): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   62|   204k|#endif
  |  |   63|       |
  |  |   64|       |
  |  |   65|   204k|#endif
  ------------------
  424|      0|#undef HB_SHAPER_IMPLEMENT
  425|       |
  426|      0|#undef HB_SHAPER_EXECUTE
  427|       |
  428|      0|  return false;
  429|   204k|}

_ZN19hb_shape_plan_key_t4finiEv:
   58|     13|  HB_INTERNAL void fini () { hb_free ((void *) user_features); user_features = nullptr; }
  ------------------
  |  |  237|     13|#define hb_free hb_free_impl
  ------------------
_ZN15hb_shape_plan_tD2Ev:
   67|     13|  ~hb_shape_plan_t () { key.fini (); }

hb_shape_full:
  130|   204k|{
  131|   204k|  if (unlikely (!buffer->len))
  ------------------
  |  |  260|   204k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 204k]
  |  |  ------------------
  ------------------
  132|      0|    return true;
  133|       |
  134|   204k|  buffer->enter ();
  135|       |
  136|   204k|  hb_buffer_t *text_buffer = nullptr;
  137|   204k|  if (buffer->flags & HB_BUFFER_FLAG_VERIFY)
  ------------------
  |  Branch (137:7): [True: 0, False: 204k]
  ------------------
  138|      0|  {
  139|      0|    text_buffer = hb_buffer_create ();
  140|      0|    hb_buffer_append (text_buffer, buffer, 0, -1);
  141|      0|  }
  142|       |
  143|   204k|  hb_shape_plan_t *shape_plan = hb_shape_plan_create_cached2 (font->face, &buffer->props,
  144|   204k|							      features, num_features,
  145|   204k|							      font->coords, font->num_coords,
  146|   204k|							      shaper_list);
  147|       |
  148|   204k|  hb_bool_t res = hb_shape_plan_execute (shape_plan, font, buffer, features, num_features);
  149|       |
  150|   204k|  if (buffer->max_ops <= 0)
  ------------------
  |  Branch (150:7): [True: 0, False: 204k]
  ------------------
  151|      0|    buffer->shaping_failed = true;
  152|       |
  153|   204k|  hb_shape_plan_destroy (shape_plan);
  154|       |
  155|   204k|  if (text_buffer)
  ------------------
  |  Branch (155:7): [True: 0, False: 204k]
  ------------------
  156|      0|  {
  157|      0|    if (res && buffer->successful && !buffer->shaping_failed
  ------------------
  |  Branch (157:9): [True: 0, False: 0]
  |  Branch (157:16): [True: 0, False: 0]
  |  Branch (157:38): [True: 0, False: 0]
  ------------------
  158|      0|	    && text_buffer->successful
  ------------------
  |  Branch (158:9): [True: 0, False: 0]
  ------------------
  159|      0|	    && !buffer->verify (text_buffer,
  ------------------
  |  Branch (159:9): [True: 0, False: 0]
  ------------------
  160|      0|				font,
  161|      0|				features,
  162|      0|				num_features,
  163|      0|				shaper_list))
  164|      0|      res = false;
  165|      0|    hb_buffer_destroy (text_buffer);
  166|      0|  }
  167|       |
  168|   204k|  buffer->leave ();
  169|       |
  170|   204k|  return res;
  171|   204k|}
hb_shape:
  194|   204k|{
  195|   204k|  hb_shape_full (font, buffer, features, num_features, nullptr);
  196|   204k|}

_Z15_hb_shapers_getv:
  100|   204k|{
  101|   204k|  return static_shapers.get_unconst ();
  102|   204k|}
_ZN24hb_shapers_lazy_loader_t8get_nullEv:
   89|      1|  static const hb_shaper_entry_t *get_null ()      { return _hb_all_shapers; }
_ZN24hb_shapers_lazy_loader_t6createEv:
   47|      1|  {
   48|      1|    char *env = getenv ("HB_SHAPER_LIST");
   49|      1|    if (!env || !*env)
  ------------------
  |  Branch (49:9): [True: 1, False: 0]
  |  Branch (49:17): [True: 0, False: 0]
  ------------------
   50|      1|      return nullptr;
   51|       |
   52|      0|    hb_shaper_entry_t *shapers = (hb_shaper_entry_t *) hb_calloc (1, sizeof (_hb_all_shapers));
  ------------------
  |  |  235|      0|#define hb_calloc hb_calloc_impl
  ------------------
   53|      0|    if (unlikely (!shapers))
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   54|      0|      return nullptr;
   55|       |
   56|      0|    hb_memcpy (shapers, _hb_all_shapers, sizeof (_hb_all_shapers));
   57|       |
   58|       |     /* Reorder shaper list to prefer requested shapers. */
   59|      0|    unsigned int i = 0;
   60|      0|    char *end, *p = env;
   61|      0|    for (;;)
   62|      0|    {
   63|      0|      end = strchr (p, ',');
   64|      0|      if (!end)
  ------------------
  |  Branch (64:11): [True: 0, False: 0]
  ------------------
   65|      0|	end = p + strlen (p);
   66|       |
   67|      0|      for (unsigned int j = i; j < ARRAY_LENGTH_CONST (_hb_all_shapers); j++)
  ------------------
  |  |  966|      0|#define ARRAY_LENGTH_CONST(__array) ((signed int) (sizeof (__array) / sizeof (__array[0])))
  ------------------
  |  Branch (67:32): [True: 0, False: 0]
  ------------------
   68|      0|	if (end - p == (int) strlen (shapers[j].name) &&
  ------------------
  |  Branch (68:6): [True: 0, False: 0]
  ------------------
   69|      0|	    0 == strncmp (shapers[j].name, p, end - p))
  ------------------
  |  Branch (69:6): [True: 0, False: 0]
  ------------------
   70|      0|	{
   71|       |	  /* Reorder this shaper to position i */
   72|      0|	 struct hb_shaper_entry_t t = shapers[j];
   73|      0|	 memmove (&shapers[i + 1], &shapers[i], sizeof (shapers[i]) * (j - i));
   74|      0|	 shapers[i] = t;
   75|      0|	 i++;
   76|      0|	}
   77|       |
   78|      0|      if (!*end)
  ------------------
  |  Branch (78:11): [True: 0, False: 0]
  ------------------
   79|      0|	break;
   80|      0|      else
   81|      0|	p = end + 1;
   82|      0|    }
   83|       |
   84|      0|    hb_atexit (free_static_shapers);
  ------------------
  |  |  475|      0|#    define hb_atexit atexit
  ------------------
   85|       |
   86|      0|    return shapers;
   87|      0|  }

_ZN26hb_shaper_object_dataset_tI9hb_font_tE4finiEv:
  119|     32|  {
  120|     32|#define HB_SHAPER_IMPLEMENT(shaper) shaper.fini ();
  121|     32|#include "hb-shaper-list.hh"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright © 2012  Google, Inc.
  |  |    3|       | *
  |  |    4|       | *  This is part of HarfBuzz, a text shaping 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|       | * Google Author(s): Behdad Esfahbod
  |  |   25|       | */
  |  |   26|       |
  |  |   27|       |#ifndef HB_SHAPER_LIST_HH
  |  |   28|       |#define HB_SHAPER_LIST_HH
  |  |   29|       |#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
  |  |   30|       |
  |  |   31|     32|#ifndef HB_NO_SHAPER
  |  |   32|       |
  |  |   33|       |
  |  |   34|       |/* v--- Add new shapers in the right place here. */
  |  |   35|       |
  |  |   36|       |#ifdef HAVE_WASM
  |  |   37|       |/* Only picks up fonts that have a "Wasm" table. */
  |  |   38|       |HB_SHAPER_IMPLEMENT (wasm)
  |  |   39|       |#endif
  |  |   40|       |
  |  |   41|       |#ifdef HAVE_GRAPHITE2
  |  |   42|       |/* Only picks up fonts that have a "Silf" table. */
  |  |   43|       |HB_SHAPER_IMPLEMENT (graphite2)
  |  |   44|       |#endif
  |  |   45|       |
  |  |   46|     32|#ifndef HB_NO_OT_SHAPE
  |  |   47|     32|HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main shaper. */
  |  |  ------------------
  |  |  |  |  120|     32|#define HB_SHAPER_IMPLEMENT(shaper) shaper.fini ();
  |  |  ------------------
  |  |   48|     32|#endif
  |  |   49|       |
  |  |   50|       |#ifdef HAVE_UNISCRIBE
  |  |   51|       |HB_SHAPER_IMPLEMENT (uniscribe)
  |  |   52|       |#endif
  |  |   53|       |#ifdef HAVE_DIRECTWRITE
  |  |   54|       |HB_SHAPER_IMPLEMENT (directwrite)
  |  |   55|       |#endif
  |  |   56|       |#ifdef HAVE_CORETEXT
  |  |   57|       |HB_SHAPER_IMPLEMENT (coretext)
  |  |   58|       |#endif
  |  |   59|       |
  |  |   60|     32|#ifndef HB_NO_FALLBACK_SHAPE
  |  |   61|     32|HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
  |  |  ------------------
  |  |  |  |  120|     32|#define HB_SHAPER_IMPLEMENT(shaper) shaper.fini ();
  |  |  ------------------
  |  |   62|     32|#endif
  |  |   63|       |
  |  |   64|       |
  |  |   65|     32|#endif
  ------------------
  122|     32|#undef HB_SHAPER_IMPLEMENT
  123|     32|  }
_ZN23hb_shaper_lazy_loader_tI9hb_font_tLj1E17hb_ot_font_data_tE8get_nullEv:
  101|   204k|	  static Type *get_null () { return nullptr; } \
_ZN23hb_shaper_lazy_loader_tI9hb_font_tLj1E17hb_ot_font_data_tE7destroyEPS1_:
  102|     11|	  static void destroy (Type *p) { HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (p); } \
  ------------------
  |  |   74|     11|#define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object)	_hb_##shaper##_shaper_##object##_data_destroy
  ------------------
_ZN26hb_shaper_object_dataset_tI9hb_face_tE5init0EPS0_:
  112|     11|  {
  113|     11|    this->parent_data = parent_data;
  114|     11|#define HB_SHAPER_IMPLEMENT(shaper) shaper.init0 ();
  115|     11|#include "hb-shaper-list.hh"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright © 2012  Google, Inc.
  |  |    3|       | *
  |  |    4|       | *  This is part of HarfBuzz, a text shaping 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|       | * Google Author(s): Behdad Esfahbod
  |  |   25|       | */
  |  |   26|       |
  |  |   27|       |#ifndef HB_SHAPER_LIST_HH
  |  |   28|       |#define HB_SHAPER_LIST_HH
  |  |   29|       |#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
  |  |   30|       |
  |  |   31|     11|#ifndef HB_NO_SHAPER
  |  |   32|       |
  |  |   33|       |
  |  |   34|       |/* v--- Add new shapers in the right place here. */
  |  |   35|       |
  |  |   36|       |#ifdef HAVE_WASM
  |  |   37|       |/* Only picks up fonts that have a "Wasm" table. */
  |  |   38|       |HB_SHAPER_IMPLEMENT (wasm)
  |  |   39|       |#endif
  |  |   40|       |
  |  |   41|       |#ifdef HAVE_GRAPHITE2
  |  |   42|       |/* Only picks up fonts that have a "Silf" table. */
  |  |   43|       |HB_SHAPER_IMPLEMENT (graphite2)
  |  |   44|       |#endif
  |  |   45|       |
  |  |   46|     11|#ifndef HB_NO_OT_SHAPE
  |  |   47|     11|HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main shaper. */
  |  |  ------------------
  |  |  |  |  114|     11|#define HB_SHAPER_IMPLEMENT(shaper) shaper.init0 ();
  |  |  ------------------
  |  |   48|     11|#endif
  |  |   49|       |
  |  |   50|       |#ifdef HAVE_UNISCRIBE
  |  |   51|       |HB_SHAPER_IMPLEMENT (uniscribe)
  |  |   52|       |#endif
  |  |   53|       |#ifdef HAVE_DIRECTWRITE
  |  |   54|       |HB_SHAPER_IMPLEMENT (directwrite)
  |  |   55|       |#endif
  |  |   56|       |#ifdef HAVE_CORETEXT
  |  |   57|       |HB_SHAPER_IMPLEMENT (coretext)
  |  |   58|       |#endif
  |  |   59|       |
  |  |   60|     11|#ifndef HB_NO_FALLBACK_SHAPE
  |  |   61|     11|HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
  |  |  ------------------
  |  |  |  |  114|     11|#define HB_SHAPER_IMPLEMENT(shaper) shaper.init0 ();
  |  |  ------------------
  |  |   62|     11|#endif
  |  |   63|       |
  |  |   64|       |
  |  |   65|     11|#endif
  ------------------
  116|     11|#undef HB_SHAPER_IMPLEMENT
  117|     11|  }
_ZN26hb_shaper_object_dataset_tI9hb_face_tE4finiEv:
  119|     11|  {
  120|     11|#define HB_SHAPER_IMPLEMENT(shaper) shaper.fini ();
  121|     11|#include "hb-shaper-list.hh"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright © 2012  Google, Inc.
  |  |    3|       | *
  |  |    4|       | *  This is part of HarfBuzz, a text shaping 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|       | * Google Author(s): Behdad Esfahbod
  |  |   25|       | */
  |  |   26|       |
  |  |   27|       |#ifndef HB_SHAPER_LIST_HH
  |  |   28|       |#define HB_SHAPER_LIST_HH
  |  |   29|       |#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
  |  |   30|       |
  |  |   31|     11|#ifndef HB_NO_SHAPER
  |  |   32|       |
  |  |   33|       |
  |  |   34|       |/* v--- Add new shapers in the right place here. */
  |  |   35|       |
  |  |   36|       |#ifdef HAVE_WASM
  |  |   37|       |/* Only picks up fonts that have a "Wasm" table. */
  |  |   38|       |HB_SHAPER_IMPLEMENT (wasm)
  |  |   39|       |#endif
  |  |   40|       |
  |  |   41|       |#ifdef HAVE_GRAPHITE2
  |  |   42|       |/* Only picks up fonts that have a "Silf" table. */
  |  |   43|       |HB_SHAPER_IMPLEMENT (graphite2)
  |  |   44|       |#endif
  |  |   45|       |
  |  |   46|     11|#ifndef HB_NO_OT_SHAPE
  |  |   47|     11|HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main shaper. */
  |  |  ------------------
  |  |  |  |  120|     11|#define HB_SHAPER_IMPLEMENT(shaper) shaper.fini ();
  |  |  ------------------
  |  |   48|     11|#endif
  |  |   49|       |
  |  |   50|       |#ifdef HAVE_UNISCRIBE
  |  |   51|       |HB_SHAPER_IMPLEMENT (uniscribe)
  |  |   52|       |#endif
  |  |   53|       |#ifdef HAVE_DIRECTWRITE
  |  |   54|       |HB_SHAPER_IMPLEMENT (directwrite)
  |  |   55|       |#endif
  |  |   56|       |#ifdef HAVE_CORETEXT
  |  |   57|       |HB_SHAPER_IMPLEMENT (coretext)
  |  |   58|       |#endif
  |  |   59|       |
  |  |   60|     11|#ifndef HB_NO_FALLBACK_SHAPE
  |  |   61|     11|HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
  |  |  ------------------
  |  |  |  |  120|     11|#define HB_SHAPER_IMPLEMENT(shaper) shaper.fini ();
  |  |  ------------------
  |  |   62|     11|#endif
  |  |   63|       |
  |  |   64|       |
  |  |   65|     11|#endif
  ------------------
  122|     11|#undef HB_SHAPER_IMPLEMENT
  123|     11|  }
_ZN23hb_shaper_lazy_loader_tI9hb_face_tLj1E17hb_ot_face_data_tE8get_nullEv:
  101|   204k|	  static Type *get_null () { return nullptr; } \
_ZN23hb_shaper_lazy_loader_tI9hb_face_tLj1E17hb_ot_face_data_tE7destroyEPS1_:
  102|     11|	  static void destroy (Type *p) { HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (p); } \
  ------------------
  |  |   74|     11|#define HB_SHAPER_DATA_DESTROY_FUNC(shaper, object)	_hb_##shaper##_shaper_##object##_data_destroy
  ------------------
_ZN26hb_shaper_object_dataset_tI9hb_font_tE5init0EPS0_:
  112|     11|  {
  113|     11|    this->parent_data = parent_data;
  114|     11|#define HB_SHAPER_IMPLEMENT(shaper) shaper.init0 ();
  115|     11|#include "hb-shaper-list.hh"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright © 2012  Google, Inc.
  |  |    3|       | *
  |  |    4|       | *  This is part of HarfBuzz, a text shaping 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|       | * Google Author(s): Behdad Esfahbod
  |  |   25|       | */
  |  |   26|       |
  |  |   27|       |#ifndef HB_SHAPER_LIST_HH
  |  |   28|       |#define HB_SHAPER_LIST_HH
  |  |   29|       |#endif /* HB_SHAPER_LIST_HH */ /* Dummy header guards */
  |  |   30|       |
  |  |   31|     11|#ifndef HB_NO_SHAPER
  |  |   32|       |
  |  |   33|       |
  |  |   34|       |/* v--- Add new shapers in the right place here. */
  |  |   35|       |
  |  |   36|       |#ifdef HAVE_WASM
  |  |   37|       |/* Only picks up fonts that have a "Wasm" table. */
  |  |   38|       |HB_SHAPER_IMPLEMENT (wasm)
  |  |   39|       |#endif
  |  |   40|       |
  |  |   41|       |#ifdef HAVE_GRAPHITE2
  |  |   42|       |/* Only picks up fonts that have a "Silf" table. */
  |  |   43|       |HB_SHAPER_IMPLEMENT (graphite2)
  |  |   44|       |#endif
  |  |   45|       |
  |  |   46|     11|#ifndef HB_NO_OT_SHAPE
  |  |   47|     11|HB_SHAPER_IMPLEMENT (ot) /* <--- This is our main shaper. */
  |  |  ------------------
  |  |  |  |  114|     11|#define HB_SHAPER_IMPLEMENT(shaper) shaper.init0 ();
  |  |  ------------------
  |  |   48|     11|#endif
  |  |   49|       |
  |  |   50|       |#ifdef HAVE_UNISCRIBE
  |  |   51|       |HB_SHAPER_IMPLEMENT (uniscribe)
  |  |   52|       |#endif
  |  |   53|       |#ifdef HAVE_DIRECTWRITE
  |  |   54|       |HB_SHAPER_IMPLEMENT (directwrite)
  |  |   55|       |#endif
  |  |   56|       |#ifdef HAVE_CORETEXT
  |  |   57|       |HB_SHAPER_IMPLEMENT (coretext)
  |  |   58|       |#endif
  |  |   59|       |
  |  |   60|     11|#ifndef HB_NO_FALLBACK_SHAPE
  |  |   61|     11|HB_SHAPER_IMPLEMENT (fallback) /* <--- This should be last. */
  |  |  ------------------
  |  |  |  |  114|     11|#define HB_SHAPER_IMPLEMENT(shaper) shaper.init0 ();
  |  |  ------------------
  |  |   62|     11|#endif
  |  |   63|       |
  |  |   64|       |
  |  |   65|     11|#endif
  ------------------
  116|     11|#undef HB_SHAPER_IMPLEMENT
  117|     11|  }
_ZN23hb_shaper_lazy_loader_tI9hb_font_tLj1E17hb_ot_font_data_tE6createEPS0_:
  100|     11|	  { return HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (data); } \
  ------------------
  |  |   73|     11|#define HB_SHAPER_DATA_CREATE_FUNC(shaper, object)	_hb_##shaper##_shaper_##object##_data_create
  ------------------
_ZN23hb_shaper_lazy_loader_tI9hb_face_tLj1E17hb_ot_face_data_tE6createEPS0_:
  100|     11|	  { return HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (data); } \
  ------------------
  |  |   73|     11|#define HB_SHAPER_DATA_CREATE_FUNC(shaper, object)	_hb_##shaper##_shaper_##object##_data_create
  ------------------

_ZNK9hb_face_t15load_num_glyphsEv:
   94|     11|{
   95|     11|  unsigned ret = 0;
   96|       |
   97|       |#ifndef HB_NO_BEYOND_64K
   98|       |  ret = hb_max (ret, load_num_glyphs_from_loca (this));
   99|       |#endif
  100|       |
  101|     11|  ret = hb_max (ret, load_num_glyphs_from_maxp (this));
  102|       |
  103|     11|  num_glyphs = ret;
  104|     11|  return ret;
  105|     11|}
hb-static.cc:_ZL25load_num_glyphs_from_maxpPK9hb_face_t:
   88|     11|{
   89|     11|  return face->table.maxp->get_num_glyphs ();
   90|     11|}

hb-ucd.cc:_ZL10_hb_ucd_gcj:
 2801|  2.93M|{
 2802|  2.93M|  return u<1114110u?_hb_ucd_u8[6808+(((_hb_ucd_u8[1312+(((_hb_ucd_u16[((_hb_ucd_u8[544+(((_hb_ucd_u8[u>>1>>3>>3>>4])<<4)+((u>>1>>3>>3)&15u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:2;
  ------------------
  |  Branch (2802:10): [True: 2.93M, False: 0]
  ------------------
 2803|  2.93M|}
hb-ucd.cc:_ZL10_hb_ucd_scj:
 2821|  2.93M|{
 2822|  2.93M|  return u<918000u?_hb_ucd_u8[11070+(((_hb_ucd_u16[2048+(((_hb_ucd_u8[10334+(((_hb_ucd_u8[9884+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2;
  ------------------
  |  Branch (2822:10): [True: 2.93M, False: 0]
  ------------------
 2823|  2.93M|}
hb-ucd.cc:_ZL10_hb_ucd_dmj:
 2826|   485k|{
 2827|   485k|  return u<195102u?_hb_ucd_u16[6032+(((_hb_ucd_u8[17084+(((_hb_ucd_u8[16702+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0;
  ------------------
  |  Branch (2827:10): [True: 485k, False: 3]
  ------------------
 2828|   485k|}

hb_ucd_get_unicode_funcs:
  253|   614k|{
  254|       |#ifdef HB_NO_UCD
  255|       |  return hb_unicode_funcs_get_empty ();
  256|       |#endif
  257|   614k|  return static_ucd_funcs.get_unconst ();
  258|   614k|}
_ZN34hb_ucd_unicode_funcs_lazy_loader_t6createEv:
  227|      1|  {
  228|      1|    hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr);
  229|       |
  230|      1|    hb_unicode_funcs_set_combining_class_func (funcs, hb_ucd_combining_class, nullptr, nullptr);
  231|      1|    hb_unicode_funcs_set_general_category_func (funcs, hb_ucd_general_category, nullptr, nullptr);
  232|      1|    hb_unicode_funcs_set_mirroring_func (funcs, hb_ucd_mirroring, nullptr, nullptr);
  233|      1|    hb_unicode_funcs_set_script_func (funcs, hb_ucd_script, nullptr, nullptr);
  234|      1|    hb_unicode_funcs_set_compose_func (funcs, hb_ucd_compose, nullptr, nullptr);
  235|      1|    hb_unicode_funcs_set_decompose_func (funcs, hb_ucd_decompose, nullptr, nullptr);
  236|       |
  237|      1|    hb_unicode_funcs_make_immutable (funcs);
  238|       |
  239|      1|    hb_atexit (free_static_ucd_funcs);
  ------------------
  |  |  475|      1|#    define hb_atexit atexit
  ------------------
  240|       |
  241|      1|    return funcs;
  242|      1|  }
hb-ucd.cc:_ZL23hb_ucd_general_categoryP18hb_unicode_funcs_tjPv:
   35|  2.93M|{
   36|  2.93M|  return (hb_unicode_general_category_t) _hb_ucd_gc (unicode);
   37|  2.93M|}
hb-ucd.cc:_ZL13hb_ucd_scriptP18hb_unicode_funcs_tjPv:
   51|  2.93M|{
   52|  2.93M|  return _hb_ucd_sc_map[_hb_ucd_sc (unicode)];
   53|  2.93M|}
hb-ucd.cc:_ZL16hb_ucd_decomposeP18hb_unicode_funcs_tjPjS1_Pv:
  174|   485k|{
  175|   485k|  if (_hb_ucd_decompose_hangul (ab, a, b)) return true;
  ------------------
  |  Branch (175:7): [True: 0, False: 485k]
  ------------------
  176|       |
  177|   485k|  unsigned i = _hb_ucd_dm (ab);
  178|       |
  179|       |  /* If no data, there's no decomposition. */
  180|   485k|  if (likely (!i)) return false;
  ------------------
  |  |  259|   485k|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 485k, False: 0]
  |  |  ------------------
  ------------------
  181|      0|  i--;
  182|       |
  183|       |  /* Check if it's a single-character decomposition. */
  184|      0|  if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map))
  ------------------
  |  Branch (184:7): [True: 0, False: 0]
  ------------------
  185|      0|  {
  186|       |    /* Single-character decompositions currently are only in plane 0 or plane 2. */
  187|      0|    if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map))
  ------------------
  |  Branch (187:9): [True: 0, False: 0]
  ------------------
  188|      0|    {
  189|       |      /* Plane 0. */
  190|      0|      *a = _hb_ucd_dm1_p0_map[i];
  191|      0|    }
  192|      0|    else
  193|      0|    {
  194|       |      /* Plane 2. */
  195|      0|      i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map);
  196|      0|      *a = 0x20000 | _hb_ucd_dm1_p2_map[i];
  197|      0|    }
  198|      0|    *b = 0;
  199|      0|    return true;
  200|      0|  }
  201|      0|  i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map);
  202|       |
  203|       |  /* Otherwise they are encoded either in a 32bit array or a 64bit array. */
  204|      0|  if (i < ARRAY_LENGTH (_hb_ucd_dm2_u32_map))
  ------------------
  |  Branch (204:7): [True: 0, False: 0]
  ------------------
  205|      0|  {
  206|       |    /* 32bit array. */
  207|      0|    uint32_t v = _hb_ucd_dm2_u32_map[i];
  208|      0|    *a = HB_CODEPOINT_DECODE3_11_7_14_1 (v);
  ------------------
  |  |  219|      0|#define HB_CODEPOINT_DECODE3_11_7_14_1(v) ((hb_codepoint_t) ((v) >> 21))
  ------------------
  209|      0|    *b = HB_CODEPOINT_DECODE3_11_7_14_2 (v);
  ------------------
  |  |  220|      0|#define HB_CODEPOINT_DECODE3_11_7_14_2(v) ((hb_codepoint_t) (((v) >> 14) & 0x007Fu) | 0x0300)
  ------------------
  210|      0|    return true;
  211|      0|  }
  212|      0|  i -= ARRAY_LENGTH (_hb_ucd_dm2_u32_map);
  213|       |
  214|       |  /* 64bit array. */
  215|      0|  uint64_t v = _hb_ucd_dm2_u64_map[i];
  216|      0|  *a = HB_CODEPOINT_DECODE3_1 (v);
  ------------------
  |  |  213|      0|#define HB_CODEPOINT_DECODE3_1(v) ((hb_codepoint_t) ((v) >> 42))
  ------------------
  217|      0|  *b = HB_CODEPOINT_DECODE3_2 (v);
  ------------------
  |  |  214|      0|#define HB_CODEPOINT_DECODE3_2(v) ((hb_codepoint_t) ((v) >> 21) & 0x1FFFFFu)
  ------------------
  218|      0|  return true;
  219|      0|}
hb-ucd.cc:_ZL24_hb_ucd_decompose_hanguljPjS_:
   68|   485k|{
   69|   485k|  unsigned si = ab - SBASE;
  ------------------
  |  |   56|   485k|#define SBASE 0xAC00u
  ------------------
   70|       |
   71|   485k|  if (si >= SCOUNT)
  ------------------
  |  |   60|   485k|#define SCOUNT 11172u
  ------------------
  |  Branch (71:7): [True: 485k, False: 0]
  ------------------
   72|   485k|    return false;
   73|       |
   74|      0|  if (si % TCOUNT)
  ------------------
  |  |   63|      0|#define TCOUNT 28u
  ------------------
  |  Branch (74:7): [True: 0, False: 0]
  ------------------
   75|      0|  {
   76|       |    /* LV,T */
   77|      0|    *a = SBASE + (si / TCOUNT) * TCOUNT;
  ------------------
  |  |   56|      0|#define SBASE 0xAC00u
  ------------------
                  *a = SBASE + (si / TCOUNT) * TCOUNT;
  ------------------
  |  |   63|      0|#define TCOUNT 28u
  ------------------
                  *a = SBASE + (si / TCOUNT) * TCOUNT;
  ------------------
  |  |   63|      0|#define TCOUNT 28u
  ------------------
   78|      0|    *b = TBASE + (si % TCOUNT);
  ------------------
  |  |   59|      0|#define TBASE 0x11A7u
  ------------------
                  *b = TBASE + (si % TCOUNT);
  ------------------
  |  |   63|      0|#define TCOUNT 28u
  ------------------
   79|      0|    return true;
   80|      0|  } else {
   81|       |    /* L,V */
   82|      0|    *a = LBASE + (si / NCOUNT);
  ------------------
  |  |   57|      0|#define LBASE 0x1100u
  ------------------
                  *a = LBASE + (si / NCOUNT);
  ------------------
  |  |   64|      0|#define NCOUNT (VCOUNT * TCOUNT)
  |  |  ------------------
  |  |  |  |   62|      0|#define VCOUNT 21u
  |  |  ------------------
  |  |               #define NCOUNT (VCOUNT * TCOUNT)
  |  |  ------------------
  |  |  |  |   63|      0|#define TCOUNT 28u
  |  |  ------------------
  ------------------
   83|      0|    *b = VBASE + (si % NCOUNT) / TCOUNT;
  ------------------
  |  |   58|      0|#define VBASE 0x1161u
  ------------------
                  *b = VBASE + (si % NCOUNT) / TCOUNT;
  ------------------
  |  |   64|      0|#define NCOUNT (VCOUNT * TCOUNT)
  |  |  ------------------
  |  |  |  |   62|      0|#define VCOUNT 21u
  |  |  ------------------
  |  |               #define NCOUNT (VCOUNT * TCOUNT)
  |  |  ------------------
  |  |  |  |   63|      0|#define TCOUNT 28u
  |  |  ------------------
  ------------------
                  *b = VBASE + (si % NCOUNT) / TCOUNT;
  ------------------
  |  |   63|      0|#define TCOUNT 28u
  ------------------
   84|      0|    return true;
   85|      0|  }
   86|      0|}
hb-ucd.cc:_ZL21free_static_ucd_funcsv:
  247|      1|{
  248|      1|  static_ucd_funcs.free_instance ();
  249|      1|}

hb_unicode_funcs_get_default:
  153|   614k|{
  154|   614k|#if !defined(HB_NO_UNICODE_FUNCS) && !defined(HB_NO_UCD)
  155|   614k|  return hb_ucd_get_unicode_funcs ();
  156|       |#elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_GLIB)
  157|       |  return hb_glib_get_unicode_funcs ();
  158|       |#elif !defined(HB_NO_UNICODE_FUNCS) && defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
  159|       |  return hb_icu_get_unicode_funcs ();
  160|       |#else
  161|       |#define HB_UNICODE_FUNCS_NIL 1
  162|       |  return hb_unicode_funcs_get_empty ();
  163|       |#endif
  164|   614k|}
hb_unicode_funcs_create:
  183|      1|{
  184|      1|  hb_unicode_funcs_t *ufuncs;
  185|       |
  186|      1|  if (!(ufuncs = hb_object_create<hb_unicode_funcs_t> ()))
  ------------------
  |  Branch (186:7): [True: 0, False: 1]
  ------------------
  187|      0|    return hb_unicode_funcs_get_empty ();
  188|       |
  189|      1|  if (!parent)
  ------------------
  |  Branch (189:7): [True: 1, False: 0]
  ------------------
  190|      1|    parent = hb_unicode_funcs_get_empty ();
  191|       |
  192|      1|  hb_unicode_funcs_make_immutable (parent);
  193|      1|  ufuncs->parent = hb_unicode_funcs_reference (parent);
  194|       |
  195|      1|  ufuncs->func = parent->func;
  196|       |
  197|       |  /* We can safely copy user_data from parent since we hold a reference
  198|       |   * onto it and it's immutable.  We should not copy the destroy notifiers
  199|       |   * though. */
  200|      1|  ufuncs->user_data = parent->user_data;
  201|       |
  202|      1|  return ufuncs;
  203|      1|}
hb_unicode_funcs_get_empty:
  229|      2|{
  230|      2|  return const_cast<hb_unicode_funcs_t *> (&Null (hb_unicode_funcs_t));
  ------------------
  |  |  124|      2|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  231|      2|}
hb_unicode_funcs_reference:
  245|   409k|{
  246|   409k|  return hb_object_reference (ufuncs);
  247|   409k|}
hb_unicode_funcs_destroy:
  261|   614k|{
  262|   614k|  if (!hb_object_destroy (ufuncs)) return;
  ------------------
  |  Branch (262:7): [True: 614k, False: 1]
  ------------------
  263|       |
  264|      1|#define HB_UNICODE_FUNC_IMPLEMENT(name) \
  265|      1|  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
  266|   614k|    HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
  ------------------
  |  |   44|      1|  HB_UNICODE_FUNC_IMPLEMENT (combining_class) \
  |  |  ------------------
  |  |  |  |  265|      1|  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (265:7): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   45|      1|  HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (eastasian_width)) \
  |  |  ------------------
  |  |  |  |  124|      2|#define HB_IF_NOT_DEPRECATED(x) x
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (124:33): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   46|      1|  HB_UNICODE_FUNC_IMPLEMENT (general_category) \
  |  |  ------------------
  |  |  |  |  265|      1|  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (265:7): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   47|      1|  HB_UNICODE_FUNC_IMPLEMENT (mirroring) \
  |  |  ------------------
  |  |  |  |  265|      1|  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (265:7): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   48|      1|  HB_UNICODE_FUNC_IMPLEMENT (script) \
  |  |  ------------------
  |  |  |  |  265|      1|  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (265:7): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   49|      1|  HB_UNICODE_FUNC_IMPLEMENT (compose) \
  |  |  ------------------
  |  |  |  |  265|      1|  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (265:7): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|      1|  HB_UNICODE_FUNC_IMPLEMENT (decompose) \
  |  |  ------------------
  |  |  |  |  265|      1|  if (ufuncs->destroy.name) ufuncs->destroy.name (ufuncs->user_data.name);
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (265:7): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      1|  HB_IF_NOT_DEPRECATED (HB_UNICODE_FUNC_IMPLEMENT (decompose_compatibility)) \
  |  |  ------------------
  |  |  |  |  124|   614k|#define HB_IF_NOT_DEPRECATED(x) x
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (124:33): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  267|      1|#undef HB_UNICODE_FUNC_IMPLEMENT
  268|       |
  269|      1|  hb_unicode_funcs_destroy (ufuncs->parent);
  270|       |
  271|      1|  hb_free (ufuncs);
  ------------------
  |  |  237|      1|#define hb_free hb_free_impl
  ------------------
  272|      1|}
hb_unicode_funcs_make_immutable:
  329|      2|{
  330|      2|  if (hb_object_is_immutable (ufuncs))
  ------------------
  |  Branch (330:7): [True: 1, False: 1]
  ------------------
  331|      1|    return;
  332|       |
  333|      1|  hb_object_make_immutable (ufuncs);
  334|      1|}
hb_unicode_funcs_set_combining_class_func:
  377|      1|				    hb_destroy_func_t		    destroy)	\
  378|      1|{										\
  379|      1|  if (hb_object_is_immutable (ufuncs))						\
  ------------------
  |  Branch (379:7): [True: 0, False: 1]
  ------------------
  380|      1|    goto fail;									\
  381|      1|										\
  382|      1|  if (!func)									\
  ------------------
  |  Branch (382:7): [True: 0, False: 1]
  ------------------
  383|      1|  {										\
  384|      0|    if (destroy)								\
  ------------------
  |  Branch (384:9): [True: 0, False: 0]
  ------------------
  385|      0|      destroy (user_data);							\
  386|      0|    destroy = nullptr;								\
  387|      0|    user_data = ufuncs->parent->user_data.name;					\
  388|      0|  }										\
  389|      1|										\
  390|      1|  if (ufuncs->destroy.name)							\
  ------------------
  |  Branch (390:7): [True: 0, False: 1]
  ------------------
  391|      1|    ufuncs->destroy.name (ufuncs->user_data.name);				\
  392|      1|										\
  393|      1|  if (func)									\
  ------------------
  |  Branch (393:7): [True: 1, False: 0]
  ------------------
  394|      1|    ufuncs->func.name = func;							\
  395|      1|  else										\
  396|      1|    ufuncs->func.name = ufuncs->parent->func.name;				\
  397|      1|  ufuncs->user_data.name = user_data;						\
  398|      1|  ufuncs->destroy.name = destroy;						\
  399|      1|  return;									\
  400|      1|										\
  401|      0|fail:										\
  402|      0|  if (destroy)									\
  ------------------
  |  Branch (402:7): [True: 0, False: 0]
  ------------------
  403|      0|    destroy (user_data);							\
  404|      0|}
hb_unicode_funcs_set_general_category_func:
  377|      1|				    hb_destroy_func_t		    destroy)	\
  378|      1|{										\
  379|      1|  if (hb_object_is_immutable (ufuncs))						\
  ------------------
  |  Branch (379:7): [True: 0, False: 1]
  ------------------
  380|      1|    goto fail;									\
  381|      1|										\
  382|      1|  if (!func)									\
  ------------------
  |  Branch (382:7): [True: 0, False: 1]
  ------------------
  383|      1|  {										\
  384|      0|    if (destroy)								\
  ------------------
  |  Branch (384:9): [True: 0, False: 0]
  ------------------
  385|      0|      destroy (user_data);							\
  386|      0|    destroy = nullptr;								\
  387|      0|    user_data = ufuncs->parent->user_data.name;					\
  388|      0|  }										\
  389|      1|										\
  390|      1|  if (ufuncs->destroy.name)							\
  ------------------
  |  Branch (390:7): [True: 0, False: 1]
  ------------------
  391|      1|    ufuncs->destroy.name (ufuncs->user_data.name);				\
  392|      1|										\
  393|      1|  if (func)									\
  ------------------
  |  Branch (393:7): [True: 1, False: 0]
  ------------------
  394|      1|    ufuncs->func.name = func;							\
  395|      1|  else										\
  396|      1|    ufuncs->func.name = ufuncs->parent->func.name;				\
  397|      1|  ufuncs->user_data.name = user_data;						\
  398|      1|  ufuncs->destroy.name = destroy;						\
  399|      1|  return;									\
  400|      1|										\
  401|      0|fail:										\
  402|      0|  if (destroy)									\
  ------------------
  |  Branch (402:7): [True: 0, False: 0]
  ------------------
  403|      0|    destroy (user_data);							\
  404|      0|}
hb_unicode_funcs_set_mirroring_func:
  377|      1|				    hb_destroy_func_t		    destroy)	\
  378|      1|{										\
  379|      1|  if (hb_object_is_immutable (ufuncs))						\
  ------------------
  |  Branch (379:7): [True: 0, False: 1]
  ------------------
  380|      1|    goto fail;									\
  381|      1|										\
  382|      1|  if (!func)									\
  ------------------
  |  Branch (382:7): [True: 0, False: 1]
  ------------------
  383|      1|  {										\
  384|      0|    if (destroy)								\
  ------------------
  |  Branch (384:9): [True: 0, False: 0]
  ------------------
  385|      0|      destroy (user_data);							\
  386|      0|    destroy = nullptr;								\
  387|      0|    user_data = ufuncs->parent->user_data.name;					\
  388|      0|  }										\
  389|      1|										\
  390|      1|  if (ufuncs->destroy.name)							\
  ------------------
  |  Branch (390:7): [True: 0, False: 1]
  ------------------
  391|      1|    ufuncs->destroy.name (ufuncs->user_data.name);				\
  392|      1|										\
  393|      1|  if (func)									\
  ------------------
  |  Branch (393:7): [True: 1, False: 0]
  ------------------
  394|      1|    ufuncs->func.name = func;							\
  395|      1|  else										\
  396|      1|    ufuncs->func.name = ufuncs->parent->func.name;				\
  397|      1|  ufuncs->user_data.name = user_data;						\
  398|      1|  ufuncs->destroy.name = destroy;						\
  399|      1|  return;									\
  400|      1|										\
  401|      0|fail:										\
  402|      0|  if (destroy)									\
  ------------------
  |  Branch (402:7): [True: 0, False: 0]
  ------------------
  403|      0|    destroy (user_data);							\
  404|      0|}
hb_unicode_funcs_set_script_func:
  377|      1|				    hb_destroy_func_t		    destroy)	\
  378|      1|{										\
  379|      1|  if (hb_object_is_immutable (ufuncs))						\
  ------------------
  |  Branch (379:7): [True: 0, False: 1]
  ------------------
  380|      1|    goto fail;									\
  381|      1|										\
  382|      1|  if (!func)									\
  ------------------
  |  Branch (382:7): [True: 0, False: 1]
  ------------------
  383|      1|  {										\
  384|      0|    if (destroy)								\
  ------------------
  |  Branch (384:9): [True: 0, False: 0]
  ------------------
  385|      0|      destroy (user_data);							\
  386|      0|    destroy = nullptr;								\
  387|      0|    user_data = ufuncs->parent->user_data.name;					\
  388|      0|  }										\
  389|      1|										\
  390|      1|  if (ufuncs->destroy.name)							\
  ------------------
  |  Branch (390:7): [True: 0, False: 1]
  ------------------
  391|      1|    ufuncs->destroy.name (ufuncs->user_data.name);				\
  392|      1|										\
  393|      1|  if (func)									\
  ------------------
  |  Branch (393:7): [True: 1, False: 0]
  ------------------
  394|      1|    ufuncs->func.name = func;							\
  395|      1|  else										\
  396|      1|    ufuncs->func.name = ufuncs->parent->func.name;				\
  397|      1|  ufuncs->user_data.name = user_data;						\
  398|      1|  ufuncs->destroy.name = destroy;						\
  399|      1|  return;									\
  400|      1|										\
  401|      0|fail:										\
  402|      0|  if (destroy)									\
  ------------------
  |  Branch (402:7): [True: 0, False: 0]
  ------------------
  403|      0|    destroy (user_data);							\
  404|      0|}
hb_unicode_funcs_set_compose_func:
  377|      1|				    hb_destroy_func_t		    destroy)	\
  378|      1|{										\
  379|      1|  if (hb_object_is_immutable (ufuncs))						\
  ------------------
  |  Branch (379:7): [True: 0, False: 1]
  ------------------
  380|      1|    goto fail;									\
  381|      1|										\
  382|      1|  if (!func)									\
  ------------------
  |  Branch (382:7): [True: 0, False: 1]
  ------------------
  383|      1|  {										\
  384|      0|    if (destroy)								\
  ------------------
  |  Branch (384:9): [True: 0, False: 0]
  ------------------
  385|      0|      destroy (user_data);							\
  386|      0|    destroy = nullptr;								\
  387|      0|    user_data = ufuncs->parent->user_data.name;					\
  388|      0|  }										\
  389|      1|										\
  390|      1|  if (ufuncs->destroy.name)							\
  ------------------
  |  Branch (390:7): [True: 0, False: 1]
  ------------------
  391|      1|    ufuncs->destroy.name (ufuncs->user_data.name);				\
  392|      1|										\
  393|      1|  if (func)									\
  ------------------
  |  Branch (393:7): [True: 1, False: 0]
  ------------------
  394|      1|    ufuncs->func.name = func;							\
  395|      1|  else										\
  396|      1|    ufuncs->func.name = ufuncs->parent->func.name;				\
  397|      1|  ufuncs->user_data.name = user_data;						\
  398|      1|  ufuncs->destroy.name = destroy;						\
  399|      1|  return;									\
  400|      1|										\
  401|      0|fail:										\
  402|      0|  if (destroy)									\
  ------------------
  |  Branch (402:7): [True: 0, False: 0]
  ------------------
  403|      0|    destroy (user_data);							\
  404|      0|}
hb_unicode_funcs_set_decompose_func:
  377|      1|				    hb_destroy_func_t		    destroy)	\
  378|      1|{										\
  379|      1|  if (hb_object_is_immutable (ufuncs))						\
  ------------------
  |  Branch (379:7): [True: 0, False: 1]
  ------------------
  380|      1|    goto fail;									\
  381|      1|										\
  382|      1|  if (!func)									\
  ------------------
  |  Branch (382:7): [True: 0, False: 1]
  ------------------
  383|      1|  {										\
  384|      0|    if (destroy)								\
  ------------------
  |  Branch (384:9): [True: 0, False: 0]
  ------------------
  385|      0|      destroy (user_data);							\
  386|      0|    destroy = nullptr;								\
  387|      0|    user_data = ufuncs->parent->user_data.name;					\
  388|      0|  }										\
  389|      1|										\
  390|      1|  if (ufuncs->destroy.name)							\
  ------------------
  |  Branch (390:7): [True: 0, False: 1]
  ------------------
  391|      1|    ufuncs->destroy.name (ufuncs->user_data.name);				\
  392|      1|										\
  393|      1|  if (func)									\
  ------------------
  |  Branch (393:7): [True: 1, False: 0]
  ------------------
  394|      1|    ufuncs->func.name = func;							\
  395|      1|  else										\
  396|      1|    ufuncs->func.name = ufuncs->parent->func.name;				\
  397|      1|  ufuncs->user_data.name = user_data;						\
  398|      1|  ufuncs->destroy.name = destroy;						\
  399|      1|  return;									\
  400|      1|										\
  401|      0|fail:										\
  402|      0|  if (destroy)									\
  ------------------
  |  Branch (402:7): [True: 0, False: 0]
  ------------------
  403|      0|    destroy (user_data);							\
  404|      0|}
hb_unicode_script:
  414|  2.93M|		   hb_codepoint_t      unicode)					\
  415|  2.93M|{										\
  416|  2.93M|  return ufuncs->name (unicode);						\
  417|  2.93M|}

_ZN18hb_unicode_funcs_t6scriptEj:
   70|  2.93M|  return_type name (hb_codepoint_t unicode) { return func.name (this, unicode, user_data.name); }
_ZN18hb_unicode_funcs_t16general_categoryEj:
   70|  2.93M|  return_type name (hb_codepoint_t unicode) { return func.name (this, unicode, user_data.name); }
_ZN18hb_unicode_funcs_t9decomposeEjPjS0_:
   84|   485k|  {
   85|   485k|    *a = ab; *b = 0;
   86|   485k|    return func.decompose (this, ab, a, b, user_data.decompose);
   87|   485k|  }
_ZN18hb_unicode_funcs_t20is_default_ignorableEj:
  168|   288k|  {
  169|   288k|    hb_codepoint_t plane = ch >> 16;
  170|   288k|    if (likely (plane == 0))
  ------------------
  |  |  259|   288k|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 288k, False: 3]
  |  |  ------------------
  ------------------
  171|   288k|    {
  172|       |      /* BMP */
  173|   288k|      hb_codepoint_t page = ch >> 8;
  174|   288k|      switch (page) {
  175|   288k|	case 0x00: return unlikely (ch == 0x00ADu);
  ------------------
  |  |  260|   288k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  ------------------
  |  Branch (175:2): [True: 288k, False: 6]
  ------------------
  176|      0|	case 0x03: return unlikely (ch == 0x034Fu);
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  ------------------
  |  Branch (176:2): [True: 0, False: 288k]
  ------------------
  177|      0|	case 0x06: return unlikely (ch == 0x061Cu);
  ------------------
  |  |  260|      0|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  ------------------
  |  Branch (177:2): [True: 0, False: 288k]
  ------------------
  178|      0|	case 0x17: return hb_in_range<hb_codepoint_t> (ch, 0x17B4u, 0x17B5u);
  ------------------
  |  Branch (178:2): [True: 0, False: 288k]
  ------------------
  179|      0|	case 0x18: return hb_in_range<hb_codepoint_t> (ch, 0x180Bu, 0x180Eu);
  ------------------
  |  Branch (179:2): [True: 0, False: 288k]
  ------------------
  180|      6|	case 0x20: return hb_in_ranges<hb_codepoint_t> (ch, 0x200Bu, 0x200Fu,
  ------------------
  |  Branch (180:2): [True: 6, False: 288k]
  ------------------
  181|      6|					    0x202Au, 0x202Eu,
  182|      6|					    0x2060u, 0x206Fu);
  183|      0|	case 0xFE: return hb_in_range<hb_codepoint_t> (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu;
  ------------------
  |  Branch (183:2): [True: 0, False: 288k]
  |  Branch (183:20): [True: 0, False: 0]
  |  Branch (183:74): [True: 0, False: 0]
  ------------------
  184|      0|	case 0xFF: return hb_in_range<hb_codepoint_t> (ch, 0xFFF0u, 0xFFF8u);
  ------------------
  |  Branch (184:2): [True: 0, False: 288k]
  ------------------
  185|      0|	default: return false;
  ------------------
  |  Branch (185:2): [True: 0, False: 288k]
  ------------------
  186|   288k|      }
  187|   288k|    }
  188|      3|    else
  189|      3|    {
  190|       |      /* Other planes */
  191|      3|      switch (plane) {
  192|      0|	case 0x01: return hb_in_range<hb_codepoint_t> (ch, 0x1D173u, 0x1D17Au);
  ------------------
  |  Branch (192:2): [True: 0, False: 3]
  ------------------
  193|      3|	case 0x0E: return hb_in_range<hb_codepoint_t> (ch, 0xE0000u, 0xE0FFFu);
  ------------------
  |  Branch (193:2): [True: 3, False: 0]
  ------------------
  194|      0|	default: return false;
  ------------------
  |  Branch (194:2): [True: 0, False: 3]
  ------------------
  195|      3|      }
  196|      3|    }
  197|   288k|  }

_ZN13hb_utf32_xe_tIjLb1EE4nextEPKjS2_Pjj:
  302|  2.93M|  {
  303|  2.93M|    hb_codepoint_t c = *unicode = *text++;
  304|  2.93M|    if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
  ------------------
  |  |  260|  2.93M|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2.93M]
  |  |  |  Branch (260:47): [True: 0, False: 3]
  |  |  |  Branch (260:47): [True: 0, False: 3]
  |  |  |  Branch (260:47): [True: 3, False: 2.93M]
  |  |  ------------------
  ------------------
  |  Branch (304:9): [Folded - Ignored]
  ------------------
  305|      0|      *unicode = replacement;
  306|  2.93M|    return text;
  307|  2.93M|  }

_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE4finiEv:
  104|     11|  {
  105|       |    /* We allow a hack to make the vector point to a foreign array
  106|       |     * by the user. In that case length/arrayZ are non-zero but
  107|       |     * allocated is zero. Don't free anything. */
  108|     11|    if (allocated)
  ------------------
  |  Branch (108:9): [True: 11, False: 0]
  ------------------
  109|     11|    {
  110|     11|      shrink_vector (0);
  111|     11|      hb_free (arrayZ);
  ------------------
  |  |  237|     11|#define hb_free hb_free_impl
  ------------------
  112|     11|    }
  113|     11|    init ();
  114|     11|  }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE13shrink_vectorEj:
  358|     11|  {
  359|     11|    assert (size <= length);
  360|     11|    if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (360:9): [Folded - Ignored]
  ------------------
  361|      0|    {
  362|      0|      unsigned count = length - size;
  363|      0|      Type *p = arrayZ + length - 1;
  364|      0|      while (count--)
  ------------------
  |  Branch (364:14): [True: 0, False: 0]
  ------------------
  365|      0|        p--->~Type ();
  366|      0|    }
  367|     11|    length = size;
  368|     11|  }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE4initEv:
   95|     22|  {
   96|     22|    allocated = length = 0;
   97|     22|    arrayZ = nullptr;
   98|     22|  }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE4tailEv:
  168|     11|  Type& tail () { return (*this)[length - 1]; }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EEixEi:
  154|     11|  {
  155|     11|    unsigned int i = (unsigned int) i_;
  156|     11|    if (unlikely (i >= length))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  157|      0|      return Crap (Type);
  ------------------
  |  |  188|      0|#define Crap(Type) CrapHelper<Type>::get_crap ()
  ------------------
  158|     11|    return arrayZ[i];
  159|     11|  }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE3popEv:
  461|     11|  {
  462|     11|    if (!length) return Null (Type);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  |  Branch (462:9): [True: 0, False: 11]
  ------------------
  463|     11|    Type v (std::move (arrayZ[length - 1]));
  464|     11|    arrayZ[length - 1].~Type ();
  465|     11|    length--;
  466|     11|    return v;
  467|     11|  }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE8as_arrayEv:
  178|     11|  array_t   as_array ()       { return hb_array (arrayZ, length); }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE7lsearchIS1_EEPS1_RKT_S4_:
  510|     11|  { return as_array ().lsearch (x, not_found); }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE4pushIJRS1_EEEPS1_DpOT_:
  212|     11|  {
  213|     11|    if (unlikely ((int) length >= allocated && !alloc (length + 1)))
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  214|       |      // If push failed to allocate then don't copy v, since this may cause
  215|       |      // the created copy to leak memory since we won't have stored a
  216|       |      // reference to it.
  217|      0|      return std::addressof (Crap (Type));
  ------------------
  |  |  188|      0|#define Crap(Type) CrapHelper<Type>::get_crap ()
  ------------------
  218|       |
  219|       |    /* Emplace. */
  220|     11|    Type *p = std::addressof (arrayZ[length++]);
  221|     11|    return new (p) Type (std::forward<Args> (args)...);
  222|     11|  }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE5allocEjb:
  379|     11|  {
  380|     11|    if (unlikely (in_error ()))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  381|      0|      return false;
  382|       |
  383|     11|    unsigned int new_allocated;
  384|     11|    if (exact)
  ------------------
  |  Branch (384:9): [True: 0, False: 11]
  ------------------
  385|      0|    {
  386|       |      /* If exact was specified, we allow shrinking the storage. */
  387|      0|      size = hb_max (size, length);
  388|      0|      if (size <= (unsigned) allocated &&
  ------------------
  |  Branch (388:11): [True: 0, False: 0]
  ------------------
  389|      0|	  size >= (unsigned) allocated >> 2)
  ------------------
  |  Branch (389:4): [True: 0, False: 0]
  ------------------
  390|      0|	return true;
  391|       |
  392|      0|      new_allocated = size;
  393|      0|    }
  394|     11|    else
  395|     11|    {
  396|     11|      if (likely (size <= (unsigned) allocated))
  ------------------
  |  |  259|     11|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  397|      0|	return true;
  398|       |
  399|     11|      new_allocated = allocated;
  400|     22|      while (size > new_allocated)
  ------------------
  |  Branch (400:14): [True: 11, False: 11]
  ------------------
  401|     11|	new_allocated += (new_allocated >> 1) + 8;
  402|     11|    }
  403|       |
  404|       |
  405|       |    /* Reallocate */
  406|       |
  407|     11|    bool overflows =
  408|     11|      (int) in_error () ||
  ------------------
  |  Branch (408:7): [True: 0, False: 11]
  ------------------
  409|     11|      (new_allocated < size) ||
  ------------------
  |  Branch (409:7): [True: 0, False: 11]
  ------------------
  410|     11|      hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
  ------------------
  |  Branch (410:7): [True: 0, False: 11]
  ------------------
  411|       |
  412|     11|    if (unlikely (overflows))
  ------------------
  |  |  260|     11|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  413|      0|    {
  414|      0|      set_error ();
  415|      0|      return false;
  416|      0|    }
  417|       |
  418|     11|    Type *new_array = realloc_vector (new_allocated, hb_prioritize);
  ------------------
  |  |   81|     11|#define hb_prioritize hb_priority<16> ()
  ------------------
  419|       |
  420|     11|    if (unlikely (new_allocated && !new_array))
  ------------------
  |  |  260|     22|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 11]
  |  |  |  Branch (260:47): [True: 11, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  421|      0|    {
  422|      0|      if (new_allocated <= (unsigned) allocated)
  ------------------
  |  Branch (422:11): [True: 0, False: 0]
  ------------------
  423|      0|        return true; // shrinking failed; it's okay; happens in our fuzzer
  424|       |
  425|      0|      set_error ();
  426|      0|      return false;
  427|      0|    }
  428|       |
  429|     11|    arrayZ = new_array;
  430|     11|    allocated = new_allocated;
  431|       |
  432|     11|    return true;
  433|     11|  }
_ZN11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE14realloc_vectorIS1_LPv0EEEPS1_j11hb_priorityILj0EE:
  240|     11|  {
  241|     11|    if (!new_allocated)
  ------------------
  |  Branch (241:9): [True: 0, False: 11]
  ------------------
  242|      0|    {
  243|      0|      hb_free (arrayZ);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  244|      0|      return nullptr;
  245|      0|    }
  246|     11|    return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
  ------------------
  |  |  236|     11|#define hb_realloc hb_realloc_impl
  ------------------
  247|     11|  }
_ZNK11hb_vector_tIN20hb_user_data_array_t19hb_user_data_item_tELb0EE8in_errorEv:
  224|     33|  bool in_error () const { return allocated < 0; }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE5init0Ev:
  100|     13|  {
  101|     13|  }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE5init0Ev:
  100|     26|  {
  101|     26|  }
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE5init0Ev:
  100|     26|  {
  101|     26|  }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE4finiEv:
  104|     26|  {
  105|       |    /* We allow a hack to make the vector point to a foreign array
  106|       |     * by the user. In that case length/arrayZ are non-zero but
  107|       |     * allocated is zero. Don't free anything. */
  108|     26|    if (allocated)
  ------------------
  |  Branch (108:9): [True: 13, False: 13]
  ------------------
  109|     13|    {
  110|     13|      shrink_vector (0);
  111|     13|      hb_free (arrayZ);
  ------------------
  |  |  237|     13|#define hb_free hb_free_impl
  ------------------
  112|     13|    }
  113|     26|    init ();
  114|     26|  }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE13shrink_vectorEj:
  358|     13|  {
  359|     13|    assert (size <= length);
  360|     13|    if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (360:9): [Folded - Ignored]
  ------------------
  361|      0|    {
  362|      0|      unsigned count = length - size;
  363|      0|      Type *p = arrayZ + length - 1;
  364|      0|      while (count--)
  ------------------
  |  Branch (364:14): [True: 0, False: 0]
  ------------------
  365|      0|        p--->~Type ();
  366|      0|    }
  367|     13|    length = size;
  368|     13|  }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE4initEv:
   95|     26|  {
   96|     26|    allocated = length = 0;
   97|     26|    arrayZ = nullptr;
   98|     26|  }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE4finiEv:
  104|     52|  {
  105|       |    /* We allow a hack to make the vector point to a foreign array
  106|       |     * by the user. In that case length/arrayZ are non-zero but
  107|       |     * allocated is zero. Don't free anything. */
  108|     52|    if (allocated)
  ------------------
  |  Branch (108:9): [True: 2, False: 50]
  ------------------
  109|      2|    {
  110|      2|      shrink_vector (0);
  111|      2|      hb_free (arrayZ);
  ------------------
  |  |  237|      2|#define hb_free hb_free_impl
  ------------------
  112|      2|    }
  113|     52|    init ();
  114|     52|  }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE13shrink_vectorEj:
  358|      2|  {
  359|      2|    assert (size <= length);
  360|      2|    if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (360:9): [Folded - Ignored]
  ------------------
  361|      0|    {
  362|      0|      unsigned count = length - size;
  363|      0|      Type *p = arrayZ + length - 1;
  364|      0|      while (count--)
  ------------------
  |  Branch (364:14): [True: 0, False: 0]
  ------------------
  365|      0|        p--->~Type ();
  366|      0|    }
  367|      2|    length = size;
  368|      2|  }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE4initEv:
   95|     52|  {
   96|     52|    allocated = length = 0;
   97|     52|    arrayZ = nullptr;
   98|     52|  }
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE4finiEv:
  104|     52|  {
  105|       |    /* We allow a hack to make the vector point to a foreign array
  106|       |     * by the user. In that case length/arrayZ are non-zero but
  107|       |     * allocated is zero. Don't free anything. */
  108|     52|    if (allocated)
  ------------------
  |  Branch (108:9): [True: 26, False: 26]
  ------------------
  109|     26|    {
  110|     26|      shrink_vector (0);
  111|     26|      hb_free (arrayZ);
  ------------------
  |  |  237|     26|#define hb_free hb_free_impl
  ------------------
  112|     26|    }
  113|     52|    init ();
  114|     52|  }
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE13shrink_vectorEj:
  358|     26|  {
  359|     26|    assert (size <= length);
  360|     26|    if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (360:9): [Folded - Ignored]
  ------------------
  361|      0|    {
  362|      0|      unsigned count = length - size;
  363|      0|      Type *p = arrayZ + length - 1;
  364|      0|      while (count--)
  ------------------
  |  Branch (364:14): [True: 0, False: 0]
  ------------------
  365|      0|        p--->~Type ();
  366|      0|    }
  367|     26|    length = size;
  368|     26|  }
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE4initEv:
   95|     52|  {
   96|     52|    allocated = length = 0;
   97|     52|    arrayZ = nullptr;
   98|     52|  }
_ZNK11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE7bsearchIjLb1ELPv0EEEPKS1_RKT_S6_:
  526|    117|  { return as_array ().bsearch (x, not_found); }
_ZNK11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE8as_arrayEv:
  179|    117|  c_array_t as_array () const { return hb_array (arrayZ, length); }
_ZNK11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EEixEi:
  161|   614k|  {
  162|   614k|    unsigned int i = (unsigned int) i_;
  163|   614k|    if (unlikely (i >= length))
  ------------------
  |  |  260|   614k|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 614k]
  |  |  ------------------
  ------------------
  164|      0|      return Null (Type);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  165|   614k|    return arrayZ[i];
  166|   614k|  }
_ZN11hb_vector_tI24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES0_IS1_ImLj0EES1_ImLj9EEEELb0EED2Ev:
   86|     11|  ~hb_vector_t () { fini (); }
_ZN11hb_vector_tI24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES0_IS1_ImLj0EES1_ImLj9EEEELb0EE4finiEv:
  104|     11|  {
  105|       |    /* We allow a hack to make the vector point to a foreign array
  106|       |     * by the user. In that case length/arrayZ are non-zero but
  107|       |     * allocated is zero. Don't free anything. */
  108|     11|    if (allocated)
  ------------------
  |  Branch (108:9): [True: 0, False: 11]
  ------------------
  109|      0|    {
  110|      0|      shrink_vector (0);
  111|      0|      hb_free (arrayZ);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  112|      0|    }
  113|     11|    init ();
  114|     11|  }
_ZN11hb_vector_tI24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES0_IS1_ImLj0EES1_ImLj9EEEELb0EE4initEv:
   95|     11|  {
   96|     11|    allocated = length = 0;
   97|     11|    arrayZ = nullptr;
   98|     11|  }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EEC2Ev:
   45|     13|  hb_vector_t () = default;
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EEC2Ev:
   45|     26|  hb_vector_t () = default;
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EEC2Ev:
   45|     26|  hb_vector_t () = default;
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EED2Ev:
   86|     26|  ~hb_vector_t () { fini (); }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EED2Ev:
   86|     26|  ~hb_vector_t () { fini (); }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EED2Ev:
   86|     13|  ~hb_vector_t () { fini (); }
_ZN11hb_vector_tI24hb_set_digest_combiner_tI28hb_set_digest_bits_pattern_tImLj4EES0_IS1_ImLj0EES1_ImLj9EEEELb0EEC2Ev:
   45|     11|  hb_vector_t () = default;
_ZNK11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EEixEi:
  161|     45|  {
  162|     45|    unsigned int i = (unsigned int) i_;
  163|     45|    if (unlikely (i >= length))
  ------------------
  |  |  260|     45|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 45]
  |  |  ------------------
  ------------------
  164|      0|      return Null (Type);
  ------------------
  |  |  124|      0|#define Null(Type) NullHelper<Type>::get_null ()
  ------------------
  165|     45|    return arrayZ[i];
  166|     45|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EEC2Ev:
   45|     13|  hb_vector_t () = default;
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EEC2Ev:
   45|     26|  hb_vector_t () = default;
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EED2Ev:
   86|     26|  ~hb_vector_t () { fini (); }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EED2Ev:
   86|     13|  ~hb_vector_t () { fini (); }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE4initEv:
   95|     39|  {
   96|     39|    allocated = length = 0;
   97|     39|    arrayZ = nullptr;
   98|     39|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EE4initEv:
   95|     78|  {
   96|     78|    allocated = length = 0;
   97|     78|    arrayZ = nullptr;
   98|     78|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE4finiEv:
  104|     26|  {
  105|       |    /* We allow a hack to make the vector point to a foreign array
  106|       |     * by the user. In that case length/arrayZ are non-zero but
  107|       |     * allocated is zero. Don't free anything. */
  108|     26|    if (allocated)
  ------------------
  |  Branch (108:9): [True: 13, False: 13]
  ------------------
  109|     13|    {
  110|     13|      shrink_vector (0);
  111|     13|      hb_free (arrayZ);
  ------------------
  |  |  237|     13|#define hb_free hb_free_impl
  ------------------
  112|     13|    }
  113|     26|    init ();
  114|     26|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE13shrink_vectorEj:
  358|     26|  {
  359|     26|    assert (size <= length);
  360|     26|    if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (360:9): [Folded - Ignored]
  ------------------
  361|      0|    {
  362|      0|      unsigned count = length - size;
  363|      0|      Type *p = arrayZ + length - 1;
  364|      0|      while (count--)
  ------------------
  |  Branch (364:14): [True: 0, False: 0]
  ------------------
  365|      0|        p--->~Type ();
  366|      0|    }
  367|     26|    length = size;
  368|     26|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EE4finiEv:
  104|     52|  {
  105|       |    /* We allow a hack to make the vector point to a foreign array
  106|       |     * by the user. In that case length/arrayZ are non-zero but
  107|       |     * allocated is zero. Don't free anything. */
  108|     52|    if (allocated)
  ------------------
  |  Branch (108:9): [True: 26, False: 26]
  ------------------
  109|     26|    {
  110|     26|      shrink_vector (0);
  111|     26|      hb_free (arrayZ);
  ------------------
  |  |  237|     26|#define hb_free hb_free_impl
  ------------------
  112|     26|    }
  113|     52|    init ();
  114|     52|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EE13shrink_vectorEj:
  358|     26|  {
  359|     26|    assert (size <= length);
  360|     26|    if (!std::is_trivially_destructible<Type>::value)
  ------------------
  |  Branch (360:9): [Folded - Ignored]
  ------------------
  361|      0|    {
  362|      0|      unsigned count = length - size;
  363|      0|      Type *p = arrayZ + length - 1;
  364|      0|      while (count--)
  ------------------
  |  Branch (364:14): [True: 0, False: 0]
  ------------------
  365|      0|        p--->~Type ();
  366|      0|    }
  367|     26|    length = size;
  368|     26|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE4pushEv:
  206|    403|  {
  207|    403|    if (unlikely (!resize (length + 1)))
  ------------------
  |  |  260|    403|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 403]
  |  |  ------------------
  ------------------
  208|      0|      return std::addressof (Crap (Type));
  ------------------
  |  |  188|      0|#define Crap(Type) CrapHelper<Type>::get_crap ()
  ------------------
  209|    403|    return std::addressof (arrayZ[length - 1]);
  210|    403|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE6resizeEibb:
  436|    403|  {
  437|    403|    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
  ------------------
  |  Branch (437:25): [True: 0, False: 403]
  ------------------
  438|    403|    if (!alloc (size, exact))
  ------------------
  |  Branch (438:9): [True: 0, False: 403]
  ------------------
  439|      0|      return false;
  440|       |
  441|    403|    if (size > length)
  ------------------
  |  Branch (441:9): [True: 403, False: 0]
  ------------------
  442|    403|    {
  443|    403|      if (initialize)
  ------------------
  |  Branch (443:11): [True: 403, False: 0]
  ------------------
  444|    403|	grow_vector (size, hb_prioritize);
  ------------------
  |  |   81|    403|#define hb_prioritize hb_priority<16> ()
  ------------------
  445|    403|    }
  446|      0|    else if (size < length)
  ------------------
  |  Branch (446:14): [True: 0, False: 0]
  ------------------
  447|      0|    {
  448|      0|      if (initialize)
  ------------------
  |  Branch (448:11): [True: 0, False: 0]
  ------------------
  449|      0|	shrink_vector (size);
  450|      0|    }
  451|       |
  452|    403|    length = size;
  453|    403|    return true;
  454|    403|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE5allocEjb:
  379|    416|  {
  380|    416|    if (unlikely (in_error ()))
  ------------------
  |  |  260|    416|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 416]
  |  |  ------------------
  ------------------
  381|      0|      return false;
  382|       |
  383|    416|    unsigned int new_allocated;
  384|    416|    if (exact)
  ------------------
  |  Branch (384:9): [True: 13, False: 403]
  ------------------
  385|     13|    {
  386|       |      /* If exact was specified, we allow shrinking the storage. */
  387|     13|      size = hb_max (size, length);
  388|     13|      if (size <= (unsigned) allocated &&
  ------------------
  |  Branch (388:11): [True: 13, False: 0]
  ------------------
  389|     13|	  size >= (unsigned) allocated >> 2)
  ------------------
  |  Branch (389:4): [True: 13, False: 0]
  ------------------
  390|     13|	return true;
  391|       |
  392|      0|      new_allocated = size;
  393|      0|    }
  394|    403|    else
  395|    403|    {
  396|    403|      if (likely (size <= (unsigned) allocated))
  ------------------
  |  |  259|    403|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 364, False: 39]
  |  |  ------------------
  ------------------
  397|    364|	return true;
  398|       |
  399|     39|      new_allocated = allocated;
  400|     78|      while (size > new_allocated)
  ------------------
  |  Branch (400:14): [True: 39, False: 39]
  ------------------
  401|     39|	new_allocated += (new_allocated >> 1) + 8;
  402|     39|    }
  403|       |
  404|       |
  405|       |    /* Reallocate */
  406|       |
  407|     39|    bool overflows =
  408|     39|      (int) in_error () ||
  ------------------
  |  Branch (408:7): [True: 0, False: 39]
  ------------------
  409|     39|      (new_allocated < size) ||
  ------------------
  |  Branch (409:7): [True: 0, False: 39]
  ------------------
  410|     39|      hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
  ------------------
  |  Branch (410:7): [True: 0, False: 39]
  ------------------
  411|       |
  412|     39|    if (unlikely (overflows))
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
  413|      0|    {
  414|      0|      set_error ();
  415|      0|      return false;
  416|      0|    }
  417|       |
  418|     39|    Type *new_array = realloc_vector (new_allocated, hb_prioritize);
  ------------------
  |  |   81|     39|#define hb_prioritize hb_priority<16> ()
  ------------------
  419|       |
  420|     39|    if (unlikely (new_allocated && !new_array))
  ------------------
  |  |  260|     78|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  |  Branch (260:47): [True: 39, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 39]
  |  |  ------------------
  ------------------
  421|      0|    {
  422|      0|      if (new_allocated <= (unsigned) allocated)
  ------------------
  |  Branch (422:11): [True: 0, False: 0]
  ------------------
  423|      0|        return true; // shrinking failed; it's okay; happens in our fuzzer
  424|       |
  425|      0|      set_error ();
  426|      0|      return false;
  427|      0|    }
  428|       |
  429|     39|    arrayZ = new_array;
  430|     39|    allocated = new_allocated;
  431|       |
  432|     39|    return true;
  433|     39|  }
_ZNK11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE8in_errorEv:
  224|    455|  bool in_error () const { return allocated < 0; }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE14realloc_vectorIS1_LPv0EEEPS1_j11hb_priorityILj0EE:
  240|     39|  {
  241|     39|    if (!new_allocated)
  ------------------
  |  Branch (241:9): [True: 0, False: 39]
  ------------------
  242|      0|    {
  243|      0|      hb_free (arrayZ);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  244|      0|      return nullptr;
  245|      0|    }
  246|     39|    return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
  ------------------
  |  |  236|     39|#define hb_realloc hb_realloc_impl
  ------------------
  247|     39|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE11grow_vectorIS1_LPv0EEEvj11hb_priorityILj0EE:
  290|    403|  {
  291|    403|    hb_memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
  292|    403|    length = size;
  293|    403|  }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE4pushEv:
  206|      5|  {
  207|      5|    if (unlikely (!resize (length + 1)))
  ------------------
  |  |  260|      5|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  208|      0|      return std::addressof (Crap (Type));
  ------------------
  |  |  188|      0|#define Crap(Type) CrapHelper<Type>::get_crap ()
  ------------------
  209|      5|    return std::addressof (arrayZ[length - 1]);
  210|      5|  }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE6resizeEibb:
  436|      5|  {
  437|      5|    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
  ------------------
  |  Branch (437:25): [True: 0, False: 5]
  ------------------
  438|      5|    if (!alloc (size, exact))
  ------------------
  |  Branch (438:9): [True: 0, False: 5]
  ------------------
  439|      0|      return false;
  440|       |
  441|      5|    if (size > length)
  ------------------
  |  Branch (441:9): [True: 5, False: 0]
  ------------------
  442|      5|    {
  443|      5|      if (initialize)
  ------------------
  |  Branch (443:11): [True: 5, False: 0]
  ------------------
  444|      5|	grow_vector (size, hb_prioritize);
  ------------------
  |  |   81|      5|#define hb_prioritize hb_priority<16> ()
  ------------------
  445|      5|    }
  446|      0|    else if (size < length)
  ------------------
  |  Branch (446:14): [True: 0, False: 0]
  ------------------
  447|      0|    {
  448|      0|      if (initialize)
  ------------------
  |  Branch (448:11): [True: 0, False: 0]
  ------------------
  449|      0|	shrink_vector (size);
  450|      0|    }
  451|       |
  452|      5|    length = size;
  453|      5|    return true;
  454|      5|  }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE5allocEjb:
  379|      5|  {
  380|      5|    if (unlikely (in_error ()))
  ------------------
  |  |  260|      5|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  381|      0|      return false;
  382|       |
  383|      5|    unsigned int new_allocated;
  384|      5|    if (exact)
  ------------------
  |  Branch (384:9): [True: 0, False: 5]
  ------------------
  385|      0|    {
  386|       |      /* If exact was specified, we allow shrinking the storage. */
  387|      0|      size = hb_max (size, length);
  388|      0|      if (size <= (unsigned) allocated &&
  ------------------
  |  Branch (388:11): [True: 0, False: 0]
  ------------------
  389|      0|	  size >= (unsigned) allocated >> 2)
  ------------------
  |  Branch (389:4): [True: 0, False: 0]
  ------------------
  390|      0|	return true;
  391|       |
  392|      0|      new_allocated = size;
  393|      0|    }
  394|      5|    else
  395|      5|    {
  396|      5|      if (likely (size <= (unsigned) allocated))
  ------------------
  |  |  259|      5|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 3, False: 2]
  |  |  ------------------
  ------------------
  397|      3|	return true;
  398|       |
  399|      2|      new_allocated = allocated;
  400|      4|      while (size > new_allocated)
  ------------------
  |  Branch (400:14): [True: 2, False: 2]
  ------------------
  401|      2|	new_allocated += (new_allocated >> 1) + 8;
  402|      2|    }
  403|       |
  404|       |
  405|       |    /* Reallocate */
  406|       |
  407|      2|    bool overflows =
  408|      2|      (int) in_error () ||
  ------------------
  |  Branch (408:7): [True: 0, False: 2]
  ------------------
  409|      2|      (new_allocated < size) ||
  ------------------
  |  Branch (409:7): [True: 0, False: 2]
  ------------------
  410|      2|      hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
  ------------------
  |  Branch (410:7): [True: 0, False: 2]
  ------------------
  411|       |
  412|      2|    if (unlikely (overflows))
  ------------------
  |  |  260|      2|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  413|      0|    {
  414|      0|      set_error ();
  415|      0|      return false;
  416|      0|    }
  417|       |
  418|      2|    Type *new_array = realloc_vector (new_allocated, hb_prioritize);
  ------------------
  |  |   81|      2|#define hb_prioritize hb_priority<16> ()
  ------------------
  419|       |
  420|      2|    if (unlikely (new_allocated && !new_array))
  ------------------
  |  |  260|      4|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 2]
  |  |  |  Branch (260:47): [True: 2, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  421|      0|    {
  422|      0|      if (new_allocated <= (unsigned) allocated)
  ------------------
  |  Branch (422:11): [True: 0, False: 0]
  ------------------
  423|      0|        return true; // shrinking failed; it's okay; happens in our fuzzer
  424|       |
  425|      0|      set_error ();
  426|      0|      return false;
  427|      0|    }
  428|       |
  429|      2|    arrayZ = new_array;
  430|      2|    allocated = new_allocated;
  431|       |
  432|      2|    return true;
  433|      2|  }
_ZNK11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE8in_errorEv:
  224|      7|  bool in_error () const { return allocated < 0; }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE14realloc_vectorIS1_LPv0EEEPS1_j11hb_priorityILj0EE:
  240|      2|  {
  241|      2|    if (!new_allocated)
  ------------------
  |  Branch (241:9): [True: 0, False: 2]
  ------------------
  242|      0|    {
  243|      0|      hb_free (arrayZ);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  244|      0|      return nullptr;
  245|      0|    }
  246|      2|    return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
  ------------------
  |  |  236|      2|#define hb_realloc hb_realloc_impl
  ------------------
  247|      2|  }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE11grow_vectorIS1_LPv0EEEvj11hb_priorityILj0EE:
  290|      5|  {
  291|      5|    hb_memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
  292|      5|    length = size;
  293|      5|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EE4pushEv:
  206|     39|  {
  207|     39|    if (unlikely (!resize (length + 1)))
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
  208|      0|      return std::addressof (Crap (Type));
  ------------------
  |  |  188|      0|#define Crap(Type) CrapHelper<Type>::get_crap ()
  ------------------
  209|     39|    return std::addressof (arrayZ[length - 1]);
  210|     39|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EE6resizeEibb:
  436|     39|  {
  437|     39|    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
  ------------------
  |  Branch (437:25): [True: 0, False: 39]
  ------------------
  438|     39|    if (!alloc (size, exact))
  ------------------
  |  Branch (438:9): [True: 0, False: 39]
  ------------------
  439|      0|      return false;
  440|       |
  441|     39|    if (size > length)
  ------------------
  |  Branch (441:9): [True: 39, False: 0]
  ------------------
  442|     39|    {
  443|     39|      if (initialize)
  ------------------
  |  Branch (443:11): [True: 39, False: 0]
  ------------------
  444|     39|	grow_vector (size, hb_prioritize);
  ------------------
  |  |   81|     39|#define hb_prioritize hb_priority<16> ()
  ------------------
  445|     39|    }
  446|      0|    else if (size < length)
  ------------------
  |  Branch (446:14): [True: 0, False: 0]
  ------------------
  447|      0|    {
  448|      0|      if (initialize)
  ------------------
  |  Branch (448:11): [True: 0, False: 0]
  ------------------
  449|      0|	shrink_vector (size);
  450|      0|    }
  451|       |
  452|     39|    length = size;
  453|     39|    return true;
  454|     39|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EE5allocEjb:
  379|     39|  {
  380|     39|    if (unlikely (in_error ()))
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
  381|      0|      return false;
  382|       |
  383|     39|    unsigned int new_allocated;
  384|     39|    if (exact)
  ------------------
  |  Branch (384:9): [True: 0, False: 39]
  ------------------
  385|      0|    {
  386|       |      /* If exact was specified, we allow shrinking the storage. */
  387|      0|      size = hb_max (size, length);
  388|      0|      if (size <= (unsigned) allocated &&
  ------------------
  |  Branch (388:11): [True: 0, False: 0]
  ------------------
  389|      0|	  size >= (unsigned) allocated >> 2)
  ------------------
  |  Branch (389:4): [True: 0, False: 0]
  ------------------
  390|      0|	return true;
  391|       |
  392|      0|      new_allocated = size;
  393|      0|    }
  394|     39|    else
  395|     39|    {
  396|     39|      if (likely (size <= (unsigned) allocated))
  ------------------
  |  |  259|     39|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 13, False: 26]
  |  |  ------------------
  ------------------
  397|     13|	return true;
  398|       |
  399|     26|      new_allocated = allocated;
  400|     52|      while (size > new_allocated)
  ------------------
  |  Branch (400:14): [True: 26, False: 26]
  ------------------
  401|     26|	new_allocated += (new_allocated >> 1) + 8;
  402|     26|    }
  403|       |
  404|       |
  405|       |    /* Reallocate */
  406|       |
  407|     26|    bool overflows =
  408|     26|      (int) in_error () ||
  ------------------
  |  Branch (408:7): [True: 0, False: 26]
  ------------------
  409|     26|      (new_allocated < size) ||
  ------------------
  |  Branch (409:7): [True: 0, False: 26]
  ------------------
  410|     26|      hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
  ------------------
  |  Branch (410:7): [True: 0, False: 26]
  ------------------
  411|       |
  412|     26|    if (unlikely (overflows))
  ------------------
  |  |  260|     26|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 26]
  |  |  ------------------
  ------------------
  413|      0|    {
  414|      0|      set_error ();
  415|      0|      return false;
  416|      0|    }
  417|       |
  418|     26|    Type *new_array = realloc_vector (new_allocated, hb_prioritize);
  ------------------
  |  |   81|     26|#define hb_prioritize hb_priority<16> ()
  ------------------
  419|       |
  420|     26|    if (unlikely (new_allocated && !new_array))
  ------------------
  |  |  260|     52|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 26]
  |  |  |  Branch (260:47): [True: 26, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 26]
  |  |  ------------------
  ------------------
  421|      0|    {
  422|      0|      if (new_allocated <= (unsigned) allocated)
  ------------------
  |  Branch (422:11): [True: 0, False: 0]
  ------------------
  423|      0|        return true; // shrinking failed; it's okay; happens in our fuzzer
  424|       |
  425|      0|      set_error ();
  426|      0|      return false;
  427|      0|    }
  428|       |
  429|     26|    arrayZ = new_array;
  430|     26|    allocated = new_allocated;
  431|       |
  432|     26|    return true;
  433|     26|  }
_ZNK11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EE8in_errorEv:
  224|     65|  bool in_error () const { return allocated < 0; }
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EE14realloc_vectorIS1_LPv0EEEPS1_j11hb_priorityILj0EE:
  240|     26|  {
  241|     26|    if (!new_allocated)
  ------------------
  |  Branch (241:9): [True: 0, False: 26]
  ------------------
  242|      0|    {
  243|      0|      hb_free (arrayZ);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  244|      0|      return nullptr;
  245|      0|    }
  246|     26|    return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
  ------------------
  |  |  236|     26|#define hb_realloc hb_realloc_impl
  ------------------
  247|     26|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EE11grow_vectorIS1_LPv0EEEvj11hb_priorityILj0EE:
  290|     39|  {
  291|     39|    hb_memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
  292|     39|    length = size;
  293|     39|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE5qsortEPFiPKvS4_E:
  505|     13|  { as_array ().qsort (cmp); }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE8as_arrayEv:
  178|     13|  array_t   as_array ()       { return hb_array (arrayZ, length); }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EE6shrinkEib:
  491|     13|  {
  492|     13|    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
  ------------------
  |  Branch (492:25): [True: 0, False: 13]
  ------------------
  493|     13|    if (size >= length)
  ------------------
  |  Branch (493:9): [True: 0, False: 13]
  ------------------
  494|      0|      return;
  495|       |
  496|     13|    shrink_vector (size);
  497|       |
  498|     13|    if (shrink_memory)
  ------------------
  |  Branch (498:9): [True: 13, False: 0]
  ------------------
  499|     13|      alloc (size, true); /* To force shrinking memory if needed. */
  500|     13|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t14feature_info_tELb0EEixEi:
  154|    364|  {
  155|    364|    unsigned int i = (unsigned int) i_;
  156|    364|    if (unlikely (i >= length))
  ------------------
  |  |  260|    364|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 364]
  |  |  ------------------
  ------------------
  157|      0|      return Crap (Type);
  ------------------
  |  |  188|      0|#define Crap(Type) CrapHelper<Type>::get_crap ()
  ------------------
  158|    364|    return arrayZ[i];
  159|    364|  }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE4pushEv:
  206|     17|  {
  207|     17|    if (unlikely (!resize (length + 1)))
  ------------------
  |  |  260|     17|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 17]
  |  |  ------------------
  ------------------
  208|      0|      return std::addressof (Crap (Type));
  ------------------
  |  |  188|      0|#define Crap(Type) CrapHelper<Type>::get_crap ()
  ------------------
  209|     17|    return std::addressof (arrayZ[length - 1]);
  210|     17|  }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE6resizeEibb:
  436|     17|  {
  437|     17|    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
  ------------------
  |  Branch (437:25): [True: 0, False: 17]
  ------------------
  438|     17|    if (!alloc (size, exact))
  ------------------
  |  Branch (438:9): [True: 0, False: 17]
  ------------------
  439|      0|      return false;
  440|       |
  441|     17|    if (size > length)
  ------------------
  |  Branch (441:9): [True: 17, False: 0]
  ------------------
  442|     17|    {
  443|     17|      if (initialize)
  ------------------
  |  Branch (443:11): [True: 17, False: 0]
  ------------------
  444|     17|	grow_vector (size, hb_prioritize);
  ------------------
  |  |   81|     17|#define hb_prioritize hb_priority<16> ()
  ------------------
  445|     17|    }
  446|      0|    else if (size < length)
  ------------------
  |  Branch (446:14): [True: 0, False: 0]
  ------------------
  447|      0|    {
  448|      0|      if (initialize)
  ------------------
  |  Branch (448:11): [True: 0, False: 0]
  ------------------
  449|      0|	shrink_vector (size);
  450|      0|    }
  451|       |
  452|     17|    length = size;
  453|     17|    return true;
  454|     17|  }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE5allocEjb:
  379|     17|  {
  380|     17|    if (unlikely (in_error ()))
  ------------------
  |  |  260|     17|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 17]
  |  |  ------------------
  ------------------
  381|      0|      return false;
  382|       |
  383|     17|    unsigned int new_allocated;
  384|     17|    if (exact)
  ------------------
  |  Branch (384:9): [True: 0, False: 17]
  ------------------
  385|      0|    {
  386|       |      /* If exact was specified, we allow shrinking the storage. */
  387|      0|      size = hb_max (size, length);
  388|      0|      if (size <= (unsigned) allocated &&
  ------------------
  |  Branch (388:11): [True: 0, False: 0]
  ------------------
  389|      0|	  size >= (unsigned) allocated >> 2)
  ------------------
  |  Branch (389:4): [True: 0, False: 0]
  ------------------
  390|      0|	return true;
  391|       |
  392|      0|      new_allocated = size;
  393|      0|    }
  394|     17|    else
  395|     17|    {
  396|     17|      if (likely (size <= (unsigned) allocated))
  ------------------
  |  |  259|     17|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 4, False: 13]
  |  |  ------------------
  ------------------
  397|      4|	return true;
  398|       |
  399|     13|      new_allocated = allocated;
  400|     26|      while (size > new_allocated)
  ------------------
  |  Branch (400:14): [True: 13, False: 13]
  ------------------
  401|     13|	new_allocated += (new_allocated >> 1) + 8;
  402|     13|    }
  403|       |
  404|       |
  405|       |    /* Reallocate */
  406|       |
  407|     13|    bool overflows =
  408|     13|      (int) in_error () ||
  ------------------
  |  Branch (408:7): [True: 0, False: 13]
  ------------------
  409|     13|      (new_allocated < size) ||
  ------------------
  |  Branch (409:7): [True: 0, False: 13]
  ------------------
  410|     13|      hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
  ------------------
  |  Branch (410:7): [True: 0, False: 13]
  ------------------
  411|       |
  412|     13|    if (unlikely (overflows))
  ------------------
  |  |  260|     13|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  413|      0|    {
  414|      0|      set_error ();
  415|      0|      return false;
  416|      0|    }
  417|       |
  418|     13|    Type *new_array = realloc_vector (new_allocated, hb_prioritize);
  ------------------
  |  |   81|     13|#define hb_prioritize hb_priority<16> ()
  ------------------
  419|       |
  420|     13|    if (unlikely (new_allocated && !new_array))
  ------------------
  |  |  260|     26|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 13]
  |  |  |  Branch (260:47): [True: 13, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  421|      0|    {
  422|      0|      if (new_allocated <= (unsigned) allocated)
  ------------------
  |  Branch (422:11): [True: 0, False: 0]
  ------------------
  423|      0|        return true; // shrinking failed; it's okay; happens in our fuzzer
  424|       |
  425|      0|      set_error ();
  426|      0|      return false;
  427|      0|    }
  428|       |
  429|     13|    arrayZ = new_array;
  430|     13|    allocated = new_allocated;
  431|       |
  432|     13|    return true;
  433|     13|  }
_ZNK11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE8in_errorEv:
  224|     30|  bool in_error () const { return allocated < 0; }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE14realloc_vectorIS1_LPv0EEEPS1_j11hb_priorityILj0EE:
  240|     13|  {
  241|     13|    if (!new_allocated)
  ------------------
  |  Branch (241:9): [True: 0, False: 13]
  ------------------
  242|      0|    {
  243|      0|      hb_free (arrayZ);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  244|      0|      return nullptr;
  245|      0|    }
  246|     13|    return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
  ------------------
  |  |  236|     13|#define hb_realloc hb_realloc_impl
  ------------------
  247|     13|  }
_ZN11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE11grow_vectorIS1_LPv0EEEvj11hb_priorityILj0EE:
  290|     17|  {
  291|     17|    hb_memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
  292|     17|    length = size;
  293|     17|  }
_ZNK11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE5beginEv:
  190|     39|  Type *begin () const { return arrayZ; }
_ZNK11hb_vector_tIN11hb_ot_map_t13feature_map_tELb1EE3endEv:
  191|     39|  Type *end () const { return arrayZ + length; }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE8as_arrayEv:
  178|      2|  array_t   as_array ()       { return hb_array (arrayZ, length); }
_ZN11hb_vector_tIN11hb_ot_map_t12lookup_map_tELb0EE6shrinkEib:
  491|      2|  {
  492|      2|    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
  ------------------
  |  Branch (492:25): [True: 0, False: 2]
  ------------------
  493|      2|    if (size >= length)
  ------------------
  |  Branch (493:9): [True: 2, False: 0]
  ------------------
  494|      2|      return;
  495|       |
  496|      0|    shrink_vector (size);
  497|       |
  498|      0|    if (shrink_memory)
  ------------------
  |  Branch (498:9): [True: 0, False: 0]
  ------------------
  499|      0|      alloc (size, true); /* To force shrinking memory if needed. */
  500|      0|  }
_ZN11hb_vector_tIN19hb_ot_map_builder_t12stage_info_tELb0EEixEi:
  154|     78|  {
  155|     78|    unsigned int i = (unsigned int) i_;
  156|     78|    if (unlikely (i >= length))
  ------------------
  |  |  260|     78|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 78]
  |  |  ------------------
  ------------------
  157|      0|      return Crap (Type);
  ------------------
  |  |  188|      0|#define Crap(Type) CrapHelper<Type>::get_crap ()
  ------------------
  158|     78|    return arrayZ[i];
  159|     78|  }
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE4pushEv:
  206|     39|  {
  207|     39|    if (unlikely (!resize (length + 1)))
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
  208|      0|      return std::addressof (Crap (Type));
  ------------------
  |  |  188|      0|#define Crap(Type) CrapHelper<Type>::get_crap ()
  ------------------
  209|     39|    return std::addressof (arrayZ[length - 1]);
  210|     39|  }
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE6resizeEibb:
  436|     39|  {
  437|     39|    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
  ------------------
  |  Branch (437:25): [True: 0, False: 39]
  ------------------
  438|     39|    if (!alloc (size, exact))
  ------------------
  |  Branch (438:9): [True: 0, False: 39]
  ------------------
  439|      0|      return false;
  440|       |
  441|     39|    if (size > length)
  ------------------
  |  Branch (441:9): [True: 39, False: 0]
  ------------------
  442|     39|    {
  443|     39|      if (initialize)
  ------------------
  |  Branch (443:11): [True: 39, False: 0]
  ------------------
  444|     39|	grow_vector (size, hb_prioritize);
  ------------------
  |  |   81|     39|#define hb_prioritize hb_priority<16> ()
  ------------------
  445|     39|    }
  446|      0|    else if (size < length)
  ------------------
  |  Branch (446:14): [True: 0, False: 0]
  ------------------
  447|      0|    {
  448|      0|      if (initialize)
  ------------------
  |  Branch (448:11): [True: 0, False: 0]
  ------------------
  449|      0|	shrink_vector (size);
  450|      0|    }
  451|       |
  452|     39|    length = size;
  453|     39|    return true;
  454|     39|  }
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE5allocEjb:
  379|     39|  {
  380|     39|    if (unlikely (in_error ()))
  ------------------
  |  |  260|     39|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 39]
  |  |  ------------------
  ------------------
  381|      0|      return false;
  382|       |
  383|     39|    unsigned int new_allocated;
  384|     39|    if (exact)
  ------------------
  |  Branch (384:9): [True: 0, False: 39]
  ------------------
  385|      0|    {
  386|       |      /* If exact was specified, we allow shrinking the storage. */
  387|      0|      size = hb_max (size, length);
  388|      0|      if (size <= (unsigned) allocated &&
  ------------------
  |  Branch (388:11): [True: 0, False: 0]
  ------------------
  389|      0|	  size >= (unsigned) allocated >> 2)
  ------------------
  |  Branch (389:4): [True: 0, False: 0]
  ------------------
  390|      0|	return true;
  391|       |
  392|      0|      new_allocated = size;
  393|      0|    }
  394|     39|    else
  395|     39|    {
  396|     39|      if (likely (size <= (unsigned) allocated))
  ------------------
  |  |  259|     39|#define likely(expr) __builtin_expect (bool(expr), 1)
  |  |  ------------------
  |  |  |  Branch (259:22): [True: 13, False: 26]
  |  |  ------------------
  ------------------
  397|     13|	return true;
  398|       |
  399|     26|      new_allocated = allocated;
  400|     52|      while (size > new_allocated)
  ------------------
  |  Branch (400:14): [True: 26, False: 26]
  ------------------
  401|     26|	new_allocated += (new_allocated >> 1) + 8;
  402|     26|    }
  403|       |
  404|       |
  405|       |    /* Reallocate */
  406|       |
  407|     26|    bool overflows =
  408|     26|      (int) in_error () ||
  ------------------
  |  Branch (408:7): [True: 0, False: 26]
  ------------------
  409|     26|      (new_allocated < size) ||
  ------------------
  |  Branch (409:7): [True: 0, False: 26]
  ------------------
  410|     26|      hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
  ------------------
  |  Branch (410:7): [True: 0, False: 26]
  ------------------
  411|       |
  412|     26|    if (unlikely (overflows))
  ------------------
  |  |  260|     26|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 26]
  |  |  ------------------
  ------------------
  413|      0|    {
  414|      0|      set_error ();
  415|      0|      return false;
  416|      0|    }
  417|       |
  418|     26|    Type *new_array = realloc_vector (new_allocated, hb_prioritize);
  ------------------
  |  |   81|     26|#define hb_prioritize hb_priority<16> ()
  ------------------
  419|       |
  420|     26|    if (unlikely (new_allocated && !new_array))
  ------------------
  |  |  260|     52|#define unlikely(expr) __builtin_expect (bool(expr), 0)
  |  |  ------------------
  |  |  |  Branch (260:24): [True: 0, False: 26]
  |  |  |  Branch (260:47): [True: 26, False: 0]
  |  |  |  Branch (260:47): [True: 0, False: 26]
  |  |  ------------------
  ------------------
  421|      0|    {
  422|      0|      if (new_allocated <= (unsigned) allocated)
  ------------------
  |  Branch (422:11): [True: 0, False: 0]
  ------------------
  423|      0|        return true; // shrinking failed; it's okay; happens in our fuzzer
  424|       |
  425|      0|      set_error ();
  426|      0|      return false;
  427|      0|    }
  428|       |
  429|     26|    arrayZ = new_array;
  430|     26|    allocated = new_allocated;
  431|       |
  432|     26|    return true;
  433|     26|  }
_ZNK11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE8in_errorEv:
  224|     65|  bool in_error () const { return allocated < 0; }
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE14realloc_vectorIS1_LPv0EEEPS1_j11hb_priorityILj0EE:
  240|     26|  {
  241|     26|    if (!new_allocated)
  ------------------
  |  Branch (241:9): [True: 0, False: 26]
  ------------------
  242|      0|    {
  243|      0|      hb_free (arrayZ);
  ------------------
  |  |  237|      0|#define hb_free hb_free_impl
  ------------------
  244|      0|      return nullptr;
  245|      0|    }
  246|     26|    return (Type *) hb_realloc (arrayZ, new_allocated * sizeof (Type));
  ------------------
  |  |  236|     26|#define hb_realloc hb_realloc_impl
  ------------------
  247|     26|  }
_ZN11hb_vector_tIN11hb_ot_map_t11stage_map_tELb0EE11grow_vectorIS1_LPv0EEEvj11hb_priorityILj0EE:
  290|     39|  {
  291|     39|    hb_memset (arrayZ + length, 0, (size - length) * sizeof (*arrayZ));
  292|     39|    length = size;
  293|     39|  }

