/*
*******************************************************************************
*
- * Copyright (C) 1999-2008, International Business Machines
+ * Copyright (C) 1999-2013, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
#include "PortableFontInstance.h"
-#include "letest.h"
+//#include "letest.h"
#include "sfnt.h"
#include <string.h>
+#include <stdio.h>
+
+#if 0
+static const char *letagToStr(LETag tag, char *str) {
+ str[0]= 0xFF & (tag>>24);
+ str[1]= 0xFF & (tag>>16);
+ str[2]= 0xFF & (tag>>8);
+ str[3]= 0xFF & (tag>>0);
+ str[4]= 0;
+ return str;
+}
+#endif
//
// Finds the high bit by binary searching
// open the font file
fFile = fopen(fileName, "rb");
+ //printf("Open Font: %s\n", fileName);
if (fFile == NULL) {
+ printf("%s:%d: %s: FNF\n", __FILE__, __LINE__, fileName);
status = LE_FONT_FILE_NOT_FOUND_ERROR;
return;
}
// const NAMETable *nameTable = NULL;
le_uint16 numTables = 0;
- fDirectory = (const SFNTDirectory *) NEW_ARRAY(char, dirSize);
+ fDirectory = (const SFNTDirectory *) LE_NEW_ARRAY(char, dirSize);
if (fDirectory == NULL) {
+ printf("%s:%d: %s: malloc err\n", __FILE__, __LINE__, fileName);
status = LE_MEMORY_ALLOCATION_ERROR;
goto error_exit;
}
if (headTable == NULL) {
status = LE_MISSING_FONT_TABLE_ERROR;
+ printf("%s:%d: %s: missing head table\n", __FILE__, __LINE__, fileName);
goto error_exit;
}
hheaTable = (HHEATable *) readFontTable(hheaTag);
if (hheaTable == NULL) {
+ printf("%s:%d: %s: missing hhea table\n", __FILE__, __LINE__, fileName);
status = LE_MISSING_FONT_TABLE_ERROR;
goto error_exit;
}
fCMAPMapper = findUnicodeMapper();
if (fCMAPMapper == NULL) {
+ printf("%s:%d: %s: can't load cmap\n", __FILE__, __LINE__, fileName);
status = LE_MISSING_FONT_TABLE_ERROR;
goto error_exit;
}
delete fCMAPMapper;
- DELETE_ARRAY(fDirectory);
+ LE_DELETE_ARRAY(fDirectory);
}
}
*length = SWAPL(entry->length);
- void *table = NEW_ARRAY(char, *length);
+ void *table = LE_NEW_ARRAY(char, *length);
if (table != NULL) {
fseek(fFile, SWAPL(entry->offset), SEEK_SET);
const void *PortableFontInstance::getFontTable(LETag tableTag) const
{
- return FontTableCache::find(tableTag);
+ size_t ignored;
+ return getFontTable(tableTag, ignored);
}
-const void *PortableFontInstance::readFontTable(LETag tableTag) const
+const void *PortableFontInstance::getFontTable(LETag tableTag, size_t &length) const
+{
+ return FontTableCache::find(tableTag, length);
+}
+
+const void *PortableFontInstance::readFontTable(LETag tableTag, size_t &length) const
{
le_uint32 len;
- return readTable(tableTag, &len);
+ const void *data= readTable(tableTag, &len);
+ length = len;
+ //char tag5[5];
+ //printf("Read %s, result %p #%d\n", letagToStr(tableTag,tag5), data,len);
+ return data;
}
CMAPMapper *PortableFontInstance::findUnicodeMapper()
SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) {
char *name = ((char *) fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset);
le_uint16 length = SWAPW(nameRecord->length);
- char *result = NEW_ARRAY(char, length + 2);
+ char *result = LE_NEW_ARRAY(char, length + 2);
- ARRAY_COPY(result, name, length);
+ LE_ARRAY_COPY(result, name, length);
result[length] = result[length + 1] = 0;
return result;
SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) {
LEUnicode16 *name = (LEUnicode16 *) (((char *) fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset));
le_uint16 length = SWAPW(nameRecord->length) / 2;
- LEUnicode16 *result = NEW_ARRAY(LEUnicode16, length + 2);
+ LEUnicode16 *result = LE_NEW_ARRAY(LEUnicode16, length + 2);
for (le_int32 c = 0; c < length; c += 1) {
result[c] = SWAPW(name[c]);
void PortableFontInstance::deleteNameString(const char *name) const
{
- DELETE_ARRAY(name);
+ LE_DELETE_ARRAY(name);
}
void PortableFontInstance::deleteNameString(const LEUnicode16 *name) const
{
- DELETE_ARRAY(name);
+ LE_DELETE_ARRAY(name);
}
void PortableFontInstance::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const
return fFontChecksum;
}
+le_uint32 PortableFontInstance::getRawChecksum() const
+{
+ // how big is it?
+ // fseek(fFile, 0L, SEEK_END);
+ // long size = ftell(fFile);
+ le_int32 chksum = 0;
+ // now, calculate
+ fseek(fFile, 0L, SEEK_SET);
+ int r;
+ int count =0;
+ while((r = fgetc(fFile)) != EOF) {
+ chksum += r;
+ count ++;
+ }
+ return (le_uint32) chksum; // cast to signed
+}
+
le_int32 PortableFontInstance::getAscent() const
{
return fAscent;