diff options
author | Karl Berry <karl@freefriends.org> | 2021-02-25 19:22:25 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-02-25 19:22:25 +0000 |
commit | ad547a6b5986815fda458221149728d9d9ab1d87 (patch) | |
tree | 16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/ttfdump/libttf/post.c | |
parent | 947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff) |
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/ttfdump/libttf/post.c')
-rw-r--r-- | Build/source/texk/ttfdump/libttf/post.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/Build/source/texk/ttfdump/libttf/post.c b/Build/source/texk/ttfdump/libttf/post.c new file mode 100644 index 00000000000..ab8f13c227c --- /dev/null +++ b/Build/source/texk/ttfdump/libttf/post.c @@ -0,0 +1,156 @@ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <stdlib.h> +#include "ttf.h" +#include "ttfutil.h" + +/* $Id: post.c,v 1.3 1998/06/06 12:55:53 werner Exp $ */ + +static void ttfLoadPOST(FILE *fp, POSTPtr post, ULONG offset); + +void ttfInitPOST(TTFontPtr font) +{ + ULONG tag = FT_MAKE_TAG ('p', 'o', 's', 't'); + TableDirPtr ptd; + + if ((ptd = ttfLookUpTableDir(tag, font)) != NULL) + { + font->post = XCALLOC1 (POST); + ttfLoadPOST(font->fp, font->post, ptd->offset); + } +} + +static void ttfLoadPOST(FILE *fp, POSTPtr post, ULONG offset) +{ + USHORT i,numGlyphs; + xfseek(fp, offset, SEEK_SET, "ttfLoadPOST"); + + post->format = ttfGetFixed(fp); + post->italicAngle = ttfGetFixed(fp); + post->underlinePosition = ttfGetFWord(fp); + post->underlineThickness = ttfGetFWord(fp); + post->isFixedPitch = ttfGetULONG(fp); + post->minMemType42 = ttfGetULONG(fp); + post->maxMemType42 = ttfGetULONG(fp); + post->minMemType1 = ttfGetULONG(fp); + post->maxMemType1 = ttfGetULONG(fp); + + switch (post->format) + { + case 0x00020000: + post->name.format20 = XCALLOC1 (Format20); + post->name.format20->numGlyphs = numGlyphs = ttfGetUSHORT(fp); + post->name.format20->glyphNameIndex = ttfMakeUSHORT (numGlyphs, fp); + + post->name.format20->GlyphName = XCALLOC (numGlyphs, CHAR *); + for (i=0;i<numGlyphs;i++) + { + unsigned char len; + if (post->name.format20->glyphNameIndex[i] <= 257) + { + /* do nothing for standard Mac glyf name */ + } + else if (post->name.format20->glyphNameIndex[i] <= 32767) + { + /* non-standard glyf name is stored as a Pascal + * string in the file i.e. + * the first byte is the length of the string + * but the string is not ended with a null + * character */ + len = (unsigned char) ttfGetCHAR(fp); + post->name.format20->GlyphName[i] = XTALLOC (len+1, CHAR); + if (len) + fread(post->name.format20->GlyphName[i], + sizeof(CHAR), len, fp); + post->name.format20->GlyphName[i][len] = 0x0; + } + } + break; + case 0x00028000: /* 2.5 in 16.16 format */ + /* not implemented yet */ + break; + default: + /* do nothing */ ; + } +} + +void ttfPrintPOST(FILE *fp,POSTPtr post) +{ + int b[2],b1[2]; + USHORT i,numGlyphs; + + FixedSplit(post->format, b); + FixedSplit(post->italicAngle, b1); + fprintf(fp,"'post' Table - PostScript\n"); + fprintf(fp,"-------------------------\n"); + fprintf(fp,"\t 'post' format:\t\t %d.%d\n", b[1], b[0]); + fprintf(fp,"\t italicAngle:\t\t %d.%d\n", b1[1], b1[0]); + fprintf(fp,"\t underlinePosition:\t %d\n", post->underlinePosition); + fprintf(fp,"\t underlineThichness:\t %d\n", post->underlineThickness); + fprintf(fp,"\t isFixedPitch:\t\t %ud\n", post->isFixedPitch); + fprintf(fp,"\t minMemType42:\t\t %ud\n", post->minMemType42); + fprintf(fp,"\t maxMemType42:\t\t %ud\n", post->maxMemType42); + fprintf(fp,"\t minMemType1:\t\t %ud\n", post->minMemType1); + fprintf(fp,"\t maxMemType1:\t\t %ud\n", post->maxMemType1); + + switch (post->format) + { + case 0x00020000: + numGlyphs = post->name.format20->numGlyphs; + fprintf(fp, "\t Format 2.0: Non-Standard (for PostScript) TrueType Glyph Set.\n"); + fprintf(fp,"\t\t numGlyphs:\t %d\n", + post->name.format20->numGlyphs); + for (i=0;i<numGlyphs;i++) + { + if (post->name.format20->glyphNameIndex[i] < 257) + { + fprintf(fp,"\t\t Glyf %3d -> Mac Glyph # %3d\n", i, + post->name.format20->glyphNameIndex[i]); + } + else if (post->name.format20->glyphNameIndex[i] < 32767) + { + fprintf(fp,"\t\t Glyf %3d -> PSGlyf Name # %3d, '%s'\n", + i, post->name.format20->glyphNameIndex[i] - 257, + post->name.format20->GlyphName[i]); + } + } + break; + case 0x00020005: + /* not implemented yet */ + break; + default: + /* do nothing */; + } +} + +void ttfFreePOST(POSTPtr post) +{ + USHORT i, numGlyphs; + + if (!post) + return; + + switch (post->format) + { + case 0x00020000: + numGlyphs = post->name.format20->numGlyphs; + for (i=0;i<numGlyphs;i++) + { + if (post->name.format20->glyphNameIndex[i] > 257) + free(post->name.format20->GlyphName[i]); + } + free(post->name.format20->glyphNameIndex); + free(post->name.format20->GlyphName); + free(post->name.format20); + break; + case 0x00020005: + /* not implemented yet */ + break; + default: + /* do nothing */; + } + free(post); +} |