Commit d2b9a63c7e8a0975cbe3c3a1898553ad4fdd0174

henry 2001-09-17T20:58:50

Initial revision

diff --git a/include/FTCharmap.h b/include/FTCharmap.h
new file mode 100644
index 0000000..0862101
--- /dev/null
+++ b/include/FTCharmap.h
@@ -0,0 +1,109 @@
+#ifndef		__FTCharmap__
+#define		__FTCharmap__
+
+#include <map>
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+
+//#include "FTGL.h"
+
+using namespace std;
+
+
+/**
+ * FTCharmap
+ *
+  *
+ */
+class FTCharmap
+{
+	public:
+		/**
+		 * Constructor
+		 */
+		FTCharmap( FT_Face ftFace);
+
+		/**
+		 * 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
+		 */
+		bool CharMap( FT_Encoding encoding);
+
+		/**
+		 * Sets the character map for the face.
+		 *
+		 * @param encoding		the Freetype encoding symbol. See above.
+		 * @return				<code>true</code> if charmap was valid
+		 *						and set correctly
+		 */
+		bool CharMap( FT_UShort platform, FT_UShort encoding);
+
+		/**
+		 *	Get the glyph index of the input character.
+		 *
+		 * @param index The character code of the requested glyph in the
+		 *				current encoding eg apple roman.
+		 * @return		The glyph index for the character.
+		 */
+		unsigned int CharIndex( unsigned int index );
+
+		/**
+		 * Queries for errors.
+		 *
+		 * @return	The current error code.
+		 */
+		FT_Error Error() const { return err;}
+		
+	protected:
+		/**
+		 * Current cahracter map code.
+		 */
+		FT_Encoding ftEncoding;
+		
+		FT_Face ftFace;
+		
+		typedef map< unsigned long, unsigned long> CharacterMap;
+		CharacterMap charMap;
+		
+		/**
+		 * Current error code. Zero means no error.
+		 */
+		FT_Error err;
+		
+	private:
+
+};
+
+
+#endif	//	__FTCharmap__
diff --git a/src/FTCharmap.cpp b/src/FTCharmap.cpp
new file mode 100644
index 0000000..b7bf6da
--- /dev/null
+++ b/src/FTCharmap.cpp
@@ -0,0 +1,92 @@
+#include	"FTCharmap.h"
+
+
+FTCharmap::FTCharmap( FT_Face face)
+:	err(0),
+	ftEncoding( ft_encoding_none),
+	ftFace( face)
+{
+//	charMap.reserve( 1000);
+}
+
+
+FTCharmap::~FTCharmap()
+{
+	charMap.clear();
+}
+
+
+bool FTCharmap::CharMap( FT_Encoding encoding)
+{
+	if( ftEncoding == encoding)
+	{
+		return true;
+	}
+	
+	err = FT_Select_Charmap( ftFace, encoding );
+	
+	if( !err)
+	{
+		ftEncoding = encoding;
+		charMap.clear();
+	}
+	
+	return !err;
+}
+
+
+bool FTCharmap::CharMap( FT_UShort platform, FT_UShort encoding)
+{
+	FT_CharMap  found = 0;
+	FT_CharMap  charmap;
+ 
+	for( int n = 0; n < ftFace->num_charmaps; n++ )
+	{
+		charmap = ftFace->charmaps[n];
+
+		if( charmap->platform_id == platform && charmap->encoding_id == encoding)
+		{
+			found = charmap;
+			break;
+		}
+	}
+ 
+	if( !found )
+	{
+		return false;
+	}
+ 
+	if( ftEncoding == found->encoding)
+	{
+		return true;
+	}
+	
+	/* now, select the charmap for the face object */
+	err = FT_Set_Charmap( ftFace, found );
+	
+	if( !err)
+	{
+		ftEncoding = found->encoding;
+		charMap.clear();
+	}
+	
+	return !err;
+}
+
+
+unsigned int FTCharmap::CharIndex( unsigned int index )
+{
+	CharacterMap::const_iterator result = charMap.find( index);
+		
+	if( result == charMap.end())
+	{
+		unsigned int glyph = FT_Get_Char_Index( ftFace, index);
+		charMap.insert( CharacterMap::value_type( index, glyph));
+		return glyph;
+	}
+	else
+	{
+		return result->second;
+	}
+
+}