void RenderMultiColumnSet::prepareForLayout() { RenderBlockFlow* multicolBlock = toRenderBlockFlow(parent()); const RenderStyle& multicolStyle = multicolBlock->style(); // Set box logical top. ASSERT(!previousSiblingBox() || !previousSiblingBox()->isRenderMultiColumnSet()); // FIXME: multiple set not implemented; need to examine previous set to calculate the correct logical top. setLogicalTop(multicolBlock->borderAndPaddingBefore()); // Set box width. updateLogicalWidth(); if (multicolBlock->multiColumnFlowThread()->requiresBalancing()) { // Set maximum column height. We will not stretch beyond this. m_maxColumnHeight = RenderFlowThread::maxLogicalHeight(); if (!multicolStyle.logicalHeight().isAuto()) { m_maxColumnHeight = multicolBlock->computeContentLogicalHeight(multicolStyle.logicalHeight()); if (m_maxColumnHeight == -1) m_maxColumnHeight = RenderFlowThread::maxLogicalHeight(); } if (!multicolStyle.logicalMaxHeight().isUndefined()) { LayoutUnit logicalMaxHeight = multicolBlock->computeContentLogicalHeight(multicolStyle.logicalMaxHeight()); if (logicalMaxHeight != -1 && m_maxColumnHeight > logicalMaxHeight) m_maxColumnHeight = logicalMaxHeight; } m_maxColumnHeight = heightAdjustedForSetOffset(m_maxColumnHeight); m_computedColumnHeight = 0; // Restart balancing. } else setAndConstrainColumnHeight(heightAdjustedForSetOffset(multicolBlock->multiColumnFlowThread()->columnHeightAvailable())); clearForcedBreaks(); // Nuke previously stored minimum column height. Contents may have changed for all we know. m_minimumColumnHeight = 0; }
bool RenderMultiColumnSet::recalculateBalancedHeight(bool initial) { ASSERT(multiColumnFlowThread()->requiresBalancing()); LayoutUnit oldColumnHeight = m_computedColumnHeight; if (initial) distributeImplicitBreaks(); LayoutUnit newColumnHeight = calculateBalancedHeight(initial); setAndConstrainColumnHeight(newColumnHeight); // After having calculated an initial column height, the multicol container typically needs at // least one more layout pass with a new column height, but if a height was specified, we only // need to do this if we think that we need less space than specified. Conversely, if we // determined that the columns need to be as tall as the specified height of the container, we // have already laid it out correctly, and there's no need for another pass. if (m_computedColumnHeight == oldColumnHeight) return false; // No change. We're done. m_minSpaceShortage = RenderFlowThread::maxLogicalHeight(); clearForcedBreaks(); return true; // Need another pass. }