public static ClassDefTable CreateFrom(BinaryReader reader, long beginAt) { reader.BaseStream.Seek(beginAt, SeekOrigin.Begin); //--------- ClassDefTable classDefTable = new ClassDefTable(); switch (classDefTable.Format = reader.ReadUInt16()) { default: throw new NotSupportedException(); case 1: { classDefTable.startGlyph = reader.ReadUInt16(); ushort glyphCount = reader.ReadUInt16(); classDefTable.classValueArray = Utils.ReadUInt16Array(reader, glyphCount); } break; case 2: { ushort classRangeCount = reader.ReadUInt16(); ClassRangeRecord[] records = new ClassRangeRecord[classRangeCount]; for (int i = 0; i < classRangeCount; ++i) { records[i] = new ClassRangeRecord( reader.ReadUInt16(), //start glyph id reader.ReadUInt16(), //end glyph id reader.ReadUInt16()); //classNo } classDefTable.records = records; } break; } return(classDefTable); }
public ClassRangeRecord GetClassRangeRecord(uint i) { ClassRangeRecord crr = null; if (i < ClassRangeCount) { crr = new ClassRangeRecord(); uint crrOffset = m_offsetClassDefFormat2 + (uint)FieldOffsets.ClassRangeRecordArray + i * 6; crr.Start = m_bufTable.GetUshort(crrOffset); crr.End = m_bufTable.GetUshort(crrOffset + 2); crr.Class = m_bufTable.GetUshort(crrOffset + 4); } return(crr); }
public bool Validate(Validator v, string sIdentity, OTTable table) { bool bRet = true; // check that ClassRangeRecord array doesn't extend past end of table if (m_offsetClassDefFormat2 + (uint)FieldOffsets.ClassRangeRecordArray + ClassRangeCount * 6 > m_bufTable.GetLength()) { v.Error(T.T_NULL, E._OTL_ClassDefinitionTable_E_RangeRecordArrayPastEOT, table.m_tag, sIdentity); bRet = false; } // check that ClassRangeRecord array is in sorted order if (ClassRangeCount > 1) { for (uint i = 0; i < ClassRangeCount - 1; i++) { ClassRangeRecord ThisCrr = GetClassRangeRecord(i); ClassRangeRecord NextCrr = GetClassRangeRecord(i + 1); if (ThisCrr.Start >= NextCrr.Start) { v.Error(T.T_NULL, E._OTL_ClassDefinitionTable_E_RangeRecordArray_order, table.m_tag, sIdentity); bRet = false; // temporary debug code /* * v.DebugMsg("ClassRangeCount = " + ClassRangeCount, tag); * for (uint j=0; j<ClassRangeCount; j++) * { * ClassRangeRecord crr = GetClassRangeRecord(j); * v.DebugMsg("ClassRangeRecord[" + j + "].Start = " + crr.Start, tag); * } */ break; } } } return(bRet); }
public int GetClassValue(ushort glyphIndex) { switch (Format) { default: throw new NotSupportedException(); case 1: { if (glyphIndex >= startGlyph && glyphIndex < classValueArray.Length) { return(classValueArray[glyphIndex - startGlyph]); } return(-1); } case 2: { for (int i = 0; i < records.Length; ++i) { //TODO: review a proper method here again //esp. binary search ClassRangeRecord rec = records[i]; if (rec.startGlyphId <= glyphIndex) { if (glyphIndex <= rec.endGlyphId) { return(rec.classNo); } } else { return(-1); //no need to go further } } return(-1); } } }
public ClassRangeRecord GetClassRangeRecord(uint i) { ClassRangeRecord crr = null; if (i < ClassRangeCount) { crr = new ClassRangeRecord(); uint crrOffset = m_offsetClassDefFormat2 + (uint)FieldOffsets.ClassRangeRecordArray + i*6; crr.Start = m_bufTable.GetUshort(crrOffset); crr.End = m_bufTable.GetUshort(crrOffset + 2); crr.Class = m_bufTable.GetUshort(crrOffset + 4); } return crr; }
public static ClassDefTable CreateFrom(BinaryReader reader, long beginAt) { reader.BaseStream.Seek(beginAt, SeekOrigin.Begin); //--------- ClassDefTable classDefTable = new ClassDefTable(); switch (classDefTable.Format = reader.ReadUInt16()) { default: throw new NotSupportedException(); case 1: { classDefTable.startGlyph = reader.ReadUInt16(); ushort glyphCount = reader.ReadUInt16(); classDefTable.classValueArray = Utils.ReadUInt16Array(reader, glyphCount); } break; case 2: { ushort classRangeCount = reader.ReadUInt16(); ClassRangeRecord[] records = new ClassRangeRecord[classRangeCount]; for (int i = 0; i < classRangeCount; ++i) { records[i] = new ClassRangeRecord( reader.ReadUInt16(), //start glyph id reader.ReadUInt16(), //end glyph id reader.ReadUInt16()); //classNo } classDefTable.records = records; } break; } return classDefTable; }