22 #include "LLUI_PAINTER_impl.h" 25 #include "ui_drawing.h" 28 #include "LLUI_DISPLAY.h" 35 #define LOG_DRAW_START(fn) LLUI_DISPLAY_logDrawingStart(CONCAT_DEFINES(LOG_DRAW_, fn)) 36 #define LOG_DRAW_END(fn) LLUI_DISPLAY_logDrawingEnd(CONCAT_DEFINES(LOG_DRAW_, fn)) 38 #define MICROUI_PAINTER_NATIVE_NAME(fn) (CONCAT_DEFINES(MICROUI_PAINTER_NATIVE_PREFIX, fn)) 43 #define LOG_DRAW_writePixel 1 44 #define LOG_DRAW_drawLine 2 45 #define LOG_DRAW_drawHorizontalLine 3 46 #define LOG_DRAW_drawVerticalLine 4 47 #define LOG_DRAW_drawRectangle 5 48 #define LOG_DRAW_fillRectangle 6 49 #define LOG_DRAW_drawRoundedRectangle 8 50 #define LOG_DRAW_fillRoundedRectangle 9 51 #define LOG_DRAW_drawCircleArc 10 52 #define LOG_DRAW_fillCircleArc 11 53 #define LOG_DRAW_drawEllipseArc 12 54 #define LOG_DRAW_fillEllipseArc 13 55 #define LOG_DRAW_drawEllipse 14 56 #define LOG_DRAW_fillEllipse 15 57 #define LOG_DRAW_drawCircle 16 58 #define LOG_DRAW_fillCircle 17 59 #define LOG_DRAW_drawARGB 18 60 #define LOG_DRAW_drawImage 19 70 static inline void _check_bound(jint max, jint* bound, jint* size, jint* origin)
79 if (*bound + *size > max)
89 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)))
93 DRAWING_Status status;
94 LOG_DRAW_START(writePixel);
95 if (LLUI_DISPLAY_isPixelInClip(gc, x, y))
97 LLUI_DISPLAY_configureClip(gc,
false);
98 status = UI_DRAWING_writePixel(gc, x, y);
103 status = DRAWING_DONE;
105 LLUI_DISPLAY_setDrawingStatus(status);
106 LOG_DRAW_END(writePixel);
111 void MICROUI_PAINTER_NATIVE(drawLine, MICROUI_GraphicsContext* gc, jint startX, jint startY, jint endX, jint endY)
113 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawLine)))
115 LOG_DRAW_START(drawLine);
117 LLUI_DISPLAY_setDrawingStatus(UI_DRAWING_drawLine(gc, startX, startY, endX, endY));
118 LOG_DRAW_END(drawLine);
123 void MICROUI_PAINTER_NATIVE(drawHorizontalLine, MICROUI_GraphicsContext* gc, jint x, jint y, jint length)
125 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawHorizontalLine)))
127 DRAWING_Status status;
128 LOG_DRAW_START(drawHorizontalLine);
131 jint x2 = x + length - 1;
134 if (length > 0 && LLUI_DISPLAY_clipHorizontalLine(gc, &x1, &x2, y))
136 LLUI_DISPLAY_configureClip(gc,
false );
137 status = UI_DRAWING_drawHorizontalLine(gc, x1, x2, y);
142 status = DRAWING_DONE;
144 LLUI_DISPLAY_setDrawingStatus(status);
145 LOG_DRAW_END(drawHorizontalLine);
150 void MICROUI_PAINTER_NATIVE(drawVerticalLine, MICROUI_GraphicsContext* gc, jint x, jint y, jint length)
152 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawVerticalLine)))
154 DRAWING_Status status;
155 LOG_DRAW_START(drawVerticalLine);
158 jint y2 = y + length - 1;
161 if (length > 0 && LLUI_DISPLAY_clipVerticalLine(gc, &y1, &y2, x))
163 LLUI_DISPLAY_configureClip(gc,
false );
164 status = UI_DRAWING_drawVerticalLine(gc, x, y1, y2);
169 status = DRAWING_DONE;
171 LLUI_DISPLAY_setDrawingStatus(status);
172 LOG_DRAW_END(drawVerticalLine);
177 void MICROUI_PAINTER_NATIVE(drawRectangle, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height)
179 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawRectangle)))
181 DRAWING_Status status;
182 LOG_DRAW_START(drawRectangle);
185 if (width > 0 && height > 0)
188 jint x2 = x + width - 1;
190 jint y2 = y + height - 1;
193 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRectangleInClip(gc, x1, y1, x2, y2));
194 status = UI_DRAWING_drawRectangle(gc, x1, y1, x2, y2);
199 status = DRAWING_DONE;
201 LLUI_DISPLAY_setDrawingStatus(status);
202 LOG_DRAW_END(drawRectangle);
207 void MICROUI_PAINTER_NATIVE(fillRectangle, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height)
209 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillRectangle)))
211 DRAWING_Status status;
212 LOG_DRAW_START(fillRectangle);
215 jint x2 = x + width - 1;
217 jint y2 = y + height - 1;
220 if (width > 0 && height > 0 && LLUI_DISPLAY_clipRectangle(gc, &x1, &y1, &x2, &y2))
222 LLUI_DISPLAY_configureClip(gc,
false );
223 status = UI_DRAWING_fillRectangle(gc, x1, y1, x2, y2);
228 status = DRAWING_DONE;
230 LLUI_DISPLAY_setDrawingStatus(status);
231 LOG_DRAW_END(fillRectangle);
236 void MICROUI_PAINTER_NATIVE(drawRoundedRectangle, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height, jint cornerEllipseWidth, jint cornerEllipseHeight)
238 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawRoundedRectangle)))
240 DRAWING_Status status;
241 LOG_DRAW_START(drawRoundedRectangle);
244 if (width > 0 && height > 0)
247 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
248 status = UI_DRAWING_drawRoundedRectangle(gc, x, y, width, height, cornerEllipseWidth, cornerEllipseHeight);
253 status = DRAWING_DONE;
255 LLUI_DISPLAY_setDrawingStatus(status);
256 LOG_DRAW_END(drawRoundedRectangle);
261 void MICROUI_PAINTER_NATIVE(fillRoundedRectangle, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height, jint cornerEllipseWidth, jint cornerEllipseHeight)
263 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillRoundedRectangle)))
265 DRAWING_Status status;
266 LOG_DRAW_START(fillRoundedRectangle);
269 if (width > 0 && height > 0)
272 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
273 status = UI_DRAWING_fillRoundedRectangle(gc, x, y, width, height, cornerEllipseWidth, cornerEllipseHeight);
278 status = DRAWING_DONE;
280 LLUI_DISPLAY_setDrawingStatus(status);
281 LOG_DRAW_END(fillRoundedRectangle);
286 void MICROUI_PAINTER_NATIVE(drawCircleArc, MICROUI_GraphicsContext* gc, jint x, jint y, jint diameter, jfloat startAngle, jfloat arcAngle)
288 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawCircleArc)))
290 DRAWING_Status status;
291 LOG_DRAW_START(drawCircleArc);
294 if (diameter > 0 && (int32_t)arcAngle != 0)
297 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
298 status = UI_DRAWING_drawCircleArc(gc, x, y, diameter, startAngle, arcAngle);
303 status = DRAWING_DONE;
305 LLUI_DISPLAY_setDrawingStatus(status);
306 LOG_DRAW_END(drawCircleArc);
311 void MICROUI_PAINTER_NATIVE(drawEllipseArc, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height, jfloat startAngle, jfloat arcAngle)
313 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawEllipseArc)))
315 DRAWING_Status status;
316 LOG_DRAW_START(drawEllipseArc);
319 if (width > 0 && height > 0 && (int32_t)arcAngle != 0)
322 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
323 status = UI_DRAWING_drawEllipseArc(gc, x, y, width, height, startAngle, arcAngle);
328 status = DRAWING_DONE;
330 LLUI_DISPLAY_setDrawingStatus(status);
331 LOG_DRAW_END(drawEllipseArc);
336 void MICROUI_PAINTER_NATIVE(fillCircleArc, MICROUI_GraphicsContext* gc, jint x, jint y, jint diameter, jfloat startAngle, jfloat arcAngle)
338 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillCircleArc)))
340 DRAWING_Status status;
341 LOG_DRAW_START(fillCircleArc);
344 if (diameter > 0 && (int32_t)arcAngle != 0)
347 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
348 status = UI_DRAWING_fillCircleArc(gc, x, y, diameter, startAngle, arcAngle);
353 status = DRAWING_DONE;
355 LLUI_DISPLAY_setDrawingStatus(status);
356 LOG_DRAW_END(fillCircleArc);
361 void MICROUI_PAINTER_NATIVE(fillEllipseArc, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height, jfloat startAngle, jfloat arcAngle)
363 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillEllipseArc)))
365 DRAWING_Status status;
366 LOG_DRAW_START(fillEllipseArc);
369 if (width > 0 && height > 0 && (int32_t)arcAngle != 0)
372 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
373 status = UI_DRAWING_fillEllipseArc(gc, x, y, width, height, startAngle, arcAngle);
378 status = DRAWING_DONE;
380 LLUI_DISPLAY_setDrawingStatus(status);
381 LOG_DRAW_END(fillEllipseArc);
386 void MICROUI_PAINTER_NATIVE(drawEllipse, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height)
388 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawEllipse)))
390 DRAWING_Status status;
391 LOG_DRAW_START(drawEllipse);
394 if (width > 0 && height > 0)
397 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
398 status = UI_DRAWING_drawEllipse(gc, x, y, width, height);
403 status = DRAWING_DONE;
405 LLUI_DISPLAY_setDrawingStatus(status);
406 LOG_DRAW_END(drawEllipse);
411 void MICROUI_PAINTER_NATIVE(fillEllipse, MICROUI_GraphicsContext* gc, jint x, jint y, jint width, jint height)
413 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillEllipse)))
415 DRAWING_Status status;
416 LOG_DRAW_START(fillEllipse);
419 if (width > 0 && height > 0)
422 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
423 status = UI_DRAWING_fillEllipse(gc, x, y, width, height);
428 status = DRAWING_DONE;
430 LLUI_DISPLAY_setDrawingStatus(status);
431 LOG_DRAW_END(fillEllipse);
436 void MICROUI_PAINTER_NATIVE(drawCircle, MICROUI_GraphicsContext* gc, jint x, jint y, jint diameter)
438 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawCircle)))
440 DRAWING_Status status;
441 LOG_DRAW_START(drawCircle);
447 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
448 status = UI_DRAWING_drawCircle(gc, x, y, diameter);
453 status = DRAWING_DONE;
455 LLUI_DISPLAY_setDrawingStatus(status);
456 LOG_DRAW_END(drawCircle);
461 void MICROUI_PAINTER_NATIVE(fillCircle, MICROUI_GraphicsContext* gc, jint x, jint y, jint diameter)
463 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(fillCircle)))
465 DRAWING_Status status;
466 LOG_DRAW_START(fillCircle);
472 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
473 status = UI_DRAWING_fillCircle(gc, x, y, diameter);
478 status = DRAWING_DONE;
480 LLUI_DISPLAY_setDrawingStatus(status);
481 LOG_DRAW_END(fillCircle);
486 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)
488 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)&MICROUI_PAINTER_NATIVE_NAME(drawImage)))
490 DRAWING_Status status = DRAWING_DONE;
491 LOG_DRAW_START(drawImage);
494 if (!LLUI_DISPLAY_isClosed(img) && alpha > 0)
496 alpha = alpha > 255 ? 255 : alpha;
499 _check_bound(img->width, ®ionX, &width, &x);
500 _check_bound(img->height, ®ionY, &height, &y);
503 _check_bound(gc->image.width, &x, &width, ®ionX);
504 _check_bound(gc->image.height, &y, &height, ®ionY);
506 if (width > 0 && height > 0 && LLUI_DISPLAY_clipRegion(gc, ®ionX, ®ionY, &width, &height, &x, &y))
508 LLUI_DISPLAY_configureClip(gc,
false );
509 status = UI_DRAWING_drawImage(gc, img, regionX, regionY, width, height, x, y, alpha);
516 LLUI_DISPLAY_setDrawingStatus(status);
517 LOG_DRAW_END(drawImage);