| 1 | from isfencodings import * |
|---|
| 2 | import os.path |
|---|
| 3 | from array import array |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | class ISF( object ): |
|---|
| 7 | |
|---|
| 8 | def decode(self, filename): |
|---|
| 9 | size = os.path.getsize(filename) |
|---|
| 10 | f = open(filename,'rb') |
|---|
| 11 | data = array('B') |
|---|
| 12 | data.read(f,size) |
|---|
| 13 | f.close() |
|---|
| 14 | |
|---|
| 15 | location = 2 |
|---|
| 16 | while location < data.buffer_info()[1]: |
|---|
| 17 | tag, location = dec_mbuint32(data, location) |
|---|
| 18 | if tag == 0: |
|---|
| 19 | #INK_SPACE_RECT |
|---|
| 20 | print 'INK_SPACE_RECT' |
|---|
| 21 | elif tag == 1: |
|---|
| 22 | #GUID_TABLE |
|---|
| 23 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 24 | location = location + payload_size |
|---|
| 25 | print 'GUID_TABLE size', payload_size |
|---|
| 26 | elif tag == 2: |
|---|
| 27 | #DRAW_ATTRS_TABLE |
|---|
| 28 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 29 | location = location + payload_size |
|---|
| 30 | print 'DRAW_ATTRS_TABLE size', payload_size |
|---|
| 31 | elif tag == 3: |
|---|
| 32 | #DRAW_ATTRS_BLOCK |
|---|
| 33 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 34 | location = location + payload_size |
|---|
| 35 | print 'DRAW_ATTRS_BLOCK size', payload_size |
|---|
| 36 | elif tag == 4: |
|---|
| 37 | #STROKE_DESC_TABLE |
|---|
| 38 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 39 | location = location + payload_size |
|---|
| 40 | print 'STROKE_DESC_TABLE size', payload_size |
|---|
| 41 | elif tag == 5: |
|---|
| 42 | #STROKE_DESC_BLOCK |
|---|
| 43 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 44 | location = location + payload_size |
|---|
| 45 | print 'STROKE_DESC_BLOCK size', payload_size |
|---|
| 46 | elif tag == 6: |
|---|
| 47 | #BUTTONS |
|---|
| 48 | print 'BUTTONS' |
|---|
| 49 | elif tag == 7: |
|---|
| 50 | #NO_X |
|---|
| 51 | print 'NO_X' |
|---|
| 52 | elif tag == 8: |
|---|
| 53 | #NO_Y |
|---|
| 54 | print 'NO_Y' |
|---|
| 55 | elif tag == 9: |
|---|
| 56 | #DIDX |
|---|
| 57 | self.draw_attrs_index, location = dec_mbuint32(data, location) |
|---|
| 58 | print 'DIDX', self.draw_attrs_index |
|---|
| 59 | elif tag == 10: |
|---|
| 60 | #STROKE |
|---|
| 61 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 62 | print 'STROKE payload', payload_size |
|---|
| 63 | #packet data for GUID_X and then GUID_Y |
|---|
| 64 | stroke_data = data[location:location+payload_size] |
|---|
| 65 | guid_x, guid_y = dec_packet(stroke_data) |
|---|
| 66 | location = location + payload_size |
|---|
| 67 | elif tag == 11: |
|---|
| 68 | #STROKE_PROPERTY_LIST |
|---|
| 69 | print 'STROKE_PROPERTY_LIST' |
|---|
| 70 | elif tag == 12: |
|---|
| 71 | #POINT_PROPERTY |
|---|
| 72 | print 'POINT_PROPERTY' |
|---|
| 73 | elif tag == 13: |
|---|
| 74 | #SIDX |
|---|
| 75 | self.stroke_desc_index, location = dec_mbuint32(data, location) |
|---|
| 76 | print 'SIDX', self.stroke_desc_index |
|---|
| 77 | elif tag == 14: |
|---|
| 78 | #COMPRESSION_HEADER |
|---|
| 79 | print 'COMPRESSION_HEADER' |
|---|
| 80 | elif tag == 15: |
|---|
| 81 | #TRANSFORM_TABLE |
|---|
| 82 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 83 | location = location + payload_size |
|---|
| 84 | print 'TRANSFORM_TABLE size', payload_size |
|---|
| 85 | elif tag == 16: |
|---|
| 86 | #TRANSFORM |
|---|
| 87 | location += 24 |
|---|
| 88 | print 'TRANSFORM' |
|---|
| 89 | elif tag == 17: |
|---|
| 90 | #TRANSFORM_ISOTROPIC_SCALE |
|---|
| 91 | location += 4 |
|---|
| 92 | print 'TRANSFORM_ISOTROPIC_SCALE' |
|---|
| 93 | elif tag == 18: |
|---|
| 94 | #TRANSFORM_ANISOTROPIC_SCALE |
|---|
| 95 | location += 8 |
|---|
| 96 | print 'TRANSFORM_ANISOTROPIC_SCALE' |
|---|
| 97 | elif tag == 19: |
|---|
| 98 | #TRANSFORM_ROTATE |
|---|
| 99 | data, location = dec_mbuint32(data, location) |
|---|
| 100 | print 'TRANSFORM_ROTATE', data |
|---|
| 101 | elif tag == 20: |
|---|
| 102 | #TRANSFORM_TRANSLATE |
|---|
| 103 | location += 8 |
|---|
| 104 | print 'TRANSFORM_TRANSLATE' |
|---|
| 105 | elif tag == 21: |
|---|
| 106 | #TRANSFORM_SCALE_AND_TRANSLATE |
|---|
| 107 | location += 16 |
|---|
| 108 | print 'TRANSFORM_SCALE_AND_TRANSLATE' |
|---|
| 109 | elif tag == 22: |
|---|
| 110 | #TRANSFORM_QUAD |
|---|
| 111 | location += 24 |
|---|
| 112 | print 'TRANSFORM_QUAD' |
|---|
| 113 | elif tag == 23: |
|---|
| 114 | #TIDX |
|---|
| 115 | self.transform_table_index, location = dec_mbuint32(data, location) |
|---|
| 116 | print 'TIDX', self.transform_table_index |
|---|
| 117 | elif tag == 24: |
|---|
| 118 | #METRIC_TABLE |
|---|
| 119 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 120 | location = location + payload_size |
|---|
| 121 | print 'METRIC_TABLE size', payload_size |
|---|
| 122 | elif tag == 25: |
|---|
| 123 | #METRIC_BLOCK |
|---|
| 124 | GUID, location = dec_mbuint32(data, location) |
|---|
| 125 | payload_size, location = dec_mbuint32(data, location) |
|---|
| 126 | location = location + payload_size |
|---|
| 127 | print 'METRIC_BLOCK size', payload_size |
|---|
| 128 | elif tag == 26: |
|---|
| 129 | #MIDX |
|---|
| 130 | self.metric_block_index, location = dec_mbuint32(data, location) |
|---|
| 131 | print 'MIDX', self.metric_block_index |
|---|
| 132 | elif tag == 27: |
|---|
| 133 | #MANTISSA |
|---|
| 134 | print 'MANTISSA' |
|---|
| 135 | elif tag == 28: |
|---|
| 136 | #PERSISTENT_FORMAT |
|---|
| 137 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 138 | self.persistent_format, location = dec_mbuint32(data, location) |
|---|
| 139 | print 'PERSISTENT_FORMAT:', self.persistent_format |
|---|
| 140 | elif tag == 29: |
|---|
| 141 | #HIMETRIC_SIZE |
|---|
| 142 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 143 | self.width, location = dec_mbsint32(data, location) |
|---|
| 144 | self.height, location = dec_mbsint32(data, location) |
|---|
| 145 | print 'HIMETRIC_SIZE:', self.width, 'x', self.height |
|---|
| 146 | elif tag == 30: |
|---|
| 147 | #STROKE_IDS |
|---|
| 148 | payload_size, location = dec_mbuint64(data, location) |
|---|
| 149 | location = location + payload_size |
|---|
| 150 | print 'STROKE_IDS size', payload_size |
|---|
| 151 | return |
|---|
| 152 | |
|---|
| 153 | if __name__ == '__main__': |
|---|
| 154 | print 'Decoding ''word.isf''' |
|---|
| 155 | thing = ISF() |
|---|
| 156 | ISF.decode(thing,'word.isf') |
|---|
| 157 | |
|---|