Ejemplo n.º 1
0
            public DICTData( byte[] data, INDEXData String, bool isPrivate )
            {
                uint cursor = 0;
                Stack operandStack = new Stack();
                m_String = String;
                ROS = null;

                while( cursor < data.Length )
                {
                    uint advance = 1;
                    if ( data[cursor] >= 32 && data[cursor] <= 246 )
                    {
                        operandStack.Push( (data[cursor]-139) );
                    }
                    else if ( data[cursor] >= 247 && data[cursor] <= 250 )
                    {
                        operandStack.Push( ((data[cursor]-247)*256+data[cursor+1]+108) );
                        advance = 2;
                    }
                    else if ( data[cursor] >= 251 && data[cursor] <= 254 )
                    {
                        operandStack.Push( (-(data[cursor]-251)*256-data[cursor+1]-108) );
                        advance = 2;
                    }
                    else if ( data[cursor] == 28 )
                    {
                        operandStack.Push( (data[cursor+1]<<8|data[cursor+2]) );
                        advance = 3;
                    }
                    else if ( data[cursor] == 29 )
                    {
                        operandStack.Push( (data[cursor+1]<<24|data[cursor+2]<<16|data[cursor+3]<<8|data[cursor+4]) );
                        advance = 5;
                    }
                    else if ( data[cursor] == 30 )
                    {
                        string realstr = "";
                        while ( (data[cursor+advance] & 0x0f) != 0x0f )
                        {
                            int[] x = { data[cursor+advance] >> 4, data[cursor+advance] & 0x0f };
                            for (int i = 0; i < 2 ; i++)
                            {
                                switch(x[i])
                                {
                                    case 10:
                                        realstr += ".";
                                        break;
                                    case 11:
                                        realstr += "E";
                                        break;
                                    case 12:
                                        realstr += "E-";
                                        break;
                                    case 14:
                                        realstr += "-";
                                        break;
                                    case 15:
                                        /* do nothing */
                                        break;
                                    case 13:
                                        throw new ArgumentOutOfRangeException("Invalid Nibble encountered at pos "
                                                                              + cursor );
                                        break;
                                    default:
                                        /* 0 - 9, hopefully! */
                                        realstr += x[i].ToString("d1");
                                        break;
                                }
                            }
                            advance ++;
                        }
                        /* the last half byte */
                        int y = data[cursor+advance] >> 4 ;
                        switch(y)
                        {
                            case 10:
                                realstr += ".";
                                break;
                            case 11:
                                realstr += "E";
                                break;
                            case 12:
                                realstr += "E-";
                                break;
                            case 14:
                                realstr += "-";
                                break;
                            case 15:
                                /* do nothing */
                                break;
                            case 13:
                                throw new ArgumentOutOfRangeException("Invalid Nibble encountered at pos "
                                                                      + cursor );
                                break;
                            default:
                                /* 0 - 9, hopefully! */
                                realstr += y.ToString("d1");
                                break;
                        }
                        operandStack.Push(realstr);
                        advance ++;
                    }
                    else if ( !isPrivate && data[cursor] >= 0 && data[cursor] <= 21 )
                    {
                        string op = "";
                        switch(data[cursor])
                        {
                            case 0x00:
                                int sidversion = (int) operandStack.Pop();
                                op = "version";
                                break;
                            case 0x01:
                                int sidNotice = (int) operandStack.Pop();
                                op = "Notice";
                                break;
                            case 0x02:
                                sidFullName = (int) operandStack.Pop();
                                op = "FullName";
                                break;
                            case 0x03:
                                int sidFamilyName = (int) operandStack.Pop();
                                op = "FamilyName";
                                break;
                            case 0x04:
                                int sidWeight = (int) operandStack.Pop();
                                op = "Weight";
                                break;
                            case 0x05:
                                operandStack.Pop();
                                operandStack.Pop();
                                operandStack.Pop();
                                operandStack.Pop();
                                op = "FontBBox";
                                break;
                            case 0x0d:
                                operandStack.Pop();
                                op = "UniqueID";
                                break;
                            case 0x0e:
                                operandStack.Clear();
                                op = "XUID";
                                break;
                            case 0x0f:
                                offsetCharset = (int) operandStack.Pop();
                                op = "charset";
                                break;
                            case 0x10:
                                offsetEncoding = (int) operandStack.Pop();
                                op = "Encoding";
                                break;
                            case 0x11:
                                offsetCharStrings = (int) operandStack.Pop();
                                op = "CharStrings";
                                break;
                            case 0x12:
                                offsetPrivate = (int) operandStack.Pop();
                                sizePrivate   = (int) operandStack.Pop();
                                op = "Private";
                                break;
                            case 0x0c:
                                switch(data[cursor+1])
                                {
                                    case 0x00:
                                        int sidCopyright = (int) operandStack.Pop();
                                        op = "Copyright";
                                        break;
                                    case 0x01:
                                        operandStack.Pop();
                                        op = "isFixedPitch";
                                        break;
                                    case 0x02:
                                        operandStack.Pop();
                                        op = "ItalicAngle";
                                        break;
                                    case 0x03:
                                        operandStack.Pop();
                                        op = "UnderlinePosition";
                                        break;
                                    case 0x04:
                                        operandStack.Pop();
                                        op = "UnderlineThickness";
                                        break;
                                    case 0x05:
                                        operandStack.Pop();
                                        op = "PaintType";
                                        break;
                                    case 0x06:
                                        int CharstringType = (int) operandStack.Pop();
                                        if ( CharstringType != 2 )
                                            throw new ArgumentOutOfRangeException("Invalid CharstringType:" + CharstringType );
                                        op = "CharstringType";
                                        break;
                                    case 0x07:
                                        operandStack.Clear();
                                        op = "FontMatrix";
                                        break;
                                    case 0x08:
                                        operandStack.Pop();
                                        op = "StrokeWidth";
                                        break;
                                    case 0x14:
                                        operandStack.Pop();
                                        op = "SyntheticBase";
                                        break;
                                    case 0x15:
                                        operandStack.Pop();
                                        op = "PostScript";
                                        break;
                                    case 0x16:
                                        operandStack.Pop();
                                        op = "BaseFontName";
                                        break;
                                    case 0x17:
                                        operandStack.Clear();
                                        op = "BaseFontBlend";
                                        break;
                                    case 0x1e:
                                        op = "ROS";
                                        int supplement  = (int) operandStack.Pop();
                                        int sidOrdering = (int) operandStack.Pop();
                                        int sidRegistry = (int) operandStack.Pop();
                                        ROS = m_String.StringForID(sidRegistry) + " " + m_String.StringForID(sidOrdering) + " " + supplement;
                                        break;
                                    case 0x1f:
                                        object oCIDFontVersion = operandStack.Pop();
                                        op = "CIDFontVersion";
                                        break;
                                    case 0x20:
                                        operandStack.Pop();
                                        op = "CIDFontRevision";
                                        break;
                                    case 0x21:
                                        operandStack.Pop();
                                        op = "CIDFontType";
                                        break;
                                    case 0x22:
                                        operandStack.Pop();
                                        op = "CIDCount";
                                        break;
                                    case 0x23:
                                        operandStack.Pop();
                                        op = "UIDBase";
                                        break;
                                    case 0x24:
                                        offsetFDArray  = (int) operandStack.Pop();
                                        op = "FDArray";
                                        break;
                                    case 0x25:
                                        offsetFDSelect = (int) operandStack.Pop();
                                        op = "FDSelect";
                                        break;
                                    case 0x26:
                                        sidFontName = (int) operandStack.Pop();
                                        op = "FontName";
                                        break;
                                    default:
                                        operandStack.Clear();
                                        op = "<2-byte>+0x" + data[cursor+1].ToString("x2");
                                        throw new ArgumentOutOfRangeException("Invalid <2-byte> op:"
                                                                              + data[cursor+1].ToString("x2") + " at pos " + cursor );
                                }
                                advance = 2;
                                break;

                            default:
                                operandStack.Clear();
                                op = "0x" + data[cursor].ToString("x2");
                                throw new ArgumentOutOfRangeException("Invalid op:"
                                                                      + data[cursor].ToString("x2") + " at pos " + cursor );
                        }
                    }
                    else if ( isPrivate && data[cursor] >= 0 && data[cursor] <= 21 )
                    {
                        string op = "";
                        switch(data[cursor])
                        {
                            case 0x06:
                                operandStack.Clear();
                                op = "BlueValues";
                                break;
                            case 0x07:
                                operandStack.Clear();
                                op = "OtherBlues";
                                break;
                            case 0x08:
                                operandStack.Clear();
                                op = "FamilyBlues";
                                break;
                            case 0x09:
                                operandStack.Clear();
                                op = "FamilyOtherBlues";
                                break;
                            case 0x0a:
                                operandStack.Pop();
                                op = "StdHW";
                                break;
                            case 0x0b:
                                operandStack.Pop();
                                op = "StdVW";
                                break;
                            case 0x13:
                                Subrs = (int) operandStack.Pop();
                                op = "Subrs";
                                break;
                            case 0x14:
                                operandStack.Pop();
                                op = "defaultWidthX";
                                break;
                            case 0x15:
                                operandStack.Pop();
                                op = "nominalWidthX";
                                break;
                            case 0x0c:
                                switch(data[cursor+1])
                                {
                                    case 0x09:
                                        operandStack.Pop();
                                        op = "BlueScale";
                                        break;
                                    case 0x0a:
                                        operandStack.Pop();
                                        op = "BlueShift";
                                        break;
                                    case 0x0b:
                                        operandStack.Pop();
                                        op = "BlueFuzz";
                                        break;
                                    case 0x0c:
                                        operandStack.Clear();
                                        op = "StemSnapH";
                                        break;
                                    case 0x0d:
                                        operandStack.Clear();
                                        op = "StemSnapV";
                                        break;
                                    case 0x0e:
                                        operandStack.Pop();
                                        op = "ForceBold";
                                        break;
                                    case 0x11:
                                        operandStack.Pop();
                                        op = "LanguageGroup";
                                        break;
                                    case 0x12:
                                        operandStack.Pop();
                                        op = "ExpansionFactor";
                                        break;
                                    case 0x13:
                                        operandStack.Pop();
                                        op = "initialRandomSeed";
                                        break;
                                    default:
                                        operandStack.Clear();
                                        op = "<2-byte>+0x" + data[cursor+1].ToString("x2");
                                        throw new ArgumentOutOfRangeException("Invalid <2-byte> op:"
                                                                              + data[cursor+1].ToString("x2") + " at pos " + cursor );
                                }
                                advance = 2;
                                break;
                            default:
                                operandStack.Clear();
                                op = "0x" + data[cursor].ToString("x2");
                                throw new ArgumentOutOfRangeException("Invalid op:"
                                                                      + data[cursor].ToString("x2") + " at pos " + cursor );
                        }
                    }
                    else
                    {
                        throw new ArgumentOutOfRangeException("Reserved Byte encountered:"
                                                              + data[cursor].ToString("x2") + " at pos " + cursor );
                    }
                    cursor += advance;
                }
                if (cursor != data.Length)
                    throw new ArgumentOutOfRangeException( "operand stack ends unexpectedly, cursor not equal to data length:"
                                                           + cursor + "!=" + data.Length );
                if (operandStack.Count != 0)
                    throw new ArgumentOutOfRangeException( "operand stack not empty:"
                                                           + operandStack.Count );
            }
Ejemplo n.º 2
0
            public DICTData(byte[] data, INDEXData String, bool isPrivate)
            {
                uint  cursor       = 0;
                Stack operandStack = new Stack();

                m_String = String;
                ROS      = null;

                while (cursor < data.Length)
                {
                    uint advance = 1;
                    if (data[cursor] >= 32 && data[cursor] <= 246)
                    {
                        operandStack.Push((data[cursor] - 139));
                    }
                    else if (data[cursor] >= 247 && data[cursor] <= 250)
                    {
                        operandStack.Push(((data[cursor] - 247) * 256 + data[cursor + 1] + 108));
                        advance = 2;
                    }
                    else if (data[cursor] >= 251 && data[cursor] <= 254)
                    {
                        operandStack.Push((-(data[cursor] - 251) * 256 - data[cursor + 1] - 108));
                        advance = 2;
                    }
                    else if (data[cursor] == 28)
                    {
                        operandStack.Push((data[cursor + 1] << 8 | data[cursor + 2]));
                        advance = 3;
                    }
                    else if (data[cursor] == 29)
                    {
                        operandStack.Push((data[cursor + 1] << 24 | data[cursor + 2] << 16 | data[cursor + 3] << 8 | data[cursor + 4]));
                        advance = 5;
                    }
                    else if (data[cursor] == 30)
                    {
                        string realstr = "";
                        while ((data[cursor + advance] & 0x0f) != 0x0f)
                        {
                            int[] x = { data[cursor + advance] >> 4, data[cursor + advance] & 0x0f };
                            for (int i = 0; i < 2; i++)
                            {
                                switch (x[i])
                                {
                                case 10:
                                    realstr += ".";
                                    break;

                                case 11:
                                    realstr += "E";
                                    break;

                                case 12:
                                    realstr += "E-";
                                    break;

                                case 14:
                                    realstr += "-";
                                    break;

                                case 15:
                                    /* do nothing */
                                    break;

                                case 13:
                                    throw new ArgumentOutOfRangeException("Invalid Nibble encountered at pos "
                                                                          + cursor);
                                    break;

                                default:
                                    /* 0 - 9, hopefully! */
                                    realstr += x[i].ToString("d1");
                                    break;
                                }
                            }
                            advance++;
                        }
                        /* the last half byte */
                        int y = data[cursor + advance] >> 4;
                        switch (y)
                        {
                        case 10:
                            realstr += ".";
                            break;

                        case 11:
                            realstr += "E";
                            break;

                        case 12:
                            realstr += "E-";
                            break;

                        case 14:
                            realstr += "-";
                            break;

                        case 15:
                            /* do nothing */
                            break;

                        case 13:
                            throw new ArgumentOutOfRangeException("Invalid Nibble encountered at pos "
                                                                  + cursor);
                            break;

                        default:
                            /* 0 - 9, hopefully! */
                            realstr += y.ToString("d1");
                            break;
                        }
                        operandStack.Push(realstr);
                        advance++;
                    }
                    else if (!isPrivate && data[cursor] >= 0 && data[cursor] <= 21)
                    {
                        string op = "";
                        switch (data[cursor])
                        {
                        case 0x00:
                            int sidversion = (int)operandStack.Pop();
                            op = "version";
                            break;

                        case 0x01:
                            int sidNotice = (int)operandStack.Pop();
                            op = "Notice";
                            break;

                        case 0x02:
                            sidFullName = (int)operandStack.Pop();
                            op          = "FullName";
                            break;

                        case 0x03:
                            int sidFamilyName = (int)operandStack.Pop();
                            op = "FamilyName";
                            break;

                        case 0x04:
                            int sidWeight = (int)operandStack.Pop();
                            op = "Weight";
                            break;

                        case 0x05:
                            operandStack.Pop();
                            operandStack.Pop();
                            operandStack.Pop();
                            operandStack.Pop();
                            op = "FontBBox";
                            break;

                        case 0x0d:
                            operandStack.Pop();
                            op = "UniqueID";
                            break;

                        case 0x0e:
                            operandStack.Clear();
                            op = "XUID";
                            break;

                        case 0x0f:
                            offsetCharset = (int)operandStack.Pop();
                            op            = "charset";
                            break;

                        case 0x10:
                            offsetEncoding = (int)operandStack.Pop();
                            op             = "Encoding";
                            break;

                        case 0x11:
                            offsetCharStrings = (int)operandStack.Pop();
                            op = "CharStrings";
                            break;

                        case 0x12:
                            offsetPrivate = (int)operandStack.Pop();
                            sizePrivate   = (int)operandStack.Pop();
                            op            = "Private";
                            break;

                        case 0x0c:
                            switch (data[cursor + 1])
                            {
                            case 0x00:
                                int sidCopyright = (int)operandStack.Pop();
                                op = "Copyright";
                                break;

                            case 0x01:
                                operandStack.Pop();
                                op = "isFixedPitch";
                                break;

                            case 0x02:
                                operandStack.Pop();
                                op = "ItalicAngle";
                                break;

                            case 0x03:
                                operandStack.Pop();
                                op = "UnderlinePosition";
                                break;

                            case 0x04:
                                operandStack.Pop();
                                op = "UnderlineThickness";
                                break;

                            case 0x05:
                                operandStack.Pop();
                                op = "PaintType";
                                break;

                            case 0x06:
                                int CharstringType = (int)operandStack.Pop();
                                if (CharstringType != 2)
                                {
                                    throw new ArgumentOutOfRangeException("Invalid CharstringType:" + CharstringType);
                                }
                                op = "CharstringType";
                                break;

                            case 0x07:
                                operandStack.Clear();
                                op = "FontMatrix";
                                break;

                            case 0x08:
                                operandStack.Pop();
                                op = "StrokeWidth";
                                break;

                            case 0x14:
                                operandStack.Pop();
                                op = "SyntheticBase";
                                break;

                            case 0x15:
                                operandStack.Pop();
                                op = "PostScript";
                                break;

                            case 0x16:
                                operandStack.Pop();
                                op = "BaseFontName";
                                break;

                            case 0x17:
                                operandStack.Clear();
                                op = "BaseFontBlend";
                                break;

                            case 0x1e:
                                op = "ROS";
                                int supplement  = (int)operandStack.Pop();
                                int sidOrdering = (int)operandStack.Pop();
                                int sidRegistry = (int)operandStack.Pop();
                                ROS = m_String.StringForID(sidRegistry) + " " + m_String.StringForID(sidOrdering) + " " + supplement;
                                break;

                            case 0x1f:
                                object oCIDFontVersion = operandStack.Pop();
                                op = "CIDFontVersion";
                                break;

                            case 0x20:
                                operandStack.Pop();
                                op = "CIDFontRevision";
                                break;

                            case 0x21:
                                operandStack.Pop();
                                op = "CIDFontType";
                                break;

                            case 0x22:
                                operandStack.Pop();
                                op = "CIDCount";
                                break;

                            case 0x23:
                                operandStack.Pop();
                                op = "UIDBase";
                                break;

                            case 0x24:
                                offsetFDArray = (int)operandStack.Pop();
                                op            = "FDArray";
                                break;

                            case 0x25:
                                offsetFDSelect = (int)operandStack.Pop();
                                op             = "FDSelect";
                                break;

                            case 0x26:
                                sidFontName = (int)operandStack.Pop();
                                op          = "FontName";
                                break;

                            default:
                                operandStack.Clear();
                                op = "<2-byte>+0x" + data[cursor + 1].ToString("x2");
                                throw new ArgumentOutOfRangeException("Invalid <2-byte> op:"
                                                                      + data[cursor + 1].ToString("x2") + " at pos " + cursor);
                            }
                            advance = 2;
                            break;

                        default:
                            operandStack.Clear();
                            op = "0x" + data[cursor].ToString("x2");
                            throw new ArgumentOutOfRangeException("Invalid op:"
                                                                  + data[cursor].ToString("x2") + " at pos " + cursor);
                        }
                    }
                    else if (isPrivate && data[cursor] >= 0 && data[cursor] <= 21)
                    {
                        string op = "";
                        switch (data[cursor])
                        {
                        case 0x06:
                            operandStack.Clear();
                            op = "BlueValues";
                            break;

                        case 0x07:
                            operandStack.Clear();
                            op = "OtherBlues";
                            break;

                        case 0x08:
                            operandStack.Clear();
                            op = "FamilyBlues";
                            break;

                        case 0x09:
                            operandStack.Clear();
                            op = "FamilyOtherBlues";
                            break;

                        case 0x0a:
                            operandStack.Pop();
                            op = "StdHW";
                            break;

                        case 0x0b:
                            operandStack.Pop();
                            op = "StdVW";
                            break;

                        case 0x13:
                            Subrs = (int)operandStack.Pop();
                            op    = "Subrs";
                            break;

                        case 0x14:
                            operandStack.Pop();
                            op = "defaultWidthX";
                            break;

                        case 0x15:
                            operandStack.Pop();
                            op = "nominalWidthX";
                            break;

                        case 0x0c:
                            switch (data[cursor + 1])
                            {
                            case 0x09:
                                operandStack.Pop();
                                op = "BlueScale";
                                break;

                            case 0x0a:
                                operandStack.Pop();
                                op = "BlueShift";
                                break;

                            case 0x0b:
                                operandStack.Pop();
                                op = "BlueFuzz";
                                break;

                            case 0x0c:
                                operandStack.Clear();
                                op = "StemSnapH";
                                break;

                            case 0x0d:
                                operandStack.Clear();
                                op = "StemSnapV";
                                break;

                            case 0x0e:
                                operandStack.Pop();
                                op = "ForceBold";
                                break;

                            case 0x11:
                                operandStack.Pop();
                                op = "LanguageGroup";
                                break;

                            case 0x12:
                                operandStack.Pop();
                                op = "ExpansionFactor";
                                break;

                            case 0x13:
                                operandStack.Pop();
                                op = "initialRandomSeed";
                                break;

                            default:
                                operandStack.Clear();
                                op = "<2-byte>+0x" + data[cursor + 1].ToString("x2");
                                throw new ArgumentOutOfRangeException("Invalid <2-byte> op:"
                                                                      + data[cursor + 1].ToString("x2") + " at pos " + cursor);
                            }
                            advance = 2;
                            break;

                        default:
                            operandStack.Clear();
                            op = "0x" + data[cursor].ToString("x2");
                            throw new ArgumentOutOfRangeException("Invalid op:"
                                                                  + data[cursor].ToString("x2") + " at pos " + cursor);
                        }
                    }
                    else
                    {
                        throw new ArgumentOutOfRangeException("Reserved Byte encountered:"
                                                              + data[cursor].ToString("x2") + " at pos " + cursor);
                    }
                    cursor += advance;
                }
                if (cursor != data.Length)
                {
                    throw new ArgumentOutOfRangeException("operand stack ends unexpectedly, cursor not equal to data length:"
                                                          + cursor + "!=" + data.Length);
                }
                if (operandStack.Count != 0)
                {
                    throw new ArgumentOutOfRangeException("operand stack not empty:"
                                                          + operandStack.Count);
                }
            }
Ejemplo n.º 3
0
 public DICTData( byte[] data, INDEXData String )
     : this(data, String, false)
 {
 }
Ejemplo n.º 4
0
 public DICTData(byte[] data, INDEXData String) : this(data, String, false)
 {
 }