public ushort[] dbugGetExpandedGlyphs() { switch (_format) { default: throw new NotSupportedException(); case 1: return(orderedGlyphIdList); case 2: { List <ushort> list = new List <ushort>(); int j = ranges.Length; for (int i = 0; i < j; ++i) { RangeRecord range = ranges[i]; for (ushort n = range.start; n <= range.end; ++n) { list.Add(n); } } return(list.ToArray()); } } }
public static CoverageTable CreateFrom(BinaryReader reader, long beginAt) { reader.BaseStream.Seek(beginAt, SeekOrigin.Begin); //--------------------------------------------------- var coverageTable = new CoverageTable(); //CoverageFormat1 table: Individual glyph indices //Type Name Description //uint16 CoverageFormat Format identifier-format = 1 //uint16 GlyphCount Number of glyphs in the GlyphArray //uint16 GlyphArray[GlyphCount] Array of glyph IDs — in numerical order //--------------------------------- //CoverageFormat2 table: Range of glyphs //Type Name Description //uint16 CoverageFormat Format identifier-format = 2 //uint16 RangeCount Number of RangeRecords //struct RangeRecord[RangeCount] Array of glyph ranges — ordered by StartGlyphID. //------------ //RangeRecord //---------- //Type Name Description //uint16 StartGlyphID First glyph ID in the range //uint16 EndGlyphID Last glyph ID in the range //uint16 StartCoverageIndex Coverage Index of first glyph ID in range //---------- switch (coverageTable._format = reader.ReadUInt16()) { default: throw new NotSupportedException(); case 1: //CoverageFormat1 table: Individual glyph indices { ushort glyphCount = reader.ReadUInt16(); coverageTable.orderedGlyphIdList = Utils.ReadUInt16Array(reader, glyphCount); } break; case 2: //CoverageFormat2 table: Range of glyphs { ushort rangeCount = reader.ReadUInt16(); RangeRecord[] ranges = new RangeRecord[rangeCount]; for (int i = 0; i < rangeCount; ++i) { ranges[i] = new RangeRecord( reader.ReadUInt16(), reader.ReadUInt16(), reader.ReadUInt16()); } coverageTable.ranges = ranges; } break; } return(coverageTable); }
public int FindPosition(int glyphIndex) { switch (_format) { //should not occur here default: throw new NotSupportedException(); case 1: { //TODO: imple fast search here for (int i = orderedGlyphIdList.Length - 1; i >= 0; --i) { ushort gly = orderedGlyphIdList[i]; if (gly < glyphIndex) { //TODO: review here //we assume that the glyph list is ordered (lesser to greater) //since we seach backward,so if gly is lesser than glyphIndex return(-1); //not found } else if (gly == glyphIndex) { return(i); } } } break; case 2: { //return 'logical' coverage index int len = rangeOffsets.Length; int pos_s = 0; for (int i = 0; i < len; ++i) { RangeRecord range = ranges[i]; int pos = range.FindPosition(glyphIndex); if (pos > -1) { return(pos_s + pos); } if (range.start > glyphIndex) { //just stop return(-1); } pos_s += range.Width; } return(-1); } } return(-1);//not found }
public static CoverageTable CreateFrom(BinaryReader reader, long beginAt) { reader.BaseStream.Seek(beginAt, SeekOrigin.Begin); //--------------------------------------------------- var coverageTable = new CoverageTable(); //1. format switch (coverageTable._format = reader.ReadUInt16()) { default: throw new NotSupportedException(); case 1: { //CoverageFormat1 table: Individual glyph indices ushort glyphCount = reader.ReadUInt16(); //GlyphID GlyphArray[GlyphCount] Array of GlyphIDs-in numerical order *** ushort[] orderedGlyphIdList = new ushort[glyphCount]; for (int i = 0; i < glyphCount; ++i) { orderedGlyphIdList[i] = reader.ReadUInt16(); } coverageTable.orderedGlyphIdList = orderedGlyphIdList; } break; case 2: { //CoverageFormat2 table: Range of glyphs ushort rangeCount = reader.ReadUInt16(); RangeRecord[] ranges = new RangeRecord[rangeCount]; for (int i = 0; i < rangeCount; ++i) { ranges[i] = new RangeRecord( reader.ReadUInt16(), reader.ReadUInt16(), reader.ReadUInt16()); } coverageTable.ranges = ranges; coverageTable.UpdateRangeOffsets(); } break; } return(coverageTable); }
void UpdateRangeOffsets() { //for format 2 #if DEBUG if (this._format != 2) { throw new NotSupportedException(); } #endif int j = ranges.Length; int total = 0; rangeOffsets = new int[j]; for (int i = 0; i < j; ++i) { RangeRecord r = ranges[i]; rangeOffsets[i] = total; total += r.Width; } }
// either format public CoverageResults GetGlyphCoverage(ushort nGlyph) { CoverageResults cr; cr.bCovered = false; cr.CoverageIndex = 0; if (CoverageFormat == 1) { ushort count = F1GlyphCount; for (ushort i = 0; i < count; i++) { if (nGlyph == F1GetGlyphID(i)) { cr.bCovered = true; cr.CoverageIndex = i; break; } } } else if (CoverageFormat == 2) { ushort FirstIndexOfRange = 0; for (uint i = 0; i < F2RangeCount; i++) { RangeRecord rr = F2GetRangeRecord(i); if (nGlyph >= rr.Start && nGlyph <= rr.End) { cr.bCovered = true; cr.CoverageIndex = (ushort)(FirstIndexOfRange + nGlyph - rr.Start); break; } FirstIndexOfRange += (ushort)(rr.End - rr.Start + 1); } } else { Debug.Assert(false); } return(cr); }
public RangeRecord F2GetRangeRecord(uint i) { if (CoverageFormat != 2) { throw new System.InvalidOperationException(); } RangeRecord rr = null; if (i < F2RangeCount) { rr = new RangeRecord(); uint rrOffset = m_offsetCoverageTable + (uint)FieldOffsets2.RangeRecordArray + i * 6; rr.Start = m_bufTable.GetUshort(rrOffset); rr.End = m_bufTable.GetUshort(rrOffset + 2); rr.StartCoverageIndex = m_bufTable.GetUshort(rrOffset + 4); } return(rr); }
public static CoverageTable CreateFrom(BinaryReader reader, long beginAt) { reader.BaseStream.Seek(beginAt, SeekOrigin.Begin); //--------------------------------------------------- var coverageTable = new CoverageTable(); //1. format switch (coverageTable._format = reader.ReadUInt16()) { default: throw new NotSupportedException(); case 1: { //CoverageFormat1 table: Individual glyph indices ushort glyphCount = reader.ReadUInt16(); //GlyphID GlyphArray[GlyphCount] Array of GlyphIDs-in numerical order *** ushort[] orderedGlyphIdList = new ushort[glyphCount]; for (int i = 0; i < glyphCount; ++i) { orderedGlyphIdList[i] = reader.ReadUInt16(); } coverageTable.orderedGlyphIdList = orderedGlyphIdList; } break; case 2: { //CoverageFormat2 table: Range of glyphs ushort rangeCount = reader.ReadUInt16(); RangeRecord[] ranges = new RangeRecord[rangeCount]; for (int i = 0; i < rangeCount; ++i) { ranges[i] = new RangeRecord( reader.ReadUInt16(), reader.ReadUInt16(), reader.ReadUInt16()); } coverageTable.ranges = ranges; } break; } return coverageTable; }
public RangeRecord F2GetRangeRecord(uint i) { if (CoverageFormat != 2) { throw new System.InvalidOperationException(); } RangeRecord rr = null; if (i < F2RangeCount) { rr = new RangeRecord(); uint rrOffset = m_offsetCoverageTable + (uint)FieldOffsets2.RangeRecordArray + i*6; rr.Start = m_bufTable.GetUshort(rrOffset); rr.End = m_bufTable.GetUshort(rrOffset + 2); rr.StartCoverageIndex = m_bufTable.GetUshort(rrOffset + 4); } return rr; }