qemu/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 ui/clipboard: reset the serial state on reset 2022-09-23 14:38:27 +02:00
cocoa.m *: Add missing includes of qemu/error-report.h 2023-03-22 15:06:57 +00:00
console-gl.c ui/console: fix texture leak when calling surface_gl_create_texture() 2022-03-04 11:28:37 +01:00
console.c ui: Fix pixel colour channel order for PNG screenshots 2023-05-12 15:43:38 +01:00
curses_keys.h
curses.c ui/curses: Avoid dynamic stack allocation 2022-09-22 16:38:28 +01:00
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 ui/dbus: add chardev backend & interface 2021-12-21 10:50:22 +04:00
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 ui/dbus: add chardev backend & interface 2021-12-21 10:50:22 +04:00
dbus-error.c ui: add a D-Bus display backend 2021-12-21 10:50:22 +04:00
dbus-listener.c ui/dbus: restrict opengl to gbm-enabled config 2023-03-13 23:48:45 +04:00
dbus-module.c ui/dbus: add p2p=on/off option 2021-12-21 10:50:22 +04:00
dbus.c ui/dbus: fix passing SOCKET to GSocket API & leak 2023-03-21 11:16:03 +04:00
dbus.h ui: fix path to dbus-display1.h 2022-09-29 18:23:51 +02:00
egl-context.c ui: split the GL context in a different object 2021-12-21 10:50:21 +04:00
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 Remove qemu-common.h include from most units 2022-04-06 14:31:55 +02:00
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 ui/input-legacy: pass horizontal scroll information 2022-01-13 15:33:18 +01:00
input-linux.c ui: replace qemu_set_nonblock() 2022-05-03 15:52:37 +04:00
input.c ui: Simplify control flow in qemu_mouse_set() 2023-01-19 13:30:01 +01:00
kbd-state.c
keymaps.c Remove qemu-common.h include from most units 2022-04-06 14:31:55 +02:00
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 ui: split the GL context in a different object 2021-12-21 10:50:21 +04:00
sdl2-input.c
sdl2.c ui/sdl2: remove workaround forcing x11 2023-03-21 11:25:31 +04:00
shader.c ui/shader: free associated programs 2022-03-14 15:16:16 +04:00
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 ui: add some vdagent related traces 2022-09-23 14:38:23 +02:00
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 Remove qemu-common.h include from most units 2022-04-06 14:31:55 +02:00
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 Replacing CONFIG_VNC_PNG with CONFIG_PNG 2022-04-27 07:50:28 +02:00
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