1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
/* Copyright (C) 2007-2008 The Android Open Source Project
**
** This software is licensed under the terms of the GNU General Public
** License version 2, as published by the Free Software Foundation, and
** may be copied, distributed, and modified under those terms.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
*/
#ifndef _QEMU_FRAMEBUFFER_H_
#define _QEMU_FRAMEBUFFER_H_
/* a simple interface to a framebuffer display. this is to be used by the hardware framebuffer
* driver (e.g. hw/goldfish_fb.c) to send VRAM updates to the emulator.
*
* note the 'rotation' field: it can take values 0, 1, 2 or 3 and corresponds to a rotation
* that must be performed to the pixels stored in the framebuffer *before* displaying them
* a value of 1 corresponds to a rotation of 90 clockwise-degrees, when the framebuffer is
* rotated 90 or 270 degrees, its width/height are swapped automatically
*
* phys_width_mm and phys_height_mm are physical dimensions expressed in millimeters
*
* each QFrameBuffer can have one "client" that reacts to VRAM updates or the framebuffer
* rotations requested by the system.
*/
typedef struct QFrameBuffer QFrameBuffer;
typedef enum {
QFRAME_BUFFER_NONE = 0,
QFRAME_BUFFER_RGB565 = 1,
QFRAME_BUFFER_MAX /* do not remove */
} QFrameBufferFormat;
struct QFrameBuffer {
int width; /* width in pixels */
int height; /* height in pixels */
int pitch; /* bytes per line */
int rotation; /* rotation to be applied when displaying */
QFrameBufferFormat format;
void* pixels; /* pixel buffer */
int phys_width_mm;
int phys_height_mm;
/* extra data that is handled by the framebuffer implementation */
void* extra;
};
/* the default dpi resolution of a typical framebuffer. this is an average between
* various prototypes being used during the development of the Android system...
*/
#define DEFAULT_FRAMEBUFFER_DPI 165
/* initialize a framebuffer object and allocate its pixel buffer */
/* this computes phys_width_mm and phys_height_mm assuming a 165 dpi screen */
/* returns -1 in case of error, 0 otherwise */
extern int
qframebuffer_init( QFrameBuffer* qfbuff,
int width,
int height,
int rotation,
QFrameBufferFormat format );
/* recompute phys_width_mm and phys_height_mm according to the emulated screen DPI settings */
extern void
qframebuffer_set_dpi( QFrameBuffer* qfbuff,
int x_dpi,
int y_dpi );
/* alternative to qframebuffer_set_dpi where one can set the physical dimensions directly */
/* in millimeters. for the record 1 inch = 25.4 mm */
extern void
qframebuffer_set_mm( QFrameBuffer* qfbuff,
int width_mm,
int height_mm );
/* add one client to a given framebuffer */
/* client functions */
typedef void (*QFrameBufferUpdateFunc)( void* opaque, int x, int y, int w, int h );
typedef void (*QFrameBufferRotateFunc)( void* opaque, int rotation );
typedef void (*QFrameBufferDoneFunc) ( void* opaque );
extern void
qframebuffer_add_client( QFrameBuffer* qfbuff,
void* fb_opaque,
QFrameBufferUpdateFunc fb_update,
QFrameBufferRotateFunc fb_rotate,
QFrameBufferDoneFunc fb_done );
/* add one producer to a given framebuffer */
/* producer functions */
typedef void (*QFrameBufferCheckUpdateFunc)( void* opaque );
typedef void (*QFrameBufferInvalidateFunc) ( void* opaque );
typedef void (*QFrameBufferDetachFunc) ( void* opaque );
extern void
qframebuffer_add_producer( QFrameBuffer* qfbuff,
void* opaque,
QFrameBufferCheckUpdateFunc fb_check,
QFrameBufferInvalidateFunc fb_invalidate,
QFrameBufferDetachFunc fb_detach );
/* tell a client that a rectangle region has been updated in the framebuffer pixel buffer */
extern void
qframebuffer_update( QFrameBuffer* qfbuff, int x, int y, int w, int h );
/* rotate the framebuffer (may swap width/height), and tell a client that we did */
extern void
qframebuffer_rotate( QFrameBuffer* qfbuff, int rotation );
/* finalize a framebuffer, release its pixel buffer */
extern void
qframebuffer_done( QFrameBuffer* qfbuff );
/*
* QFrameBuffer objects are created by the emulated system, its characteristics typically
* depend on the current device skin being used.
*
* there are also used by emulated framebuffer devices, who don't know much about all this
*
* use a simple fifo to bridge these together
*/
/* add a new constructed frame buffer object to our global list */
extern void
qframebuffer_fifo_add( QFrameBuffer* qfbuff );
extern QFrameBuffer*
qframebuffer_fifo_get( void );
/*
* check all registered framebuffers for updates. tgus wukk cakk tge ckuebt's update
* functions in the end...
*/
extern void
qframebuffer_check_updates( void );
extern void
qframebuffer_invalidate_all( void );
#endif /* _QEMU_FRAMEBUFFER_H_ */
|