microvg  7.0.0
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  int length = (int)SNI_getArrayLength(text);
89  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawString(gc, text, length, faceHandle, size, translated_matrix,
90  alpha, blend, letterSpacing));
91  LOG_MICROVG_DRAWING_END(string);
92  }
93  ret = (jint)LLVG_SUCCESS;
94  }
95  return ret;
96 }
97 
98 // See the header file for the function documentation
99 jint LLVG_PAINTER_IMPL_drawStringGradient(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle, jfloat size,
100  jfloat x, jfloat y, jfloat *matrix, jint alpha, jint blend,
101  jfloat letterSpacing, jint *gradientData, jfloat *gradientMatrix) {
102  jint ret;
103 
104  if (LLVG_FONT_UNLOADED == faceHandle) {
105  ret = (jint)LLVG_RESOURCE_CLOSED;
106  } else {
107  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawStringGradient))) {
108  LOG_MICROVG_DRAWING_START(stringGradient);
109  jfloat translated_matrix[LLVG_MATRIX_SIZE];
110  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
111  int length = (int)SNI_getArrayLength(text);
112  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringGradient(gc, text, length, faceHandle, size,
113  translated_matrix, alpha, blend, letterSpacing,
114  gradientData, gradientMatrix));
115  LOG_MICROVG_DRAWING_END(stringGradient);
116  }
117  ret = (jint)LLVG_SUCCESS;
118  }
119 
120  return ret;
121 }
122 
123 // See the header file for the function documentation
124 jint LLVG_PAINTER_IMPL_drawStringOnCircle(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle, jfloat size,
125  jint x, jint y, jfloat *matrix, jint alpha, jint blend, jfloat letterSpacing,
126  jfloat radius, jint direction) {
127  jint ret;
128 
129  if (LLVG_FONT_UNLOADED == faceHandle) {
130  ret = (jint)LLVG_RESOURCE_CLOSED;
131  } else {
132  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawStringOnCircle))) {
133  LOG_MICROVG_DRAWING_START(stringOnCircle);
134  jfloat translated_matrix[LLVG_MATRIX_SIZE];
135  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
136  int length = (int)SNI_getArrayLength(text);
137  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringOnCircle(gc, text, length, faceHandle, size,
138  translated_matrix, alpha, blend, letterSpacing,
139  radius, direction));
140  LOG_MICROVG_DRAWING_END(stringOnCircle);
141  }
142  ret = (jint)LLVG_SUCCESS;
143  }
144 
145  return ret;
146 }
147 
148 // See the header file for the function documentation
149 jint LLVG_PAINTER_IMPL_drawStringOnCircleGradient(MICROUI_GraphicsContext *gc, jchar *text, jint faceHandle,
150  jfloat size, jint x, jint y, jfloat *matrix, jint alpha, jint blend,
151  jfloat letterSpacing, jfloat radius, jint direction,
152  jint *gradientData, jfloat *gradientMatrix) {
153  jint ret;
154 
155  if (LLVG_FONT_UNLOADED == faceHandle) {
156  ret = (jint)LLVG_RESOURCE_CLOSED;
157  } else {
158  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & (LLVG_PAINTER_IMPL_drawStringOnCircleGradient))) {
159  LOG_MICROVG_DRAWING_START(stringOnCircleGradient);
160  jfloat translated_matrix[LLVG_MATRIX_SIZE];
161  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
162  int length = (int)SNI_getArrayLength(text);
163  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringOnCircleGradient(gc, text, length, faceHandle, size,
164  translated_matrix, alpha, blend,
165  letterSpacing, radius, direction,
166  gradientData, gradientMatrix));
167  LOG_MICROVG_DRAWING_END(stringOnCircleGradient);
168  }
169  ret = (jint)LLVG_SUCCESS;
170  }
171 
172  return ret;
173 }
174 
175 // See the header file for the function documentation
176 jint LLVG_PAINTER_IMPL_drawImage(MICROUI_GraphicsContext *gc, MICROVG_Image *image, jint x, jint y, jfloat *matrix,
177  jint alpha, jlong elapsed, const float color_matrix[]) {
178  jint error = LLVG_SUCCESS;
179 
180  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLVG_PAINTER_IMPL_drawImage)) {
181  DRAWING_Status status;
182  LOG_MICROVG_DRAWING_START(image);
183  if (!VG_DRAWING_image_is_closed(image) && (alpha > (jint)0)) {
184  // cppcheck-suppress [misra-c2012-18.8] LLVG_MATRIX_SIZE is a fixed size
185  jfloat translated_matrix[LLVG_MATRIX_SIZE];
186  VG_HELPER_prepare_matrix(translated_matrix, x, y, matrix);
187 
188  status = VG_DRAWING_drawImage(gc, image, translated_matrix, alpha, elapsed, color_matrix, &error);
189 
190  /* FIXME LLVG_OUT_OF_MEMORY errors are not returned as they are reported with error flags.
191  * See M0092MEJAUI-2908.
192  */
193  if (LLVG_OUT_OF_MEMORY == error) {
194  error = LLVG_SUCCESS;
195  }
196  } else {
197  status = DRAWING_DONE;
198  }
199  LLUI_DISPLAY_setDrawingStatus(status);
200  LOG_MICROVG_DRAWING_END(image);
201  }
202  return error;
203 }
204 
205 // -----------------------------------------------------------------------------
206 // EOF
207 // -----------------------------------------------------------------------------
MicroEJ MicroVG library low level API: helper to implement library natives methods.