HelenOS sources
This source file includes following definitions.
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- PCUT_TEST
- test_invalidate_rect
- test_update
- test_cursor_get_pos
- test_cursor_set_pos
- test_cursor_set_visible
#include <errno.h>
#include <gfx/bitmap.h>
#include <gfx/color.h>
#include <gfx/coord.h>
#include <gfx/context.h>
#include <gfx/cursor.h>
#include <gfx/render.h>
#include <io/pixelmap.h>
#include <mem.h>
#include <memgfx/memgc.h>
#include <pcut/pcut.h>
PCUT_INIT;
PCUT_TEST_SUITE(memgfx);
static void test_invalidate_rect(void *arg, gfx_rect_t *rect);
static void test_update(void *arg);
static errno_t test_cursor_get_pos(void *arg, gfx_coord2_t *);
static errno_t test_cursor_set_pos(void *arg, gfx_coord2_t *);
static errno_t test_cursor_set_visible(void *arg, bool);
static mem_gc_cb_t test_mem_gc_cb = {
.invalidate = test_invalidate_rect,
.update = test_update,
.cursor_get_pos = test_cursor_get_pos,
.cursor_set_pos = test_cursor_set_pos,
.cursor_set_visible = test_cursor_set_visible
};
typedef struct {
errno_t rc;
bool invalidate_called;
gfx_rect_t inv_rect;
bool update_called;
bool cursor_get_pos_called;
gfx_coord2_t get_pos_pos;
bool cursor_set_pos_called;
gfx_coord2_t set_pos_pos;
bool cursor_set_visible_called;
bool set_visible_vis;
} test_resp_t;
PCUT_TEST(create_delete)
{
mem_gc_t *mgc;
gfx_rect_t rect;
gfx_bitmap_alloc_t alloc;
errno_t rc;
rect.p0.x = 0;
rect.p0.y = 0;
rect.p1.x = 10;
rect.p1.y = 10;
alloc.pitch = (rect.p1.x - rect.p0.x) * sizeof(uint32_t);
alloc.off0 = 0;
alloc.pixels = calloc(1, alloc.pitch * (rect.p1.y - rect.p0.y));
PCUT_ASSERT_NOT_NULL(alloc.pixels);
rc = mem_gc_create(&rect, &alloc, NULL, NULL, &mgc);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
mem_gc_delete(mgc);
free(alloc.pixels);
}
PCUT_TEST(fill_rect)
{
mem_gc_t *mgc;
gfx_rect_t rect;
gfx_rect_t frect;
gfx_bitmap_alloc_t alloc;
gfx_context_t *gc;
gfx_color_t *color;
gfx_coord2_t pos;
pixelmap_t pixelmap;
pixel_t pixel;
pixel_t expected;
test_resp_t resp;
errno_t rc;
rect.p0.x = 0;
rect.p0.y = 0;
rect.p1.x = 10;
rect.p1.y = 10;
alloc.pitch = (rect.p1.x - rect.p0.x) * sizeof(uint32_t);
alloc.off0 = 0;
alloc.pixels = calloc(1, alloc.pitch * (rect.p1.y - rect.p0.y));
PCUT_ASSERT_NOT_NULL(alloc.pixels);
rc = mem_gc_create(&rect, &alloc, &test_mem_gc_cb, &resp, &mgc);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
gc = mem_gc_get_ctx(mgc);
PCUT_ASSERT_NOT_NULL(gc);
rc = gfx_color_new_rgb_i16(0xffff, 0xffff, 0, &color);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = gfx_set_color(gc, color);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
frect.p0.x = 2;
frect.p0.y = 2;
frect.p1.x = 5;
frect.p1.y = 5;
memset(&resp, 0, sizeof(resp));
rc = gfx_fill_rect(gc, &frect);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
pixelmap.width = rect.p1.x - rect.p0.x;
pixelmap.height = rect.p1.y - rect.p0.y;
pixelmap.data = alloc.pixels;
for (pos.y = rect.p0.y; pos.y < rect.p1.y; pos.y++) {
for (pos.x = rect.p0.x; pos.x < rect.p1.x; pos.x++) {
pixel = pixelmap_get_pixel(&pixelmap, pos.x, pos.y);
expected = gfx_pix_inside_rect(&pos, &frect) ?
PIXEL(0, 255, 255, 0) : PIXEL(0, 0, 0, 0);
PCUT_ASSERT_INT_EQUALS(expected, pixel);
}
}
PCUT_ASSERT_TRUE(resp.invalidate_called);
PCUT_ASSERT_INT_EQUALS(frect.p0.x, resp.inv_rect.p0.x);
PCUT_ASSERT_INT_EQUALS(frect.p0.y, resp.inv_rect.p0.y);
PCUT_ASSERT_INT_EQUALS(frect.p1.x, resp.inv_rect.p1.x);
PCUT_ASSERT_INT_EQUALS(frect.p1.y, resp.inv_rect.p1.y);
mem_gc_delete(mgc);
free(alloc.pixels);
}
PCUT_TEST(bitmap_render)
{
mem_gc_t *mgc;
gfx_rect_t rect;
gfx_bitmap_alloc_t alloc;
gfx_context_t *gc;
gfx_coord2_t pos;
gfx_bitmap_params_t params;
gfx_bitmap_alloc_t balloc;
gfx_bitmap_t *bitmap;
pixelmap_t bpmap;
pixelmap_t dpmap;
pixel_t pixel;
pixel_t expected;
test_resp_t resp;
errno_t rc;
rect.p0.x = 0;
rect.p0.y = 0;
rect.p1.x = 10;
rect.p1.y = 10;
alloc.pitch = (rect.p1.x - rect.p0.x) * sizeof(uint32_t);
alloc.off0 = 0;
alloc.pixels = calloc(1, alloc.pitch * (rect.p1.y - rect.p0.y));
PCUT_ASSERT_NOT_NULL(alloc.pixels);
rc = mem_gc_create(&rect, &alloc, &test_mem_gc_cb, &resp, &mgc);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
gc = mem_gc_get_ctx(mgc);
PCUT_ASSERT_NOT_NULL(gc);
gfx_bitmap_params_init(¶ms);
params.rect.p0.x = 0;
params.rect.p0.y = 0;
params.rect.p1.x = 6;
params.rect.p1.y = 6;
rc = gfx_bitmap_create(gc, ¶ms, NULL, &bitmap);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
rc = gfx_bitmap_get_alloc(bitmap, &balloc);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
bpmap.width = params.rect.p1.x - params.rect.p0.x;
bpmap.height = params.rect.p1.y - params.rect.p0.y;
bpmap.data = balloc.pixels;
for (pos.y = params.rect.p0.y; pos.y < params.rect.p1.y; pos.y++) {
for (pos.x = params.rect.p0.x; pos.x < params.rect.p1.x; pos.x++) {
pixelmap_put_pixel(&bpmap, pos.x, pos.y,
PIXEL(0, 255, 255, 0));
}
}
dpmap.width = rect.p1.x - rect.p0.x;
dpmap.height = rect.p1.y - rect.p0.y;
dpmap.data = alloc.pixels;
memset(&resp, 0, sizeof(resp));
rc = gfx_bitmap_render(bitmap, NULL, NULL);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
for (pos.y = rect.p0.y; pos.y < rect.p1.y; pos.y++) {
for (pos.x = rect.p0.x; pos.x < rect.p1.x; pos.x++) {
pixel = pixelmap_get_pixel(&dpmap, pos.x, pos.y);
expected = gfx_pix_inside_rect(&pos, ¶ms.rect) ?
PIXEL(0, 255, 255, 0) : PIXEL(0, 0, 0, 0);
PCUT_ASSERT_INT_EQUALS(expected, pixel);
}
}
PCUT_ASSERT_TRUE(resp.invalidate_called);
PCUT_ASSERT_INT_EQUALS(params.rect.p0.x, resp.inv_rect.p0.x);
PCUT_ASSERT_INT_EQUALS(params.rect.p0.y, resp.inv_rect.p0.y);
PCUT_ASSERT_INT_EQUALS(params.rect.p1.x, resp.inv_rect.p1.x);
PCUT_ASSERT_INT_EQUALS(params.rect.p1.y, resp.inv_rect.p1.y);
mem_gc_delete(mgc);
free(alloc.pixels);
}
PCUT_TEST(gfx_update)
{
mem_gc_t *mgc;
gfx_rect_t rect;
gfx_bitmap_alloc_t alloc;
gfx_context_t *gc;
test_resp_t resp;
errno_t rc;
rect.p0.x = 0;
rect.p0.y = 0;
rect.p1.x = 10;
rect.p1.y = 10;
alloc.pitch = (rect.p1.x - rect.p0.x) * sizeof(uint32_t);
alloc.off0 = 0;
alloc.pixels = calloc(1, alloc.pitch * (rect.p1.y - rect.p0.y));
PCUT_ASSERT_NOT_NULL(alloc.pixels);
rc = mem_gc_create(&rect, &alloc, &test_mem_gc_cb, &resp, &mgc);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
gc = mem_gc_get_ctx(mgc);
PCUT_ASSERT_NOT_NULL(gc);
memset(&resp, 0, sizeof(resp));
PCUT_ASSERT_FALSE(resp.update_called);
gfx_update(gc);
PCUT_ASSERT_TRUE(resp.update_called);
mem_gc_delete(mgc);
free(alloc.pixels);
}
PCUT_TEST(gfx_cursor_get_pos)
{
mem_gc_t *mgc;
gfx_rect_t rect;
gfx_bitmap_alloc_t alloc;
gfx_coord2_t pos;
gfx_context_t *gc;
test_resp_t resp;
errno_t rc;
rect.p0.x = 0;
rect.p0.y = 0;
rect.p1.x = 10;
rect.p1.y = 10;
alloc.pitch = (rect.p1.x - rect.p0.x) * sizeof(uint32_t);
alloc.off0 = 0;
alloc.pixels = calloc(1, alloc.pitch * (rect.p1.y - rect.p0.y));
PCUT_ASSERT_NOT_NULL(alloc.pixels);
rc = mem_gc_create(&rect, &alloc, &test_mem_gc_cb, &resp, &mgc);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
gc = mem_gc_get_ctx(mgc);
PCUT_ASSERT_NOT_NULL(gc);
memset(&resp, 0, sizeof(resp));
resp.rc = EOK;
resp.get_pos_pos.x = 1;
resp.get_pos_pos.y = 2;
PCUT_ASSERT_FALSE(resp.cursor_get_pos_called);
rc = gfx_cursor_get_pos(gc, &pos);
PCUT_ASSERT_TRUE(resp.cursor_get_pos_called);
PCUT_ASSERT_INT_EQUALS(resp.get_pos_pos.x, pos.x);
PCUT_ASSERT_INT_EQUALS(resp.get_pos_pos.y, pos.y);
mem_gc_delete(mgc);
free(alloc.pixels);
}
PCUT_TEST(gfx_cursor_set_pos)
{
mem_gc_t *mgc;
gfx_rect_t rect;
gfx_bitmap_alloc_t alloc;
gfx_coord2_t pos;
gfx_context_t *gc;
test_resp_t resp;
errno_t rc;
rect.p0.x = 0;
rect.p0.y = 0;
rect.p1.x = 10;
rect.p1.y = 10;
alloc.pitch = (rect.p1.x - rect.p0.x) * sizeof(uint32_t);
alloc.off0 = 0;
alloc.pixels = calloc(1, alloc.pitch * (rect.p1.y - rect.p0.y));
PCUT_ASSERT_NOT_NULL(alloc.pixels);
rc = mem_gc_create(&rect, &alloc, &test_mem_gc_cb, &resp, &mgc);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
gc = mem_gc_get_ctx(mgc);
PCUT_ASSERT_NOT_NULL(gc);
memset(&resp, 0, sizeof(resp));
resp.rc = EOK;
pos.x = 1;
pos.y = 2;
PCUT_ASSERT_FALSE(resp.cursor_set_pos_called);
rc = gfx_cursor_set_pos(gc, &pos);
PCUT_ASSERT_TRUE(resp.cursor_set_pos_called);
PCUT_ASSERT_INT_EQUALS(pos.x, resp.set_pos_pos.x);
PCUT_ASSERT_INT_EQUALS(pos.y, resp.set_pos_pos.y);
mem_gc_delete(mgc);
free(alloc.pixels);
}
PCUT_TEST(gfx_cursor_set_visible)
{
mem_gc_t *mgc;
gfx_rect_t rect;
gfx_bitmap_alloc_t alloc;
gfx_context_t *gc;
test_resp_t resp;
errno_t rc;
rect.p0.x = 0;
rect.p0.y = 0;
rect.p1.x = 10;
rect.p1.y = 10;
alloc.pitch = (rect.p1.x - rect.p0.x) * sizeof(uint32_t);
alloc.off0 = 0;
alloc.pixels = calloc(1, alloc.pitch * (rect.p1.y - rect.p0.y));
PCUT_ASSERT_NOT_NULL(alloc.pixels);
rc = mem_gc_create(&rect, &alloc, &test_mem_gc_cb, &resp, &mgc);
PCUT_ASSERT_ERRNO_VAL(EOK, rc);
gc = mem_gc_get_ctx(mgc);
PCUT_ASSERT_NOT_NULL(gc);
memset(&resp, 0, sizeof(resp));
resp.rc = EOK;
PCUT_ASSERT_FALSE(resp.cursor_set_visible_called);
rc = gfx_cursor_set_visible(gc, true);
PCUT_ASSERT_TRUE(resp.cursor_set_visible_called);
PCUT_ASSERT_TRUE(resp.set_visible_vis);
resp.cursor_set_visible_called = false;
rc = gfx_cursor_set_visible(gc, false);
PCUT_ASSERT_TRUE(resp.cursor_set_visible_called);
PCUT_ASSERT_FALSE(resp.set_visible_vis);
mem_gc_delete(mgc);
free(alloc.pixels);
}
static void test_invalidate_rect(void *arg, gfx_rect_t *rect)
{
test_resp_t *resp = (test_resp_t *)arg;
resp->invalidate_called = true;
resp->inv_rect = *rect;
}
static void test_update(void *arg)
{
test_resp_t *resp = (test_resp_t *)arg;
resp->update_called = true;
}
static errno_t test_cursor_get_pos(void *arg, gfx_coord2_t *pos)
{
test_resp_t *resp = (test_resp_t *)arg;
resp->cursor_get_pos_called = true;
*pos = resp->get_pos_pos;
return resp->rc;
}
static errno_t test_cursor_set_pos(void *arg, gfx_coord2_t *pos)
{
test_resp_t *resp = (test_resp_t *)arg;
resp->cursor_set_pos_called = true;
resp->set_pos_pos = *pos;
return resp->rc;
}
static errno_t test_cursor_set_visible(void *arg, bool visible)
{
test_resp_t *resp = (test_resp_t *)arg;
resp->cursor_set_visible_called = true;
resp->set_visible_vis = visible;
return resp->rc;
}
PCUT_EXPORT(memgfx);
HelenOS homepage, sources at GitHub