VSF Documented
vsf_disp.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17#ifndef __VSF_DISP_H__
18#define __VSF_DISP_H__
19
20/*============================ INCLUDES ======================================*/
21
23
24#if VSF_USE_UI == ENABLED
25
27#include "kernel/vsf_kernel.h"
28
29#if defined(__VSF_DISP_CLASS_IMPLEMENT)
30# define __VSF_CLASS_IMPLEMENT__
31#elif defined(__VSF_DISP_CLASS_INHERIT__)
32# define __VSF_CLASS_INHERIT__
33#endif
34
35#include "utilities/ooc_class.h"
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41/*============================ MACROS ========================================*/
42
43#define VSF_DISP_COLOR_IDX_DEF(__NAME) \
44 VSF_DISP_COLOR_IDX_##__NAME
45
46// bit0 - 7: index
47// bit8 - 12: bitlen - 1
48// bit13 - 14: bytelen - 1
49// bit15: has_alpha
50#define VSF_DISP_COLOR_VALUE(__INDEX, __BITLEN, __BYTELEN, __HAS_ALPHA) \
51 ( (__INDEX) \
52 | ((((__BITLEN) - 1) & 0x1F) << 8) \
53 | ((((__BYTELEN) - 1) & 0x03) << 13) \
54 | ((__HAS_ALPHA) ? 1 << 15 : 0) \
55 )
56
57#define VSF_DISP_COLOR_DEF(__NAME, __BITLEN, __BYTELEN, __HAS_ALPHA) \
58 VSF_DISP_COLOR_##__NAME = VSF_DISP_COLOR_VALUE( \
59 (VSF_DISP_COLOR_IDX_##__NAME), __BITLEN, __BYTELEN, __HAS_ALPHA)
60
61#define vsf_disp_get_pixel_format_bytesize(__color_format) \
62 ((((__color_format) >> 13) & 0x03) + 1)
63#define vsf_disp_get_pixel_format_bitsize(__color_format) \
64 ((((__color_format) >> 8) & 0x1F) + 1)
65#define vsf_disp_get_pixel_format_has_alpha(__color_format) \
66 ((__color_format) & (1 << 15))
67
68#define vsf_disp_get_pixel_format(__disp) \
69 ((vk_disp_t *)(__disp))->param.color
70
71#define vsf_disp_get_width(__disp) ((__disp)->param.width)
72#define vsf_disp_get_height(__disp) ((__disp)->param.height)
73#define vsf_disp_get_pixel_bitsize(__disp) \
74 vsf_disp_get_pixel_format_bitsize(vsf_disp_get_pixel_format(__disp))
75#define vsf_disp_get_pixel_bytesize(__disp) \
76 vsf_disp_get_pixel_format_bytesize(vsf_disp_get_pixel_format(__disp))
77#define vsf_disp_get_has_alpha(__disp) \
78 vsf_disp_get_pixel_format_has_alpha(vsf_disp_get_pixel_format(__disp))
79#define vsf_disp_get_pitch(__disp) \
80 ((__disp)->param.width * vsf_disp_get_pixel_bytesize(__disp))
81#define vsf_disp_get_frame_size(__disp) \
82 ((__disp)->param.height * vsf_disp_get_pitch(__disp))
83
84#ifndef vk_disp_coord_t
85// use signed value so that in some coord calculations, value < 0 is acceptable
86# define vk_disp_coord_t int16_t
87#endif
88#ifndef vk_disp_fast_coord_t
89# define vk_disp_fast_coord_t uint_fast16_t
90#endif
91
92/*============================ MACROFIED FUNCTIONS ===========================*/
93/*============================ TYPES =========================================*/
94
97
98typedef enum vk_disp_color_idx_t {
100 VSF_DISP_COLOR_IDX_DEF(PALETTE),
104 VSF_DISP_COLOR_IDX_DEF(RGBA8888),
105 VSF_DISP_COLOR_IDX_DEF(ARGB8888),
106 VSF_DISP_COLOR_IDX_DEF(ABGR8888),
107 VSF_DISP_COLOR_IDX_DEF(BGRA8888),
108
109 VSF_DISP_COLOR_IDX_DEF(RGB666_32),
110
111 VSF_DISP_COLOR_IDX_DEF(RGB888_32),
112 VSF_DISP_COLOR_IDX_DEF(RGB888_24),
113
114 VSF_DISP_COLOR_IDX_DEF(BGR888_32),
115 VSF_DISP_COLOR_IDX_DEF(BGR888_24),
118
120 // avoid vk_disp_color_type_t to be optimized to 8bit
123 VSF_DISP_COLOR_DEF(INVALID, 0, 0, 0),
124 VSF_DISP_COLOR_DEF(PALETTE, 8, 1, 0),
125 VSF_DISP_COLOR_DEF(RGB332, 8, 1, 0),
126 VSF_DISP_COLOR_DEF(RGB565, 16, 2, 0),
127 VSF_DISP_COLOR_DEF(RGB888, 24, 3, 0),
128 VSF_DISP_COLOR_DEF(RGBA8888, 32, 4, 1),
129 VSF_DISP_COLOR_DEF(ARGB8888, 32, 4, 1),
130 VSF_DISP_COLOR_DEF(ABGR8888, 32, 4, 1),
131 VSF_DISP_COLOR_DEF(BGRA8888, 32, 4, 1),
132
133 VSF_DISP_COLOR_DEF(RGB666_32, 18, 4, 0),
134
135 VSF_DISP_COLOR_DEF(RGB888_32, 32, 4, 0),
136 VSF_DISP_COLOR_DEF(RGB888_24, 24, 3, 0),
137
138 VSF_DISP_COLOR_DEF(BGR888_32, 32, 4, 0),
139 VSF_DISP_COLOR_DEF(BGR888_24, 24, 3, 0),
140
141 VSF_DISP_COLOR_DEF(MONO, 1, 1, 0),
143
148
153
155 protected_member(
156 vsf_err_t (*init)(vk_disp_t *pthis);
157 void (*fini)(vk_disp_t *pthis);
158 vsf_err_t (*refresh)(vk_disp_t *pthis, vk_disp_area_t *area, void *disp_buff);
159
160 // interfaces for gpu acceleration
161#if VSF_DISP_USE_GPU == ENABLED
162 void (*blend)(vk_disp_t *pthis, void *target_buff, vk_disp_fast_coord_t target_width,
163 vk_disp_area_t *area, void *disp_buff);
164 void (*fill)(vk_disp_t *pthis, void *target_buff, vk_disp_fast_coord_t target_width,
166#endif
168};
169
176
177typedef void (*vk_disp_on_ready_t)(vk_disp_t *disp);
178
179// ui_data -- opaque context pointer, set by caller before init / refresh /
180// fini. Retrieved by ui_on_ready callback to wake the waiting
181// task when the operation completes.
182// ui_on_ready -- completion callback, invoked by driver via vk_disp_on_ready()
183// when init, refresh, or fini finishes.
185 public_member(
186 const vk_disp_param_t param;
187 void *ui_data;
189 protected_member(
190 vk_disp_on_ready_t ui_on_ready;
192};
193
194#if VSF_KERNEL_CFG_SUPPORT_SYNC == ENABLED
195// vk_disp_reentrant_t can be used to make a vk_disp_t reentrant
196// by implementint multiple vk_disp_reentrant_t with same mutex
198 public_member(
199 implement(vk_disp_t)
200
201 // disp should be already initialized
202 vk_disp_t *disp;
203 // same initialized mutex MUST be used for the same disp above
205 vk_disp_point_t pos;
207 private_member(
208 vsf_eda_t eda;
209
210 void *buffer;
211 vk_disp_area_t area;
212 )
213};
214#endif
215
217 public_member(
218 implement(vk_disp_t)
219 )
220};
221
222// vk_disp_cvrt_t/vk_disp_cvrt_drv is used to convert color format
224 public_member(
225 implement(vk_disp_t)
226 vk_disp_t *disp_real;
227 void *pixel_buffer;
228 uint32_t pixel_buffer_size;
230};
231
232/*============================ GLOBAL VARIABLES ==============================*/
233
234#if VSF_KERNEL_CFG_SUPPORT_SYNC == ENABLED
236#endif
237
239// vk_disp_cvrt_t/vk_disp_cvrt_drv is used to convert color format
241
242/*============================ PROTOTYPES ====================================*/
243
244/*
245 * vk_disp_init / vk_disp_fini / vk_disp_refresh are asynchronous.
246 * The driver signals completion by calling vk_disp_on_ready(pthis),
247 * which invokes the ui_on_ready callback registered on the vk_disp_t.
248 *
249 * NOTE: The ui_on_ready callback may fire either synchronously (within
250 * the call to vk_disp_init/refresh itself) or asynchronously (after the
251 * call returns), depending on the driver implementation. Callers must
252 * handle both cases.
253 *
254 * Typical usage pattern:
255 * 1. Set disp->ui_data = <your context pointer>
256 * 2. Set disp->ui_on_ready = <your callback>
257 * 3. Call vk_disp_init(disp)
258 * 4. Wait disp->ui_on_ready being called
259 * 5. Set disp->ui_on_ready if necessary
260 * 6. Call vk_disp_refresh(disp, ...)
261 * 7. Wait disp->ui_on_ready being called
262 *
263 * The ui_on_ready callback receives the vk_disp_t * and can retrieve
264 * the waiting context from disp->ui_data, and will never be changed by display driver.
265 */
266
273extern vsf_err_t vk_disp_init(vk_disp_t *pthis);
279extern void vk_disp_fini(vk_disp_t *pthis);
293extern vsf_err_t vk_disp_refresh(vk_disp_t *pthis, vk_disp_area_t *area, void *disp_buff);
294
295#ifdef __VSF_DISP_CLASS_INHERIT__
296extern void vk_disp_on_ready(vk_disp_t *pthis);
297#endif
298
299#ifdef __cplusplus
300}
301#endif
302
303/*============================ INCLUDES ======================================*/
304
312#if VSF_DISP_USE_MIPI_SPI_LCD == ENABLED
313# define VSF_DISP_USE_MIPI_LCD ENABLED
314#endif
315#if VSF_DISP_USE_MIPI_LCD == ENABLED
317#endif
320#if VSF_DISP_USE_WINGDI == ENABLED && defined(__WIN__)
322#endif
323
324#undef __VSF_DISP_CLASS_IMPLEMENT
325#undef __VSF_DISP_CLASS_INHERIT__
326
327#endif // VSF_USE_UI
328#endif // __VSF_DISP_H__
vsf_err_t
Definition __type.h:42
Definition vsf_disp.h:223
Definition vsf_disp.h:154
Definition vsf_disp.h:216
Definition vsf_disp.h:197
Definition vsf_disp.h:184
Definition vsf_eda.h:769
Definition vsf_eda.h:895
#define vsf_dcl_class
Definition ooc_class.h:50
#define vsf_class(__name)
Definition ooc_class.h:52
unsigned short uint16_t
Definition stdint.h:7
unsigned uint32_t
Definition stdint.h:9
unsigned int uint_fast32_t
Definition stdint.h:27
#define INT16_MAX
Definition stdint.h:50
#define INT16_MIN
Definition stdint.h:45
Definition mutex.h:10
Definition vsf_disp.h:149
vk_disp_point_t pos
Definition vsf_disp.h:150
vk_disp_point_t size
Definition vsf_disp.h:151
Definition vsf_disp.h:170
uint16_t width
Definition vsf_disp.h:172
uint16_t height
Definition vsf_disp.h:173
const vk_disp_drv_t * drv
Definition vsf_disp.h:171
vk_disp_color_type_t color
Definition vsf_disp.h:174
Definition vsf_disp.h:144
vk_disp_coord_t x
Definition vsf_disp.h:145
vk_disp_coord_t y
Definition vsf_disp.h:146
void vk_disp_on_ready(vk_disp_t *pthis)
Definition vsf_disp.c:100
const vk_disp_drv_t vk_disp_reentrant_drv
Definition vsf_disp.c:79
void vk_disp_fini(vk_disp_t *pthis)
Deinitialize a display instance (asynchronous)
Definition vsf_disp.c:121
vsf_err_t vk_disp_init(vk_disp_t *pthis)
Initialize a display instance (asynchronous)
Definition vsf_disp.c:107
#define VSF_DISP_COLOR_DEF(__NAME, __BITLEN, __BYTELEN, __HAS_ALPHA)
Definition vsf_disp.h:57
#define VSF_DISP_COLOR_IDX_DEF(__NAME)
Definition vsf_disp.h:43
vk_disp_color_type_t
Definition vsf_disp.h:119
@ __VSF_DISP_COLOR_LEAST_MAX
Definition vsf_disp.h:121
@ __VSF_DISP_COLOR_LEAST_MIN
Definition vsf_disp.h:122
const vk_disp_drv_t vk_disp_dummy_drv
Definition vsf_disp.c:85
#define vk_disp_coord_t
Definition vsf_disp.h:86
#define vk_disp_fast_coord_t
Definition vsf_disp.h:89
struct vk_disp_param_t vk_disp_param_t
struct vk_disp_area_t vk_disp_area_t
vsf_err_t vk_disp_refresh(vk_disp_t *pthis, vk_disp_area_t *area, void *disp_buff)
Refresh a display area (asynchronous)
Definition vsf_disp.c:134
void(* vk_disp_on_ready_t)(vk_disp_t *disp)
Definition vsf_disp.h:177
const vk_disp_drv_t vk_disp_cvrt_drv
Definition vsf_disp.c:89
vk_disp_color_idx_t
Definition vsf_disp.h:98
struct vk_disp_point_t vk_disp_point_t
uint32_t color
Definition vsf_sdl2_pixelformat.c:31
Generated from commit: vsfteam/vsf@65b48a2