public void AddChar( ushort platID, 
                                 ushort encID, 
                                 BigUn charcode, 
                                 ushort glyphID )
            {
                CachedSubtable st = m_arrSubtables.GetSubtable(platID, encID);
                if (st != null)
                {
                    if ((uint)charcode >= (uint)st.m_CharToGlyphMap.Length)
                    {
                        uint[] newmap = new uint[(uint)charcode+1];
                        System.Buffer.BlockCopy( st.m_CharToGlyphMap, 0, 
                                                 newmap, 0, 
                                                 st.m_CharToGlyphMap.Length*4);
                        st.m_CharToGlyphMap = newmap;
                    }

                    st.m_CharToGlyphMap[(uint)charcode] = glyphID;
                }
                else
                {
                    throw new ApplicationException("subtable not found");
                }

                m_bDirty = true;
            }
            public void RemoveChar(ushort platID, ushort encID, BigUn charcode)
            {
                CachedSubtable st = m_arrSubtables.GetSubtable(platID, encID);
                if (st != null)
                {
                    st.m_CharToGlyphMap[(uint)charcode] = 0;
                }
                else
                {
                    throw new ApplicationException("subtable not found");
                }

                m_bDirty = true;
            }
            // accessors for the cached data

            public ushort MapCharToGlyph( ushort platID,
                                          ushort encID, 
                                          BigUn charcode )
            {
                ushort glyphID = 0xffff;

                CachedSubtable st = m_arrSubtables.GetSubtable(platID, encID);
                if (st != null)
                {
                    glyphID = (ushort)st.m_CharToGlyphMap[(uint)charcode];
                }
                else
                {
                    throw new ApplicationException("subtable not found");
                }

                return glyphID;
            }