source: mainline/uspace/app/gfxdemo/gfxdemo.c@ bac8acab

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since bac8acab was bac8acab, checked in by Jiri Svoboda <jiri@…>, 4 years ago

Update gfxdemo synopsis

  • Property mode set to 100644
File size: 18.3 KB
RevLine 
[045186b]1/*
[fd11144]2 * Copyright (c) 2020 Jiri Svoboda
[045186b]3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup gfxdemo
30 * @{
31 */
32/** @file Graphic demo
33 */
34
[a3f63ac]35#include <congfx/console.h>
[c8cf261]36#include <display.h>
[9259d20]37#include <fibril.h>
[e0545de]38#include <gfx/bitmap.h>
[045186b]39#include <gfx/color.h>
40#include <gfx/render.h>
[8fa65af0]41#include <gfx/font.h>
42#include <gfx/text.h>
43#include <gfx/typeface.h>
[9259d20]44#include <io/console.h>
[e0545de]45#include <io/pixelmap.h>
[b3c185b6]46#include <stdbool.h>
[9259d20]47#include <stdlib.h>
[00e8290]48#include <str.h>
[5bded44]49#include <task.h>
[b93ec7c0]50#include <ui/ui.h>
51#include <ui/window.h>
52#include <ui/wdecor.h>
[045186b]53
[338d0935]54static void wnd_close_event(void *);
[b3c185b6]55static void wnd_kbd_event(void *, kbd_event_t *);
56
57static display_wnd_cb_t wnd_cb = {
[338d0935]58 .close_event = wnd_close_event,
[b3c185b6]59 .kbd_event = wnd_kbd_event
60};
61
[b93ec7c0]62static void uiwnd_close_event(ui_window_t *, void *);
63static void uiwnd_kbd_event(ui_window_t *, void *, kbd_event_t *);
64
65static ui_window_cb_t ui_window_cb = {
66 .close = uiwnd_close_event,
67 .kbd = uiwnd_kbd_event
68};
69
[b3c185b6]70static bool quit = false;
71
[587b4cb]72/** Clear screen.
73 *
74 * @param gc Graphic context
75 * @param w Screen width
76 * @param h Screen height
77 */
78static errno_t clear_scr(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)
79{
80 gfx_color_t *color = NULL;
81 gfx_rect_t rect;
82 errno_t rc;
83
84 rc = gfx_color_new_rgb_i16(0, 0, 0, &color);
85 if (rc != EOK)
86 goto error;
87
88 rc = gfx_set_color(gc, color);
89 if (rc != EOK)
90 goto error;
91
92 rect.p0.x = 0;
93 rect.p0.y = 0;
94 rect.p1.x = w;
95 rect.p1.y = h;
96
97 rc = gfx_fill_rect(gc, &rect);
98 if (rc != EOK)
99 goto error;
100
101 gfx_color_delete(color);
102 return EOK;
103error:
104 if (color != NULL)
105 gfx_color_delete(color);
106 return rc;
107}
108
[00e8290]109/** Run rectangle demo on a graphic context.
110 *
111 * @param gc Graphic context
[e0545de]112 * @param w Width
113 * @param h Height
[00e8290]114 */
[1822545]115static errno_t demo_rects(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)
[045186b]116{
[9259d20]117 gfx_color_t *color = NULL;
118 gfx_rect_t rect;
[e0545de]119 int i, j;
[9259d20]120 errno_t rc;
121
[4f64b7b8]122 if (quit)
123 return EOK;
124
[587b4cb]125 rc = clear_scr(gc, w, h);
126 if (rc != EOK)
127 return rc;
128
[e0545de]129 for (j = 0; j < 10; j++) {
[9259d20]130 rc = gfx_color_new_rgb_i16(rand() % 0x10000, rand() % 0x10000,
131 rand() % 0x10000, &color);
132 if (rc != EOK)
[00e8290]133 return rc;
[9259d20]134
135 rc = gfx_set_color(gc, color);
136 if (rc != EOK)
[00e8290]137 return rc;
[9259d20]138
139 for (i = 0; i < 10; i++) {
[00e8290]140 rect.p0.x = rand() % (w - 1);
141 rect.p0.y = rand() % (h - 1);
142 rect.p1.x = rect.p0.x + rand() % (w - 1 - rect.p0.x);
143 rect.p1.y = rect.p0.y + rand() % (h - 1 - rect.p0.y);
[9259d20]144
145 rc = gfx_fill_rect(gc, &rect);
146 if (rc != EOK)
[00e8290]147 return rc;
[9259d20]148 }
149
150 gfx_color_delete(color);
151
152 fibril_usleep(500 * 1000);
[b3c185b6]153
154 if (quit)
155 break;
[9259d20]156 }
[e0545de]157
158 return EOK;
159}
160
[587b4cb]161/** Fill bitmap with tartan pattern.
162 *
163 * @param bitmap Bitmap
164 * @param w Bitmap width
165 * @param h Bitmap height
166 * @return EOK on success or an error code
167 */
168static errno_t bitmap_tartan(gfx_bitmap_t *bitmap, gfx_coord_t w, gfx_coord_t h)
169{
170 int i, j;
171 pixelmap_t pixelmap;
172 gfx_bitmap_alloc_t alloc;
173 errno_t rc;
174
175 rc = gfx_bitmap_get_alloc(bitmap, &alloc);
176 if (rc != EOK)
177 return rc;
178
179 /* In absence of anything else, use pixelmap */
180 pixelmap.width = w;
181 pixelmap.height = h;
182 pixelmap.data = alloc.pixels;
183
184 for (i = 0; i < w; i++) {
185 for (j = 0; j < h; j++) {
186 pixelmap_put_pixel(&pixelmap, i, j,
[6a87f28]187 PIXEL(0, (i % 30) < 3 ? 255 : 0,
[587b4cb]188 (j % 30) < 3 ? 255 : 0, i / 2));
189 }
190 }
191
192 return EOK;
193}
194
195/** Fill bitmap with moire pattern.
196 *
197 * @param bitmap Bitmap
198 * @param w Bitmap width
199 * @param h Bitmap height
200 * @return EOK on success or an error code
201 */
202static errno_t bitmap_moire(gfx_bitmap_t *bitmap, gfx_coord_t w, gfx_coord_t h)
203{
204 int i, j;
205 int k;
206 pixelmap_t pixelmap;
207 gfx_bitmap_alloc_t alloc;
208 errno_t rc;
209
210 rc = gfx_bitmap_get_alloc(bitmap, &alloc);
211 if (rc != EOK)
212 return rc;
213
214 /* In absence of anything else, use pixelmap */
215 pixelmap.width = w;
216 pixelmap.height = h;
217 pixelmap.data = alloc.pixels;
218
219 for (i = 0; i < w; i++) {
220 for (j = 0; j < h; j++) {
221 k = i * i + j * j;
222 pixelmap_put_pixel(&pixelmap, i, j,
[6a87f28]223 PIXEL(0, k, k, k));
[587b4cb]224 }
225 }
226
227 return EOK;
228}
229
[bea947f]230/** Render circle to a bitmap.
231 *
232 * @param bitmap Bitmap
233 * @param w Bitmap width
234 * @param h Bitmap height
235 * @return EOK on success or an error code
236 */
237static errno_t bitmap_circle(gfx_bitmap_t *bitmap, gfx_coord_t w, gfx_coord_t h)
238{
239 int i, j;
240 int k;
241 pixelmap_t pixelmap;
242 gfx_bitmap_alloc_t alloc;
243 errno_t rc;
244
245 rc = gfx_bitmap_get_alloc(bitmap, &alloc);
246 if (rc != EOK)
247 return rc;
248
249 /* In absence of anything else, use pixelmap */
250 pixelmap.width = w;
251 pixelmap.height = h;
252 pixelmap.data = alloc.pixels;
253
254 for (i = 0; i < w; i++) {
255 for (j = 0; j < h; j++) {
256 k = i * i + j * j;
257 pixelmap_put_pixel(&pixelmap, i, j,
[6a87f28]258 k < w * w / 2 ? PIXEL(0, 0, 255, 0) :
[bea947f]259 PIXEL(0, 255, 0, 255));
260 }
261 }
262
263 return EOK;
264}
265
[e0545de]266/** Run bitmap demo on a graphic context.
267 *
268 * @param gc Graphic context
269 * @param w Width
270 * @param h Height
271 */
[1822545]272static errno_t demo_bitmap(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)
[e0545de]273{
274 gfx_bitmap_t *bitmap;
275 gfx_bitmap_params_t params;
276 int i, j;
277 gfx_coord2_t offs;
278 gfx_rect_t srect;
279 errno_t rc;
[587b4cb]280
[4f64b7b8]281 if (quit)
282 return EOK;
283
[587b4cb]284 rc = clear_scr(gc, w, h);
285 if (rc != EOK)
286 return rc;
[e0545de]287
[a8eed5f]288 gfx_bitmap_params_init(&params);
[e0545de]289 params.rect.p0.x = 0;
290 params.rect.p0.y = 0;
291 params.rect.p1.x = w;
292 params.rect.p1.y = h;
293
294 rc = gfx_bitmap_create(gc, &params, NULL, &bitmap);
295 if (rc != EOK)
296 return rc;
297
[587b4cb]298 rc = bitmap_tartan(bitmap, w, h);
[e0545de]299 if (rc != EOK)
[587b4cb]300 goto error;
[e0545de]301
302 for (j = 0; j < 10; j++) {
303 for (i = 0; i < 5; i++) {
304 srect.p0.x = rand() % (w - 40);
[d18f3b7]305 srect.p0.y = rand() % (h - 20);
[e0545de]306 srect.p1.x = srect.p0.x + rand() % (w - srect.p0.x);
307 srect.p1.y = srect.p0.y + rand() % (h - srect.p0.y);
308 offs.x = 0;
309 offs.y = 0;
310
[0008c0f]311 rc = gfx_bitmap_render(bitmap, &srect, &offs);
312 if (rc != EOK)
313 goto error;
[587b4cb]314 fibril_usleep(250 * 1000);
[b3c185b6]315
316 if (quit)
[4f64b7b8]317 goto out;
[587b4cb]318 }
319 }
320
[4f64b7b8]321out:
[587b4cb]322 gfx_bitmap_destroy(bitmap);
323
324 return EOK;
325error:
326 gfx_bitmap_destroy(bitmap);
327 return rc;
328}
329
330/** Run second bitmap demo on a graphic context.
331 *
332 * @param gc Graphic context
333 * @param w Width
334 * @param h Height
335 */
336static errno_t demo_bitmap2(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)
337{
338 gfx_bitmap_t *bitmap;
339 gfx_bitmap_params_t params;
340 int i, j;
341 gfx_coord2_t offs;
342 errno_t rc;
343
[4f64b7b8]344 if (quit)
345 return EOK;
346
[587b4cb]347 rc = clear_scr(gc, w, h);
348 if (rc != EOK)
349 return rc;
350
[b3b00b6]351 gfx_bitmap_params_init(&params);
[587b4cb]352 params.rect.p0.x = 0;
353 params.rect.p0.y = 0;
354 params.rect.p1.x = 40;
355 params.rect.p1.y = 20;
356
357 rc = gfx_bitmap_create(gc, &params, NULL, &bitmap);
358 if (rc != EOK)
359 return rc;
360
361 rc = bitmap_moire(bitmap, 40, 20);
362 if (rc != EOK)
363 goto error;
364
365 for (j = 0; j < 10; j++) {
366 for (i = 0; i < 10; i++) {
367 offs.x = rand() % (w - 40);
368 offs.y = rand() % (h - 20);
369
370 rc = gfx_bitmap_render(bitmap, NULL, &offs);
371 if (rc != EOK)
372 goto error;
[e0545de]373 }
[587b4cb]374
375 fibril_usleep(500 * 1000);
[b3c185b6]376
377 if (quit)
378 break;
[e0545de]379 }
380
381 gfx_bitmap_destroy(bitmap);
382
383 return EOK;
[0008c0f]384error:
385 gfx_bitmap_destroy(bitmap);
386 return rc;
[e0545de]387}
[8fa65af0]388
[bea947f]389/** Run bitmap color key demo on a graphic context.
390 *
391 * @param gc Graphic context
392 * @param w Width
393 * @param h Height
394 */
395static errno_t demo_bitmap_kc(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)
396{
397 gfx_bitmap_t *bitmap;
398 gfx_bitmap_params_t params;
399 int i, j;
400 gfx_coord2_t offs;
401 errno_t rc;
402
[4f64b7b8]403 if (quit)
404 return EOK;
405
[bea947f]406 rc = clear_scr(gc, w, h);
407 if (rc != EOK)
408 return rc;
409
[b3b00b6]410 gfx_bitmap_params_init(&params);
[bea947f]411 params.rect.p0.x = 0;
412 params.rect.p0.y = 0;
413 params.rect.p1.x = 40;
414 params.rect.p1.y = 40;
415 params.flags = bmpf_color_key;
416 params.key_color = PIXEL(0, 255, 0, 255);
417
418 rc = gfx_bitmap_create(gc, &params, NULL, &bitmap);
419 if (rc != EOK)
420 return rc;
421
422 rc = bitmap_circle(bitmap, 40, 40);
423 if (rc != EOK)
424 goto error;
425
426 for (j = 0; j < 10; j++) {
427 for (i = 0; i < 10; i++) {
428 offs.x = j * 20 + i * 20;
429 offs.y = i * 20;
430
431 rc = gfx_bitmap_render(bitmap, NULL, &offs);
432 if (rc != EOK)
433 goto error;
434 }
435
436 fibril_usleep(500 * 1000);
437
438 if (quit)
439 break;
440 }
441
442 gfx_bitmap_destroy(bitmap);
443
444 return EOK;
445error:
446 gfx_bitmap_destroy(bitmap);
447 return rc;
448}
[e0545de]449
[8fa65af0]450/** Run text demo on a graphic context.
451 *
452 * @param gc Graphic context
453 * @param w Width
454 * @param h Height
455 */
456static errno_t demo_text(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)
457{
458 gfx_color_t *color = NULL;
459 gfx_rect_t rect;
460 gfx_typeface_t *tface = NULL;
461 gfx_font_info_t *finfo;
462 gfx_font_t *font = NULL;
463 gfx_coord2_t pos;
464 gfx_text_fmt_t fmt;
465 int i;
466 errno_t rc;
467
[4f64b7b8]468 if (quit)
469 return EOK;
470
[6a87f28]471 /* XXX Crude way of detecting text mode */
472 if (w < 256) {
473 /* Create dummy font for text mode */
474 rc = gfx_typeface_create(gc, &tface);
475 if (rc != EOK) {
476 printf("Error creating typeface\n");
477 goto error;
478 }
[8fa65af0]479
[6a87f28]480 rc = gfx_font_create_textmode(tface, &font);
481 if (rc != EOK) {
482 printf("Error creating font\n");
483 goto error;
484 }
485 } else {
486 /* Load font */
487 rc = gfx_typeface_open(gc, "/data/font/helena.tpf", &tface);
488 if (rc != EOK) {
489 printf("Error opening typeface\n");
490 goto error;
491 }
[8fa65af0]492
[6a87f28]493 finfo = gfx_typeface_first_font(tface);
494 if (finfo == NULL) {
495 printf("Typeface contains no font.\n");
496 rc = ENOENT;
497 goto error;
498 }
499
500 rc = gfx_font_open(finfo, &font);
501 if (rc != EOK) {
502 printf("Error opening font.\n");
503 goto error;
504 }
[8fa65af0]505 }
506
507 rc = clear_scr(gc, w, h);
508 if (rc != EOK)
509 goto error;
510
511 /* Vertical bars */
512
513 for (i = 0; i < 20; i++) {
514 rc = gfx_color_new_rgb_i16(0, 0x8000 * i / 20,
515 0x8000 * i / 20, &color);
516 if (rc != EOK)
517 goto error;
518
519 rc = gfx_set_color(gc, color);
520 if (rc != EOK)
521 goto error;
522
523 rect.p0.x = w * i / 20;
524 rect.p0.y = 0;
525 rect.p1.x = w * (i + 1) / 20;
526 rect.p1.y = h;
527
528 rc = gfx_fill_rect(gc, &rect);
529 if (rc != EOK)
530 goto error;
531
532 gfx_color_delete(color);
533 }
534
535 rc = gfx_color_new_rgb_i16(0, 0, 0x8000, &color);
536 if (rc != EOK)
537 goto error;
538
539 rc = gfx_set_color(gc, color);
540 if (rc != EOK)
541 goto error;
542
543 rect.p0.x = w / 20;
[8bf9058]544 rect.p0.y = 2 * h / 15;
[8fa65af0]545 rect.p1.x = w - w / 20;
546 rect.p1.y = 5 * h / 15;
547
548 rc = gfx_fill_rect(gc, &rect);
549 if (rc != EOK)
550 goto error;
551
552 gfx_color_delete(color);
553
554 rc = gfx_color_new_rgb_i16(0xffff, 0xffff, 0xffff, &color);
555 if (rc != EOK)
556 goto error;
557
558 rc = gfx_set_color(gc, color);
559 if (rc != EOK)
560 goto error;
561
562 gfx_text_fmt_init(&fmt);
563
564 pos.x = rect.p0.x;
565 pos.y = rect.p0.y;
566 rc = gfx_puttext(font, &pos, &fmt, "Top left");
567 if (rc != EOK) {
568 printf("Error rendering text.\n");
569 goto error;
570 }
571
[8bf9058]572 pos.x = (rect.p0.x + rect.p1.x - 1) / 2;
[8fa65af0]573 pos.y = rect.p0.y;
574 fmt.halign = gfx_halign_center;
575 rc = gfx_puttext(font, &pos, &fmt, "Top center");
576 if (rc != EOK)
577 goto error;
578
[8bf9058]579 pos.x = rect.p1.x - 1;
[8fa65af0]580 pos.y = rect.p0.y;
581 fmt.halign = gfx_halign_right;
582 rc = gfx_puttext(font, &pos, &fmt, "Top right");
583 if (rc != EOK)
584 goto error;
585
586 fmt.valign = gfx_valign_center;
587
588 pos.x = rect.p0.x;
[8bf9058]589 pos.y = (rect.p0.y + rect.p1.y - 1) / 2;
[8fa65af0]590 fmt.halign = gfx_halign_left;
591 rc = gfx_puttext(font, &pos, &fmt, "Center left");
592 if (rc != EOK)
593 goto error;
594
[8bf9058]595 pos.x = (rect.p0.x + rect.p1.x - 1) / 2;
596 pos.y = (rect.p0.y + rect.p1.y - 1) / 2;
[8fa65af0]597 fmt.halign = gfx_halign_center;
598 rc = gfx_puttext(font, &pos, &fmt, "Center");
599 if (rc != EOK)
600 goto error;
601
[8bf9058]602 pos.x = rect.p1.x - 1;
603 pos.y = (rect.p0.y + rect.p1.y - 1) / 2;
[8fa65af0]604 fmt.halign = gfx_halign_right;
605 rc = gfx_puttext(font, &pos, &fmt, "Center right");
606 if (rc != EOK)
607 goto error;
608
609 fmt.valign = gfx_valign_bottom;
610
611 pos.x = rect.p0.x;
[8bf9058]612 pos.y = rect.p1.y - 1;
[8fa65af0]613 fmt.halign = gfx_halign_left;
614 rc = gfx_puttext(font, &pos, &fmt, "Bottom left");
615 if (rc != EOK)
616 goto error;
617
[8bf9058]618 pos.x = (rect.p0.x + rect.p1.x - 1) / 2;
619 pos.y = rect.p1.y - 1;
[8fa65af0]620 fmt.halign = gfx_halign_center;
621 rc = gfx_puttext(font, &pos, &fmt, "Bottom center");
622 if (rc != EOK)
623 goto error;
624
[8bf9058]625 pos.x = rect.p1.x - 1;
626 pos.y = rect.p1.y - 1;
[8fa65af0]627 fmt.halign = gfx_halign_right;
628 rc = gfx_puttext(font, &pos, &fmt, "Bottom right");
629 if (rc != EOK)
630 goto error;
631
[0d62c10]632 gfx_color_delete(color);
633
[8fa65af0]634 gfx_text_fmt_init(&fmt);
635
636 for (i = 0; i < 8; i++) {
[0d62c10]637 rc = gfx_color_new_rgb_i16((i & 4) ? 0xffff : 0,
638 (i & 2) ? 0xffff : 0, (i & 1) ? 0xffff : 0, &color);
639 if (rc != EOK)
640 goto error;
641
642 rc = gfx_set_color(gc, color);
643 if (rc != EOK)
644 goto error;
645
[8fa65af0]646 pos.x = w / 20;
647 pos.y = (7 + i) * h / 15;
648 rc = gfx_puttext(font, &pos, &fmt, "The quick brown fox jumps over the lazy dog.");
649 if (rc != EOK)
650 goto error;
[0d62c10]651
652 gfx_color_delete(color);
[8fa65af0]653 }
654
655 for (i = 0; i < 10; i++) {
656 fibril_usleep(500 * 1000);
657 if (quit)
658 break;
659 }
660
661 gfx_font_close(font);
662 gfx_typeface_destroy(tface);
663 return EOK;
664error:
665 if (font != NULL)
666 gfx_font_close(font);
667 if (tface != NULL)
668 gfx_typeface_destroy(tface);
669 return rc;
670}
671
[e0545de]672/** Run demo loop on a graphic context.
673 *
674 * @param gc Graphic context
675 * @param w Width
676 * @param h Height
677 */
[1822545]678static errno_t demo_loop(gfx_context_t *gc, gfx_coord_t w, gfx_coord_t h)
[e0545de]679{
680 errno_t rc;
681
[b3c185b6]682 while (!quit) {
[e0545de]683 rc = demo_rects(gc, w, h);
684 if (rc != EOK)
685 return rc;
686
687 rc = demo_bitmap(gc, w, h);
688 if (rc != EOK)
689 return rc;
[587b4cb]690
691 rc = demo_bitmap2(gc, w, h);
692 if (rc != EOK)
693 return rc;
[bea947f]694
695 rc = demo_bitmap_kc(gc, w, h);
696 if (rc != EOK)
697 return rc;
[8fa65af0]698
699 rc = demo_text(gc, w, h);
700 if (rc != EOK)
701 return rc;
[e0545de]702 }
[b3c185b6]703
704 return EOK;
[00e8290]705}
706
707/** Run demo on console. */
708static errno_t demo_console(void)
709{
710 console_ctrl_t *con = NULL;
711 console_gc_t *cgc = NULL;
712 gfx_context_t *gc;
713 errno_t rc;
714
715 printf("Init console..\n");
716 con = console_init(stdin, stdout);
717 if (con == NULL)
718 return EIO;
719
720 printf("Create console GC\n");
721 rc = console_gc_create(con, stdout, &cgc);
722 if (rc != EOK)
723 return rc;
724
725 gc = console_gc_get_ctx(cgc);
726
[e0545de]727 rc = demo_loop(gc, 80, 25);
[00e8290]728 if (rc != EOK)
729 return rc;
[9259d20]730
[9be2358]731 rc = console_gc_delete(cgc);
732 if (rc != EOK)
[00e8290]733 return rc;
734
735 return EOK;
736}
737
[b93ec7c0]738/** Run demo on UI. */
739static errno_t demo_ui(const char *display_spec)
[00e8290]740{
[b93ec7c0]741 ui_t *ui = NULL;
742 ui_wnd_params_t params;
743 ui_window_t *window = NULL;
[00e8290]744 gfx_context_t *gc;
[b93ec7c0]745 gfx_rect_t rect;
746 gfx_rect_t wrect;
747 gfx_coord2_t off;
[00e8290]748 errno_t rc;
749
[b93ec7c0]750 printf("Init UI..\n");
[00e8290]751
[b93ec7c0]752 rc = ui_create(display_spec, &ui);
753 if (rc != EOK) {
754 printf("Error initializing UI (%s)\n", display_spec);
755 goto error;
[00e8290]756 }
757
[b93ec7c0]758 rect.p0.x = 0;
759 rect.p0.y = 0;
760 rect.p1.x = 400;
761 rect.p1.y = 300;
[00e8290]762
[b93ec7c0]763 ui_wnd_params_init(&params);
764 params.caption = "GFX Demo";
[00e8290]765
[b93ec7c0]766 /*
767 * Compute window rectangle such that application area corresponds
768 * to rect
769 */
[266ec54]770 ui_wdecor_rect_from_app(params.style, &rect, &wrect);
[b93ec7c0]771 off = wrect.p0;
772 gfx_rect_rtranslate(&off, &wrect, &params.rect);
[00e8290]773
[b93ec7c0]774 rc = ui_window_create(ui, &params, &window);
775 if (rc != EOK) {
776 printf("Error creating window.\n");
777 goto error;
[00e8290]778 }
779
[b93ec7c0]780 ui_window_set_cb(window, &ui_window_cb, NULL);
[00e8290]781
[b93ec7c0]782 rc = ui_window_get_app_gc(window, &gc);
783 if (rc != EOK) {
784 printf("Error creating graphic context.\n");
785 goto error;
786 }
[00e8290]787
[5bded44]788 task_retval(0);
789
[b93ec7c0]790 rc = demo_loop(gc, rect.p1.x, rect.p1.y);
[00e8290]791 if (rc != EOK)
[b93ec7c0]792 goto error;
[00e8290]793
[b93ec7c0]794 ui_window_destroy(window);
795 ui_destroy(ui);
[00e8290]796
797 return EOK;
[b93ec7c0]798error:
799 if (window != NULL)
800 ui_window_destroy(window);
801 if (ui != NULL)
802 ui_destroy(ui);
803 return rc;
[00e8290]804}
805
[c8cf261]806/** Run demo on display server. */
[fd11144]807static errno_t demo_display(const char *display_svc)
[c8cf261]808{
809 display_t *display = NULL;
810 gfx_context_t *gc;
[4d9c807]811 display_wnd_params_t params;
[c8cf261]812 display_window_t *window = NULL;
813 errno_t rc;
814
815 printf("Init display..\n");
816
[fd11144]817 rc = display_open(display_svc, &display);
[c8cf261]818 if (rc != EOK) {
819 printf("Error opening display.\n");
820 return rc;
821 }
822
[4d9c807]823 display_wnd_params_init(&params);
824 params.rect.p0.x = 0;
825 params.rect.p0.y = 0;
826 params.rect.p1.x = 400;
827 params.rect.p1.y = 300;
828
829 rc = display_window_create(display, &params, &wnd_cb, NULL, &window);
[c8cf261]830 if (rc != EOK) {
831 printf("Error creating window.\n");
832 return rc;
833 }
834
835 rc = display_window_get_gc(window, &gc);
836 if (rc != EOK) {
837 printf("Error getting graphics context.\n");
[32dde7e8]838 return rc;
[c8cf261]839 }
840
[5bded44]841 task_retval(0);
842
[e0545de]843 rc = demo_loop(gc, 400, 300);
[c8cf261]844 if (rc != EOK)
845 return rc;
846
847 rc = gfx_context_delete(gc);
848 if (rc != EOK)
849 return rc;
850
[e49b7997]851 display_window_destroy(window);
852 display_close(display);
853
[c8cf261]854 return EOK;
855}
856
[338d0935]857static void wnd_close_event(void *arg)
858{
859 printf("Close event\n");
860 quit = true;
861}
862
[b3c185b6]863static void wnd_kbd_event(void *arg, kbd_event_t *event)
864{
865 printf("Keyboard event type=%d key=%d\n", event->type, event->key);
[5fae123]866 if (event->type == KEY_PRESS)
867 quit = true;
[b3c185b6]868}
869
[b93ec7c0]870static void uiwnd_close_event(ui_window_t *window, void *arg)
871{
872 printf("Close event\n");
873 quit = true;
874}
875
876static void uiwnd_kbd_event(ui_window_t *window, void *arg, kbd_event_t *event)
877{
878 printf("Keyboard event type=%d key=%d\n", event->type, event->key);
879 if (event->type == KEY_PRESS)
880 quit = true;
881}
882
[00e8290]883static void print_syntax(void)
884{
[bac8acab]885 printf("Syntax: gfxdemo [-d <display>] {console|display|ui}\n");
[00e8290]886}
887
888int main(int argc, char *argv[])
889{
890 errno_t rc;
[fd11144]891 const char *display_svc = DISPLAY_DEFAULT;
892 int i;
893
894 i = 1;
895 while (i < argc && argv[i][0] == '-') {
896 if (str_cmp(argv[i], "-d") == 0) {
897 ++i;
898 if (i >= argc) {
899 printf("Argument missing.\n");
900 print_syntax();
901 return 1;
902 }
903
904 display_svc = argv[i++];
905 } else {
906 printf("Invalid option '%s'.\n", argv[i]);
907 print_syntax();
908 return 1;
909 }
910 }
[00e8290]911
[fd11144]912 if (i >= argc || str_cmp(argv[i], "display") == 0) {
913 rc = demo_display(display_svc);
[0b63dc2]914 if (rc != EOK)
915 return 1;
[fd11144]916 } else if (str_cmp(argv[i], "console") == 0) {
[00e8290]917 rc = demo_console();
918 if (rc != EOK)
919 return 1;
[b93ec7c0]920 } else if (str_cmp(argv[i], "ui") == 0) {
921 rc = demo_ui(display_svc);
[00e8290]922 if (rc != EOK)
923 return 1;
924 } else {
925 print_syntax();
926 return 1;
927 }
[045186b]928}
929
930/** @}
931 */
Note: See TracBrowser for help on using the repository browser.