qemu-pixman.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  3. * See the COPYING file in the top-level directory.
  4. */
  5. #ifndef QEMU_PIXMAN_H
  6. #define QEMU_PIXMAN_H
  7. #ifdef CONFIG_PIXMAN
  8. #include <pixman.h>
  9. #else
  10. #include "pixman-minimal.h"
  11. #endif
  12. #include "qapi/error.h"
  13. /*
  14. * pixman image formats are defined to be native endian,
  15. * that means host byte order on qemu. So we go define
  16. * fixed formats here for cases where it is needed, like
  17. * feeding libjpeg / libpng and writing screenshots.
  18. */
  19. #if HOST_BIG_ENDIAN
  20. # define PIXMAN_BE_r8g8b8 PIXMAN_r8g8b8
  21. # define PIXMAN_BE_x8r8g8b8 PIXMAN_x8r8g8b8
  22. # define PIXMAN_BE_a8r8g8b8 PIXMAN_a8r8g8b8
  23. # define PIXMAN_BE_b8g8r8x8 PIXMAN_b8g8r8x8
  24. # define PIXMAN_BE_b8g8r8a8 PIXMAN_b8g8r8a8
  25. # define PIXMAN_BE_r8g8b8x8 PIXMAN_r8g8b8x8
  26. # define PIXMAN_BE_r8g8b8a8 PIXMAN_r8g8b8a8
  27. # define PIXMAN_BE_x8b8g8r8 PIXMAN_x8b8g8r8
  28. # define PIXMAN_BE_a8b8g8r8 PIXMAN_a8b8g8r8
  29. # define PIXMAN_LE_r8g8b8 PIXMAN_b8g8r8
  30. # define PIXMAN_LE_a8r8g8b8 PIXMAN_b8g8r8a8
  31. # define PIXMAN_LE_x8r8g8b8 PIXMAN_b8g8r8x8
  32. # define PIXMAN_LE_a8b8g8r8 PIXMAN_r8g8b8a8
  33. # define PIXMAN_LE_x8b8g8r8 PIXMAN_r8g8b8x8
  34. #else
  35. # define PIXMAN_BE_r8g8b8 PIXMAN_b8g8r8
  36. # define PIXMAN_BE_x8r8g8b8 PIXMAN_b8g8r8x8
  37. # define PIXMAN_BE_a8r8g8b8 PIXMAN_b8g8r8a8
  38. # define PIXMAN_BE_b8g8r8x8 PIXMAN_x8r8g8b8
  39. # define PIXMAN_BE_b8g8r8a8 PIXMAN_a8r8g8b8
  40. # define PIXMAN_BE_r8g8b8x8 PIXMAN_x8b8g8r8
  41. # define PIXMAN_BE_r8g8b8a8 PIXMAN_a8b8g8r8
  42. # define PIXMAN_BE_x8b8g8r8 PIXMAN_r8g8b8x8
  43. # define PIXMAN_BE_a8b8g8r8 PIXMAN_r8g8b8a8
  44. # define PIXMAN_LE_r8g8b8 PIXMAN_r8g8b8
  45. # define PIXMAN_LE_a8r8g8b8 PIXMAN_a8r8g8b8
  46. # define PIXMAN_LE_x8r8g8b8 PIXMAN_x8r8g8b8
  47. # define PIXMAN_LE_a8b8g8r8 PIXMAN_a8b8g8r8
  48. # define PIXMAN_LE_x8b8g8r8 PIXMAN_x8b8g8r8
  49. #endif
  50. #define QEMU_PIXMAN_COLOR(r, g, b) \
  51. { .red = r << 8, .green = g << 8, .blue = b << 8, .alpha = 0xffff }
  52. #define QEMU_PIXMAN_COLOR_BLACK QEMU_PIXMAN_COLOR(0x00, 0x00, 0x00)
  53. #define QEMU_PIXMAN_COLOR_GRAY QEMU_PIXMAN_COLOR(0xaa, 0xaa, 0xaa)
  54. /* -------------------------------------------------------------------- */
  55. typedef struct PixelFormat {
  56. uint8_t bits_per_pixel;
  57. uint8_t bytes_per_pixel;
  58. uint8_t depth; /* color depth in bits */
  59. uint32_t rmask, gmask, bmask, amask;
  60. uint8_t rshift, gshift, bshift, ashift;
  61. uint8_t rmax, gmax, bmax, amax;
  62. uint8_t rbits, gbits, bbits, abits;
  63. } PixelFormat;
  64. PixelFormat qemu_pixelformat_from_pixman(pixman_format_code_t format);
  65. pixman_format_code_t qemu_default_pixman_format(int bpp, bool native_endian);
  66. pixman_format_code_t qemu_drm_format_to_pixman(uint32_t drm_format);
  67. uint32_t qemu_pixman_to_drm_format(pixman_format_code_t pixman);
  68. int qemu_pixman_get_type(int rshift, int gshift, int bshift);
  69. bool qemu_pixman_check_format(DisplayChangeListener *dcl,
  70. pixman_format_code_t format);
  71. #ifdef CONFIG_PIXMAN
  72. pixman_format_code_t qemu_pixman_get_format(PixelFormat *pf);
  73. pixman_image_t *qemu_pixman_linebuf_create(pixman_format_code_t format,
  74. int width);
  75. void qemu_pixman_linebuf_fill(pixman_image_t *linebuf, pixman_image_t *fb,
  76. int width, int x, int y);
  77. pixman_image_t *qemu_pixman_mirror_create(pixman_format_code_t format,
  78. pixman_image_t *image);
  79. pixman_image_t *qemu_pixman_glyph_from_vgafont(int height, const uint8_t *font,
  80. unsigned int ch);
  81. void qemu_pixman_glyph_render(pixman_image_t *glyph,
  82. pixman_image_t *surface,
  83. pixman_color_t *fgcol,
  84. pixman_color_t *bgcol,
  85. int x, int y, int cw, int ch);
  86. #endif
  87. void qemu_pixman_image_unref(pixman_image_t *image);
  88. #ifdef WIN32
  89. typedef HANDLE qemu_pixman_shareable;
  90. #define SHAREABLE_NONE (NULL)
  91. #define SHAREABLE_TO_PTR(handle) (handle)
  92. #define PTR_TO_SHAREABLE(ptr) (ptr)
  93. #else
  94. typedef int qemu_pixman_shareable;
  95. #define SHAREABLE_NONE (-1)
  96. #define SHAREABLE_TO_PTR(handle) GINT_TO_POINTER(handle)
  97. #define PTR_TO_SHAREABLE(ptr) GPOINTER_TO_INT(ptr)
  98. #endif
  99. bool qemu_pixman_image_new_shareable(
  100. pixman_image_t **image,
  101. qemu_pixman_shareable *handle,
  102. const char *name,
  103. pixman_format_code_t format,
  104. int width,
  105. int height,
  106. int rowstride_bytes,
  107. Error **errp);
  108. G_DEFINE_AUTOPTR_CLEANUP_FUNC(pixman_image_t, qemu_pixman_image_unref)
  109. #endif /* QEMU_PIXMAN_H */