ColumnInfo.h revision cad810f21b803229eb11403f9209855525a25d57
1/* 2 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef ColumnInfo_h 27#define ColumnInfo_h 28 29#include <wtf/Vector.h> 30#include "IntRect.h" 31 32namespace WebCore { 33 34class ColumnInfo : public Noncopyable { 35public: 36 ColumnInfo() 37 : m_desiredColumnWidth(0) 38 , m_desiredColumnCount(1) 39 , m_columnCount(1) 40 , m_columnHeight(0) 41 , m_minimumColumnHeight(0) 42 , m_forcedBreaks(0) 43 , m_maximumDistanceBetweenForcedBreaks(0) 44 , m_forcedBreakOffset(0) 45 { } 46 47 int desiredColumnWidth() const { return m_desiredColumnWidth; } 48 void setDesiredColumnWidth(int width) { m_desiredColumnWidth = width; } 49 50 unsigned desiredColumnCount() const { return m_desiredColumnCount; } 51 void setDesiredColumnCount(unsigned count) { m_desiredColumnCount = count; } 52 53 unsigned columnCount() const { return m_columnCount; } 54 int columnHeight() const { return m_columnHeight; } 55 56 // Set our count and height. This is enough info for a RenderBlock to compute page rects 57 // dynamically. 58 void setColumnCountAndHeight(int count, int height) 59 { 60 m_columnCount = count; 61 m_columnHeight = height; 62 } 63 void setColumnHeight(int height) { m_columnHeight = height; } 64 65 void updateMinimumColumnHeight(int height) { m_minimumColumnHeight = std::max(height, m_minimumColumnHeight); } 66 int minimumColumnHeight() const { return m_minimumColumnHeight; } 67 68 int forcedBreaks() const { return m_forcedBreaks; } 69 int forcedBreakOffset() const { return m_forcedBreakOffset; } 70 int maximumDistanceBetweenForcedBreaks() const { return m_maximumDistanceBetweenForcedBreaks; } 71 void clearForcedBreaks() 72 { 73 m_forcedBreaks = 0; 74 m_maximumDistanceBetweenForcedBreaks = 0; 75 m_forcedBreakOffset = 0; 76 } 77 void addForcedBreak(int offsetFromFirstPage) 78 { 79 ASSERT(!m_columnHeight); 80 int distanceFromLastBreak = offsetFromFirstPage - m_forcedBreakOffset; 81 if (!distanceFromLastBreak) 82 return; 83 m_forcedBreaks++; 84 m_maximumDistanceBetweenForcedBreaks = std::max(m_maximumDistanceBetweenForcedBreaks, distanceFromLastBreak); 85 m_forcedBreakOffset = offsetFromFirstPage; 86 } 87 88private: 89 int m_desiredColumnWidth; 90 unsigned m_desiredColumnCount; 91 92 unsigned m_columnCount; 93 int m_columnHeight; 94 int m_minimumColumnHeight; 95 int m_forcedBreaks; // FIXME: We will ultimately need to cache more information to balance around forced breaks properly. 96 int m_maximumDistanceBetweenForcedBreaks; 97 int m_forcedBreakOffset; 98}; 99 100} 101 102#endif 103