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 ); }
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); } }
public DICTData( byte[] data, INDEXData String ) : this(data, String, false) { }
public DICTData(byte[] data, INDEXData String) : this(data, String, false) { }