pimoroni / pimoroni-pico

Libraries and examples to support Pimoroni Pico add-ons in C++ and MicroPython.
https://shop.pimoroni.com/collections/pico
MIT License
1.32k stars 499 forks source link

Feature request: get_palette() for P4 and P8 modes and PNGs #994

Open LionsPhil opened 2 months ago

LionsPhil commented 2 months ago

Since PNGdec has been added, you can now load and set the palette along with an image using PNG_COPY. However, there's no way to get the palette from PNGdec I can see (even undocumented), nor a way to read the current palette from PicoGraphics.

A reason to want this is for palette cycling. This is a nice cheap way to get some animation without having to slowly push new pixels to the display. (You could also do fadeouts, if you really wanted.) Being able to get the palette from the image one way or another (and via PicoGraphics seems the more reasonable) would let me replace the custom image format I'm using with just PNG.

LionsPhil commented 2 months ago

Actually, it's possible I've misunderstood what PNG_COPY does...it doesn't set the palette, does it? Instead it assumes the display palette and the image palette are the same (or you want do color remapping tricks) and just copies indicies.

So I guess I'm actually asking for a way to get the palette out of a loaded PNG after all.

Gadgetoid commented 2 months ago

I can't remember off the top of my head how straight-forward this is likely to be, but it makes sense and it's on my long list of things to prod and poke when I get the time!

Gadgetoid commented 1 month ago

At a wild guess - it's been so long since I looked into this - the existing get_palette only works after displaying a PNG?

Ah, it looks like it uses decode() to load the palette, but passes in a nullptr for the userdata which might cause... things to happen (horribly crashing, memory corruption and other excitement maybe...).