/* ******************************************************************************* * * Copyright (C) 1999-2001, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* * file name: RenderingFontInstance.h * * created on: 10/23/2001 * created by: Eric R. Mader */ #ifndef __RENDERINGFONTINSTANCE_H #define __RENDERINGFONTINSTANCE_H #include "LETypes.h" #include "LEFontInstance.h" #include "cmaps.h" #define TABLE_CACHE_INIT 5 #define TABLE_CACHE_GROW 5 struct TableCacheEntry { LETag tag; void *table; }; enum RFIErrorCode { RFI_NO_ERROR = 0, RFI_ILLEGAL_ARGUMENT_ERROR = 1, RFI_FONT_FILE_NOT_FOUND_ERROR = 2, RFI_MISSING_FONT_TABLE_ERROR = 3, RFI_OUT_OF_MEMORY_ERROR = 4 }; class RenderingFontInstance : public LEFontInstance { protected: void *fSurface; le_int32 fPointSize; le_int32 fUnitsPerEM; le_int32 fAscent; le_int32 fDescent; le_int32 fLeading; float fDeviceScaleX; float fDeviceScaleY; TableCacheEntry *fTableCache; le_int32 fTableCacheCurr; le_int32 fTableCacheSize; CMAPMapper *fMapper; virtual RFIErrorCode initMapper(); virtual RFIErrorCode initFontTableCache(); virtual void flushFontTableCache(); virtual const void *readFontTable(LETag tableTag) const = 0; public: RenderingFontInstance(void *surface, le_int16 pointSize); virtual ~RenderingFontInstance(); virtual const void *getFontTable(LETag tableTag) const; virtual le_bool canDisplay(LEUnicode32 ch) const { return fMapper->unicodeToGlyph(ch) != 0; }; virtual le_int32 getUnitsPerEM() const { return fUnitsPerEM; }; virtual le_int32 getLineHeight() const { return getAscent() + getDescent() + getLeading(); }; virtual le_int32 getAscent() const { return fAscent; }; virtual le_int32 getDescent() const { return fDescent; }; virtual le_int32 getLeading() const { return fLeading; }; virtual void mapCharsToGlyphs(const LEUnicode chars[], le_int32 offset, le_int32 count, le_bool reverse, const LECharMapper *mapper, LEGlyphID glyphs[]) const; virtual LEGlyphID mapCharToGlyph(LEUnicode32 ch, const LECharMapper *mapper) const; virtual le_int32 getName(le_uint16 platformID, le_uint16 scriptID, le_uint16 languageID, le_uint16 nameID, LEUnicode *name) const { // This is only used for CDAC fonts, and we'll have to loose that support anyhow... //return (le_int32) fFontObject->getName(platformID, scriptID, languageID, nameID, name); if (name != NULL) { *name = 0; } return 0; }; virtual void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const = 0; virtual le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const = 0; virtual const void setFont(void *surface) const { // default implementation is to ignore this }; virtual void drawGlyphs(void *surface, LEGlyphID *glyphs, le_uint32 count, le_int32 *dx, le_int32 x, le_int32 y, le_int32 width, le_int32 height) const = 0; float getXPixelsPerEm() const { return (float) fPointSize; }; float getYPixelsPerEm() const { return (float) fPointSize; }; float xUnitsToPoints(float xUnits) const { return (xUnits * fPointSize) / (float) fUnitsPerEM; }; float yUnitsToPoints(float yUnits) const { return (yUnits * fPointSize) / (float) fUnitsPerEM; }; void unitsToPoints(LEPoint &units, LEPoint &points) const { points.fX = xUnitsToPoints(units.fX); points.fY = yUnitsToPoints(units.fY); } float xPixelsToUnits(float xPixels) const { return (xPixels * fUnitsPerEM) / (float) fPointSize; }; float yPixelsToUnits(float yPixels) const { return (yPixels * fUnitsPerEM) / (float) fPointSize; }; void pixelsToUnits(LEPoint &pixels, LEPoint &units) const { units.fX = xPixelsToUnits(pixels.fX); units.fY = yPixelsToUnits(pixels.fY); }; void transformFunits(float xFunits, float yFunits, LEPoint &pixels) const { pixels.fX = xUnitsToPoints(xFunits) * fDeviceScaleX; pixels.fY = yUnitsToPoints(yFunits) * fDeviceScaleY; } }; #endif