Statistics
| Branch: | Revision:

root / ui / qemu-pixman.c @ 6a1751b7

History | View | Annotate | Download (4.1 kB)

1 daa8e5a0 Gerd Hoffmann
/*
2 daa8e5a0 Gerd Hoffmann
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
3 daa8e5a0 Gerd Hoffmann
 * See the COPYING file in the top-level directory.
4 daa8e5a0 Gerd Hoffmann
 */
5 daa8e5a0 Gerd Hoffmann
6 0b087861 Peter Maydell
#include "qemu-common.h"
7 0b087861 Peter Maydell
#include "ui/console.h"
8 d2ec7e24 Gerd Hoffmann
9 d2ec7e24 Gerd Hoffmann
int qemu_pixman_get_type(int rshift, int gshift, int bshift)
10 d2ec7e24 Gerd Hoffmann
{
11 d2ec7e24 Gerd Hoffmann
    int type = PIXMAN_TYPE_OTHER;
12 d2ec7e24 Gerd Hoffmann
13 d2ec7e24 Gerd Hoffmann
    if (rshift > gshift && gshift > bshift) {
14 d2ec7e24 Gerd Hoffmann
        if (bshift == 0) {
15 d2ec7e24 Gerd Hoffmann
            type = PIXMAN_TYPE_ARGB;
16 d2ec7e24 Gerd Hoffmann
        } else {
17 d2ec7e24 Gerd Hoffmann
#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0, 21, 8)
18 d2ec7e24 Gerd Hoffmann
            type = PIXMAN_TYPE_RGBA;
19 d2ec7e24 Gerd Hoffmann
#endif
20 d2ec7e24 Gerd Hoffmann
        }
21 d2ec7e24 Gerd Hoffmann
    } else if (rshift < gshift && gshift < bshift) {
22 d2ec7e24 Gerd Hoffmann
        if (rshift == 0) {
23 d2ec7e24 Gerd Hoffmann
            type = PIXMAN_TYPE_ABGR;
24 d2ec7e24 Gerd Hoffmann
        } else {
25 fbddfc72 Gerd Hoffmann
#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0, 16, 0)
26 d2ec7e24 Gerd Hoffmann
            type = PIXMAN_TYPE_BGRA;
27 6e72719e Alexander Graf
#endif
28 d2ec7e24 Gerd Hoffmann
        }
29 d2ec7e24 Gerd Hoffmann
    }
30 d2ec7e24 Gerd Hoffmann
    return type;
31 d2ec7e24 Gerd Hoffmann
}
32 d2ec7e24 Gerd Hoffmann
33 d2ec7e24 Gerd Hoffmann
pixman_format_code_t qemu_pixman_get_format(PixelFormat *pf)
34 d2ec7e24 Gerd Hoffmann
{
35 d2ec7e24 Gerd Hoffmann
    pixman_format_code_t format;
36 d2ec7e24 Gerd Hoffmann
    int type;
37 d2ec7e24 Gerd Hoffmann
38 d2ec7e24 Gerd Hoffmann
    type = qemu_pixman_get_type(pf->rshift, pf->gshift, pf->bshift);
39 d2ec7e24 Gerd Hoffmann
    format = PIXMAN_FORMAT(pf->bits_per_pixel, type,
40 d2ec7e24 Gerd Hoffmann
                           pf->abits, pf->rbits, pf->gbits, pf->bbits);
41 d2ec7e24 Gerd Hoffmann
    if (!pixman_format_supported_source(format)) {
42 d2ec7e24 Gerd Hoffmann
        return 0;
43 d2ec7e24 Gerd Hoffmann
    }
44 d2ec7e24 Gerd Hoffmann
    return format;
45 d2ec7e24 Gerd Hoffmann
}
46 d2ec7e24 Gerd Hoffmann
47 d2ec7e24 Gerd Hoffmann
pixman_image_t *qemu_pixman_linebuf_create(pixman_format_code_t format,
48 d2ec7e24 Gerd Hoffmann
                                           int width)
49 d2ec7e24 Gerd Hoffmann
{
50 d2ec7e24 Gerd Hoffmann
    pixman_image_t *image = pixman_image_create_bits(format, width, 1, NULL, 0);
51 d2ec7e24 Gerd Hoffmann
    assert(image != NULL);
52 d2ec7e24 Gerd Hoffmann
    return image;
53 d2ec7e24 Gerd Hoffmann
}
54 d2ec7e24 Gerd Hoffmann
55 d2ec7e24 Gerd Hoffmann
void qemu_pixman_linebuf_fill(pixman_image_t *linebuf, pixman_image_t *fb,
56 bc210eb1 Gerd Hoffmann
                              int width, int x, int y)
57 d2ec7e24 Gerd Hoffmann
{
58 d2ec7e24 Gerd Hoffmann
    pixman_image_composite(PIXMAN_OP_SRC, fb, NULL, linebuf,
59 bc210eb1 Gerd Hoffmann
                           x, y, 0, 0, 0, 0, width, 1);
60 d2ec7e24 Gerd Hoffmann
}
61 d2ec7e24 Gerd Hoffmann
62 d9a86569 Gerd Hoffmann
pixman_image_t *qemu_pixman_mirror_create(pixman_format_code_t format,
63 d9a86569 Gerd Hoffmann
                                          pixman_image_t *image)
64 d9a86569 Gerd Hoffmann
{
65 d9a86569 Gerd Hoffmann
    pixman_image_t *mirror;
66 d9a86569 Gerd Hoffmann
67 d9a86569 Gerd Hoffmann
    mirror = pixman_image_create_bits(format,
68 d9a86569 Gerd Hoffmann
                                      pixman_image_get_width(image),
69 d9a86569 Gerd Hoffmann
                                      pixman_image_get_height(image),
70 d9a86569 Gerd Hoffmann
                                      NULL,
71 d9a86569 Gerd Hoffmann
                                      pixman_image_get_stride(image));
72 d9a86569 Gerd Hoffmann
    return mirror;
73 d9a86569 Gerd Hoffmann
}
74 d9a86569 Gerd Hoffmann
75 d2ec7e24 Gerd Hoffmann
void qemu_pixman_image_unref(pixman_image_t *image)
76 d2ec7e24 Gerd Hoffmann
{
77 d2ec7e24 Gerd Hoffmann
    if (image == NULL) {
78 d2ec7e24 Gerd Hoffmann
        return;
79 d2ec7e24 Gerd Hoffmann
    }
80 d2ec7e24 Gerd Hoffmann
    pixman_image_unref(image);
81 d2ec7e24 Gerd Hoffmann
}
82 867c538f Gerd Hoffmann
83 867c538f Gerd Hoffmann
pixman_color_t qemu_pixman_color(PixelFormat *pf, uint32_t color)
84 867c538f Gerd Hoffmann
{
85 867c538f Gerd Hoffmann
    pixman_color_t c;
86 867c538f Gerd Hoffmann
87 867c538f Gerd Hoffmann
    c.red   = ((color & pf->rmask) >> pf->rshift) << (16 - pf->rbits);
88 867c538f Gerd Hoffmann
    c.green = ((color & pf->gmask) >> pf->gshift) << (16 - pf->gbits);
89 867c538f Gerd Hoffmann
    c.blue  = ((color & pf->bmask) >> pf->bshift) << (16 - pf->bbits);
90 867c538f Gerd Hoffmann
    c.alpha = ((color & pf->amask) >> pf->ashift) << (16 - pf->abits);
91 867c538f Gerd Hoffmann
    return c;
92 867c538f Gerd Hoffmann
}
93 b7627952 Gerd Hoffmann
94 b7627952 Gerd Hoffmann
pixman_image_t *qemu_pixman_glyph_from_vgafont(int height, const uint8_t *font,
95 b7627952 Gerd Hoffmann
                                               unsigned int ch)
96 b7627952 Gerd Hoffmann
{
97 b7627952 Gerd Hoffmann
    pixman_image_t *glyph;
98 b7627952 Gerd Hoffmann
    uint8_t *data;
99 b7627952 Gerd Hoffmann
    bool bit;
100 b7627952 Gerd Hoffmann
    int x, y;
101 b7627952 Gerd Hoffmann
102 b7627952 Gerd Hoffmann
    glyph = pixman_image_create_bits(PIXMAN_a8, 8, height,
103 b7627952 Gerd Hoffmann
                                     NULL, 0);
104 b7627952 Gerd Hoffmann
    data = (uint8_t *)pixman_image_get_data(glyph);
105 b7627952 Gerd Hoffmann
106 b7627952 Gerd Hoffmann
    font += height * ch;
107 b7627952 Gerd Hoffmann
    for (y = 0; y < height; y++, font++) {
108 b7627952 Gerd Hoffmann
        for (x = 0; x < 8; x++, data++) {
109 b7627952 Gerd Hoffmann
            bit = (*font) & (1 << (7-x));
110 b7627952 Gerd Hoffmann
            *data = bit ? 0xff : 0x00;
111 b7627952 Gerd Hoffmann
        }
112 b7627952 Gerd Hoffmann
    }
113 b7627952 Gerd Hoffmann
    return glyph;
114 b7627952 Gerd Hoffmann
}
115 b7627952 Gerd Hoffmann
116 b7627952 Gerd Hoffmann
void qemu_pixman_glyph_render(pixman_image_t *glyph,
117 b7627952 Gerd Hoffmann
                              pixman_image_t *surface,
118 b7627952 Gerd Hoffmann
                              pixman_color_t *fgcol,
119 b7627952 Gerd Hoffmann
                              pixman_color_t *bgcol,
120 b7627952 Gerd Hoffmann
                              int x, int y, int cw, int ch)
121 b7627952 Gerd Hoffmann
{
122 b7627952 Gerd Hoffmann
    pixman_image_t *ifg = pixman_image_create_solid_fill(fgcol);
123 b7627952 Gerd Hoffmann
    pixman_image_t *ibg = pixman_image_create_solid_fill(bgcol);
124 b7627952 Gerd Hoffmann
125 b7627952 Gerd Hoffmann
    pixman_image_composite(PIXMAN_OP_SRC, ibg, NULL, surface,
126 b7627952 Gerd Hoffmann
                           0, 0, 0, 0,
127 b7627952 Gerd Hoffmann
                           cw * x, ch * y,
128 b7627952 Gerd Hoffmann
                           cw, ch);
129 b7627952 Gerd Hoffmann
    pixman_image_composite(PIXMAN_OP_OVER, ifg, glyph, surface,
130 b7627952 Gerd Hoffmann
                           0, 0, 0, 0,
131 b7627952 Gerd Hoffmann
                           cw * x, ch * y,
132 b7627952 Gerd Hoffmann
                           cw, ch);
133 b7627952 Gerd Hoffmann
    pixman_image_unref(ifg);
134 b7627952 Gerd Hoffmann
    pixman_image_unref(ibg);
135 b7627952 Gerd Hoffmann
}