microvg  6.0.1
microvg
LLVG_PAINTER_impl.c
Go to the documentation of this file.
1 /*
2  * C
3  *
4  * Copyright 2023-2024 MicroEJ Corp. All rights reserved.
5  * Use of this source code is governed by a BSD-style license that can be found with this software.
6  */
7 
16 // -----------------------------------------------------------------------------
17 // Includes
18 // -----------------------------------------------------------------------------
19 
20 // implements LLVG_PAINTER_impl functions
21 #include <LLVG_PAINTER_impl.h>
22 
23 // use graphical engine functions to synchronize drawings
24 #include <LLUI_DISPLAY.h>
25 
26 #include <LLVG_FONT_impl.h>
27 #include <LLVG_MATRIX_impl.h>
28 
29 // calls vg_drawing functions
30 #include "vg_drawing.h"
31 #include "vg_helper.h"
32 #include "vg_trace.h"
33 
34 // -----------------------------------------------------------------------------
35 // Macros and Defines
36 // -----------------------------------------------------------------------------
37 
38 /*
39  * @brief Macro to add a DRAWING event and its type.
40  */
41 #define LOG_MICROVG_DRAWING_START(fn) LOG_MICROVG_START(LOG_MICROVG_DRAWING_ID, CONCAT_DEFINES(LOG_MICROVG_DRAW_, fn))
42 #define LOG_MICROVG_DRAWING_END(fn) LOG_MICROVG_END(LOG_MICROVG_DRAWING_ID, CONCAT_DEFINES(LOG_MICROVG_DRAW_, fn))
43 
44 // -----------------------------------------------------------------------------
45 // LLVG_PAINTER_impl.h functions
46 // -----------------------------------------------------------------------------
47 
48 // See the header file for the function documentation
49 jint LLVG_PAINTER_IMPL_drawPath(MICROUI_GraphicsContext *gc, jbyte *pathData, jint x, jint y, jfloat *matrix,
50  jint fillRule, jint blend, jint color) {
51  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLVG_PAINTER_IMPL_drawPath)) {
52  LOG_MICROVG_DRAWING_START(path);
53  jfloat translated_matrix[LLVG_MATRIX_SIZE];
54  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
55  DRAWING_Status status = VG_DRAWING_drawPath(gc, pathData, translated_matrix, fillRule, blend, color);
56  LLUI_DISPLAY_setDrawingStatus(status);
57  LOG_MICROVG_DRAWING_END(path);
58  }
59  return LLVG_SUCCESS;
60 }
61 
62 // See the header file for the function documentation
63 jint LLVG_PAINTER_IMPL_drawGradient(MICROUI_GraphicsContext *gc, jbyte *pathData, jint x, jint y, jfloat *matrix,
64  jint fillRule, jint alpha, jint blend, jint *gradientData, jfloat *gradientMatrix) {
65  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLVG_PAINTER_IMPL_drawGradient)) {
66  LOG_MICROVG_DRAWING_START(pathGradient);
67  jfloat translated_matrix[LLVG_MATRIX_SIZE];
68  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
69  DRAWING_Status status = VG_DRAWING_drawGradient(gc, pathData, translated_matrix, fillRule, alpha, blend,
70  gradientData, gradientMatrix);
71  LLUI_DISPLAY_setDrawingStatus(status);
72  LOG_MICROVG_DRAWING_END(pathGradient);
73  }
74  return LLVG_SUCCESS;
75 }
76 
77 // See the header file for the function documentation
78 jint LLVG_PAINTER_IMPL_drawString(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle, jfloat size, jfloat x,
79  jfloat y, jfloat *matrix, jint alpha, jint blend, jfloat letterSpacing) {
80  jint ret;
81  if (LLVG_FONT_UNLOADED == faceHandle) {
82  ret = (jint)LLVG_RESOURCE_CLOSED;
83  } else {
84  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawString))) {
85  LOG_MICROVG_DRAWING_START(string);
86  jfloat translated_matrix[LLVG_MATRIX_SIZE];
87  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
88  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawString(gc, text, faceHandle, size, translated_matrix, alpha,
89  blend, letterSpacing));
90  LOG_MICROVG_DRAWING_END(string);
91  }
92  ret = (jint)LLVG_SUCCESS;
93  }
94  return ret;
95 }
96 
97 // See the header file for the function documentation
98 jint LLVG_PAINTER_IMPL_drawStringGradient(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle, jfloat size,
99  jfloat x, jfloat y, jfloat *matrix, jint alpha, jint blend,
100  jfloat letterSpacing, jint *gradientData, jfloat *gradientMatrix) {
101  jint ret;
102 
103  if (LLVG_FONT_UNLOADED == faceHandle) {
104  ret = (jint)LLVG_RESOURCE_CLOSED;
105  } else {
106  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawStringGradient))) {
107  LOG_MICROVG_DRAWING_START(stringGradient);
108  jfloat translated_matrix[LLVG_MATRIX_SIZE];
109  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
110  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringGradient(gc, text, faceHandle, size, translated_matrix,
111  alpha, blend, letterSpacing, gradientData,
112  gradientMatrix));
113  LOG_MICROVG_DRAWING_END(stringGradient);
114  }
115  ret = (jint)LLVG_SUCCESS;
116  }
117 
118  return ret;
119 }
120 
121 // See the header file for the function documentation
122 jint LLVG_PAINTER_IMPL_drawStringOnCircle(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle, jfloat size,
123  jint x, jint y, jfloat *matrix, jint alpha, jint blend, jfloat letterSpacing,
124  jfloat radius, jint direction) {
125  jint ret;
126 
127  if (LLVG_FONT_UNLOADED == faceHandle) {
128  ret = (jint)LLVG_RESOURCE_CLOSED;
129  } else {
130  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawStringOnCircle))) {
131  LOG_MICROVG_DRAWING_START(stringOnCircle);
132  jfloat translated_matrix[LLVG_MATRIX_SIZE];
133  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
134  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringOnCircle(gc, text, faceHandle, size, translated_matrix,
135  alpha, blend, letterSpacing, radius,
136  direction));
137  LOG_MICROVG_DRAWING_END(stringOnCircle);
138  }
139  ret = (jint)LLVG_SUCCESS;
140  }
141 
142  return ret;
143 }
144 
145 // See the header file for the function documentation
146 jint LLVG_PAINTER_IMPL_drawStringOnCircleGradient(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle,
147  jfloat size, jint x, jint y, jfloat *matrix, jint alpha, jint blend,
148  jfloat letterSpacing, jfloat radius, jint direction,
149  jint *gradientData, jfloat *gradientMatrix) {
150  jint ret;
151 
152  if (LLVG_FONT_UNLOADED == faceHandle) {
153  ret = (jint)LLVG_RESOURCE_CLOSED;
154  } else {
155  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawStringOnCircleGradient))) {
156  LOG_MICROVG_DRAWING_START(stringOnCircleGradient);
157  jfloat translated_matrix[LLVG_MATRIX_SIZE];
158  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
159  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringOnCircleGradient(gc, text, faceHandle, size,
160  translated_matrix, alpha, blend,
161  letterSpacing, radius, direction,
162  gradientData, gradientMatrix));
163  LOG_MICROVG_DRAWING_END(stringOnCircleGradient);
164  }
165  ret = (jint)LLVG_SUCCESS;
166  }
167 
168  return ret;
169 }
170 
171 // See the header file for the function documentation
172 jint LLVG_PAINTER_IMPL_drawImage(MICROUI_GraphicsContext *gc, MICROVG_Image *image, jint x, jint y, jfloat *matrix,
173  jint alpha,
174  jlong elapsed, const float color_matrix[]) {
175  jint error = LLVG_SUCCESS;
176 
177  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLVG_PAINTER_IMPL_drawImage)) {
178  DRAWING_Status status;
179  LOG_MICROVG_DRAWING_START(image);
180  if (!VG_DRAWING_image_is_closed(image) && alpha > (uint32_t)0) {
181  // cppcheck-suppress [misra-c2012-18.8] LLVG_MATRIX_SIZE is a fixed size
182  jfloat translated_matrix[LLVG_MATRIX_SIZE];
183  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
184 
185  status = VG_DRAWING_drawImage(gc, image, translated_matrix, alpha, elapsed, color_matrix, &error);
186 
187  /* FIXME LLVG_OUT_OF_MEMORY errors are not returned as they are reported with error flags.
188  * See M0092MEJAUI-2908.
189  */
190  if (LLVG_OUT_OF_MEMORY == error) {
191  error = LLVG_SUCCESS;
192  }
193  } else {
194  status = DRAWING_DONE;
195  }
196  LLUI_DISPLAY_setDrawingStatus(status);
197  LOG_MICROVG_DRAWING_END(image);
198  }
199  return error;
200 }
201 
202 // -----------------------------------------------------------------------------
203 // EOF
204 // -----------------------------------------------------------------------------
MicroEJ MicroVG library low level API: helper to implement library natives methods.