/*
* cssrendering_box.c
*
- * Copyright (c) 2013 project bchan
+ * Copyright (c) 2013-2014 project bchan
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
break;
}
if (dir == TREEBASE_TRAVERSAL_DIRECTION_DOWN) {
- if ((box->base.type == CSSRENDEREING_BOX_TYPE_BLOCK)||(box->base.type == CSSRENDEREING_BOX_TYPE_ANONYMOUS)) {
+ if (box->base.type == CSSRENDEREING_BOX_TYPE_ANONYMOUS) {
+ traversal->origin.x += box->base.content_edge.c.left;
+ traversal->origin.y += box->base.content_edge.c.top;
+ } else if (box->base.type == CSSRENDEREING_BOX_TYPE_BLOCK) {
+ r = box->base.content_edge;
+ r.c.left += traversal->origin.x;
+ r.c.top += traversal->origin.y;
+ r.c.right += traversal->origin.x;
+ r.c.bottom += traversal->origin.y;
+
traversal->origin.x += box->base.content_edge.c.left;
traversal->origin.y += box->base.content_edge.c.top;
+
+ ok = cssmetric_rectangle_andrect(r, traversal->draw);
+ if (ok == False) {
+ continue;
+ }
+
+ result->type = CSSRENDERING_DRAWTRAVERSAL_RESULTTYPE_BLOCK;
+ result->data.block.content_edge = r;
+ result->data.block.nodedata = box->base.userdata;
+ break;
} else if (box->base.type == CSSRENDEREING_BOX_TYPE_LINE) {
r = box->base.content_edge;
r.c.left += traversal->origin.x;
return ret;
}
+
LOCAL UNITTEST_RESULT test_cssrendering_drawtraversal_2()
{
cssrendering_blockbox_t root, block[5];
return ret;
}
+LOCAL UNITTEST_RESULT test_cssrendering_drawtraversal_3()
+{
+ cssrendering_blockbox_t root, block[5];
+ cssrendering_drawtraversal_t traversal;
+ cssrendering_drawtraversal_result result;
+ cssmetric_rectangle_t draw;
+ Bool cont, block_called[5] = {False, False, False, False, False};
+ UNITTEST_RESULT ret = UNITTEST_RESULT_PASS;
+
+ cssrendering_blockbox_initialize(&root);
+ cssrendering_blockbox_initialize(block+0);
+ cssrendering_blockbox_initialize(block+1);
+ cssrendering_blockbox_initialize(block+2);
+ cssrendering_blockbox_initialize(block+3);
+ cssrendering_blockbox_initialize(block+4);
+
+ cssrendering_blockbox_appendblockchild(&root, block+0);
+ cssrendering_blockbox_appendblockchild(&root, block+1);
+ cssrendering_blockbox_appendblockchild(&root, block+2);
+ cssrendering_blockbox_appendblockchild(&root, block+3);
+ cssrendering_blockbox_appendblockchild(&root, block+4);
+
+ block[0].base.content_edge = (cssmetric_rectangle_t){{0, 0, 100, 100}};
+ cssrendering_blockbox_setuserdata(block+0, block+0);
+ block[1].base.content_edge = (cssmetric_rectangle_t){{0, 100, 100, 200}};
+ cssrendering_blockbox_setuserdata(block+1, block+1);
+ block[2].base.content_edge = (cssmetric_rectangle_t){{0, 200, 100, 300}};
+ cssrendering_blockbox_setuserdata(block+2, block+2);
+ block[3].base.content_edge = (cssmetric_rectangle_t){{0, 300, 100, 400}};
+ cssrendering_blockbox_setuserdata(block+3, block+3);
+ block[4].base.content_edge = (cssmetric_rectangle_t){{0, 400, 100, 500}};
+ cssrendering_blockbox_setuserdata(block+4, block+4);
+
+ draw = (cssmetric_rectangle_t){{25, 150, 75, 350}};
+ cssrendering_drawtraversal_initialize(&traversal, &root, draw);
+ for (;;) {
+ cont = cssrendering_drawtraversal_next(&traversal, &result);
+ if (cont == False) {
+ break;
+ }
+ if (result.type != CSSRENDERING_DRAWTRAVERSAL_RESULTTYPE_BLOCK) {
+ continue;
+ }
+ if (result.data.block.nodedata == (block+0)) {
+ block_called[0] = True;
+ } else if (result.data.block.nodedata == (block+1)) {
+ block_called[1] = True;
+ } else if (result.data.block.nodedata == (block+2)) {
+ block_called[2] = True;
+ } else if (result.data.block.nodedata == (block+3)) {
+ block_called[3] = True;
+ } else if (result.data.block.nodedata == (block+4)) {
+ block_called[4] = True;
+ }
+ }
+ cssrendering_drawtraversal_finalize(&traversal);
+
+ if ((block_called[0] == False)&&(block_called[1] != False)&&(block_called[2] != False)&&(block_called[3] != False)&&(block_called[4] == False)) {
+ ret = UNITTEST_RESULT_PASS;
+ } else {
+ ret = UNITTEST_RESULT_FAIL;
+ }
+
+ cssrendering_blockbox_finalize(block+4);
+ cssrendering_blockbox_finalize(block+3);
+ cssrendering_blockbox_finalize(block+2);
+ cssrendering_blockbox_finalize(block+1);
+ cssrendering_blockbox_finalize(block+0);
+ cssrendering_blockbox_finalize(&root);
+
+ return ret;
+}
+
LOCAL UNITTEST_RESULT test_cssrendering_hittraversal_1()
{
cssrendering_blockbox_t root;
{
UNITTEST_DRIVER_REGIST(driver, test_cssrendering_drawtraversal_1);
UNITTEST_DRIVER_REGIST(driver, test_cssrendering_drawtraversal_2);
+ UNITTEST_DRIVER_REGIST(driver, test_cssrendering_drawtraversal_3);
UNITTEST_DRIVER_REGIST(driver, test_cssrendering_hittraversal_1);
UNITTEST_DRIVER_REGIST(driver, test_cssrendering_blockbox_appendchild1);
UNITTEST_DRIVER_REGIST(driver, test_cssrendering_blockbox_appendchild2);