GRRLIB / GRRLIB

Wii coding library
http://grrlib.santo.fr
MIT License
133 stars 16 forks source link

Missing documentation / weird behaviour with PNG where `size % 4 != 0` #32

Open arthurlm opened 1 year ago

arthurlm commented 1 year ago

Hi,

This question may have been ask earlier on GRRLIB forum, but I did not find any reference to this issue.

Problem description

There is weird / maybe undocumented behavior with PNG texture loading. If texture width or height is not multiple of 4, then PNG data is zeroed.

This is due to the following check in GRRLIB_LoadTexturePNG: https://github.com/GRRLIB/GRRLIB/blob/3ee20bffc24c3e3d95f690d83369b2bf406eb35d/GRRLIB/GRRLIB/GRRLIB_texEdit.c#L173-L176

Width and height parameter are changed in libpngu in function PNGU_DecodeTo4x4RGBA8 here: https://github.com/GRRLIB/GRRLIB/blob/3ee20bffc24c3e3d95f690d83369b2bf406eb35d/GRRLIB/lib/pngu/pngu.c#L601-L602

There are others conditions that may update witdh and height but this one is the most obvious and error prone to me.

Questions

What is the exact purpose of this check ? Why cannot we load not multiple by 4 PNG data ? When check is removed, all seems to work fine. Is this related to Wii hardware ?

Do we really need to recompute image size + decode PNG data if content is zeroed after ? Does this check can be moved to libpngu ? Looking at the code, most PNG loading tricks are not needed if we drop content. Function can be simplified (see https://github.com/GRRLIB/GRRLIB/commit/2654a8903641d085b813747f89da76a47009f176).

This may be silly, but what is the exact purpose of libpngu ? Is it here to make an abstraction layer between GRRLIB and libpng ? Does it come from somewhere else ? Most of the code in it look unused / dead.

Should we add some documentation on GRRLIB_LoadTexturePNG on the image size multiple by 4 (instead of not correct) ?

Code to reproduce

I have made a branch on repository fork to store code and resources (see commit: https://github.com/GRRLIB/GRRLIB/commit/2b73935bef8455e8a19e0c4d7ebd867d962f6521).

Bellow are some screenshot of running application.