microvg  8.0.0
microvg
LLVG_PAINTER_impl.c
Go to the documentation of this file.
1 /*
2  * C
3  *
4  * Copyright 2023-2026 MicroEJ Corp. All rights reserved.
5  * MicroEJ Corp. PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
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 // LLVG_PAINTER_impl.h functions
36 // -----------------------------------------------------------------------------
37 
38 // See the header file for the function documentation
39 jint LLVG_PAINTER_IMPL_drawPath(MICROUI_GraphicsContext *gc, jbyte *pathData, jint x, jint y, jfloat *matrix,
40  jint fillRule, jint blend, jint color) {
41  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLVG_PAINTER_IMPL_drawPath)) {
42  VG_TRACE_DRAW_START(drawPathColor, gc, x, y);
43  jfloat translated_matrix[LLVG_MATRIX_SIZE];
44  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
45  DRAWING_Status status = VG_DRAWING_drawPath(gc, pathData, translated_matrix, fillRule, blend, color);
46  LLUI_DISPLAY_setDrawingStatus(status);
47  VG_TRACE_DRAW_END(drawPathColor, status);
48  }
49  return LLVG_SUCCESS;
50 }
51 
52 // See the header file for the function documentation
53 jint LLVG_PAINTER_IMPL_drawGradient(MICROUI_GraphicsContext *gc, jbyte *pathData, jint x, jint y, jfloat *matrix,
54  jint fillRule, jint alpha, jint blend, jint *gradientData, jfloat *gradientMatrix) {
55  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLVG_PAINTER_IMPL_drawGradient)) {
56  VG_TRACE_DRAW_START(drawPathGradient, gc, x, y);
57  jfloat translated_matrix[LLVG_MATRIX_SIZE];
58  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
59  DRAWING_Status status = VG_DRAWING_drawGradient(gc, pathData, translated_matrix, fillRule, alpha, blend,
60  gradientData, gradientMatrix);
61  LLUI_DISPLAY_setDrawingStatus(status);
62  VG_TRACE_DRAW_END(drawPathGradient, status);
63  }
64  return LLVG_SUCCESS;
65 }
66 
67 // See the header file for the function documentation
68 jint LLVG_PAINTER_IMPL_drawString(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle, jfloat size, jfloat x,
69  jfloat y, jfloat *matrix, jint alpha, jint blend, jfloat letterSpacing) {
70  jint ret;
71 
72  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawString))) {
73  DRAWING_Status status;
74  int length = (int)SNI_getArrayLength(text);
75  VG_TRACE_DRAW_START(drawStringColor, gc, length, (jint)x, (jint)y);
76 
77  if (LLVG_FONT_UNLOADED != faceHandle) {
78  jfloat translated_matrix[LLVG_MATRIX_SIZE];
79  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
80  status = VG_DRAWING_drawString(gc, text, length, faceHandle, size, translated_matrix, alpha, blend,
81  letterSpacing);
82  ret = (jint)LLVG_SUCCESS;
83  } else {
84  status = DRAWING_DONE;
85  ret = (jint)LLVG_RESOURCE_CLOSED;
86  }
87 
88  LLUI_DISPLAY_setDrawingStatus(status);
89  VG_TRACE_DRAW_END(drawStringColor, status);
90  }
91 
92  return ret;
93 }
94 
95 // See the header file for the function documentation
96 jint LLVG_PAINTER_IMPL_drawStringGradient(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle, jfloat size,
97  jfloat x, jfloat y, jfloat *matrix, jint alpha, jint blend,
98  jfloat letterSpacing, jint *gradientData, jfloat *gradientMatrix) {
99  jint ret;
100 
101  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawStringGradient))) {
102  DRAWING_Status status;
103  int length = (int)SNI_getArrayLength(text);
104  VG_TRACE_DRAW_START(drawStringGradient, gc, length, (jint)x, (jint)y);
105 
106  if (LLVG_FONT_UNLOADED != faceHandle) {
107  jfloat translated_matrix[LLVG_MATRIX_SIZE];
108  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
109  status = VG_DRAWING_drawStringGradient(gc, text, length, faceHandle, size,
110  translated_matrix, alpha, blend, letterSpacing, gradientData,
111  gradientMatrix);
112  ret = (jint)LLVG_SUCCESS;
113  } else {
114  status = DRAWING_DONE;
115  ret = (jint)LLVG_RESOURCE_CLOSED;
116  }
117 
118  LLUI_DISPLAY_setDrawingStatus(status);
119  VG_TRACE_DRAW_END(drawStringGradient, status);
120  }
121 
122  return ret;
123 }
124 
125 // See the header file for the function documentation
126 jint LLVG_PAINTER_IMPL_drawStringOnCircle(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle, jfloat size,
127  jint x, jint y, jfloat *matrix, jint alpha, jint blend, jfloat letterSpacing,
128  jfloat radius, jint direction) {
129  jint ret;
130 
131  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawStringOnCircle))) {
132  DRAWING_Status status;
133  int length = (int)SNI_getArrayLength(text);
134  VG_TRACE_DRAW_START(drawStringOnCircleColor, gc, length, x, y, (uint32_t)radius, direction);
135 
136  if (LLVG_FONT_UNLOADED != faceHandle) {
137  jfloat translated_matrix[LLVG_MATRIX_SIZE];
138  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
139  status = VG_DRAWING_drawStringOnCircle(gc, text, length, faceHandle, size,
140  translated_matrix, alpha, blend, letterSpacing, radius, direction);
141  ret = (jint)LLVG_SUCCESS;
142  } else {
143  status = DRAWING_DONE;
144  ret = (jint)LLVG_RESOURCE_CLOSED;
145  }
146 
147  LLUI_DISPLAY_setDrawingStatus(status);
148  VG_TRACE_DRAW_END(drawStringOnCircleColor, status);
149  }
150 
151  return ret;
152 }
153 
154 // See the header file for the function documentation
155 jint LLVG_PAINTER_IMPL_drawStringOnCircleGradient(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle,
156  jfloat size, jint x, jint y, jfloat *matrix, jint alpha, jint blend,
157  jfloat letterSpacing, jfloat radius, jint direction,
158  jint *gradientData, jfloat *gradientMatrix) {
159  jint ret;
160 
161  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawStringOnCircleGradient))) {
162  DRAWING_Status status;
163  int length = (int)SNI_getArrayLength(text);
164  VG_TRACE_DRAW_START(drawStringOnCircleGradient, gc, length, x, y, (uint32_t)radius, direction);
165 
166  if (LLVG_FONT_UNLOADED != faceHandle) {
167  jfloat translated_matrix[LLVG_MATRIX_SIZE];
168  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
169  status = VG_DRAWING_drawStringOnCircleGradient(gc, text, length, faceHandle, size,
170  translated_matrix, alpha, blend, letterSpacing, radius,
171  direction, gradientData, gradientMatrix);
172  ret = (jint)LLVG_SUCCESS;
173  } else {
174  status = DRAWING_DONE;
175  ret = (jint)LLVG_RESOURCE_CLOSED;
176  }
177 
178  LLUI_DISPLAY_setDrawingStatus(status);
179  VG_TRACE_DRAW_END(drawStringOnCircleGradient, status);
180  }
181 
182  return ret;
183 }
184 
185 // See the header file for the function documentation
186 jint LLVG_PAINTER_IMPL_drawImage(MICROUI_GraphicsContext *gc, MICROVG_Image *image, jint x, jint y, jfloat *matrix,
187  jint alpha, jlong elapsed, const float color_matrix[]) {
188  jint error = LLVG_SUCCESS;
189 
190  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLVG_PAINTER_IMPL_drawImage)) {
191  DRAWING_Status status;
192  VG_TRACE_DRAW_START(drawImage, gc, VG_TRACE_IMAGE(image), x, y);
193 
194  if (!VG_DRAWING_image_is_closed(image) && (alpha > (jint)0)) {
195  jfloat translated_matrix[LLVG_MATRIX_SIZE];
196  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
197  status = VG_DRAWING_drawImage(gc, image, translated_matrix, alpha, elapsed, color_matrix, &error);
198 
199  /* FIXME LLVG_OUT_OF_MEMORY errors are not returned as they are reported with error flags.
200  * See M0092MEJAUI-2908.
201  */
202  if (LLVG_OUT_OF_MEMORY == error) {
203  error = LLVG_SUCCESS;
204  }
205  } else {
206  status = DRAWING_DONE;
207  }
208  LLUI_DISPLAY_setDrawingStatus(status);
209  VG_TRACE_DRAW_END(drawImage, status);
210  }
211  return error;
212 }
213 
214 // -----------------------------------------------------------------------------
215 // EOF
216 // -----------------------------------------------------------------------------
MicroEJ MicroVG library low level API: helper to implement library natives methods.