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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
|
/*
*
* Copyright (C) 2015 Google, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <libpayload.h>
#include <arch/types.h>
#include <stddef.h>
/*
* API error codes
*/
#define CBGFX_SUCCESS 0
/* unknown error */
#define CBGFX_ERROR_UNKNOWN 1
/* failed to initialize cbgfx library */
#define CBGFX_ERROR_INIT 2
/* drawing beyond screen or canvas boundary */
#define CBGFX_ERROR_BOUNDARY 3
/* invalid parameter */
#define CBGFX_ERROR_INVALID_PARAMETER 4
/* bitmap error: signature mismatch */
#define CBGFX_ERROR_BITMAP_SIGNATURE 0x10
/* bitmap error: unsupported format */
#define CBGFX_ERROR_BITMAP_FORMAT 0x11
/* bitmap error: invalid data */
#define CBGFX_ERROR_BITMAP_DATA 0x12
/* bitmap error: scaling out of range */
#define CBGFX_ERROR_SCALE_OUT_OF_RANGE 0x13
/* invalid framebuffer info */
#define CBGFX_ERROR_FRAMEBUFFER_INFO 0x14
/* invalid framebuffer address */
#define CBGFX_ERROR_FRAMEBUFFER_ADDR 0x15
/* portrait screen not supported */
#define CBGFX_ERROR_PORTRAIT_SCREEN 0x16
/* cannot use buffered I/O */
#define CBGFX_ERROR_GRAPHICS_BUFFER 0x17
struct fraction {
int32_t n;
int32_t d;
};
struct scale {
struct fraction x;
struct fraction y;
};
struct vector {
union {
int32_t x;
int32_t width;
};
union {
int32_t y;
int32_t height;
};
};
struct rect {
struct vector offset;
struct vector size;
};
struct rgb_color {
uint8_t red;
uint8_t green;
uint8_t blue;
};
/*
* Resolution of scale parameters used to describe height, width, coordinate,
* etc. relative to the canvas. For example, if it's 100, scales range from 0 to
* 100%.
*/
#define CANVAS_SCALE 100
/*
* The coordinate system is expected to have (0, 0) at top left corner with
* y values increasing towards bottom of screen.
*/
/**
* draw a box filled with a color on screen
*
* box: .offset points the coordinate of the top left corner and .size specifies
* width and height of the box. Both are relative to the canvas size thus scale
* from 0 to CANVAS_SCALE (0 to 100%).
* rgb: RGB color of the box.
*
* return: CBGFX_* error codes
*/
int draw_box(const struct rect *box, const struct rgb_color *rgb);
/**
* Draw a box with rounded corners on screen.
*
* @param[in] pos_rel Coordinate of the top left corner of the box relative to
* the canvas.
* @param[in] dim_rel Width and height of the image relative to the canvas.
* @param[in] rgb Color of the border of the box.
* @param[in] thickness Thickness of the border relative to the canvas. If zero
* is given, the box will be filled with the rgb color.
* @param[in] radius Radius of the rounded corners relative to the canvas. A
* zero value indicates sharp corners will be drawn.
*
* @return CBGFX_* error codes
*/
int draw_rounded_box(const struct scale *pos_rel, const struct scale *dim_rel,
const struct rgb_color *rgb,
const struct fraction *thickness,
const struct fraction *radius);
/**
* Draw a horizontal or vertical line segment on screen. If horizontal, pos1
* must be the left endpoint. If vertical, pos1 must be the top endpoint. When
* the specified thickness is zero (or truncated to zero), a line with 1-pixel
* width will be drawn.
*
* @param[in] pos1 Start position of the line relative to the canvas.
* @param[in] pos2 End position of the line relative to the canvas.
* @param[in] thickness Thickness of the line relative to the canvas.
* @param[in] rgb Color of the line.
*
* @return CBGFX_* error codes
*/
int draw_line(const struct scale *pos1, const struct scale *pos2,
const struct fraction *thickness, const struct rgb_color *rgb);
/**
* Clear the canvas
*/
int clear_canvas(const struct rgb_color *rgb);
/**
* Clear the screen
*/
int clear_screen(const struct rgb_color *rgb);
/**
* Draw a bitmap image using position and size relative to the canvas
*
* @param[in] bitmap Pointer to the bitmap data, starting from file header
* @param[in] size Size of the bitmap data
* @param[in] pos_rel Coordinate of the pivot relative to the canvas
* @param[in] dim_rel Width and height of the image relative to the canvas
* width and height. They must not exceed 1 (=100%). If one
* is zero, it's derived from the other to keep the aspect
* ratio.
* @param[in] flags lower 8 bits is Pivot position. Use PIVOT_H_* and
* PIVOT_V_* flags.
* Bit 9 is bit to indicate if we invert the rendering.
* 0 = render image as is, 1 = invert image.
*
* @return CBGFX_* error codes
*
* 'Pivot' is a point of the image based on which the image is positioned.
* For example, if a pivot is set to PIVOT_H_CENTER|PIVOT_V_CENTER, the image is
* positioned so that pos_rel matches the center of the image.
*/
int draw_bitmap(const void *bitmap, size_t size,
const struct scale *pos_rel, const struct scale *dim_rel,
uint32_t flags);
/* Pivot flags. See the draw_bitmap description. */
#define PIVOT_H_LEFT (1 << 0)
#define PIVOT_H_CENTER (1 << 1)
#define PIVOT_H_RIGHT (1 << 2)
#define PIVOT_V_TOP (1 << 3)
#define PIVOT_V_CENTER (1 << 4)
#define PIVOT_V_BOTTOM (1 << 5)
#define PIVOT_MASK 0x000000ff
/* invert flag */
#define INVERT_SHIFT 8
#define INVERT_COLORS (1 << INVERT_SHIFT)
/**
* Draw a bitmap image at screen coordinate with no scaling
*
* @param[in] bitmap Pointer to the bitmap data, starting from file header
* @param[in] size Size of the bitmap data
* @param[in] pos Screen coordinate of upper left corner of the image.
*
* @return CBGFX_* error codes
*/
int draw_bitmap_direct(const void *bitmap, size_t size,
const struct vector *top_left);
/**
* Get width and height of projected image
*
* @param[in] bitmap Pointer to the bitmap data, starting from file header
* @param[in] sz Size of the bitmap data
* @param[i/o] dim_rel Width and height of the image relative to the canvas
* width and height. They must not exceed 1 (=100%).
* On return, it contains automatically calculated width
* and/or height.
*
* @return CBGFX_* error codes
*
* It returns the width and height of the projected image. If the input height
* is zero, it's derived from the input width to keep the aspect ratio, and vice
* versa. If both are zero, the width and the height which can project the image
* in the original size are returned.
*/
int get_bitmap_dimension(const void *bitmap, size_t sz, struct scale *dim_rel);
/**
* Setup color mappings of background and foreground colors. Black and white
* pixels will be mapped to the background and foreground colors, respectively.
* Call clear_color_map() to disabled color mapping.
*
* @param[in] background Background color.
* @param[in] foreground Foreground color.
*
* @return CBGFX_* error codes
*/
int set_color_map(const struct rgb_color *background,
const struct rgb_color *foreground);
/**
* Clear color mappings.
*/
void clear_color_map(void);
/**
* Setup alpha and rgb values for alpha blending. When alpha is != 0,
* this enables a translucent layer of color (defined by rgb) to be
* blended at a given translucency (alpha) to all things drawn. Call
* clear_blend() to disable alpha blending.
*
* @param[in] rgb Color for transparency
* @param[in] alpha Opacity of color, from 0-255 where
* 0 = completely transparent (no blending)
* 255 = max alpha argument
*
* @return CBGFX_* error codes
*/
int set_blend(const struct rgb_color *rgb, uint8_t alpha);
/**
* Clear alpha and rgb values, thus disabling any alpha blending.
*/
void clear_blend(void);
/**
* For calculating Alpha value from % opacity
* For reference:
* 255 = max alpha argument
* 0 = min alpha argument, 0% opacity
*/
#define ALPHA(percentage) MIN(255, (256 * percentage / 100))
/**
* Enable buffered I/O. All CBGFX operations will be redirected to a working
* buffer, and only updated (redrawn) when flush_graphics_buffer() is called.
*
* @return CBGFX_* error codes
*/
int enable_graphics_buffer(void);
/**
* Redraw buffered graphics data to real screen if graphics buffer is already
* enabled.
*
* @return CBGFX_* error codes
*/
int flush_graphics_buffer(void);
/**
* Stop using buffered I/O and release allocated memory.
*/
void disable_graphics_buffer(void);
|