OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2007 David Smith (catfish.man@gmail.com) | 4 * (C) 2007 David Smith (catfish.man@gmail.com) |
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. |
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
7 * | 7 * |
8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
(...skipping 1863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1874 bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent; | 1874 bool renderRule = ruleStyle > BHIDDEN && !ruleTransparent; |
1875 if (!renderRule) | 1875 if (!renderRule) |
1876 return; | 1876 return; |
1877 | 1877 |
1878 ColumnInfo* colInfo = columnInfo(); | 1878 ColumnInfo* colInfo = columnInfo(); |
1879 unsigned colCount = columnCount(colInfo); | 1879 unsigned colCount = columnCount(colInfo); |
1880 | 1880 |
1881 bool antialias = shouldAntialiasLines(paintInfo.context); | 1881 bool antialias = shouldAntialiasLines(paintInfo.context); |
1882 | 1882 |
1883 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { | 1883 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { |
1884 bool leftToRight = style()->isLeftToRightDirection() ^ colInfo->progress ionIsReversed(); | 1884 bool leftToRight = style()->isLeftToRightDirection(); |
1885 LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentL ogicalWidth(); | 1885 LayoutUnit currLogicalLeftOffset = leftToRight ? LayoutUnit() : contentL ogicalWidth(); |
1886 LayoutUnit ruleAdd = logicalLeftOffsetForContent(); | 1886 LayoutUnit ruleAdd = logicalLeftOffsetForContent(); |
1887 LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogical Width(); | 1887 LayoutUnit ruleLogicalLeft = leftToRight ? LayoutUnit() : contentLogical Width(); |
1888 LayoutUnit inlineDirectionSize = colInfo->desiredColumnWidth(); | 1888 LayoutUnit inlineDirectionSize = colInfo->desiredColumnWidth(); |
1889 BoxSide boxSide = isHorizontalWritingMode() | 1889 BoxSide boxSide = isHorizontalWritingMode() |
1890 ? leftToRight ? BSLeft : BSRight | 1890 ? leftToRight ? BSLeft : BSRight |
1891 : leftToRight ? BSTop : BSBottom; | 1891 : leftToRight ? BSTop : BSBottom; |
1892 | 1892 |
1893 for (unsigned i = 0; i < colCount; i++) { | 1893 for (unsigned i = 0; i < colCount; i++) { |
1894 // Move to the next position. | 1894 // Move to the next position. |
(...skipping 11 matching lines...) Expand all Loading... | |
1906 LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ru leThickness : ruleLeft + contentWidth(); | 1906 LayoutUnit ruleRight = isHorizontalWritingMode() ? ruleLeft + ru leThickness : ruleLeft + contentWidth(); |
1907 LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y() + borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThicknes s / 2 + ruleAdd; | 1907 LayoutUnit ruleTop = isHorizontalWritingMode() ? paintOffset.y() + borderTop() + paddingTop() : paintOffset.y() + ruleLogicalLeft - ruleThicknes s / 2 + ruleAdd; |
1908 LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + co ntentHeight() : ruleTop + ruleThickness; | 1908 LayoutUnit ruleBottom = isHorizontalWritingMode() ? ruleTop + co ntentHeight() : ruleTop + ruleThickness; |
1909 IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(rule Left, ruleTop, ruleRight, ruleBottom); | 1909 IntRect pixelSnappedRuleRect = pixelSnappedIntRectFromEdges(rule Left, ruleTop, ruleRight, ruleBottom); |
1910 drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRect.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.maxY (), boxSide, ruleColor, ruleStyle, 0, 0, antialias); | 1910 drawLineForBoxSide(paintInfo.context, pixelSnappedRuleRect.x(), pixelSnappedRuleRect.y(), pixelSnappedRuleRect.maxX(), pixelSnappedRuleRect.maxY (), boxSide, ruleColor, ruleStyle, 0, 0, antialias); |
1911 } | 1911 } |
1912 | 1912 |
1913 ruleLogicalLeft = currLogicalLeftOffset; | 1913 ruleLogicalLeft = currLogicalLeftOffset; |
1914 } | 1914 } |
1915 } else { | 1915 } else { |
1916 bool topToBottom = !style()->isFlippedBlocksWritingMode() ^ colInfo->pro gressionIsReversed(); | 1916 bool topToBottom = !style()->isFlippedBlocksWritingMode(); |
1917 LayoutUnit ruleLeft = isHorizontalWritingMode() | 1917 LayoutUnit ruleLeft = isHorizontalWritingMode() |
1918 ? borderLeft() + paddingLeft() | 1918 ? borderLeft() + paddingLeft() |
1919 : colGap / 2 - colGap - ruleThickness / 2 + (!colInfo->progressionIs Reversed() ? borderBefore() + paddingBefore() : borderAfter() + paddingAfter()); | 1919 : colGap / 2 - colGap - ruleThickness / 2 + borderBefore() + padding Before(); |
1920 LayoutUnit ruleWidth = isHorizontalWritingMode() ? contentWidth() : rule Thickness; | 1920 LayoutUnit ruleWidth = isHorizontalWritingMode() ? contentWidth() : rule Thickness; |
1921 LayoutUnit ruleTop = isHorizontalWritingMode() | 1921 LayoutUnit ruleTop = isHorizontalWritingMode() |
1922 ? colGap / 2 - colGap - ruleThickness / 2 + (!colInfo->progressionIs Reversed() ? borderBefore() + paddingBefore() : borderAfter() + paddingAfter()) | 1922 ? colGap / 2 - colGap - ruleThickness / 2 + borderBefore() + padding Before() |
1923 : borderStart() + paddingStart(); | 1923 : borderStart() + paddingStart(); |
1924 LayoutUnit ruleHeight = isHorizontalWritingMode() ? ruleThickness : cont entHeight(); | 1924 LayoutUnit ruleHeight = isHorizontalWritingMode() ? ruleThickness : cont entHeight(); |
1925 LayoutRect ruleRect(ruleLeft, ruleTop, ruleWidth, ruleHeight); | 1925 LayoutRect ruleRect(ruleLeft, ruleTop, ruleWidth, ruleHeight); |
1926 | 1926 |
1927 if (!topToBottom) { | 1927 if (!topToBottom) { |
1928 if (isHorizontalWritingMode()) | 1928 if (isHorizontalWritingMode()) |
1929 ruleRect.setY(height() - ruleRect.maxY()); | 1929 ruleRect.setY(height() - ruleRect.maxY()); |
1930 else | 1930 else |
1931 ruleRect.setX(width() - ruleRect.maxX()); | 1931 ruleRect.setX(width() - ruleRect.maxX()); |
1932 } | 1932 } |
(...skipping 1347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3280 { | 3280 { |
3281 if (document().regionBasedColumnsEnabled()) | 3281 if (document().regionBasedColumnsEnabled()) |
3282 return; | 3282 return; |
3283 | 3283 |
3284 // Calculate our column width and column count. | 3284 // Calculate our column width and column count. |
3285 // FIXME: Can overflow on fast/block/float/float-not-removed-from-next-sibli ng4.html, see https://bugs.webkit.org/show_bug.cgi?id=68744 | 3285 // FIXME: Can overflow on fast/block/float/float-not-removed-from-next-sibli ng4.html, see https://bugs.webkit.org/show_bug.cgi?id=68744 |
3286 unsigned desiredColumnCount = 1; | 3286 unsigned desiredColumnCount = 1; |
3287 LayoutUnit desiredColumnWidth = contentLogicalWidth(); | 3287 LayoutUnit desiredColumnWidth = contentLogicalWidth(); |
3288 | 3288 |
3289 // For now, we don't support multi-column layouts when printing, since we ha ve to do a lot of work for proper pagination. | 3289 // For now, we don't support multi-column layouts when printing, since we ha ve to do a lot of work for proper pagination. |
3290 if (document().paginated() || (style()->hasAutoColumnCount() && style()->has AutoColumnWidth()) || !style()->hasInlineColumnAxis()) { | 3290 if (document().paginated() || !style()->specifiesColumns()) { |
3291 setDesiredColumnCountAndWidth(desiredColumnCount, desiredColumnWidth); | 3291 setDesiredColumnCountAndWidth(desiredColumnCount, desiredColumnWidth); |
3292 return; | 3292 return; |
3293 } | 3293 } |
3294 | 3294 |
3295 LayoutUnit availWidth = desiredColumnWidth; | 3295 LayoutUnit availWidth = desiredColumnWidth; |
3296 LayoutUnit colGap = columnGap(); | 3296 LayoutUnit colGap = columnGap(); |
3297 LayoutUnit colWidth = max<LayoutUnit>(1, LayoutUnit(style()->columnWidth())) ; | 3297 LayoutUnit colWidth = max<LayoutUnit>(1, LayoutUnit(style()->columnWidth())) ; |
3298 int colCount = max<int>(1, style()->columnCount()); | 3298 int colCount = max<int>(1, style()->columnCount()); |
3299 | 3299 |
3300 if (style()->hasAutoColumnWidth() && !style()->hasAutoColumnCount()) { | 3300 if (style()->hasAutoColumnWidth() && !style()->hasAutoColumnCount()) { |
3301 desiredColumnCount = colCount; | 3301 desiredColumnCount = colCount; |
3302 desiredColumnWidth = max<LayoutUnit>(0, (availWidth - ((desiredColumnCou nt - 1) * colGap)) / desiredColumnCount); | 3302 desiredColumnWidth = max<LayoutUnit>(0, (availWidth - ((desiredColumnCou nt - 1) * colGap)) / desiredColumnCount); |
3303 } else if (!style()->hasAutoColumnWidth() && style()->hasAutoColumnCount()) { | 3303 } else if (!style()->hasAutoColumnWidth() && style()->hasAutoColumnCount()) { |
3304 desiredColumnCount = max<LayoutUnit>(1, (availWidth + colGap) / (colWidt h + colGap)); | 3304 desiredColumnCount = max<LayoutUnit>(1, (availWidth + colGap) / (colWidt h + colGap)); |
3305 desiredColumnWidth = ((availWidth + colGap) / desiredColumnCount) - colG ap; | 3305 desiredColumnWidth = ((availWidth + colGap) / desiredColumnCount) - colG ap; |
3306 } else { | 3306 } else { |
3307 desiredColumnCount = max<LayoutUnit>(min<LayoutUnit>(colCount, (availWid th + colGap) / (colWidth + colGap)), 1); | 3307 desiredColumnCount = max<LayoutUnit>(min<LayoutUnit>(colCount, (availWid th + colGap) / (colWidth + colGap)), 1); |
3308 desiredColumnWidth = ((availWidth + colGap) / desiredColumnCount) - colG ap; | 3308 desiredColumnWidth = ((availWidth + colGap) / desiredColumnCount) - colG ap; |
3309 } | 3309 } |
3310 setDesiredColumnCountAndWidth(desiredColumnCount, desiredColumnWidth); | 3310 setDesiredColumnCountAndWidth(desiredColumnCount, desiredColumnWidth); |
3311 } | 3311 } |
3312 | 3312 |
3313 bool RenderBlock::requiresColumns(int desiredColumnCount) const | 3313 bool RenderBlock::requiresColumns(int desiredColumnCount) const |
3314 { | 3314 { |
3315 // Paged overflow is treated as multicol here, unless this element was the o ne that got its | 3315 // Paged overflow is treated as multicol here, unless this element was the o ne that got its |
3316 // overflow propagated to the viewport. | 3316 // overflow propagated to the viewport. |
3317 bool isPaginated = style()->isOverflowPaged() && node() != document().viewpo rtDefiningElement(); | 3317 bool isPaginated = style()->isOverflowPaged() && node() != document().viewpo rtDefiningElement(); |
3318 | 3318 |
3319 return firstChild() | 3319 return firstChild() |
3320 && (desiredColumnCount != 1 || !style()->hasAutoColumnWidth() || !style( )->hasInlineColumnAxis() || isPaginated) | 3320 && (desiredColumnCount != 1 || !style()->hasAutoColumnWidth() || isPagin ated) |
3321 && !firstChild()->isAnonymousColumnsBlock() | 3321 && !firstChild()->isAnonymousColumnsBlock() |
3322 && !firstChild()->isAnonymousColumnSpanBlock(); | 3322 && !firstChild()->isAnonymousColumnSpanBlock(); |
3323 } | 3323 } |
3324 | 3324 |
3325 void RenderBlock::setDesiredColumnCountAndWidth(int count, LayoutUnit width) | 3325 void RenderBlock::setDesiredColumnCountAndWidth(int count, LayoutUnit width) |
3326 { | 3326 { |
3327 bool destroyColumns = !requiresColumns(count); | 3327 bool destroyColumns = !requiresColumns(count); |
3328 if (destroyColumns) { | 3328 if (destroyColumns) { |
3329 if (hasColumns()) { | 3329 if (hasColumns()) { |
3330 gColumnInfoMap->take(this); | 3330 gColumnInfoMap->take(this); |
3331 setHasColumns(false); | 3331 setHasColumns(false); |
3332 } | 3332 } |
3333 } else { | 3333 } else { |
3334 ColumnInfo* info; | 3334 ColumnInfo* info; |
3335 if (hasColumns()) | 3335 if (hasColumns()) |
3336 info = gColumnInfoMap->get(this); | 3336 info = gColumnInfoMap->get(this); |
3337 else { | 3337 else { |
3338 if (!gColumnInfoMap) | 3338 if (!gColumnInfoMap) |
3339 gColumnInfoMap = new ColumnInfoMap; | 3339 gColumnInfoMap = new ColumnInfoMap; |
3340 info = new ColumnInfo; | 3340 info = new ColumnInfo; |
3341 gColumnInfoMap->add(this, adoptPtr(info)); | 3341 gColumnInfoMap->add(this, adoptPtr(info)); |
3342 setHasColumns(true); | 3342 setHasColumns(true); |
3343 } | 3343 } |
3344 info->setDesiredColumnWidth(width); | 3344 info->setDesiredColumnWidth(width); |
3345 if (style()->isOverflowPaged()) { | 3345 if (style()->isOverflowPaged()) { |
3346 info->setDesiredColumnCount(1); | |
Julien - ping for review
2014/03/25 18:52:53
This seems like an existing bug in the code. Any c
mstensho (USE GERRIT)
2014/03/26 09:03:23
I cannot actually find any problems with just leav
| |
3346 info->setProgressionAxis(style()->hasInlinePaginationAxis() ? Column Info::InlineAxis : ColumnInfo::BlockAxis); | 3347 info->setProgressionAxis(style()->hasInlinePaginationAxis() ? Column Info::InlineAxis : ColumnInfo::BlockAxis); |
3347 } else { | 3348 } else { |
3348 info->setDesiredColumnCount(count); | 3349 info->setDesiredColumnCount(count); |
3349 info->setProgressionAxis(style()->hasInlineColumnAxis() ? ColumnInfo ::InlineAxis : ColumnInfo::BlockAxis); | 3350 info->setProgressionAxis(ColumnInfo::InlineAxis); |
3350 info->setProgressionIsReversed(style()->columnProgression() == Rever seColumnProgression); | |
3351 } | 3351 } |
3352 } | 3352 } |
3353 } | 3353 } |
3354 | 3354 |
3355 LayoutUnit RenderBlock::desiredColumnWidth() const | 3355 LayoutUnit RenderBlock::desiredColumnWidth() const |
3356 { | 3356 { |
3357 if (!hasColumns()) | 3357 if (!hasColumns()) |
3358 return contentLogicalWidth(); | 3358 return contentLogicalWidth(); |
3359 return gColumnInfoMap->get(this)->desiredColumnWidth(); | 3359 return gColumnInfoMap->get(this)->desiredColumnWidth(); |
3360 } | 3360 } |
(...skipping 16 matching lines...) Expand all Loading... | |
3377 { | 3377 { |
3378 ASSERT(hasColumns() && gColumnInfoMap->get(this) == colInfo); | 3378 ASSERT(hasColumns() && gColumnInfoMap->get(this) == colInfo); |
3379 | 3379 |
3380 // Compute the appropriate rect based off our information. | 3380 // Compute the appropriate rect based off our information. |
3381 LayoutUnit colLogicalWidth = colInfo->desiredColumnWidth(); | 3381 LayoutUnit colLogicalWidth = colInfo->desiredColumnWidth(); |
3382 LayoutUnit colLogicalHeight = colInfo->columnHeight(); | 3382 LayoutUnit colLogicalHeight = colInfo->columnHeight(); |
3383 LayoutUnit colLogicalTop = borderBefore() + paddingBefore(); | 3383 LayoutUnit colLogicalTop = borderBefore() + paddingBefore(); |
3384 LayoutUnit colLogicalLeft = logicalLeftOffsetForContent(); | 3384 LayoutUnit colLogicalLeft = logicalLeftOffsetForContent(); |
3385 LayoutUnit colGap = columnGap(); | 3385 LayoutUnit colGap = columnGap(); |
3386 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { | 3386 if (colInfo->progressionAxis() == ColumnInfo::InlineAxis) { |
3387 if (style()->isLeftToRightDirection() ^ colInfo->progressionIsReversed() ) | 3387 if (style()->isLeftToRightDirection()) |
3388 colLogicalLeft += index * (colLogicalWidth + colGap); | 3388 colLogicalLeft += index * (colLogicalWidth + colGap); |
3389 else | 3389 else |
3390 colLogicalLeft += contentLogicalWidth() - colLogicalWidth - index * (colLogicalWidth + colGap); | 3390 colLogicalLeft += contentLogicalWidth() - colLogicalWidth - index * (colLogicalWidth + colGap); |
3391 } else { | 3391 } else { |
3392 if (!colInfo->progressionIsReversed()) | 3392 colLogicalTop += index * (colLogicalHeight + colGap); |
3393 colLogicalTop += index * (colLogicalHeight + colGap); | |
3394 else | |
3395 colLogicalTop += contentLogicalHeight() - colLogicalHeight - index * (colLogicalHeight + colGap); | |
3396 } | 3393 } |
3397 | 3394 |
3398 if (isHorizontalWritingMode()) | 3395 if (isHorizontalWritingMode()) |
3399 return LayoutRect(colLogicalLeft, colLogicalTop, colLogicalWidth, colLog icalHeight); | 3396 return LayoutRect(colLogicalLeft, colLogicalTop, colLogicalWidth, colLog icalHeight); |
3400 return LayoutRect(colLogicalTop, colLogicalLeft, colLogicalHeight, colLogica lWidth); | 3397 return LayoutRect(colLogicalTop, colLogicalLeft, colLogicalHeight, colLogica lWidth); |
3401 } | 3398 } |
3402 | 3399 |
3403 void RenderBlock::adjustPointToColumnContents(LayoutPoint& point) const | 3400 void RenderBlock::adjustPointToColumnContents(LayoutPoint& point) const |
3404 { | 3401 { |
3405 // Just bail if we have no columns. | 3402 // Just bail if we have no columns. |
(...skipping 1619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5025 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render Object* obj) const | 5022 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Render Object* obj) const |
5026 { | 5023 { |
5027 showRenderObject(); | 5024 showRenderObject(); |
5028 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) | 5025 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) |
5029 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); | 5026 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); |
5030 } | 5027 } |
5031 | 5028 |
5032 #endif | 5029 #endif |
5033 | 5030 |
5034 } // namespace WebCore | 5031 } // namespace WebCore |
OLD | NEW |