00001 #ifndef __FTCharToGlyphIndexMap__
00002 #define __FTCharToGlyphIndexMap__
00003
00004 #include <stdlib.h>
00005
00006 #include "FTGL.h"
00007
00027 class FTGL_EXPORT FTCharToGlyphIndexMap
00028 {
00029 public:
00030
00031 typedef unsigned long CharacterCode;
00032 typedef signed long GlyphIndex;
00033
00034 enum
00035 {
00036 NumberOfBuckets = 256,
00037 BucketSize = 256,
00038 IndexNotFound = -1
00039 };
00040
00041 FTCharToGlyphIndexMap()
00042 {
00043 this->Indices = 0;
00044 }
00045
00046 virtual ~FTCharToGlyphIndexMap()
00047 {
00048 if( this->Indices)
00049 {
00050
00051 this->clear();
00052
00053
00054 delete [] this->Indices;
00055 this->Indices = 0;
00056 }
00057 }
00058
00059 void clear()
00060 {
00061 if(this->Indices)
00062 {
00063 for( int i = 0; i < FTCharToGlyphIndexMap::NumberOfBuckets; i++)
00064 {
00065 if( this->Indices[i])
00066 {
00067 delete [] this->Indices[i];
00068 this->Indices[i] = 0;
00069 }
00070 }
00071 }
00072 }
00073
00074 const GlyphIndex* find( CharacterCode c)
00075 {
00076 if( !this->Indices)
00077 {
00078 return 0;
00079 }
00080
00081
00082 div_t pos = div( c, FTCharToGlyphIndexMap::BucketSize);
00083
00084 if( !this->Indices[pos.quot])
00085 {
00086 return 0;
00087 }
00088
00089 const FTCharToGlyphIndexMap::GlyphIndex *ptr = &this->Indices[pos.quot][pos.rem];
00090 if( *ptr == FTCharToGlyphIndexMap::IndexNotFound)
00091 {
00092 return 0;
00093 }
00094
00095 return ptr;
00096 }
00097
00098 void insert( CharacterCode c, GlyphIndex g)
00099 {
00100 if( !this->Indices)
00101 {
00102 this->Indices = new GlyphIndex* [FTCharToGlyphIndexMap::NumberOfBuckets];
00103 for( int i = 0; i < FTCharToGlyphIndexMap::NumberOfBuckets; i++)
00104 {
00105 this->Indices[i] = 0;
00106 }
00107 }
00108
00109
00110 div_t pos = div(c, FTCharToGlyphIndexMap::BucketSize);
00111
00112
00113 if( !this->Indices[pos.quot])
00114 {
00115 this->Indices[pos.quot] = new GlyphIndex [FTCharToGlyphIndexMap::BucketSize];
00116 for( int i = 0; i < FTCharToGlyphIndexMap::BucketSize; i++)
00117 {
00118 this->Indices[pos.quot][i] = FTCharToGlyphIndexMap::IndexNotFound;
00119 }
00120 }
00121
00122 this->Indices[pos.quot][pos.rem] = g;
00123 }
00124
00125 private:
00126 GlyphIndex** Indices;
00127 };
00128
00129
00130 #endif // __FTCharToGlyphIndexMap__