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 48 static inline int surface_is_allocated(DisplaySurface *surface) 49 { 50 return surface->flags & QEMU_ALLOCATED_FLAG; 51 } 52 53 static inline int surface_is_placeholder(DisplaySurface *surface) 54 { 55 return surface->flags & QEMU_PLACEHOLDER_FLAG; 56 } 57 58 static inline int surface_stride(DisplaySurface *s) 59 { 60 return pixman_image_get_stride(s->image); 61 } 62 63 static inline void *surface_data(DisplaySurface *s) 64 { 65 return pixman_image_get_data(s->image); 66 } 67 68 static inline int surface_width(DisplaySurface *s) 69 { 70 return pixman_image_get_width(s->image); 71 } 72 73 static inline int surface_height(DisplaySurface *s) 74 { 75 return pixman_image_get_height(s->image); 76 } 77 78 static inline pixman_format_code_t surface_format(DisplaySurface *s) 79 { 80 return pixman_image_get_format(s->image); 81 } 82 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 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