Ticket #32: pyisf.py

File pyisf.py, 4.6 kB (added by kevincampbell, 11 months ago)

the main function to read an isf file (filename at the bottom can be changed)

Line 
1from isfencodings import *
2import os.path
3from array import array
4
5
6class 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
153if __name__ == '__main__':
154        print 'Decoding ''word.isf'''
155        thing = ISF()
156        ISF.decode(thing,'word.isf')
157