microvg  3.0.0
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 
32 // --------------------------------------------------------------------------------
33 // Macros and Defines
34 // --------------------------------------------------------------------------------
35 
36 // macros to log a drawing
37 #define LOG_DRAW_START(fn) LLUI_DISPLAY_logDrawingStart(CONCAT_DEFINES(LOG_MICROVG_, fn))
38 #define LOG_DRAW_END(fn) LLUI_DISPLAY_logDrawingEnd(CONCAT_DEFINES(LOG_MICROVG_, fn))
39 
40 /*
41  * LOG_DRAW_EVENT logs identifiers
42  */
43 #define LOG_MICROVG_drawPath 1
44 #define LOG_MICROVG_drawGradient 2
45 #define LOG_MICROVG_drawString 3
46 #define LOG_MICROVG_drawStringOnCircle 4
47 #define LOG_MICROVG_drawImage 5
48 
49 // -----------------------------------------------------------------------------
50 // LLVG_PAINTER_impl.h functions
51 // -----------------------------------------------------------------------------
52 
53 // See the header file for the function documentation
54 jint LLVG_PAINTER_IMPL_drawPath(MICROUI_GraphicsContext* gc, jbyte* pathData, jint x, jint y, jfloat* matrix, jint fillRule, jint blend, jint color) {
55  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&LLVG_PAINTER_IMPL_drawPath)) {
56  LOG_DRAW_START(drawPath);
57  DRAWING_Status status = VG_DRAWING_drawPath(gc, pathData, x, y, matrix, fillRule, blend, color);
58  LLUI_DISPLAY_setDrawingStatus(status);
59  LOG_DRAW_END(drawPath);
60  }
61  return LLVG_SUCCESS;
62 }
63 
64 // See the header file for the function documentation
65 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) {
66  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&LLVG_PAINTER_IMPL_drawGradient)) {
67  LOG_DRAW_START(drawPath);
68  DRAWING_Status status = VG_DRAWING_drawGradient(gc, pathData, x, y, matrix, fillRule, alpha, blend, gradientData, gradientMatrix);
69  LLUI_DISPLAY_setDrawingStatus(status);
70  LOG_DRAW_END(drawPath);
71  }
72  return LLVG_SUCCESS;
73 }
74 
75 // See the header file for the function documentation
76 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){
77 
78  jint ret;
79  if (LLVG_FONT_UNLOADED == faceHandle) {
80  ret = (jint)LLVG_RESOURCE_CLOSED;
81  }
82  else {
83  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&(LLVG_PAINTER_IMPL_drawString))){
84  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawString(gc, text, faceHandle, size, x, y, matrix, alpha, blend, letterSpacing));
85  }
86  ret = (jint)LLVG_SUCCESS;
87  }
88  return ret;
89 }
90 
91 // See the header file for the function documentation
92 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){
93 
94  jint ret;
95 
96  if (LLVG_FONT_UNLOADED == faceHandle) {
97  ret = (jint)LLVG_RESOURCE_CLOSED;
98  }
99  else {
100  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&(LLVG_PAINTER_IMPL_drawStringGradient))){
101  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringGradient(gc, text, faceHandle, size, x, y, matrix, alpha, blend, letterSpacing, gradientData, gradientMatrix));
102  }
103  ret = (jint)LLVG_SUCCESS;
104  }
105 
106  return ret;
107 }
108 
109 // See the header file for the function documentation
110 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){
111 
112  jint ret;
113 
114  if (LLVG_FONT_UNLOADED == faceHandle) {
115  ret = (jint)LLVG_RESOURCE_CLOSED;
116  }
117  else {
118  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&(LLVG_PAINTER_IMPL_drawStringOnCircle))){
119  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringOnCircle(gc, text, faceHandle, size, x, y, matrix, alpha, blend, letterSpacing, radius, direction));
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  LLUI_DISPLAY_setDrawingStatus(VG_DRAWING_drawStringOnCircleGradient(gc, text, faceHandle, size, x, y, matrix, alpha, blend, letterSpacing, radius, direction, gradientData, gradientMatrix));
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_drawImage(MICROUI_GraphicsContext* gc, void* image, jint x, jint y, jfloat *matrix, jint alpha, jlong elapsed, const float color_matrix[]){
147 
148  jint error = LLVG_SUCCESS;
149 
150  if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&LLVG_PAINTER_IMPL_drawImage)) {
151  DRAWING_Status status;
152  LOG_DRAW_START(drawImage);
153  if (alpha > (uint32_t)0){
154 
155  // cppcheck-suppress [misra-c2012-18.8] LLVG_MATRIX_SIZE is a fixed size
156  jfloat local_matrix[LLVG_MATRIX_SIZE];
157  jfloat* drawing_matrix;
158 
159  if((0 != x) || (0 != y)) {
160  // Create translate matrix for initial x,y translation from graphicscontext.
161  LLVG_MATRIX_IMPL_setTranslate(local_matrix, x, y);
162  LLVG_MATRIX_IMPL_concatenate(local_matrix, matrix);
163  drawing_matrix = local_matrix;
164  }
165  else {
166  // use original matrix
167  drawing_matrix = matrix;
168  }
169 
170  status = VG_DRAWING_drawImage(gc, image, drawing_matrix, alpha, elapsed, color_matrix, &error);
171 
172  /* FIXME LLVG_OUT_OF_MEMORY errors are not returned as they are reported with error flags.
173  * See M0092MEJAUI-2908.
174  */
175  if (LLVG_OUT_OF_MEMORY == error) {
176  error = LLVG_SUCCESS;
177  }
178  }
179  else {
180  status = DRAWING_DONE;
181  }
182  LLUI_DISPLAY_setDrawingStatus(status);
183  LOG_DRAW_END(drawImage);
184  }
185  return error;
186 }
187 
188 // -----------------------------------------------------------------------------
189 // EOF
190 // -----------------------------------------------------------------------------