def pixel_generator(): # Unmask the sprite data for word, mask in izip(word_iterator(rahc.data, 16), mask_generator()): unmasked = word ^ mask # This is 16 bits, and there are four bits per pixel, so we # have four pixels for _ in range(4): yield cap_to_bits(unmasked, 4) unmasked >>= 4
def __init__(self, chunk): """Parses a binary chunk as a B5 G5 R5 palette.""" self.colors = [] nclr = nclr_struct.parse(chunk) # XXX this SHOULD have two sections according to format docs. # ttlp.data won't leak into a following section, at least ttlp = ttlp_struct.parse(nclr.data) for palette_word in word_iterator(ttlp.data, 16): r = ((palette_word & 0x001f) ) * 255 // 31 g = ((palette_word & 0x03e0) >> 5 ) * 255 // 31 b = ((palette_word & 0x7c00) >> 10) * 255 // 31 self.colors.append((r, g, b))
def from_standard(cls, chunk): """Parses a nybble-based sprite from a chunk.""" self = cls() rgcn = rgcn_struct.parse(chunk) rahc = rahc_struct.parse(rgcn.data) # XXX make these less constant somehow self.size = Size(width=32, height=128) self.pixels = [[0] * self.size.height for _ in range(self.size.width)] for i, word in enumerate(word_iterator(rahc.data, 4)): x, y = self.get_pos(i, tile_size=8) self.pixels[x][y] = word return self
def set_format(self, format): if format is None: self._format = None elif format == self._format: pass elif format == 5: # XXX do it raise NotImplementedError elif format == 7: #direct color texture -- no palette raise ValueError else: self._format = format size = 1 << bpp[format] for _, w in zip(range(size), word_iterator(self.data, 16)): r = (w & 0x1f) * 255 // 31 g = ((w >> 5) & 0x1f) * 255 // 31 b = ((w >> 10) & 0x1f) * 255 // 31 self.colors.append((r, g, b))
def set_format(self, format): if format is None: self._format = None elif format == self._format: pass elif format == 5: # XXX do it raise NotImplementedError elif format == 7: #direct color texture -- no palette raise ValueError else: self._format = format size = 1 << bpp[format] for _, w in zip(range(size), word_iterator(self.data, 16)): r = (w & 0x1f) * 255 // 31 g = ((w >> 5) & 0x1f) * 255 // 31 b = ((w >> 10) & 0x1f) * 255 // 31 self.colors.append((r, g, b))
def pixels(self): if self._pixels is not None: return self._pixels # [width][height] self._pixels = [[0] * self.size.height for _ in range(self.size.width)] pixdata = self.data.value format = self.format # XXX do the rest of the formats if format == 3: # 16-color palette it = word_iterator(pixdata, 4) for y in range(self.info.height): for x in range(self.info.width): pix = it.next() self._pixels[x][y] = pix elif format == 5: # XXX do it raise NotImplementedError else: raise NotImplementedError return self._pixels
def pixels(self): if self._pixels is not None: return self._pixels # [width][height] self._pixels = [[0] * self.size.height for _ in range(self.size.width)] pixdata = self.data.value format = self.format # XXX do the rest of the formats if format == 3: # 16-color palette it = word_iterator(pixdata, 4) for y in range(self.info.height): for x in range(self.info.width): pix = it.next() self._pixels[x][y] = pix elif format == 5: # XXX do it raise NotImplementedError else: raise NotImplementedError return self._pixels
def mask_generator(): key = (word_iterator(rahc.data[0:2], 16)).next() while True: yield key key = cap_to_bits(key * mult + add, 16)