Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(158)

Side by Side Diff: Source/core/rendering/FloatingObjects.h

Issue 131223003: Track intruding and overhanging floats (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 void setFrameRect(const LayoutRect& frameRect) { ASSERT(!isInPlacedTree()); m_frameRect = frameRect; } 77 void setFrameRect(const LayoutRect& frameRect) { ASSERT(!isInPlacedTree()); m_frameRect = frameRect; }
78 78
79 int paginationStrut() const { return m_paginationStrut; } 79 int paginationStrut() const { return m_paginationStrut; }
80 void setPaginationStrut(int strut) { m_paginationStrut = strut; } 80 void setPaginationStrut(int strut) { m_paginationStrut = strut; }
81 81
82 #ifndef NDEBUG 82 #ifndef NDEBUG
83 bool isInPlacedTree() const { return m_isInPlacedTree; } 83 bool isInPlacedTree() const { return m_isInPlacedTree; }
84 void setIsInPlacedTree(bool value) { m_isInPlacedTree = value; } 84 void setIsInPlacedTree(bool value) { m_isInPlacedTree = value; }
85 #endif 85 #endif
86 86
87 bool isOverhangingOrIntruding() const { return m_isOverhangingOrIntruding; }
88 void setIsOverhangingOrIntruding(bool value) { m_isOverhangingOrIntruding = value; }
89
87 bool shouldPaint() const { return m_shouldPaint; } 90 bool shouldPaint() const { return m_shouldPaint; }
88 void setShouldPaint(bool shouldPaint) { m_shouldPaint = shouldPaint; } 91 void setShouldPaint(bool shouldPaint) { m_shouldPaint = shouldPaint; }
89 bool isDescendant() const { return m_isDescendant; } 92 bool isDescendant() const { return m_isDescendant; }
90 void setIsDescendant(bool isDescendant) { m_isDescendant = isDescendant; } 93 void setIsDescendant(bool isDescendant) { m_isDescendant = isDescendant; }
91 94
92 // FIXME: Callers of these methods are dangerous and should be whitelisted e xplicitly or removed. 95 // FIXME: Callers of these methods are dangerous and should be whitelisted e xplicitly or removed.
93 RootInlineBox* originatingLine() const { return m_originatingLine; } 96 RootInlineBox* originatingLine() const { return m_originatingLine; }
94 void setOriginatingLine(RootInlineBox* line) { m_originatingLine = line; } 97 void setOriginatingLine(RootInlineBox* line) { m_originatingLine = line; }
95 98
96 private: 99 private:
97 explicit FloatingObject(RenderBox*); 100 explicit FloatingObject(RenderBox*);
98 FloatingObject(RenderBox*, Type, const LayoutRect&, bool shouldPaint, bool i sDescendant); 101 FloatingObject(RenderBox*, Type, const LayoutRect&, bool shouldPaint, bool i sDescendant);
99 102
100 RenderBox* m_renderer; 103 RenderBox* m_renderer;
101 RootInlineBox* m_originatingLine; 104 RootInlineBox* m_originatingLine;
102 LayoutRect m_frameRect; 105 LayoutRect m_frameRect;
103 int m_paginationStrut; // FIXME: Is this class size-sensitive? Does this nee d 32-bits? 106 int m_paginationStrut; // FIXME: Is this class size-sensitive? Does this nee d 32-bits?
104 107
105 unsigned m_type : 2; // Type (left or right aligned) 108 unsigned m_type : 2; // Type (left or right aligned)
106 unsigned m_shouldPaint : 1; 109 unsigned m_shouldPaint : 1;
107 unsigned m_isDescendant : 1; 110 unsigned m_isDescendant : 1;
108 unsigned m_isPlaced : 1; 111 unsigned m_isPlaced : 1;
109 #ifndef NDEBUG 112 #ifndef NDEBUG
110 unsigned m_isInPlacedTree : 1; 113 unsigned m_isInPlacedTree : 1;
111 #endif 114 #endif
115 unsigned m_isOverhangingOrIntruding : 1;
112 }; 116 };
113 117
114 struct FloatingObjectHashFunctions { 118 struct FloatingObjectHashFunctions {
115 static unsigned hash(FloatingObject* key) { return DefaultHash<RenderBox*>:: Hash::hash(key->renderer()); } 119 static unsigned hash(FloatingObject* key) { return DefaultHash<RenderBox*>:: Hash::hash(key->renderer()); }
116 static bool equal(FloatingObject* a, FloatingObject* b) { return a->renderer () == b->renderer(); } 120 static bool equal(FloatingObject* a, FloatingObject* b) { return a->renderer () == b->renderer(); }
117 static const bool safeToCompareToEmptyOrDeleted = true; 121 static const bool safeToCompareToEmptyOrDeleted = true;
118 }; 122 };
119 struct FloatingObjectHashTranslator { 123 struct FloatingObjectHashTranslator {
120 static unsigned hash(RenderBox* key) { return DefaultHash<RenderBox*>::Hash: :hash(key); } 124 static unsigned hash(RenderBox* key) { return DefaultHash<RenderBox*>::Hash: :hash(key); }
121 static bool equal(FloatingObject* a, RenderBox* b) { return a->renderer() == b; } 125 static bool equal(FloatingObject* a, RenderBox* b) { return a->renderer() == b; }
122 }; 126 };
123 typedef ListHashSet<FloatingObject*, 4, FloatingObjectHashFunctions> FloatingObj ectSet; 127 typedef ListHashSet<FloatingObject*, 4, FloatingObjectHashFunctions> FloatingObj ectSet;
124 typedef FloatingObjectSet::const_iterator FloatingObjectSetIterator; 128 typedef FloatingObjectSet::const_iterator FloatingObjectSetIterator;
125 typedef PODInterval<int, FloatingObject*> FloatingObjectInterval; 129 typedef PODInterval<int, FloatingObject*> FloatingObjectInterval;
126 typedef PODIntervalTree<int, FloatingObject*> FloatingObjectTree; 130 typedef PODIntervalTree<int, FloatingObject*> FloatingObjectTree;
127 typedef PODFreeListArena<PODRedBlackTree<FloatingObjectInterval>::Node> Interval Arena; 131 typedef PODFreeListArena<PODRedBlackTree<FloatingObjectInterval>::Node> Interval Arena;
128 typedef HashMap<RenderBox*, FloatingObject*> RendererToFloatInfoMap; 132 typedef HashMap<RenderBox*, FloatingObject*> RendererToFloatInfoMap;
129 133
130 class FloatingObjects { 134 class FloatingObjects {
131 WTF_MAKE_NONCOPYABLE(FloatingObjects); WTF_MAKE_FAST_ALLOCATED; 135 WTF_MAKE_NONCOPYABLE(FloatingObjects); WTF_MAKE_FAST_ALLOCATED;
132 public: 136 public:
133 FloatingObjects(const RenderBlockFlow*, bool horizontalWritingMode); 137 FloatingObjects(const RenderBlockFlow*, bool horizontalWritingMode);
134 ~FloatingObjects(); 138 ~FloatingObjects();
135 139
136 void clear(); 140 void clear();
141 void clearOverhangingAndIntrudingFloats();
137 void moveAllToFloatInfoMap(RendererToFloatInfoMap&); 142 void moveAllToFloatInfoMap(RendererToFloatInfoMap&);
138 FloatingObject* add(PassOwnPtr<FloatingObject>); 143 FloatingObject* add(PassOwnPtr<FloatingObject>);
144 FloatingObject* addOverhangingOrIntrudingFloat(PassOwnPtr<FloatingObject>);
139 void remove(FloatingObject*); 145 void remove(FloatingObject*);
140 void addPlacedObject(FloatingObject*); 146 void addPlacedObject(FloatingObject*);
141 void removePlacedObject(FloatingObject*); 147 void removePlacedObject(FloatingObject*);
142 void setHorizontalWritingMode(bool b = true) { m_horizontalWritingMode = b; } 148 void setHorizontalWritingMode(bool b = true) { m_horizontalWritingMode = b; }
143 149
144 bool hasLeftObjects() const { return m_leftObjectsCount > 0; } 150 bool hasLeftObjects() const { return m_leftObjectsCount > 0; }
145 bool hasRightObjects() const { return m_rightObjectsCount > 0; } 151 bool hasRightObjects() const { return m_rightObjectsCount > 0; }
146 const FloatingObjectSet& set() const { return m_set; } 152 const FloatingObjectSet& set() const { return m_set; }
147 void clearLineBoxTreePointers(); 153 void clearLineBoxTreePointers();
148 154
(...skipping 16 matching lines...) Expand all
165 { 171 {
166 if (!m_placedFloatsTree.isInitialized()) 172 if (!m_placedFloatsTree.isInitialized())
167 computePlacedFloatsTree(); 173 computePlacedFloatsTree();
168 return m_placedFloatsTree; 174 return m_placedFloatsTree;
169 } 175 }
170 void increaseObjectsCount(FloatingObject::Type); 176 void increaseObjectsCount(FloatingObject::Type);
171 void decreaseObjectsCount(FloatingObject::Type); 177 void decreaseObjectsCount(FloatingObject::Type);
172 FloatingObjectInterval intervalForFloatingObject(FloatingObject*); 178 FloatingObjectInterval intervalForFloatingObject(FloatingObject*);
173 179
174 FloatingObjectSet m_set; 180 FloatingObjectSet m_set;
181 FloatingObjectSet m_overhangingOrIntrudingSet;
175 FloatingObjectTree m_placedFloatsTree; 182 FloatingObjectTree m_placedFloatsTree;
176 unsigned m_leftObjectsCount; 183 unsigned m_leftObjectsCount;
177 unsigned m_rightObjectsCount; 184 unsigned m_rightObjectsCount;
178 bool m_horizontalWritingMode; 185 bool m_horizontalWritingMode;
179 const RenderBlockFlow* m_renderer; 186 const RenderBlockFlow* m_renderer;
180 187
181 struct FloatBottomCachedValue { 188 struct FloatBottomCachedValue {
182 FloatBottomCachedValue(); 189 FloatBottomCachedValue();
183 LayoutUnit value; 190 LayoutUnit value;
184 bool dirty; 191 bool dirty;
185 }; 192 };
186 FloatBottomCachedValue m_lowestFloatBottomCache[2]; 193 FloatBottomCachedValue m_lowestFloatBottomCache[2];
187 bool m_cachedHorizontalWritingMode; 194 bool m_cachedHorizontalWritingMode;
188 }; 195 };
189 196
190 #ifndef NDEBUG 197 #ifndef NDEBUG
191 // These structures are used by PODIntervalTree for debugging purposes. 198 // These structures are used by PODIntervalTree for debugging purposes.
192 template <> struct ValueToString<int> { 199 template <> struct ValueToString<int> {
193 static String string(const int value); 200 static String string(const int value);
194 }; 201 };
195 template<> struct ValueToString<FloatingObject*> { 202 template<> struct ValueToString<FloatingObject*> {
196 static String string(const FloatingObject*); 203 static String string(const FloatingObject*);
197 }; 204 };
198 #endif 205 #endif
199 206
200 } // namespace WebCore 207 } // namespace WebCore
201 208
202 #endif // FloatingObjects_h 209 #endif // FloatingObjects_h
OLDNEW
« no previous file with comments | « LayoutTests/fast/block/float/float-selection-delete-crash-expected.txt ('k') | Source/core/rendering/FloatingObjects.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698