diff options
author | Vincent Sanders <vince@netsurf-browser.org> | 2018-05-10 11:34:26 +0100 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2018-05-10 13:37:02 +0100 |
commit | 2a03ea30490892ac52b3da325ab78e1aa888f83e (patch) | |
tree | d041e4a2aab3b224ad41612d47ea2119895e27ac /render/box_normalise.c | |
parent | 1b892391d7859398c212b9fda5b532308fa6e8fd (diff) | |
download | netsurf-2a03ea30490892ac52b3da325ab78e1aa888f83e.tar.gz netsurf-2a03ea30490892ac52b3da325ab78e1aa888f83e.tar.bz2 |
move html and text content handlers where they belong
Diffstat (limited to 'render/box_normalise.c')
-rw-r--r-- | render/box_normalise.c | 1046 |
1 files changed, 0 insertions, 1046 deletions
diff --git a/render/box_normalise.c b/render/box_normalise.c deleted file mode 100644 index 8da245754..000000000 --- a/render/box_normalise.c +++ /dev/null @@ -1,1046 +0,0 @@ -/* - * Copyright 2005 James Bursa <bursa@users.sourceforge.net> - * Copyright 2003 Phil Mellor <monkeyson@users.sourceforge.net> - * Copyright 2005 John M Bell <jmb202@ecs.soton.ac.uk> - * Copyright 2004 Kevin Bagust <kevin.bagust@ntlworld.com> - * - * This file is part of NetSurf, http://www.netsurf-browser.org/ - * - * NetSurf is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * NetSurf is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/** \file - * Box tree normalisation (implementation). - */ - -#include <assert.h> -#include <stdbool.h> -#include <string.h> - -#include "utils/log.h" -#include "utils/errors.h" -#include "css/select.h" - -#include "render/box.h" -#include "render/html_internal.h" -#include "render/table.h" - -/* Define to enable box normalise debug */ -#undef BOX_NORMALISE_DEBUG - -/** - * Row spanning information for a cell - */ -struct span_info { - /** Number of rows this cell spans */ - unsigned int row_span; - /** Row group of cell */ - struct box *rg; - /** The cell in this column spans all rows until the end of the table */ - bool auto_row; -}; - -/** - * Column record for a table - */ -struct columns { - /** Current column index */ - unsigned int current_column; - /** Number of columns in main part of table 1..max columns */ - unsigned int num_columns; - /** Information about columns in main table, array [0, num_columns) */ - struct span_info *spans; - /** Number of rows in table */ - unsigned int num_rows; -}; - - -static bool box_normalise_table( - struct box *table, - const struct box *root, - html_content *c); -static bool box_normalise_table_spans( - struct box *table, - const struct box *root, - struct span_info *spans, - html_content *c); -static bool box_normalise_table_row_group( - struct box *row_group, - const struct box *root, - struct columns *col_info, - html_content *c); -static bool box_normalise_table_row( - struct box *row, - const struct box *root, - struct columns *col_info, - html_content *c); -static bool calculate_table_row(struct columns *col_info, - unsigned int col_span, unsigned int row_span, - unsigned int *start_column, struct box *cell); -static bool box_normalise_inline_container( - struct box *cont, - const struct box *root, - html_content *c); - -/** - * Ensure the box tree is correctly nested by adding and removing nodes. - * - * \param block box of type BLOCK, INLINE_BLOCK, or TABLE_CELL - * \param root root box of document - * \param c content of boxes - * \return true on success, false on memory exhaustion - * - * The tree is modified to satisfy the following: - * \code - * parent permitted child nodes - * BLOCK, INLINE_BLOCK BLOCK, INLINE_CONTAINER, TABLE - * INLINE_CONTAINER INLINE, INLINE_BLOCK, FLOAT_LEFT, FLOAT_RIGHT, BR, TEXT - * INLINE, TEXT 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 - */ - -bool box_normalise_block( - struct box *block, - const struct box *root, - html_content *c) -{ - struct box *child; - struct box *next_child; - struct box *table; - css_computed_style *style; - nscss_select_ctx ctx; - - assert(block != NULL); - assert(root != NULL); - - ctx.root_style = root->style; - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "block %p, block->type %u", block, block->type); -#endif - - assert(block->type == BOX_BLOCK || block->type == BOX_INLINE_BLOCK || - block->type == BOX_TABLE_CELL); - - for (child = block->children; child != NULL; child = next_child) { -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "child %p, child->type = %d", child, - child->type); -#endif - - next_child = child->next; /* child may be destroyed */ - - switch (child->type) { - case BOX_BLOCK: - /* ok */ - if (box_normalise_block(child, root, c) == false) - return false; - break; - case BOX_INLINE_CONTAINER: - if (box_normalise_inline_container(child, root, c) == false) - return false; - break; - case BOX_TABLE: - if (box_normalise_table(child, root, c) == false) - return false; - break; - case BOX_INLINE: - case BOX_INLINE_END: - case BOX_INLINE_BLOCK: - case BOX_FLOAT_LEFT: - case BOX_FLOAT_RIGHT: - case BOX_BR: - case BOX_TEXT: - /* should have been wrapped in inline - container by convert_xml_to_box() */ - assert(0); - break; - case BOX_TABLE_ROW_GROUP: - case BOX_TABLE_ROW: - case BOX_TABLE_CELL: - /* insert implied table */ - assert(block->style != NULL); - - ctx.ctx = c->select_ctx; - ctx.quirks = (c->quirks == DOM_DOCUMENT_QUIRKS_MODE_FULL); - ctx.base_url = c->base_url; - ctx.universal = c->universal; - - style = nscss_get_blank_style(&ctx, block->style); - if (style == NULL) - return false; - - table = box_create(NULL, style, true, block->href, - block->target, NULL, NULL, c->bctx); - if (table == NULL) { - css_computed_style_destroy(style); - return false; - } - table->type = BOX_TABLE; - - if (child->prev == NULL) - block->children = table; - else - child->prev->next = table; - - table->prev = child->prev; - - while (child != NULL && ( - child->type == BOX_TABLE_ROW_GROUP || - child->type == BOX_TABLE_ROW || - child->type == BOX_TABLE_CELL)) { - box_add_child(table, child); - - next_child = child->next; - child->next = NULL; - child = next_child; - } - - table->last->next = NULL; - table->next = next_child = child; - if (table->next != NULL) - table->next->prev = table; - else - block->last = table; - table->parent = block; - - if (box_normalise_table(table, root, c) == false) - return false; - break; - default: - assert(0); - } - } - - return true; -} - - -bool box_normalise_table( - struct box *table, - const struct box *root, - html_content * c) -{ - struct box *child; - struct box *next_child; - struct box *row_group; - css_computed_style *style; - struct columns col_info; - nscss_select_ctx ctx; - - assert(table != NULL); - assert(table->type == BOX_TABLE); - - ctx.root_style = root->style; - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "table %p", table); -#endif - - col_info.num_columns = 1; - col_info.current_column = 0; - col_info.spans = malloc(2 * sizeof *col_info.spans); - if (col_info.spans == NULL) - return false; - - col_info.spans[0].row_span = col_info.spans[1].row_span = 0; - col_info.spans[0].auto_row = false; - col_info.spans[1].auto_row = false; - col_info.num_rows = 0; - - for (child = table->children; child != NULL; child = next_child) { - next_child = child->next; - switch (child->type) { - case BOX_TABLE_ROW_GROUP: - /* ok */ - if (box_normalise_table_row_group(child, root, - &col_info, c) == false) { - free(col_info.spans); - return false; - } - break; - case BOX_BLOCK: - case BOX_INLINE_CONTAINER: - case BOX_TABLE: - case BOX_TABLE_ROW: - case BOX_TABLE_CELL: - /* insert implied table row group */ - assert(table->style != NULL); - - ctx.ctx = c->select_ctx; - ctx.quirks = (c->quirks == DOM_DOCUMENT_QUIRKS_MODE_FULL); - ctx.base_url = c->base_url; - ctx.universal = c->universal; - - style = nscss_get_blank_style(&ctx, table->style); - if (style == NULL) { - free(col_info.spans); - return false; - } - - row_group = box_create(NULL, style, true, table->href, - table->target, NULL, NULL, c->bctx); - if (row_group == NULL) { - css_computed_style_destroy(style); - free(col_info.spans); - return false; - } - - row_group->type = BOX_TABLE_ROW_GROUP; - - if (child->prev == NULL) - table->children = row_group; - else - child->prev->next = row_group; - - row_group->prev = child->prev; - - while (child != NULL && ( - child->type == BOX_BLOCK || - child->type == BOX_INLINE_CONTAINER || - child->type == BOX_TABLE || - child->type == BOX_TABLE_ROW || - child->type == BOX_TABLE_CELL)) { - box_add_child(row_group, child); - - next_child = child->next; - child->next = NULL; - child = next_child; - } - - assert(row_group->last != NULL); - - row_group->last->next = NULL; - row_group->next = next_child = child; - if (row_group->next != NULL) - row_group->next->prev = row_group; - else - table->last = row_group; - row_group->parent = table; - - if (box_normalise_table_row_group(row_group, root, - &col_info, c) == false) { - free(col_info.spans); - return false; - } - break; - case BOX_INLINE: - case BOX_INLINE_END: - case BOX_INLINE_BLOCK: - case BOX_FLOAT_LEFT: - case BOX_FLOAT_RIGHT: - case BOX_BR: - case BOX_TEXT: - /* should have been wrapped in inline - container by convert_xml_to_box() */ - assert(0); - break; - default: - fprintf(stderr, "%i\n", child->type); - assert(0); - } - } - - table->columns = col_info.num_columns; - table->rows = col_info.num_rows; - - if (table->children == NULL) { - struct box *row; - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, - "table->children == 0, creating implied row"); -#endif - - assert(table->style != NULL); - - ctx.ctx = c->select_ctx; - ctx.quirks = (c->quirks == DOM_DOCUMENT_QUIRKS_MODE_FULL); - ctx.base_url = c->base_url; - ctx.universal = c->universal; - - style = nscss_get_blank_style(&ctx, table->style); - if (style == NULL) { - free(col_info.spans); - return false; - } - - row_group = box_create(NULL, style, true, table->href, - table->target, NULL, NULL, c->bctx); - if (row_group == NULL) { - css_computed_style_destroy(style); - free(col_info.spans); - return false; - } - row_group->type = BOX_TABLE_ROW_GROUP; - - style = nscss_get_blank_style(&ctx, row_group->style); - if (style == NULL) { - box_free(row_group); - free(col_info.spans); - return false; - } - - row = box_create(NULL, style, true, row_group->href, - row_group->target, NULL, NULL, c->bctx); - if (row == NULL) { - css_computed_style_destroy(style); - box_free(row_group); - free(col_info.spans); - return false; - } - row->type = BOX_TABLE_ROW; - - row->parent = row_group; - row_group->children = row_group->last = row; - - row_group->parent = table; - table->children = table->last = row_group; - - table->rows = 1; - } - - if (box_normalise_table_spans(table, root, col_info.spans, c) == false) { - free(col_info.spans); - return false; - } - - free(col_info.spans); - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "table %p done", table); -#endif - - return true; -} - - -/** - * Normalise table cell column/row counts for colspan/rowspan = 0. - * Additionally, generate empty cells. - * - * \param table Table to process - * \param root root box of document - * \param spans Array of length table->columns for use in empty cell detection - * \param c Content containing table - * \return True on success, false on memory exhaustion. - */ - -bool box_normalise_table_spans( - struct box *table, - const struct box *root, - struct span_info *spans, - html_content *c) -{ - struct box *table_row_group; - struct box *table_row; - struct box *table_cell; - unsigned int rows_left = table->rows; - unsigned int group_rows_left; - unsigned int col; - nscss_select_ctx ctx; - - ctx.root_style = root->style; - - /* Clear span data */ - memset(spans, 0, table->columns * sizeof(struct span_info)); - - /* Scan table, filling in width and height of table cells with - * colspan = 0 and rowspan = 0. Also generate empty cells */ - for (table_row_group = table->children; - table_row_group != NULL; - table_row_group = table_row_group->next) { - - group_rows_left = table_row_group->rows; - - for (table_row = table_row_group->children; - table_row != NULL; - table_row = table_row->next) { - - for (table_cell = table_row->children; - table_cell != NULL; - table_cell = table_cell->next) { - - /* colspan = 0 -> colspan = 1 */ - if (table_cell->columns == 0) { - table_cell->columns = 1; - } - - /* if rowspan is 0 it is expanded to - * the number of rows left in the row - * group - */ - if (table_cell->rows == 0) { - table_cell->rows = group_rows_left; - } - - /* limit rowspans within group */ - if (table_cell->rows > group_rows_left) { - table_cell->rows = group_rows_left; - } - - /* Record span information */ - for (col = table_cell->start_column; - col < table_cell->start_column + - table_cell->columns; col++) { - spans[col].row_span = table_cell->rows; - } - } - - /* Reduce span count of each column */ - for (col = 0; col < table->columns; col++) { - if (spans[col].row_span == 0) { - unsigned int start = col; - css_computed_style *style; - struct box *cell, *prev; - - /* If it's already zero, then we need - * to generate an empty cell for the - * gap in the row that spans as many - * columns as remain blank. - */ - assert(table_row->style != NULL); - - /* Find width of gap */ - while (col < table->columns && - spans[col].row_span == - 0) { - col++; - } - - ctx.ctx = c->select_ctx; - ctx.quirks = (c->quirks == - DOM_DOCUMENT_QUIRKS_MODE_FULL); - ctx.base_url = c->base_url; - ctx.universal = c->universal; - - style = nscss_get_blank_style(&ctx, - table_row->style); - if (style == NULL) - return false; - - cell = box_create(NULL, style, true, - table_row->href, - table_row->target, - NULL, NULL, c->bctx); - if (cell == NULL) { - css_computed_style_destroy( - style); - return false; - } - cell->type = BOX_TABLE_CELL; - - cell->rows = 1; - cell->columns = col - start; - cell->start_column = start; - - /* Find place to insert cell */ - for (prev = table_row->children; - prev != NULL; - prev = prev->next) { - if (prev->start_column + - prev->columns == - start) - break; - if (prev->next == NULL) - break; - } - - /* Insert it */ - if (prev == NULL) { - if (table_row->children != NULL) - table_row->children-> - prev = cell; - else - table_row->last = cell; - - cell->next = - table_row->children; - table_row->children = cell; - } else { - if (prev->next != NULL) - prev->next->prev = cell; - else - table_row->last = cell; - - cell->next = prev->next; - prev->next = cell; - cell->prev = prev; - } - cell->parent = table_row; - } else { - spans[col].row_span--; - } - } - - assert(rows_left > 0); - - rows_left--; - } - - group_rows_left--; - } - - return true; -} - - -bool box_normalise_table_row_group( - struct box *row_group, - const struct box *root, - struct columns *col_info, - html_content * c) -{ - struct box *child; - struct box *next_child; - struct box *row; - css_computed_style *style; - nscss_select_ctx ctx; - unsigned int group_row_count = 0; - - assert(row_group != 0); - assert(row_group->type == BOX_TABLE_ROW_GROUP); - - ctx.root_style = root->style; - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "row_group %p", row_group); -#endif - - for (child = row_group->children; child != NULL; child = next_child) { - next_child = child->next; - - switch (child->type) { - case BOX_TABLE_ROW: - /* ok */ - group_row_count++; - if (box_normalise_table_row(child, root, col_info, - c) == false) - return false; - break; - case BOX_BLOCK: - case BOX_INLINE_CONTAINER: - case BOX_TABLE: - case BOX_TABLE_ROW_GROUP: - case BOX_TABLE_CELL: - /* insert implied table row */ - assert(row_group->style != NULL); - - ctx.ctx = c->select_ctx; - ctx.quirks = (c->quirks == DOM_DOCUMENT_QUIRKS_MODE_FULL); - ctx.base_url = c->base_url; - ctx.universal = c->universal; - - style = nscss_get_blank_style(&ctx, row_group->style); - if (style == NULL) - return false; - - row = box_create(NULL, style, true, row_group->href, - row_group->target, NULL, NULL, c->bctx); - if (row == NULL) { - css_computed_style_destroy(style); - return false; - } - row->type = BOX_TABLE_ROW; - - if (child->prev == NULL) - row_group->children = row; - else - child->prev->next = row; - - row->prev = child->prev; - - while (child != NULL && ( - child->type == BOX_BLOCK || - child->type == BOX_INLINE_CONTAINER || - child->type == BOX_TABLE || - child->type == BOX_TABLE_ROW_GROUP || - child->type == BOX_TABLE_CELL)) { - box_add_child(row, child); - - next_child = child->next; - child->next = NULL; - child = next_child; - } - - assert(row->last != NULL); - - row->last->next = NULL; - row->next = next_child = child; - if (row->next != NULL) - row->next->prev = row; - else - row_group->last = row; - row->parent = row_group; - - group_row_count++; - if (box_normalise_table_row(row, root, col_info, - c) == false) - return false; - break; - case BOX_INLINE: - case BOX_INLINE_END: - case BOX_INLINE_BLOCK: - case BOX_FLOAT_LEFT: - case BOX_FLOAT_RIGHT: - case BOX_BR: - case BOX_TEXT: - /* should have been wrapped in inline - container by convert_xml_to_box() */ - assert(0); - break; - default: - assert(0); - } - } - - if (row_group->children == NULL) { -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, - "row_group->children == 0, inserting implied row"); -#endif - - assert(row_group->style != NULL); - - ctx.ctx = c->select_ctx; - ctx.quirks = (c->quirks == DOM_DOCUMENT_QUIRKS_MODE_FULL); - ctx.base_url = c->base_url; - ctx.universal = c->universal; - - style = nscss_get_blank_style(&ctx, row_group->style); - if (style == NULL) { - return false; - } - - row = box_create(NULL, style, true, row_group->href, - row_group->target, NULL, NULL, c->bctx); - if (row == NULL) { - css_computed_style_destroy(style); - return false; - } - row->type = BOX_TABLE_ROW; - - row->parent = row_group; - row_group->children = row_group->last = row; - - group_row_count = 1; - - /* Keep table's row count in sync */ - col_info->num_rows++; - } - - row_group->rows = group_row_count; - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "row_group %p done", row_group); -#endif - - return true; -} - - -bool box_normalise_table_row( - struct box *row, - const struct box *root, - struct columns *col_info, - html_content * c) -{ - struct box *child; - struct box *next_child; - struct box *cell = NULL; - css_computed_style *style; - unsigned int i; - nscss_select_ctx ctx; - - assert(row != NULL); - assert(row->type == BOX_TABLE_ROW); - - ctx.root_style = root->style; - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "row %p", row); -#endif - - for (child = row->children; child != NULL; child = next_child) { - next_child = child->next; - - switch (child->type) { - case BOX_TABLE_CELL: - /* ok */ - if (box_normalise_block(child, root, c) == false) - return false; - cell = child; - break; - case BOX_BLOCK: - case BOX_INLINE_CONTAINER: - case BOX_TABLE: - case BOX_TABLE_ROW_GROUP: - case BOX_TABLE_ROW: - /* insert implied table cell */ - assert(row->style != NULL); - - ctx.ctx = c->select_ctx; - ctx.quirks = (c->quirks == DOM_DOCUMENT_QUIRKS_MODE_FULL); - ctx.base_url = c->base_url; - ctx.universal = c->universal; - - style = nscss_get_blank_style(&ctx, row->style); - if (style == NULL) - return false; - - cell = box_create(NULL, style, true, row->href, - row->target, NULL, NULL, c->bctx); - if (cell == NULL) { - css_computed_style_destroy(style); - return false; - } - cell->type = BOX_TABLE_CELL; - - if (child->prev == NULL) - row->children = cell; - else - child->prev->next = cell; - - cell->prev = child->prev; - - while (child != NULL && ( - child->type == BOX_BLOCK || - child->type == BOX_INLINE_CONTAINER || - child->type == BOX_TABLE || - child->type == BOX_TABLE_ROW_GROUP || - child->type == BOX_TABLE_ROW)) { - box_add_child(cell, child); - - next_child = child->next; - child->next = NULL; - child = next_child; - } - - assert(cell->last != NULL); - - cell->last->next = NULL; - cell->next = next_child = child; - if (cell->next != NULL) - cell->next->prev = cell; - else - row->last = cell; - cell->parent = row; - - if (box_normalise_block(cell, root, c) == false) - return false; - break; - case BOX_INLINE: - case BOX_INLINE_END: - case BOX_INLINE_BLOCK: - case BOX_FLOAT_LEFT: - case BOX_FLOAT_RIGHT: - case BOX_BR: - case BOX_TEXT: - /* should have been wrapped in inline - container by convert_xml_to_box() */ - assert(0); - break; - default: - assert(0); - } - - if (calculate_table_row(col_info, cell->columns, cell->rows, - &cell->start_column, cell) == false) - return false; - } - - - /* Update row spanning details for all columns */ - for (i = 0; i < col_info->num_columns; i++) { - if (col_info->spans[i].row_span != 0 && - col_info->spans[i].auto_row == false) { - /* This cell spans rows, and is not an auto row. - * Reduce number of rows left to span */ - col_info->spans[i].row_span--; - } - } - - /* Reset current column for next row */ - col_info->current_column = 0; - - /* Increment row counter */ - col_info->num_rows++; - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "row %p done", row); -#endif - - return true; -} - - -/** - * Compute the column index at which the current cell begins. - * Additionally, update the column record to reflect row spanning. - * - * \param col_info Column record - * \param col_span Number of columns that current cell spans - * \param row_span Number of rows that current cell spans - * \param start_column Pointer to location to receive column index - * \param cell Box for current table cell - * \return true on success, false on memory exhaustion - */ - -bool calculate_table_row(struct columns *col_info, - unsigned int col_span, unsigned int row_span, - unsigned int *start_column, struct box *cell) -{ - unsigned int cell_start_col = col_info->current_column; - unsigned int cell_end_col; - unsigned int i; - struct span_info *spans; - struct box *rg = cell->parent->parent; /* Cell's row group */ - - /* Skip columns with cells spanning from above */ - /* TODO: Need to ignore cells spanning from above that belong to - * different row group. We don't have that info here. */ - while (col_info->spans[cell_start_col].row_span != 0 && - col_info->spans[cell_start_col].rg == rg) { - cell_start_col++; - } - - /* Update current column with calculated start */ - col_info->current_column = cell_start_col; - - /* If this cell has a colspan of 0, then assume 1. - * No other browser supports colspan=0, anyway. */ - if (col_span == 0) - col_span = 1; - - cell_end_col = cell_start_col + col_span; - - if (col_info->num_columns < cell_end_col) { - /* It appears that this row has more columns than - * the maximum recorded for the table so far. - * Allocate more span records. */ - spans = realloc(col_info->spans, - sizeof *spans * (cell_end_col + 1)); - if (spans == NULL) - return false; - - col_info->spans = spans; - col_info->num_columns = cell_end_col; - - /* Mark new final column as sentinel */ - col_info->spans[cell_end_col].row_span = 0; - col_info->spans[cell_end_col].auto_row = false; - } - - /* This cell may span multiple columns. If it also wants to span - * multiple rows, temporarily assume it spans 1 row only. This will - * be fixed up in box_normalise_table_spans() */ - for (i = cell_start_col; i < cell_end_col; i++) { - col_info->spans[i].row_span = (row_span == 0) ? 1 : row_span; - col_info->spans[i].auto_row = (row_span == 0); - col_info->spans[i].rg = rg; - } - - /* Update current column with calculated end. */ - col_info->current_column = cell_end_col; - - *start_column = cell_start_col; - - return true; -} - - -bool box_normalise_inline_container( - struct box *cont, - const struct box *root, - html_content * c) -{ - struct box *child; - struct box *next_child; - - assert(cont != NULL); - assert(cont->type == BOX_INLINE_CONTAINER); - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "cont %p", cont); -#endif - - for (child = cont->children; child != NULL; child = next_child) { - next_child = child->next; - switch (child->type) { - case BOX_INLINE: - case BOX_INLINE_END: - case BOX_BR: - case BOX_TEXT: - /* ok */ - break; - case BOX_INLINE_BLOCK: - /* ok */ - if (box_normalise_block(child, root, c) == false) - return false; - break; - case BOX_FLOAT_LEFT: - case BOX_FLOAT_RIGHT: - /* ok */ - assert(child->children != NULL); - - switch (child->children->type) { - case BOX_BLOCK: - if (box_normalise_block(child->children, root, - c) == false) - return false; - break; - case BOX_TABLE: - if (box_normalise_table(child->children, root, - c) == false) - return false; - break; - default: - assert(0); - } - - if (child->children == NULL) { - /* the child has destroyed itself: remove float */ - if (child->prev == NULL) - child->parent->children = child->next; - else - child->prev->next = child->next; - if (child->next != NULL) - child->next->prev = child->prev; - else - child->parent->last = child->prev; - - box_free(child); - } - break; - case BOX_BLOCK: - case BOX_INLINE_CONTAINER: - case BOX_TABLE: - case BOX_TABLE_ROW_GROUP: - case BOX_TABLE_ROW: - case BOX_TABLE_CELL: - default: - assert(0); - } - } - -#ifdef BOX_NORMALISE_DEBUG - NSLOG(netsurf, INFO, "cont %p done", cont); -#endif - - return true; -} |