#ifndef     __FTCharmap__
#define     __FTCharmap__


#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H

#include "FTCharToGlyphIndexMap.h"

#include "FTGL.h"


/**
 * FTCharmap takes care of specifying the encoding for a font and mapping
 * character codes to glyph indices.
 *
 * It doesn't preprocess all indices, only on an as needed basis. This may
 * seem like a performance penalty but it is quicker than using the 'raw'
 * freetype calls and will save significant amounts of memory when dealing
 * with unicode encoding
 *
 * @see "Freetype 2 Documentation" 
 *
 */

class FTFace;

class FTGL_EXPORT FTCharmap
{
    public:
        /**
         * Constructor
         */
        FTCharmap( FTFace* face);

        /**
         * Destructor
         */
        virtual ~FTCharmap();

        /**
         * Queries for the current character map code.
         *
         * @return  The current character map code.
         */
        FT_Encoding Encoding() const { return ftEncoding;}
        
        /**
         * Sets the character map for the face.
         * Valid encodings as at Freetype 2.0.4
         *      ft_encoding_none
         *      ft_encoding_symbol
         *      ft_encoding_unicode
         *      ft_encoding_latin_2
         *      ft_encoding_sjis
         *      ft_encoding_gb2312
         *      ft_encoding_big5
         *      ft_encoding_wansung
         *      ft_encoding_johab
         *      ft_encoding_adobe_standard
         *      ft_encoding_adobe_expert
         *      ft_encoding_adobe_custom
         *      ft_encoding_apple_roman
         *
         * @param encoding  the Freetype encoding symbol. See above.
         * @return          <code>true</code> if charmap was valid and set
         *                  correctly. If the requested encoding is
         *                  unavailable it will be set to ft_encoding_none.
         */
        bool CharMap( FT_Encoding encoding);
        
        /**
         * get the FTGlyphContainer index of the input character.
         *
         * @param characterCode The character code of the requested glyph in
         *                      the current encoding eg apple roman.
         * @return      The FTGlyphContainer index for the character or zero
         *              if it wasn't found
         */
        unsigned int GlyphListIndex( const unsigned int characterCode);

        /**
         * get the font glyph index of the input character.
         *
         * @param characterCode The character code of the requested glyph in
         *                      the current encoding eg apple roman.
         * @return      The glyph index for the character.
         */
        unsigned int FontIndex( const unsigned int characterCode);

        /**
         * set the FTGlyphContainer index of the character code.
         *
         * @param characterCode  The character code of the requested glyph in
         *                       the current encoding eg apple roman.
         * @param containerIndex The index into the FTGlyphContainer of the
         *                       character code.
         */
        void InsertIndex( const unsigned int characterCode, const unsigned int containerIndex);

        /**
         * Queries for errors.
         *
         * @return  The current error code. zero means no error.
         */
        FT_Error Error() const { return err;}
        
    private:
        /**
         * Current character map code.
         */
        FT_Encoding ftEncoding;
        
        /**
         * The current Freetype face.
         */
        const FT_Face ftFace;
        
        /**
         * A structure that maps glyph indices to character codes
         *
         * < character code, face glyph index>
         */
        typedef FTCharToGlyphIndexMap CharacterMap;
        CharacterMap charMap;
        
        /**
         * Current error code.
         */
        FT_Error err;
        
};


#endif  //  __FTCharmap__
