source: mainline/uspace/lib/ui/test/rbutton.c@ f536a16

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

Print text as text in textmode UI. Make calculator smaller in text mode.

  • Property mode set to 100644
File size: 16.5 KB
Line 
1/*
2 * Copyright (c) 2021 Jiri Svoboda
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#include <gfx/context.h>
30#include <gfx/coord.h>
31#include <mem.h>
32#include <pcut/pcut.h>
33#include <stdbool.h>
34#include <ui/control.h>
35#include <ui/rbutton.h>
36#include <ui/resource.h>
37#include "../private/rbutton.h"
38
39PCUT_INIT;
40
41PCUT_TEST_SUITE(rbutton);
42
43static errno_t testgc_set_color(void *, gfx_color_t *);
44static errno_t testgc_fill_rect(void *, gfx_rect_t *);
45static errno_t testgc_bitmap_create(void *, gfx_bitmap_params_t *,
46 gfx_bitmap_alloc_t *, void **);
47static errno_t testgc_bitmap_destroy(void *);
48static errno_t testgc_bitmap_render(void *, gfx_rect_t *, gfx_coord2_t *);
49static errno_t testgc_bitmap_get_alloc(void *, gfx_bitmap_alloc_t *);
50
51static gfx_context_ops_t ops = {
52 .set_color = testgc_set_color,
53 .fill_rect = testgc_fill_rect,
54 .bitmap_create = testgc_bitmap_create,
55 .bitmap_destroy = testgc_bitmap_destroy,
56 .bitmap_render = testgc_bitmap_render,
57 .bitmap_get_alloc = testgc_bitmap_get_alloc
58};
59
60static void test_rbutton_select(ui_rbutton_group_t *, void *, void *);
61
62static ui_rbutton_group_cb_t test_rbutton_group_cb = {
63 .selected = test_rbutton_select
64};
65
66static ui_rbutton_group_cb_t dummy_rbutton_group_cb = {
67};
68
69typedef struct {
70 bool bm_created;
71 bool bm_destroyed;
72 gfx_bitmap_params_t bm_params;
73 void *bm_pixels;
74 gfx_rect_t bm_srect;
75 gfx_coord2_t bm_offs;
76 bool bm_rendered;
77 bool bm_got_alloc;
78} test_gc_t;
79
80typedef struct {
81 test_gc_t *tgc;
82 gfx_bitmap_alloc_t alloc;
83 bool myalloc;
84} testgc_bitmap_t;
85
86typedef struct {
87 bool selected;
88} test_cb_resp_t;
89
90/** Create and destroy radio button */
91PCUT_TEST(create_destroy)
92{
93 ui_rbutton_group_t *group = NULL;
94 ui_rbutton_t *rbutton = NULL;
95 errno_t rc;
96
97 rc = ui_rbutton_group_create(NULL, &group);
98 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
99
100 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
101 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
102 PCUT_ASSERT_NOT_NULL(rbutton);
103
104 ui_rbutton_destroy(rbutton);
105 ui_rbutton_group_destroy(group);
106}
107
108/** ui_rbutton_destroy() can take NULL argument (no-op) */
109PCUT_TEST(destroy_null)
110{
111 ui_rbutton_destroy(NULL);
112}
113
114/** ui_rbutton_ctl() returns control that has a working virtual destructor */
115PCUT_TEST(ctl)
116{
117 ui_rbutton_group_t *group = NULL;
118 ui_rbutton_t *rbutton;
119 ui_control_t *control;
120 errno_t rc;
121
122 rc = ui_rbutton_group_create(NULL, &group);
123 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
124
125 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
126 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
127
128 control = ui_rbutton_ctl(rbutton);
129 PCUT_ASSERT_NOT_NULL(control);
130
131 ui_control_destroy(control);
132 ui_rbutton_group_destroy(group);
133}
134
135/** Set radio button rectangle sets internal field */
136PCUT_TEST(set_rect)
137{
138 ui_rbutton_group_t *group = NULL;
139 ui_rbutton_t *rbutton;
140 gfx_rect_t rect;
141 errno_t rc;
142
143 rc = ui_rbutton_group_create(NULL, &group);
144 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
145
146 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
147 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
148
149 rect.p0.x = 1;
150 rect.p0.y = 2;
151 rect.p1.x = 3;
152 rect.p1.y = 4;
153
154 ui_rbutton_set_rect(rbutton, &rect);
155 PCUT_ASSERT_INT_EQUALS(rect.p0.x, rbutton->rect.p0.x);
156 PCUT_ASSERT_INT_EQUALS(rect.p0.y, rbutton->rect.p0.y);
157 PCUT_ASSERT_INT_EQUALS(rect.p1.x, rbutton->rect.p1.x);
158 PCUT_ASSERT_INT_EQUALS(rect.p1.y, rbutton->rect.p1.y);
159
160 ui_rbutton_destroy(rbutton);
161 ui_rbutton_group_destroy(group);
162}
163
164/** Paint radio button */
165PCUT_TEST(paint)
166{
167 errno_t rc;
168 gfx_context_t *gc = NULL;
169 test_gc_t tgc;
170 ui_rbutton_group_t *group = NULL;
171 ui_resource_t *resource = NULL;
172 ui_rbutton_t *rbutton;
173
174 memset(&tgc, 0, sizeof(tgc));
175 rc = gfx_context_new(&ops, &tgc, &gc);
176 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
177
178 rc = ui_resource_create(gc, false, &resource);
179 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
180 PCUT_ASSERT_NOT_NULL(resource);
181
182 rc = ui_rbutton_group_create(resource, &group);
183 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
184
185 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
186 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
187
188 rc = ui_rbutton_paint(rbutton);
189 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
190
191 ui_rbutton_destroy(rbutton);
192 ui_rbutton_group_destroy(group);
193 ui_resource_destroy(resource);
194
195 rc = gfx_context_delete(gc);
196 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
197}
198
199/** Test ui_rbutton_selected() */
200PCUT_TEST(selected)
201{
202 errno_t rc;
203 ui_rbutton_group_t *group = NULL;
204 ui_rbutton_t *rbutton;
205 test_cb_resp_t resp;
206
207 rc = ui_rbutton_group_create(NULL, &group);
208 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
209
210 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
211 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
212
213 /* Selected with no callbacks set */
214 ui_rbutton_selected(rbutton);
215
216 /* Selected with callback not implementing selected */
217 ui_rbutton_group_set_cb(group, &dummy_rbutton_group_cb, NULL);
218 ui_rbutton_selected(rbutton);
219
220 /* Selected with real callback set */
221 resp.selected = false;
222 ui_rbutton_group_set_cb(group, &test_rbutton_group_cb, &resp);
223 ui_rbutton_selected(rbutton);
224 PCUT_ASSERT_TRUE(resp.selected);
225
226 ui_rbutton_destroy(rbutton);
227 ui_rbutton_group_destroy(group);
228}
229
230/** Press and release radio button */
231PCUT_TEST(press_release)
232{
233 errno_t rc;
234 gfx_context_t *gc = NULL;
235 test_gc_t tgc;
236 ui_resource_t *resource = NULL;
237 ui_rbutton_group_t *group = NULL;
238 ui_rbutton_t *rbutton1;
239 ui_rbutton_t *rbutton2;
240 test_cb_resp_t resp;
241
242 memset(&tgc, 0, sizeof(tgc));
243 rc = gfx_context_new(&ops, &tgc, &gc);
244 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
245
246 rc = ui_resource_create(gc, false, &resource);
247 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
248 PCUT_ASSERT_NOT_NULL(resource);
249
250 rc = ui_rbutton_group_create(resource, &group);
251 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
252 PCUT_ASSERT_NULL(group->selected);
253
254 rc = ui_rbutton_create(group, "One", NULL, &rbutton1);
255 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
256 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
257
258 rc = ui_rbutton_create(group, "Two", NULL, &rbutton2);
259 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
260 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
261
262 resp.selected = false;
263 ui_rbutton_group_set_cb(group, &test_rbutton_group_cb, &resp);
264
265 PCUT_ASSERT_FALSE(rbutton2->held);
266 PCUT_ASSERT_FALSE(rbutton2->inside);
267
268 ui_rbutton_press(rbutton2);
269 PCUT_ASSERT_TRUE(rbutton2->held);
270 PCUT_ASSERT_TRUE(rbutton2->inside);
271 PCUT_ASSERT_FALSE(resp.selected);
272 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
273
274 ui_rbutton_release(rbutton2);
275 PCUT_ASSERT_FALSE(rbutton2->held);
276 PCUT_ASSERT_TRUE(rbutton2->inside);
277 PCUT_ASSERT_TRUE(resp.selected);
278 PCUT_ASSERT_EQUALS(group->selected, rbutton2);
279
280 ui_rbutton_destroy(rbutton1);
281 ui_rbutton_destroy(rbutton2);
282 ui_rbutton_group_destroy(group);
283 ui_resource_destroy(resource);
284
285 rc = gfx_context_delete(gc);
286 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
287}
288
289/** Press, leave and release radio button */
290PCUT_TEST(press_leave_release)
291{
292 errno_t rc;
293 gfx_context_t *gc = NULL;
294 test_gc_t tgc;
295 ui_resource_t *resource = NULL;
296 ui_rbutton_group_t *group = NULL;
297 ui_rbutton_t *rbutton1;
298 ui_rbutton_t *rbutton2;
299 test_cb_resp_t resp;
300
301 memset(&tgc, 0, sizeof(tgc));
302 rc = gfx_context_new(&ops, &tgc, &gc);
303 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
304
305 rc = ui_resource_create(gc, false, &resource);
306 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
307 PCUT_ASSERT_NOT_NULL(resource);
308
309 rc = ui_rbutton_group_create(resource, &group);
310 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
311 PCUT_ASSERT_NULL(group->selected);
312
313 rc = ui_rbutton_create(group, "One", NULL, &rbutton1);
314 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
315 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
316
317 rc = ui_rbutton_create(group, "Two", NULL, &rbutton2);
318 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
319 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
320
321 resp.selected = false;
322 ui_rbutton_group_set_cb(group, &test_rbutton_group_cb, &resp);
323
324 PCUT_ASSERT_FALSE(rbutton2->held);
325 PCUT_ASSERT_FALSE(rbutton2->inside);
326
327 ui_rbutton_press(rbutton2);
328 PCUT_ASSERT_TRUE(rbutton2->held);
329 PCUT_ASSERT_TRUE(rbutton2->inside);
330 PCUT_ASSERT_FALSE(resp.selected);
331 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
332
333 ui_rbutton_leave(rbutton2);
334 PCUT_ASSERT_TRUE(rbutton2->held);
335 PCUT_ASSERT_FALSE(rbutton2->inside);
336 PCUT_ASSERT_FALSE(resp.selected);
337 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
338
339 ui_rbutton_release(rbutton2);
340 PCUT_ASSERT_FALSE(rbutton2->held);
341 PCUT_ASSERT_FALSE(rbutton2->inside);
342 PCUT_ASSERT_FALSE(resp.selected);
343 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
344
345 ui_rbutton_destroy(rbutton1);
346 ui_rbutton_destroy(rbutton2);
347 ui_rbutton_group_destroy(group);
348 ui_resource_destroy(resource);
349
350 rc = gfx_context_delete(gc);
351 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
352}
353
354/** Press, leave, enter and release radio button */
355PCUT_TEST(press_leave_enter_release)
356{
357 errno_t rc;
358 gfx_context_t *gc = NULL;
359 test_gc_t tgc;
360 ui_resource_t *resource = NULL;
361 ui_rbutton_group_t *group = NULL;
362 ui_rbutton_t *rbutton1;
363 ui_rbutton_t *rbutton2;
364 test_cb_resp_t resp;
365
366 memset(&tgc, 0, sizeof(tgc));
367 rc = gfx_context_new(&ops, &tgc, &gc);
368 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
369
370 rc = ui_resource_create(gc, false, &resource);
371 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
372 PCUT_ASSERT_NOT_NULL(resource);
373
374 rc = ui_rbutton_group_create(resource, &group);
375 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
376 PCUT_ASSERT_NULL(group->selected);
377
378 rc = ui_rbutton_create(group, "One", NULL, &rbutton1);
379 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
380 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
381
382 rc = ui_rbutton_create(group, "Two", NULL, &rbutton2);
383 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
384 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
385
386 resp.selected = false;
387 ui_rbutton_group_set_cb(group, &test_rbutton_group_cb, &resp);
388
389 PCUT_ASSERT_FALSE(rbutton2->held);
390 PCUT_ASSERT_FALSE(rbutton2->inside);
391
392 ui_rbutton_press(rbutton2);
393 PCUT_ASSERT_TRUE(rbutton2->held);
394 PCUT_ASSERT_TRUE(rbutton2->inside);
395 PCUT_ASSERT_FALSE(resp.selected);
396 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
397
398 ui_rbutton_leave(rbutton2);
399 PCUT_ASSERT_TRUE(rbutton2->held);
400 PCUT_ASSERT_FALSE(rbutton2->inside);
401 PCUT_ASSERT_FALSE(resp.selected);
402 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
403
404 ui_rbutton_enter(rbutton2);
405 PCUT_ASSERT_TRUE(rbutton2->held);
406 PCUT_ASSERT_TRUE(rbutton2->inside);
407 PCUT_ASSERT_FALSE(resp.selected);
408 PCUT_ASSERT_EQUALS(group->selected, rbutton1);
409
410 ui_rbutton_release(rbutton2);
411 PCUT_ASSERT_FALSE(rbutton2->held);
412 PCUT_ASSERT_TRUE(rbutton2->inside);
413 PCUT_ASSERT_TRUE(resp.selected);
414 PCUT_ASSERT_EQUALS(group->selected, rbutton2);
415
416 ui_rbutton_destroy(rbutton1);
417 ui_rbutton_destroy(rbutton2);
418 ui_rbutton_group_destroy(group);
419 ui_resource_destroy(resource);
420
421 rc = gfx_context_delete(gc);
422 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
423}
424
425/** ui_pos_event() correctly translates POS_PRESS/POS_RELEASE */
426PCUT_TEST(pos_event_press_release)
427{
428 errno_t rc;
429 gfx_context_t *gc = NULL;
430 test_gc_t tgc;
431 ui_resource_t *resource = NULL;
432 ui_rbutton_group_t *group = NULL;
433 ui_rbutton_t *rbutton;
434 ui_evclaim_t claim;
435 pos_event_t event;
436 gfx_rect_t rect;
437
438 memset(&tgc, 0, sizeof(tgc));
439 rc = gfx_context_new(&ops, &tgc, &gc);
440 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
441
442 rc = ui_resource_create(gc, false, &resource);
443 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
444 PCUT_ASSERT_NOT_NULL(resource);
445
446 rc = ui_rbutton_group_create(resource, &group);
447 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
448
449 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
450 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
451
452 PCUT_ASSERT_FALSE(rbutton->held);
453
454 rect.p0.x = 10;
455 rect.p0.y = 20;
456 rect.p1.x = 30;
457 rect.p1.y = 40;
458 ui_rbutton_set_rect(rbutton, &rect);
459
460 /* Press outside is not claimed and does nothing */
461 event.type = POS_PRESS;
462 event.hpos = 9;
463 event.vpos = 20;
464 claim = ui_rbutton_pos_event(rbutton, &event);
465 PCUT_ASSERT_FALSE(rbutton->held);
466 PCUT_ASSERT_EQUALS(ui_unclaimed, claim);
467
468 /* Press inside is claimed and depresses radio button */
469 event.type = POS_PRESS;
470 event.hpos = 10;
471 event.vpos = 20;
472 claim = ui_rbutton_pos_event(rbutton, &event);
473 PCUT_ASSERT_TRUE(rbutton->held);
474 PCUT_ASSERT_EQUALS(ui_claimed, claim);
475
476 /* Release outside (or anywhere) is claimed and relases radio button */
477 event.type = POS_RELEASE;
478 event.hpos = 9;
479 event.vpos = 20;
480 claim = ui_rbutton_pos_event(rbutton, &event);
481 PCUT_ASSERT_FALSE(rbutton->held);
482 PCUT_ASSERT_EQUALS(ui_claimed, claim);
483
484 ui_rbutton_destroy(rbutton);
485 ui_rbutton_group_destroy(group);
486 ui_resource_destroy(resource);
487
488 rc = gfx_context_delete(gc);
489 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
490}
491
492/** ui_pos_event() correctly translates POS_UPDATE to enter/leave */
493PCUT_TEST(pos_event_enter_leave)
494{
495 errno_t rc;
496 gfx_context_t *gc = NULL;
497 test_gc_t tgc;
498 ui_resource_t *resource = NULL;
499 ui_rbutton_group_t *group = NULL;
500 ui_rbutton_t *rbutton;
501 pos_event_t event;
502 gfx_rect_t rect;
503
504 memset(&tgc, 0, sizeof(tgc));
505 rc = gfx_context_new(&ops, &tgc, &gc);
506 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
507
508 rc = ui_resource_create(gc, false, &resource);
509 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
510 PCUT_ASSERT_NOT_NULL(resource);
511
512 rc = ui_rbutton_group_create(resource, &group);
513 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
514
515 rc = ui_rbutton_create(group, "Hello", NULL, &rbutton);
516 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
517
518 PCUT_ASSERT_FALSE(rbutton->inside);
519
520 rect.p0.x = 10;
521 rect.p0.y = 20;
522 rect.p1.x = 30;
523 rect.p1.y = 40;
524 ui_rbutton_set_rect(rbutton, &rect);
525
526 /* Moving outside does nothing */
527 event.type = POS_UPDATE;
528 event.hpos = 9;
529 event.vpos = 20;
530 ui_rbutton_pos_event(rbutton, &event);
531 PCUT_ASSERT_FALSE(rbutton->inside);
532
533 /* Moving inside sets inside flag */
534 event.type = POS_UPDATE;
535 event.hpos = 10;
536 event.vpos = 20;
537 ui_rbutton_pos_event(rbutton, &event);
538 PCUT_ASSERT_TRUE(rbutton->inside);
539
540 /* Moving outside clears inside flag */
541 event.type = POS_UPDATE;
542 event.hpos = 9;
543 event.vpos = 20;
544 ui_rbutton_pos_event(rbutton, &event);
545 PCUT_ASSERT_FALSE(rbutton->inside);
546
547 ui_rbutton_destroy(rbutton);
548 ui_rbutton_group_destroy(group);
549 ui_resource_destroy(resource);
550
551 rc = gfx_context_delete(gc);
552 PCUT_ASSERT_ERRNO_VAL(EOK, rc);
553}
554
555static errno_t testgc_set_color(void *arg, gfx_color_t *color)
556{
557 (void) arg;
558 (void) color;
559 return EOK;
560}
561
562static errno_t testgc_fill_rect(void *arg, gfx_rect_t *rect)
563{
564 (void) arg;
565 (void) rect;
566 return EOK;
567}
568
569static errno_t testgc_bitmap_create(void *arg, gfx_bitmap_params_t *params,
570 gfx_bitmap_alloc_t *alloc, void **rbm)
571{
572 test_gc_t *tgc = (test_gc_t *) arg;
573 testgc_bitmap_t *tbm;
574
575 tbm = calloc(1, sizeof(testgc_bitmap_t));
576 if (tbm == NULL)
577 return ENOMEM;
578
579 if (alloc == NULL) {
580 tbm->alloc.pitch = (params->rect.p1.x - params->rect.p0.x) *
581 sizeof(uint32_t);
582 tbm->alloc.off0 = 0;
583 tbm->alloc.pixels = calloc(sizeof(uint32_t),
584 (params->rect.p1.x - params->rect.p0.x) *
585 (params->rect.p1.y - params->rect.p0.y));
586 tbm->myalloc = true;
587 if (tbm->alloc.pixels == NULL) {
588 free(tbm);
589 return ENOMEM;
590 }
591 } else {
592 tbm->alloc = *alloc;
593 }
594
595 tbm->tgc = tgc;
596 tgc->bm_created = true;
597 tgc->bm_params = *params;
598 tgc->bm_pixels = tbm->alloc.pixels;
599 *rbm = (void *)tbm;
600 return EOK;
601}
602
603static errno_t testgc_bitmap_destroy(void *bm)
604{
605 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
606 if (tbm->myalloc)
607 free(tbm->alloc.pixels);
608 tbm->tgc->bm_destroyed = true;
609 free(tbm);
610 return EOK;
611}
612
613static errno_t testgc_bitmap_render(void *bm, gfx_rect_t *srect,
614 gfx_coord2_t *offs)
615{
616 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
617 tbm->tgc->bm_rendered = true;
618 tbm->tgc->bm_srect = *srect;
619 tbm->tgc->bm_offs = *offs;
620 return EOK;
621}
622
623static errno_t testgc_bitmap_get_alloc(void *bm, gfx_bitmap_alloc_t *alloc)
624{
625 testgc_bitmap_t *tbm = (testgc_bitmap_t *)bm;
626 *alloc = tbm->alloc;
627 tbm->tgc->bm_got_alloc = true;
628 return EOK;
629}
630
631static void test_rbutton_select(ui_rbutton_group_t *group, void *arg,
632 void *barg)
633{
634 test_cb_resp_t *resp = (test_cb_resp_t *) arg;
635
636 resp->selected = true;
637}
638
639PCUT_EXPORT(rbutton);
Note: See TracBrowser for help on using the repository browser.