From 86f7dfbc9649abdcd309d4a452208054e72359bd Mon Sep 17 00:00:00 2001 From: James Bursa Date: Sun, 15 Feb 2004 20:39:53 +0000 Subject: [project @ 2004-02-15 20:39:53 by bursa] Document box.h, remove struct page_elements. svn path=/import/netsurf/; revision=547 --- render/box.c | 32 +---------- render/box.h | 172 ++++++++++++++++++++++++++++++++++++++++++---------------- render/html.h | 3 +- 3 files changed, 129 insertions(+), 78 deletions(-) diff --git a/render/box.c b/render/box.c index cf51d5b99..fb270e6ad 100644 --- a/render/box.c +++ b/render/box.c @@ -2,7 +2,7 @@ * This file is part of NetSurf, http://netsurf.sourceforge.net/ * Licensed under the GNU General Public License, * http://www.opensource.org/licenses/gpl-license - * Copyright 2003 James Bursa + * Copyright 2004 James Bursa * Copyright 2003 Phil Mellor * Copyright 2003 John M Bell */ @@ -41,7 +41,6 @@ struct status { char *href; char *title; struct form* current_form; - struct page_elements* elements; }; /* result of converting a special case element */ @@ -99,8 +98,6 @@ static struct result box_applet(xmlNode *n, struct status *status, static struct result box_iframe(xmlNode *n, struct status *status, struct css_style *style); #endif -static void add_form_element(struct page_elements* pe, struct form* f); -static void add_gadget_element(struct page_elements* pe, struct form_control* g); #ifdef WITH_PLUGIN static bool plugin_decode(struct content* content, char* url, struct box* box, struct object_params* po); @@ -226,7 +223,7 @@ void box_insert_sibling(struct box *box, struct box *new_box) void xml_to_box(xmlNode *n, struct content *c) { - struct status status = {c, 0, 0, 0, &c->data.html.elements}; + struct status status = {c, 0, 0, 0}; LOG(("node %p", n)); assert(c->type == CONTENT_HTML); @@ -865,7 +862,6 @@ struct result box_form(xmlNode *n, struct status *status, form->controls = form->last_control = 0; - add_form_element(status->elements, status->current_form); return (struct result) {box, 1}; } @@ -920,8 +916,6 @@ struct result box_textarea(xmlNode *n, struct status *status, box->gadget->name = s; } - add_gadget_element(status->elements, box->gadget); - return (struct result) {box, 0}; } @@ -1013,8 +1007,6 @@ struct result box_select(xmlNode *n, struct status *status, inline_box->length = strlen(inline_box->text); inline_box->font = font_open(status->content->data.html.fonts, style); - add_gadget_element(status->elements, gadget); - return (struct result) {box, 0}; } @@ -1156,7 +1148,6 @@ struct result box_input(xmlNode *n, struct status *status, else gadget->form = 0; gadget->name = (char *) xmlGetProp(n, (const xmlChar *) "name"); - add_gadget_element(status->elements, gadget); } return (struct result) {box, 0}; @@ -1769,25 +1760,6 @@ void box_free_box(struct box *box) } -/** - * form helper functions - */ - -void add_form_element(struct page_elements* pe, struct form* f) -{ - pe->forms = xrealloc(pe->forms, (pe->numForms + 1) * sizeof(struct form*)); - pe->forms[pe->numForms] = f; - pe->numForms++; -} - -void add_gadget_element(struct page_elements* pe, struct form_control* g) -{ - pe->gadgets = xrealloc(pe->gadgets, (pe->numGadgets + 1) * sizeof(struct form_control*)); - pe->gadgets[pe->numGadgets] = g; - pe->numGadgets++; -} - - #ifdef WITH_PLUGIN /** * add an object to the box tree diff --git a/render/box.h b/render/box.h index 713baafdd..ac265b33d 100644 --- a/render/box.h +++ b/render/box.h @@ -2,10 +2,74 @@ * This file is part of NetSurf, http://netsurf.sourceforge.net/ * Licensed under the GNU General Public License, * http://www.opensource.org/licenses/gpl-license - * Copyright 2003 James Bursa + * Copyright 2004 James Bursa * Copyright 2003 Phil Mellor */ +/** \file + * Conversion of XML tree to box tree (interface). + * + * This stage of rendering converts a tree of xmlNodes (produced by libxml2) + * to a tree of struct box. The box tree represents the structure of the + * document as given by the CSS display and float properties. + * + * For example, consider the following HTML: + * \code + *

Example Heading

+ *

Example paragraph with emphasised text etc.

\endcode + * + * This would produce approximately the following box tree with default CSS + * rules: + * \code + * BOX_BLOCK (corresponds to h1) + * BOX_INLINE_CONTAINER + * BOX_INLINE "Example Heading" + * BOX_BLOCK (p) + * BOX_INLINE_CONTAINER + * BOX_INLINE "Example paragraph " + * BOX_INLINE "with emphasised text" (em) + * BOX_INLINE "etc." \endcode + * + * Note that the em has been collapsed into the INLINE_CONTAINER. + * + * If these CSS rules were applied: + * \code + * h1 { display: table-cell } + * p { display: table-cell } + * em { float: left; width: 5em } \endcode + * + * then the box tree would instead look like this: + * \code + * BOX_TABLE + * BOX_TABLE_ROW_GROUP + * BOX_TABLE_ROW + * BOX_TABLE_CELL (h1) + * BOX_INLINE_CONTAINER + * BOX_INLINE "Example Heading" + * BOX_TABLE_CELL (p) + * BOX_INLINE_CONTAINER + * BOX_INLINE "Example paragraph " + * BOX_FLOAT_LEFT (em) + * BOX_BLOCK + * BOX_INLINE_CONTAINER + * BOX_INLINE "with emphasised text" + * BOX_INLINE "etc." \endcode + * + * Here implied boxes have been added and a float is present. + * + * A box tree is "normalized" if the following is satisfied: + * \code + * parent permitted child nodes + * BLOCK, INLINE_BLOCK BLOCK, INLINE_CONTAINER, TABLE + * INLINE_CONTAINER INLINE, INLINE_BLOCK, FLOAT_LEFT, FLOAT_RIGHT + * INLINE none + * TABLE at least 1 TABLE_ROW_GROUP + * TABLE_ROW_GROUP at least 1 TABLE_ROW + * TABLE_ROW at least 1 TABLE_CELL + * TABLE_CELL BLOCK, INLINE_CONTAINER, TABLE (same as BLOCK) + * FLOAT_(LEFT|RIGHT) exactly 1 BLOCK or TABLE \endcode + */ + #ifndef _NETSURF_RENDER_BOX_H_ #define _NETSURF_RENDER_BOX_H_ @@ -17,9 +81,6 @@ #include "netsurf/render/font.h" #include "netsurf/utils/pool.h" -/** - * structures - */ typedef enum { BOX_BLOCK, BOX_INLINE_CONTAINER, BOX_INLINE, @@ -69,63 +130,82 @@ struct object_params {}; struct plugin_params {}; #endif +/** Node in box tree. All dimensions are in pixels. */ struct box { + /** Type of box. */ box_type type; + + /** Style for this box. 0 for INLINE_CONTAINER and FLOAT_*. */ struct css_style * style; - int x; /**< Coordinate of left padding edge relative to parent box. */ - int y; /**< Coordinate of top padding edge relative to parent box. */ + + /** Coordinate of left padding edge relative to parent box, or relative + * to ancestor that contains this box in float_children for FLOAT_. */ + int x; + /** Coordinate of top padding edge, relative as for x. */ + int y; + int width; /**< Width of content box (excluding padding etc.). */ int height; /**< Height of content box (excluding padding etc.). */ - int margin[4], padding[4], border[4]; - int min_width, max_width; - char * text; - unsigned int space : 1; /* 1 <=> followed by a space */ + + int margin[4]; /**< Margin: TOP, RIGHT, BOTTOM, LEFT. */ + int padding[4]; /**< Padding: TOP, RIGHT, BOTTOM, LEFT. */ + int border[4]; /**< Border width: TOP, RIGHT, BOTTOM, LEFT. */ + + int min_width; /**< Width for content taking all line breaks. */ + int max_width; /**< Width that would be taken with no line breaks. */ + + char *text; /**< Text, or 0 if none. Unterminated. */ + unsigned int length; /**< Length of text. */ + + /** Text is followed by a space. */ + unsigned int space : 1; + /** This box is a continuation of the previous box (eg from line + * breaking). gadget, href, title, col and style are shared with the + * previous box, and must not be freed when this box is destroyed. */ unsigned int clone : 1; + /** style is shared with some other box, and must not be freed when + * this box is destroyed. */ unsigned int style_clone : 1; - char * href; - char * title; - unsigned int length; - unsigned int columns; - unsigned int rows; - unsigned int start_column; /* start column of table cell */ - struct box * next; - struct box * prev; - struct box * children; - struct box * last; - struct box * parent; - struct box * float_children; - struct box * next_float; - struct column *col; - struct font_data *font; - struct form_control* gadget; - struct content* object; /* usually an image */ - struct object_params *object_params; - void* object_state; /* state of any object */ -}; -struct formsubmit -{ - struct form* form; - struct form_control* items; -}; + char *href; /**< Link, or 0. */ + char *title; /**< Title, or 0. */ + + unsigned int columns; /**< Number of columns for TABLE only. */ + unsigned int rows; /**< Number of rows for TABLE only. */ + unsigned int start_column; /**< Start column for TABLE_CELL only. */ + + struct box *next; /**< Next sibling box, or 0. */ + struct box *prev; /**< Previous sibling box, or 0. */ + struct box *children; /**< First child box, or 0. */ + struct box *last; /**< Last child box, or 0. */ + struct box *parent; /**< Parent box, or 0. */ + + /** First float child box, or 0. Float boxes are in the tree twice, in + * this list for the block box which defines the area for floats, and + * also in the standard tree given by children, next, prev, etc. */ + struct box *float_children; + /** Next sibling float box. */ + struct box *next_float; + + struct column *col; /**< Table column data for TABLE only. */ -struct page_elements -{ - struct form** forms; - struct form_control** gadgets; - struct img** images; - int numForms; - int numGadgets; - int numImages; + struct font_data *font; /**< Font, or 0 if no text. */ + + /**< Form control data, or 0 if not a form control. */ + struct form_control* gadget; + + /**< Object in this box (usually an image), or 0 if none. */ + struct content* object; + /**< Parameters for the object, or 0. */ + struct object_params *object_params; + /**< State of object, or 0. */ + void *object_state; }; #define UNKNOWN_WIDTH INT_MAX #define UNKNOWN_MAX_WIDTH INT_MAX -/** - * interface - */ void xml_to_box(xmlNode *n, struct content *c); void box_dump(struct box * box, unsigned int depth); diff --git a/render/html.h b/render/html.h index f57f36ca5..d69a1a0fe 100644 --- a/render/html.h +++ b/render/html.h @@ -2,7 +2,7 @@ * This file is part of NetSurf, http://netsurf.sourceforge.net/ * Licensed under the GNU General Public License, * http://www.opensource.org/licenses/gpl-license - * Copyright 2003 James Bursa + * Copyright 2004 James Bursa */ #ifndef _NETSURF_RENDER_HTML_H_ @@ -44,7 +44,6 @@ struct content_html_data { int selected; /* 0 = unselected, 1 = selected */ } text_selection; struct font_set *fonts; - struct page_elements elements; unsigned int object_count; /* images etc. */ struct { char *url; -- cgit v1.2.3