microvg  3.0.1
microvg
LLVG_PAINTER_impl.c
Go to the documentation of this file.
1 /*
2  * C
3  *
4  * Copyright 2023 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 "microvg_trace.h"
32 
33 // -----------------------------------------------------------------------------
34 // Macros and Defines
35 // -----------------------------------------------------------------------------
36 
37 /*
38  * @brief Macro to add a DRAWING event and its type.
39  */
40 #define LOG_MICROVG_DRAWING_START(fn) LOG_MICROVG_START(LOG_MICROVG_DRAWING_ID, CONCAT_DEFINES(LOG_MICROVG_DRAW_, fn))
41 #define LOG_MICROVG_DRAWING_END(fn) LOG_MICROVG_END(LOG_MICROVG_DRAWING_ID, CONCAT_DEFINES(LOG_MICROVG_DRAW_, fn))
42 
43 // -----------------------------------------------------------------------------
44 // LLVG_PAINTER_impl.h functions
45 // -----------------------------------------------------------------------------
46 
47 // See the header file for the function documentation
48 jint LLVG_PAINTER_IMPL_drawPath(MICROUI_GraphicsContext* gc, jbyte* pathData, jint x, jint y, jfloat* matrix, jint fillRule, jint blend, jint color) {
49  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&LLVG_PAINTER_IMPL_drawPath)) {
50  LOG_MICROVG_DRAWING_START(path);
51  DRAWING_Status status = VG_DRAWING_drawPath(gc, pathData, x, y, matrix, fillRule, blend, color);
52  LLUI_DISPLAY_setDrawingStatus(status);
53  LOG_MICROVG_DRAWING_END(path);
54  }
55  return LLVG_SUCCESS;
56 }
57 
58 // See the header file for the function documentation
59 jint LLVG_PAINTER_IMPL_drawGradient(MICROUI_GraphicsContext* gc, jbyte* pathData, jint x, jint y, jfloat* matrix, jint fillRule, jint alpha, jint blend, jint* gradientData, jfloat* gradientMatrix) {
60  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&LLVG_PAINTER_IMPL_drawGradient)) {
61  LOG_MICROVG_DRAWING_START(pathGradient);
62  DRAWING_Status status = VG_DRAWING_drawGradient(gc, pathData, x, y, matrix, fillRule, alpha, blend, gradientData, gradientMatrix);
63  LLUI_DISPLAY_setDrawingStatus(status);
64  LOG_MICROVG_DRAWING_END(pathGradient);
65  }
66  return LLVG_SUCCESS;
67 }
68 
69 // See the header file for the function documentation
70 jint LLVG_PAINTER_IMPL_drawString(MICROUI_GraphicsContext* gc, jchar* text, jint faceHandle, jfloat size, jfloat x, jfloat y, jfloat* matrix, jint alpha, jint blend, jfloat letterSpacing){
71 
72  jint ret;
73  if (LLVG_FONT_UNLOADED == faceHandle) {
74  ret = (jint)LLVG_RESOURCE_CLOSED;
75  }
76  else {
77  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&(LLVG_PAINTER_IMPL_drawString))){
78  LOG_MICROVG_DRAWING_START(string);
79  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawString(gc, text, faceHandle, size, x, y, matrix, alpha, blend, letterSpacing));
80  LOG_MICROVG_DRAWING_END(string);
81  }
82  ret = (jint)LLVG_SUCCESS;
83  }
84  return ret;
85 }
86 
87 // See the header file for the function documentation
88 jint LLVG_PAINTER_IMPL_drawStringGradient(MICROUI_GraphicsContext* gc, jchar* text, jint faceHandle, jfloat size, jfloat x, jfloat y, jfloat* matrix, jint alpha, jint blend, jfloat letterSpacing, jint *gradientData, jfloat *gradientMatrix){
89 
90  jint ret;
91 
92  if (LLVG_FONT_UNLOADED == faceHandle) {
93  ret = (jint)LLVG_RESOURCE_CLOSED;
94  }
95  else {
96  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&(LLVG_PAINTER_IMPL_drawStringGradient))){
97  LOG_MICROVG_DRAWING_START(stringGradient);
98  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringGradient(gc, text, faceHandle, size, x, y, matrix, alpha, blend, letterSpacing, gradientData, gradientMatrix));
99  LOG_MICROVG_DRAWING_END(stringGradient);
100  }
101  ret = (jint)LLVG_SUCCESS;
102  }
103 
104  return ret;
105 }
106 
107 // See the header file for the function documentation
108 jint LLVG_PAINTER_IMPL_drawStringOnCircle(MICROUI_GraphicsContext* gc, jchar* text, jint faceHandle, jfloat size, jint x, jint y, jfloat* matrix, jint alpha, jint blend, jfloat letterSpacing, jfloat radius, jint direction){
109 
110  jint ret;
111 
112  if (LLVG_FONT_UNLOADED == faceHandle) {
113  ret = (jint)LLVG_RESOURCE_CLOSED;
114  }
115  else {
116  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&(LLVG_PAINTER_IMPL_drawStringOnCircle))){
117  LOG_MICROVG_DRAWING_START(stringOnCircle);
118  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringOnCircle(gc, text, faceHandle, size, x, y, matrix, alpha, blend, letterSpacing, radius, direction));
119  LOG_MICROVG_DRAWING_END(stringOnCircle);
120  }
121  ret = (jint)LLVG_SUCCESS;
122  }
123 
124  return ret;
125 }
126 
127 // See the header file for the function documentation
128 jint LLVG_PAINTER_IMPL_drawStringOnCircleGradient(MICROUI_GraphicsContext* gc, jchar* text, jint faceHandle, jfloat size, jint x, jint y, jfloat* matrix, jint alpha, jint blend, jfloat letterSpacing, jfloat radius, jint direction, jint *gradientData, jfloat *gradientMatrix){
129 
130  jint ret;
131 
132  if (LLVG_FONT_UNLOADED == faceHandle) {
133  ret = (jint)LLVG_RESOURCE_CLOSED;
134  }
135  else {
136  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&(LLVG_PAINTER_IMPL_drawStringOnCircleGradient))){
137  LOG_MICROVG_DRAWING_START(stringOnCircleGradient);
138  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringOnCircleGradient(gc, text, faceHandle, size, x, y, matrix, alpha, blend, letterSpacing, radius, direction, gradientData, gradientMatrix));
139  LOG_MICROVG_DRAWING_END(stringOnCircleGradient);
140  }
141  ret = (jint)LLVG_SUCCESS;
142  }
143 
144  return ret;
145 }
146 
147 // See the header file for the function documentation
148 jint LLVG_PAINTER_IMPL_drawImage(MICROUI_GraphicsContext* gc, void* image, jint x, jint y, jfloat *matrix, jint alpha, jlong elapsed, const float color_matrix[]){
149 
150  jint error = LLVG_SUCCESS;
151 
152  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&LLVG_PAINTER_IMPL_drawImage)) {
153  DRAWING_Status status;
154  LOG_MICROVG_DRAWING_START(image);
155  if (alpha > (uint32_t)0){
156 
157  // cppcheck-suppress [misra-c2012-18.8] LLVG_MATRIX_SIZE is a fixed size
158  jfloat local_matrix[LLVG_MATRIX_SIZE];
159  jfloat* drawing_matrix;
160 
161  if((0 != x) || (0 != y)) {
162  // Create translate matrix for initial x,y translation from graphicscontext.
163  LLVG_MATRIX_IMPL_setTranslate(local_matrix, x, y);
164  LLVG_MATRIX_IMPL_concatenate(local_matrix, matrix);
165  drawing_matrix = local_matrix;
166  }
167  else {
168  // use original matrix
169  drawing_matrix = matrix;
170  }
171 
172  status = VG_DRAWING_drawImage(gc, image, drawing_matrix, alpha, elapsed, color_matrix, &error);
173 
174  /* FIXME LLVG_OUT_OF_MEMORY errors are not returned as they are reported with error flags.
175  * See M0092MEJAUI-2908.
176  */
177  if (LLVG_OUT_OF_MEMORY == error) {
178  error = LLVG_SUCCESS;
179  }
180  }
181  else {
182  status = DRAWING_DONE;
183  }
184  LLUI_DISPLAY_setDrawingStatus(status);
185  LOG_MICROVG_DRAWING_END(image);
186  }
187  return error;
188 }
189 
190 // -----------------------------------------------------------------------------
191 // EOF
192 // -----------------------------------------------------------------------------