summaryrefslogtreecommitdiff
path: root/Build/source/texk/ttfdump/libttf/vdmx.c
blob: ed9139d7c1199f002a2a56cedb5b9db9cb2bdd9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* vdmx.c -- Vertical Device Metrics
 * Copyright (C) 1996 Li-Da Lho, All right reserved 
 */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include "ttf.h"
#include "ttfutil.h"

/* 	$Id: vdmx.c,v 1.1.1.1 1998/06/05 07:47:52 robert Exp $	 */

static void ttfLoadVDMX(FILE *fp,VDMXPtr vdmx,ULONG offset);

void ttfInitVDMX(TTFontPtr font)
{
    ULONG tag = FT_MAKE_TAG ('V', 'D', 'M', 'X');
    TableDirPtr ptd;
     
    if ((ptd = ttfLookUpTableDir(tag,font)) != NULL)
	{
	    font->vdmx = XCALLOC1 (VDMX);
	    ttfLoadVDMX(font->fp,font->vdmx,ptd->offset);
	}
}

static void ttfLoadVDMX (FILE *fp,VDMXPtr vdmx,ULONG offset)
{
    int i;

    xfseek(fp, offset, SEEK_SET, "ttfLoadVDMX");
    
    vdmx->version = ttfGetUSHORT(fp);
    vdmx->numRecs = ttfGetUSHORT(fp);
    vdmx->numRatios = ttfGetUSHORT(fp);

    vdmx->ratRange = XCALLOC (vdmx->numRatios, Ratios);
    for (i=0;i<vdmx->numRatios;i++)
	{
	    (vdmx->ratRange+i)->CharSet = ttfGetBYTE(fp);
	    (vdmx->ratRange+i)->xRatio = ttfGetBYTE(fp);
	    (vdmx->ratRange+i)->yStartRatio = ttfGetBYTE(fp);
	    (vdmx->ratRange+i)->yEndRatio = ttfGetBYTE(fp);
	    
	}

    vdmx->offset = ttfMakeUSHORT (vdmx->numRatios, fp);

    vdmx->groups = XCALLOC (vdmx->numRecs, Vdmx);
    for (i=0;i<vdmx->numRecs;i++)
	{
	    int j;
	    (vdmx->groups+i)->recs = ttfGetUSHORT(fp);
	    (vdmx->groups+i)->startsz = ttfGetBYTE(fp);
	    (vdmx->groups+i)->endsz = ttfGetBYTE(fp);
    
	    (vdmx->groups+i)->entry = XCALLOC ((vdmx->groups+i)->recs, vTable);

	    for (j=0;j<(vdmx->groups+i)->recs;j++)
		{
		    ((vdmx->groups+i)->entry+j)->yPelHeight = ttfGetUSHORT(fp);
		    ((vdmx->groups+i)->entry+j)->yMax = ttfGetSHORT(fp);
		    ((vdmx->groups+i)->entry+j)->yMin = ttfGetSHORT(fp);
		}
	}
}

void ttfPrintVDMX(FILE *fp,VDMXPtr vdmx)
{
    int i;

    fprintf(fp,"'VDMX' Table - Precomputed Vertical Device Metrics\n");
    fprintf(fp,"--------------------------------------------------\n");


    fprintf(fp,"Version:\t %d\n", vdmx->version);
    fprintf(fp,"Number of Hgt Records:\t %d\n",vdmx->numRecs);
    fprintf(fp,"Number of Ratio Records:\t %d\n",vdmx->numRecs);

    for (i=0;i<vdmx->numRatios;i++)
	{ 
	    fprintf(fp,"\t Ratio Record #%d\n",i+1);
	    fprintf(fp,"\t\t CharSetId \t %d\n",(vdmx->ratRange+i)->CharSet);
	    fprintf(fp,"\t\t xRatio \t %d\n",(vdmx->ratRange+i)->xRatio);
	    fprintf(fp,"\t\t yStartRatio \t %d\n",(vdmx->ratRange+i)->yStartRatio);
	    fprintf(fp,"\t\t yEndRatio \t %d\n",(vdmx->ratRange+i)->yEndRatio);
	    fprintf(fp,"\t\t Record Offset %d (group #%d)\n\n",vdmx->offset[i],i);
	}
    
    fprintf(fp,"\t VDMX Height Record Groups\n");
    fprintf(fp,"\t -------------------------\n\n");

    for (i=0;i<vdmx->numRecs;i++)
	{
	    int j;
	    	    
	    fprintf(fp,"\t %d.  Number of Hgt Records %d\n",i,
		    (vdmx->groups+i)->recs);
	    fprintf(fp,"\t Starting Y Pel Height  %d\n",
		    (vdmx->groups+i)->startsz);
	    fprintf(fp,"\t Ending Y Pel Height %d\n",
		    (vdmx->groups+i)->endsz); 
    
	    for (j=0;j<(vdmx->groups+i)->recs;j++)
		{
		    fprintf(fp,"\t\t %d. Pel Height= %d\n",j+1,
			    ((vdmx->groups+i)->entry+j)->yPelHeight);
		    fprintf(fp,"\t\t yMax= \t %d\n",
			    ((vdmx->groups+i)->entry+j)->yMax);
		    fprintf(fp,"\t\t yMin= \t %d\n\n",
			    ((vdmx->groups+i)->entry+j)->yMin);		   
		}
	}

}

void ttfFreeVDMX(VDMXPtr vdmx)
{
    int i;
    if (vdmx != NULL)
	{
	    for (i=0;i<vdmx->numRecs;i++)
		{
		    free((vdmx->groups+i)->entry);
		}
	    free(vdmx->ratRange);
	    free(vdmx->offset);
	    free(vdmx->groups);
	    free(vdmx);
	}
}