summaryrefslogtreecommitdiff
path: root/Build/source/texk/ttfdump/libttf/kern.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/ttfdump/libttf/kern.c')
-rw-r--r--Build/source/texk/ttfdump/libttf/kern.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/Build/source/texk/ttfdump/libttf/kern.c b/Build/source/texk/ttfdump/libttf/kern.c
new file mode 100644
index 00000000000..79e8cb6ebd3
--- /dev/null
+++ b/Build/source/texk/ttfdump/libttf/kern.c
@@ -0,0 +1,179 @@
+/* kern.c -- Kerning Table
+ * Copyright (C) 1996 Li-Da Lho, All right reserved
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include "config.h"
+#include "ttf.h"
+#include "ttfutil.h"
+
+#ifdef MEMCHECK
+#include <dmalloc.h>
+#endif
+
+/* $Id: kern.c,v 1.1.1.1 1998/06/05 07:47:52 robert Exp $ */
+
+#ifndef lint
+static char vcid[] = "$Id: kern.c,v 1.1.1.1 1998/06/05 07:47:52 robert Exp $";
+#endif /* lint */
+
+static KERNPtr ttfAllocKERN(TTFontPtr font);
+static void ttfLoadKERN(FILE *fp,KERNPtr kern,ULONG offset);
+
+void ttfInitKERN(TTFontPtr font)
+{
+ ULONG tag = 'k' | 'e' << 8 | 'r' << 16 | 'n' << 24;
+ TableDirPtr ptd;
+
+ if ((ptd = ttfLookUpTableDir(tag,font)) != NULL)
+ {
+ font->kern = ttfAllocKERN(font);
+ ttfLoadKERN(font->fp,font->kern,ptd->offset);
+ }
+}
+static KERNPtr ttfAllocKERN(TTFontPtr font)
+{
+ KERNPtr kern;
+
+ if ((kern = (KERNPtr) calloc(1,sizeof(KERN))) == NULL)
+ {
+ ttfError("Out of Memory in __FILE__:__LINE__\n");
+ return NULL;
+ }
+ return kern;
+}
+static void ttfLoadKERN (FILE *fp,KERNPtr kern,ULONG offset)
+{
+ int i;
+
+ if (fseek(fp,offset,SEEK_SET) !=0)
+ ttfError("Fseek Failed in ttfLoadKERN \n");
+
+ kern->version = ttfGetUSHORT(fp);
+ kern->nTables = ttfGetUSHORT(fp);
+
+ kern->subtable = (KernSubtable *) calloc(kern->nTables,
+ sizeof(KernSubtable));
+
+ for (i=0;i<kern->nTables;i++)
+ {
+ struct kernpair *pairs;
+ int j,n;
+ (kern->subtable+i)->version = ttfGetUSHORT(fp);
+ (kern->subtable+i)->length = ttfGetUSHORT(fp);
+ (kern->subtable+i)->coverage = ttfGetUSHORT(fp);
+
+ switch ((kern->subtable+i)->coverage >> 8)
+ {
+ case 0:
+ (kern->subtable+i)->kern.kern0.nPairs = n =
+ ttfGetUSHORT(fp);
+ (kern->subtable+i)->kern.kern0.searchRange =
+ ttfGetUSHORT(fp);
+ (kern->subtable+i)->kern.kern0.entrySelector =
+ ttfGetUSHORT(fp);
+ (kern->subtable+i)->kern.kern0.rangeShift =
+ ttfGetUSHORT(fp);
+ (kern->subtable+i)->kern.kern0.pairs = pairs =
+ (struct kernpair *) calloc(n,sizeof (struct kernpair));
+
+ for (j=0;j<n;j++)
+ {
+ (pairs+j)->left = ttfGetUSHORT(fp);
+ (pairs+j)->right = ttfGetUSHORT(fp);
+ (pairs+j)->value = ttfGetFWord(fp);
+ }
+ break;
+ case 2:
+ /* not implemented yet */
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
+ }
+}
+
+void ttfPrintKERN(FILE *fp,KERNPtr kern)
+{
+ int i;
+
+ fprintf(fp,"'kern' Table - Kerning Data\n");
+ fprintf(fp,"---------------------------\n");
+ fprintf(fp,"'kern' Version:\t %d\n", kern->version);
+ fprintf(fp,"Number of subtables:\t %d\n\n",kern->nTables);
+
+ for (i=0;i<kern->nTables;i++)
+ {
+ struct kernpair *pairs;
+ int j,n;
+
+ fprintf(fp,"\t Subtable format \t %d\n",
+ (kern->subtable+i)->coverage >> 8);
+ fprintf(fp,"\t Subtable version \t %d\n",
+ (kern->subtable+i)->version);
+ fprintf(fp,"\t Bytes in subtable \t %d\n",
+ (kern->subtable+i)->length);
+ fprintf(fp,"\t Coverage bits \t 0x%x \n",
+ (kern->subtable+i)->coverage);
+ switch ((kern->subtable+i)->coverage >> 8)
+ {
+ case 0:
+ n = (kern->subtable+i)->kern.kern0.nPairs;
+ pairs = (kern->subtable+i)->kern.kern0.pairs;
+
+ fprintf(fp,"\t Number of pairs %d\n",n);
+ fprintf(fp,"\t Search Range %d\n",
+ (kern->subtable+i)->kern.kern0.searchRange);
+ fprintf(fp,"\t Entry Selector %d\n",
+ (kern->subtable+i)->kern.kern0.entrySelector);
+ fprintf(fp,"\t Range Shift %d\n",
+ (kern->subtable+i)->kern.kern0.rangeShift);
+
+ fprintf(fp,"\t Left Glyph \t Right Glyph \t Kern Move\n");
+ fprintf(fp,"\t ---------- \t ----------- \t ---------\n");
+
+ for (j=0;j<n;j++)
+ {
+ fprintf(fp,"\t\t %d \t\t %d \t\t %d\n",
+ (pairs+j)->left,(pairs+j)->right,
+ (pairs+j)->value);
+ }
+ break;
+ case 2:
+ /* not implemented yet */
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
+ fprintf(fp,"\n");
+ }
+
+}
+
+void ttfFreeKERN(KERNPtr kern)
+{
+ int i;
+
+ if (kern != NULL)
+ {
+ for (i=0;i<kern->nTables;i++)
+ {
+ switch ((kern->subtable+i)->coverage >> 8)
+ {
+ case 0:
+ free((kern->subtable+i)->kern.kern0.pairs);
+ break;
+ case 2:
+ /* not implemented yet */
+ break;
+ default:
+ /* do nothing */
+ break;
+ }
+ }
+ free(kern->subtable);
+ free(kern);
+ }
+}