res_font.c.svn-base
来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· SVN-BASE 代码 · 共 271 行
SVN-BASE
271 行
#include "fitz-base.h"#include "fitz-world.h"voidfz_initfont(fz_font *font, char *name){ font->refs = 1; strlcpy(font->name, name, sizeof font->name); font->wmode = 0; font->bbox.x0 = 0; font->bbox.y0 = 0; font->bbox.x1 = 1000; font->bbox.y1 = 1000; font->hmtxcap = 0; font->vmtxcap = 0; font->nhmtx = 0; font->nvmtx = 0; font->hmtx = nil; font->vmtx = nil; font->dhmtx.lo = 0x0000; font->dhmtx.hi = 0xFFFF; font->dhmtx.w = 0; font->dvmtx.lo = 0x0000; font->dvmtx.hi = 0xFFFF; font->dvmtx.x = 0; font->dvmtx.y = 880; font->dvmtx.w = -1000;}fz_font *fz_keepfont(fz_font *font){ font->refs ++; return font;}voidfz_dropfont(fz_font *font){ if (--font->refs == 0) { if (font->drop) font->drop(font); fz_free(font->hmtx); fz_free(font->vmtx); fz_free(font); }}voidfz_setfontwmode(fz_font *font, int wmode){ font->wmode = wmode;}voidfz_setfontbbox(fz_font *font, int xmin, int ymin, int xmax, int ymax){ font->bbox.x0 = xmin; font->bbox.y0 = ymin; font->bbox.x1 = xmax; font->bbox.y1 = ymax;}voidfz_setdefaulthmtx(fz_font *font, int w){ font->dhmtx.w = w;}voidfz_setdefaultvmtx(fz_font *font, int y, int w){ font->dvmtx.y = y; font->dvmtx.w = w;}fz_error *fz_addhmtx(fz_font *font, int lo, int hi, int w){ int newcap; fz_hmtx *newmtx; if (font->nhmtx + 1 >= font->hmtxcap) { newcap = font->hmtxcap + 16; newmtx = fz_realloc(font->hmtx, sizeof(fz_hmtx) * newcap); if (!newmtx) return fz_outofmem; font->hmtxcap = newcap; font->hmtx = newmtx; } font->hmtx[font->nhmtx].lo = lo; font->hmtx[font->nhmtx].hi = hi; font->hmtx[font->nhmtx].w = w; font->nhmtx++; return fz_okay;}fz_error *fz_addvmtx(fz_font *font, int lo, int hi, int x, int y, int w){ int newcap; fz_vmtx *newmtx; if (font->nvmtx + 1 >= font->vmtxcap) { newcap = font->vmtxcap + 16; newmtx = fz_realloc(font->vmtx, sizeof(fz_vmtx) * newcap); if (!newmtx) return fz_outofmem; font->vmtxcap = newcap; font->vmtx = newmtx; } font->vmtx[font->nvmtx].lo = lo; font->vmtx[font->nvmtx].hi = hi; font->vmtx[font->nvmtx].x = x; font->vmtx[font->nvmtx].y = y; font->vmtx[font->nvmtx].w = w; font->nvmtx++; return fz_okay;}static int cmph(const void *a0, const void *b0){ fz_hmtx *a = (fz_hmtx*)a0; fz_hmtx *b = (fz_hmtx*)b0; return a->lo - b->lo;}static int cmpv(const void *a0, const void *b0){ fz_vmtx *a = (fz_vmtx*)a0; fz_vmtx *b = (fz_vmtx*)b0; return a->lo - b->lo;}fz_error *fz_endhmtx(fz_font *font){ fz_hmtx *newmtx; if (!font->hmtx) return fz_okay; qsort(font->hmtx, font->nhmtx, sizeof(fz_hmtx), cmph); newmtx = fz_realloc(font->hmtx, sizeof(fz_hmtx) * font->nhmtx); if (!newmtx) return fz_outofmem; font->hmtxcap = font->nhmtx; font->hmtx = newmtx; return fz_okay;}fz_error *fz_endvmtx(fz_font *font){ fz_vmtx *newmtx; if (!font->vmtx) return fz_okay; qsort(font->vmtx, font->nvmtx, sizeof(fz_vmtx), cmpv); newmtx = fz_realloc(font->vmtx, sizeof(fz_vmtx) * font->nvmtx); if (!newmtx) return fz_outofmem; font->vmtxcap = font->nvmtx; font->vmtx = newmtx; return fz_okay;}fz_hmtxfz_gethmtx(fz_font *font, int cid){ int l = 0; int r = font->nhmtx - 1; int m; if (!font->hmtx) goto notfound; while (l <= r) { m = (l + r) >> 1; if (cid < font->hmtx[m].lo) r = m - 1; else if (cid > font->hmtx[m].hi) l = m + 1; else return font->hmtx[m]; }notfound: return font->dhmtx;}fz_vmtxfz_getvmtx(fz_font *font, int cid){ fz_hmtx h; fz_vmtx v; int l = 0; int r = font->nvmtx - 1; int m; if (!font->vmtx) goto notfound; while (l <= r) { m = (l + r) >> 1; if (cid < font->vmtx[m].lo) r = m - 1; else if (cid > font->vmtx[m].hi) l = m + 1; else return font->vmtx[m]; }notfound: h = fz_gethmtx(font, cid); v = font->dvmtx; v.x = h.w / 2; return v;}voidfz_debugfont(fz_font *font){ int i; printf("font '%s' {\n", font->name); printf(" wmode %d\n", font->wmode); printf(" bbox [%d %d %d %d]\n", font->bbox.x0, font->bbox.y0, font->bbox.x1, font->bbox.y1); printf(" DW %d\n", font->dhmtx.w); printf(" W {\n"); for (i = 0; i < font->nhmtx; i++) printf(" <%04x> <%04x> %d\n", font->hmtx[i].lo, font->hmtx[i].hi, font->hmtx[i].w); printf(" }\n"); if (font->wmode) { printf(" DW2 [%d %d]\n", font->dvmtx.y, font->dvmtx.w); printf(" W2 {\n"); for (i = 0; i < font->nvmtx; i++) printf(" <%04x> <%04x> %d %d %d\n", font->vmtx[i].lo, font->vmtx[i].hi, font->vmtx[i].x, font->vmtx[i].y, font->vmtx[i].w); printf(" }\n"); } printf("}\n");}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?