ref: 2f74eab4dfbc869fbbf2f02388ae91ddb64b9310
parent: 36c06f8d2cfb2fe82dc7d5b435bce2bbb26b5836
author: Ali Gholami Rudi <ali@rudi.ir>
date: Wed Aug 24 14:01:28 EDT 2022
font: check for glyph group membership using ggrp_rev
--- a/font.c
+++ b/font.c
@@ -52,7 +52,8 @@
int gpos_n, gpos_sz;
struct iset *gsub0; /* rules matching a glyph at pos 0 */
struct iset *gpos0; /* rules matching a glyph at pos 0 */
- struct iset *ggrp; /* glyph groups */
+ struct iset *ggrp; /* sets of glyphs for each group */
+ struct iset *ggrp_rev; /* sets of groups for each glyph */
};
/* find a glyph by its name */
@@ -128,14 +129,9 @@
static int font_gpatmatch(struct font *fn, struct gpat *p, int g)
{
- int *r;
if (!(p->flg & GF_GRP))
return p->g == g;
- r = iset_get(fn->ggrp, p->g);
- while (r && *r >= 0)
- if (*r++ == g)
- return 1;
- return 0;
+ return iset_has(fn->ggrp_rev, g, p->g);
}
static int font_rulematch(struct font *fn, struct grule *rule,
@@ -531,8 +527,10 @@
if (fscanf(fin, GNFMT, tok) != 1)
return 1;
g = font_idx(fn, font_glyph(fn, tok));
- if (g >= 0)
+ if (g >= 0) {
iset_put(fn->ggrp, id, g);
+ iset_put(fn->ggrp_rev, g, id);
+ }
}
return 0;
}
@@ -624,6 +622,7 @@
fn->ch_dict = dict_make(-1, 1, 0);
fn->ch_map = dict_make(-1, 1, 0);
fn->ggrp = iset_make();
+ fn->ggrp_rev = iset_make();
while (fscanf(fin, "%127s", tok) == 1) {
if (!strcmp("char", tok)) {
font_readchar(fn, fin, &ch_n, &ch_g);
@@ -689,6 +688,7 @@
iset_free(fn->gsub0);
iset_free(fn->gpos0);
iset_free(fn->ggrp);
+ iset_free(fn->ggrp_rev);
free(fn->gsub);
free(fn->gpos);
free(fn->gl);