Logo Search packages:      
Sourcecode: icu version File versions

RenderingFontInstance.h

/*
 *******************************************************************************
 *
 *   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

Generated by  Doxygen 1.6.0   Back to index