Пример #1
0
            public bool addGaspRange(GaspRange gaspRange)
            {
                bool bResult = true;

                // We need to sort these on nRangeMaxPPEM so we we go through each until we find the insertion point
                for (ushort i = 0; i < m_numRanges; i++)
                {
                    // This GaspRange is already there so we can't add it only set it
                    if (gaspRange.rangeMaxPPEM == ((GaspRange)m_GaspRange[i]).rangeMaxPPEM)
                    {
                        bResult = false;
                        break;
                    }
                    else if (gaspRange.rangeMaxPPEM > ((GaspRange)m_GaspRange[i]).rangeMaxPPEM)
                    {
                        // This could be the spot to insert we just need to make sure that
                        // the next one isn't equal
                        if (i == (m_numRanges - 1) || gaspRange.rangeMaxPPEM < ((GaspRange)m_GaspRange[i + 1]).rangeMaxPPEM)
                        {
                            // We found the insertion point
                            m_GaspRange.Insert(i + 1, gaspRange);
                            m_numRanges++;
                            m_bDirty = true;
                            break;
                        }
                        else
                        {
                            bResult = false;
                            break;
                        }
                    }
                }

                return(bResult);
            }
Пример #2
0
            public bool addGaspRange(ushort nRangeMaxPPEM, ushort nRangeGaspBehavior)
            {
                GaspRange gr = new GaspRange();

                gr.rangeMaxPPEM      = nRangeMaxPPEM;
                gr.rangeGaspBehavior = nRangeGaspBehavior;

                return(addGaspRange(gr));
            }
Пример #3
0
        public GaspRange GetGaspRange(uint i)
        {
            GaspRange gr = null;

            if (i < numRanges && (uint)FieldOffsets.gaspRange + (i + 1) * 4 <= m_bufTable.GetLength())
            {
                gr = new GaspRange();
                gr.rangeMaxPPEM      = m_bufTable.GetUshort((uint)FieldOffsets.gaspRange + i * 4);
                gr.rangeGaspBehavior = m_bufTable.GetUshort((uint)FieldOffsets.gaspRange + i * 4 + 2);
            }

            return(gr);
        }
Пример #4
0
            public GaspRange GetGaspRange(ushort nIndex)
            {
                GaspRange gr = null;

                if (nIndex < m_numRanges)
                {
                    gr = new GaspRange();
                    gr.rangeMaxPPEM      = ((GaspRange)m_GaspRange[nIndex]).rangeMaxPPEM;
                    gr.rangeGaspBehavior = ((GaspRange)m_GaspRange[nIndex]).rangeGaspBehavior;
                }

                return(gr);
            }
Пример #5
0
        public List <GaspRange> gaspRanges;     // Sorted by ppem

        public void Read(TTFReader r)
        {
            r.ReadInt(out this.version);
            r.ReadInt(out this.numRanges);

            this.gaspRanges = new List <GaspRange>();
            for (int i = 0; i < this.numRanges; ++i)
            {
                GaspRange gr = new GaspRange();
                gr.Read(r);
                this.gaspRanges.Add(gr);
            }
        }
Пример #6
0
        ushort GetFlagsForPPEM(ushort ppem)
        {
            ushort flags = 0;

            for (uint i = 0; i < numRanges; i++)
            {
                GaspRange gr = GetGaspRange(i);

                if (ppem <= gr.rangeMaxPPEM)
                {
                    flags = gr.rangeGaspBehavior;
                    break;
                }
            }

            return(flags);
        }
Пример #7
0
        public GaspRange GetGaspRange(uint i)
        {
            GaspRange gr = null;

            if (i < numRanges && (uint)FieldOffsets.gaspRange + (i+1)*4 <= m_bufTable.GetLength())
            {
                gr = new GaspRange();
                gr.rangeMaxPPEM      = m_bufTable.GetUshort((uint)FieldOffsets.gaspRange + i*4);
                gr.rangeGaspBehavior = m_bufTable.GetUshort((uint)FieldOffsets.gaspRange + i*4 + 2);
            }

            return gr;
        }
Пример #8
0
            public bool addGaspRange( GaspRange gaspRange )
            {
                bool bResult = true;

                // We need to sort these on nRangeMaxPPEM so we we go through each until we find the insertion point
                for( ushort i = 0; i < m_numRanges; i++ )
                {
                    // This GaspRange is already there so we can't add it only set it
                    if( gaspRange.rangeMaxPPEM == ((GaspRange)m_GaspRange[i]).rangeMaxPPEM )
                    {
                        bResult = false;
                        break;
                    }
                    else if( gaspRange.rangeMaxPPEM > ((GaspRange)m_GaspRange[i]).rangeMaxPPEM )
                    {
                        // This could be the spot to insert we just need to make sure that
                        // the next one isn't equal
                        if( i == (m_numRanges - 1) || gaspRange.rangeMaxPPEM < ((GaspRange)m_GaspRange[i + 1]).rangeMaxPPEM )
                        {
                            // We found the insertion point
                            m_GaspRange.Insert( i + 1, gaspRange );
                            m_numRanges++;
                            m_bDirty = true;
                            break;
                        }
                        else
                        {
                            bResult = false;
                            break;
                        }
                    }
                }        

                return bResult;
            }
Пример #9
0
            public bool addGaspRange( ushort nRangeMaxPPEM, ushort nRangeGaspBehavior )
            {
                
                GaspRange gr = new GaspRange();
                gr.rangeMaxPPEM = nRangeMaxPPEM;
                gr.rangeGaspBehavior = nRangeGaspBehavior;                

                return addGaspRange( gr );
            }
Пример #10
0
            public GaspRange GetGaspRange( ushort nIndex )
            {
                GaspRange gr = null;

                if( nIndex < m_numRanges )
                {
                    gr = new GaspRange();
                    gr.rangeMaxPPEM = ((GaspRange)m_GaspRange[nIndex]).rangeMaxPPEM;
                    gr.rangeGaspBehavior= ((GaspRange)m_GaspRange[nIndex]).rangeGaspBehavior;
                }

                return gr;                
            }
Пример #11
0
        /************************
         * public methods
         */


        public bool Validate(Validator v, OTFontVal fontOwner)
        {
            bool bRet = true;

            if (v.PerformTest(T.gasp_Version))
            {
                if (version == 0 || version == 1)
                {
                    v.Pass(T.gasp_Version, P.gasp_P_Version, m_tag, "version = " + version.ToString());
                }
                else
                {
                    v.Error(T.gasp_Version, E.gasp_E_Version, m_tag, "version = " + version.ToString() + ", unable to continue validation");
                    return(false);
                }
            }

            if (v.PerformTest(T.gasp_rangeGaspBehavior))
            {
                bool   bFlagsOk    = true;
                string first_error = null;
                for (uint i = 0; i < numRanges; i++)
                {
                    GaspRange gr = GetGaspRange(i);
                    if (gr != null)
                    {
                        if ((version == 0 && gr.rangeGaspBehavior > 0x3) ||
                            (version == 1 && gr.rangeGaspBehavior > 0xf))
                        {
                            bFlagsOk    = false;
                            first_error = "version=" + version + ", range #" + i + ", rangeGaspBehavior=0x"
                                          + gr.rangeGaspBehavior.ToString("X4");
                            break;
                        }
                    }
                }
                if (bFlagsOk)
                {
                    v.Pass(T.gasp_rangeGaspBehavior, P.gasp_P_rangeGaspBehavior, m_tag);
                }
                else
                {
                    v.Error(T.gasp_rangeGaspBehavior, E.gasp_E_rangeGaspBehavior, m_tag, first_error);
                    bRet = false;
                }
            }

            if (v.PerformTest(T.gasp_SortOrder))
            {
                bool bSortOk = true;
                if (numRanges > 1)
                {
                    GaspRange grCurr = GetGaspRange(0);
                    GaspRange grNext = null;
                    for (uint i = 1; i < numRanges; i++)
                    {
                        grNext = GetGaspRange(i);
                        if (grCurr.rangeMaxPPEM >= grNext.rangeMaxPPEM)
                        {
                            bSortOk = false;
                            break;
                        }
                        grCurr = grNext;
                    }
                }
                if (bSortOk)
                {
                    v.Pass(T.gasp_SortOrder, P.gasp_P_SortOrder, m_tag);
                }
                else
                {
                    v.Error(T.gasp_SortOrder, E.gasp_E_SortOrder, m_tag);
                    bRet = false;
                }
            }

            if (v.PerformTest(T.gasp_Sentinel))
            {
                GaspRange gr = GetGaspRange((uint)numRanges - 1);
                if (gr.rangeMaxPPEM == 0xFFFF)
                {
                    v.Pass(T.gasp_Sentinel, P.gasp_P_Sentinel, m_tag);
                }
                else
                {
                    v.Error(T.gasp_Sentinel, E.gasp_E_Sentinel, m_tag);
                    bRet = false;
                }
            }

            if (v.PerformTest(T.gasp_AdjRangeIdenticalFlags))
            {
                bool bNoAdjIdent = true;

                if (numRanges > 1)
                {
                    for (uint i = 0; i < numRanges - 1; i++)
                    {
                        GaspRange grCurr = GetGaspRange(i);
                        GaspRange grNext = GetGaspRange(i + 1);
                        if (grCurr.rangeGaspBehavior == grNext.rangeGaspBehavior)
                        {
                            string sDetails = "rangeGaspBehavior[" + i + "] = " + grCurr.rangeGaspBehavior + ", rangeGaspBehavior[" + (i + 1) + "] = " + grNext.rangeGaspBehavior;
                            v.Warning(T.gasp_AdjRangeIdenticalFlags, W.gasp_W_AdjRangeIdenticalFlags, m_tag, sDetails);
                            bNoAdjIdent = false;
                        }
                    }
                }

                if (bNoAdjIdent)
                {
                    v.Pass(T.gasp_AdjRangeIdenticalFlags, P.gasp_P_AdjRangeIdenticalFlags, m_tag);
                }
            }

            return(bRet);
        }