summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2015-11-23 17:44:06 -0800
committerYamaArashi <shadow962@live.com>2015-11-23 17:44:06 -0800
commitb951fb1113b9574002f5405ebcb4750c077746ff (patch)
tree5cfc5d5b9dec5525880ef1c9aebe083020c47937
parent22d87f81d7097f9d2eb79bd0c784f9c74d44a79c (diff)
dumped fonts
-rw-r--r--.gitignore3
-rw-r--r--Makefile17
-rw-r--r--data/data2.s40
-rw-r--r--data/graphics/fonts/font0_japanese.pngbin0 -> 3099 bytes
-rw-r--r--data/graphics/fonts/font0_latin.pngbin0 -> 3115 bytes
-rw-r--r--data/graphics/fonts/font0_latin_widths.s512
-rw-r--r--data/graphics/fonts/font1_japanese.pngbin0 -> 3493 bytes
-rw-r--r--data/graphics/fonts/font1_latin.pngbin0 -> 3543 bytes
-rw-r--r--data/graphics/fonts/font1_latin_widths.s512
-rw-r--r--data/graphics/fonts/font2_japanese.pngbin0 -> 4532 bytes
-rw-r--r--data/graphics/fonts/font2_japanese_widths.s512
-rw-r--r--data/graphics/fonts/font2_latin.pngbin0 -> 3475 bytes
-rw-r--r--data/graphics/fonts/font2_latin_widths.s512
-rw-r--r--data/graphics/fonts/font6_braille.pngbin0 -> 220 bytes
-rw-r--r--data/graphics/fonts/font7_latin.pngbin0 -> 3449 bytes
-rw-r--r--data/graphics/fonts/font7_latin_widths.s512
-rw-r--r--data/graphics/fonts/font8_latin.pngbin0 -> 3114 bytes
-rw-r--r--data/graphics/fonts/font8_latin_widths.s512
-rw-r--r--data/graphics/fonts/font9_japanese.pngbin0 -> 2327 bytes
-rw-r--r--data/graphics/fonts/unused_japanese_font_1.pngbin0 -> 4480 bytes
-rw-r--r--data/graphics/fonts/unused_japanese_font_1_widths.s512
-rw-r--r--data/graphics/fonts/unused_japanese_font_2.pngbin0 -> 4507 bytes
-rw-r--r--data/graphics/fonts/unused_japanese_font_2_widths.s512
-rw-r--r--graphics_file_rules.mk168
-rw-r--r--tools/gbagfx/Makefile6
-rw-r--r--tools/gbagfx/convert_png.c2
-rw-r--r--tools/gbagfx/font.c326
-rw-r--r--tools/gbagfx/font.h16
-rw-r--r--tools/gbagfx/gfx.h2
-rw-r--r--tools/gbagfx/global.h12
-rw-r--r--tools/gbagfx/main.c363
-rw-r--r--tools/gbagfx/util.c42
-rw-r--r--tools/gbagfx/util.h4
33 files changed, 4757 insertions, 340 deletions
diff --git a/.gitignore b/.gitignore
index cca13a6a3..341c63013 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,9 @@
*.8bpp
*.gbapal
*.lz
+*.latfont
+*.hwjpnfont
+*.fwjpnfont
pokeas
pokeld
pokeobjcopy
diff --git a/Makefile b/Makefile
index c6f0e129a..6c519190e 100644
--- a/Makefile
+++ b/Makefile
@@ -13,12 +13,7 @@ SHA1 := sha1sum -c
.PHONY: rom tools gbagfx scaninc clean compare
-gfx := tools/gbagfx/gbagfx
-1bpp := @$(gfx) 1bpp
-4bpp := @$(gfx) 4bpp
-8bpp := @$(gfx) 8bpp
-gbapal := @$(gfx) gbapal
-lz := @$(gfx) lz
+gfx := @tools/gbagfx/gbagfx
scaninc := tools/scaninc/scaninc
objs = asm/emerald.o
@@ -52,11 +47,11 @@ include graphics_file_rules.mk
%.png: ;
%.pal: ;
-%.1bpp: %.png ; $(1bpp) $<
-%.4bpp: %.png ; $(4bpp) $<
-%.8bpp: %.png ; $(8bpp) $<
-%.gbapal: %.pal ; $(gbapal) $<
-%.lz: % ; $(lz) $<
+%.1bpp: %.png ; $(gfx) $< $@
+%.4bpp: %.png ; $(gfx) $< $@
+%.8bpp: %.png ; $(gfx) $< $@
+%.gbapal: %.pal ; $(gfx) $< $@
+%.lz: % ; $(gfx) $< $@
%.o: %.s $$($$@_deps)
$(AS) $(ASFLAGS) -o $@ $<
diff --git a/data/data2.s b/data/data2.s
index 96ae70665..d048f018a 100644
--- a/data/data2.s
+++ b/data/data2.s
@@ -124,7 +124,7 @@ gMenuCursorDimensions: ; 82EA608
.byte 0, 0
gFont9JapaneseGlyphs: ; 82EA61C
- .incbin "base_emerald.gba", 0x2ea61c, 0x2000
+ .incbin "data/graphics/fonts/font9.hwjpnfont"
; Unreferenced data. This also comes before the gpu_bg.s data in Ruby and seems
; to be unreferenced there too.
@@ -11093,7 +11093,7 @@ gUnknown_08616124: ; 8616124
.incbin "base_emerald.gba", 0x616124, 0x4
gFont6BrailleGlyphs: ; 8616128
- .incbin "base_emerald.gba", 0x616128, 0x1000
+ .incbin "data/graphics/fonts/font6.fwjpnfont"
gUnknown_08617128: ; 8617128
.incbin "base_emerald.gba", 0x617128, 0x48
@@ -12032,58 +12032,58 @@ gUnknown_0862B7FC: ; 862B7FC
.incbin "base_emerald.gba", 0x62b7fc, 0x2e8
gFont8LatinGlyphs: ; 862BAE4
- .incbin "base_emerald.gba", 0x62bae4, 0x8000
+ .incbin "data/graphics/fonts/font8.latfont"
gFont8LatinGlyphWidths: ; 8633AE4
- .incbin "base_emerald.gba", 0x633ae4, 0x200
+ .include "data/graphics/fonts/font8_latin_widths.s"
gFont0LatinGlyphs: ; 8633CE4
- .incbin "base_emerald.gba", 0x633ce4, 0x8000
+ .incbin "data/graphics/fonts/font0.latfont"
gFont0LatinGlyphWidths: ; 863BCE4
- .incbin "base_emerald.gba", 0x63bce4, 0x200
+ .include "data/graphics/fonts/font0_latin_widths.s"
gFont7LatinGlyphs: ; 863BEE4
- .incbin "base_emerald.gba", 0x63bee4, 0x8000
+ .incbin "data/graphics/fonts/font7.latfont"
gFont7LatinGlyphWidths: ; 8643EE4
- .incbin "base_emerald.gba", 0x643ee4, 0x200
+ .include "data/graphics/fonts/font7_latin_widths.s"
gFont2LatinGlyphs: ; 86440E4
- .incbin "base_emerald.gba", 0x6440e4, 0x8000
+ .incbin "data/graphics/fonts/font2.latfont"
gFont2LatinGlyphWidths: ; 864C0E4
- .incbin "base_emerald.gba", 0x64c0e4, 0x200
+ .include "data/graphics/fonts/font2_latin_widths.s"
gFont1LatinGlyphs: ; 864C2E4
- .incbin "base_emerald.gba", 0x64c2e4, 0x8000
+ .incbin "data/graphics/fonts/font1.latfont"
gFont1LatinGlyphWidths: ; 86542E4
- .incbin "base_emerald.gba", 0x6542e4, 0x200
+ .include "data/graphics/fonts/font1_latin_widths.s"
gFont0JapaneseGlyphs: ; 86544E4
- .incbin "base_emerald.gba", 0x6544e4, 0x4000
+ .incbin "data/graphics/fonts/font0.hwjpnfont"
gFont1JapaneseGlyphs: ; 86584E4
- .incbin "base_emerald.gba", 0x6584e4, 0x4000
+ .incbin "data/graphics/fonts/font1.hwjpnfont"
gUnusedFullwidthJapaneseFontGlyphs: ; 865C4E4
- .incbin "base_emerald.gba", 0x65c4e4, 0x8000
+ .incbin "data/graphics/fonts/unused_1.fwjpnfont"
gUnusedFullwidthJapaneseFontGlyphWidths: ; 86644E4
- .incbin "base_emerald.gba", 0x6644e4, 0x200
+ .include "data/graphics/fonts/unused_japanese_font_1_widths.s"
gUnusedFullwidthJapaneseFont2Glyphs: ; 86646E4
- .incbin "base_emerald.gba", 0x6646e4, 0x8000
+ .incbin "data/graphics/fonts/unused_2.fwjpnfont"
gUnusedFullwidthJapaneseFont2GlyphWidths: ; 866C6E4
- .incbin "base_emerald.gba", 0x66c6e4, 0x200
+ .include "data/graphics/fonts/unused_japanese_font_2_widths.s"
gFont2JapaneseGlyphs: ; 866C8E4
- .incbin "base_emerald.gba", 0x66c8e4, 0x8000
+ .incbin "data/graphics/fonts/font2.fwjpnfont"
gFont2JapaneseGlyphWidths: ; 86748E4
- .incbin "base_emerald.gba", 0x6748e4, 0x200
+ .include "data/graphics/fonts/font2_japanese_widths.s"
gUnknown_08674AE4: ; 8674AE4
.incbin "base_emerald.gba", 0x674ae4, 0x32
diff --git a/data/graphics/fonts/font0_japanese.png b/data/graphics/fonts/font0_japanese.png
new file mode 100644
index 000000000..35345f399
--- /dev/null
+++ b/data/graphics/fonts/font0_japanese.png
Binary files differ
diff --git a/data/graphics/fonts/font0_latin.png b/data/graphics/fonts/font0_latin.png
new file mode 100644
index 000000000..55ed43506
--- /dev/null
+++ b/data/graphics/fonts/font0_latin.png
Binary files differ
diff --git a/data/graphics/fonts/font0_latin_widths.s b/data/graphics/fonts/font0_latin_widths.s
new file mode 100644
index 000000000..3ea204048
--- /dev/null
+++ b/data/graphics/fonts/font0_latin_widths.s
@@ -0,0 +1,512 @@
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 3
+ .byte 4
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 3
+ .byte 4
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 6
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 8
+ .byte 7
+ .byte 8
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 7
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 4
+ .byte 7
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 4
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 1
+ .byte 2
+ .byte 3
+ .byte 4
+ .byte 5
+ .byte 6
+ .byte 7
+ .byte 5
+ .byte 7
+ .byte 7
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 8
+ .byte 5
+ .byte 8
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 8
+ .byte 7
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 3
diff --git a/data/graphics/fonts/font1_japanese.png b/data/graphics/fonts/font1_japanese.png
new file mode 100644
index 000000000..3d2d55541
--- /dev/null
+++ b/data/graphics/fonts/font1_japanese.png
Binary files differ
diff --git a/data/graphics/fonts/font1_latin.png b/data/graphics/fonts/font1_latin.png
new file mode 100644
index 000000000..ade914858
--- /dev/null
+++ b/data/graphics/fonts/font1_latin.png
Binary files differ
diff --git a/data/graphics/fonts/font1_latin_widths.s b/data/graphics/fonts/font1_latin_widths.s
new file mode 100644
index 000000000..cd56da569
--- /dev/null
+++ b/data/graphics/fonts/font1_latin_widths.s
@@ -0,0 +1,512 @@
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 8
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 8
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 9
+ .byte 7
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 10
+ .byte 8
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 4
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 7
+ .byte 8
+ .byte 8
+ .byte 4
+ .byte 6
+ .byte 6
+ .byte 4
+ .byte 4
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 3
+ .byte 7
+ .byte 7
+ .byte 7
+ .byte 7
+ .byte 1
+ .byte 2
+ .byte 3
+ .byte 4
+ .byte 5
+ .byte 6
+ .byte 7
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 4
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 7
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 4
+ .byte 5
+ .byte 6
+ .byte 4
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 8
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 3
diff --git a/data/graphics/fonts/font2_japanese.png b/data/graphics/fonts/font2_japanese.png
new file mode 100644
index 000000000..efdb4b77e
--- /dev/null
+++ b/data/graphics/fonts/font2_japanese.png
Binary files differ
diff --git a/data/graphics/fonts/font2_japanese_widths.s b/data/graphics/fonts/font2_japanese_widths.s
new file mode 100644
index 000000000..54a8a1cf1
--- /dev/null
+++ b/data/graphics/fonts/font2_japanese_widths.s
@@ -0,0 +1,512 @@
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 7
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 5
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 2
+ .byte 4
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
diff --git a/data/graphics/fonts/font2_latin.png b/data/graphics/fonts/font2_latin.png
new file mode 100644
index 000000000..7eba3e748
--- /dev/null
+++ b/data/graphics/fonts/font2_latin.png
Binary files differ
diff --git a/data/graphics/fonts/font2_latin_widths.s b/data/graphics/fonts/font2_latin_widths.s
new file mode 100644
index 000000000..21a688a62
--- /dev/null
+++ b/data/graphics/fonts/font2_latin_widths.s
@@ -0,0 +1,512 @@
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 8
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 8
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 9
+ .byte 8
+ .byte 8
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 10
+ .byte 8
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 4
+ .byte 6
+ .byte 8
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 3
+ .byte 12
+ .byte 12
+ .byte 12
+ .byte 12
+ .byte 1
+ .byte 2
+ .byte 3
+ .byte 4
+ .byte 5
+ .byte 6
+ .byte 7
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 8
+ .byte 5
+ .byte 9
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 4
+ .byte 6
+ .byte 5
+ .byte 5
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 8
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 12
+ .byte 12
+ .byte 12
+ .byte 12
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 3
diff --git a/data/graphics/fonts/font6_braille.png b/data/graphics/fonts/font6_braille.png
new file mode 100644
index 000000000..cb4451bc2
--- /dev/null
+++ b/data/graphics/fonts/font6_braille.png
Binary files differ
diff --git a/data/graphics/fonts/font7_latin.png b/data/graphics/fonts/font7_latin.png
new file mode 100644
index 000000000..08652d45f
--- /dev/null
+++ b/data/graphics/fonts/font7_latin.png
Binary files differ
diff --git a/data/graphics/fonts/font7_latin_widths.s b/data/graphics/fonts/font7_latin_widths.s
new file mode 100644
index 000000000..03f06224c
--- /dev/null
+++ b/data/graphics/fonts/font7_latin_widths.s
@@ -0,0 +1,512 @@
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 3
+ .byte 4
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 8
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 6
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 3
+ .byte 4
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 8
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 6
+ .byte 9
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 7
+ .byte 8
+ .byte 8
+ .byte 4
+ .byte 4
+ .byte 6
+ .byte 4
+ .byte 4
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 4
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 3
+ .byte 7
+ .byte 7
+ .byte 7
+ .byte 7
+ .byte 1
+ .byte 2
+ .byte 3
+ .byte 4
+ .byte 5
+ .byte 6
+ .byte 7
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 3
+ .byte 5
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 8
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 8
+ .byte 10
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 3
diff --git a/data/graphics/fonts/font8_latin.png b/data/graphics/fonts/font8_latin.png
new file mode 100644
index 000000000..3a88def3a
--- /dev/null
+++ b/data/graphics/fonts/font8_latin.png
Binary files differ
diff --git a/data/graphics/fonts/font8_latin_widths.s b/data/graphics/fonts/font8_latin_widths.s
new file mode 100644
index 000000000..3e5815eda
--- /dev/null
+++ b/data/graphics/fonts/font8_latin_widths.s
@@ -0,0 +1,512 @@
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 3
+ .byte 4
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 3
+ .byte 4
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 8
+ .byte 5
+ .byte 6
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 0
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 4
+ .byte 5
+ .byte 4
+ .byte 4
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 4
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 1
+ .byte 2
+ .byte 3
+ .byte 4
+ .byte 5
+ .byte 6
+ .byte 7
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 7
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 4
+ .byte 4
+ .byte 5
+ .byte 4
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 7
+ .byte 3
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 5
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 3
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 3
diff --git a/data/graphics/fonts/font9_japanese.png b/data/graphics/fonts/font9_japanese.png
new file mode 100644
index 000000000..cf5b61668
--- /dev/null
+++ b/data/graphics/fonts/font9_japanese.png
Binary files differ
diff --git a/data/graphics/fonts/unused_japanese_font_1.png b/data/graphics/fonts/unused_japanese_font_1.png
new file mode 100644
index 000000000..da4f2beac
--- /dev/null
+++ b/data/graphics/fonts/unused_japanese_font_1.png
Binary files differ
diff --git a/data/graphics/fonts/unused_japanese_font_1_widths.s b/data/graphics/fonts/unused_japanese_font_1_widths.s
new file mode 100644
index 000000000..6d68f9326
--- /dev/null
+++ b/data/graphics/fonts/unused_japanese_font_1_widths.s
@@ -0,0 +1,512 @@
+ .byte 0
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 8
+ .byte 7
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 5
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 2
+ .byte 4
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
diff --git a/data/graphics/fonts/unused_japanese_font_2.png b/data/graphics/fonts/unused_japanese_font_2.png
new file mode 100644
index 000000000..7da59c0eb
--- /dev/null
+++ b/data/graphics/fonts/unused_japanese_font_2.png
Binary files differ
diff --git a/data/graphics/fonts/unused_japanese_font_2_widths.s b/data/graphics/fonts/unused_japanese_font_2_widths.s
new file mode 100644
index 000000000..6f2dbd43f
--- /dev/null
+++ b/data/graphics/fonts/unused_japanese_font_2_widths.s
@@ -0,0 +1,512 @@
+ .byte 0
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 9
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 9
+ .byte 8
+ .byte 7
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 5
+ .byte 9
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 8
+ .byte 8
+ .byte 10
+ .byte 10
+ .byte 8
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 2
+ .byte 4
+ .byte 6
+ .byte 3
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 5
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 6
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 0
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
+ .byte 10
diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk
index 3b94e567b..d60f0b92e 100644
--- a/graphics_file_rules.mk
+++ b/graphics_file_rules.mk
@@ -36,193 +36,231 @@ $(monpaldir)/castform_shiny_palette.gbapal: $(monpaldir)/castform_normal_form_sh
tilesetdir := data/graphics/tilesets
$(tilesetdir)/secondary/petalburg/tiles.4bpp: $(tilesetdir)/secondary/petalburg/tiles.png
- $(4bpp) $< -num_tiles 159
+ $(gfx) $< $@ -num_tiles 159
$(tilesetdir)/secondary/rustboro/tiles.4bpp: $(tilesetdir)/secondary/rustboro/tiles.png
- $(4bpp) $< -num_tiles 498
+ $(gfx) $< $@ -num_tiles 498
$(tilesetdir)/secondary/dewford/tiles.4bpp: $(tilesetdir)/secondary/dewford/tiles.png
- $(4bpp) $< -num_tiles 503
+ $(gfx) $< $@ -num_tiles 503
$(tilesetdir)/secondary/slateport/tiles.4bpp: $(tilesetdir)/secondary/slateport/tiles.png
- $(4bpp) $< -num_tiles 504
+ $(gfx) $< $@ -num_tiles 504
$(tilesetdir)/secondary/mauville/tiles.4bpp: $(tilesetdir)/secondary/mauville/tiles.png
- $(4bpp) $< -num_tiles 503
+ $(gfx) $< $@ -num_tiles 503
$(tilesetdir)/secondary/lavaridge/tiles.4bpp: $(tilesetdir)/secondary/lavaridge/tiles.png
- $(4bpp) $< -num_tiles 450
+ $(gfx) $< $@ -num_tiles 450
$(tilesetdir)/secondary/fortree/tiles.4bpp: $(tilesetdir)/secondary/fortree/tiles.png
- $(4bpp) $< -num_tiles 493
+ $(gfx) $< $@ -num_tiles 493
$(tilesetdir)/secondary/pacifidlog/tiles.4bpp: $(tilesetdir)/secondary/pacifidlog/tiles.png
- $(4bpp) $< -num_tiles 504
+ $(gfx) $< $@ -num_tiles 504
$(tilesetdir)/secondary/sootopolis/tiles.4bpp: $(tilesetdir)/secondary/sootopolis/tiles.png
- $(4bpp) $< -num_tiles 328
+ $(gfx) $< $@ -num_tiles 328
$(tilesetdir)/secondary/battle_frontier_outside_west/tiles.4bpp: $(tilesetdir)/secondary/battle_frontier_outside_west/tiles.png
- $(4bpp) $< -num_tiles 508
+ $(gfx) $< $@ -num_tiles 508
$(tilesetdir)/secondary/battle_frontier_outside_east/tiles.4bpp: $(tilesetdir)/secondary/battle_frontier_outside_east/tiles.png
- $(4bpp) $< -num_tiles 508
+ $(gfx) $< $@ -num_tiles 508
$(tilesetdir)/primary/inside_building/tiles.4bpp: $(tilesetdir)/primary/inside_building/tiles.png
- $(4bpp) $< -num_tiles 502
+ $(gfx) $< $@ -num_tiles 502
$(tilesetdir)/secondary/shop/tiles.4bpp: $(tilesetdir)/secondary/shop/tiles.png
- $(4bpp) $< -num_tiles 502
+ $(gfx) $< $@ -num_tiles 502
$(tilesetdir)/secondary/pokemon_center/tiles.4bpp: $(tilesetdir)/secondary/pokemon_center/tiles.png
- $(4bpp) $< -num_tiles 478
+ $(gfx) $< $@ -num_tiles 478
$(tilesetdir)/secondary/cave/tiles.4bpp: $(tilesetdir)/secondary/cave/tiles.png
- $(4bpp) $< -num_tiles 425
+ $(gfx) $< $@ -num_tiles 425
$(tilesetdir)/secondary/pokemon_school/tiles.4bpp: $(tilesetdir)/secondary/pokemon_school/tiles.png
- $(4bpp) $< -num_tiles 278
+ $(gfx) $< $@ -num_tiles 278
$(tilesetdir)/secondary/pokemon_fan_club/tiles.4bpp: $(tilesetdir)/secondary/pokemon_fan_club/tiles.png
- $(4bpp) $< -num_tiles 319
+ $(gfx) $< $@ -num_tiles 319
$(tilesetdir)/secondary/unused_1/tiles.4bpp: $(tilesetdir)/secondary/unused_1/tiles.png
- $(4bpp) $< -num_tiles 17
+ $(gfx) $< $@ -num_tiles 17
$(tilesetdir)/secondary/meteor_falls/tiles.4bpp: $(tilesetdir)/secondary/meteor_falls/tiles.png
- $(4bpp) $< -num_tiles 460
+ $(gfx) $< $@ -num_tiles 460
$(tilesetdir)/secondary/oceanic_museum/tiles.4bpp: $(tilesetdir)/secondary/oceanic_museum/tiles.png
- $(4bpp) $< -num_tiles 319
+ $(gfx) $< $@ -num_tiles 319
$(tilesetdir)/secondary/cable_club/unknown_tiles.4bpp: $(tilesetdir)/secondary/cable_club/unknown_tiles.png
- $(4bpp) $< -num_tiles 120
+ $(gfx) $< $@ -num_tiles 120
$(tilesetdir)/secondary/seashore_house/tiles.4bpp: $(tilesetdir)/secondary/seashore_house/tiles.png
- $(4bpp) $< -num_tiles 312
+ $(gfx) $< $@ -num_tiles 312
$(tilesetdir)/secondary/pretty_petal_flower_shop/tiles.4bpp: $(tilesetdir)/secondary/pretty_petal_flower_shop/tiles.png
- $(4bpp) $< -num_tiles 345
+ $(gfx) $< $@ -num_tiles 345
$(tilesetdir)/secondary/pokemon_day_care/tiles.4bpp: $(tilesetdir)/secondary/pokemon_day_care/tiles.png
- $(4bpp) $< -num_tiles 355
+ $(gfx) $< $@ -num_tiles 355
$(tilesetdir)/secondary/secret_base/brown_cave/unused_tiles.4bpp: $(tilesetdir)/secondary/secret_base/brown_cave/tiles.png
- $(4bpp) $< -output $@ -num_tiles 82
+ $(gfx) $< $@ -num_tiles 82
$(tilesetdir)/secondary/secret_base/tree/unused_tiles.4bpp: $(tilesetdir)/secondary/secret_base/tree/tiles.png
- $(4bpp) $< -output $@ -num_tiles 82
+ $(gfx) $< $@ -num_tiles 82
$(tilesetdir)/secondary/secret_base/shrub/unused_tiles.4bpp: $(tilesetdir)/secondary/secret_base/shrub/tiles.png
- $(4bpp) $< -output $@ -num_tiles 82
+ $(gfx) $< $@ -num_tiles 82
$(tilesetdir)/secondary/secret_base/blue_cave/unused_tiles.4bpp: $(tilesetdir)/secondary/secret_base/blue_cave/tiles.png
- $(4bpp) $< -output $@ -num_tiles 82
+ $(gfx) $< $@ -num_tiles 82
$(tilesetdir)/secondary/secret_base/yellow_cave/unused_tiles.4bpp: $(tilesetdir)/secondary/secret_base/yellow_cave/tiles.png
- $(4bpp) $< -output $@ -num_tiles 82
+ $(gfx) $< $@ -num_tiles 82
$(tilesetdir)/secondary/secret_base/red_cave/unused_tiles.4bpp: $(tilesetdir)/secondary/secret_base/red_cave/tiles.png
- $(4bpp) $< -output $@ -num_tiles 82
+ $(gfx) $< $@ -num_tiles 82
$(tilesetdir)/secondary/secret_base/brown_cave/tiles.4bpp: $(tilesetdir)/secondary/secret_base/brown_cave/tiles.png
- $(4bpp) $< -num_tiles 83
+ $(gfx) $< $@ -num_tiles 83
$(tilesetdir)/secondary/secret_base/tree/tiles.4bpp: $(tilesetdir)/secondary/secret_base/tree/tiles.png
- $(4bpp) $< -num_tiles 83
+ $(gfx) $< $@ -num_tiles 83
$(tilesetdir)/secondary/secret_base/shrub/tiles.4bpp: $(tilesetdir)/secondary/secret_base/shrub/tiles.png
- $(4bpp) $< -num_tiles 83
+ $(gfx) $< $@ -num_tiles 83
$(tilesetdir)/secondary/secret_base/blue_cave/tiles.4bpp: $(tilesetdir)/secondary/secret_base/blue_cave/tiles.png
- $(4bpp) $< -num_tiles 83
+ $(gfx) $< $@ -num_tiles 83
$(tilesetdir)/secondary/secret_base/yellow_cave/tiles.4bpp: $(tilesetdir)/secondary/secret_base/yellow_cave/tiles.png
- $(4bpp) $< -num_tiles 83
+ $(gfx) $< $@ -num_tiles 83
$(tilesetdir)/secondary/secret_base/red_cave/tiles.4bpp: $(tilesetdir)/secondary/secret_base/red_cave/tiles.png
- $(4bpp) $< -num_tiles 83
+ $(gfx) $< $@ -num_tiles 83
$(tilesetdir)/secondary/inside_of_truck/tiles.4bpp: $(tilesetdir)/secondary/inside_of_truck/tiles.png
- $(4bpp) $< -num_tiles 62
+ $(gfx) $< $@ -num_tiles 62
$(tilesetdir)/secondary/contest/tiles.4bpp: $(tilesetdir)/secondary/contest/tiles.png
- $(4bpp) $< -num_tiles 430
+ $(gfx) $< $@ -num_tiles 430
$(tilesetdir)/secondary/lilycove_museum/tiles.4bpp: $(tilesetdir)/secondary/lilycove_museum/tiles.png
- $(4bpp) $< -num_tiles 431
+ $(gfx) $< $@ -num_tiles 431
$(tilesetdir)/secondary/lab/tiles.4bpp: $(tilesetdir)/secondary/lab/tiles.png
- $(4bpp) $< -num_tiles 500
+ $(gfx) $< $@ -num_tiles 500
$(tilesetdir)/secondary/underwater/tiles.4bpp: $(tilesetdir)/secondary/underwater/tiles.png
- $(4bpp) $< -num_tiles 500
+ $(gfx) $< $@ -num_tiles 500
$(tilesetdir)/secondary/generic_building/tiles.4bpp: $(tilesetdir)/secondary/generic_building/tiles.png
- $(4bpp) $< -num_tiles 509
+ $(gfx) $< $@ -num_tiles 509
$(tilesetdir)/secondary/mauville_game_corner/tiles.4bpp: $(tilesetdir)/secondary/mauville_game_corner/tiles.png
- $(4bpp) $< -num_tiles 469
+ $(gfx) $< $@ -num_tiles 469
$(tilesetdir)/secondary/unused_2/tiles.4bpp: $(tilesetdir)/secondary/unused_2/tiles.png
- $(4bpp) $< -num_tiles 150
+ $(gfx) $< $@ -num_tiles 150
$(tilesetdir)/secondary/rustboro_gym/tiles.4bpp: $(tilesetdir)/secondary/rustboro_gym/tiles.png
- $(4bpp) $< -num_tiles 60
+ $(gfx) $< $@ -num_tiles 60
$(tilesetdir)/secondary/dewford_gym/tiles.4bpp: $(tilesetdir)/secondary/dewford_gym/tiles.png
- $(4bpp) $< -num_tiles 61
+ $(gfx) $< $@ -num_tiles 61
$(tilesetdir)/secondary/lavaridge_gym/tiles.4bpp: $(tilesetdir)/secondary/lavaridge_gym/tiles.png
- $(4bpp) $< -num_tiles 54
+ $(gfx) $< $@ -num_tiles 54
$(tilesetdir)/secondary/petalburg_gym/tiles.4bpp: $(tilesetdir)/secondary/petalburg_gym/tiles.png
- $(4bpp) $< -num_tiles 148
+ $(gfx) $< $@ -num_tiles 148
$(tilesetdir)/secondary/fortree_gym/tiles.4bpp: $(tilesetdir)/secondary/fortree_gym/tiles.png
- $(4bpp) $< -num_tiles 61
+ $(gfx) $< $@ -num_tiles 61
$(tilesetdir)/secondary/mossdeep_gym/tiles.4bpp: $(tilesetdir)/secondary/mossdeep_gym/tiles.png
- $(4bpp) $< -num_tiles 82
+ $(gfx) $< $@ -num_tiles 82
$(tilesetdir)/secondary/sootopolis_gym/tiles.4bpp: $(tilesetdir)/secondary/sootopolis_gym/tiles.png
- $(4bpp) $< -num_tiles 484
+ $(gfx) $< $@ -num_tiles 484
$(tilesetdir)/secondary/trick_house_puzzle/tiles.4bpp: $(tilesetdir)/secondary/trick_house_puzzle/tiles.png
- $(4bpp) $< -num_tiles 294
+ $(gfx) $< $@ -num_tiles 294
$(tilesetdir)/secondary/inside_ship/tiles.4bpp: $(tilesetdir)/secondary/inside_ship/tiles.png
- $(4bpp) $< -num_tiles 342
+ $(gfx) $< $@ -num_tiles 342
$(tilesetdir)/secondary/elite_four/tiles.4bpp: $(tilesetdir)/secondary/elite_four/tiles.png
- $(4bpp) $< -num_tiles 505
+ $(gfx) $< $@ -num_tiles 505
$(tilesetdir)/secondary/battle_frontier/tiles.4bpp: $(tilesetdir)/secondary/battle_frontier/tiles.png
- $(4bpp) $< -num_tiles 310
+ $(gfx) $< $@ -num_tiles 310
$(tilesetdir)/secondary/battle_factory/tiles.4bpp: $(tilesetdir)/secondary/battle_factory/tiles.png
- $(4bpp) $< -num_tiles 424
+ $(gfx) $< $@ -num_tiles 424
$(tilesetdir)/secondary/battle_pike/tiles.4bpp: $(tilesetdir)/secondary/battle_pike/tiles.png
- $(4bpp) $< -num_tiles 382
+ $(gfx) $< $@ -num_tiles 382
$(tilesetdir)/secondary/mirage_tower/tiles.4bpp: $(tilesetdir)/secondary/mirage_tower/tiles.png
- $(4bpp) $< -num_tiles 420
+ $(gfx) $< $@ -num_tiles 420
$(tilesetdir)/secondary/mossdeep_game_corner/tiles.4bpp: $(tilesetdir)/secondary/mossdeep_game_corner/tiles.png
- $(4bpp) $< -num_tiles 95
+ $(gfx) $< $@ -num_tiles 95
-$(tilesetdir)/secondary/island_habor/tiles.4bpp: $(tilesetdir)/secondary/island_habor/tiles.png
- $(4bpp) $< -num_tiles 503
+$(tilesetdir)/secondary/island_harbor/tiles.4bpp: $(tilesetdir)/secondary/island_harbor/tiles.png
+ $(gfx) $< $@ -num_tiles 503
$(tilesetdir)/secondary/trainer_hill/tiles.4bpp: $(tilesetdir)/secondary/trainer_hill/tiles.png
- $(4bpp) $< -num_tiles 374
+ $(gfx) $< $@ -num_tiles 374
$(tilesetdir)/secondary/navel_rock/tiles.4bpp: $(tilesetdir)/secondary/navel_rock/tiles.png
- $(4bpp) $< -num_tiles 420
+ $(gfx) $< $@ -num_tiles 420
$(tilesetdir)/secondary/battle_frontier_ranking_hall/tiles.4bpp: $(tilesetdir)/secondary/battle_frontier_ranking_hall/tiles.png
- $(4bpp) $< -num_tiles 136
+ $(gfx) $< $@ -num_tiles 136
$(tilesetdir)/secondary/mystery_events_house/tiles.4bpp: $(tilesetdir)/secondary/mystery_events_house/tiles.png
- $(4bpp) $< -num_tiles 509
+ $(gfx) $< $@ -num_tiles 509
+
+fontdir := data/graphics/fonts
+
+$(fontdir)/font0.latfont: $(fontdir)/font0_latin.png
+ $(gfx) $< $@
+
+$(fontdir)/font1.latfont: $(fontdir)/font1_latin.png
+ $(gfx) $< $@
+
+$(fontdir)/font2.latfont: $(fontdir)/font2_latin.png
+ $(gfx) $< $@
+
+$(fontdir)/font7.latfont: $(fontdir)/font7_latin.png
+ $(gfx) $< $@
+
+$(fontdir)/font8.latfont: $(fontdir)/font8_latin.png
+ $(gfx) $< $@
+
+$(fontdir)/font0.hwjpnfont: $(fontdir)/font0_japanese.png
+ $(gfx) $< $@
+
+$(fontdir)/font1.hwjpnfont: $(fontdir)/font1_japanese.png
+ $(gfx) $< $@
+
+$(fontdir)/font9.hwjpnfont: $(fontdir)/font9_japanese.png
+ $(gfx) $< $@
+
+$(fontdir)/font2.fwjpnfont: $(fontdir)/font2_japanese.png
+ $(gfx) $< $@
+
+$(fontdir)/font6.fwjpnfont: $(fontdir)/font6_braille.png
+ $(gfx) $< $@
+
+$(fontdir)/unused_1.fwjpnfont: $(fontdir)/unused_japanese_font_1.png
+ $(gfx) $< $@
+
+$(fontdir)/unused_2.fwjpnfont: $(fontdir)/unused_japanese_font_2.png
+ $(gfx) $< $@
diff --git a/tools/gbagfx/Makefile b/tools/gbagfx/Makefile
index 1bf37e301..e7f089445 100644
--- a/tools/gbagfx/Makefile
+++ b/tools/gbagfx/Makefile
@@ -1,14 +1,14 @@
CC = gcc
-CFLAGS = -Wall -std=c11 -O2
+CFLAGS = -Wall -Wextra -std=c11 -O2
LIBS = -lz -lpng
-SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c util.c
+SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c util.c font.c
.PHONY: clean
-gbagfx: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h util.h
+gbagfx: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h util.h font.h
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LIBS)
clean:
diff --git a/tools/gbagfx/convert_png.c b/tools/gbagfx/convert_png.c
index ffc1b3d41..f6a30804a 100644
--- a/tools/gbagfx/convert_png.c
+++ b/tools/gbagfx/convert_png.c
@@ -134,7 +134,7 @@ void WritePng(char *path, struct Image *image)
if (image->hasPalette) {
SetPngPalette(png_ptr, info_ptr, &image->palette);
- if (image->isObject) {
+ if (image->hasTransparency) {
png_byte trans = 0;
png_set_tRNS(png_ptr, info_ptr, &trans, 1, 0);
}
diff --git a/tools/gbagfx/font.c b/tools/gbagfx/font.c
new file mode 100644
index 000000000..0dd6fbc3e
--- /dev/null
+++ b/tools/gbagfx/font.c
@@ -0,0 +1,326 @@
+// Copyright (c) 2015 YamaArashi
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include "global.h"
+#include "font.h"
+#include "gfx.h"
+#include "util.h"
+
+unsigned char gFontPalette[][3] = {
+ {0x90, 0xC8, 0xFF}, // bg (saturated blue that contrasts well with the shadow color)
+ {0x38, 0x38, 0x38}, // fg (dark grey)
+ {0xD8, 0xD8, 0xD8}, // shadow (light grey)
+ {0xFF, 0xFF, 0xFF} // box (white)
+};
+
+static void ConvertFromLatinFont(unsigned char *src, unsigned char *dest, unsigned int numRows)
+{
+ unsigned int srcPixelsOffset = 0;
+
+ for (unsigned int row = 0; row < numRows; row++) {
+ for (unsigned int column = 0; column < 16; column++) {
+ for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) {
+ unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8);
+
+ for (unsigned int i = 0; i < 8; i++) {
+ unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i;
+ unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4);
+
+ dest[destPixelsOffset] = src[srcPixelsOffset + 1];
+ dest[destPixelsOffset + 1] = src[srcPixelsOffset];
+
+ srcPixelsOffset += 2;
+ }
+ }
+ }
+ }
+}
+
+static void ConvertToLatinFont(unsigned char *src, unsigned char *dest, unsigned int numRows)
+{
+ unsigned int destPixelsOffset = 0;
+
+ for (unsigned int row = 0; row < numRows; row++) {
+ for (unsigned int column = 0; column < 16; column++) {
+ for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) {
+ unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8);
+
+ for (unsigned int i = 0; i < 8; i++) {
+ unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i;
+ unsigned int srcPixelsOffset = (pixelsY * 64) + (pixelsX / 4);
+
+ dest[destPixelsOffset] = src[srcPixelsOffset + 1];
+ dest[destPixelsOffset + 1] = src[srcPixelsOffset];
+
+ destPixelsOffset += 2;
+ }
+ }
+ }
+ }
+}
+
+static void ConvertFromHalfwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows)
+{
+ for (unsigned int row = 0; row < numRows; row++) {
+ for (unsigned int column = 0; column < 16; column++) {
+ unsigned int glyphIndex = (row * 16) + column;
+
+ for (unsigned int glyphTile = 0; glyphTile < 2; glyphTile++) {
+ unsigned int pixelsX = column * 8;
+ unsigned int srcPixelsOffset = 512 * (glyphIndex >> 4) + 16 * (glyphIndex & 0xF) + 256 * glyphTile;
+
+ for (unsigned int i = 0; i < 8; i++) {
+ unsigned int pixelsY = (row * 16) + (glyphTile * 8) + i;
+ unsigned int destPixelsOffset = (pixelsY * 32) + (pixelsX / 4);
+
+ dest[destPixelsOffset] = src[srcPixelsOffset + 1];
+ dest[destPixelsOffset + 1] = src[srcPixelsOffset];
+
+ srcPixelsOffset += 2;
+ }
+ }
+ }
+ }
+}
+
+static void ConvertToHalfwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows)
+{
+ for (unsigned int row = 0; row < numRows; row++) {
+ for (unsigned int column = 0; column < 16; column++) {
+ unsigned int glyphIndex = (row * 16) + column;
+
+ for (unsigned int glyphTile = 0; glyphTile < 2; glyphTile++) {
+ unsigned int pixelsX = column * 8;
+ unsigned int destPixelsOffset = 512 * (glyphIndex >> 4) + 16 * (glyphIndex & 0xF) + 256 * glyphTile;
+
+ for (unsigned int i = 0; i < 8; i++) {
+ unsigned int pixelsY = (row * 16) + (glyphTile * 8) + i;
+ unsigned int srcPixelsOffset = (pixelsY * 32) + (pixelsX / 4);
+
+ dest[destPixelsOffset] = src[srcPixelsOffset + 1];
+ dest[destPixelsOffset + 1] = src[srcPixelsOffset];
+
+ destPixelsOffset += 2;
+ }
+ }
+ }
+ }
+}
+
+static void ConvertFromFullwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows)
+{
+ for (unsigned int row = 0; row < numRows; row++) {
+ for (unsigned int column = 0; column < 16; column++) {
+ unsigned int glyphIndex = (row * 16) + column;
+
+ for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) {
+ unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8);
+ unsigned int srcPixelsOffset = 512 * (glyphIndex >> 3) + 32 * (glyphIndex & 7) + 256 * (glyphTile >> 1) + 16 * (glyphTile & 1);
+
+ for (unsigned int i = 0; i < 8; i++) {
+ unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i;
+ unsigned int destPixelsOffset = (pixelsY * 64) + (pixelsX / 4);
+
+ dest[destPixelsOffset] = src[srcPixelsOffset + 1];
+ dest[destPixelsOffset + 1] = src[srcPixelsOffset];
+
+ srcPixelsOffset += 2;
+ }
+ }
+ }
+ }
+}
+
+static void ConvertToFullwidthJapaneseFont(unsigned char *src, unsigned char *dest, unsigned int numRows)
+{
+ for (unsigned int row = 0; row < numRows; row++) {
+ for (unsigned int column = 0; column < 16; column++) {
+ unsigned int glyphIndex = (row * 16) + column;
+
+ for (unsigned int glyphTile = 0; glyphTile < 4; glyphTile++) {
+ unsigned int pixelsX = (column * 16) + ((glyphTile & 1) * 8);
+ unsigned int destPixelsOffset = 512 * (glyphIndex >> 3) + 32 * (glyphIndex & 7) + 256 * (glyphTile >> 1) + 16 * (glyphTile & 1);
+
+ for (unsigned int i = 0; i < 8; i++) {
+ unsigned int pixelsY = (row * 16) + ((glyphTile >> 1) * 8) + i;
+ unsigned int srcPixelsOffset = (pixelsY * 64) + (pixelsX / 4);
+
+ dest[destPixelsOffset] = src[srcPixelsOffset + 1];
+ dest[destPixelsOffset + 1] = src[srcPixelsOffset];
+
+ destPixelsOffset += 2;
+ }
+ }
+ }
+ }
+}
+
+static void SetFontPalette(struct Image *image)
+{
+ image->hasPalette = true;
+
+ image->palette.numColors = 4;
+
+ for (int i = 0; i < image->palette.numColors; i++) {
+ image->palette.colors[i].red = gFontPalette[i][0];
+ image->palette.colors[i].green = gFontPalette[i][1];
+ image->palette.colors[i].blue = gFontPalette[i][2];
+ }
+
+ image->hasTransparency = false;
+}
+
+void ReadLatinFont(char *path, struct Image *image)
+{
+ int fileSize;
+ unsigned char *buffer = ReadWholeFile(path, &fileSize);
+
+ int numGlyphs = fileSize / 64;
+
+ if (numGlyphs % 16 != 0)
+ FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs);
+
+ int numRows = numGlyphs / 16;
+
+ image->width = 256;
+ image->height = numRows * 16;
+ image->bitDepth = 2;
+ image->pixels = malloc(fileSize);
+
+ if (image->pixels == NULL)
+ FATAL_ERROR("Failed to allocate memory for font.\n");
+
+ ConvertFromLatinFont(buffer, image->pixels, numRows);
+
+ free(buffer);
+
+ SetFontPalette(image);
+}
+
+void WriteLatinFont(char *path, struct Image *image)
+{
+ if (image->width != 256)
+ FATAL_ERROR("The width of the font image (%d) is not 256.\n", image->width);
+
+ if (image->height % 16 != 0)
+ FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height);
+
+ int numRows = image->height / 16;
+ int bufferSize = numRows * 16 * 64;
+ unsigned char *buffer = malloc(bufferSize);
+
+ if (buffer == NULL)
+ FATAL_ERROR("Failed to allocate memory for font.\n");
+
+ ConvertToLatinFont(image->pixels, buffer, numRows);
+
+ WriteWholeFile(path, buffer, bufferSize);
+
+ free(buffer);
+}
+
+void ReadHalfwidthJapaneseFont(char *path, struct Image *image)
+{
+ int fileSize;
+ unsigned char *buffer = ReadWholeFile(path, &fileSize);
+
+ int glyphSize = 32;
+
+ if (fileSize % glyphSize != 0)
+ FATAL_ERROR("The file size (%d) is not a multiple of %d.\n", fileSize, glyphSize);
+
+ int numGlyphs = fileSize / glyphSize;
+
+ if (numGlyphs % 16 != 0)
+ FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs);
+
+ int numRows = numGlyphs / 16;
+
+ image->width = 128;
+ image->height = numRows * 16;
+ image->bitDepth = 2;
+ image->pixels = malloc(fileSize);
+
+ if (image->pixels == NULL)
+ FATAL_ERROR("Failed to allocate memory for font.\n");
+
+ ConvertFromHalfwidthJapaneseFont(buffer, image->pixels, numRows);
+
+ free(buffer);
+
+ SetFontPalette(image);
+}
+
+void WriteHalfwidthJapaneseFont(char *path, struct Image *image)
+{
+ if (image->width != 128)
+ FATAL_ERROR("The width of the font image (%d) is not 128.\n", image->width);
+
+ if (image->height % 16 != 0)
+ FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height);
+
+ int numRows = image->height / 16;
+ int bufferSize = numRows * 16 * 32;
+ unsigned char *buffer = malloc(bufferSize);
+
+ if (buffer == NULL)
+ FATAL_ERROR("Failed to allocate memory for font.\n");
+
+ ConvertToHalfwidthJapaneseFont(image->pixels, buffer, numRows);
+
+ WriteWholeFile(path, buffer, bufferSize);
+
+ free(buffer);
+}
+
+void ReadFullwidthJapaneseFont(char *path, struct Image *image)
+{
+ int fileSize;
+ unsigned char *buffer = ReadWholeFile(path, &fileSize);
+
+ int numGlyphs = fileSize / 64;
+
+ if (numGlyphs % 16 != 0)
+ FATAL_ERROR("The number of glyphs (%d) is not a multiple of 16.\n", numGlyphs);
+
+ int numRows = numGlyphs / 16;
+
+ image->width = 256;
+ image->height = numRows * 16;
+ image->bitDepth = 2;
+ image->pixels = malloc(fileSize);
+
+ if (image->pixels == NULL)
+ FATAL_ERROR("Failed to allocate memory for font.\n");
+
+ ConvertFromFullwidthJapaneseFont(buffer, image->pixels, numRows);
+
+ free(buffer);
+
+ SetFontPalette(image);
+}
+
+void WriteFullwidthJapaneseFont(char *path, struct Image *image)
+{
+ if (image->width != 256)
+ FATAL_ERROR("The width of the font image (%d) is not 256.\n", image->width);
+
+ if (image->height % 16 != 0)
+ FATAL_ERROR("The height of the font image (%d) is not a multiple of 16.\n", image->height);
+
+ int numRows = image->height / 16;
+ int bufferSize = numRows * 16 * 64;
+ unsigned char *buffer = malloc(bufferSize);
+
+ if (buffer == NULL)
+ FATAL_ERROR("Failed to allocate memory for font.\n");
+
+ ConvertToFullwidthJapaneseFont(image->pixels, buffer, numRows);
+
+ WriteWholeFile(path, buffer, bufferSize);
+
+ free(buffer);
+}
diff --git a/tools/gbagfx/font.h b/tools/gbagfx/font.h
new file mode 100644
index 000000000..88c61b638
--- /dev/null
+++ b/tools/gbagfx/font.h
@@ -0,0 +1,16 @@
+// Copyright (c) 2015 YamaArashi
+
+#ifndef FONT_H
+#define FONT_H
+
+#include<stdbool.h>
+#include "gfx.h"
+
+void ReadLatinFont(char *path, struct Image *image);
+void WriteLatinFont(char *path, struct Image *image);
+void ReadHalfwidthJapaneseFont(char *path, struct Image *image);
+void WriteHalfwidthJapaneseFont(char *path, struct Image *image);
+void ReadFullwidthJapaneseFont(char *path, struct Image *image);
+void WriteFullwidthJapaneseFont(char *path, struct Image *image);
+
+#endif // FONT_H
diff --git a/tools/gbagfx/gfx.h b/tools/gbagfx/gfx.h
index 473640d44..ecd436652 100644
--- a/tools/gbagfx/gfx.h
+++ b/tools/gbagfx/gfx.h
@@ -24,7 +24,7 @@ struct Image {
unsigned char *pixels;
bool hasPalette;
struct Palette palette;
- bool isObject;
+ bool hasTransparency;
};
void ReadImage(char *path, int tilesWidth, int bitDepth, struct Image *image, bool invertColors);
diff --git a/tools/gbagfx/global.h b/tools/gbagfx/global.h
index ce4d6925d..65dd351d2 100644
--- a/tools/gbagfx/global.h
+++ b/tools/gbagfx/global.h
@@ -14,6 +14,8 @@ do { \
exit(1); \
} while (0)
+#define UNUSED
+
#else
#define FATAL_ERROR(format, ...) \
@@ -22,14 +24,8 @@ do { \
exit(1); \
} while (0)
-#endif // _MSC_VER
-
-#define GBAGFX_MAX_PATH 255
+#define UNUSED __attribute__((__unused__))
-#define CHECK_PATH_LENGTH(path) \
-do { \
- if (strlen(path) > GBAGFX_MAX_PATH) \
- FATAL_ERROR("\"%s\" is too long a path.\n", path); \
-} while (0)
+#endif // _MSC_VER
#endif // GLOBAL_H
diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c
index 472a87f79..56a1c2c7b 100644
--- a/tools/gbagfx/main.c
+++ b/tools/gbagfx/main.c
@@ -9,25 +9,18 @@
#include "convert_png.h"
#include "jasc_pal.h"
#include "lz.h"
+#include "font.h"
-void ConvertToPng(char *imageFilePath, char *outputFilePath, char *paletteFilePath, bool isObject, int width)
+struct CommandHandler
{
- struct Image image;
- int bitDepth = 0;
-
- char *extension = GetFileExtension(imageFilePath);
-
- if (extension == NULL)
- FATAL_ERROR("\"%s\" has no file extension.\n", imageFilePath);
+ const char *inputFileExtension;
+ const char *outputFileExtension;
+ void(*function)(char *inputPath, char *outputPath, int argc, char **argv);
+};
- if (strcmp(extension, "1bpp") == 0)
- bitDepth = 1;
- else if (strcmp(extension, "4bpp") == 0)
- bitDepth = 4;
- else if (strcmp(extension, "8bpp") == 0)
- bitDepth = 8;
- else
- FATAL_ERROR("Unexpected file extension \"%s\". Expected \"1bpp\", \"4bpp\", or \"8bpp\".\n", extension);
+void ConvertGbaToPng(char *inputPath, char *outputPath, int width, int bitDepth, char *paletteFilePath, bool hasTransparency)
+{
+ struct Image image;
if (paletteFilePath != NULL) {
ReadGbaPalette(paletteFilePath, &image.palette);
@@ -36,249 +29,249 @@ void ConvertToPng(char *imageFilePath, char *outputFilePath, char *paletteFilePa
image.hasPalette = false;
}
- ReadImage(imageFilePath, width, bitDepth, &image, !image.hasPalette);
-
- image.isObject = isObject;
+ ReadImage(inputPath, width, bitDepth, &image, !image.hasPalette);
- if (outputFilePath == NULL) {
- ChangeFileExtension(imageFilePath, "png");
- outputFilePath = imageFilePath;
- }
+ image.hasTransparency = hasTransparency;
- WritePng(outputFilePath, &image);
+ WritePng(outputPath, &image);
FreeImage(&image);
}
-void ConvertFromPng(char *imageFilePath, char *outputFilePath, int numTiles, int bitDepth)
+void ConvertPngToGba(char *inputPath, char *outputPath, int numTiles, int bitDepth)
{
struct Image image;
image.bitDepth = bitDepth;
- ExpectFileExtension(imageFilePath, "png");
-
- ReadPng(imageFilePath, &image);
-
- if (outputFilePath == NULL) {
- char newExtension[5];
- snprintf(newExtension, 5, "%dbpp", bitDepth);
- ChangeFileExtension(imageFilePath, newExtension);
- outputFilePath = imageFilePath;
- }
+ ReadPng(inputPath, &image);
- WriteImage(outputFilePath, numTiles, bitDepth, &image, !image.hasPalette);
+ WriteImage(outputPath, numTiles, bitDepth, &image, !image.hasPalette);
FreeImage(&image);
}
-void ConvertToJascPalette(char *paletteFilePath)
+void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **argv)
{
- struct Palette palette;
+ char *inputFileExtension = GetFileExtension(inputPath);
+ int bitDepth = inputFileExtension[0] - '0';
+ char *paletteFilePath;
+ bool hasPalette = false;
+ bool hasTransparency = false;
+ int width = 1;
- ExpectFileExtension(paletteFilePath, "gbapal");
+ for (int i = 3; i < argc; i++) {
+ char *option = argv[i];
- ReadGbaPalette(paletteFilePath, &palette);
+ if (strcmp(option, "-palette") == 0) {
+ if (i + 1 >= argc)
+ FATAL_ERROR("No palette file path following \"-palette\".\n");
- ChangeFileExtension(paletteFilePath, "pal");
+ i++;
- WriteJascPalette(paletteFilePath, &palette);
-}
+ paletteFilePath = argv[i];
-void ConvertFromJascPalette(char *paletteFilePath)
-{
- struct Palette palette;
+ hasPalette = true;
+ } else if (strcmp(option, "-object") == 0) {
+ hasTransparency = true;
+ } else if (strcmp(option, "-width") == 0) {
+ if (i + 1 >= argc)
+ FATAL_ERROR("No width following \"-width\".\n");
- ExpectFileExtension(paletteFilePath, "pal");
+ i++;
- ReadJascPalette(paletteFilePath, &palette);
+ if (!ParseNumber(argv[i], NULL, 10, &width))
+ FATAL_ERROR("Failed to parse width.\n");
- ChangeFileExtension(paletteFilePath, "gbapal");
+ if (width < 1)
+ FATAL_ERROR("Width must be positive.\n");
+ } else {
+ FATAL_ERROR("Unrecognized option \"%s\".\n", option);
+ }
+ }
- WriteGbaPalette(paletteFilePath, &palette);
+ ConvertGbaToPng(inputPath, outputPath, width, bitDepth, hasPalette ? paletteFilePath : NULL, hasTransparency);
}
-void LZCompressFile(char *path)
+void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **argv)
{
- int fileSize;
- unsigned char *buffer = ReadWholeFile(path, &fileSize);
+ char *outputFileExtension = GetFileExtension(outputPath);
+ int bitDepth = outputFileExtension[0] - '0';
+ int numTiles = 0;
- int compressedSize;
- unsigned char *compressedData = LZCompress(buffer, fileSize, &compressedSize);
+ for (int i = 3; i < argc; i++) {
+ char *option = argv[i];
- free(buffer);
+ if (strcmp(option, "-num_tiles") == 0) {
+ if (i + 1 >= argc)
+ FATAL_ERROR("No number of tiles following \"-num_tiles\".\n");
- AddFileExtension(path, "lz");
+ i++;
- WriteWholeFile(path, compressedData, compressedSize);
+ if (!ParseNumber(argv[i], NULL, 10, &numTiles))
+ FATAL_ERROR("Failed to parse number of tiles.\n");
- free(compressedData);
+ if (numTiles < 1)
+ FATAL_ERROR("Number of tiles must be positive.\n");
+ } else {
+ FATAL_ERROR("Unrecognized option \"%s\".\n", option);
+ }
+ }
+
+ ConvertPngToGba(inputPath, outputPath, numTiles, bitDepth);
}
-void LZDecompressFile(char *path)
+void HandleGbaToJascPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
{
- ExpectFileExtension(path, "lz");
-
- int fileSize;
- unsigned char *buffer = ReadWholeFile(path, &fileSize);
-
- int uncompressedSize;
- unsigned char *uncompressedData = LZDecompress(buffer, fileSize, &uncompressedSize);
-
- free(buffer);
-
- RemoveFileExtension(path);
-
- WriteWholeFile(path, uncompressedData, uncompressedSize);
+ struct Palette palette;
- free(uncompressedData);
+ ReadGbaPalette(inputPath, &palette);
+ WriteJascPalette(outputPath, &palette);
}
-int main(int argc, char **argv)
+void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
{
- if (argc < 2)
- FATAL_ERROR("No args.\n");
-
- char *command = argv[1];
-
- if (strcmp(command, "png") == 0) {
- if (argc < 3)
- FATAL_ERROR("No image file path arg.\n");
-
- CHECK_PATH_LENGTH(argv[2]);
-
- char imageFilePath[GBAGFX_MAX_PATH + 1];
- strcpy(imageFilePath, argv[2]);
-
- char *outputFilePath = NULL;
- char paletteFilePath[GBAGFX_MAX_PATH + 1];
- bool hasPalette = false;
- bool isObject = false;
- int width = 1;
-
- for (int i = 3; i < argc; i++) {
- char *option = argv[i];
-
- if (strcmp(option, "-output") == 0) {
- if (i + 1 >= argc)
- FATAL_ERROR("No output file path following \"-output\".\n");
+ struct Palette palette;
- i++;
+ ReadJascPalette(inputPath, &palette);
+ WriteGbaPalette(outputPath, &palette);
+}
- outputFilePath = argv[i];
- } else if (strcmp(option, "-palette") == 0) {
- if (i + 1 >= argc)
- FATAL_ERROR("No palette file path following \"-palette\".\n");
+void HandleLatinFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
+{
+ struct Image image;
- i++;
+ ReadLatinFont(inputPath, &image);
+ WritePng(outputPath, &image);
- CHECK_PATH_LENGTH(argv[i]);
+ FreeImage(&image);
+}
- strcpy(paletteFilePath, argv[i]);
+void HandlePngToLatinFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
+{
+ struct Image image;
- hasPalette = true;
- } else if (strcmp(option, "-object") == 0) {
- isObject = true;
- } else if (strcmp(option, "-width") == 0) {
- if (i + 1 >= argc)
- FATAL_ERROR("No width following \"-width\".\n");
+ image.bitDepth = 2;
- i++;
+ ReadPng(inputPath, &image);
+ WriteLatinFont(outputPath, &image);
- if (!ParseNumber(argv[i], NULL, 10, &width))
- FATAL_ERROR("Failed to parse width.\n");
+ FreeImage(&image);
+}
- if (width < 1)
- FATAL_ERROR("Width must be positive.\n");
- } else {
- FATAL_ERROR("Unrecognized option \"%s\".\n", option);
- }
- }
+void HandleHalfwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
+{
+ struct Image image;
- ConvertToPng(imageFilePath, outputFilePath, hasPalette ? paletteFilePath : NULL, isObject, width);
- } else if (strcmp(command, "1bpp") == 0 || strcmp(command, "4bpp") == 0 || strcmp(command, "8bpp") == 0) {
- if (argc < 3)
- FATAL_ERROR("No image file path arg.\n");
+ ReadHalfwidthJapaneseFont(inputPath, &image);
+ WritePng(outputPath, &image);
- CHECK_PATH_LENGTH(argv[2]);
+ FreeImage(&image);
+}
- char imageFilePath[GBAGFX_MAX_PATH + 1];
- strcpy(imageFilePath, argv[2]);
+void HandlePngToHalfwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
+{
+ struct Image image;
- char *outputFilePath = NULL;
- int numTiles = 0;
- int bitDepth = command[0] - '0';
+ image.bitDepth = 2;
- for (int i = 3; i < argc; i++) {
- char *option = argv[i];
+ ReadPng(inputPath, &image);
+ WriteHalfwidthJapaneseFont(outputPath, &image);
- if (strcmp(option, "-output") == 0) {
- if (i + 1 >= argc)
- FATAL_ERROR("No output file path following \"-output\".\n");
+ FreeImage(&image);
+}
- i++;
+void HandleFullwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
+{
+ struct Image image;
- outputFilePath = argv[i];
- } else if (strcmp(option, "-num_tiles") == 0) {
- if (i + 1 >= argc)
- FATAL_ERROR("No number of tiles following \"-num_tiles\".\n");
+ ReadFullwidthJapaneseFont(inputPath, &image);
+ WritePng(outputPath, &image);
- i++;
+ FreeImage(&image);
+}
- if (!ParseNumber(argv[i], NULL, 10, &numTiles))
- FATAL_ERROR("Failed to parse number of tiles.\n");
+void HandlePngToFullwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
+{
+ struct Image image;
- if (numTiles < 1)
- FATAL_ERROR("Number of tiles must be positive.\n");
- } else {
- FATAL_ERROR("Unrecognized option \"%s\".\n", option);
- }
- }
+ image.bitDepth = 2;
- ConvertFromPng(imageFilePath, outputFilePath, numTiles, bitDepth);
- } else if (strcmp(command, "pal") == 0) {
- if (argc < 3)
- FATAL_ERROR("No palette file path arg.\n");
+ ReadPng(inputPath, &image);
+ WriteFullwidthJapaneseFont(outputPath, &image);
- CHECK_PATH_LENGTH(argv[2]);
+ FreeImage(&image);
+}
- char paletteFilePath[GBAGFX_MAX_PATH + 1];
- strcpy(paletteFilePath, argv[2]);
+void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
+{
+ int fileSize;
+ unsigned char *buffer = ReadWholeFile(inputPath, &fileSize);
- ConvertToJascPalette(paletteFilePath);
- } else if (strcmp(command, "gbapal") == 0) {
- if (argc < 3)
- FATAL_ERROR("No palette file path arg.\n");
+ int compressedSize;
+ unsigned char *compressedData = LZCompress(buffer, fileSize, &compressedSize);
- CHECK_PATH_LENGTH(argv[2]);
+ free(buffer);
- char paletteFilePath[GBAGFX_MAX_PATH + 1];
- strcpy(paletteFilePath, argv[2]);
+ WriteWholeFile(outputPath, compressedData, compressedSize);
- ConvertFromJascPalette(paletteFilePath);
- } else if (strcmp(command, "lz") == 0) {
- if (argc < 3)
- FATAL_ERROR("No file path arg.\n");
+ free(compressedData);
+}
- CHECK_PATH_LENGTH(argv[2]);
+void HandleLZDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
+{
+ int fileSize;
+ unsigned char *buffer = ReadWholeFile(inputPath, &fileSize);
- char path[GBAGFX_MAX_PATH + 1];
- strcpy(path, argv[2]);
+ int uncompressedSize;
+ unsigned char *uncompressedData = LZDecompress(buffer, fileSize, &uncompressedSize);
- LZCompressFile(path);
- } else if (strcmp(command, "unlz") == 0) {
- if (argc < 3)
- FATAL_ERROR("No file path arg.\n");
+ free(buffer);
- CHECK_PATH_LENGTH(argv[2]);
+ WriteWholeFile(outputPath, uncompressedData, uncompressedSize);
- char path[GBAGFX_MAX_PATH + 1];
- strcpy(path, argv[2]);
+ free(uncompressedData);
+}
- LZDecompressFile(path);
- } else {
- FATAL_ERROR("Unrecognized command \"%s\".\n", command);
+int main(int argc, char **argv)
+{
+ if (argc < 3)
+ FATAL_ERROR("Usage: gbagfx INPUT_PATH OUTPUT_PATH [options...]\n");
+
+ struct CommandHandler handlers[] =
+ {
+ { "1bpp", "png", HandleGbaToPngCommand },
+ { "4bpp", "png", HandleGbaToPngCommand },
+ { "8bpp", "png", HandleGbaToPngCommand },
+ { "png", "1bpp", HandlePngToGbaCommand },
+ { "png", "4bpp", HandlePngToGbaCommand },
+ { "png", "8bpp", HandlePngToGbaCommand },
+ { "gbapal", "pal", HandleGbaToJascPaletteCommand },
+ { "pal", "gbapal", HandleJascToGbaPaletteCommand },
+ { "latfont", "png", HandleLatinFontToPngCommand },
+ { "png", "latfont", HandlePngToLatinFontCommand },
+ { "hwjpnfont", "png", HandleHalfwidthJapaneseFontToPngCommand },
+ { "png", "hwjpnfont", HandlePngToHalfwidthJapaneseFontCommand },
+ { "fwjpnfont", "png", HandleFullwidthJapaneseFontToPngCommand },
+ { "png", "fwjpnfont", HandlePngToFullwidthJapaneseFontCommand },
+ { NULL, "lz", HandleLZCompressCommand },
+ { "lz", NULL, HandleLZDecompressCommand },
+ { NULL, NULL, NULL }
+ };
+
+ char *inputPath = argv[1];
+ char *outputPath = argv[2];
+
+ for (int i = 0; handlers[i].function != NULL; i++) {
+ char *inputFileExtension = GetFileExtension(inputPath);
+ char *outputFileExtension = GetFileExtension(outputPath);
+
+ if ((handlers[i].inputFileExtension == NULL || strcmp(handlers[i].inputFileExtension, inputFileExtension) == 0)
+ && (handlers[i].outputFileExtension == NULL || strcmp(handlers[i].outputFileExtension, outputFileExtension) == 0)) {
+ handlers[i].function(inputPath, outputPath, argc, argv);
+ return 0;
+ }
}
- return 0;
+ FATAL_ERROR("Don't know how to convert \"%s\" to \"%s\".\n", inputPath, outputPath);
}
diff --git a/tools/gbagfx/util.c b/tools/gbagfx/util.c
index 180b93d9b..5af380184 100644
--- a/tools/gbagfx/util.c
+++ b/tools/gbagfx/util.c
@@ -58,48 +58,6 @@ char *GetFileExtension(char *path)
return extension;
}
-void ExpectFileExtension(char *path, char *expectedExtension)
-{
- char *extension = GetFileExtension(path);
-
- if (extension == NULL)
- FATAL_ERROR("\"%s\" has no file extension.\n", path);
-
- if (strcmp(extension, expectedExtension) != 0)
- FATAL_ERROR("Unexpected file extension \"%s\". Expected \"%s\".\n", extension, expectedExtension);
-}
-
-void AddFileExtension(char *path, char *extension)
-{
- int pathLength = strlen(path);
- int extensionLength = strlen(extension);
-
- if (pathLength + 1 + extensionLength > GBAGFX_MAX_PATH)
- FATAL_ERROR("\"%s\" is too long a path to add the extension \"%s\".\n", path, extension);
-
- path[pathLength] = '.';
- memcpy(path + pathLength + 1, extension, extensionLength);
- path[pathLength + 1 + extensionLength] = 0;
-}
-
-void RemoveFileExtension(char *path)
-{
- char *extension = GetFileExtension(path);
-
- if (extension == NULL)
- FATAL_ERROR("\"%s\" doesn't have a file extension.\n", path);
-
- extension--;
-
- *extension = 0;
-}
-
-void ChangeFileExtension(char *path, char *extension)
-{
- RemoveFileExtension(path);
- AddFileExtension(path, extension);
-}
-
unsigned char *ReadWholeFile(char *path, int *size)
{
FILE *fp = fopen(path, "rb");
diff --git a/tools/gbagfx/util.h b/tools/gbagfx/util.h
index ec81471c0..cb26a31ef 100644
--- a/tools/gbagfx/util.h
+++ b/tools/gbagfx/util.h
@@ -7,10 +7,6 @@
bool ParseNumber(char *s, char **end, int radix, int *intValue);
char *GetFileExtension(char *path);
-void ExpectFileExtension(char *path, char *expectedExtension);
-void AddFileExtension(char *path, char *extension);
-void RemoveFileExtension(char *path);
-void ChangeFileExtension(char *path, char *extension);
unsigned char *ReadWholeFile(char *path, int *size);
void WriteWholeFile(char *path, void *buffer, int bufferSize);