OSDN Git Service

add block box handling to rendering traversal.
authorornse01 <ornse01@users.sourceforge.jp>
Sat, 15 Feb 2014 14:12:24 +0000 (14:12 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Sat, 15 Feb 2014 14:12:24 +0000 (14:12 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@599 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/css/cssrendering_box.c
src/css/cssrendering_box.h
src/css/test_cssrendering_box.c

index 39d2d87..1a87f28 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
@@ -160,9 +160,28 @@ EXPORT Bool cssrendering_drawtraversal_next(cssrendering_drawtraversal_t *traver
                        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;
index e0b3888..fcac14e 100644 (file)
@@ -99,6 +99,7 @@ typedef struct cssrendering_drawtraversal_t_ cssrendering_drawtraversal_t;
 struct cssrendering_drawtraversal_result_ {
        enum {
                CSSRENDERING_DRAWTRAVERSAL_RESULTTYPE_TEXT,
+               CSSRENDERING_DRAWTRAVERSAL_RESULTTYPE_BLOCK,
        } type;
        union {
                struct {
@@ -106,6 +107,10 @@ struct cssrendering_drawtraversal_result_ {
                        cssrendering_textfragment_t *fragment;
                        VP nodedata;
                } text;
+               struct {
+                       cssmetric_rectangle_t content_edge;
+                       VP nodedata;
+               } block;
        } data;
 };
 typedef struct cssrendering_drawtraversal_result_ cssrendering_drawtraversal_result;
index 8a1024a..20cd5d9 100644 (file)
@@ -114,6 +114,7 @@ LOCAL UNITTEST_RESULT test_cssrendering_drawtraversal_1()
 
        return ret;
 }
+
 LOCAL UNITTEST_RESULT test_cssrendering_drawtraversal_2()
 {
        cssrendering_blockbox_t root, block[5];
@@ -224,6 +225,79 @@ LOCAL UNITTEST_RESULT test_cssrendering_drawtraversal_2()
        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;
@@ -399,6 +473,7 @@ EXPORT VOID test_cssrendering_box_main(unittest_driver_t *driver)
 {
        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);