Example #1
0
 def __init__(self):
     super(FontModule, self).__init__()
     self.font_pointer_table = eb_table_from_offset(offset=FONT_POINTER_TABLE_OFFSET)
     self.fonts = [
         EbFont(num_characters=128, tile_width=16, tile_height=16),
         EbFont(num_characters=128, tile_width=16, tile_height=16),
         EbFont(num_characters=128, tile_width=8, tile_height=16),
         EbFont(num_characters=128, tile_width=8, tile_height=8),
         EbFont(num_characters=128, tile_width=16, tile_height=16)
     ]
     self.credits_font = EbCreditsFont()
Example #2
0
 def __init__(self):
     super(FontModule, self).__init__()
     self.fonts = [
         EbFont(num_characters=96, tile_width=16, tile_height=16),
         EbFont(num_characters=96, tile_width=16, tile_height=16),
         EbFont(num_characters=96, tile_width=16, tile_height=16),
         EbFont(num_characters=96, tile_width=8, tile_height=16),
         EbFont(num_characters=96, tile_width=8, tile_height=8)
     ]
     self.credits_font = EbCreditsFont()
Example #3
0
 def __init__(self):
     super(FontModule, self).__init__()
     self.font_pointer_table = eb_table_from_offset(offset=FONT_POINTER_TABLE_OFFSET)
     self.fonts = [
         EbFont(num_characters=128, tile_width=16, tile_height=16),
         EbFont(num_characters=128, tile_width=16, tile_height=16),
         EbFont(num_characters=128, tile_width=8, tile_height=16),
         EbFont(num_characters=128, tile_width=8, tile_height=8),
         EbFont(num_characters=128, tile_width=16, tile_height=16)
     ]
     self.credits_font = EbCreditsFont()
Example #4
0
class FontModule(EbModule):
    NAME = "Fonts"
    FREE_RANGES = [
        (0x21e528, 0x21e913),  # Credits font graphics
        (0x210c7a, 0x212ef9),  # Fonts 0, 2, 3, and 4
        (0x201359, 0x201fb8),  # Font 1
    ]

    def __init__(self):
        super(FontModule, self).__init__()
        self.font_pointer_table = eb_table_from_offset(offset=FONT_POINTER_TABLE_OFFSET)
        self.fonts = [
            EbFont(num_characters=128, tile_width=16, tile_height=16),
            EbFont(num_characters=128, tile_width=16, tile_height=16),
            EbFont(num_characters=128, tile_width=8, tile_height=16),
            EbFont(num_characters=128, tile_width=8, tile_height=8),
            EbFont(num_characters=128, tile_width=16, tile_height=16)
        ]
        self.credits_font = EbCreditsFont()

    def read_from_rom(self, rom):
        self.font_pointer_table.from_block(block=rom,
                                           offset=from_snes_address(FONT_POINTER_TABLE_OFFSET))
        for i, font in enumerate(self.fonts):
            log.debug("Reading font #{} from the ROM".format(FONT_FILENAMES[i]))
            font.from_block(block=rom,
                            tileset_offset=from_snes_address(self.font_pointer_table[i][1]),
                            character_widths_offset=from_snes_address(self.font_pointer_table[i][0]))

        self.read_credits_font_from_rom(rom)

    def write_to_rom(self, rom):
        self.font_pointer_table.from_block(block=rom,
                                           offset=from_snes_address(FONT_POINTER_TABLE_OFFSET))
        for i, font in enumerate(self.fonts):
            log.debug("Writing font #{} to the ROM".format(FONT_FILENAMES[i]))

            graphics_offset, widths_offset = font.to_block(block=rom)
            self.font_pointer_table[i][0] = to_snes_address(widths_offset)
            self.font_pointer_table[i][1] = to_snes_address(graphics_offset)
        self.font_pointer_table.to_block(block=rom,
                                         offset=from_snes_address(FONT_POINTER_TABLE_OFFSET))

        self.write_credits_font_to_rom(rom)

    def read_from_project(self, resource_open):
        for i, font in enumerate(self.fonts):
            with resource_open("Fonts/" + FONT_FILENAMES[i], 'png') as image_file:
                with resource_open("Fonts/" + FONT_FILENAMES[i] + "_widths", "yml", True) as widths_file:
                    font.from_files(image_file, widths_file, image_format="png", widths_format="yml")

        self.read_credits_font_from_project(resource_open)

    def write_to_project(self, resource_open):
        for i, font in enumerate(self.fonts):
            # Write the PNG
            with resource_open("Fonts/" + FONT_FILENAMES[i], 'png') as image_file:
                with resource_open("Fonts/" + FONT_FILENAMES[i] + "_widths", "yml", True) as widths_file:
                    font.to_files(image_file, widths_file, image_format="png", widths_format="yml")

        self.write_credits_font_to_project(resource_open)

    def read_credits_font_from_rom(self, rom):
        log.debug("Reading the credits font from the ROM")
        self.credits_font.from_block(block=rom,
                                     tileset_asm_pointer_offset=CREDITS_GRAPHICS_ASM_POINTER,
                                     palette_offset=CREDITS_PALETTES_ADDRESS)

    def write_credits_font_to_rom(self, rom):
        log.debug("Writing the credits font to the ROM")
        self.credits_font.to_block(block=rom,
                                   tileset_asm_pointer_offset=CREDITS_GRAPHICS_ASM_POINTER,
                                   palette_offset=CREDITS_PALETTES_ADDRESS)

    def write_credits_font_to_project(self, resource_open):
        with resource_open("Fonts/credits", "png") as image_file:
            self.credits_font.to_files(image_file, "png")

    def read_credits_font_from_project(self, resource_open):
        with resource_open("Fonts/credits", "png") as image_file:
            self.credits_font.from_files(image_file, "png")

    def upgrade_project(self, old_version, new_version, rom, resource_open_r, resource_open_w, resource_delete):
        if old_version == new_version:
            return
        elif old_version == 5:
            # Expand all the fonts from 96 characters to 128 characters
            for i, font in enumerate(self.fonts):
                log.debug("Expanding font #{}".format(FONT_FILENAMES[i]))
                image_resource_name = "Fonts/" + FONT_FILENAMES[i]
                widths_resource_name = "Fonts/" + FONT_FILENAMES[i] + "_widths"
                new_image_w, new_image_h = font.image_size()

                # Expand the image

                with resource_open_r(image_resource_name, 'png') as image_file:
                    image = open_indexed_image(image_file)

                    expanded_image = Image.new("P", (new_image_w, new_image_h), None)
                    for y in range(new_image_h):
                        for x in range(new_image_w):
                            expanded_image.putpixel((x, y), 1)
                    FONT_IMAGE_PALETTE.to_image(expanded_image)
                    expanded_image.paste(image, (0, 0))

                    with resource_open_w(image_resource_name, 'png') as image_file2:
                        expanded_image.save(image_file2, "png")

                # Expand the widths

                with resource_open_r(widths_resource_name, "yml", True) as widths_file:
                    widths_dict = yml_load(widths_file)

                for character_id in range(96, 128):
                    if character_id not in widths_dict:
                        widths_dict[character_id] = 0

                with resource_open_w(widths_resource_name, "yml", True) as widths_file:
                    yml_dump(widths_dict, widths_file, default_flow_style=False)

            self.upgrade_project(6, new_version, rom, resource_open_r, resource_open_w, resource_delete)
        elif old_version <= 2:
            # The credits font was a new feature in version 3

            self.read_credits_font_from_rom(rom)
            self.write_credits_font_to_project(resource_open_w)
            self.upgrade_project(3, new_version, rom, resource_open_r, resource_open_w, resource_delete)
        else:
            self.upgrade_project(old_version + 1, new_version, rom, resource_open_r, resource_open_w, resource_delete)
Example #5
0
class FontModule(EbModule):
    NAME = "Fonts"
    FREE_RANGES = [(0x21e528, 0x21e913)]  # Credits font graphics

    def __init__(self):
        super(FontModule, self).__init__()
        self.fonts = [
            EbFont(num_characters=96, tile_width=16, tile_height=16),
            EbFont(num_characters=96, tile_width=16, tile_height=16),
            EbFont(num_characters=96, tile_width=16, tile_height=16),
            EbFont(num_characters=96, tile_width=8, tile_height=16),
            EbFont(num_characters=96, tile_width=8, tile_height=8)
        ]
        self.credits_font = EbCreditsFont()

    def read_credits_font_from_rom(self, rom):
        log.debug("Reading the credits font from the ROM")
        self.credits_font.from_block(block=rom,
                                     tileset_asm_pointer_offset=CREDITS_GRAPHICS_ASM_POINTER,
                                     palette_offset=CREDITS_PALETTES_ADDRESS)

    def read_from_rom(self, rom):
        for i, (font, graphics_address, widths_address) in enumerate(zip(self.fonts, FONT_GRAPHICS_ADDRESSES,
                                                                         FONT_CHARACTER_WIDTHS_ADDRESSES)):
            log.debug("Reading font #{} from the ROM".format(i))
            font.from_block(block=rom, tileset_offset=graphics_address, character_widths_offset=widths_address)

        self.read_credits_font_from_rom(rom)

    def write_credits_font_to_rom(self, rom):
        log.debug("Writing the credits font to the ROM")
        self.credits_font.to_block(block=rom,
                                   tileset_asm_pointer_offset=CREDITS_GRAPHICS_ASM_POINTER,
                                   palette_offset=CREDITS_PALETTES_ADDRESS)

    def write_to_rom(self, rom):
        for i, (font, graphics_address, widths_address) in enumerate(zip(self.fonts, FONT_GRAPHICS_ADDRESSES,
                                                                         FONT_CHARACTER_WIDTHS_ADDRESSES)):
            log.debug("Writing font #{} to the ROM".format(i))
            font.to_block(block=rom, tileset_offset=graphics_address, character_widths_offset=widths_address)

        self.write_credits_font_to_rom(rom)

    def write_credits_font_to_project(self, resource_open):
        with resource_open("Fonts/credits", "png") as image_file:
            self.credits_font.to_files(image_file, "png")

    def write_to_project(self, resource_open):
        for i, font in enumerate(self.fonts):
            # Write the PNG
            with resource_open("Fonts/" + str(i), 'png') as image_file:
                with resource_open("Fonts/" + str(i) + "_widths", "yml") as widths_file:
                    font.to_files(image_file, widths_file, image_format="png", widths_format="yml")

        self.write_credits_font_to_project(resource_open)

    def read_credits_font_from_project(self, resource_open):
        with resource_open("Fonts/credits", "png") as image_file:
            self.credits_font.from_files(image_file, "png")

    def read_from_project(self, resource_open):
        for i, font in enumerate(self.fonts):
            with resource_open("Fonts/" + str(i), 'png') as image_file:
                with resource_open("Fonts/" + str(i) + "_widths", "yml") as widths_file:
                    font.from_files(image_file, widths_file, image_format="png", widths_format="yml")

        self.read_credits_font_from_project(resource_open)

    def upgrade_project(self, old_version, new_version, rom, resource_open_r, resource_open_w, resource_delete):
        if old_version == new_version:
            return
        elif old_version <= 2:
            # The credits font was a new feature in version 3

            self.read_credits_font_from_rom(rom)
            self.write_credits_font_to_project(resource_open_w)
            self.upgrade_project(3, new_version, rom, resource_open_r, resource_open_w, resource_delete)
        else:
            self.upgrade_project(old_version + 1, new_version, rom, resource_open_r, resource_open_w, resource_delete)
Example #6
0
class FontModule(EbModule):
    NAME = "Fonts"
    FREE_RANGES = [
        (0x21e528, 0x21e913),  # Credits font graphics
        (0x210c7a, 0x212ef9),  # Fonts 0, 2, 3, and 4
        (0x201359, 0x201fb8),  # Font 1
    ]

    def __init__(self):
        super(FontModule, self).__init__()
        self.font_pointer_table = eb_table_from_offset(offset=FONT_POINTER_TABLE_OFFSET)
        self.fonts = [
            EbFont(num_characters=128, tile_width=16, tile_height=16),
            EbFont(num_characters=128, tile_width=16, tile_height=16),
            EbFont(num_characters=128, tile_width=8, tile_height=16),
            EbFont(num_characters=128, tile_width=8, tile_height=8),
            EbFont(num_characters=128, tile_width=16, tile_height=16)
        ]
        self.credits_font = EbCreditsFont()

    def read_from_rom(self, rom):
        self.font_pointer_table.from_block(block=rom,
                                           offset=from_snes_address(FONT_POINTER_TABLE_OFFSET))
        for i, font in enumerate(self.fonts):
            log.debug("Reading font #{} from the ROM".format(FONT_FILENAMES[i]))
            font.from_block(block=rom,
                            tileset_offset=from_snes_address(self.font_pointer_table[i][1]),
                            character_widths_offset=from_snes_address(self.font_pointer_table[i][0]))

        self.read_credits_font_from_rom(rom)

    def write_to_rom(self, rom):
        self.font_pointer_table.from_block(block=rom,
                                           offset=from_snes_address(FONT_POINTER_TABLE_OFFSET))
        for i, font in enumerate(self.fonts):
            log.debug("Writing font #{} to the ROM".format(FONT_FILENAMES[i]))

            graphics_offset, widths_offset = font.to_block(block=rom)
            self.font_pointer_table[i][0] = to_snes_address(widths_offset)
            self.font_pointer_table[i][1] = to_snes_address(graphics_offset)
        self.font_pointer_table.to_block(block=rom,
                                         offset=from_snes_address(FONT_POINTER_TABLE_OFFSET))

        self.write_credits_font_to_rom(rom)

    def read_from_project(self, resource_open):
        for i, font in enumerate(self.fonts):
            with resource_open("Fonts/" + FONT_FILENAMES[i], 'png') as image_file:
                with resource_open("Fonts/" + FONT_FILENAMES[i] + "_widths", "yml") as widths_file:
                    font.from_files(image_file, widths_file, image_format="png", widths_format="yml")

        self.read_credits_font_from_project(resource_open)

    def write_to_project(self, resource_open):
        for i, font in enumerate(self.fonts):
            # Write the PNG
            with resource_open("Fonts/" + FONT_FILENAMES[i], 'png') as image_file:
                with resource_open("Fonts/" + FONT_FILENAMES[i] + "_widths", "yml") as widths_file:
                    font.to_files(image_file, widths_file, image_format="png", widths_format="yml")

        self.write_credits_font_to_project(resource_open)

    def read_credits_font_from_rom(self, rom):
        log.debug("Reading the credits font from the ROM")
        self.credits_font.from_block(block=rom,
                                     tileset_asm_pointer_offset=CREDITS_GRAPHICS_ASM_POINTER,
                                     palette_offset=CREDITS_PALETTES_ADDRESS)

    def write_credits_font_to_rom(self, rom):
        log.debug("Writing the credits font to the ROM")
        self.credits_font.to_block(block=rom,
                                   tileset_asm_pointer_offset=CREDITS_GRAPHICS_ASM_POINTER,
                                   palette_offset=CREDITS_PALETTES_ADDRESS)

    def write_credits_font_to_project(self, resource_open):
        with resource_open("Fonts/credits", "png") as image_file:
            self.credits_font.to_files(image_file, "png")

    def read_credits_font_from_project(self, resource_open):
        with resource_open("Fonts/credits", "png") as image_file:
            self.credits_font.from_files(image_file, "png")

    def upgrade_project(self, old_version, new_version, rom, resource_open_r, resource_open_w, resource_delete):
        if old_version == new_version:
            return
        elif old_version == 5:
            # Expand all the fonts from 96 characters to 128 characters
            for i, font in enumerate(self.fonts):
                log.debug("Expanding font #{}".format(FONT_FILENAMES[i]))
                image_resource_name = "Fonts/" + FONT_FILENAMES[i]
                widths_resource_name = "Fonts/" + FONT_FILENAMES[i] + "_widths"
                new_image_w, new_image_h = font.image_size()

                # Expand the image

                with resource_open_r(image_resource_name, 'png') as image_file:
                    image = open_indexed_image(image_file)

                    expanded_image = Image.new("P", (new_image_w, new_image_h), None)
                    for y in xrange(new_image_h):
                        for x in xrange(new_image_w):
                            expanded_image.putpixel((x, y), 1)
                    FONT_IMAGE_PALETTE.to_image(expanded_image)
                    expanded_image.paste(image, (0, 0))

                    with resource_open_w(image_resource_name, 'png') as image_file2:
                        expanded_image.save(image_file2, "png")

                # Expand the widths

                with resource_open_r(widths_resource_name, "yml") as widths_file:
                    widths_dict = yml_load(widths_file)

                for character_id in xrange(96, 128):
                    if character_id not in widths_dict:
                        widths_dict[character_id] = 0

                with resource_open_w(widths_resource_name, "yml") as widths_file:
                    yml_dump(widths_dict, widths_file, default_flow_style=False)

            self.upgrade_project(6, new_version, rom, resource_open_r, resource_open_w, resource_delete)
        elif old_version <= 2:
            # The credits font was a new feature in version 3

            self.read_credits_font_from_rom(rom)
            self.write_credits_font_to_project(resource_open_w)
            self.upgrade_project(3, new_version, rom, resource_open_r, resource_open_w, resource_delete)
        else:
            self.upgrade_project(old_version + 1, new_version, rom, resource_open_r, resource_open_w, resource_delete)