コード例 #1
0
ファイル: Table_name.cs プロジェクト: sjvudp/Font-Validator
            public override OTTable GenerateTable()
            {
                ArrayList bytesNameString       = new ArrayList();
                ushort    nLengthOfStrings      = 0;
                ushort    nStartOfStringStorage = (ushort)(6 + (m_nameRecords.Count * 12));

                for (ushort i = 0; i < m_nameRecords.Count; i++)
                {
                    NameRecordCache nrc        = (NameRecordCache)m_nameRecords[i];
                    byte[]          byteString = EncodeString(nrc.sNameString, nrc.platformID, nrc.encodingID);
                    bytesNameString.Add(byteString);
                    nLengthOfStrings += (ushort)byteString.Length;
                }

                // create a Motorola Byte Order buffer for the new table
                MBOBuffer newbuf = new MBOBuffer((uint)(Table_name.FieldOffsets.NameRecords + (m_nameRecords.Count * 12) + nLengthOfStrings));

                // populate the buffer
                newbuf.SetUshort(m_format, (uint)Table_name.FieldOffsets.FormatSelector);
                newbuf.SetUshort((ushort)m_nameRecords.Count, (uint)Table_name.FieldOffsets.NumberNameRecords);
                newbuf.SetUshort(nStartOfStringStorage, (uint)Table_name.FieldOffsets.OffsetToStrings);

                ushort nOffset = 0;

                // Write the NameRecords and Strings
                for (ushort i = 0; i < m_nameRecords.Count; i++)
                {
                    byte[] bString = (byte[])bytesNameString[i];

                    newbuf.SetUshort(((NameRecordCache)m_nameRecords[i]).platformID, (uint)(Table_name.FieldOffsets.NameRecords + (i * 12)));
                    newbuf.SetUshort(((NameRecordCache)m_nameRecords[i]).encodingID, (uint)(Table_name.FieldOffsets.NameRecords + (i * 12) + 2));
                    newbuf.SetUshort(((NameRecordCache)m_nameRecords[i]).languageID, (uint)(Table_name.FieldOffsets.NameRecords + (i * 12) + 4));
                    newbuf.SetUshort(((NameRecordCache)m_nameRecords[i]).nameID, (uint)(Table_name.FieldOffsets.NameRecords + (i * 12) + 6));
                    newbuf.SetUshort((ushort)bString.Length, (uint)(Table_name.FieldOffsets.NameRecords + (i * 12) + 8));
                    newbuf.SetUshort(nOffset, (uint)(Table_name.FieldOffsets.NameRecords + (i * 12) + 10));

                    //Write the string to the buffer
                    for (int ii = 0; ii < bString.Length; ii++)
                    {
                        newbuf.SetByte(bString[ii], (uint)(nStartOfStringStorage + nOffset + ii));
                    }

                    nOffset += (ushort)bString.Length;
                }

                // put the buffer into a Table_name object and return it
                Table_name nameTable = new Table_name("name", newbuf);

                return(nameTable);
            }
コード例 #2
0
ファイル: Table_name.cs プロジェクト: sjvudp/Font-Validator
            public NameRecordCache getNameRecord(ushort nIndex)
            {
                NameRecordCache nrc = null;

                if (nIndex >= m_nameRecords.Count)
                {
                    throw new ArgumentOutOfRangeException("nIndex is greater than the amount of name records.");
                }
                else
                {
                    nrc = (NameRecordCache)((NameRecordCache)m_nameRecords[nIndex]).Clone();
                }

                return(nrc);
            }
コード例 #3
0
ファイル: Table_name.cs プロジェクト: sjvudp/Font-Validator
            protected int GetInsertionPosition(ushort platformID, ushort encodingID, ushort languageID, ushort nameID)
            {
                int nIndex = 0;

                if (GetNameRecordIndex(platformID, encodingID, languageID, nameID) != -1)
                {
                    // can't insert because the specified IDs are already in the list
                    nIndex = -1;
                }
                else
                {
                    if (m_nameRecords.Count != 0)
                    {
                        // check for insertion before the first string
                        NameRecordCache nrcTemp  = (NameRecordCache)m_nameRecords[0];
                        int             nCompare = nrcTemp.CompareNameRecordToIDs(platformID, encodingID, languageID, nameID);

                        if (nCompare == 1)
                        {
                            nIndex = 0;
                        }
                        else
                        {
                            // check for insertion between two other strings
                            for (int i = 0; i < m_nameRecords.Count - 1; i++)
                            {
                                NameRecordCache nrcCurr = (NameRecordCache)m_nameRecords[i];
                                NameRecordCache nrcNext = (NameRecordCache)m_nameRecords[i + 1];
                                // check if specified IDs are greater than the current object and less than the next object
                                int nCmp1 = nrcCurr.CompareNameRecordToIDs(platformID, encodingID, languageID, nameID);
                                int nCmp2 = nrcNext.CompareNameRecordToIDs(platformID, encodingID, languageID, nameID);
                                if (nCmp1 == -1 && nCmp2 == 1)
                                {
                                    nIndex = i + 1;
                                    break;
                                }
                            }
                            // if not found yet then insertion position is at end of list
                            if (nIndex == 0)
                            {
                                nIndex = m_nameRecords.Count;
                            }
                        }
                    }
                }

                return(nIndex);
            }
コード例 #4
0
ファイル: Table_name.cs プロジェクト: sjvudp/Font-Validator
            protected bool setNameRecord(ushort nIndex, ushort platformID, ushort encodingID, ushort languageID, ushort nameID, string sNameString)
            {
                bool bResult = true;

                if (nIndex >= m_nameRecords.Count)
                {
                    bResult = false;
                    throw new ArgumentOutOfRangeException("nIndex is greater than the amount of name records.");
                }
                else
                {
                    m_nameRecords[nIndex] = new NameRecordCache(platformID, encodingID, languageID, nameID, sNameString);
                    m_bDirty = true;
                }

                return(bResult);
            }
コード例 #5
0
ファイル: Table_name.cs プロジェクト: sjvudp/Font-Validator
            public int GetNameRecordIndex(ushort platformID, ushort encodingID, ushort languageID, ushort nameID)
            {
                int nIndex = -1; // return -1 if not found

                for (int i = 0; i < m_nameRecords.Count; i++)
                {
                    NameRecordCache nrcTemp = (NameRecordCache)m_nameRecords[i];
                    if (nrcTemp.platformID == platformID &&
                        nrcTemp.encodingID == encodingID &&
                        nrcTemp.languageID == languageID &&
                        nrcTemp.nameID == nameID)
                    {
                        nIndex = i;
                        break;
                    }
                }

                return(nIndex);
            }
コード例 #6
0
ファイル: Table_name.cs プロジェクト: sjvudp/Font-Validator
            public NameRecordCache getNameRecord(ushort platformID, ushort encodingID, ushort languageID, ushort nameID)
            {
                NameRecordCache nrc = null;

                for (int i = 0; i < m_nameRecords.Count; i++)
                {
                    NameRecordCache nrcTemp = (NameRecordCache)m_nameRecords[i];
                    if (nrcTemp.platformID == platformID &&
                        nrcTemp.encodingID == encodingID &&
                        nrcTemp.languageID == languageID &&
                        nrcTemp.nameID == nameID)
                    {
                        nrc = (NameRecordCache)nrcTemp.Clone();
                        break;
                    }
                }

                return(nrc);
            }
コード例 #7
0
            protected bool setNameRecord( ushort nIndex, ushort platformID, ushort encodingID, ushort languageID, ushort nameID, string sNameString )
            {
                bool bResult = true;

                if( nIndex >= m_nameRecords.Count )
                {
                    bResult = false;
                    throw new ArgumentOutOfRangeException( "nIndex is greater than the amount of name records." );
                }
                else
                {
                    m_nameRecords[nIndex] = new NameRecordCache( platformID, encodingID, languageID, nameID, sNameString );
                    m_bDirty = true;
                }

                return bResult;
            }