| Index: source/test/perf/leperf/FontObject.cpp
|
| diff --git a/source/test/perf/leperf/FontObject.cpp b/source/test/perf/leperf/FontObject.cpp
|
| deleted file mode 100644
|
| index 1d6f6ec88d03b8034924cf61d00a2f0e10d18388..0000000000000000000000000000000000000000
|
| --- a/source/test/perf/leperf/FontObject.cpp
|
| +++ /dev/null
|
| @@ -1,240 +0,0 @@
|
| -/***************************************************************************
|
| -*
|
| -* Copyright (C) 1998-2013, International Business Machines
|
| -* Corporation and others. All Rights Reserved.
|
| -*
|
| -************************************************************************/
|
| -
|
| -#include <stdio.h>
|
| -
|
| -#include "LETypes.h"
|
| -#include "FontObject.h"
|
| -#include "LESwaps.h"
|
| -
|
| -FontObject::FontObject(char *fileName)
|
| - : directory(NULL), numTables(0), searchRange(0),entrySelector(0),
|
| - cmapTable(NULL), cmSegCount(0), cmSearchRange(0), cmEntrySelector(0),
|
| - cmEndCodes(NULL), cmStartCodes(NULL), cmIdDelta(0), cmIdRangeOffset(0),
|
| - headTable(NULL), hmtxTable(NULL), numGlyphs(0), numOfLongHorMetrics(0), file(NULL)
|
| -{
|
| - file = fopen(fileName, "rb");
|
| -
|
| - if (file == NULL) {
|
| - printf("?? Couldn't open %s", fileName);
|
| - return;
|
| - }
|
| -
|
| - SFNTDirectory tempDir;
|
| -
|
| - fread(&tempDir, sizeof tempDir, 1, file);
|
| -
|
| - numTables = SWAPW(tempDir.numTables);
|
| - searchRange = SWAPW(tempDir.searchRange) >> 4;
|
| - entrySelector = SWAPW(tempDir.entrySelector);
|
| - rangeShift = SWAPW(tempDir.rangeShift) >> 4;
|
| -
|
| - int dirSize = sizeof tempDir + ((numTables - ANY_NUMBER) * sizeof(DirectoryEntry));
|
| -
|
| - directory = (SFNTDirectory *) new char[dirSize];
|
| -
|
| - fseek(file, 0L, SEEK_SET);
|
| - fread(directory, sizeof(char), dirSize, file);
|
| -
|
| - initUnicodeCMAP();
|
| -}
|
| -
|
| -FontObject::~FontObject()
|
| -{
|
| - fclose(file);
|
| - delete[] directory;
|
| - delete[] cmapTable;
|
| - delete[] headTable;
|
| - delete[] hmtxTable;
|
| -}
|
| -
|
| -void FontObject::deleteTable(void *table)
|
| -{
|
| - delete[] (char *) table;
|
| -}
|
| -
|
| -DirectoryEntry *FontObject::findTable(LETag tag)
|
| -{
|
| - le_uint16 table = 0;
|
| - le_uint16 probe = 1 << entrySelector;
|
| -
|
| - if (SWAPL(directory->tableDirectory[rangeShift].tag) <= tag) {
|
| - table = rangeShift;
|
| - }
|
| -
|
| - while (probe > (1 << 0)) {
|
| - probe >>= 1;
|
| -
|
| - if (SWAPL(directory->tableDirectory[table + probe].tag) <= tag) {
|
| - table += probe;
|
| - }
|
| - }
|
| -
|
| - if (SWAPL(directory->tableDirectory[table].tag) == tag) {
|
| - return &directory->tableDirectory[table];
|
| - }
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -void *FontObject::readTable(LETag tag, le_uint32 *length)
|
| -{
|
| - DirectoryEntry *entry = findTable(tag);
|
| -
|
| - if (entry == NULL) {
|
| - *length = 0;
|
| - return NULL;
|
| - }
|
| -
|
| - *length = SWAPL(entry->length);
|
| -
|
| - void *table = new char[*length];
|
| -
|
| - fseek(file, SWAPL(entry->offset), SEEK_SET);
|
| - fread(table, sizeof(char), *length, file);
|
| -
|
| - return table;
|
| -}
|
| -
|
| -CMAPEncodingSubtable *FontObject::findCMAP(le_uint16 platformID, le_uint16 platformSpecificID)
|
| -{
|
| - LETag cmapTag = 0x636D6170; // 'cmap'
|
| -
|
| - if (cmapTable == NULL) {
|
| - le_uint32 length;
|
| -
|
| - cmapTable = (CMAPTable *) readTable(cmapTag, &length);
|
| - }
|
| -
|
| - if (cmapTable != NULL) {
|
| - le_uint16 i;
|
| - le_uint16 nSubtables = SWAPW(cmapTable->numberSubtables);
|
| -
|
| -
|
| - for (i = 0; i < nSubtables; i += 1) {
|
| - CMAPEncodingSubtableHeader *esh = &cmapTable->encodingSubtableHeaders[i];
|
| -
|
| - if (SWAPW(esh->platformID) == platformID &&
|
| - SWAPW(esh->platformSpecificID) == platformSpecificID) {
|
| - return (CMAPEncodingSubtable *) ((char *) cmapTable + SWAPL(esh->encodingOffset));
|
| - }
|
| - }
|
| - }
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -void FontObject::initUnicodeCMAP()
|
| -{
|
| - CMAPEncodingSubtable *encodingSubtable = findCMAP(3, 1);
|
| -
|
| - if (encodingSubtable == 0 ||
|
| - SWAPW(encodingSubtable->format) != 4) {
|
| - printf("Can't find unicode 'cmap'");
|
| - return;
|
| - }
|
| -
|
| - CMAPFormat4Encoding *header = (CMAPFormat4Encoding *) encodingSubtable;
|
| -
|
| - cmSegCount = SWAPW(header->segCountX2) / 2;
|
| - cmSearchRange = SWAPW(header->searchRange);
|
| - cmEntrySelector = SWAPW(header->entrySelector);
|
| - cmRangeShift = SWAPW(header->rangeShift) / 2;
|
| - cmEndCodes = &header->endCodes[0];
|
| - cmStartCodes = &header->endCodes[cmSegCount + 1]; // + 1 for reservedPad...
|
| - cmIdDelta = &cmStartCodes[cmSegCount];
|
| - cmIdRangeOffset = &cmIdDelta[cmSegCount];
|
| -}
|
| -
|
| -LEGlyphID FontObject::unicodeToGlyph(LEUnicode32 unicode32)
|
| -{
|
| - if (unicode32 >= 0x10000) {
|
| - return 0;
|
| - }
|
| -
|
| - LEUnicode16 unicode = (LEUnicode16) unicode32;
|
| - le_uint16 index = 0;
|
| - le_uint16 probe = 1 << cmEntrySelector;
|
| - LEGlyphID result = 0;
|
| -
|
| - if (SWAPW(cmStartCodes[cmRangeShift]) <= unicode) {
|
| - index = cmRangeShift;
|
| - }
|
| -
|
| - while (probe > (1 << 0)) {
|
| - probe >>= 1;
|
| -
|
| - if (SWAPW(cmStartCodes[index + probe]) <= unicode) {
|
| - index += probe;
|
| - }
|
| - }
|
| -
|
| - if (unicode >= SWAPW(cmStartCodes[index]) && unicode <= SWAPW(cmEndCodes[index])) {
|
| - if (cmIdRangeOffset[index] == 0) {
|
| - result = (LEGlyphID) unicode;
|
| - } else {
|
| - le_uint16 offset = unicode - SWAPW(cmStartCodes[index]);
|
| - le_uint16 rangeOffset = SWAPW(cmIdRangeOffset[index]);
|
| - le_uint16 *glyphIndexTable = (le_uint16 *) ((char *) &cmIdRangeOffset[index] + rangeOffset);
|
| -
|
| - result = SWAPW(glyphIndexTable[offset]);
|
| - }
|
| -
|
| - result += SWAPW(cmIdDelta[index]);
|
| - } else {
|
| - result = 0;
|
| - }
|
| -
|
| - return result;
|
| -}
|
| -
|
| -le_uint16 FontObject::getUnitsPerEM()
|
| -{
|
| - if (headTable == NULL) {
|
| - LETag headTag = 0x68656164; // 'head'
|
| - le_uint32 length;
|
| -
|
| - headTable = (HEADTable *) readTable(headTag, &length);
|
| - }
|
| -
|
| - return SWAPW(headTable->unitsPerEm);
|
| -}
|
| -
|
| -le_uint16 FontObject::getGlyphAdvance(LEGlyphID glyph)
|
| -{
|
| - if (hmtxTable == NULL) {
|
| - LETag maxpTag = 0x6D617870; // 'maxp'
|
| - LETag hheaTag = 0x68686561; // 'hhea'
|
| - LETag hmtxTag = 0x686D7478; // 'hmtx'
|
| - le_uint32 length;
|
| - HHEATable *hheaTable;
|
| - MAXPTable *maxpTable = (MAXPTable *) readTable(maxpTag, &length);
|
| -
|
| - numGlyphs = SWAPW(maxpTable->numGlyphs);
|
| - deleteTable(maxpTable);
|
| -
|
| - hheaTable = (HHEATable *) readTable(hheaTag, &length);
|
| - numOfLongHorMetrics = SWAPW(hheaTable->numOfLongHorMetrics);
|
| - deleteTable(hheaTable);
|
| -
|
| - hmtxTable = (HMTXTable *) readTable(hmtxTag, &length);
|
| - }
|
| -
|
| - le_uint16 index = glyph;
|
| -
|
| - if (glyph >= numGlyphs) {
|
| - return 0;
|
| - }
|
| -
|
| - if (glyph >= numOfLongHorMetrics) {
|
| - index = numOfLongHorMetrics - 1;
|
| - }
|
| -
|
| - return SWAPW(hmtxTable->hMetrics[index].advanceWidth);
|
| -}
|
| -
|
| -
|
|
|