annotate tiles2img.py @ 6:3148b6389042

Set dynamic colors to 8 in tiles2img
author Mike Pavone <pavone@retrodev.com>
date Tue, 03 Sep 2013 09:37:10 -0700
parents 97ec271a513f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #!/usr/bin/env python
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 from PIL import Image
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
4 def gchannel(Val):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5 return (Val >> 4) & 0xE
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
6
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 threshold = 127
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9 def get_color_info(pixels, rng, threshold, exclude={}):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 gencolors = {}
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 A = 255
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 for idx in rng:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 color = pixels[idx]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14 if len(color) == 4:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15 (R, G, B, A) = color
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
16 else:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17 (R, G, B) = color
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
18 if A > threshold:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 gcolor = (gchannel(R), gchannel(G), gchannel(B))
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 if not gcolor in exclude:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 if gcolor in gencolors:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22 gencolors[gcolor] += 1
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
23 else:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
24 gencolors[gcolor] = 1
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25 glist = [(gencolors[color], color) for color in gencolors]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
26 glist.sort()
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
27 glist.reverse()
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
28 return glist
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
29
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
30 def totiles(im, palette):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
31 pass
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
32
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
33 def make_palette(im, trans_thresh, max_global, max_line):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34 pixels = im.getdata()
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35 (width, height) = im.size
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 colors = get_color_info(pixels, xrange(0, height * width), trans_thresh)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 glob_pal = {}
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 for idx in xrange(0, min(max_global, len(colors))):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39 (count, color) = colors[idx]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
40 glob_pal[color] = idx
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
41 line_pals = []
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
42 if max_global < len(colors):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
43 for line in xrange(0, height):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 linestart = line * width
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45 linecolors = get_color_info(pixels, xrange(linestart, linestart+width), trans_thresh, glob_pal)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 line_pal = {}
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 for idx in xrange(0, min(max_line, len(linecolors))):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
48 (count, color) = linecolors[idx]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 line_pal[color] = idx
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 line_pals.append(line_pal)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 return (glob_pal, line_pals)
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
52
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 def color_dist(a, b):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54 (ra, ga, ba) = a
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
55 (rb, gb, bb) = b
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56 return abs(ra-rb)**2 + abs(ga-gb)**2 + abs(ba-bb)**2
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
58 def trans_image(im, trans_thresh, pal):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 (global_pal, line_pals) = pal
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
60 pixels = im.getdata()
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
61 (width, height) = im.size
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
62 gpixels = []
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
63 A = 255
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
64 x = 0
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
65 y = 0
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
66 for pixel in pixels:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
67 if x == width:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
68 x = 0
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
69 y += 1
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
70 if width % 8:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
71 for i in xrange(0, 8-(width%8)):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
72 gpixels.append(0)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
73 if len(pixel) == 4:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
74 (R, G, B, A) = pixel
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
75 else:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
76 (R, G, B) = pixel
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
77 if A > trans_thresh:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
78 gpixel = (gchannel(R), gchannel(G), gchannel(B))
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
79 if gpixel in global_pal:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80 gpixels.append(global_pal[gpixel])
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81 elif gpixel in line_pals[y]:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
82 gpixels.append(line_pals[y][gpixel] + len(global_pal))
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83 else:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
84 bestdist = color_dist((0,0,0), (15, 15, 15))
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
85 bestpal = 0
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
86 for cur in global_pal:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
87 curdist = color_dist(gpixel, cur)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
88 if curdist < bestdist:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
89 bestdist = curdist
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
90 bestpal = global_pal[cur]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
91 for cur in line_pals[y]:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
92 curdist = color_dist(gpixel, cur)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
93 if curdist < bestdist:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
94 bestdist = curdist
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
95 bestpal = line_pals[y][cur]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
96 gpixels.append(bestpal)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
97 else:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
98 gpixels.append(0)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
99 x += 1
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
100 if width % 8:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
101 for i in xrange(0, 8-(width%8)):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
102 gpixels.append(0)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
103 width += 8-(width%8)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
104 if height % 8:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
105 for y in xrange(0, 8-(height%8)):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
106 for x in xrange(0, width):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
107 gpixels.append(0)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
108 height += 8-(height%8)
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
109
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
110 return (width, height, gpixels)
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
111
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
112 def appendword(b, word):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
113 b.append(word >> 8)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
114 b.append(word & 0xff)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
115
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
116 def to_tiles(palpix):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
117 (width, height, pixels) = palpix
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
118 b = bytearray()
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
119 cwidth = width/8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
120 cheight = height/8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
121 words = len(pixels)/4
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
122 appendword(b, words)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
123 appendword(b, cwidth)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
124 appendword(b, cheight)
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
125
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
126 for cy in xrange(0, cheight):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
127 ystart = cy*8*width
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
128 for cx in xrange(0, cwidth):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
129 startoff = (cx*8) + ystart
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
130 for row in xrange(0, 8):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
131 rowoff = startoff + row*width
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
132 for bytecol in xrange(0, 4):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
133 boff = bytecol * 2 + rowoff
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
134 #print 'boff:', boff, 'len(pixels)', len(pixels), 'cx', cx, 'cy', cy, 'cwidth', cwidth, 'cheight', cheight
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
135 #print 'pixels[boff]:', pixels[boff]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
136 b.append(pixels[boff] << 4 | pixels[boff+1])
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
137 return b
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
138
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
139 def add_pal_entries(tiles, pal):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
140 (global_pal, line_pals) = pal
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
141 pal_list = [()] * len(global_pal)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
142 for entry in global_pal:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
143 pal_list[global_pal[entry]] = entry
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
144 for entry in pal_list:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
145 (R, G, B) = entry
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
146 tiles.append(B)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
147 tiles.append(G << 4 | R)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
148 for line in line_pals:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
149 pal_list = [()] * len(line)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
150 for entry in line:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
151 pal_list[line[entry]] = entry
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
152 for entry in pal_list:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
153 (R, G, B) = entry
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
154 tiles.append(B)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
155 tiles.append(G << 4 | R)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
156
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
157 def getcolor(tiles, fixedpal, linepals, width, x, y):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
158 celly = y/8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
159 cellx = x/8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
160 resty = y%8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
161 restx = x%8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
162 cellwidth = width / 8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
163 offset = celly * 32 * cellwidth + resty * 4 + cellx * 32 + restx / 2
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
164 if restx & 1:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
165 palidx = tiles[offset] & 0xF
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
166 else:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
167 palidx = (tiles[offset] >> 4) & 0xF
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
168 if palidx < len(fixedpal):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
169 return fixedpal[palidx]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
170 return linepals[y][palidx - len(fixedpal)]
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
171
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
172 def to_pixels(tiles, im):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
173 (_, width, height), tiles, (fixedpal, linepals) = tiles
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
174 for y in xrange(0, height):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
175 for x in xrange(0, width):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
176 color = getcolor(tiles, fixedpal, linepals, width, x, y)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
177 im.putpixel((x,y), color)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
178 return im
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
179
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
180 def expand_pal(pal):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
181 def expand_pal_int(pal):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
182 return ((pal << 4) & 0xE0, pal & 0xE0, (pal >> 4) & 0xE0)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
183 fixedpal, linepals = pal
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
184 fixedpal = [expand_pal_int(color) for color in fixedpal]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
185 linepals = [[expand_pal_int(color) for color in linepal] for linepal in linepals]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
186 return (fixedpal, linepals)
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
187
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
188 def open_tiles(name):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
189 from struct import unpack, unpack_from
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
190 f = open(name, 'rb')
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
191 header = f.read(6)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
192 words,width,height = unpack('>HHH', header)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
193 width *= 8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
194 height *= 8
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
195 meta = (words, width, height)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
196 pixels = bytearray(f.read(words * 2))
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
197 numfixed = 8
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
198 numdynamic = 8
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
199 fixedpalb = f.read(numfixed*2)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
200 fixedpal = []
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
201 for offset in xrange(0, numfixed*2, 2):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
202 color, = unpack_from('>H', fixedpalb, offset)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
203 fixedpal.append(color)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
204 linepals = []
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
205 linepalsize = numdynamic * height * 2
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
206 linepalb = f.read(linepalsize)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
207 for baseoffset in xrange(0, linepalsize, numdynamic * 2):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
208 linepal = []
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
209 for offset in xrange(baseoffset, baseoffset + numdynamic * 2, 2):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
210 color, = unpack_from('>H', linepalb, offset)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
211 linepal.append(color)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
212 linepals.append(linepal)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
213 return (meta, pixels, (fixedpal, linepals))
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
214
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
215 def main(argv):
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
216 if len(argv) < 3:
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
217 print "Not enough arguments"
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
218 return
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
219 fname = argv[1]
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
220 tiles = open_tiles(fname)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
221 im = Image.new('RGB', (tiles[0][1], tiles[0][2]))
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
222 tiles = (tiles[0], tiles[1], expand_pal(tiles[2]))
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
223 to_pixels(tiles, im)
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
224 out = open(argv[2], 'wb')
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
225 im.save(out)
6
3148b6389042 Set dynamic colors to 8 in tiles2img
Mike Pavone <pavone@retrodev.com>
parents: 3
diff changeset
226
3
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
227 if __name__ == '__main__':
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
228 import sys
97ec271a513f Bunch of changes
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
229 main(sys.argv)