pushColors() has two overloaded methods. The one that uses PROGMEM expects little-endian pixels. i.e. each pixel uses two uint8_t bytes. low-high.
I suspect that you have got your bytes in high-low order.
You have set your 32x32 window correctly.
But you have specified 40x40 pixels rather than 32x32 pixels.
Mind you, the window should just ignore any extra pixels after you have filled all 32x32 pixels.
extern const uint8_t wifi_full[];
int x=479-32,y=1,px=32,py=32;
tft.setAddrWindow(x, y, x+(px-1), y+(py-1));
tft.pushColors(wifi_full, 32 * 32, 1);
Sorry about the convoluted arguments. Most AVR or 8051 data is little-endian. But the TFT expects big-endian data.
This places your Wifi icon at the same X, Y as the Penguin but with a 32x32 window.
And pushes 32x32 pixels from Flash stored in a Bigendian order.
It also means that you can display icons that were stored as uint16_t and not uint8_t. Just cast the address with (const uint8_t *) to make sure you call the correct overloaded method.
I would appreciate your comments. This makes pushColors() different to the original Adafruit. That only has a (uint8_t *) method.