22 #include "LLUI_PAINTER_impl.h" 25 #include "ui_drawing.h" 28 #include "LLUI_DISPLAY.h" 39 #define LOG_DRAW_START(fn) LLUI_DISPLAY_logDrawingStart(CONCAT_DEFINES(LOG_DRAW_, fn)) 40 #define LOG_DRAW_END(fn) LLUI_DISPLAY_logDrawingEnd(CONCAT_DEFINES(LOG_DRAW_, fn)) 42 #define MICROUI_PAINTER_NATIVE_NAME(fn) (CONCAT_DEFINES(MICROUI_PAINTER_NATIVE_PREFIX, fn)) 47 #define LOG_DRAW_writePixel 1 48 #define LOG_DRAW_drawLine 2 49 #define LOG_DRAW_drawHorizontalLine 3 50 #define LOG_DRAW_drawVerticalLine 4 51 #define LOG_DRAW_drawRectangle 5 52 #define LOG_DRAW_fillRectangle 6 53 #define LOG_DRAW_drawRoundedRectangle 8 54 #define LOG_DRAW_fillRoundedRectangle 9 55 #define LOG_DRAW_drawCircleArc 10 56 #define LOG_DRAW_fillCircleArc 11 57 #define LOG_DRAW_drawEllipseArc 12 58 #define LOG_DRAW_fillEllipseArc 13 59 #define LOG_DRAW_drawEllipse 14 60 #define LOG_DRAW_fillEllipse 15 61 #define LOG_DRAW_drawCircle 16 62 #define LOG_DRAW_fillCircle 17 63 #define LOG_DRAW_drawARGB 18 64 #define LOG_DRAW_drawImage 19 74 static inline void _check_bound(jint max, jint* bound, jint* size, jint* origin) {
81 if ((*bound + *size) > max) {
90 void MICROUI_PAINTER_NATIVE(writePixel, MICROUI_GraphicsContext* gc, jint x, jint y) {
91 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(writePixel))) {
92 DRAWING_Status status;
93 LOG_DRAW_START(writePixel);
94 if (LLUI_DISPLAY_isPixelInClip(gc, x, y)) {
95 LLUI_DISPLAY_configureClip(gc,
false);
96 status = UI_DRAWING_writePixel(gc, x, y);
100 status = DRAWING_DONE;
102 LLUI_DISPLAY_setDrawingStatus(status);
103 LOG_DRAW_END(writePixel);
108 void MICROUI_PAINTER_NATIVE(drawLine, MICROUI_GraphicsContext* gc, jint startX, jint startY, jint endX, jint endY) {
109 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawLine))) {
110 LOG_DRAW_START(drawLine);
112 LLUI_DISPLAY_setDrawingStatus(UI_DRAWING_drawLine(gc, startX, startY, endX, endY));
113 LOG_DRAW_END(drawLine);
118 void MICROUI_PAINTER_NATIVE(drawHorizontalLine, MICROUI_GraphicsContext* gc, jint x, jint y, jint length) {
119 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawHorizontalLine))) {
120 DRAWING_Status status;
121 LOG_DRAW_START(drawHorizontalLine);
124 jint x2 = x + length - 1;
127 if ((length > 0) && LLUI_DISPLAY_clipHorizontalLine(gc, &x1, &x2, y)) {
128 LLUI_DISPLAY_configureClip(gc,
false );
129 status = UI_DRAWING_drawHorizontalLine(gc, x1, x2, y);
133 status = DRAWING_DONE;
135 LLUI_DISPLAY_setDrawingStatus(status);
136 LOG_DRAW_END(drawHorizontalLine);
141 void MICROUI_PAINTER_NATIVE(drawVerticalLine, MICROUI_GraphicsContext* gc, jint x, jint y, jint length) {
142 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawVerticalLine))) {
143 DRAWING_Status status;
144 LOG_DRAW_START(drawVerticalLine);
147 jint y2 = y + length - 1;
150 if ((length > 0) && LLUI_DISPLAY_clipVerticalLine(gc, &y1, &y2, x)) {
151 LLUI_DISPLAY_configureClip(gc,
false );
152 status = UI_DRAWING_drawVerticalLine(gc, x, y1, y2);
156 status = DRAWING_DONE;
158 LLUI_DISPLAY_setDrawingStatus(status);
159 LOG_DRAW_END(drawVerticalLine);
164 void MICROUI_PAINTER_NATIVE(drawRectangle, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height) {
165 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawRectangle))) {
166 DRAWING_Status status;
167 LOG_DRAW_START(drawRectangle);
170 if ((width > 0) && (height > 0)) {
172 jint x2 = x + width - 1;
174 jint y2 = y + height - 1;
177 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRectangleInClip(gc, x1, y1, x2, y2));
178 status = UI_DRAWING_drawRectangle(gc, x1, y1, x2, y2);
182 status = DRAWING_DONE;
184 LLUI_DISPLAY_setDrawingStatus(status);
185 LOG_DRAW_END(drawRectangle);
190 void MICROUI_PAINTER_NATIVE(fillRectangle, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height) {
191 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillRectangle))) {
192 DRAWING_Status status;
193 LOG_DRAW_START(fillRectangle);
196 jint x2 = x + width - 1;
198 jint y2 = y + height - 1;
201 if ((width > 0) && (height) > 0 && LLUI_DISPLAY_clipRectangle(gc, &x1, &y1, &x2, &y2)) {
202 LLUI_DISPLAY_configureClip(gc,
false );
203 status = UI_DRAWING_fillRectangle(gc, x1, y1, x2, y2);
207 status = DRAWING_DONE;
209 LLUI_DISPLAY_setDrawingStatus(status);
210 LOG_DRAW_END(fillRectangle);
215 void MICROUI_PAINTER_NATIVE(drawRoundedRectangle, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height, jint cornerEllipseWidth, jint cornerEllipseHeight) {
216 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawRoundedRectangle))) {
217 DRAWING_Status status;
218 LOG_DRAW_START(drawRoundedRectangle);
221 if ((width > 0) && (height > 0)) {
223 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
224 status = UI_DRAWING_drawRoundedRectangle(gc, x, y, width, height, cornerEllipseWidth, cornerEllipseHeight);
228 status = DRAWING_DONE;
230 LLUI_DISPLAY_setDrawingStatus(status);
231 LOG_DRAW_END(drawRoundedRectangle);
236 void MICROUI_PAINTER_NATIVE(fillRoundedRectangle, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height, jint cornerEllipseWidth, jint cornerEllipseHeight) {
237 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillRoundedRectangle))) {
238 DRAWING_Status status;
239 LOG_DRAW_START(fillRoundedRectangle);
242 if ((width > 0) && (height > 0)) {
244 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
245 status = UI_DRAWING_fillRoundedRectangle(gc, x, y, width, height, cornerEllipseWidth, cornerEllipseHeight);
249 status = DRAWING_DONE;
251 LLUI_DISPLAY_setDrawingStatus(status);
252 LOG_DRAW_END(fillRoundedRectangle);
257 void MICROUI_PAINTER_NATIVE(drawCircleArc, MICROUI_GraphicsContext* gc, jint x, jint y, jint diameter, jfloat startAngle, jfloat arcAngle) {
258 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawCircleArc))) {
259 DRAWING_Status status;
260 LOG_DRAW_START(drawCircleArc);
263 if ((diameter > 0) && ((int32_t)arcAngle != 0)) {
265 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
266 status = UI_DRAWING_drawCircleArc(gc, x, y, diameter, startAngle, arcAngle);
270 status = DRAWING_DONE;
272 LLUI_DISPLAY_setDrawingStatus(status);
273 LOG_DRAW_END(drawCircleArc);
278 void MICROUI_PAINTER_NATIVE(drawEllipseArc, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height, jfloat startAngle, jfloat arcAngle) {
279 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawEllipseArc))) {
280 DRAWING_Status status;
281 LOG_DRAW_START(drawEllipseArc);
284 if ((width > 0) && (height > 0) && ((int32_t)arcAngle != 0)) {
286 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
287 status = UI_DRAWING_drawEllipseArc(gc, x, y, width, height, startAngle, arcAngle);
291 status = DRAWING_DONE;
293 LLUI_DISPLAY_setDrawingStatus(status);
294 LOG_DRAW_END(drawEllipseArc);
299 void MICROUI_PAINTER_NATIVE(fillCircleArc, MICROUI_GraphicsContext* gc, jint x, jint y, jint diameter, jfloat startAngle, jfloat arcAngle) {
300 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillCircleArc))) {
301 DRAWING_Status status;
302 LOG_DRAW_START(fillCircleArc);
305 if ((diameter > 0) && ((int32_t)arcAngle != 0)) {
307 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
308 status = UI_DRAWING_fillCircleArc(gc, x, y, diameter, startAngle, arcAngle);
312 status = DRAWING_DONE;
314 LLUI_DISPLAY_setDrawingStatus(status);
315 LOG_DRAW_END(fillCircleArc);
320 void MICROUI_PAINTER_NATIVE(fillEllipseArc, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height, jfloat startAngle, jfloat arcAngle) {
321 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillEllipseArc))) {
322 DRAWING_Status status;
323 LOG_DRAW_START(fillEllipseArc);
326 if ((width > 0) && (height > 0) && ((int32_t)arcAngle != 0)) {
328 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
329 status = UI_DRAWING_fillEllipseArc(gc, x, y, width, height, startAngle, arcAngle);
333 status = DRAWING_DONE;
335 LLUI_DISPLAY_setDrawingStatus(status);
336 LOG_DRAW_END(fillEllipseArc);
341 void MICROUI_PAINTER_NATIVE(drawEllipse, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height) {
342 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawEllipse))) {
343 DRAWING_Status status;
344 LOG_DRAW_START(drawEllipse);
347 if ((width > 0) && (height > 0)) {
349 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
350 status = UI_DRAWING_drawEllipse(gc, x, y, width, height);
354 status = DRAWING_DONE;
356 LLUI_DISPLAY_setDrawingStatus(status);
357 LOG_DRAW_END(drawEllipse);
362 void MICROUI_PAINTER_NATIVE(fillEllipse, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height) {
363 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillEllipse))) {
364 DRAWING_Status status;
365 LOG_DRAW_START(fillEllipse);
368 if ((width > 0) && (height > 0)) {
370 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
371 status = UI_DRAWING_fillEllipse(gc, x, y, width, height);
375 status = DRAWING_DONE;
377 LLUI_DISPLAY_setDrawingStatus(status);
378 LOG_DRAW_END(fillEllipse);
383 void MICROUI_PAINTER_NATIVE(drawCircle, MICROUI_GraphicsContext* gc, jint x, jint y, jint diameter) {
384 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawCircle))) {
385 DRAWING_Status status;
386 LOG_DRAW_START(drawCircle);
391 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
392 status = UI_DRAWING_drawCircle(gc, x, y, diameter);
396 status = DRAWING_DONE;
398 LLUI_DISPLAY_setDrawingStatus(status);
399 LOG_DRAW_END(drawCircle);
404 void MICROUI_PAINTER_NATIVE(fillCircle, MICROUI_GraphicsContext* gc, jint x, jint y, jint diameter) {
405 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillCircle))) {
406 DRAWING_Status status;
407 LOG_DRAW_START(fillCircle);
412 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
413 status = UI_DRAWING_fillCircle(gc, x, y, diameter);
417 status = DRAWING_DONE;
419 LLUI_DISPLAY_setDrawingStatus(status);
420 LOG_DRAW_END(fillCircle);
425 void MICROUI_PAINTER_NATIVE(drawImage, MICROUI_GraphicsContext* gc, MICROUI_Image* img, jint regionX, jint regionY, jint width, jint height, jint x, jint y, jint alpha) {
426 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawImage))) {
427 DRAWING_Status status = DRAWING_DONE;
428 LOG_DRAW_START(drawImage);
431 if (!LLUI_DISPLAY_isClosed(img) && (alpha > 0)) {
432 jint l_alpha = (alpha > 255) ? 255 : alpha;
435 _check_bound(img->width, ®ionX, &width, &x);
436 _check_bound(img->height, ®ionY, &height, &y);
439 _check_bound(gc->image.width, &x, &width, ®ionX);
440 _check_bound(gc->image.height, &y, &height, ®ionY);
442 if ((width > 0) && (height > 0) && LLUI_DISPLAY_clipRegion(gc, ®ionX, ®ionY, &width, &height, &x, &y)) {
443 LLUI_DISPLAY_configureClip(gc,
false );
444 status = UI_DRAWING_drawImage(gc, img, regionX, regionY, width, height, x, y, l_alpha);
451 LLUI_DISPLAY_setDrawingStatus(status);
452 LOG_DRAW_END(drawImage);