20 #include <LLUI_PAINTER_impl.h>
23 #include <LLUI_DISPLAY.h>
26 #include <LLUI_DISPLAY_impl.h>
29 #include "ui_drawing.h"
38 #if (defined(LLUI_MAJOR_VERSION) && (LLUI_MAJOR_VERSION != 14)) || (defined(LLUI_MINOR_VERSION) && \
39 (LLUI_MINOR_VERSION < 0))
40 #error "This CCO is only compatible with UI Pack [14.0.0,15.0.0["
44 #define LOG_DRAW_START(fn) LLTRACE_record_event_u32(LLUI_EVENT_group, LLUI_EVENT_offset + UI_LOG_DRAW, \
45 CONCAT_DEFINES(LOG_DRAW_, fn))
46 #define LOG_DRAW_END(s) LLTRACE_record_event_end_u32(LLUI_EVENT_group, LLUI_EVENT_offset + UI_LOG_DRAW, (s))
51 #define LOG_DRAW_writePixel 1
52 #define LOG_DRAW_drawLine 2
53 #define LOG_DRAW_drawHorizontalLine 3
54 #define LOG_DRAW_drawVerticalLine 4
55 #define LOG_DRAW_drawRectangle 5
56 #define LOG_DRAW_fillRectangle 6
57 #define LOG_DRAW_drawRoundedRectangle 8
58 #define LOG_DRAW_fillRoundedRectangle 9
59 #define LOG_DRAW_drawCircleArc 10
60 #define LOG_DRAW_fillCircleArc 11
61 #define LOG_DRAW_drawEllipseArc 12
62 #define LOG_DRAW_fillEllipseArc 13
63 #define LOG_DRAW_drawEllipse 14
64 #define LOG_DRAW_fillEllipse 15
65 #define LOG_DRAW_drawCircle 16
66 #define LOG_DRAW_fillCircle 17
67 #define LOG_DRAW_drawARGB 18
68 #define LOG_DRAW_drawImage 19
69 #define LOG_DRAW_drawString 20
70 #define LOG_DRAW_stringWidth 21
80 static inline void _check_bound(jint max, jint *bound, jint *size, jint *origin) {
87 if ((*bound + *size) > max) {
97 void LLUI_PAINTER_IMPL_writePixel(MICROUI_GraphicsContext *gc, jint x, jint y) {
98 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_writePixel)) {
99 DRAWING_Status status;
100 LOG_DRAW_START(writePixel);
101 if (LLUI_DISPLAY_isPixelInClip(gc, x, y)) {
102 LLUI_DISPLAY_configureClip(gc,
false );
103 status = UI_DRAWING_writePixel(gc, x, y);
106 status = DRAWING_DONE;
108 LLUI_DISPLAY_setDrawingStatus(status);
109 LOG_DRAW_END(status);
114 void LLUI_PAINTER_IMPL_drawLine(MICROUI_GraphicsContext *gc, jint startX, jint startY, jint endX, jint endY) {
115 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_drawLine)) {
116 LOG_DRAW_START(drawLine);
118 DRAWING_Status status = UI_DRAWING_drawLine(gc, startX, startY, endX, endY);
119 LLUI_DISPLAY_setDrawingStatus(status);
120 LOG_DRAW_END(status);
125 void LLUI_PAINTER_IMPL_drawHorizontalLine(MICROUI_GraphicsContext *gc, jint x, jint y, jint length) {
126 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_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)) {
135 LLUI_DISPLAY_configureClip(gc,
false );
136 status = UI_DRAWING_drawHorizontalLine(gc, x1, x2, y);
139 status = DRAWING_DONE;
141 LLUI_DISPLAY_setDrawingStatus(status);
142 LOG_DRAW_END(status);
147 void LLUI_PAINTER_IMPL_drawVerticalLine(MICROUI_GraphicsContext *gc, jint x, jint y, jint length) {
148 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_drawVerticalLine)) {
149 DRAWING_Status status;
150 LOG_DRAW_START(drawVerticalLine);
153 jint y2 = y + length - 1;
156 if ((length > 0) && LLUI_DISPLAY_clipVerticalLine(gc, &y1, &y2, x)) {
157 LLUI_DISPLAY_configureClip(gc,
false );
158 status = UI_DRAWING_drawVerticalLine(gc, x, y1, y2);
161 status = DRAWING_DONE;
163 LLUI_DISPLAY_setDrawingStatus(status);
164 LOG_DRAW_END(status);
169 void LLUI_PAINTER_IMPL_drawRectangle(MICROUI_GraphicsContext *gc, jint x, jint y, jint width, jint height) {
170 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_drawRectangle)) {
171 DRAWING_Status status;
172 LOG_DRAW_START(drawRectangle);
175 if ((width > 0) && (height > 0)) {
177 jint x2 = x + width - 1;
179 jint y2 = y + height - 1;
182 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRectangleInClip(gc, x1, y1, x2, y2));
183 status = UI_DRAWING_drawRectangle(gc, x1, y1, x2, y2);
186 status = DRAWING_DONE;
188 LLUI_DISPLAY_setDrawingStatus(status);
189 LOG_DRAW_END(status);
194 void LLUI_PAINTER_IMPL_fillRectangle(MICROUI_GraphicsContext *gc, jint x, jint y, jint width, jint height) {
195 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_fillRectangle)) {
196 DRAWING_Status status;
197 LOG_DRAW_START(fillRectangle);
200 jint x2 = x + width - 1;
202 jint y2 = y + height - 1;
205 if ((width > 0) && (height > 0) && LLUI_DISPLAY_clipRectangle(gc, &x1, &y1, &x2, &y2)) {
206 LLUI_DISPLAY_configureClip(gc,
false );
207 status = UI_DRAWING_fillRectangle(gc, x1, y1, x2, y2);
210 status = DRAWING_DONE;
212 LLUI_DISPLAY_setDrawingStatus(status);
213 LOG_DRAW_END(status);
218 void LLUI_PAINTER_IMPL_drawRoundedRectangle(MICROUI_GraphicsContext *gc, jint x, jint y, jint width, jint height,
219 jint cornerEllipseWidth, jint cornerEllipseHeight) {
220 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_drawRoundedRectangle)) {
221 DRAWING_Status status;
222 LOG_DRAW_START(drawRoundedRectangle);
225 if ((width > 0) && (height > 0)) {
227 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
228 status = UI_DRAWING_drawRoundedRectangle(gc, x, y, width, height, cornerEllipseWidth, cornerEllipseHeight);
231 status = DRAWING_DONE;
233 LLUI_DISPLAY_setDrawingStatus(status);
234 LOG_DRAW_END(status);
239 void LLUI_PAINTER_IMPL_fillRoundedRectangle(MICROUI_GraphicsContext *gc, jint x, jint y, jint width, jint height,
240 jint cornerEllipseWidth, jint cornerEllipseHeight) {
241 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_fillRoundedRectangle)) {
242 DRAWING_Status status;
243 LOG_DRAW_START(fillRoundedRectangle);
246 if ((width > 0) && (height > 0)) {
248 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
249 status = UI_DRAWING_fillRoundedRectangle(gc, x, y, width, height, cornerEllipseWidth, cornerEllipseHeight);
252 status = DRAWING_DONE;
254 LLUI_DISPLAY_setDrawingStatus(status);
255 LOG_DRAW_END(status);
260 void LLUI_PAINTER_IMPL_drawCircleArc(MICROUI_GraphicsContext *gc, jint x, jint y, jint diameter, jfloat startAngle,
262 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_drawCircleArc)) {
263 DRAWING_Status status;
264 LOG_DRAW_START(drawCircleArc);
267 if ((diameter > 0) && ((int32_t)arcAngle != 0)) {
269 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
270 status = UI_DRAWING_drawCircleArc(gc, x, y, diameter, startAngle, arcAngle);
273 status = DRAWING_DONE;
275 LLUI_DISPLAY_setDrawingStatus(status);
276 LOG_DRAW_END(status);
281 void LLUI_PAINTER_IMPL_drawEllipseArc(MICROUI_GraphicsContext *gc, jint x, jint y, jint width, jint height,
282 jfloat startAngle, jfloat arcAngle) {
283 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_drawEllipseArc)) {
284 DRAWING_Status status;
285 LOG_DRAW_START(drawEllipseArc);
288 if ((width > 0) && (height > 0) && ((int32_t)arcAngle != 0)) {
290 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
291 status = UI_DRAWING_drawEllipseArc(gc, x, y, width, height, startAngle, arcAngle);
294 status = DRAWING_DONE;
296 LLUI_DISPLAY_setDrawingStatus(status);
297 LOG_DRAW_END(status);
302 void LLUI_PAINTER_IMPL_fillCircleArc(MICROUI_GraphicsContext *gc, jint x, jint y, jint diameter, jfloat startAngle,
304 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_fillCircleArc)) {
305 DRAWING_Status status;
306 LOG_DRAW_START(fillCircleArc);
309 if ((diameter > 0) && ((int32_t)arcAngle != 0)) {
311 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
312 status = UI_DRAWING_fillCircleArc(gc, x, y, diameter, startAngle, arcAngle);
315 status = DRAWING_DONE;
317 LLUI_DISPLAY_setDrawingStatus(status);
318 LOG_DRAW_END(status);
323 void LLUI_PAINTER_IMPL_fillEllipseArc(MICROUI_GraphicsContext *gc, jint x, jint y, jint width, jint height,
324 jfloat startAngle, jfloat arcAngle) {
325 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_fillEllipseArc)) {
326 DRAWING_Status status;
327 LOG_DRAW_START(fillEllipseArc);
330 if ((width > 0) && (height > 0) && ((int32_t)arcAngle != 0)) {
332 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
333 status = UI_DRAWING_fillEllipseArc(gc, x, y, width, height, startAngle, arcAngle);
336 status = DRAWING_DONE;
338 LLUI_DISPLAY_setDrawingStatus(status);
339 LOG_DRAW_END(status);
344 void LLUI_PAINTER_IMPL_drawEllipse(MICROUI_GraphicsContext *gc, jint x, jint y, jint width, jint height) {
345 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_drawEllipse)) {
346 DRAWING_Status status;
347 LOG_DRAW_START(drawEllipse);
350 if ((width > 0) && (height > 0)) {
352 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
353 status = UI_DRAWING_drawEllipse(gc, x, y, width, height);
356 status = DRAWING_DONE;
358 LLUI_DISPLAY_setDrawingStatus(status);
359 LOG_DRAW_END(status);
364 void LLUI_PAINTER_IMPL_fillEllipse(MICROUI_GraphicsContext *gc, jint x, jint y, jint width, jint height) {
365 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_fillEllipse)) {
366 DRAWING_Status status;
367 LOG_DRAW_START(fillEllipse);
370 if ((width > 0) && (height > 0)) {
372 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, width, height));
373 status = UI_DRAWING_fillEllipse(gc, x, y, width, height);
376 status = DRAWING_DONE;
378 LLUI_DISPLAY_setDrawingStatus(status);
379 LOG_DRAW_END(status);
384 void LLUI_PAINTER_IMPL_drawCircle(MICROUI_GraphicsContext *gc, jint x, jint y, jint diameter) {
385 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_drawCircle)) {
386 DRAWING_Status status;
387 LOG_DRAW_START(drawCircle);
392 LLUI_DISPLAY_configureClip(gc, !LLUI_DISPLAY_isRegionInClip(gc, x, y, diameter, diameter));
393 status = UI_DRAWING_drawCircle(gc, x, y, diameter);
396 status = DRAWING_DONE;
398 LLUI_DISPLAY_setDrawingStatus(status);
399 LOG_DRAW_END(status);
404 void LLUI_PAINTER_IMPL_fillCircle(MICROUI_GraphicsContext *gc, jint x, jint y, jint diameter) {
405 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_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);
416 status = DRAWING_DONE;
418 LLUI_DISPLAY_setDrawingStatus(status);
419 LOG_DRAW_END(status);
424 void LLUI_PAINTER_IMPL_drawImage(MICROUI_GraphicsContext *gc, MICROUI_Image *img, jint regionX, jint regionY,
425 jint width, jint height, jint x, jint y, jint alpha) {
426 if (LLUI_DISPLAY_requestDrawing(gc, (SNI_callback) & LLUI_PAINTER_IMPL_drawImage)) {
427 DRAWING_Status status = DRAWING_DONE;
428 LOG_DRAW_START(drawImage);
431 if (!LLUI_DISPLAY_isImageClosed(img) && (alpha > 0)) {
433 jint l_alpha = (alpha > 255) ? 255 : alpha;
436 _check_bound(img->width, ®ionX, &width, &x);
437 _check_bound(img->height, ®ionY, &height, &y);
440 _check_bound(gc->image.width, &x, &width, ®ionX);
441 _check_bound(gc->image.height, &y, &height, ®ionY);
443 if ((width > 0) && (height > 0) && LLUI_DISPLAY_clipRegion(gc, ®ionX, ®ionY, &width, &height, &x,
445 LLUI_DISPLAY_configureClip(gc,
false );
447 if (gc->image.format == img->format) {
450 MICROUI_Image *image = LLUI_DISPLAY_getSourceImage(img);
452 if ((0xff == l_alpha) && !LLUI_DISPLAY_isTransparent(img)) {
454 status = UI_DRAWING_copyImage(gc, image, regionX, regionY, width, height, x, y);
455 }
else if (LLUI_DISPLAY_getBufferAddress(img) == LLUI_DISPLAY_getBufferAddress(&gc->image)) {
457 status = UI_DRAWING_drawRegion(gc, regionX, regionY, width, height, x, y, l_alpha);
460 status = UI_DRAWING_drawImage(gc, image, regionX, regionY, width, height, x, y, l_alpha);
464 status = UI_DRAWING_drawImage(gc, img, regionX, regionY, width, height, x, y, l_alpha);
472 LLUI_DISPLAY_setDrawingStatus(status);
473 LOG_DRAW_END(status);
478 void LLUI_PAINTER_IMPL_drawString(MICROUI_GraphicsContext *gc, jchar *chars, jint offset, jint length,
479 MICROUI_Font *font, jint x, jint y) {
480 if ((length > 0) && LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)LLUI_PAINTER_IMPL_drawString)) {
481 LOG_DRAW_START(drawString);
482 DRAWING_Status status = UI_DRAWING_drawString(gc, chars + offset, length, font, x, y);
483 LLUI_DISPLAY_setDrawingStatus(status);
484 LOG_DRAW_END(status);
489 jint LLUI_PAINTER_IMPL_stringWidth(jchar *chars, jint offset, jint length, MICROUI_Font *font) {
492 LOG_DRAW_START(stringWidth);
493 ret = UI_DRAWING_stringWidth(chars + offset, length, font);
494 LOG_DRAW_END(DRAWING_DONE);
500 jint LLUI_PAINTER_IMPL_initializeRenderableStringSNIContext(jchar *chars, jint offset, jint length, MICROUI_Font *font,
501 MICROUI_RenderableString *renderableString) {
504 ret = UI_DRAWING_initializeRenderableStringSNIContext(chars + offset, length, font, renderableString);
510 void LLUI_PAINTER_IMPL_drawRenderableString(MICROUI_GraphicsContext *gc, jchar *chars, jint offset, jint length,
511 MICROUI_Font *font, jint width, MICROUI_RenderableString *renderableString,
513 if ((length > 0) && LLUI_DISPLAY_requestDrawing(gc, (SNI_callback)LLUI_PAINTER_IMPL_drawRenderableString)) {
514 LOG_DRAW_START(drawString);
515 DRAWING_Status status =
516 UI_DRAWING_drawRenderableString(gc, chars + offset, length, font, width, renderableString, x, y);
517 LLUI_DISPLAY_setDrawingStatus(status);
518 LOG_DRAW_END(status);