| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2012 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 | 58 |
| 59 RenderBlockFlow* multiColumnBlockFlow() const { return toRenderBlockFlow(par
ent()); } | 59 RenderBlockFlow* multiColumnBlockFlow() const { return toRenderBlockFlow(par
ent()); } |
| 60 RenderMultiColumnFlowThread* multiColumnFlowThread() const | 60 RenderMultiColumnFlowThread* multiColumnFlowThread() const |
| 61 { | 61 { |
| 62 ASSERT_WITH_SECURITY_IMPLICATION(!flowThread() || flowThread()->isRender
MultiColumnFlowThread()); | 62 ASSERT_WITH_SECURITY_IMPLICATION(!flowThread() || flowThread()->isRender
MultiColumnFlowThread()); |
| 63 return static_cast<RenderMultiColumnFlowThread*>(flowThread()); | 63 return static_cast<RenderMultiColumnFlowThread*>(flowThread()); |
| 64 } | 64 } |
| 65 | 65 |
| 66 RenderMultiColumnSet* nextSiblingMultiColumnSet() const; | 66 RenderMultiColumnSet* nextSiblingMultiColumnSet() const; |
| 67 | 67 |
| 68 LayoutUnit logicalTopInFlowThread() const { return isHorizontalWritingMode()
? flowThreadPortionRect().y() : flowThreadPortionRect().x(); } |
| 68 LayoutUnit logicalBottomInFlowThread() const { return isHorizontalWritingMod
e() ? flowThreadPortionRect().maxY() : flowThreadPortionRect().maxX(); } | 69 LayoutUnit logicalBottomInFlowThread() const { return isHorizontalWritingMod
e() ? flowThreadPortionRect().maxY() : flowThreadPortionRect().maxX(); } |
| 69 | 70 |
| 70 unsigned computedColumnCount() const { return m_computedColumnCount; } | 71 unsigned computedColumnCount() const { return m_computedColumnCount; } |
| 71 LayoutUnit computedColumnWidth() const { return m_computedColumnWidth; } | 72 LayoutUnit computedColumnWidth() const { return m_computedColumnWidth; } |
| 72 LayoutUnit computedColumnHeight() const { return m_computedColumnHeight; } | 73 LayoutUnit computedColumnHeight() const { return m_computedColumnHeight; } |
| 73 | 74 |
| 74 void setComputedColumnWidthAndCount(LayoutUnit width, unsigned count) | 75 void setComputedColumnWidthAndCount(LayoutUnit width, unsigned count) |
| 75 { | 76 { |
| 76 m_computedColumnWidth = width; | 77 m_computedColumnWidth = width; |
| 77 m_computedColumnCount = count; | 78 m_computedColumnCount = count; |
| 78 } | 79 } |
| 79 | 80 |
| 80 // Find the column that contains the given block offset, and return the tran
slation needed to | 81 // Find the column that contains the given block offset, and return the tran
slation needed to |
| 81 // get from flow thread coordinates to visual coordinates. | 82 // get from flow thread coordinates to visual coordinates. |
| 82 LayoutSize flowThreadTranslationAtOffset(LayoutUnit) const; | 83 LayoutSize flowThreadTranslationAtOffset(LayoutUnit) const; |
| 83 | 84 |
| 84 LayoutUnit heightAdjustedForSetOffset(LayoutUnit height) const; | 85 LayoutUnit heightAdjustedForSetOffset(LayoutUnit height) const; |
| 85 | 86 |
| 86 void updateMinimumColumnHeight(LayoutUnit height) { m_minimumColumnHeight =
std::max(height, m_minimumColumnHeight); } | 87 void updateMinimumColumnHeight(LayoutUnit height) { m_minimumColumnHeight =
std::max(height, m_minimumColumnHeight); } |
| 87 LayoutUnit minimumColumnHeight() const { return m_minimumColumnHeight; } | 88 LayoutUnit minimumColumnHeight() const { return m_minimumColumnHeight; } |
| 88 | 89 |
| 89 unsigned forcedBreaksCount() const { return m_contentRuns.size(); } | 90 // Add a content run, specified by its end position. A content run is append
ed at every |
| 90 void clearForcedBreaks(); | 91 // forced/explicit break and at the end of the column set. The content runs
are used to |
| 91 void addForcedBreak(LayoutUnit offsetFromFirstPage); | 92 // determine where implicit/soft breaks will occur, in order to calculate an
initial column |
| 93 // height. |
| 94 void addContentRun(LayoutUnit endOffsetFromFirstPage); |
| 92 | 95 |
| 93 // (Re-)calculate the column height if it's auto. If 'initial' is set, guess
an initial column | 96 // (Re-)calculate the column height if it's auto. If 'initial' is set, guess
an initial column |
| 94 // height; otherwise, stretch the column height a tad. Return true if column
height changed and | 97 // height; otherwise, stretch the column height a tad. Return true if column
height changed and |
| 95 // another layout pass is required. | 98 // another layout pass is required. |
| 96 bool recalculateColumnHeight(bool initial); | 99 bool recalculateColumnHeight(bool initial); |
| 97 | 100 |
| 98 // Record space shortage (the amount of space that would have been enough to
prevent some | 101 // Record space shortage (the amount of space that would have been enough to
prevent some |
| 99 // element from being moved to the next column) at a column break. The small
est amount of space | 102 // element from being moved to the next column) at a column break. The small
est amount of space |
| 100 // shortage we find is the amount with which we will stretch the column heig
ht, if it turns out | 103 // shortage we find is the amount with which we will stretch the column heig
ht, if it turns out |
| 101 // after layout that the columns weren't tall enough. | 104 // after layout that the columns weren't tall enough. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 LayoutUnit m_computedColumnWidth; // Used column width (the resulting 'W' fr
om the pseudo-algorithm in the multicol spec) | 165 LayoutUnit m_computedColumnWidth; // Used column width (the resulting 'W' fr
om the pseudo-algorithm in the multicol spec) |
| 163 LayoutUnit m_computedColumnHeight; | 166 LayoutUnit m_computedColumnHeight; |
| 164 | 167 |
| 165 // The following variables are used when balancing the column set. | 168 // The following variables are used when balancing the column set. |
| 166 LayoutUnit m_maxColumnHeight; // Maximum column height allowed. | 169 LayoutUnit m_maxColumnHeight; // Maximum column height allowed. |
| 167 LayoutUnit m_minSpaceShortage; // The smallest amout of space shortage that
caused a column break. | 170 LayoutUnit m_minSpaceShortage; // The smallest amout of space shortage that
caused a column break. |
| 168 LayoutUnit m_minimumColumnHeight; | 171 LayoutUnit m_minimumColumnHeight; |
| 169 | 172 |
| 170 // A run of content without explicit (forced) breaks; i.e. a flow thread por
tion between two | 173 // A run of content without explicit (forced) breaks; i.e. a flow thread por
tion between two |
| 171 // explicit breaks, between flow thread start and an explicit break, between
an explicit break | 174 // explicit breaks, between flow thread start and an explicit break, between
an explicit break |
| 172 // and flow thread end, or, in cases when there are no explicit breaks at al
l: between flow flow | 175 // and flow thread end, or, in cases when there are no explicit breaks at al
l: between flow |
| 173 // thread start and flow thread end. We need to know where the explicit brea
ks are, in order to | 176 // thread portion start and flow thread portion end. We need to know where t
he explicit breaks |
| 174 // figure out where the implicit breaks will end up, so that we get the colu
mns properly | 177 // are, in order to figure out where the implicit breaks will end up, so tha
t we get the columns |
| 175 // balanced. A content run starts out as representing one single column, and
will represent one | 178 // properly balanced. A content run starts out as representing one single co
lumn, and will |
| 176 // additional column for each implicit break "inserted" there. | 179 // represent one additional column for each implicit break "inserted" there. |
| 177 class ContentRun { | 180 class ContentRun { |
| 178 public: | 181 public: |
| 179 ContentRun(LayoutUnit breakOffset) | 182 ContentRun(LayoutUnit breakOffset) |
| 180 : m_breakOffset(breakOffset) | 183 : m_breakOffset(breakOffset) |
| 181 , m_assumedImplicitBreaks(0) { } | 184 , m_assumedImplicitBreaks(0) { } |
| 182 | 185 |
| 183 unsigned assumedImplicitBreaks() const { return m_assumedImplicitBreaks;
} | 186 unsigned assumedImplicitBreaks() const { return m_assumedImplicitBreaks;
} |
| 184 void assumeAnotherImplicitBreak() { m_assumedImplicitBreaks++; } | 187 void assumeAnotherImplicitBreak() { m_assumedImplicitBreaks++; } |
| 185 LayoutUnit breakOffset() const { return m_breakOffset; } | 188 LayoutUnit breakOffset() const { return m_breakOffset; } |
| 186 | 189 |
| 187 // Return the column height that this content run would require, conside
ring the implicit | 190 // Return the column height that this content run would require, conside
ring the implicit |
| 188 // breaks assumed so far. | 191 // breaks assumed so far. |
| 189 LayoutUnit columnLogicalHeight(LayoutUnit startOffset) const { return ce
ilf((m_breakOffset - startOffset).toFloat() / float(m_assumedImplicitBreaks + 1)
); } | 192 LayoutUnit columnLogicalHeight(LayoutUnit startOffset) const { return ce
ilf((m_breakOffset - startOffset).toFloat() / float(m_assumedImplicitBreaks + 1)
); } |
| 190 | 193 |
| 191 private: | 194 private: |
| 192 LayoutUnit m_breakOffset; // Flow thread offset where this run ends. | 195 LayoutUnit m_breakOffset; // Flow thread offset where this run ends. |
| 193 unsigned m_assumedImplicitBreaks; // Number of implicit breaks in this r
un assumed so far. | 196 unsigned m_assumedImplicitBreaks; // Number of implicit breaks in this r
un assumed so far. |
| 194 }; | 197 }; |
| 195 Vector<ContentRun, 1> m_contentRuns; | 198 Vector<ContentRun, 1> m_contentRuns; |
| 196 }; | 199 }; |
| 197 | 200 |
| 198 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderMultiColumnSet, isRenderMultiColumnSet()); | 201 DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderMultiColumnSet, isRenderMultiColumnSet()); |
| 199 | 202 |
| 200 } // namespace WebCore | 203 } // namespace WebCore |
| 201 | 204 |
| 202 #endif // RenderMultiColumnSet_h | 205 #endif // RenderMultiColumnSet_h |
| 203 | 206 |
| OLD | NEW |