예제 #1
0
        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);
        }
예제 #2
0
            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);
            }
예제 #3
0
            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);
            }
예제 #4
0
        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);
            }
            }
        }
예제 #5
0
            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;
            }
예제 #6
0
        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;
        }