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 | } |