| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2002 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2002 Lars Knoll (knoll@kde.org) |
| 3 * (C) 2002 Dirk Mueller (mueller@kde.org) | 3 * (C) 2002 Dirk Mueller (mueller@kde.org) |
| 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. |
| 5 * | 5 * |
| 6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2 of the License. | 9 * version 2 of the License. |
| 10 * | 10 * |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 m_width[currentEffectiveColumn] *= spanInCurrentEffectiveColumn; | 136 m_width[currentEffectiveColumn] *= spanInCurrentEffectiveColumn; |
| 137 usedWidth += effectiveColWidth * spanInCurrentEffectiveColumn; | 137 usedWidth += effectiveColWidth * spanInCurrentEffectiveColumn; |
| 138 } | 138 } |
| 139 span -= spanInCurrentEffectiveColumn; | 139 span -= spanInCurrentEffectiveColumn; |
| 140 currentEffectiveColumn++; | 140 currentEffectiveColumn++; |
| 141 } | 141 } |
| 142 } | 142 } |
| 143 | 143 |
| 144 // Iterate over the first row in case some are unspecified. | 144 // Iterate over the first row in case some are unspecified. |
| 145 RenderTableSection* section = m_table->topNonEmptySection(); | 145 RenderTableSection* section = m_table->topNonEmptySection(); |
| 146 if (section) { | 146 if (!section) |
| 147 unsigned cCol = 0; | 147 return usedWidth; |
| 148 RenderObject* firstRow = section->firstChild(); | |
| 149 RenderObject* child = firstRow->firstChild(); | |
| 150 while (child) { | |
| 151 if (child->isTableCell()) { | |
| 152 RenderTableCell* cell = toRenderTableCell(child); | |
| 153 if (cell->preferredLogicalWidthsDirty()) | |
| 154 cell->computePreferredLogicalWidths(); | |
| 155 | 148 |
| 156 Length w = cell->styleOrColLogicalWidth(); | 149 unsigned currentColumn = 0; |
| 157 unsigned span = cell->colSpan(); | 150 |
| 158 int effectiveColWidth = 0; | 151 RenderObject* firstRow = section->firstChild(); |
| 159 if (w.isFixed() && w.isPositive()) { | 152 for (RenderObject* child = firstRow->firstChild(); child; child = child->nex
tSibling()) { |
| 160 w.setValue(w.value() + cell->borderAndPaddingLogicalWidth())
; | 153 if (!child->isTableCell()) |
| 161 effectiveColWidth = w.value(); | 154 continue; |
| 162 } | 155 |
| 163 | 156 RenderTableCell* cell = toRenderTableCell(child); |
| 164 unsigned usedSpan = 0; | 157 if (cell->preferredLogicalWidthsDirty()) |
| 165 unsigned i = 0; | 158 cell->computePreferredLogicalWidths(); |
| 166 while (usedSpan < span && cCol + i < nEffCols) { | 159 |
| 167 float eSpan = m_table->spanOfEffCol(cCol + i); | 160 Length logicalWidth = cell->styleOrColLogicalWidth(); |
| 168 // Only set if no col element has already set it. | 161 unsigned span = cell->colSpan(); |
| 169 if (m_width[cCol + i].isAuto() && w.type() != Auto) { | 162 int fixedBorderBoxLogicalWidth = 0; |
| 170 m_width[cCol + i] = w; | 163 if (logicalWidth.isFixed() && logicalWidth.isPositive()) { |
| 171 m_width[cCol + i] *= eSpan / span; | 164 fixedBorderBoxLogicalWidth = cell->computeBorderBoxLogicalWidth(logi
calWidth.value()); |
| 172 usedWidth += effectiveColWidth * eSpan / span; | 165 logicalWidth.setValue(fixedBorderBoxLogicalWidth); |
| 173 } | 166 } |
| 174 usedSpan += eSpan; | 167 |
| 175 i++; | 168 unsigned usedSpan = 0; |
| 176 } | 169 while (usedSpan < span && currentColumn < nEffCols) { |
| 177 cCol += i; | 170 float eSpan = m_table->spanOfEffCol(currentColumn); |
| 171 // Only set if no col element has already set it. |
| 172 if (m_width[currentColumn].isAuto() && logicalWidth.type() != Auto)
{ |
| 173 m_width[currentColumn] = logicalWidth; |
| 174 m_width[currentColumn] *= eSpan / span; |
| 175 usedWidth += fixedBorderBoxLogicalWidth * eSpan / span; |
| 178 } | 176 } |
| 179 child = child->nextSibling(); | 177 usedSpan += eSpan; |
| 178 ++currentColumn; |
| 180 } | 179 } |
| 181 } | 180 } |
| 182 | 181 |
| 183 return usedWidth; | 182 return usedWidth; |
| 184 } | 183 } |
| 185 | 184 |
| 186 // Use a very large value (in effect infinite). But not too large! | 185 // Use a very large value (in effect infinite). But not too large! |
| 187 // numeric_limits<int>::max() will too easily overflow widths. | 186 // numeric_limits<int>::max() will too easily overflow widths. |
| 188 // Keep this in synch with BLOCK_MAX_WIDTH in RenderBlock.cpp | 187 // Keep this in synch with BLOCK_MAX_WIDTH in RenderBlock.cpp |
| 189 #define TABLE_MAX_WIDTH 15000 | 188 #define TABLE_MAX_WIDTH 15000 |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 for (unsigned i = 0; i < nEffCols; i++) { | 323 for (unsigned i = 0; i < nEffCols; i++) { |
| 325 m_table->columnPositions()[i] = pos; | 324 m_table->columnPositions()[i] = pos; |
| 326 pos += calcWidth[i] + hspacing; | 325 pos += calcWidth[i] + hspacing; |
| 327 } | 326 } |
| 328 int colPositionsSize = m_table->columnPositions().size(); | 327 int colPositionsSize = m_table->columnPositions().size(); |
| 329 if (colPositionsSize > 0) | 328 if (colPositionsSize > 0) |
| 330 m_table->columnPositions()[colPositionsSize - 1] = pos; | 329 m_table->columnPositions()[colPositionsSize - 1] = pos; |
| 331 } | 330 } |
| 332 | 331 |
| 333 } // namespace WebCore | 332 } // namespace WebCore |
| OLD | NEW |