23 #ifdef VG_FEATURE_PATH 32 #include <LLVG_PATH_impl.h> 52 uint32_t index = path->data_offset + path->data_size;
53 uint32_t extra_size = MICROVG_PATH_get_path_command_size(cmd, nb_fields);
56 if (length >= (index + extra_size)) {
57 path->data_size += extra_size;
71 static int32_t _close_path(
MICROVG_PATH_HEADER_t* path, jint length, jfloat x1, jfloat y1, jfloat x2, jfloat y2) {
72 int32_t index = _extend_path(path, length, LLVG_PATH_CMD_CLOSE, 0);
73 int32_t ret = LLVG_SUCCESS;
76 path->bounds_xmin = x1;
77 path->bounds_xmax = x2;
78 path->bounds_ymin = y1;
79 path->bounds_ymax = y2;
80 (void)MICROVG_PATH_append_path_command0((jbyte*)path, (uint32_t)index, LLVG_PATH_CMD_CLOSE);
94 BSP_DECLARE_WEAK_FCNT uint32_t MICROVG_PATH_get_path_header_size(
void) {
99 BSP_DECLARE_WEAK_FCNT uint32_t MICROVG_PATH_get_path_command_size(jint command, uint32_t nbParams) {
101 return (nbParams + (uint32_t)1 ) *
sizeof(uint32_t);
105 BSP_DECLARE_WEAK_FCNT uint32_t MICROVG_PATH_append_path_command0(jbyte* path, uint32_t offset, jint cmd) {
106 uint32_t* data = (uint32_t*)(path + offset);
107 *data = MICROVG_PATH_convert_path_command(cmd);
108 return sizeof(uint32_t);
112 BSP_DECLARE_WEAK_FCNT uint32_t MICROVG_PATH_append_path_command1(jbyte* path, uint32_t offset, jint cmd, jfloat x, jfloat y) {
113 uint32_t* data = (uint32_t*)(path + offset);
114 *data = MICROVG_PATH_convert_path_command(cmd);
116 *data = JFLOAT_TO_UINT32_t(x);
118 *data = JFLOAT_TO_UINT32_t(y);
119 return (uint32_t)3 *
sizeof(uint32_t);
123 BSP_DECLARE_WEAK_FCNT uint32_t MICROVG_PATH_append_path_command2(jbyte* path, uint32_t offset, jint cmd, jfloat x1, jfloat y1, jfloat x2, jfloat y2) {
124 uint32_t* data = (uint32_t*)(path + offset);
125 *data = MICROVG_PATH_convert_path_command(cmd);
127 *data = JFLOAT_TO_UINT32_t(x1);
129 *data = JFLOAT_TO_UINT32_t(y1);
131 *data = JFLOAT_TO_UINT32_t(x2);
133 *data = JFLOAT_TO_UINT32_t(y2);
134 return (uint32_t)5 *
sizeof(uint32_t);
138 BSP_DECLARE_WEAK_FCNT uint32_t MICROVG_PATH_append_path_command3(jbyte* path, uint32_t offset, jint cmd, jfloat x1, jfloat y1, jfloat x2, jfloat y2,
139 jfloat x3, jfloat y3) {
140 uint32_t* data = (uint32_t*)(path + offset);
141 *data = MICROVG_PATH_convert_path_command(cmd);
143 *data = JFLOAT_TO_UINT32_t(x1);
145 *data = JFLOAT_TO_UINT32_t(y1);
147 *data = JFLOAT_TO_UINT32_t(x2);
149 *data = JFLOAT_TO_UINT32_t(y2);
151 *data = JFLOAT_TO_UINT32_t(x3);
153 *data = JFLOAT_TO_UINT32_t(y3);
154 return (uint32_t)7 *
sizeof(uint32_t);
162 jint LLVG_PATH_IMPL_initializePath(jbyte* jpath, jint length) {
165 uint32_t header_size = MICROVG_PATH_get_path_header_size();
166 jint ret = LLVG_SUCCESS;
168 if (length >= header_size) {
170 path->data_offset = header_size;
171 path->format = MICROVG_PATH_get_path_encoder_format();
182 jint LLVG_PATH_IMPL_appendPathCommand1(jbyte* jpath, jint length, jint cmd, jfloat x, jfloat y) {
185 jint ret = LLVG_SUCCESS;
187 int32_t index = _extend_path(path, length, cmd, 2);
189 (void)MICROVG_PATH_append_path_command1((jbyte*)path, (uint32_t)index, cmd, x, y);
200 jint LLVG_PATH_IMPL_appendPathCommand2(jbyte* jpath, jint length, jint cmd, jfloat x1, jfloat y1, jfloat x2,
204 jint ret = LLVG_SUCCESS;
206 if (LLVG_PATH_CMD_CLOSE == cmd) {
208 ret = _close_path(path, length, x1, y1, x2, y2);
211 int32_t index = _extend_path(path, length, cmd, 4);
213 (void)MICROVG_PATH_append_path_command2((jbyte*)path, (uint32_t)index, cmd, x1, y1, x2, y2);
225 jint LLVG_PATH_IMPL_appendPathCommand3(jbyte* jpath, jint length, jint cmd, jfloat x1, jfloat y1, jfloat x2,
226 jfloat y2, jfloat x3, jfloat y3) {
229 jint ret = LLVG_SUCCESS;
231 int32_t index = _extend_path(path, length, cmd, 6);
233 (void)MICROVG_PATH_append_path_command3((jbyte*)path, (uint32_t)index, cmd, x1, y1, x2, y2, x3, y3);
244 void LLVG_PATH_IMPL_reopenPath(jbyte* jpath) {
246 path->data_size -= MICROVG_PATH_get_path_command_size(LLVG_PATH_CMD_CLOSE, 0);
251 jint LLVG_PATH_IMPL_mergePaths(jbyte* jpathDest, jbyte* jpathSrc1, jbyte* jpathSrc2, jfloat ratio){
253 jint ret = LLVG_SUCCESS;
254 float remaining = (1-ratio);
261 pathDest->data_size = pathSrc1->data_size;
262 pathDest->data_offset = pathSrc1->data_offset;
263 pathDest->format = pathSrc1->format;
266 float fSrc1 = pathSrc1->bounds_xmin;
267 float fSrc2 = pathSrc2->bounds_xmin;
268 float fDest = MEJ_MIN(fSrc1, fSrc2);
269 pathDest->bounds_xmin = fDest;
271 fSrc1 = pathSrc1->bounds_ymin;
272 fSrc2 = pathSrc2->bounds_ymin;
273 fDest = MEJ_MIN(fSrc1, fSrc2);
274 pathDest->bounds_ymin = fDest;
276 fSrc1 = pathSrc1->bounds_xmax;
277 fSrc2 = pathSrc2->bounds_xmax;
278 fDest = MEJ_MAX(fSrc1, fSrc2);
279 pathDest->bounds_xmax = fDest;
281 fSrc1 = pathSrc1->bounds_ymax;
282 fSrc2 = pathSrc2->bounds_ymax;
283 fDest = MEJ_MAX(fSrc1, fSrc2);
284 pathDest->bounds_ymax = fDest;
287 uint32_t* dataDest = (uint32_t*)(jpathDest + pathDest->data_offset);
288 uint32_t* dataSrc1 = (uint32_t*)(jpathSrc1 + pathSrc1->data_offset);
289 uint32_t* dataSrc2 = (uint32_t*)(jpathSrc2 + pathSrc2->data_offset);
291 for(uint16_t i=0; i < pathDest->data_size;){
293 uint32_t cmdSrc1 = *dataSrc1;
295 uint32_t nb_parameters = MICROVG_PATH_get_command_parameter_number(cmdSrc1);
303 for(uint32_t j=0; j<nb_parameters;j++ ){
306 fSrc1 = UINT32_t_TO_JFLOAT(*dataSrc1);
308 fSrc2 = UINT32_t_TO_JFLOAT(*dataSrc2);
309 fDest = (remaining * fSrc1) + (ratio * fSrc2);
312 *dataDest = JFLOAT_TO_UINT32_t(fDest);
327 #endif // VG_FEATURE_PATH MicroEJ MicroVG library low level API: helper to implement library natives methods.
MicroEJ MicroVG library low level API: implementation of Path.
MicroEJ MicroVG library low level API: enable some features according to the hardware capacities...