fofitype1.cc
来自「将pdf文档转换为高质量的html文档」· CC 代码 · 共 208 行
CC
208 行
//========================================================================//// FoFiType1.cc//// Copyright 1999-2003 Glyph & Cog, LLC////========================================================================#include <aconf.h>#ifdef USE_GCC_PRAGMAS#pragma implementation#endif#include <stdlib.h>#include <string.h>#include "gmem.h"#include "FoFiEncodings.h"#include "FoFiType1.h"//------------------------------------------------------------------------// FoFiType1//------------------------------------------------------------------------FoFiType1 *FoFiType1::make(char *fileA, int lenA) { return new FoFiType1(fileA, lenA, gFalse);}FoFiType1 *FoFiType1::load(char *fileName) { char *fileA; int lenA; if (!(fileA = FoFiBase::readFile(fileName, &lenA))) { return NULL; } return new FoFiType1(fileA, lenA, gTrue);}FoFiType1::FoFiType1(char *fileA, int lenA, GBool freeFileDataA): FoFiBase(fileA, lenA, freeFileDataA){ name = NULL; encoding = NULL; parsed = gFalse;}FoFiType1::~FoFiType1() { int i; if (name) { gfree(name); } if (encoding && encoding != fofiType1StandardEncoding) { for (i = 0; i < 256; ++i) { gfree(encoding[i]); } gfree(encoding); }}char *FoFiType1::getName() { if (!parsed) { parse(); } return name;}char **FoFiType1::getEncoding() { if (!parsed) { parse(); } return encoding;}void FoFiType1::writeEncoded(char **newEncoding, FoFiOutputFunc outputFunc, void *outputStream) { char buf[512]; char *line; int i; // copy everything up to the encoding for (line = (char *)file; line && strncmp(line, "/Encoding", 9); line = getNextLine(line)) ; if (!line) { // no encoding - just copy the whole font file (*outputFunc)(outputStream, (char *)file, len); return; } (*outputFunc)(outputStream, (char *)file, line - (char *)file); // write the new encoding (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); (*outputFunc)(outputStream, "0 1 255 {1 index exch /.notdef put} for\n", 40); for (i = 0; i < 256; ++i) { if (newEncoding[i]) { sprintf(buf, "dup %d /%s put\n", i, newEncoding[i]); (*outputFunc)(outputStream, buf, strlen(buf)); } } (*outputFunc)(outputStream, "readonly def\n", 13); // copy everything after the encoding if (!strncmp(line, "/Encoding StandardEncoding def", 30)) { line = getNextLine(line); } else { for (line = getNextLine(line); line && strncmp(line, "readonly def", 12); line = getNextLine(line)) ; if (line) { line = getNextLine(line); } } if (line) { (*outputFunc)(outputStream, line, ((char *)file + len) - line); }}char *FoFiType1::getNextLine(char *line) { while (line < (char *)file + len && *line != '\x0a' && *line != '\x0d') { ++line; } if (line < (char *)file + len && *line == '\x0d') { ++line; } if (line < (char *)file + len && *line == '\x0a') { ++line; } if (line >= (char *)file + len) { return NULL; } return line;}void FoFiType1::parse() { char *line, *line1, *p, *p2; char buf[256]; char c; int n, code, i, j; for (i = 1, line = (char *)file; i <= 100 && line && (!name || !encoding); ++i) { // get font name if (!name && !strncmp(line, "/FontName", 9)) { strncpy(buf, line, 255); buf[255] = '\0'; if ((p = strchr(buf+9, '/')) && (p = strtok(p+1, " \t\n\r"))) { name = copyString(p); } line = getNextLine(line); // get encoding } else if (!encoding && !strncmp(line, "/Encoding StandardEncoding def", 30)) { encoding = fofiType1StandardEncoding; } else if (!encoding && !strncmp(line, "/Encoding 256 array", 19)) { encoding = (char **)gmallocn(256, sizeof(char *)); for (j = 0; j < 256; ++j) { encoding[j] = NULL; } for (j = 0, line = getNextLine(line); j < 300 && line && (line1 = getNextLine(line)); ++j, line = line1) { if ((n = line1 - line) > 255) { n = 255; } strncpy(buf, line, n); buf[n] = '\0'; for (p = buf; *p == ' ' || *p == '\t'; ++p) ; if (!strncmp(p, "dup", 3)) { for (p += 3; *p == ' ' || *p == '\t'; ++p) ; for (p2 = p; *p2 >= '0' && *p2 <= '9'; ++p2) ; if (*p2) { c = *p2; *p2 = '\0'; if ((code = atoi(p)) < 256) { *p2 = c; for (p = p2; *p == ' ' || *p == '\t'; ++p) ; if (*p == '/') { ++p; for (p2 = p; *p2 && *p2 != ' ' && *p2 != '\t'; ++p2) ; *p2 = '\0'; encoding[code] = copyString(p); } } } } else { if (strtok(buf, " \t") && (p = strtok(NULL, " \t\n\r")) && !strcmp(p, "def")) { break; } } } //~ check for getinterval/putinterval junk } else { line = getNextLine(line); } } parsed = gTrue;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?