17d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod/*
27d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *******************************************************************************
37d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *
47d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *   Copyright (C) 1999-2008, International Business Machines
57d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *   Corporation and others.  All Rights Reserved.
67d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *
77d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *******************************************************************************
87d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *   file name:  PortableFontInstance.cpp
97d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *
107d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *   created on: 11/22/1999
117d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *   created by: Eric R. Mader
127d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod */
137d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
147d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include <stdio.h>
157d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
167d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include "layout/LETypes.h"
177d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include "layout/LEFontInstance.h"
187d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include "layout/LESwaps.h"
197d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
207d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include "PortableFontInstance.h"
217d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
227d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include "letest.h"
237d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include "sfnt.h"
247d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
257d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include <string.h>
267d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
277d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
28ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad EsfahbodPortableFontInstance::PortableFontInstance(hb_face_t *face, float xScale, float yScale, LEErrorCode &status)
29ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    : fFace(face), fXScale(xScale), fYScale(yScale), fUnitsPerEM(0), fAscent(0), fDescent(0), fLeading(0),
30ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod      fNAMETable(NULL), fNameCount(0), fNameStringOffset(0), fCMAPMapper(NULL), fHMTXTable(NULL), fNumGlyphs(0), fNumLongHorMetrics(0)
317d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
327d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (LE_FAILURE(status)) {
337d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        return;
347d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
357d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
367d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    const LETag hheaTag = LE_HHEA_TABLE_TAG;
377d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    const HHEATable *hheaTable = NULL;
387d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
39ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    fUnitsPerEM = hb_face_get_upem (face);
407d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
41e96bb36995b2a5321b4d32bb11906e1701aaf115Behdad Esfahbod    hheaTable = (HHEATable *) getFontTable(hheaTag);
427d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
437d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (hheaTable == NULL) {
447d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        status = LE_MISSING_FONT_TABLE_ERROR;
45ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod	return;
467d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
477d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
487d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    fAscent  = (le_int32) yUnitsToPoints((float) SWAPW(hheaTable->ascent));
497d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    fDescent = (le_int32) yUnitsToPoints((float) SWAPW(hheaTable->descent));
507d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    fLeading = (le_int32) yUnitsToPoints((float) SWAPW(hheaTable->lineGap));
517d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
527d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    fNumLongHorMetrics = SWAPW(hheaTable->numOfLongHorMetrics);
537d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
547d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    fCMAPMapper = findUnicodeMapper();
557d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
567d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (fCMAPMapper == NULL) {
577d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        status = LE_MISSING_FONT_TABLE_ERROR;
58ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod	return;
597d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
607d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
617d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
627d242364ea647f655a7092bda25f9a10774c57f5Behdad EsfahbodPortableFontInstance::~PortableFontInstance()
637d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
64ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    if (fCMAPMapper)
657d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        delete fCMAPMapper;
667d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
677d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
687d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodconst void *PortableFontInstance::getFontTable(LETag tableTag) const
697d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
707d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return FontTableCache::find(tableTag);
717d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
727d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
73ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbodhb_blob_t *PortableFontInstance::readFontTable(LETag tableTag) const
747d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
75ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod  return hb_face_reference_table(fFace, tableTag);
767d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
777d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
787d242364ea647f655a7092bda25f9a10774c57f5Behdad EsfahbodCMAPMapper *PortableFontInstance::findUnicodeMapper()
797d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
807d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    LETag cmapTag = LE_CMAP_TABLE_TAG;
81e96bb36995b2a5321b4d32bb11906e1701aaf115Behdad Esfahbod    const CMAPTable *cmap = (CMAPTable *) getFontTable(cmapTag);
827d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
837d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (cmap == NULL) {
847d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        return NULL;
857d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
867d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
877d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return CMAPMapper::createUnicodeMapper(cmap);
887d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
897d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
907d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodconst char *PortableFontInstance::getNameString(le_uint16 nameID, le_uint16 platformID, le_uint16 encodingID, le_uint16 languageID) const
917d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
927d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (fNAMETable == NULL) {
937d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        LETag nameTag = LE_NAME_TABLE_TAG;
947d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        PortableFontInstance *realThis = (PortableFontInstance *) this;
957d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
96e96bb36995b2a5321b4d32bb11906e1701aaf115Behdad Esfahbod        realThis->fNAMETable = (const NAMETable *) getFontTable(nameTag);
977d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
987d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        if (realThis->fNAMETable != NULL) {
997d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            realThis->fNameCount        = SWAPW(realThis->fNAMETable->count);
1007d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            realThis->fNameStringOffset = SWAPW(realThis->fNAMETable->stringOffset);
1017d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        }
1027d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
1037d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1047d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    for(le_int32 i = 0; i < fNameCount; i += 1) {
1057d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        const NameRecord *nameRecord = &fNAMETable->nameRecords[i];
1067d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1077d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        if (SWAPW(nameRecord->platformID) == platformID && SWAPW(nameRecord->encodingID) == encodingID &&
1087d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) {
1097d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            char *name = ((char *) fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset);
1107d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            le_uint16 length = SWAPW(nameRecord->length);
1117d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            char *result = NEW_ARRAY(char, length + 2);
1127d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1137d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            ARRAY_COPY(result, name, length);
1147d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            result[length] = result[length + 1] = 0;
1157d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1167d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            return result;
1177d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        }
1187d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
1197d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1207d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return NULL;
1217d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
1227d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1237d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodconst LEUnicode16 *PortableFontInstance::getUnicodeNameString(le_uint16 nameID, le_uint16 platformID, le_uint16 encodingID, le_uint16 languageID) const
1247d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
1257d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (fNAMETable == NULL) {
1267d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        LETag nameTag = LE_NAME_TABLE_TAG;
1277d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        PortableFontInstance *realThis = (PortableFontInstance *) this;
1287d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
129e96bb36995b2a5321b4d32bb11906e1701aaf115Behdad Esfahbod        realThis->fNAMETable = (const NAMETable *) getFontTable(nameTag);
1307d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1317d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        if (realThis->fNAMETable != NULL) {
1327d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            realThis->fNameCount        = SWAPW(realThis->fNAMETable->count);
1337d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            realThis->fNameStringOffset = SWAPW(realThis->fNAMETable->stringOffset);
1347d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        }
1357d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
1367d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1377d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    for(le_int32 i = 0; i < fNameCount; i += 1) {
1387d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        const NameRecord *nameRecord = &fNAMETable->nameRecords[i];
1397d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1407d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        if (SWAPW(nameRecord->platformID) == platformID && SWAPW(nameRecord->encodingID) == encodingID &&
1417d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            SWAPW(nameRecord->languageID) == languageID && SWAPW(nameRecord->nameID) == nameID) {
1427d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            LEUnicode16 *name = (LEUnicode16 *) (((char *) fNAMETable) + fNameStringOffset + SWAPW(nameRecord->offset));
1437d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            le_uint16 length = SWAPW(nameRecord->length) / 2;
1447d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            LEUnicode16 *result = NEW_ARRAY(LEUnicode16, length + 2);
1457d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1467d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            for (le_int32 c = 0; c < length; c += 1) {
1477d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod                result[c] = SWAPW(name[c]);
1487d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            }
1497d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1507d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            result[length] = 0;
1517d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1527d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            return result;
1537d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        }
1547d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
1557d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1567d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return NULL;
1577d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
1587d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1597d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodvoid PortableFontInstance::deleteNameString(const char *name) const
1607d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
1617d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    DELETE_ARRAY(name);
1627d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
1637d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1647d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodvoid PortableFontInstance::deleteNameString(const LEUnicode16 *name) const
1657d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
1667d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    DELETE_ARRAY(name);
1677d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
1687d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1697d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodvoid PortableFontInstance::getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const
1707d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
1717d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    TTGlyphID ttGlyph = (TTGlyphID) LE_GET_GLYPH(glyph);
1727d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1737d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (fHMTXTable == NULL) {
1747d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        LETag maxpTag = LE_MAXP_TABLE_TAG;
1757d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        LETag hmtxTag = LE_HMTX_TABLE_TAG;
176e96bb36995b2a5321b4d32bb11906e1701aaf115Behdad Esfahbod        const MAXPTable *maxpTable = (MAXPTable *) getFontTable(maxpTag);
1777d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        PortableFontInstance *realThis = (PortableFontInstance *) this;
1787d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1797d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        if (maxpTable != NULL) {
1807d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod            realThis->fNumGlyphs = SWAPW(maxpTable->numGlyphs);
1817d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        }
1827d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
183e96bb36995b2a5321b4d32bb11906e1701aaf115Behdad Esfahbod        realThis->fHMTXTable = (const HMTXTable *) getFontTable(hmtxTag);
1847d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
1857d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1867d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    le_uint16 index = ttGlyph;
1877d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1887d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (ttGlyph >= fNumGlyphs || fHMTXTable == NULL) {
1897d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        advance.fX = advance.fY = 0;
1907d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        return;
1917d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
1927d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1937d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (ttGlyph >= fNumLongHorMetrics) {
1947d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        index = fNumLongHorMetrics - 1;
1957d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
1967d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
1977d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    advance.fX = xUnitsToPoints(SWAPW(fHMTXTable->hMetrics[index].advanceWidth));
1987d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    advance.fY = 0;
1997d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2007d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2017d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodle_bool PortableFontInstance::getGlyphPoint(LEGlyphID /*glyph*/, le_int32 /*pointNumber*/, LEPoint &/*point*/) const
2027d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2037d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return FALSE;
2047d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2057d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2067d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodle_int32 PortableFontInstance::getUnitsPerEM() const
2077d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2087d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return fUnitsPerEM;
2097d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2107d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2117d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodle_uint32 PortableFontInstance::getFontChecksum() const
2127d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
213ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    return 0;
2147d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2157d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2167d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodle_int32 PortableFontInstance::getAscent() const
2177d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2187d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return fAscent;
2197d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2207d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2217d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodle_int32 PortableFontInstance::getDescent() const
2227d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2237d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return fDescent;
2247d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2257d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2267d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodle_int32 PortableFontInstance::getLeading() const
2277d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2287d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return fLeading;
2297d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2307d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2317d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod// We really want to inherit this method from the superclass, but some compilers
2327d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod// issue a warning if we don't implement it...
2337d242364ea647f655a7092bda25f9a10774c57f5Behdad EsfahbodLEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper, le_bool filterZeroWidth) const
2347d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2357d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return LEFontInstance::mapCharToGlyph(ch, mapper, filterZeroWidth);
2367d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2377d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2387d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod// We really want to inherit this method from the superclass, but some compilers
2397d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod// issue a warning if we don't implement it...
2407d242364ea647f655a7092bda25f9a10774c57f5Behdad EsfahbodLEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const
2417d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2427d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return LEFontInstance::mapCharToGlyph(ch, mapper);
2437d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2447d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2457d242364ea647f655a7092bda25f9a10774c57f5Behdad EsfahbodLEGlyphID PortableFontInstance::mapCharToGlyph(LEUnicode32 ch) const
2467d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2477d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return fCMAPMapper->unicodeToGlyph(ch);
2487d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2497d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2507d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodfloat PortableFontInstance::getXPixelsPerEm() const
2517d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
252ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    return fXScale;
2537d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2547d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2557d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodfloat PortableFontInstance::getYPixelsPerEm() const
2567d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
257ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    return fYScale;
2587d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2597d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2607d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodfloat PortableFontInstance::getScaleFactorX() const
2617d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2627d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return 1.0;
2637d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
2647d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
2657d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodfloat PortableFontInstance::getScaleFactorY() const
2667d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
2677d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    return 1.0;
2687d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
269