From d3a4ced94cdd091bac2e0d277790fa41517c67d4 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Wed, 20 Jul 2016 18:53:58 +0000 Subject: [PATCH] PPH loader fixes - Fix palette computation, flickering two colors give a mix lighter than 50% - Fix off by one error in B1 palette change decoding. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@2164 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- src/miscfileformats.c | 47 +++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/src/miscfileformats.c b/src/miscfileformats.c index 1406c401..c2cc8c0a 100644 --- a/src/miscfileformats.c +++ b/src/miscfileformats.c @@ -3649,6 +3649,16 @@ abort: } +static uint8_t pph_blend(uint8_t a, uint8_t b) +{ + uint32_t h,l; + if (a > b) { h = a; l = b; } + else { h = b; l = a; } + + return (23 * h + 9 * l) / 32; +} + + void Load_PPH(T_IO_Context* context) { FILE *file; @@ -3755,12 +3765,12 @@ void Load_PPH(T_IO_Context* context) } for (i = 0; i < 16; i++) { - context->Palette[i + 16*j].R - = (CPCPAL[base[i & 3]].R + CPCPAL[base[i >> 2]].R) / 2; - context->Palette[i + 16*j].G - = (CPCPAL[base[i & 3]].G + CPCPAL[base[i >> 2]].G) / 2; - context->Palette[i + 16*j].B - = (CPCPAL[base[i & 3]].B + CPCPAL[base[i >> 2]].B) / 2; + context->Palette[i + 16*j].R = pph_blend( + CPCPAL[base[i & 3]].R, CPCPAL[base[i >> 2]].R); + context->Palette[i + 16*j].G = pph_blend( + CPCPAL[base[i & 3]].G, CPCPAL[base[i >> 2]].G); + context->Palette[i + 16*j].B = pph_blend( + CPCPAL[base[i & 3]].B, CPCPAL[base[i >> 2]].B); } // TODO this byte marks where this palette stops being used and the // next starts. We must handle this! @@ -3786,12 +3796,12 @@ void Load_PPH(T_IO_Context* context) for (i = 0; i < 256; i++) { - context->Palette[i].R - = (CPCPAL[base[i & 15]].R + CPCPAL[base[i >> 4]].R) / 2; - context->Palette[i].G - = (CPCPAL[base[i & 15]].G + CPCPAL[base[i >> 4]].G) / 2; - context->Palette[i].B - = (CPCPAL[base[i & 15]].B + CPCPAL[base[i >> 4]].B) / 2; + context->Palette[i].R = pph_blend( + CPCPAL[base[i & 15]].R, CPCPAL[base[i >> 4]].R); + context->Palette[i].G = pph_blend( + CPCPAL[base[i & 15]].G, CPCPAL[base[i >> 4]].G); + context->Palette[i].B = pph_blend( + CPCPAL[base[i & 15]].B, CPCPAL[base[i >> 4]].B); } } break; @@ -3861,7 +3871,7 @@ void Load_PPH(T_IO_Context* context) break; case 5: - if (d > pl[c]) + if (d >= pl[c]) { d = 0; c++; @@ -3898,4 +3908,15 @@ void Load_PPH(T_IO_Context* context) void Save_PPH(T_IO_Context* context) { // TODO + + // Detect mode + // Wide pixels => B0 (4) + // Square pixels: + // - 16 colors used => R + // - more colors used => B1 (if <16 colors per line) + + // Check palette + // B0: use diagonal: 0, 17, 34, ... (assume the other are mixes) + // R: use 16 used colors (or 16 first?) + // B1: find the 16 colors used in a line? Or assume they are in-order already? }