summaryrefslogtreecommitdiff
path: root/pdf/pdf_fontmtx.c
diff options
context:
space:
mode:
Diffstat (limited to 'pdf/pdf_fontmtx.c')
-rw-r--r--pdf/pdf_fontmtx.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/pdf/pdf_fontmtx.c b/pdf/pdf_fontmtx.c
new file mode 100644
index 00000000..e957125a
--- /dev/null
+++ b/pdf/pdf_fontmtx.c
@@ -0,0 +1,138 @@
+#include "fitz.h"
+#include "mupdf.h"
+
+void
+pdf_setfontwmode(pdf_fontdesc *font, int wmode)
+{
+ font->wmode = wmode;
+}
+
+void
+pdf_setdefaulthmtx(pdf_fontdesc *font, int w)
+{
+ font->dhmtx.w = w;
+}
+
+void
+pdf_setdefaultvmtx(pdf_fontdesc *font, int y, int w)
+{
+ font->dvmtx.y = y;
+ font->dvmtx.w = w;
+}
+
+void
+pdf_addhmtx(pdf_fontdesc *font, int lo, int hi, int w)
+{
+ if (font->nhmtx + 1 >= font->hmtxcap)
+ {
+ font->hmtxcap = font->hmtxcap + 16;
+ font->hmtx = fz_realloc(font->hmtx, font->hmtxcap, sizeof(pdf_hmtx));
+ }
+
+ font->hmtx[font->nhmtx].lo = lo;
+ font->hmtx[font->nhmtx].hi = hi;
+ font->hmtx[font->nhmtx].w = w;
+ font->nhmtx++;
+}
+
+void
+pdf_addvmtx(pdf_fontdesc *font, int lo, int hi, int x, int y, int w)
+{
+ if (font->nvmtx + 1 >= font->vmtxcap)
+ {
+ font->vmtxcap = font->vmtxcap + 16;
+ font->vmtx = fz_realloc(font->vmtx, font->vmtxcap, sizeof(pdf_vmtx));
+ }
+
+ 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++;
+}
+
+static int cmph(const void *a0, const void *b0)
+{
+ pdf_hmtx *a = (pdf_hmtx*)a0;
+ pdf_hmtx *b = (pdf_hmtx*)b0;
+ return a->lo - b->lo;
+}
+
+static int cmpv(const void *a0, const void *b0)
+{
+ pdf_vmtx *a = (pdf_vmtx*)a0;
+ pdf_vmtx *b = (pdf_vmtx*)b0;
+ return a->lo - b->lo;
+}
+
+void
+pdf_endhmtx(pdf_fontdesc *font)
+{
+ if (!font->hmtx)
+ return;
+ qsort(font->hmtx, font->nhmtx, sizeof(pdf_hmtx), cmph);
+}
+
+void
+pdf_endvmtx(pdf_fontdesc *font)
+{
+ if (!font->vmtx)
+ return;
+ qsort(font->vmtx, font->nvmtx, sizeof(pdf_vmtx), cmpv);
+}
+
+pdf_hmtx
+pdf_gethmtx(pdf_fontdesc *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;
+}
+
+pdf_vmtx
+pdf_getvmtx(pdf_fontdesc *font, int cid)
+{
+ pdf_hmtx h;
+ pdf_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 = pdf_gethmtx(font, cid);
+ v = font->dvmtx;
+ v.x = h.w / 2;
+ return v;
+}