/* * QEMU graphical console surface helper * * Copyright (c) 2004 Fabrice Bellard * * SPDX-License-Identifier: MIT */ #include "qemu/osdep.h" #include "ui/console.h" #include "ui/vgafont.h" #include "trace.h" void qemu_displaysurface_set_share_handle(DisplaySurface *surface, qemu_pixman_shareable handle, uint32_t offset) { assert(surface->share_handle == SHAREABLE_NONE); surface->share_handle = handle; surface->share_handle_offset = offset; } DisplaySurface *qemu_create_displaysurface(int width, int height) { trace_displaysurface_create(width, height); return qemu_create_displaysurface_from( width, height, PIXMAN_x8r8g8b8, width * 4, NULL ); } DisplaySurface *qemu_create_displaysurface_from(int width, int height, pixman_format_code_t format, int linesize, uint8_t *data) { DisplaySurface *surface = g_new0(DisplaySurface, 1); trace_displaysurface_create_from(surface, width, height, format); surface->share_handle = SHAREABLE_NONE; if (data) { surface->image = pixman_image_create_bits(format, width, height, (void *)data, linesize); } else { qemu_pixman_image_new_shareable(&surface->image, &surface->share_handle, "displaysurface", format, width, height, linesize, &error_abort); surface->flags = QEMU_ALLOCATED_FLAG; } assert(surface->image != NULL); return surface; } DisplaySurface *qemu_create_displaysurface_pixman(pixman_image_t *image) { DisplaySurface *surface = g_new0(DisplaySurface, 1); trace_displaysurface_create_pixman(surface); surface->share_handle = SHAREABLE_NONE; surface->image = pixman_image_ref(image); return surface; } DisplaySurface *qemu_create_placeholder_surface(int w, int h, const char *msg) { DisplaySurface *surface = qemu_create_displaysurface(w, h); #ifdef CONFIG_PIXMAN pixman_color_t bg = QEMU_PIXMAN_COLOR_BLACK; pixman_color_t fg = QEMU_PIXMAN_COLOR_GRAY; pixman_image_t *glyph; int len, x, y, i; len = strlen(msg); x = (w / FONT_WIDTH - len) / 2; y = (h / FONT_HEIGHT - 1) / 2; for (i = 0; i < len; i++) { glyph = qemu_pixman_glyph_from_vgafont(FONT_HEIGHT, vgafont16, msg[i]); qemu_pixman_glyph_render(glyph, surface->image, &fg, &bg, x + i, y, FONT_WIDTH, FONT_HEIGHT); qemu_pixman_image_unref(glyph); } #endif surface->flags |= QEMU_PLACEHOLDER_FLAG; return surface; } void qemu_free_displaysurface(DisplaySurface *surface) { if (surface == NULL) { return; } trace_displaysurface_free(surface); qemu_pixman_image_unref(surface->image); g_free(surface); }