1 /*
2 * SPDX-License-Identifier: GPL-2.0-or-later
3 * QEMU UI Console
4 */
5 #ifndef SURFACE_H
6 #define SURFACE_H
7
8 #include "ui/qemu-pixman.h"
9
10 #ifdef CONFIG_OPENGL
11 # include <epoxy/gl.h>
12 # include "ui/shader.h"
13 #endif
14
15 #define QEMU_ALLOCATED_FLAG 0x01
16 #define QEMU_PLACEHOLDER_FLAG 0x02
17
18 typedef struct DisplaySurface {
19 pixman_image_t *image;
20 uint8_t flags;
21 #ifdef CONFIG_OPENGL
22 GLenum glformat;
23 GLenum gltype;
24 GLuint texture;
25 #endif
26 #ifdef WIN32
27 HANDLE handle;
28 uint32_t handle_offset;
29 #endif
30 } DisplaySurface;
31
32 PixelFormat qemu_default_pixelformat(int bpp);
33
34 DisplaySurface *qemu_create_displaysurface_from(int width, int height,
35 pixman_format_code_t format,
36 int linesize, uint8_t *data);
37 DisplaySurface *qemu_create_displaysurface_pixman(pixman_image_t *image);
38 DisplaySurface *qemu_create_placeholder_surface(int w, int h,
39 const char *msg);
40 #ifdef WIN32
41 void qemu_displaysurface_win32_set_handle(DisplaySurface *surface,
42 HANDLE h, uint32_t offset);
43 #endif
44
45 DisplaySurface *qemu_create_displaysurface(int width, int height);
46 void qemu_free_displaysurface(DisplaySurface *surface);
47
surface_is_allocated(DisplaySurface * surface)48 static inline int surface_is_allocated(DisplaySurface *surface)
49 {
50 return surface->flags & QEMU_ALLOCATED_FLAG;
51 }
52
surface_is_placeholder(DisplaySurface * surface)53 static inline int surface_is_placeholder(DisplaySurface *surface)
54 {
55 return surface->flags & QEMU_PLACEHOLDER_FLAG;
56 }
57
surface_stride(DisplaySurface * s)58 static inline int surface_stride(DisplaySurface *s)
59 {
60 return pixman_image_get_stride(s->image);
61 }
62
surface_data(DisplaySurface * s)63 static inline void *surface_data(DisplaySurface *s)
64 {
65 return pixman_image_get_data(s->image);
66 }
67
surface_width(DisplaySurface * s)68 static inline int surface_width(DisplaySurface *s)
69 {
70 return pixman_image_get_width(s->image);
71 }
72
surface_height(DisplaySurface * s)73 static inline int surface_height(DisplaySurface *s)
74 {
75 return pixman_image_get_height(s->image);
76 }
77
surface_format(DisplaySurface * s)78 static inline pixman_format_code_t surface_format(DisplaySurface *s)
79 {
80 return pixman_image_get_format(s->image);
81 }
82
surface_bits_per_pixel(DisplaySurface * s)83 static inline int surface_bits_per_pixel(DisplaySurface *s)
84 {
85 int bits = PIXMAN_FORMAT_BPP(surface_format(s));
86 return bits;
87 }
88
surface_bytes_per_pixel(DisplaySurface * s)89 static inline int surface_bytes_per_pixel(DisplaySurface *s)
90 {
91 int bits = PIXMAN_FORMAT_BPP(surface_format(s));
92 return DIV_ROUND_UP(bits, 8);
93 }
94
95 #endif
96