]> git.saurik.com Git - wxWidgets.git/blame - wxPython/tools/img2py.py
correction for memory leak
[wxWidgets.git] / wxPython / tools / img2py.py
CommitLineData
96bfd053
RD
1#!/usr/bin/env python
2"""
3img2py.py -- Convert an image to XPM format and embed it in a Python
4 module with appropriate code so it can be loaded into
5 a program at runtime. The benefit is that since it is
6 Python source code it can be delivered as a .pyc or
7 'compiled' into the program using freeze, py2exe, etc.
8
9Usage:
10
11 img2py.py [options] image_file python_file
12
13Options:
14
15 -m <#rrggbb> If the original image has a mask or transparency defined
16 it will be used by default. You can use this option to
17 override the default or provide a new mask by specifying
18 a colour in the image to mark as transparent.
19
20 -n <name> Normally generic names (getBitmap, etc.) are used for the
21 image access functions. If you use this option you can
22 specify a name that should be used to customize the access
23 fucntions, (getNameBitmap, etc.)
24
25 -a This flag specifies that the python_file should be appended
26 to instead of overwritten. This in combination with -n will
27 allow you to put multiple images in one Python source file.
28
29 -u Don't use compression. Leaves the data uncompressed.
30
31"""
32
33
34
7905ec55 35import sys, os, glob, getopt, tempfile, string
96bfd053
RD
36import cPickle, cStringIO, zlib
37import img2xpm
38
39
40def crunch_data(data, compressed):
bae17009 41 # convert the lines to a Python list, pickle it and optionally compress the result.
96bfd053 42 lines = []
7905ec55
RD
43 for line in data:
44 if line[0] == "\"":
45 # the line is typically (but not always):
46 # [quote] <data> [quote][comma][newline]
47
48 # chop one char from the front
49 line = line[1:]
50
51 # now find the final quote and truncate there
52 quote = string.rfind(line, "\"")
53
54 # and append the remaining data to our list
55 lines.append(line[:quote])
96bfd053 56
96bfd053
RD
57
58 # pickle, crunch and convert it to a form suitable for embedding in code
59 data = cPickle.dumps(lines)
60 if compressed:
61 data = zlib.compress(data, 9)
62 data = repr(data)
63
64
65 # This next bit is borrowed from PIL. It is used to wrap the text intelligently.
66 fp = cStringIO.StringIO()
67 data = data + " " # buffer for the +1 test
68 c = i = 0
69 word = ""
70 octdigits = "01234567"
286e2db6 71 hexdigits = "0123456789abcdef"
96bfd053
RD
72 while i < len(data):
73 if data[i] != "\\":
74 word = data[i]
75 i = i + 1
76 else:
77 if data[i+1] in octdigits:
78 for n in range(2, 5):
79 if data[i+n] not in octdigits:
80 break
81 word = data[i:i+n]
82 i = i + n
286e2db6
RD
83 elif data[i+1] == 'x':
84 for n in range(2, 5):
85 if data[i+n] not in hexdigits:
86 break
87 word = data[i:i+n]
88 i = i + n
96bfd053
RD
89 else:
90 word = data[i:i+2]
91 i = i + 2
286e2db6 92
96bfd053
RD
93 l = len(word)
94 if c + l >= 78-1:
95 fp.write("\\\n")
96 c = 0
97 fp.write(word)
98 c = c + l
99
100 # return the formatted compressed data
101 return fp.getvalue()
102
103
104
105def main(args):
106 if not args or ("-h" in args):
107 print __doc__
108 return
109
110 append = 0
111 compressed = 1
112 maskClr = None
113 imgName = ""
114
115 try:
116 opts, fileArgs = getopt.getopt(args, "aun:m:")
117 except getopt.GetoptError:
118 print __doc__
119 return
120
121 for opt, val in opts:
122 if opt == "-a":
123 append = 1
124 elif opt == "-u":
125 compressed = 0
126 elif opt == "-n":
127 imgName = val
128 elif opt == "-m":
129 maskClr = val
130
131 if len(fileArgs) != 2:
132 print __doc__
133 return
134
135 image_file, python_file = fileArgs
136
137 # convert the image file to a temporary file
138 tfname = tempfile.mktemp()
139 ok, msg = img2xpm.convert(image_file, maskClr, None, tfname)
140 if not ok:
141 print msg
142 return
143
144 data = open(tfname, "r").readlines()
145 data = crunch_data(data, compressed)
146 os.unlink(tfname)
147
148 if append:
149 out = open(python_file, "a")
150 else:
151 out = open(python_file, "w")
152
153 out.write("#" + "-" * 70 + "\n")
154 if not append:
155 out.write("# This file was generated by %s\n#\n" % sys.argv[0])
156 out.write("from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap\n")
157 if compressed:
158 out.write("import cPickle, zlib\n\n\n")
159 else:
160 out.write("import cPickle\n\n\n")
161
162 if compressed:
163 out.write("def get%sData():\n"
164 " return cPickle.loads(zlib.decompress(\n%s))\n\n"
165 % (imgName, data))
166 else:
167 out.write("def get%sData():\n"
168 " return cPickle.loads(\n%s)\n\n"
169 % (imgName, data))
170
171
172 out.write("def get%sBitmap():\n"
173 " return wxBitmapFromXPMData(get%sData())\n\n"
174 "def get%sImage():\n"
175 " return wxImageFromBitmap(get%sBitmap())\n\n"
176 % tuple([imgName] * 4))
177
178 if imgName:
179 n_msg = ' using "%s"' % imgName
180 else:
181 n_msg = ""
182 if maskClr:
183 m_msg = " with mask %s" % maskClr
184 else:
185 m_msg = ""
186 print "Embedded %s%s into %s%s" % (image_file, n_msg, python_file, m_msg)
187
188
189if __name__ == "__main__":
190 main(sys.argv[1:])
191
192
193
194
195