Statistics
| Branch: | Revision:

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

History | View | Annotate | Download (4.1 kB)

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

    
6
#include "qemu-common.h"
7
#include "ui/console.h"
8

    
9
int qemu_pixman_get_type(int rshift, int gshift, int bshift)
10
{
11
    int type = PIXMAN_TYPE_OTHER;
12

    
13
    if (rshift > gshift && gshift > bshift) {
14
        if (bshift == 0) {
15
            type = PIXMAN_TYPE_ARGB;
16
        } else {
17
#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0, 21, 8)
18
            type = PIXMAN_TYPE_RGBA;
19
#endif
20
        }
21
    } else if (rshift < gshift && gshift < bshift) {
22
        if (rshift == 0) {
23
            type = PIXMAN_TYPE_ABGR;
24
        } else {
25
#if PIXMAN_VERSION >= PIXMAN_VERSION_ENCODE(0, 16, 0)
26
            type = PIXMAN_TYPE_BGRA;
27
#endif
28
        }
29
    }
30
    return type;
31
}
32

    
33
pixman_format_code_t qemu_pixman_get_format(PixelFormat *pf)
34
{
35
    pixman_format_code_t format;
36
    int type;
37

    
38
    type = qemu_pixman_get_type(pf->rshift, pf->gshift, pf->bshift);
39
    format = PIXMAN_FORMAT(pf->bits_per_pixel, type,
40
                           pf->abits, pf->rbits, pf->gbits, pf->bbits);
41
    if (!pixman_format_supported_source(format)) {
42
        return 0;
43
    }
44
    return format;
45
}
46

    
47
pixman_image_t *qemu_pixman_linebuf_create(pixman_format_code_t format,
48
                                           int width)
49
{
50
    pixman_image_t *image = pixman_image_create_bits(format, width, 1, NULL, 0);
51
    assert(image != NULL);
52
    return image;
53
}
54

    
55
void qemu_pixman_linebuf_fill(pixman_image_t *linebuf, pixman_image_t *fb,
56
                              int width, int x, int y)
57
{
58
    pixman_image_composite(PIXMAN_OP_SRC, fb, NULL, linebuf,
59
                           x, y, 0, 0, 0, 0, width, 1);
60
}
61

    
62
pixman_image_t *qemu_pixman_mirror_create(pixman_format_code_t format,
63
                                          pixman_image_t *image)
64
{
65
    pixman_image_t *mirror;
66

    
67
    mirror = pixman_image_create_bits(format,
68
                                      pixman_image_get_width(image),
69
                                      pixman_image_get_height(image),
70
                                      NULL,
71
                                      pixman_image_get_stride(image));
72
    return mirror;
73
}
74

    
75
void qemu_pixman_image_unref(pixman_image_t *image)
76
{
77
    if (image == NULL) {
78
        return;
79
    }
80
    pixman_image_unref(image);
81
}
82

    
83
pixman_color_t qemu_pixman_color(PixelFormat *pf, uint32_t color)
84
{
85
    pixman_color_t c;
86

    
87
    c.red   = ((color & pf->rmask) >> pf->rshift) << (16 - pf->rbits);
88
    c.green = ((color & pf->gmask) >> pf->gshift) << (16 - pf->gbits);
89
    c.blue  = ((color & pf->bmask) >> pf->bshift) << (16 - pf->bbits);
90
    c.alpha = ((color & pf->amask) >> pf->ashift) << (16 - pf->abits);
91
    return c;
92
}
93

    
94
pixman_image_t *qemu_pixman_glyph_from_vgafont(int height, const uint8_t *font,
95
                                               unsigned int ch)
96
{
97
    pixman_image_t *glyph;
98
    uint8_t *data;
99
    bool bit;
100
    int x, y;
101

    
102
    glyph = pixman_image_create_bits(PIXMAN_a8, 8, height,
103
                                     NULL, 0);
104
    data = (uint8_t *)pixman_image_get_data(glyph);
105

    
106
    font += height * ch;
107
    for (y = 0; y < height; y++, font++) {
108
        for (x = 0; x < 8; x++, data++) {
109
            bit = (*font) & (1 << (7-x));
110
            *data = bit ? 0xff : 0x00;
111
        }
112
    }
113
    return glyph;
114
}
115

    
116
void qemu_pixman_glyph_render(pixman_image_t *glyph,
117
                              pixman_image_t *surface,
118
                              pixman_color_t *fgcol,
119
                              pixman_color_t *bgcol,
120
                              int x, int y, int cw, int ch)
121
{
122
    pixman_image_t *ifg = pixman_image_create_solid_fill(fgcol);
123
    pixman_image_t *ibg = pixman_image_create_solid_fill(bgcol);
124

    
125
    pixman_image_composite(PIXMAN_OP_SRC, ibg, NULL, surface,
126
                           0, 0, 0, 0,
127
                           cw * x, ch * y,
128
                           cw, ch);
129
    pixman_image_composite(PIXMAN_OP_OVER, ifg, glyph, surface,
130
                           0, 0, 0, 0,
131
                           cw * x, ch * y,
132
                           cw, ch);
133
    pixman_image_unref(ifg);
134
    pixman_image_unref(ibg);
135
}