def get_images(spritesheet: Texture, sprite_sizes: tuple) -> list: """Cut provided spritesheet texture into separate PNMImage objects""" if _has_remainder(spritesheet, sprite_sizes): raise exceptions.InvalidSpriteSize(spritesheet.get_name(), sprite_sizes) sprite_x, sprite_y = sprite_sizes columns, rows = _get_columns_and_rows(spritesheet, sprite_sizes) # This is safety check to ensure there wont be any weird effects during cutting, # caused by texture autorescale. In order to circuimvent this, you need to # set "textures-power-2 none" in your Config.rpc. # There seem to be setters and getters to deal with it on per-texture basis, # but thus far I couldnt figure out how to make them work properly #TODO if spritesheet.getTexturesPower2(): if not _is_power_of_two(columns) or not _is_power_of_two(rows): raise exceptions.InvalidSpriteSize(spritesheet.get_name(), sprite_sizes) # Extract texture's image from memory sheet_image = Image() spritesheet.store(sheet_image) images = [] for row in range(0, rows): log.debug(f"Processing row{row}") for column in range(0, columns): log.debug(f"Processing column {column}") # THIS WAS BUGGED - I HAD TO FLIP IT x = column * sprite_x y = row * sprite_y # passing amount of channels is important to allow transparency pic = Image(sprite_x, sprite_y, sheet_image.get_num_channels()) pic.blendSubImage(sheet_image, 0, 0, x, y, sprite_x, sprite_y, 1.0) images.append(pic) log.debug(f"Got following images: {images}") return images