示例#1
0
 def __init__(self, compress_grf, crop_sprites, enable_cache, palette):
     self.compress_grf = compress_grf
     self.crop_sprites = crop_sprites
     self.enable_cache = enable_cache
     self.palette = palette
     self.sprite_cache = spritecache.SpriteCache("")
     self.cached_image_files = {}
示例#2
0
    def open(self, sprite_files):
        """
        Start the encoder, read caches, and stuff.

        @param sprite_files: List of sprites per source image file.
        @type  sprite_files: C{dict} that maps (C{tuple} of C{str}) to (C{RealSprite})
        """
        num_sprites = sum(
            len(sprite_list) for sprite_list in sprite_files.values())

        generic.print_progress("Encoding ...")

        num_cached = 0
        num_dup = 0
        num_enc = 0
        num_orphaned = 0
        count_sprites = 0
        for sources, sprite_list in sprite_files.items():
            # Iterate over sprites grouped by source image file.
            #  - Open source files only once. (speed)
            #  - Do not keep files around for long. (memory)

            source_name = "_".join(src for src in sources if src is not None)

            local_cache = spritecache.SpriteCache(sources)
            local_cache.read_cache()

            for sprite_info in sprite_list:
                count_sprites += 1
                generic.print_progress("Encoding {}/{}: {}".format(
                    count_sprites, num_sprites, source_name),
                                       incremental=True)

                cache_key = sprite_info.get_cache_key(self.crop_sprites)
                cache_item = local_cache.get_item(cache_key, self.palette)

                in_use = False
                in_old_cache = False
                if cache_item is not None:
                    # Write a sprite from the cached data
                    compressed_data, info_byte, crop_rect, pixel_stats, in_old_cache, in_use = cache_item
                    if in_use:
                        num_dup += 1
                    else:
                        num_cached += 1
                else:
                    (
                        size_x,
                        size_y,
                        xoffset,
                        yoffset,
                        compressed_data,
                        info_byte,
                        crop_rect,
                        pixel_stats,
                    ) = self.encode_sprite(sprite_info)
                    num_enc += 1

                # Store sprite in cache, unless already up-to-date
                if not in_use:
                    cache_item = (compressed_data, info_byte, crop_rect,
                                  pixel_stats, in_old_cache, True)
                    local_cache.add_item(cache_key, self.palette, cache_item)

            # Delete all files from dictionary to free memory
            self.cached_image_files.clear()

            num_orphaned += local_cache.count_orphaned()

            # Only write cache if compression is enabled. Uncompressed data is not worth to be cached.
            if self.compress_grf:
                local_cache.write_cache()

            # Transfer data to global cache for later usage
            self.sprite_cache.cached_sprites.update(local_cache.cached_sprites)

        generic.print_progress("Encoding ...", incremental=True)
        generic.clear_progress()
        generic.print_info(
            "{} sprites, {} cached, {} orphaned, {} duplicates, {} newly encoded ({})"
            .format(num_sprites, num_cached, num_orphaned, num_dup, num_enc,
                    "native" if lz77.is_native else "python"))