16d8cd7c2SMarc-André Lureau /*
26d8cd7c2SMarc-André Lureau * SPDX-License-Identifier: GPL-2.0-or-later
36d8cd7c2SMarc-André Lureau * QEMU UI Console
46d8cd7c2SMarc-André Lureau */
56d8cd7c2SMarc-André Lureau #ifndef SURFACE_H
66d8cd7c2SMarc-André Lureau #define SURFACE_H
76d8cd7c2SMarc-André Lureau
86d8cd7c2SMarc-André Lureau #include "ui/qemu-pixman.h"
96d8cd7c2SMarc-André Lureau
106d8cd7c2SMarc-André Lureau #ifdef CONFIG_OPENGL
116d8cd7c2SMarc-André Lureau # include <epoxy/gl.h>
126d8cd7c2SMarc-André Lureau # include "ui/shader.h"
136d8cd7c2SMarc-André Lureau #endif
146d8cd7c2SMarc-André Lureau
156d8cd7c2SMarc-André Lureau #define QEMU_ALLOCATED_FLAG 0x01
166d8cd7c2SMarc-André Lureau #define QEMU_PLACEHOLDER_FLAG 0x02
176d8cd7c2SMarc-André Lureau
186d8cd7c2SMarc-André Lureau typedef struct DisplaySurface {
196d8cd7c2SMarc-André Lureau pixman_image_t *image;
206d8cd7c2SMarc-André Lureau uint8_t flags;
216d8cd7c2SMarc-André Lureau #ifdef CONFIG_OPENGL
226d8cd7c2SMarc-André Lureau GLenum glformat;
236d8cd7c2SMarc-André Lureau GLenum gltype;
246d8cd7c2SMarc-André Lureau GLuint texture;
256d8cd7c2SMarc-André Lureau #endif
266d8cd7c2SMarc-André Lureau #ifdef WIN32
276d8cd7c2SMarc-André Lureau HANDLE handle;
286d8cd7c2SMarc-André Lureau uint32_t handle_offset;
296d8cd7c2SMarc-André Lureau #endif
306d8cd7c2SMarc-André Lureau } DisplaySurface;
316d8cd7c2SMarc-André Lureau
326d8cd7c2SMarc-André Lureau PixelFormat qemu_default_pixelformat(int bpp);
336d8cd7c2SMarc-André Lureau
346d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_from(int width, int height,
356d8cd7c2SMarc-André Lureau pixman_format_code_t format,
366d8cd7c2SMarc-André Lureau int linesize, uint8_t *data);
376d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface_pixman(pixman_image_t *image);
386d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_placeholder_surface(int w, int h,
396d8cd7c2SMarc-André Lureau const char *msg);
406d8cd7c2SMarc-André Lureau #ifdef WIN32
416d8cd7c2SMarc-André Lureau void qemu_displaysurface_win32_set_handle(DisplaySurface *surface,
426d8cd7c2SMarc-André Lureau HANDLE h, uint32_t offset);
436d8cd7c2SMarc-André Lureau #endif
446d8cd7c2SMarc-André Lureau
456d8cd7c2SMarc-André Lureau DisplaySurface *qemu_create_displaysurface(int width, int height);
466d8cd7c2SMarc-André Lureau void qemu_free_displaysurface(DisplaySurface *surface);
476d8cd7c2SMarc-André Lureau
surface_is_allocated(DisplaySurface * surface)48*abd749b5SGerd Hoffmann static inline int surface_is_allocated(DisplaySurface *surface)
496d8cd7c2SMarc-André Lureau {
50*abd749b5SGerd Hoffmann return surface->flags & QEMU_ALLOCATED_FLAG;
516d8cd7c2SMarc-André Lureau }
526d8cd7c2SMarc-André Lureau
surface_is_placeholder(DisplaySurface * surface)539badf12aSGerd Hoffmann static inline int surface_is_placeholder(DisplaySurface *surface)
546d8cd7c2SMarc-André Lureau {
556d8cd7c2SMarc-André Lureau return surface->flags & QEMU_PLACEHOLDER_FLAG;
566d8cd7c2SMarc-André Lureau }
576d8cd7c2SMarc-André Lureau
surface_stride(DisplaySurface * s)586d8cd7c2SMarc-André Lureau static inline int surface_stride(DisplaySurface *s)
596d8cd7c2SMarc-André Lureau {
606d8cd7c2SMarc-André Lureau return pixman_image_get_stride(s->image);
616d8cd7c2SMarc-André Lureau }
626d8cd7c2SMarc-André Lureau
surface_data(DisplaySurface * s)636d8cd7c2SMarc-André Lureau static inline void *surface_data(DisplaySurface *s)
646d8cd7c2SMarc-André Lureau {
656d8cd7c2SMarc-André Lureau return pixman_image_get_data(s->image);
666d8cd7c2SMarc-André Lureau }
676d8cd7c2SMarc-André Lureau
surface_width(DisplaySurface * s)686d8cd7c2SMarc-André Lureau static inline int surface_width(DisplaySurface *s)
696d8cd7c2SMarc-André Lureau {
706d8cd7c2SMarc-André Lureau return pixman_image_get_width(s->image);
716d8cd7c2SMarc-André Lureau }
726d8cd7c2SMarc-André Lureau
surface_height(DisplaySurface * s)736d8cd7c2SMarc-André Lureau static inline int surface_height(DisplaySurface *s)
746d8cd7c2SMarc-André Lureau {
756d8cd7c2SMarc-André Lureau return pixman_image_get_height(s->image);
766d8cd7c2SMarc-André Lureau }
776d8cd7c2SMarc-André Lureau
surface_format(DisplaySurface * s)786d8cd7c2SMarc-André Lureau static inline pixman_format_code_t surface_format(DisplaySurface *s)
796d8cd7c2SMarc-André Lureau {
806d8cd7c2SMarc-André Lureau return pixman_image_get_format(s->image);
816d8cd7c2SMarc-André Lureau }
826d8cd7c2SMarc-André Lureau
surface_bits_per_pixel(DisplaySurface * s)836d8cd7c2SMarc-André Lureau static inline int surface_bits_per_pixel(DisplaySurface *s)
846d8cd7c2SMarc-André Lureau {
856d8cd7c2SMarc-André Lureau int bits = PIXMAN_FORMAT_BPP(surface_format(s));
866d8cd7c2SMarc-André Lureau return bits;
876d8cd7c2SMarc-André Lureau }
886d8cd7c2SMarc-André Lureau
surface_bytes_per_pixel(DisplaySurface * s)896d8cd7c2SMarc-André Lureau static inline int surface_bytes_per_pixel(DisplaySurface *s)
906d8cd7c2SMarc-André Lureau {
916d8cd7c2SMarc-André Lureau int bits = PIXMAN_FORMAT_BPP(surface_format(s));
926d8cd7c2SMarc-André Lureau return DIV_ROUND_UP(bits, 8);
936d8cd7c2SMarc-André Lureau }
946d8cd7c2SMarc-André Lureau
956d8cd7c2SMarc-André Lureau #endif
96