qemu-e2k/ui
Peter Maydell cd22a0f520 ui: Fix pixel colour channel order for PNG screenshots
When we take a PNG screenshot the ordering of the colour channels in
the data is not correct, resulting in the image having weird
colouring compared to the actual display.  (Specifically, on a
little-endian host the blue and red channels are swapped; on
big-endian everything is wrong.)

This happens because the pixman idea of the pixel data and the libpng
idea differ.  PIXMAN_a8r8g8b8 defines that pixels are 32-bit values,
with A in bits 24-31, R in bits 16-23, G in bits 8-15 and B in bits
0-7.  This means that on little-endian systems the bytes in memory
are
   B G R A
and on big-endian systems they are
   A R G B

libpng, on the other hand, thinks of pixels as being a series of
values for each channel, so its format PNG_COLOR_TYPE_RGB_ALPHA
always wants bytes in the order
   R G B A

This isn't the same as the pixman order for either big or little
endian hosts.

The alpha channel is also unnecessary bulk in the output PNG file,
because there is no alpha information in a screenshot.

To handle the endianness issue, we already define in ui/qemu-pixman.h
various PIXMAN_BE_* and PIXMAN_LE_* values that give consistent
byte-order pixel channel formats.  So we can use PIXMAN_BE_r8g8b8 and
PNG_COLOR_TYPE_RGB, which both have an in-memory byte order of
    R G B
and 3 bytes per pixel.

(PPM format screenshots get this right; they already use the
PIXMAN_BE_r8g8b8 format.)

Cc: qemu-stable@nongnu.org
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1622
Fixes: 9a0a119a38 ("Added parameter to take screenshot with screendump as PNG")
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-id: 20230502135548.2451309-1-peter.maydell@linaro.org
2023-05-12 15:43:38 +01:00
..
icons
keycodemapdb@f5772a62ec Add qemu qcode support for keys F13 to F24 2023-03-14 13:41:21 +00:00
shader ui/shader: fix #version directive must occur on first line 2023-03-13 23:48:45 +04:00
clipboard.c
cocoa.m *: Add missing includes of qemu/error-report.h 2023-03-22 15:06:57 +00:00
console-gl.c
console.c ui: Fix pixel colour channel order for PNG screenshots 2023-05-12 15:43:38 +01:00
curses_keys.h
curses.c
cursor_hidden.xpm
cursor_left_ptr.xpm
cursor.c ui: rename cursor_{get->ref}, return it 2023-03-13 22:57:39 +04:00
dbus-chardev.c
dbus-clipboard.c ui/dbus: unregister clipboard on connection close 2023-03-13 22:57:39 +04:00
dbus-console.c ui/dbus: set mouse is-absolute during console creation 2023-03-13 22:57:39 +04:00
dbus-display1.xml
dbus-error.c
dbus-listener.c ui/dbus: restrict opengl to gbm-enabled config 2023-03-13 23:48:45 +04:00
dbus-module.c
dbus.c ui/dbus: fix passing SOCKET to GSocket API & leak 2023-03-21 11:16:03 +04:00
dbus.h
egl-context.c
egl-headless.c ui: introduce egl_init() 2023-03-13 23:48:45 +04:00
egl-helpers.c ui: introduce egl_init() 2023-03-13 23:48:45 +04:00
gtk-clipboard.c
gtk-egl.c ui/gtk: prevent ui lock up when dpy_gl_update called again before current draw event occurs 2022-11-23 12:27:55 +01:00
gtk-gl-area.c ui/gtk: prevent ui lock up when dpy_gl_update called again before current draw event occurs 2022-11-23 12:27:55 +01:00
gtk.c ui: fix crash on serial reset, during init 2023-03-21 11:46:22 +04:00
input-barrier.c
input-barrier.h
input-keymap.c
input-legacy.c
input-linux.c
input.c ui: Simplify control flow in qemu_mouse_set() 2023-01-19 13:30:01 +01:00
kbd-state.c
keymaps.c
keymaps.h
meson.build ui/dbus: do not require opengl & gbm 2023-03-13 23:48:45 +04:00
qemu-pixman.c
qemu-x509.h
qemu.desktop
sdl2-2d.c
sdl2-gl.c
sdl2-input.c
sdl2.c ui/sdl2: remove workaround forcing x11 2023-03-21 11:25:31 +04:00
shader.c
spice-app.c Do not include "qemu/error-report.h" in headers that do not need it 2023-02-14 09:11:27 +01:00
spice-core.c ui/spice: fix compilation on win32 2023-03-24 11:55:55 +01:00
spice-display.c ui: rename cursor_{get->ref}, return it 2023-03-13 22:57:39 +04:00
spice-input.c
spice-module.c
trace-events
trace.h
udmabuf.c Do not include "qemu/error-report.h" in headers that do not need it 2023-02-14 09:11:27 +01:00
ui-hmp-cmds.c spice: move client_migrate_info command to ui/ 2023-04-24 15:01:46 +02:00
ui-qmp-cmds.c spice: move client_migrate_info command to ui/ 2023-04-24 15:01:46 +02:00
util.c include/hw/pci: Split pci_device.h off pci.h 2023-01-08 01:54:22 -05:00
vdagent.c Do not include "qemu/error-report.h" in headers that do not need it 2023-02-14 09:11:27 +01:00
vgafont.h ui: fix tab indentation 2022-11-08 10:23:06 +01:00
vnc_keysym.h ui: fix tab indentation 2022-11-08 10:23:06 +01:00
vnc-auth-sasl.c
vnc-auth-sasl.h
vnc-auth-vencrypt.c
vnc-auth-vencrypt.h
vnc-clipboard.c
vnc-enc-hextile-template.h
vnc-enc-hextile.c Drop useless casts from g_malloc() & friends to pointer 2022-10-22 23:15:40 +02:00
vnc-enc-tight.c
vnc-enc-tight.h
vnc-enc-zlib.c
vnc-enc-zrle.c
vnc-enc-zrle.c.inc
vnc-enc-zrle.h
vnc-enc-zywrle-template.c ui: fix tab indentation 2022-11-08 10:23:06 +01:00
vnc-enc-zywrle.h ui: fix tab indentation 2022-11-08 10:23:06 +01:00
vnc-jobs.c treewide: Remove the unnecessary space before semicolon 2022-10-24 13:41:10 +02:00
vnc-jobs.h
vnc-palette.c
vnc-palette.h
vnc-stubs.c
vnc-ws.c
vnc-ws.h
vnc.c vnc: avoid underflow when accessing user-provided address 2023-04-20 11:17:35 +02:00
vnc.h ui: keep current cursor with QemuConsole 2023-03-13 22:57:39 +04:00
win32-kbd-hook.c
x_keymap.c
x_keymap.h