Warning removed
[opentx.git] / radio / util / img2lbm.py
blob0837738c787d385edc7e4d2906a36c13843e7805
1 #!/usr/bin/env python
3 from __future__ import division, print_function
5 import sys
6 import os.path
7 from PIL import Image
9 class RLE_encoder:
10 RLE_BYTE = 0
11 RLE_SEQ = 1
13 def __init__(self, out):
14 self.state = self.RLE_BYTE
15 self.count = 0
16 self.prev_byte = None
17 self.out = out
19 def eq_prev_byte(self, in_byte):
20 if self.prev_byte is None:
21 return False
22 return in_byte == self.prev_byte
24 def encode_byte(self, in_byte):
26 if self.state == self.RLE_BYTE:
27 self.out(in_byte)
28 if self.eq_prev_byte(in_byte):
29 self.state = self.RLE_SEQ
30 self.count = 0
31 else:
32 self.prev_byte = in_byte
34 elif self.state == self.RLE_SEQ:
35 if self.eq_prev_byte(in_byte):
36 self.count += 1
37 if self.count == 255:
38 self.out(self.count)
39 self.prev_byte = None
40 self.state = self.RLE_BYTE
41 else:
42 self.out(self.count)
43 self.out(in_byte)
44 self.prev_byte = in_byte
45 self.state = self.RLE_BYTE
47 def encode_end(self):
48 if self.state == self.RLE_SEQ:
49 self.out(self.count)
51 class dummy_encoder:
52 def __init__(self, out):
53 self.out = out
55 def encode_byte(self, in_byte):
56 self.out(in_byte)
58 def encode_end(self):
59 pass
61 def writeSize(f, width, height):
62 if lcdwidth > 255:
63 f.write("%d,%d,%d,%d,\n" % (width % 256, width // 256, height % 256, height // 256))
64 else:
65 f.write("%d,%d,\n" % (width, height))
67 def F_writeValue(f):
68 def writeValue(value):
69 f.write("0x%02x," % value)
70 return writeValue
72 def F_getPixelCoord():
73 def getCoord(x,y):
74 return (x,y)
75 return getCoord
77 def F_getPixelCoord_R(w,h):
78 def getCoord(x,y):
79 return (w-x-1, h-y-1)
80 return getCoord
82 ## MAIN ##
84 image = Image.open(sys.argv[1])
85 width, height = image.size
87 image_fmt = image.format
88 output_filename = sys.argv[2]
90 with open(output_filename, "w") as f:
91 lcdwidth = int(sys.argv[3])
93 if len(sys.argv) > 4:
94 s = sys.argv[4].split('-')
95 what = s[0]
96 pixel_coord = F_getPixelCoord()
97 if (len(s) > 1) and (s[1] == 'R'):
98 pixel_coord = F_getPixelCoord_R(width,height)
99 else:
100 for s in ("03x05", "04x06", "05x07", "08x10", "10x14", "22x38"):
101 if s in sys.argv[2]:
102 what = s
103 break
105 extension = os.path.splitext(output_filename)[1]
106 out = F_writeValue(f)
108 if extension == ".rle" or ((len(sys.argv) > 5) and (sys.argv[5] == "rle")):
109 encoder = RLE_encoder(out)
110 else:
111 encoder = dummy_encoder(out)
113 if what == "1bit":
114 rows = 1
115 if len(sys.argv) > 5:
116 rows = int(sys.argv[5])
117 image = image.convert(mode='1')
118 writeSize(f, width, height // rows)
119 for y in range(0, height, 8):
120 for x in range(width):
121 value = 0
122 for z in range(8):
123 if y + z < height:
124 if image_fmt == 'XBM':
125 if image.getpixel((x, y + z)) > 0:
126 value += 1 << z
127 else:
128 if image.getpixel((x, y + z)) == 0:
129 value += 1 << z
130 encoder.encode_byte(value)
131 f.write("\n")
132 encoder.encode_end()
133 elif what == "4bits":
134 colors = []
135 writeSize(f, width, height)
136 image = image.convert(mode='L')
137 for y in range(0, height, 2):
138 for x in range(width):
139 value = 0xFF
140 gray1 = image.getpixel((x, y))
141 if y + 1 < height:
142 gray2 = image.getpixel((x, y + 1))
143 else:
144 gray2 = 255
145 for i in range(4):
146 if (gray1 & (1 << (4 + i))):
147 value -= 1 << i
148 if (gray2 & (1 << (4 + i))):
149 value -= 1 << (4 + i)
150 encoder.encode_byte(value)
151 f.write("\n")
152 encoder.encode_end()
153 elif what == "8bits":
154 colors = []
155 writeSize(f, width, height)
156 image = image.convert(mode='L')
157 for y in range(height):
158 for x in range(width):
159 value = image.getpixel((x, y))
160 value = 0x0f - (value >> 4)
161 encoder.encode_byte(value)
162 f.write("\n")
163 encoder.encode_end()
164 elif what == "4/4/4/4":
165 constant = sys.argv[2].upper()[:-4]
166 values = []
167 writeSize(f, width, height)
168 for y in range(height):
169 for x in range(width):
170 pixel = image.getpixel(pixel_coord(x, y))
171 val = ((pixel[3] // 16) << 12) + ((pixel[0] // 16) << 8) + ((pixel[1] // 16) << 4) + ((pixel[2] // 16) << 0)
172 encoder.encode_byte(val & 255)
173 encoder.encode_byte(val >> 8)
174 encoder.encode_end()
175 #f.write("\n};\n")
176 #if extension != ".rle":
177 # f.write("const Bitmap %s(BMP_ARGB4444, %d, %d, (uint16_t*)__%s);\n" % (constant, width, height, constant))
178 elif what == "5/6/5":
179 constant = sys.argv[2].upper()[:-4]
180 values = []
181 writeSize(f, width, height)
182 for y in range(height):
183 for x in range(width):
184 pixel = image.getpixel(pixel_coord(x, y))
185 val = ((pixel[0] >> 3) << 11) + ((pixel[1] >> 2) << 5) + ((pixel[2] >> 3) << 0)
186 encoder.encode_byte(val & 255)
187 encoder.encode_byte(val >> 8)
188 encoder.encode_end()
189 #f.write("\n};\n")
190 #if extension != ".rle":
191 # f.write("const Bitmap %s(BMP_RGB565, %d, %d, (uint16_t*)__%s);\n" % (constant, width, height, constant))
192 elif what == "03x05":
193 image = image.convert(mode='L')
194 for y in range(0, height, 5):
195 for x in range(width):
196 value = 0
197 for z in range(5):
198 if image.getpixel((x, y + z)) == 0:
199 value += 1 << z
200 f.write("0x%02x," % value)
201 f.write("\n")
202 elif what == "04x06":
203 image = image.convert(mode='L')
204 for y in range(0, height, 7):
205 for x in range(width):
206 value = 0
207 for z in range(7):
208 if image.getpixel((x, y + z)) == 0:
209 value += 1 << z
210 if value == 0x7f:
211 value = 0xff
212 f.write("0x%02x," % value)
213 f.write("\n")
214 elif what == "05x07":
215 image = image.convert(mode='L')
216 for y in range(0, height, 8):
217 for x in range(width):
218 value = 0
219 for z in range(8):
220 if image.getpixel((x, y + z)) == 0:
221 value += 1 << z
222 f.write("0x%02x," % value)
223 f.write("\n")
224 elif what == "08x10":
225 image = image.convert(mode='L')
226 for y in range(0, height, 12):
227 for x in range(width):
228 skip = True
229 for l in range(0, 12, 8):
230 value = 0
231 for z in range(8):
232 if l + z < 12:
233 if image.getpixel((x, y + l + z)) == 0:
234 value += 1 << z
235 else:
236 skip = False
237 if skip and l == 8:
238 value = 0xff
239 f.write("0x%02x," % value)
240 f.write("\n")
241 elif what == "10x14":
242 image = image.convert(mode='L')
243 for y in range(0, height, 16):
244 for x in range(width):
245 for l in range(0, 16, 8):
246 value = 0
247 for z in range(8):
248 if image.getpixel((x, y + l + z)) == 0:
249 value += 1 << z
250 f.write("0x%02x," % value)
251 f.write("\n")
252 elif what == "22x38":
253 image = image.convert(mode='L')
254 for y in range(0, height, 40):
255 for x in range(width):
256 for l in range(0, 40, 8):
257 value = 0
258 for z in range(8):
259 if image.getpixel((x, y + l + z)) == 0:
260 value += 1 << z
261 f.write("0x%02x," % value)
262 f.write("\n")
263 else:
264 print("wrong argument", sys.argv[4])