def setFromImage(self, img, x, y, pals, palNum, indexed=False): # Check for normal tile newTile = None imgData = img.load() if indexed: newTile = [ array('B', [ imgData[i,j] for j in xrange(y, self._tileSize + y) ]) for i in xrange(x, self._tileSize + x) ] else: newTile = [ array('B', [ pals.getColorFromRGB(palNum,imgData[i,j]) for j in xrange(y, self._tileSize + y) ]) for i in xrange(x, self._tileSize + x) ] # Note: newTile is an array of columns # Check for non-flipped tile try: tIndex = self._usedDict[EbModule.hashArea(newTile)] return (False, False, tIndex) except KeyError: pass # Check for only horizontally flipped tile try: tIndex = self._usedDict[EbModule.hashArea(reversed(newTile))] return (False, True, tIndex) except KeyError: pass # Check for vertically and horizontally flipped tile for col in newTile: col.reverse() try: tIndex = self._usedDict[EbModule.hashArea(reversed(newTile))] return (True, True, tIndex) except KeyError: pass # Check for only vertically flipped tile tH = EbModule.hashArea(newTile) try: tIndex = self._usedDict[tH] return (True, False, tIndex) except KeyError: pass # We need to add a new tile if self._usedTiles >= self._numTiles: # TODO ERROR: Not enough room for a new tile return (False, False, 0) # Remember, newTile is still vflipped self._tiles.append(newTile) self._usedDict[tH] = self._usedTiles self._usedTiles += 1 return (True, False, self._usedTiles-1)
def fromImage(self, img): self._width, self._height = img.size self._sprite = [] imgData = img.load() for x in range(0, self._width): col = array('B', [0]*self._height) for y in range(0, self._height): col[y] = imgData[x,y] self._sprite.append(col) self._spriteHash = EbModule.hashArea(self._sprite)
def readFromBlock(self, block, width, height, loc=0): self._width = width self._height = height self._sprite = map(lambda x: array('B', [0] * height), range(0, width)) offset = loc for q in range(0, height/32): for r in range(0, width/32): for a in range(0, 4): for j in range(0, 4): EbModule.read4BPPArea(self._sprite, block, offset, (j + r * 4) * 8, (a + q * 4) * 8) offset += 32 self._spriteHash = EbModule.hashArea(self._sprite)