Example #1
0
 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
Example #2
0
    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))
Example #3
0
    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
Example #4
0
 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))
Example #5
0
 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))
Example #6
0
    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
Example #7
0
    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
Example #8
0
 def mask_generator():
     key = (word_iterator(rahc.data[0:2], 16)).next()
     while True:
         yield key
         key = cap_to_bits(key * mult + add, 16)