From de15e1036fb7c6f117576b6f465db23284d4e681 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Sat, 16 Nov 2019 00:32:58 +0100 Subject: [PATCH] packbits optimization #1 --- src/fileformats.c | 12 +++++++++++- src/tests/tests.c | 7 ++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/fileformats.c b/src/fileformats.c index b4eda9e0..5cfc4efc 100644 --- a/src/fileformats.c +++ b/src/fileformats.c @@ -2247,7 +2247,17 @@ void Load_IFF(T_IO_Context * context) second_last_color=IFF_color_list[IFF_list_size-2]; if (last_color==color) // On a une répétition de couleur { - if ( (IFF_repetition_mode) || (second_last_color!=color) ) + if ( !IFF_repetition_mode && IFF_list_size >= 127) + { + // mode <> avec 126 octets <> puis 2 identiques + IFF_list_size--; + Transfer_colors(file); + IFF_color_list[0]=color; + IFF_color_list[1]=color; + IFF_list_size=2; + IFF_repetition_mode=1; + } + else if ( (IFF_repetition_mode) || (second_last_color!=color) ) // On conserve le mode... { IFF_color_list[IFF_list_size]=color; diff --git a/src/tests/tests.c b/src/tests/tests.c index fd696fdf..7f4223d7 100644 --- a/src/tests/tests.c +++ b/src/tests/tests.c @@ -158,9 +158,14 @@ int Test_Packbits(void) "AABBCCDDDDDDD12345@@@54321", // best : -1(ff) 'A' -1(ff) 'B' -1(ff) 'C' -6(fa) 'D' 12(0c) "12345@@@54321" => 22 bytes // or 04 "12345" -2(fe) '@' 04 "54321" "123AA123BBB123CCCC123DDDDD", // best : 07 "123AA123" -2 'B' 02 "123" -3(fd) 'C' 02 "123" -4(fc) 'D' => 23 bytes + "12345678123456781234567812345678" // 32 + "12345678123456781234567812345678" // 64 + "12345678123456781234567812345678" // 96 + "123456781234567812345678123456@@" // 128 + "@@12345678", // best : 125(7d) "123..." -3 '@' 08 "12345678" => 138 NULL }; - const long best_packed = 7 + 22 + 23; + const long best_packed = 7 + 22 + 23 + (138/*+2*/); byte buffer[1024]; snprintf(tempfilename, sizeof(tempfilename), "/tmp/gfx2test-packbits-%lx", random());