diff options
Diffstat (limited to 'Build/source/libs/poppler/poppler-src/fofi/FoFiIdentifier.cc')
-rw-r--r-- | Build/source/libs/poppler/poppler-src/fofi/FoFiIdentifier.cc | 651 |
1 files changed, 0 insertions, 651 deletions
diff --git a/Build/source/libs/poppler/poppler-src/fofi/FoFiIdentifier.cc b/Build/source/libs/poppler/poppler-src/fofi/FoFiIdentifier.cc deleted file mode 100644 index ffe9c47c742..00000000000 --- a/Build/source/libs/poppler/poppler-src/fofi/FoFiIdentifier.cc +++ /dev/null @@ -1,651 +0,0 @@ -//======================================================================== -// -// FoFiIdentifier.cc -// -// Copyright 2009 Glyph & Cog, LLC -// -//======================================================================== - -//======================================================================== -// -// Modified under the Poppler project - http://poppler.freedesktop.org -// -// All changes made under the Poppler project to this file are licensed -// under GPL version 2 or later -// -// Copyright (C) 2013 Christoph Duelli <duelli@melosgmbh.de> -// Copyright (C) 2018 Albert Astals Cid <aacid@kde.org> -// -// To see a description of the changes please see the Changelog file that -// came with your tarball or type make ChangeLog if you are building from git -// -//======================================================================== - -#ifdef USE_GCC_PRAGMAS -#pragma implementation -#endif - -#include <stdio.h> -#include <string.h> -#include <limits.h> -#include "goo/gtypes.h" -#include "FoFiIdentifier.h" - -//------------------------------------------------------------------------ - -namespace { // do not pollute global namespace - -class Reader { -public: - Reader() = default; - Reader(const Reader &) = delete; - Reader& operator=(const Reader &other) = delete; - - virtual ~Reader() {} - - // Read one byte. Returns -1 if past EOF. - virtual int getByte(int pos) = 0; - - // Read a big-endian unsigned 16-bit integer. Fills in *val and - // returns true if successful. - virtual GBool getU16BE(int pos, int *val) = 0; - - // Read a big-endian unsigned 32-bit integer. Fills in *val and - // returns true if successful. - virtual GBool getU32BE(int pos, Guint *val) = 0; - - // Read a little-endian unsigned 32-bit integer. Fills in *val and - // returns true if successful. - virtual GBool getU32LE(int pos, Guint *val) = 0; - - // Read a big-endian unsigned <size>-byte integer, where 1 <= size - // <= 4. Fills in *val and returns true if successful. - virtual GBool getUVarBE(int pos, int size, Guint *val) = 0; - - // Compare against a string. Returns true if equal. - virtual GBool cmp(int pos, const char *s) = 0; - -}; - -//------------------------------------------------------------------------ - -class MemReader: public Reader { -public: - - static MemReader *make(char *bufA, int lenA); - ~MemReader(); - int getByte(int pos) override; - GBool getU16BE(int pos, int *val) override; - GBool getU32BE(int pos, Guint *val) override; - GBool getU32LE(int pos, Guint *val) override; - GBool getUVarBE(int pos, int size, Guint *val) override; - GBool cmp(int pos, const char *s) override; - -private: - - MemReader(char *bufA, int lenA); - - char *buf; - int len; -}; - -MemReader *MemReader::make(char *bufA, int lenA) { - return new MemReader(bufA, lenA); -} - -MemReader::MemReader(char *bufA, int lenA) { - buf = bufA; - len = lenA; -} - -MemReader::~MemReader() { -} - -int MemReader::getByte(int pos) { - if (pos < 0 || pos >= len) { - return -1; - } - return buf[pos] & 0xff; -} - -GBool MemReader::getU16BE(int pos, int *val) { - if (pos < 0 || pos > len - 2) { - return gFalse; - } - *val = ((buf[pos] & 0xff) << 8) + - (buf[pos+1] & 0xff); - return gTrue; -} - -GBool MemReader::getU32BE(int pos, Guint *val) { - if (pos < 0 || pos > len - 4) { - return gFalse; - } - *val = ((buf[pos] & 0xff) << 24) + - ((buf[pos+1] & 0xff) << 16) + - ((buf[pos+2] & 0xff) << 8) + - (buf[pos+3] & 0xff); - return gTrue; -} - -GBool MemReader::getU32LE(int pos, Guint *val) { - if (pos < 0 || pos > len - 4) { - return gFalse; - } - *val = (buf[pos] & 0xff) + - ((buf[pos+1] & 0xff) << 8) + - ((buf[pos+2] & 0xff) << 16) + - ((buf[pos+3] & 0xff) << 24); - return gTrue; -} - -GBool MemReader::getUVarBE(int pos, int size, Guint *val) { - int i; - - if (size < 1 || size > 4 || pos < 0 || pos > len - size) { - return gFalse; - } - *val = 0; - for (i = 0; i < size; ++i) { - *val = (*val << 8) + (buf[pos + i] & 0xff); - } - return gTrue; -} - -GBool MemReader::cmp(int pos, const char *s) { - int n; - - n = (int)strlen(s); - if (pos < 0 || len < n || pos > len - n) { - return gFalse; - } - return !memcmp(buf + pos, s, n); -} - -//------------------------------------------------------------------------ - -class FileReader: public Reader { -public: - - static FileReader *make(char *fileName); - ~FileReader(); - int getByte(int pos) override; - GBool getU16BE(int pos, int *val) override; - GBool getU32BE(int pos, Guint *val) override; - GBool getU32LE(int pos, Guint *val) override; - GBool getUVarBE(int pos, int size, Guint *val) override; - GBool cmp(int pos, const char *s) override; - -private: - - FileReader(FILE *fA); - GBool fillBuf(int pos, int len); - - FILE *f; - char buf[1024]; - int bufPos, bufLen; -}; - -FileReader *FileReader::make(char *fileName) { - FILE *fA; - - if (!(fA = fopen(fileName, "rb"))) { - return nullptr; - } - return new FileReader(fA); -} - -FileReader::FileReader(FILE *fA) { - f = fA; - bufPos = 0; - bufLen = 0; -} - -FileReader::~FileReader() { - fclose(f); -} - -int FileReader::getByte(int pos) { - if (!fillBuf(pos, 1)) { - return -1; - } - return buf[pos - bufPos] & 0xff; -} - -GBool FileReader::getU16BE(int pos, int *val) { - if (!fillBuf(pos, 2)) { - return gFalse; - } - *val = ((buf[pos - bufPos] & 0xff) << 8) + - (buf[pos - bufPos + 1] & 0xff); - return gTrue; -} - -GBool FileReader::getU32BE(int pos, Guint *val) { - if (!fillBuf(pos, 4)) { - return gFalse; - } - *val = ((buf[pos - bufPos] & 0xff) << 24) + - ((buf[pos - bufPos + 1] & 0xff) << 16) + - ((buf[pos - bufPos + 2] & 0xff) << 8) + - (buf[pos - bufPos + 3] & 0xff); - return gTrue; -} - -GBool FileReader::getU32LE(int pos, Guint *val) { - if (!fillBuf(pos, 4)) { - return gFalse; - } - *val = (buf[pos - bufPos] & 0xff) + - ((buf[pos - bufPos + 1] & 0xff) << 8) + - ((buf[pos - bufPos + 2] & 0xff) << 16) + - ((buf[pos - bufPos + 3] & 0xff) << 24); - return gTrue; -} - -GBool FileReader::getUVarBE(int pos, int size, Guint *val) { - int i; - - if (size < 1 || size > 4 || !fillBuf(pos, size)) { - return gFalse; - } - *val = 0; - for (i = 0; i < size; ++i) { - *val = (*val << 8) + (buf[pos - bufPos + i] & 0xff); - } - return gTrue; -} - -GBool FileReader::cmp(int pos, const char *s) { - int n; - - n = (int)strlen(s); - if (!fillBuf(pos, n)) { - return gFalse; - } - return !memcmp(buf - bufPos + pos, s, n); -} - -GBool FileReader::fillBuf(int pos, int len) { - if (pos < 0 || len < 0 || len > (int)sizeof(buf) || - pos > INT_MAX - (int)sizeof(buf)) { - return gFalse; - } - if (pos >= bufPos && pos + len <= bufPos + bufLen) { - return gTrue; - } - if (fseek(f, pos, SEEK_SET)) { - return gFalse; - } - bufPos = pos; - bufLen = (int)fread(buf, 1, sizeof(buf), f); - if (bufLen < len) { - return gFalse; - } - return gTrue; -} - -//------------------------------------------------------------------------ - -class StreamReader: public Reader { -public: - - static StreamReader *make(int (*getCharA)(void *data), void *dataA); - ~StreamReader(); - int getByte(int pos) override; - GBool getU16BE(int pos, int *val) override; - GBool getU32BE(int pos, Guint *val) override; - GBool getU32LE(int pos, Guint *val) override; - GBool getUVarBE(int pos, int size, Guint *val) override; - GBool cmp(int pos, const char *s) override; - -private: - - StreamReader(int (*getCharA)(void *data), void *dataA); - GBool fillBuf(int pos, int len); - - int (*getChar)(void *data); - void *data; - int streamPos; - char buf[1024]; - int bufPos, bufLen; -}; - -StreamReader *StreamReader::make(int (*getCharA)(void *data), void *dataA) { - return new StreamReader(getCharA, dataA); -} - -StreamReader::StreamReader(int (*getCharA)(void *data), void *dataA) { - getChar = getCharA; - data = dataA; - streamPos = 0; - bufPos = 0; - bufLen = 0; -} - -StreamReader::~StreamReader() { -} - -int StreamReader::getByte(int pos) { - if (!fillBuf(pos, 1)) { - return -1; - } - return buf[pos - bufPos] & 0xff; -} - -GBool StreamReader::getU16BE(int pos, int *val) { - if (!fillBuf(pos, 2)) { - return gFalse; - } - *val = ((buf[pos - bufPos] & 0xff) << 8) + - (buf[pos - bufPos + 1] & 0xff); - return gTrue; -} - -GBool StreamReader::getU32BE(int pos, Guint *val) { - if (!fillBuf(pos, 4)) { - return gFalse; - } - *val = ((buf[pos - bufPos] & 0xff) << 24) + - ((buf[pos - bufPos + 1] & 0xff) << 16) + - ((buf[pos - bufPos + 2] & 0xff) << 8) + - (buf[pos - bufPos + 3] & 0xff); - return gTrue; -} - -GBool StreamReader::getU32LE(int pos, Guint *val) { - if (!fillBuf(pos, 4)) { - return gFalse; - } - *val = (buf[pos - bufPos] & 0xff) + - ((buf[pos - bufPos + 1] & 0xff) << 8) + - ((buf[pos - bufPos + 2] & 0xff) << 16) + - ((buf[pos - bufPos + 3] & 0xff) << 24); - return gTrue; -} - -GBool StreamReader::getUVarBE(int pos, int size, Guint *val) { - int i; - - if (size < 1 || size > 4 || !fillBuf(pos, size)) { - return gFalse; - } - *val = 0; - for (i = 0; i < size; ++i) { - *val = (*val << 8) + (buf[pos - bufPos + i] & 0xff); - } - return gTrue; -} - -GBool StreamReader::cmp(int pos, const char *s) { - const int n = (int)strlen(s); - if (!fillBuf(pos, n)) { - return gFalse; - } - const int posDiff = pos - bufPos; - return !memcmp(buf + posDiff, s, n); -} - -GBool StreamReader::fillBuf(int pos, int len) { - int c; - - if (pos < 0 || len < 0 || len > (int)sizeof(buf) || - pos > INT_MAX - (int)sizeof(buf)) { - return gFalse; - } - if (pos < bufPos) { - return gFalse; - } - - // if requested region will not fit in the current buffer... - if (pos + len > bufPos + (int)sizeof(buf)) { - - // if the start of the requested data is already in the buffer, move - // it to the start of the buffer - if (pos < bufPos + bufLen) { - bufLen -= pos - bufPos; - memmove(buf, buf + (pos - bufPos), bufLen); - bufPos = pos; - - // otherwise discard data from the - // stream until we get to the requested position - } else { - bufPos += bufLen; - bufLen = 0; - while (bufPos < pos) { - if ((c = (*getChar)(data)) < 0) { - return gFalse; - } - ++bufPos; - } - } - } - - // read the rest of the requested data - while (bufPos + bufLen < pos + len) { - if ((c = (*getChar)(data)) < 0) { - return gFalse; - } - buf[bufLen++] = (char)c; - } - - return gTrue; -} - -} - -//------------------------------------------------------------------------ - -static FoFiIdentifierType identify(Reader *reader); -static FoFiIdentifierType identifyOpenType(Reader *reader); -static FoFiIdentifierType identifyCFF(Reader *reader, int start); - -FoFiIdentifierType FoFiIdentifier::identifyMem(char *file, int len) { - MemReader *reader; - FoFiIdentifierType type; - - if (!(reader = MemReader::make(file, len))) { - return fofiIdError; - } - type = identify(reader); - delete reader; - return type; -} - -FoFiIdentifierType FoFiIdentifier::identifyFile(char *fileName) { - FileReader *reader; - FoFiIdentifierType type; - - if (!(reader = FileReader::make(fileName))) { - return fofiIdError; - } - type = identify(reader); - delete reader; - return type; -} - -FoFiIdentifierType FoFiIdentifier::identifyStream(int (*getChar)(void *data), - void *data) { - StreamReader *reader; - FoFiIdentifierType type; - - if (!(reader = StreamReader::make(getChar, data))) { - return fofiIdError; - } - type = identify(reader); - delete reader; - return type; -} - -static FoFiIdentifierType identify(Reader *reader) { - Guint n; - - //----- PFA - if (reader->cmp(0, "%!PS-AdobeFont-1") || - reader->cmp(0, "%!FontType1")) { - return fofiIdType1PFA; - } - - //----- PFB - if (reader->getByte(0) == 0x80 && - reader->getByte(1) == 0x01 && - reader->getU32LE(2, &n)) { - if ((n >= 16 && reader->cmp(6, "%!PS-AdobeFont-1")) || - (n >= 11 && reader->cmp(6, "%!FontType1"))) { - return fofiIdType1PFB; - } - } - - //----- TrueType - if ((reader->getByte(0) == 0x00 && - reader->getByte(1) == 0x01 && - reader->getByte(2) == 0x00 && - reader->getByte(3) == 0x00) || - (reader->getByte(0) == 0x74 && // 'true' - reader->getByte(1) == 0x72 && - reader->getByte(2) == 0x75 && - reader->getByte(3) == 0x65)) { - return fofiIdTrueType; - } - if (reader->getByte(0) == 0x74 && // 'ttcf' - reader->getByte(1) == 0x74 && - reader->getByte(2) == 0x63 && - reader->getByte(3) == 0x66) { - return fofiIdTrueTypeCollection; - } - - //----- OpenType - if (reader->getByte(0) == 0x4f && // 'OTTO - reader->getByte(1) == 0x54 && - reader->getByte(2) == 0x54 && - reader->getByte(3) == 0x4f) { - return identifyOpenType(reader); - } - - //----- CFF - if (reader->getByte(0) == 0x01 && - reader->getByte(1) == 0x00) { - return identifyCFF(reader, 0); - } - // some tools embed CFF fonts with an extra whitespace char at the - // beginning - if (reader->getByte(1) == 0x01 && - reader->getByte(2) == 0x00) { - return identifyCFF(reader, 1); - } - - return fofiIdUnknown; -} - -static FoFiIdentifierType identifyOpenType(Reader *reader) { - FoFiIdentifierType type; - Guint offset; - int nTables, i; - - if (!reader->getU16BE(4, &nTables)) { - return fofiIdUnknown; - } - for (i = 0; i < nTables; ++i) { - if (reader->cmp(12 + i*16, "CFF ")) { - if (reader->getU32BE(12 + i*16 + 8, &offset) && - offset < (Guint)INT_MAX) { - type = identifyCFF(reader, (int)offset); - if (type == fofiIdCFF8Bit) { - type = fofiIdOpenTypeCFF8Bit; - } else if (type == fofiIdCFFCID) { - type = fofiIdOpenTypeCFFCID; - } - return type; - } - return fofiIdUnknown; - } - } - return fofiIdUnknown; -} - -static FoFiIdentifierType identifyCFF(Reader *reader, int start) { - Guint offset0, offset1; - int hdrSize, offSize0, offSize1, pos, endPos, b0, n, i; - - //----- read the header - if (reader->getByte(start) != 0x01 || - reader->getByte(start + 1) != 0x00) { - return fofiIdUnknown; - } - if ((hdrSize = reader->getByte(start + 2)) < 0) { - return fofiIdUnknown; - } - if ((offSize0 = reader->getByte(start + 3)) < 1 || offSize0 > 4) { - return fofiIdUnknown; - } - pos = start + hdrSize; - if (pos < 0) { - return fofiIdUnknown; - } - - //----- skip the name index - if (!reader->getU16BE(pos, &n)) { - return fofiIdUnknown; - } - if (n == 0) { - pos += 2; - } else { - if ((offSize1 = reader->getByte(pos + 2)) < 1 || offSize1 > 4) { - return fofiIdUnknown; - } - if (!reader->getUVarBE(pos + 3 + n * offSize1, offSize1, &offset1) || - offset1 > (Guint)INT_MAX) { - return fofiIdUnknown; - } - pos += 3 + (n + 1) * offSize1 + (int)offset1 - 1; - } - if (pos < 0) { - return fofiIdUnknown; - } - - //----- parse the top dict index - if (!reader->getU16BE(pos, &n) || n < 1) { - return fofiIdUnknown; - } - if ((offSize1 = reader->getByte(pos + 2)) < 1 || offSize1 > 4) { - return fofiIdUnknown; - } - if (!reader->getUVarBE(pos + 3, offSize1, &offset0) || - offset0 > (Guint)INT_MAX || - !reader->getUVarBE(pos + 3 + offSize1, offSize1, &offset1) || - offset1 > (Guint)INT_MAX || - offset0 > offset1) { - return fofiIdUnknown; - } - pos = pos + 3 + (n + 1) * offSize1 + (int)offset0 - 1; - endPos = pos + 3 + (n + 1) * offSize1 + (int)offset1 - 1; - if (pos < 0 || endPos < 0 || pos > endPos) { - return fofiIdUnknown; - } - - //----- parse the top dict, look for ROS as first entry - // for a CID font, the top dict starts with: - // <int> <int> <int> ROS - for (i = 0; i < 3; ++i) { - b0 = reader->getByte(pos++); - if (b0 == 0x1c) { - pos += 2; - } else if (b0 == 0x1d) { - pos += 4; - } else if (b0 >= 0xf7 && b0 <= 0xfe) { - pos += 1; - } else if (b0 < 0x20 || b0 > 0xf6) { - return fofiIdCFF8Bit; - } - if (pos >= endPos || pos < 0) { - return fofiIdCFF8Bit; - } - } - if (pos + 1 < endPos && - reader->getByte(pos) == 12 && - reader->getByte(pos + 1) == 30) { - return fofiIdCFFCID; - } else { - return fofiIdCFF8Bit; - } -} |