OSDN Git Service

add rayout information structure for css box model.
authorornse01 <ornse01@users.sourceforge.jp>
Mon, 29 Apr 2013 15:41:47 +0000 (15:41 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Mon, 29 Apr 2013 15:41:47 +0000 (15:41 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@545 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/css/cssmetric.h [new file with mode: 0644]
src/css/cssrendering_box.c [new file with mode: 0644]
src/css/cssrendering_box.h [new file with mode: 0644]

diff --git a/src/css/cssmetric.h b/src/css/cssmetric.h
new file mode 100644 (file)
index 0000000..bb5c4f2
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * cssmetric.h
+ *
+ * Copyright (c) 2013 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
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ *    distribution.
+ *
+ */
+
+#include <basic.h>
+
+/* Vendor name: */
+/* Functionality name: cssmetric */
+/* Detail name: */
+
+#ifndef __CSSMETRIC_H__
+#define __CSSMETRIC_H__
+
+struct cssmetric_point_t_ {
+       W x;
+       W y;
+};
+typedef struct cssmetric_point_t_ cssmetric_point_t;
+
+union cssmetric_rectangle_t_ {
+       struct {
+               W       left;
+               W       top;
+               W       right;
+               W       bottom;
+       } c;
+       struct {
+               cssmetric_point_t       lefttop;
+               cssmetric_point_t       rightbot;
+       } p;
+};
+typedef union cssmetric_rectangle_t_ cssmetric_rectangle_t;
+
+#endif
diff --git a/src/css/cssrendering_box.c b/src/css/cssrendering_box.c
new file mode 100644 (file)
index 0000000..36507db
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * cssrendering_box.c
+ *
+ * Copyright (c) 2013 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
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ *    distribution.
+ *
+ */
+
+#include       "cssrendering_box.h"
+
+#include       <bstdio.h>
+#include       <bsys/queue.h>
+
+#include       "cssmetric.h"
+#include       "treebase.h"
+
+#ifdef BCHAN_CONFIG_DEBUG
+# define DP(arg) printf arg
+# define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
+#else
+# define DP(arg) /**/
+# define DP_ER(msg, err) /**/
+#endif
+
+LOCAL VOID cssrendering_basebox_appendchild(cssrendering_basebox_t *box, cssrendering_basebox_t *child)
+{
+       treebase_node_appendchild(&box->base, &child->base);
+       box->content_edge.c.left = 0;
+       box->content_edge.c.top = 0;
+       box->content_edge.c.right = 0;
+       box->content_edge.c.bottom = 0;
+}
+
+LOCAL VOID cssrendering_basebox_initialize(cssrendering_basebox_t *box, CSSRENDERING_BOX_TYPE type)
+{
+       treebase_node_initialize(&box->base);
+       box->type = type;
+}
+
+LOCAL VOID cssrendering_basebox_finalize(cssrendering_basebox_t *box)
+{
+       treebase_node_finalize(&box->base);
+}
+
+EXPORT VOID cssrendering_linebox_initialize(cssrendering_linebox_t *box)
+{
+       cssrendering_basebox_initialize(&box->base, CSSRENDEREING_BOX_TYPE_LINE);
+}
+
+EXPORT VOID cssrendering_linebox_finalize(cssrendering_linebox_t *box)
+{
+       cssrendering_basebox_finalize(&box->base);
+}
+
+/* cssrendering_anonymousbox */
+
+EXPORT VOID cssrendering_anonymousbox_appendchild(cssrendering_anonymousbox_t *box, cssrendering_linebox_t *child)
+{
+       cssrendering_basebox_appendchild(&box->base, &child->base);
+}
+
+EXPORT VOID cssrendering_anonymousbox_initialize(cssrendering_anonymousbox_t *box)
+{
+       cssrendering_basebox_initialize(&box->base, CSSRENDEREING_BOX_TYPE_ANONYMOUS);
+}
+
+EXPORT VOID cssrendering_anonymousbox_finalize(cssrendering_anonymousbox_t *box)
+{
+       cssrendering_basebox_finalize(&box->base);
+}
+
+/* cssrendering_blockbox */
+
+EXPORT VOID cssrendering_blockbox_appendanonymouschild(cssrendering_blockbox_t *box, cssrendering_anonymousbox_t *child)
+{
+       cssrendering_basebox_appendchild(&box->base, &child->base);
+}
+
+EXPORT VOID cssrendering_blockbox_appendblockchild(cssrendering_blockbox_t *box, cssrendering_blockbox_t *child)
+{
+       cssrendering_basebox_appendchild(&box->base, &child->base);
+}
+
+EXPORT VOID cssrendering_blockbox_initialize(cssrendering_blockbox_t *box)
+{
+       cssrendering_basebox_initialize(&box->base, CSSRENDEREING_BOX_TYPE_BLOCK);
+}
+
+EXPORT VOID cssrendering_blockbox_finalize(cssrendering_blockbox_t *box)
+{
+       cssrendering_basebox_finalize(&box->base);
+}
+
+/* cssrendering_drawtraversal */
+
+EXPORT Bool cssrendering_drawtraversal_next(cssrendering_drawtraversal_t *traversal, cssrendering_drawtraversal_result *result)
+{
+       Bool cont;
+       TREEBASE_TRAVERSAL_DIRECTION dir;
+       union {
+               cssrendering_basebox_t base;
+               cssrendering_linebox_t l;
+               cssrendering_anonymousbox_t a;
+               cssrendering_blockbox_t b;
+       } *box;
+
+       for (;;) {
+               cont = treebase_preordertraversal_next(&traversal->base, (treebase_node_t**)&box, &dir);
+               if (cont != False) {
+                       if (dir == TREEBASE_TRAVERSAL_DIRECTION_DOWN) {
+                               if ((box->base.type == CSSRENDEREING_BOX_TYPE_BLOCK)||(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_LINE) {
+                                       result->type = CSSRENDERING_DRAWTRAVERSAL_RESULTTYPE_TEXT;
+                                       result->data.text.fragment = &(box->l.text);
+                                       result->data.text.blstart.x = traversal->origin.x + box->base.content_edge.c.left;
+                                       result->data.text.blstart.y = traversal->origin.y + box->base.content_edge.c.top + box->l.baseline;
+                                       break;
+                               }
+                       } else {
+                               if ((box->base.type == CSSRENDEREING_BOX_TYPE_BLOCK)||(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 {
+                               }
+                       }
+               } else {
+                       break;
+               }
+       }
+
+       return cont;
+}
+
+EXPORT VOID cssrendering_drawtraversal_initialize(cssrendering_drawtraversal_t *traversal, cssrendering_blockbox_t *root)
+{
+       treebase_preordertraversal_initialize(&traversal->base, &root->base.base);
+       traversal->origin.x = 0;
+       traversal->origin.y = 0;
+}
+
+EXPORT VOID cssrendering_drawtraversal_finalize(cssrendering_drawtraversal_t *traversal)
+{
+       treebase_preordertraversal_finalize(&traversal->base);
+}
diff --git a/src/css/cssrendering_box.h b/src/css/cssrendering_box.h
new file mode 100644 (file)
index 0000000..c9e917a
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * cssrendering_box.h
+ *
+ * Copyright (c) 2013 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
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ *    distribution.
+ *
+ */
+
+#include    <basic.h>
+
+#include       "cssmetric.h"
+#include       <coll/treebase.h>
+
+#ifndef __CSSRENDERING_BOX_H__
+#define __CSSRENDERING_BOX_H__
+
+/* Functionality name: cssrendering */
+/* Detail name: textfragment */
+struct cssrendering_textfragment_t_ {
+       TC *str;
+       W len;
+};
+typedef struct cssrendering_textfragment_t_ cssrendering_textfragment_t;
+
+/* Functionality name: cssrendering */
+/* Detail name: box */
+/* Data structure identifier: type */
+enum CSSRENDERING_BOX_TYPE_ {
+       CSSRENDEREING_BOX_TYPE_BLOCK,
+       CSSRENDEREING_BOX_TYPE_LINE,
+       CSSRENDEREING_BOX_TYPE_ANONYMOUS,
+}; 
+typedef enum CSSRENDERING_BOX_TYPE_ CSSRENDERING_BOX_TYPE;
+
+/* Functionality name: cssrendering */
+/* Detail name: basebox */
+struct cssrendering_basebox_t_ {
+       treebase_node_t base;
+       CSSRENDERING_BOX_TYPE type;
+       cssmetric_rectangle_t content_edge;
+};
+typedef struct cssrendering_basebox_t_ cssrendering_basebox_t;
+
+/* Functionality name: cssrendering */
+/* Detail name: linebox */
+struct cssrendering_linebox_t_ {
+       cssrendering_basebox_t base;
+       cssrendering_textfragment_t text;
+       W baseline;
+};
+typedef struct cssrendering_linebox_t_ cssrendering_linebox_t;
+
+/* Functionality name: cssrendering */
+/* Detail name: anonymousbox */
+struct cssrendering_anonymousbox_t_ {
+       cssrendering_basebox_t base;
+       cssmetric_rectangle_t view;
+};
+typedef struct cssrendering_anonymousbox_t_ cssrendering_anonymousbox_t;
+
+/* Functionality name: cssrendering */
+/* Detail name: blockbox */
+struct cssrendering_blockbox_t_ {
+       cssrendering_basebox_t base;
+       cssmetric_rectangle_t view;
+};
+typedef struct cssrendering_blockbox_t_ cssrendering_blockbox_t;
+
+/* Functionality name: cssrendering */
+/* Detail name: drawtraversal */
+struct cssrendering_drawtraversal_t_ {
+       treebase_preordertraversal_t base;
+       cssmetric_point_t origin;
+};
+typedef struct cssrendering_drawtraversal_t_ cssrendering_drawtraversal_t;
+
+/* Functionality name: cssrendering */
+/* Detail name: drawtraversal */
+/* Data structure identifier: result */
+struct cssrendering_drawtraversal_result_ {
+       enum {
+               CSSRENDERING_DRAWTRAVERSAL_RESULTTYPE_TEXT,
+       } type;
+       union {
+               struct {
+                       cssrendering_textfragment_t *fragment;
+                       cssmetric_point_t blstart; /* baseline start */
+               } text;
+       } data;
+};
+typedef struct cssrendering_drawtraversal_result_ cssrendering_drawtraversal_result;
+
+IMPORT VOID cssrendering_linebox_initialize(cssrendering_linebox_t *box);
+IMPORT VOID cssrendering_linebox_finalize(cssrendering_linebox_t *box);
+
+IMPORT VOID cssrendering_anonymousbox_initialize(cssrendering_anonymousbox_t *box);
+IMPORT VOID cssrendering_anonymousbox_finalize(cssrendering_anonymousbox_t *box);
+IMPORT VOID cssrendering_anonymousbox_appendchild(cssrendering_anonymousbox_t *box, cssrendering_linebox_t *child);
+
+IMPORT VOID cssrendering_blockbox_initialize(cssrendering_blockbox_t *box);
+IMPORT VOID cssrendering_blockbox_finalize(cssrendering_blockbox_t *box);
+IMPORT VOID cssrendering_blockbox_appendanonymouschild(cssrendering_blockbox_t *box, cssrendering_anonymousbox_t *child);
+
+IMPORT VOID cssrendering_drawtraversal_initialize(cssrendering_drawtraversal_t *traversal, cssrendering_blockbox_t *root);
+IMPORT VOID cssrendering_drawtraversal_finalize(cssrendering_drawtraversal_t *traversal);
+IMPORT Bool cssrendering_drawtraversal_next(cssrendering_drawtraversal_t *traversal, cssrendering_drawtraversal_result *result);
+
+#endif