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),
117
119 // avoid vk_disp_color_type_t to be optimized to 8bit
122 VSF_DISP_COLOR_DEF(INVALID, 0, 0, 0),
123 VSF_DISP_COLOR_DEF(PALETTE, 8, 1, 0),
124 VSF_DISP_COLOR_DEF(RGB332, 8, 1, 0),
125 VSF_DISP_COLOR_DEF(RGB565, 16, 2, 0),
126 VSF_DISP_COLOR_DEF(RGB888, 24, 3, 0),
127 VSF_DISP_COLOR_DEF(RGBA8888, 32, 4, 1),
128 VSF_DISP_COLOR_DEF(ARGB8888, 32, 4, 1),
129 VSF_DISP_COLOR_DEF(ABGR8888, 32, 4, 1),
130 VSF_DISP_COLOR_DEF(BGRA8888, 32, 4, 1),
131
132 VSF_DISP_COLOR_DEF(RGB666_32, 18, 4, 0),
133
134 VSF_DISP_COLOR_DEF(RGB888_32, 32, 4, 0),
135 VSF_DISP_COLOR_DEF(RGB888_24, 24, 3, 0),
136
137 VSF_DISP_COLOR_DEF(BGR888_32, 32, 4, 0),
138 VSF_DISP_COLOR_DEF(BGR888_24, 24, 3, 0),
140
141typedef struct vk_disp_point_t {
145
146typedef struct vk_disp_area_t {
150
152 protected_member(
153 vsf_err_t (*init)(vk_disp_t *pthis);
154 void (*fini)(vk_disp_t *pthis);
155 vsf_err_t (*refresh)(vk_disp_t *pthis, vk_disp_area_t *area, void *disp_buff);
156
157 // interfaces for gpu acceleration
158#if VSF_DISP_USE_GPU == ENABLED
159 void (*blend)(vk_disp_t *pthis, void *target_buff, vk_disp_fast_coord_t target_width,
160 vk_disp_area_t *area, void *disp_buff);
161 void (*fill)(vk_disp_t *pthis, void *target_buff, vk_disp_fast_coord_t target_width,
163#endif
165};
166
167typedef struct vk_disp_param_t {
173
174typedef void (*vk_disp_on_ready_t)(vk_disp_t *disp);
175
176// ui_data -- opaque context pointer, set by caller before init / refresh /
177// fini. Retrieved by ui_on_ready callback to wake the waiting
178// task when the operation completes.
179// ui_on_ready -- completion callback, invoked by driver via vk_disp_on_ready()
180// when init, refresh, or fini finishes.
182 public_member(
183 const vk_disp_param_t param;
184 void *ui_data;
186 protected_member(
187 vk_disp_on_ready_t ui_on_ready;
189};
190
191#if VSF_KERNEL_CFG_SUPPORT_SYNC == ENABLED
192// vk_disp_reentrant_t can be used to make a vk_disp_t reentrant
193// by implementint multiple vk_disp_reentrant_t with same mutex
195 public_member(
196 implement(vk_disp_t)
197
198 // disp should be already initialized
199 vk_disp_t *disp;
200 // same initialized mutex MUST be used for the same disp above
202 vk_disp_point_t pos;
204 private_member(
205 vsf_eda_t eda;
206
207 void *buffer;
208 vk_disp_area_t area;
209 )
210};
211#endif
212
214 public_member(
215 implement(vk_disp_t)
216 )
217};
218
219// vk_disp_cvrt_t/vk_disp_cvrt_drv is used to convert color format
221 public_member(
222 implement(vk_disp_t)
223 vk_disp_t *disp_real;
224 void *pixel_buffer;
225 uint32_t pixel_buffer_size;
227};
228
229/*============================ GLOBAL VARIABLES ==============================*/
230
231#if VSF_KERNEL_CFG_SUPPORT_SYNC == ENABLED
233#endif
234
236// vk_disp_cvrt_t/vk_disp_cvrt_drv is used to convert color format
238
239/*============================ PROTOTYPES ====================================*/
240
241/*
242 * vk_disp_init / vk_disp_fini / vk_disp_refresh are asynchronous.
243 * The driver signals completion by calling vk_disp_on_ready(pthis),
244 * which invokes the ui_on_ready callback registered on the vk_disp_t.
245 *
246 * NOTE: The ui_on_ready callback may fire either synchronously (within
247 * the call to vk_disp_init/refresh itself) or asynchronously (after the
248 * call returns), depending on the driver implementation. Callers must
249 * handle both cases.
250 *
251 * Typical usage pattern:
252 * 1. Set disp->ui_data = <your context pointer>
253 * 2. Set disp->ui_on_ready = <your callback>
254 * 3. Call vk_disp_init(disp)
255 * 4. Wait disp->ui_on_ready being called
256 * 5. Set disp->ui_on_ready if necessary
257 * 6. Call vk_disp_refresh(disp, ...)
258 * 7. Wait disp->ui_on_ready being called
259 *
260 * The ui_on_ready callback receives the vk_disp_t * and can retrieve
261 * the waiting context from disp->ui_data, and will never be changed by display driver.
262 */
263
270extern vsf_err_t vk_disp_init(vk_disp_t *pthis);
276extern void vk_disp_fini(vk_disp_t *pthis);
290extern vsf_err_t vk_disp_refresh(vk_disp_t *pthis, vk_disp_area_t *area, void *disp_buff);
291
292#ifdef __VSF_DISP_CLASS_INHERIT__
293extern void vk_disp_on_ready(vk_disp_t *pthis);
294#endif
295
296#ifdef __cplusplus
297}
298#endif
299
300/*============================ INCLUDES ======================================*/
301
309#if VSF_DISP_USE_MIPI_SPI_LCD == ENABLED
310# define VSF_DISP_USE_MIPI_LCD ENABLED
311#endif
312#if VSF_DISP_USE_MIPI_LCD == ENABLED
314#endif
317#if VSF_DISP_USE_WINGDI == ENABLED && defined(__WIN__)
319#endif
320
321#undef __VSF_DISP_CLASS_IMPLEMENT
322#undef __VSF_DISP_CLASS_INHERIT__
323
324#endif // VSF_USE_UI
325#endif // __VSF_DISP_H__
vsf_err_t
Definition __type.h:42
Definition vsf_disp.h:220
Definition vsf_disp.h:151
Definition vsf_disp.h:213
Definition vsf_disp.h:194
Definition vsf_disp.h:181
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:146
vk_disp_point_t pos
Definition vsf_disp.h:147
vk_disp_point_t size
Definition vsf_disp.h:148
Definition vsf_disp.h:167
uint16_t width
Definition vsf_disp.h:169
uint16_t height
Definition vsf_disp.h:170
const vk_disp_drv_t * drv
Definition vsf_disp.h:168
vk_disp_color_type_t color
Definition vsf_disp.h:171
Definition vsf_disp.h:141
vk_disp_coord_t x
Definition vsf_disp.h:142
vk_disp_coord_t y
Definition vsf_disp.h:143
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:118
@ __VSF_DISP_COLOR_LEAST_MAX
Definition vsf_disp.h:120
@ __VSF_DISP_COLOR_LEAST_MIN
Definition vsf_disp.h:121
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
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:174
const vk_disp_drv_t vk_disp_cvrt_drv
Definition vsf_disp.c:89
vk_disp_color_idx_t
Definition vsf_disp.h:98
uint32_t color
Definition vsf_sdl2_pixelformat.c:31
Generated from commit: vsfteam/vsf@c3767bf