diff options
author | YamaArashi <shadow962@live.com> | 2016-07-24 07:18:38 -0700 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-07-24 07:18:38 -0700 |
commit | 04cfba753647b375504bc1d7750b7156fb51bbd0 (patch) | |
tree | 013ed49243b5407f250e61a06cded9b730e20bb0 | |
parent | d73d8052e9ec659a54468f5a4beb252c98dd2ae7 (diff) |
picture frame graphics
27 files changed, 384 insertions, 56 deletions
diff --git a/.gitignore b/.gitignore index 175b830fb..05643bb33 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.8bpp *.gbapal *.lz +*.rl *.latfont *.hwjpnfont *.fwjpnfont @@ -29,7 +29,7 @@ PREPROC := tools/preproc/preproc # Secondary expansion is required for dependency variables in object rules. .SECONDEXPANSION: -.PRECIOUS: %.1bpp %.4bpp %.8bpp %.gbapal %.lz +.PRECIOUS: %.1bpp %.4bpp %.8bpp %.gbapal %.lz %.rl .PHONY: all clean compare ruby sapphire @@ -64,7 +64,7 @@ compare: both clean: rm -f $(ROM) $(ELF) $(OBJS) $(pokeruby_OBJS) $(pokesapphire_OBJS) $(C_SRCS:%.c=%.i) pokeruby.map pokesapphire.map - find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' \) -exec rm {} + + find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.rl' \) -exec rm {} + tidy: rm -f $(ROM) $(ELF) $(OBJS) $(pokeruby_OBJS) $(pokesapphire_OBJS) $(C_SRCS:%.c=%.i) pokeruby.map pokesapphire.map @@ -84,6 +84,7 @@ include misc.mk %.8bpp: %.png ; $(GFX) $< $@ %.gbapal: %.pal ; $(GFX) $< $@ %.lz: % ; $(GFX) $< $@ +%.rl: % ; $(GFX) $< $@ src/libc_ruby.o src/libc_sapphire.o: CC1 := tools/agbcc/bin/old_agbcc src/libc_ruby.o src/libc_sapphire.o: CFLAGS := -O2 diff --git a/asm/rom5.s b/asm/rom5.s index 87a4f3086..4ccb19aa0 100644 --- a/asm/rom5.s +++ b/asm/rom5.s @@ -287969,7 +287969,7 @@ _08106C5E: ldr r0, [r0] mov pc, r0 .align 2, 0 -_08106C7C: .4byte gUnknown_083EF198 +_08106C7C: .4byte gPictureFramePalettes _08106C80: .4byte 0x03005e8c _08106C84: .4byte _08106C88 .align 2, 0 @@ -287987,8 +287987,8 @@ _08106C9C: ldr r0, _08106CB0 b _08106CF0 .align 2, 0 -_08106CAC: .4byte gUnknown_083EF398 -_08106CB0: .4byte gUnknown_083F4260 +_08106CAC: .4byte gPictureFrameTiles_0 +_08106CB0: .4byte gPictureFrameTilemap_0 _08106CB4: ldr r0, _08106CC4 movs r1, 0xC0 @@ -287997,8 +287997,8 @@ _08106CB4: ldr r0, _08106CC8 b _08106CF0 .align 2, 0 -_08106CC4: .4byte gUnknown_083F041C -_08106CC8: .4byte gUnknown_083F476C +_08106CC4: .4byte gPictureFrameTiles_1 +_08106CC8: .4byte gPictureFrameTilemap_1 _08106CCC: ldr r0, _08106CDC movs r1, 0xC0 @@ -288007,8 +288007,8 @@ _08106CCC: ldr r0, _08106CE0 b _08106CF0 .align 2, 0 -_08106CDC: .4byte gUnknown_083F104C -_08106CE0: .4byte gUnknown_083F4C78 +_08106CDC: .4byte gPictureFrameTiles_2 +_08106CE0: .4byte gPictureFrameTilemap_2 _08106CE4: ldr r0, _08106CFC movs r1, 0xC0 @@ -288021,8 +288021,8 @@ _08106CF0: bl RLUnCompWram b _08106D1C .align 2, 0 -_08106CFC: .4byte gUnknown_083F1B84 -_08106D00: .4byte gUnknown_083F5184 +_08106CFC: .4byte gPictureFrameTiles_3 +_08106D00: .4byte gPictureFrameTilemap_3 _08106D04: .4byte 0x03005e10 _08106D08: ldr r0, _08106D98 @@ -288102,8 +288102,8 @@ _08106D80: bls _08106D80 b _08106E86 .align 2, 0 -_08106D98: .4byte gUnknown_083F2B3C -_08106D9C: .4byte gUnknown_083F5690 +_08106D98: .4byte gPictureFrameTiles_4 +_08106D9C: .4byte gPictureFrameTilemap_4 _08106DA0: .4byte 0x03005e10 _08106DA4: .4byte 0x06006000 _08106DA8: .4byte 0x00001015 @@ -288119,8 +288119,8 @@ _08106DB4: ldr r0, _08106DCC b _08106E60 .align 2, 0 -_08106DC8: .4byte gUnknown_083F3C6C -_08106DCC: .4byte gUnknown_083F5B9C +_08106DC8: .4byte gPictureFrameTiles_5 +_08106DCC: .4byte gPictureFrameTilemap_5 _08106DD0: ldr r0, _08106DF0 ldr r0, [r0] @@ -288154,8 +288154,8 @@ _08106E0C: ldr r0, _08106E20 b _08106E60 .align 2, 0 -_08106E1C: .4byte gUnknown_083EF398 -_08106E20: .4byte gUnknown_083F4260 +_08106E1C: .4byte gPictureFrameTiles_0 +_08106E20: .4byte gPictureFrameTilemap_0 _08106E24: ldr r0, _08106E34 movs r1, 0xC0 @@ -288164,8 +288164,8 @@ _08106E24: ldr r0, _08106E38 b _08106E60 .align 2, 0 -_08106E34: .4byte gUnknown_083F041C -_08106E38: .4byte gUnknown_083F476C +_08106E34: .4byte gPictureFrameTiles_1 +_08106E38: .4byte gPictureFrameTilemap_1 _08106E3C: ldr r0, _08106E4C movs r1, 0xC0 @@ -288174,8 +288174,8 @@ _08106E3C: ldr r0, _08106E50 b _08106E60 .align 2, 0 -_08106E4C: .4byte gUnknown_083F104C -_08106E50: .4byte gUnknown_083F4C78 +_08106E4C: .4byte gPictureFrameTiles_2 +_08106E50: .4byte gPictureFrameTilemap_2 _08106E54: ldr r0, _08106E68 movs r1, 0xC0 @@ -288187,8 +288187,8 @@ _08106E60: bl RLUnCompVram b _08106E86 .align 2, 0 -_08106E68: .4byte gUnknown_083F1B84 -_08106E6C: .4byte gUnknown_083F5184 +_08106E68: .4byte gPictureFrameTiles_3 +_08106E6C: .4byte gPictureFrameTilemap_3 _08106E70: .4byte 0x06006000 _08106E74: ldr r0, _08106E8C @@ -288203,8 +288203,8 @@ _08106E86: pop {r0} bx r0 .align 2, 0 -_08106E8C: .4byte gUnknown_083F2B3C -_08106E90: .4byte gUnknown_083F5690 +_08106E8C: .4byte gPictureFrameTiles_4 +_08106E90: .4byte gPictureFrameTilemap_4 _08106E94: .4byte 0x06006000 thumb_func_end sub_8106C40 @@ -288240,7 +288240,7 @@ sub_8106E98: @ 8106E98 bx r0 .align 2, 0 _08106ED0: .4byte 0x03001770 -_08106ED4: .4byte gUnknown_083F6138 +_08106ED4: .4byte gOamData_83F6138 _08106ED8: .4byte 0xfffffc00 _08106EDC: .4byte 0xfffffe00 thumb_func_end sub_8106E98 diff --git a/data/data2.s b/data/data2.s index 41c0fdcc8..75d1a4b85 100644 --- a/data/data2.s +++ b/data/data2.s @@ -21370,44 +21370,63 @@ gUnknown_083EDE8C:: @ 83EDE8C gUnknown_083EEFE0:: @ 83EEFE0 .incbin "baserom.gba", 0x003eefe0, 0x1b8 -gUnknown_083EF198:: @ 83EF198 - .incbin "baserom.gba", 0x003ef198, 0x200 + .align 2 +gPictureFramePalettes:: @ 83EF198 + .incbin "graphics/picture_frame/bg0.gbapal" + .incbin "graphics/picture_frame/bg1.gbapal" + .incbin "graphics/picture_frame/bg2.gbapal" + .incbin "graphics/picture_frame/bg3.gbapal" + .incbin "graphics/picture_frame/bg4.gbapal" + .incbin "graphics/picture_frame/bg5.gbapal" + .space 10 * 32 -gUnknown_083EF398:: @ 83EF398 - .incbin "baserom.gba", 0x003ef398, 0x1084 + .align 2 +gPictureFrameTiles_0:: @ 83EF398 + .incbin "graphics/picture_frame/frame0.4bpp.rl" -gUnknown_083F041C:: @ 83F041C - .incbin "baserom.gba", 0x003f041c, 0xc30 + .align 2 +gPictureFrameTiles_1:: @ 83F041C + .incbin "graphics/picture_frame/frame1.4bpp.rl" -gUnknown_083F104C:: @ 83F104C - .incbin "baserom.gba", 0x003f104c, 0xb38 + .align 2 +gPictureFrameTiles_2:: @ 83F104C + .incbin "graphics/picture_frame/frame2.4bpp.rl" -gUnknown_083F1B84:: @ 83F1B84 - .incbin "baserom.gba", 0x003f1b84, 0xfb8 + .align 2 +gPictureFrameTiles_3:: @ 83F1B84 + .incbin "graphics/picture_frame/frame3.4bpp.rl" -gUnknown_083F2B3C:: @ 83F2B3C - .incbin "baserom.gba", 0x003f2b3c, 0x1130 + .align 2 +gPictureFrameTiles_4:: @ 83F2B3C + .incbin "graphics/picture_frame/frame4.4bpp.rl" -gUnknown_083F3C6C:: @ 83F3C6C - .incbin "baserom.gba", 0x003f3c6c, 0x5f4 + .align 2 +gPictureFrameTiles_5:: @ 83F3C6C + .incbin "graphics/picture_frame/frame5.4bpp.rl" -gUnknown_083F4260:: @ 83F4260 - .incbin "baserom.gba", 0x003f4260, 0x50c + .align 2 +gPictureFrameTilemap_0:: @ 83F4260 + .incbin "graphics/picture_frame/frame0_map.bin.rl" -gUnknown_083F476C:: @ 83F476C - .incbin "baserom.gba", 0x003f476c, 0x50c + .align 2 +gPictureFrameTilemap_1:: @ 83F476C + .incbin "graphics/picture_frame/frame1_map.bin.rl" -gUnknown_083F4C78:: @ 83F4C78 - .incbin "baserom.gba", 0x003f4c78, 0x50c + .align 2 +gPictureFrameTilemap_2:: @ 83F4C78 + .incbin "graphics/picture_frame/frame2_map.bin.rl" -gUnknown_083F5184:: @ 83F5184 - .incbin "baserom.gba", 0x003f5184, 0x50c + .align 2 +gPictureFrameTilemap_3:: @ 83F5184 + .incbin "graphics/picture_frame/frame3_map.bin.rl" -gUnknown_083F5690:: @ 83F5690 - .incbin "baserom.gba", 0x003f5690, 0x50c + .align 2 +gPictureFrameTilemap_4:: @ 83F5690 + .incbin "graphics/picture_frame/frame4_map.bin.rl" -gUnknown_083F5B9C:: @ 83F5B9C - .incbin "baserom.gba", 0x003f5b9c, 0x510 + .align 2 +gPictureFrameTilemap_5:: @ 83F5B9C + .incbin "graphics/picture_frame/frame5_map.bin.rl" .align 2 gUnknown_083F60AC:: @ 83F60AC @@ -21450,9 +21469,13 @@ gUnknown_083F60C0:: @ 83F60C0 .4byte OtherText_MightyTough .4byte OtherText_Exclamation -gUnknown_083F6138:: @ 83F6138 - .incbin "baserom.gba", 0x003f6138, 0x8 + .align 2 +gOamData_83F6138:: @ 83F6138 + .2byte 0x3000 + .2byte 0xC000 + .2byte 0x0000 + .align 2 gUnknown_083F6140:: @ 83F6140 .space 4 diff --git a/graphics/picture_frame/bg0.pal b/graphics/picture_frame/bg0.pal new file mode 100644 index 000000000..92d91c1a2 --- /dev/null +++ b/graphics/picture_frame/bg0.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 255 255 +230 230 230 +213 213 213 +197 197 197 +180 180 180 +164 164 164 +148 148 148 +131 131 131 +115 115 115 +98 98 98 +82 82 82 +65 65 65 +49 49 49 +32 32 32 +16 16 16 diff --git a/graphics/picture_frame/bg1.pal b/graphics/picture_frame/bg1.pal new file mode 100644 index 000000000..b62154cd1 --- /dev/null +++ b/graphics/picture_frame/bg1.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +90 24 0 +139 65 16 +164 90 16 +189 115 16 +222 148 49 +255 180 82 +255 222 131 +98 172 115 +148 197 156 +222 255 230 +255 255 255 +205 189 164 +180 164 139 +164 139 115 +131 98 74 diff --git a/graphics/picture_frame/bg2.pal b/graphics/picture_frame/bg2.pal new file mode 100644 index 000000000..9aba35b7a --- /dev/null +++ b/graphics/picture_frame/bg2.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +180 148 213 +180 164 197 +180 189 189 +180 205 180 +180 230 172 +189 255 164 +222 255 139 +246 238 123 +255 230 98 +255 205 139 +255 180 139 +238 164 189 +205 156 197 +255 246 255 +90 57 74 diff --git a/graphics/picture_frame/bg3.pal b/graphics/picture_frame/bg3.pal new file mode 100644 index 000000000..aa33d2f8d --- /dev/null +++ b/graphics/picture_frame/bg3.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +255 123 164 +255 139 180 +255 180 205 +255 213 255 +255 205 0 +255 213 57 +255 230 123 +255 238 189 +255 255 255 +90 24 0 +139 65 16 +205 189 164 +180 164 139 +164 139 115 +131 98 74 diff --git a/graphics/picture_frame/bg4.pal b/graphics/picture_frame/bg4.pal new file mode 100644 index 000000000..9e6bd9116 --- /dev/null +++ b/graphics/picture_frame/bg4.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +90 24 0 +139 65 16 +222 148 49 +255 222 131 +131 131 131 +65 65 65 +255 0 0 +255 82 82 +255 164 164 +255 98 197 +255 148 213 +255 197 230 +74 255 90 +131 255 139 +189 255 197 diff --git a/graphics/picture_frame/bg5.pal b/graphics/picture_frame/bg5.pal new file mode 100644 index 000000000..d03ae085b --- /dev/null +++ b/graphics/picture_frame/bg5.pal @@ -0,0 +1,19 @@ +JASC-PAL +0100 +16 +0 0 0 +90 24 0 +139 65 16 +222 148 49 +255 222 131 +131 131 131 +65 65 65 +74 148 238 +131 180 238 +189 213 246 +74 255 90 +131 255 139 +189 255 197 +255 255 0 +255 255 123 +0 0 0 diff --git a/graphics/picture_frame/frame0.png b/graphics/picture_frame/frame0.png Binary files differnew file mode 100644 index 000000000..33f2baf09 --- /dev/null +++ b/graphics/picture_frame/frame0.png diff --git a/graphics/picture_frame/frame0_map.bin b/graphics/picture_frame/frame0_map.bin Binary files differnew file mode 100644 index 000000000..6f7a7b165 --- /dev/null +++ b/graphics/picture_frame/frame0_map.bin diff --git a/graphics/picture_frame/frame1.png b/graphics/picture_frame/frame1.png Binary files differnew file mode 100644 index 000000000..72e9d0ab7 --- /dev/null +++ b/graphics/picture_frame/frame1.png diff --git a/graphics/picture_frame/frame1_map.bin b/graphics/picture_frame/frame1_map.bin Binary files differnew file mode 100644 index 000000000..523ff9e28 --- /dev/null +++ b/graphics/picture_frame/frame1_map.bin diff --git a/graphics/picture_frame/frame2.png b/graphics/picture_frame/frame2.png Binary files differnew file mode 100644 index 000000000..38e6ba209 --- /dev/null +++ b/graphics/picture_frame/frame2.png diff --git a/graphics/picture_frame/frame2_map.bin b/graphics/picture_frame/frame2_map.bin Binary files differnew file mode 100644 index 000000000..3333c2a01 --- /dev/null +++ b/graphics/picture_frame/frame2_map.bin diff --git a/graphics/picture_frame/frame3.png b/graphics/picture_frame/frame3.png Binary files differnew file mode 100644 index 000000000..93fbf373f --- /dev/null +++ b/graphics/picture_frame/frame3.png diff --git a/graphics/picture_frame/frame3_map.bin b/graphics/picture_frame/frame3_map.bin Binary files differnew file mode 100644 index 000000000..c2adf40c2 --- /dev/null +++ b/graphics/picture_frame/frame3_map.bin diff --git a/graphics/picture_frame/frame4.png b/graphics/picture_frame/frame4.png Binary files differnew file mode 100644 index 000000000..c7db2e3be --- /dev/null +++ b/graphics/picture_frame/frame4.png diff --git a/graphics/picture_frame/frame4_map.bin b/graphics/picture_frame/frame4_map.bin Binary files differnew file mode 100644 index 000000000..c2adf40c2 --- /dev/null +++ b/graphics/picture_frame/frame4_map.bin diff --git a/graphics/picture_frame/frame5.png b/graphics/picture_frame/frame5.png Binary files differnew file mode 100644 index 000000000..4608f55e6 --- /dev/null +++ b/graphics/picture_frame/frame5.png diff --git a/graphics/picture_frame/frame5_map.bin b/graphics/picture_frame/frame5_map.bin Binary files differnew file mode 100644 index 000000000..84309ca3d --- /dev/null +++ b/graphics/picture_frame/frame5_map.bin @@ -7,6 +7,7 @@ UNKNOWNGFXDIR := graphics/unknown REELGFXDIR := graphics/slot_machine ROULGFXDIR := graphics/roulette BTLANMSPRGFXDIR := graphics/battle_anims/sprites +PICFRAMEGFXDIR := graphics/picture_frame $(MENUGFXDIR)/menu.gbapal: $(MENUGFXDIR)/menu_0.gbapal $(MENUGFXDIR)/menu_1.gbapal @@ -157,3 +158,6 @@ $(BTLANMSPRGFXDIR)/141.4bpp: $(BTLANMSPRGFXDIR)/141_0.4bpp $(BTLANMSPRGFXDIR)/14 $(BTLANMSPRGFXDIR)/159.4bpp: $(BTLANMSPRGFXDIR)/159_0.4bpp $(BTLANMSPRGFXDIR)/159_1.4bpp @cat $(BTLANMSPRGFXDIR)/159_0.4bpp $(BTLANMSPRGFXDIR)/159_1.4bpp >$@ + +$(PICFRAMEGFXDIR)/frame5.4bpp: $(PICFRAMEGFXDIR)/frame5.png + $(GFX) $< $@ -num_tiles 86 diff --git a/tools/gbagfx/Makefile b/tools/gbagfx/Makefile index 6c8e5e1fa..de4ea5c42 100644 --- a/tools/gbagfx/Makefile +++ b/tools/gbagfx/Makefile @@ -4,11 +4,11 @@ CFLAGS = -Wall -Wextra -std=c11 -O2 -DPNG_SKIP_SETJMP_CHECK LIBS = -lpng -lz -SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c util.c font.c +SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c .PHONY: clean -gbagfx: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h util.h font.h +gbagfx: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h $(CC) $(CFLAGS) $(SRCS) -o $@ $(LIBS) clean: diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c index e33e061b2..54a3c600d 100644 --- a/tools/gbagfx/main.c +++ b/tools/gbagfx/main.c @@ -9,6 +9,7 @@ #include "convert_png.h" #include "jasc_pal.h" #include "lz.h" +#include "rl.h" #include "font.h" struct CommandHandler @@ -289,6 +290,36 @@ void HandleLZDecompressCommand(char *inputPath, char *outputPath, int argc UNUSE free(uncompressedData); } +void HandleRLCompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); + + int compressedSize; + unsigned char *compressedData = RLCompress(buffer, fileSize, &compressedSize); + + free(buffer); + + WriteWholeFile(outputPath, compressedData, compressedSize); + + free(compressedData); +} + +void HandleRLDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); + + int uncompressedSize; + unsigned char *uncompressedData = RLDecompress(buffer, fileSize, &uncompressedSize); + + free(buffer); + + WriteWholeFile(outputPath, uncompressedData, uncompressedSize); + + free(uncompressedData); +} + int main(int argc, char **argv) { if (argc < 3) @@ -312,6 +343,8 @@ int main(int argc, char **argv) { "png", "fwjpnfont", HandlePngToFullwidthJapaneseFontCommand }, { NULL, "lz", HandleLZCompressCommand }, { "lz", NULL, HandleLZDecompressCommand }, + { NULL, "rl", HandleRLCompressCommand }, + { "rl", NULL, HandleRLDecompressCommand }, { NULL, NULL, NULL } }; diff --git a/tools/gbagfx/rl.c b/tools/gbagfx/rl.c new file mode 100644 index 000000000..e90ad808b --- /dev/null +++ b/tools/gbagfx/rl.c @@ -0,0 +1,143 @@ +// Copyright (c) 2016 YamaArashi + +#include <stdlib.h> +#include <stdbool.h> +#include "global.h" +#include "rl.h" + +unsigned char *RLDecompress(unsigned char *src, int srcSize, int *uncompressedSize) +{ + if (srcSize < 4) + goto fail; + + int destSize = (src[3] << 16) | (src[2] << 8) | src[1]; + + unsigned char *dest = malloc(destSize); + + if (dest == NULL) + goto fail; + + int srcPos = 4; + int destPos = 0; + + for (;;) + { + if (srcPos >= srcSize) + goto fail; + + unsigned char flags = src[srcPos++]; + bool compressed = ((flags & 0x80) != 0); + + if (compressed) + { + int length = (flags & 0x7F) + 3; + unsigned char data = src[srcPos++]; + + for (int i = 0; i < length; i++) + dest[destPos++] = data; + } + else + { + int length = (flags & 0x7F) + 1; + + for (int i = 0; i < length; i++) + dest[destPos++] = src[srcPos++]; + } + + if (destPos == destSize) + { + *uncompressedSize = destSize; + return dest; + } + } + +fail: + FATAL_ERROR("Fatal error while decompressing RL file.\n"); +} + +unsigned char *RLCompress(unsigned char *src, int srcSize, int *compressedSize) +{ + if (srcSize <= 0) + goto fail; + + int worstCaseDestSize = 4 + srcSize * 2; + + // Round up to the next multiple of four. + worstCaseDestSize = (worstCaseDestSize + 3) & ~3; + + unsigned char *dest = malloc(worstCaseDestSize); + + if (dest == NULL) + goto fail; + + // header + dest[0] = 0x30; // RL compression type + dest[1] = (unsigned char)srcSize; + dest[2] = (unsigned char)(srcSize >> 8); + dest[3] = (unsigned char)(srcSize >> 16); + + int srcPos = 0; + int destPos = 4; + + for (;;) + { + bool compress = false; + int uncompressedStart = srcPos; + int uncompressedLength = 0; + + while (srcPos < srcSize && uncompressedLength < (0x7F + 1)) + { + compress = (srcPos + 2 < srcSize && src[srcPos] == src[srcPos + 1] && src[srcPos] == src[srcPos + 2]); + + if (compress) + break; + + srcPos++; + uncompressedLength++; + } + + if (uncompressedLength > 0) + { + dest[destPos++] = uncompressedLength - 1; + + for (int i = 0; i < uncompressedLength; i++) + dest[destPos++] = src[uncompressedStart + i]; + } + + if (compress) + { + unsigned char data = src[srcPos]; + int compressedLength = 0; + + while (compressedLength < (0x7F + 3) + && srcPos + compressedLength < srcSize + && src[srcPos + compressedLength] == data) + { + compressedLength++; + } + + dest[destPos++] = 0x80 | (compressedLength - 3); + dest[destPos++] = data; + + srcPos += compressedLength; + } + + if (srcPos == srcSize) + { + // Pad to multiple of 4 bytes. + int remainder = destPos % 4; + + if (remainder != 0) + { + for (int i = 0; i < 4 - remainder; i++) + dest[destPos++] = 0; + } + + *compressedSize = destPos; + return dest; + } + } + +fail: + FATAL_ERROR("Fatal error while compressing RL file.\n"); +} diff --git a/tools/gbagfx/rl.h b/tools/gbagfx/rl.h new file mode 100644 index 000000000..02ad8d6d3 --- /dev/null +++ b/tools/gbagfx/rl.h @@ -0,0 +1,9 @@ +// Copyright (c) 2016 YamaArashi + +#ifndef RL_H +#define RL_H + +unsigned char *RLDecompress(unsigned char *src, int srcSize, int *uncompressedSize); +unsigned char *RLCompress(unsigned char *src, int srcSize, int *compressedSize); + +#endif // RL_H |