// Copyright status: this file is in the public domain. #include #include #include "lx.h" #include "internal.h" void lx_fontinfo_recache(LX_FONTINFO *fi) { FONTPRIV *p; int i; int j; int d; if (! fi->charinfos) return; lx_fontinfo_free_priv(fi); p = malloc(sizeof(FONTPRIV)); fi->lx_priv = p; p->charindex[0] = FONTPRIV_UNSET; for (i=1;i<65536;i<<=1) bcopy(&p->charindex[0],&p->charindex[i],i*sizeof(int)); if (fi->minb1 || fi->maxb1) { d = fi->maxcb2 - fi->mincb2 + 1; for (i=fi->minb1;i<=fi->maxb1;i++) { for (j=fi->mincb2;j<=fi->maxcb2;j++) { p->charindex[(i*256)+j] = fi->ncharinfo ? (j - fi->mincb2) + ((i - fi->minb1) * d) : FONTPRIV_SAME; } } } else { for (i=fi->mincb2;i<=fi->maxcb2;i++) { p->charindex[i] = fi->ncharinfo ? i - fi->mincb2 : FONTPRIV_SAME; } } d = (fi->defchar > 65535) ? FONTPRIV_NIL : p->charindex[fi->defchar]; if (d == FONTPRIV_UNSET) d = FONTPRIV_NIL; for (i=65535;i>=0;i--) if (p->charindex[i] == FONTPRIV_UNSET) p->charindex[i] = d; }