From bc39a9b1fcfe6cdddebb4ebc9d4234f3ff9f95a2 Mon Sep 17 00:00:00 2001 From: Roman Fomin Date: Fri, 23 Aug 2024 16:23:47 +0700 Subject: [PATCH] add PNG palette translation (#1865) * fix m_butt1, m_butt2, m_vbox --- base/all-all/m_butt1.png | Bin 999 -> 999 bytes base/all-all/m_butt2.png | Bin 999 -> 999 bytes base/all-all/m_vbox.png | Bin 931 -> 931 bytes src/v_fmt.c | 78 ++++++++++++++++++++++++++++++++++++--- 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/base/all-all/m_butt1.png b/base/all-all/m_butt1.png index 857aed674d93d7da101af98593fe53d3cb78dafc..4f05c187c8b7aaad36f5a0c81881761d1235b6f8 100644 GIT binary patch delta 786 zcmW-fA*`EV6oqdx@e8sb5C{YUQNb1j0)apvNQOWl5C{aK;ui=60`Ut(MFmR`6$nHH z0#SizvI@imqRA>MDiDab1W{4(#FKaIC0Cu~eCH5;FG0|I-pO%V z%Q~87t?LI(D^+!`D1|IDNyv3#x zsPR%^Uwm}=>zFPzovZk<4{wEkW!{jxed=_HeWX?$n`LC|0-gC<=Bd=#M7H8vvTI0| zChDr7D*Ws9T9##==V_Ym_xttAuH!fk!*D*I`@ZkGu5H_iuY&MFbWSAtc?RJi$TM!POe{$T$vMa+XG$U2D zSlRfJY>T4K3kt`Hgbi(ZZg!^wYs;+JB{ic}9`Dnzpg|scS>z^xz4figH3D1rEv+fy zGV=@SW|6h^_0Um0Q?Yd^XK|7STk3_e;|HeW>6W7!)&?t!!Cv9I@-L zEHO>d_t7xcC9RnCR?Ny+0js+JpaA~=;OB&o3ywAREXQMrrHM>>PsL}#&s+Wxao2$S z_TcQm$^QHlABa6-iAWJ0Lx@iZ{45P$xi1OX;7#Uw>5Jzx?_KE-_Fq delta 786 zcmV+t1MU3h2j>TnEPnt1009930s;a90|NvE1O){J1_lNP2L}iU2nh)Z3JMAf3kwVk z3=Itp4h{|v4-XI!5D^g(5)u*<6B85^6crT}78Vv47Z(^97#SHE8X6iK8yg%P9334U z9v&VaA0HqfAR!?kA|fIqBO@dvBqb#!CMG5)CnqQ7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?seh@ds;a81tE;T6tgWrBuCA`HudlGMu(7eRva+(Xv$M3cw6(Rhwzjsnx3{>s zxVgExy1Kf%ySu!+yuH1>zP`S{zrVo1z`?=6!otGC!^6bH#KpzM#>U3S$H&OX$jQmc z%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn?(|^;{)YR40)z;S5*VotB*x1?G+1lFL z+uPgR+}z#W-QM2b-{0Th;Naom;o{=ruz*=jZ3>=;-O`>FVn0>+9?6 z?CkCB?e6aG@9*#M@bK~R@$&NW^Yioc^z`-h_4fAm_xJbs`1twx`TF|$`}_O+{QUj> Q{RjU3{(`{ec9Sgwx)h*=MgRZ+ diff --git a/base/all-all/m_butt2.png b/base/all-all/m_butt2.png index 7ecbd384b8c0aa1e005d1e07e5f20571e82de37a..00f051a660a6a0b951c92fb940f7d38ed6c48ecc 100644 GIT binary patch delta 786 zcmW-fA*`EV6oqdx@e8sb5C{YUQNb1j0)apvNQOWl5C{aK;ui=60`Ut(MFmR`6$nHH z0#SizvI@imqRA>MDiDab1W{4(#FKaIC0Cu~eCH5;FG0|I-pO%V z%Q~87t?LI(D^+!`D1|IDNyv3#x zsPR%^Uwm}=>zFPzovZk<4{wEkW!{jxed=_HeWX?$n`LC|0-gC<=Bd=#M7H8vvTI0| zChDr7D*Ws9T9##==V_Ym_xttAuH!fk!*D*I`@ZkGu5H_iuY&MFbWSAtc?RJi$TM!POe{$T$vMa+XG$U2D zSlRfJY>T4K3kt`Hgbi(ZZg!^wYs;+JB{ic}9`Dnzpg|scS>z^xz4figH3D1rEv+fy zGV=@SW|6h^_0Um0Q?Yd^XK|7STk3_e;|HeW>6W7!)&?t!!Cv9I@-L zEHO>d_t7xcC9RnCR?Ny+0js+JpaA~=;OB&o3ywAREXQMrrHM>>PsL}#&s+Wxao2$S z_TcQm$^QHlABa6-iAWJ0Lx@iZ{45P$xi1OX;7#Uw>5Jzx?_KE-_Fq delta 786 zcmV+t1MU3h2j>TnEPnt1009930s;a90|NvE1O){J1_lNP2L}iU2nh)Z3JMAf3kwVk z3=Itp4h{|v4-XI!5D^g(5)u*<6B85^6crT}78Vv47Z(^97#SHE8X6iK8yg%P9334U z9v&VaA0HqfAR!?kA|fIqBO@dvBqb#!CMG5)CnqQ7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?seh@ds;a81tE;T6tgWrBuCA`HudlGMu(7eRva+(Xv$M3cw6(Rhwzjsnx3{>s zxVgExy1Kf%ySu!+yuH1>zP`S{zrVo1z`?=6!otGC!^6bH#KpzM#>U3S$H&OX$jQmc z%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn?(|^;{)YR40)z;S5*VotB*x1?G+1lFL z+uPgR+}z#W-QM2b-{0Th;Naom;o{=ruz*=jZ3>=;-O`>FVn0>+9?6 z?CkCB?e6aG@9*#M@bK~R@$&NW^Yioc^z`-h_4fAm_xJbs`1twx`TF|$`}_O+{QUj> Q{RjU3{(`{ec9Sgwx)h*=MgRZ+ diff --git a/base/all-all/m_vbox.png b/base/all-all/m_vbox.png index ccbfb17abfee67bea7aa25463446d8bcf0503ea1..1d3f291f74c53ce3cd333b1dd100f2f4f4ab5bd0 100644 GIT binary patch delta 786 zcmW-fA*`EV6oqdx@e8sb5C{YUQNb1j0)apvNQOWl5C{YU@e2gW5QtwODk@lls6ZeP z2t);lJsywy{k|;A^?E&@*?FGlX_}75<2a7PF!X)jw(Wkuuj_iZ+m&U>7|ZiK zO;bu~9LHf820`F?p5r*SZJVZP7>1^4o6Sa1lpNFal_d8lx&-0m`3J{sExR_XQZq7D zi$N&<65MXU>t?co@dB$PD zs=_Qo-$%n(m$YKmTQMtR1+4B8fCBjcgP#lDPB=F>vI4shD-)UYo{7(tzbE`H;?4p2 z?ZMH3gZ=p_-VjH`3Xvi@hzcU~7PJP`8f=wyp&MJ13`Ni+Zq4|dlL?>!C;%eBDgw4P bK3ptTD_-EzLX!d|J*9vCe*IB@|MK%6jK@!7 delta 786 zcmV+t1MU2y2crj&EPnt1009930s;a90|NvE1O){J1_lNP2L}iU2nh)Z3JMAf3kwVk z3=Itp4h{|v4-XI!5D^g(5)u*<6B85^6crT}78Vv47Z(^97#SHE8X6iK8yg%P9334U z9v&VaA0HqfAR!?kA|fIqBO@dvBqb#!CMG5)CnqQ7mzbECnVFfInwp!No1C1Sot>SYo}QndpP-Ll?seh@ds;a81tE;T6tgWrBuCA`HudlGMu(7eRva+(Xv$M3cw6(Rhwzjsnx3{>s zxVgExy1Kf%ySu!+yuH1>zP`S{zrVo1z`?=6!otGC!^6bH#KpzM#>U3S$H&OX$jQmc z%F4>i%gfBn%+1Zs&d$!y&(F}%(9zM+($dn?(|^;{)YR40)z;S5*VotB*x1?G+1lFL z+uPgR+}z#W-QM2b-{0Th;Naom;o{=ruz*=jZ3>=;-O`>FVn0>+9?6 z?CkCB?e6aG@9*#M@bK~R@$&NW^Yioc^z`-h_4fAm_xJbs`1twx`TF|$`}_O+{QUj> Q{RjU3{(`{ec9Sgwc5^m_dH?_b diff --git a/src/v_fmt.c b/src/v_fmt.c index 24762bad..c8b3b819 100644 --- a/src/v_fmt.c +++ b/src/v_fmt.c @@ -20,6 +20,7 @@ #include "doomtype.h" #include "i_printf.h" +#include "i_video.h" #include "m_swap.h" #include "r_defs.h" #include "v_video.h" @@ -339,6 +340,8 @@ patch_t *V_CachePatchNum(int lump, pu_tag tag) return buffer; } + byte *image = NULL, *translate = NULL; + spng_ctx *ctx = spng_ctx_new(0); // Ignore and don't calculate chunk CRC's @@ -386,6 +389,25 @@ patch_t *V_CachePatchNum(int lump, pu_tag tag) } } + struct spng_plte plte = {0}; + ret = spng_get_plte(ctx, &plte); + + if (ret) + { + I_Printf(VB_ERROR, "V_CachePatchNum: spng_get_plte %s\n", + spng_strerror(ret)); + goto error; + } + + // Build translation table for palette. + byte *playpal = W_CacheLumpName("PLAYPAL", PU_CACHE); + translate = malloc(plte.n_entries); + for (int i = 0; i < plte.n_entries; ++i) + { + struct spng_plte_entry *e = &plte.entries[i]; + translate[i] = I_GetPaletteIndex(playpal, e->red, e->green, e->blue); + } + int leftoffset = 0, topoffset = 0; uint32_t n_chunks = 0; ret = spng_get_unknown_chunks(ctx, NULL, &n_chunks); @@ -424,18 +446,21 @@ patch_t *V_CachePatchNum(int lump, pu_tag tag) goto error; } - byte *image = malloc(image_size); - + image = malloc(image_size); ret = spng_decode_image(ctx, image, image_size, SPNG_FMT_PNG, 0); if (ret) { I_Printf(VB_ERROR, "V_CachePatchNum: spng_decode_image %s", spng_strerror(ret)); - free(image); goto error; } + for (int i = 0; i < image_size; ++i) + { + image[i] = translate[image[i]]; + } + spng_ctx_free(ctx); Z_Free(buffer); @@ -453,12 +478,21 @@ patch_t *V_CachePatchNum(int lump, pu_tag tag) patch->leftoffset = leftoffset; patch->topoffset = topoffset; free(image); + free(translate); return lumpcache[lump]; error: spng_ctx_free(ctx); Z_Free(buffer); + if (image) + { + free(image); + } + if (translate) + { + free(translate); + } return DummyPatch(lump, tag); } @@ -483,6 +517,8 @@ void *V_CacheFlatNum(int lump, pu_tag tag) return buffer; } + byte *image = NULL, *translate = NULL; + spng_ctx *ctx = spng_ctx_new(0); // Ignore and don't calculate chunk CRC's @@ -508,6 +544,25 @@ void *V_CacheFlatNum(int lump, pu_tag tag) goto error; } + struct spng_plte plte = {0}; + ret = spng_get_plte(ctx, &plte); + + if (ret) + { + I_Printf(VB_ERROR, "V_CacheFlatNum: spng_get_plte %s\n", + spng_strerror(ret)); + goto error; + } + + // Build translation table for palette. + byte *playpal = W_CacheLumpName("PLAYPAL", PU_CACHE); + translate = malloc(plte.n_entries); + for (int i = 0; i < plte.n_entries; ++i) + { + struct spng_plte_entry *e = &plte.entries[i]; + translate[i] = I_GetPaletteIndex(playpal, e->red, e->green, e->blue); + } + size_t image_size = 0; ret = spng_decoded_image_size(ctx, SPNG_FMT_PNG, &image_size); @@ -518,14 +573,18 @@ void *V_CacheFlatNum(int lump, pu_tag tag) goto error; } - void *image = malloc(image_size); + image = malloc(image_size); ret = spng_decode_image(ctx, image, image_size, SPNG_FMT_PNG, 0); + for (int i = 0; i < image_size; ++i) + { + image[i] = translate[image[i]]; + } + if (ret) { I_Printf(VB_ERROR, "V_CacheFlatNum: spng_decode_image %s", spng_strerror(ret)); - free(image); goto error; } @@ -535,12 +594,21 @@ void *V_CacheFlatNum(int lump, pu_tag tag) Z_Malloc(image_size, tag, &lumpcache[lump]); memcpy(lumpcache[lump], image, image_size); free(image); + free(translate); return lumpcache[lump]; error: spng_ctx_free(ctx); Z_Free(buffer); + if (image) + { + free(image); + } + if (translate) + { + free(translate); + } return DummyFlat(lump, tag); }