Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        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
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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;
            }
        }
Esempio n. 6
0
        // 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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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;
        }
Esempio n. 9
0
        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;
        }