Changeset 76836 in webkit
- Timestamp:
- Jan 27, 2011 2:02:02 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r76835 r76836 1 2011-01-27 Sheriff Bot <webkit.review.bot@gmail.com> 2 3 Unreviewed, rolling out r76825. 4 http://trac.webkit.org/changeset/76825 5 https://bugs.webkit.org/show_bug.cgi?id=53256 6 7 "caused crashes on GTK and chromium" (Requested by rniwa on 8 #webkit). 9 10 * rendering/RenderBoxModelObject.cpp: 11 (WebCore::ImageQualityController::keyDestroyed): 12 (WebCore::ImageQualityController::objectDestroyed): 13 (WebCore::ImageQualityController::highQualityRepaintTimerFired): 14 (WebCore::ImageQualityController::shouldPaintAtLowQuality): 15 (WebCore::imageQualityController): 16 (WebCore::RenderBoxModelObject::~RenderBoxModelObject): 17 1 18 2011-01-27 Adam Barth <abarth@webkit.org> 2 19 -
trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp
r76825 r76836 51 51 static const double cLowQualityTimeThreshold = 0.500; // 500 ms 52 52 53 typedef HashMap<const void*, IntSize> LayerSizeMap;54 typedef HashMap< RenderBoxModelObject*, LayerSizeMap> ObjectLayerSizeMap;53 typedef pair<RenderBoxModelObject*, const void*> LastPaintSizeMapKey; 54 typedef HashMap<LastPaintSizeMapKey, IntSize> LastPaintSizeMap; 55 55 56 56 // The HashMap for storing continuation pointers. … … 69 69 ImageQualityController(); 70 70 bool shouldPaintAtLowQuality(GraphicsContext*, RenderBoxModelObject*, Image*, const void* layer, const IntSize&); 71 void removeLayer(RenderBoxModelObject*, LayerSizeMap* innerMap, const void* layer); 72 void set(RenderBoxModelObject*, LayerSizeMap* innerMap, const void* layer, const IntSize&); 71 void keyDestroyed(LastPaintSizeMapKey key); 73 72 void objectDestroyed(RenderBoxModelObject*); 74 bool isEmpty() { return m_objectLayerSizeMap.isEmpty(); }75 73 76 74 private: … … 78 76 void restartTimer(); 79 77 80 ObjectLayerSizeMap m_objectLayerSizeMap;78 LastPaintSizeMap m_lastPaintSizeMap; 81 79 Timer<ImageQualityController> m_timer; 82 80 bool m_animatedResizeIsActive; … … 89 87 } 90 88 91 void ImageQualityController::removeLayer(RenderBoxModelObject* object, LayerSizeMap* innerMap, const void* layer) 92 { 93 if (innerMap) { 94 innerMap->remove(layer); 95 if (innerMap->isEmpty()) 96 objectDestroyed(object); 97 } 98 } 99 100 void ImageQualityController::set(RenderBoxModelObject* object, LayerSizeMap* innerMap, const void* layer, const IntSize& size) 101 { 102 if (innerMap) 103 innerMap->set(layer, size); 104 else { 105 LayerSizeMap newInnerMap; 106 newInnerMap.set(layer, size); 107 m_objectLayerSizeMap.set(object, newInnerMap); 89 void ImageQualityController::keyDestroyed(LastPaintSizeMapKey key) 90 { 91 m_lastPaintSizeMap.remove(key); 92 if (m_lastPaintSizeMap.isEmpty()) { 93 m_animatedResizeIsActive = false; 94 m_timer.stop(); 108 95 } 109 96 } … … 111 98 void ImageQualityController::objectDestroyed(RenderBoxModelObject* object) 112 99 { 113 m_objectLayerSizeMap.remove(object); 114 if (m_objectLayerSizeMap.isEmpty()) { 115 m_animatedResizeIsActive = false; 116 m_timer.stop(); 117 } 118 } 119 100 Vector<LastPaintSizeMapKey> keysToDie; 101 for (LastPaintSizeMap::iterator it = m_lastPaintSizeMap.begin(); it != m_lastPaintSizeMap.end(); ++it) 102 if (it->first.first == object) 103 keysToDie.append(it->first); 104 for (Vector<LastPaintSizeMapKey>::iterator it = keysToDie.begin(); it != keysToDie.end(); ++it) 105 keyDestroyed(*it); 106 } 107 120 108 void ImageQualityController::highQualityRepaintTimerFired(Timer<ImageQualityController>*) 121 109 { 122 110 if (m_animatedResizeIsActive) { 123 111 m_animatedResizeIsActive = false; 124 for ( ObjectLayerSizeMap::iterator it = m_objectLayerSizeMap.begin(); it != m_objectLayerSizeMap.end(); ++it)125 it->first ->repaint();112 for (LastPaintSizeMap::iterator it = m_lastPaintSizeMap.begin(); it != m_lastPaintSizeMap.end(); ++it) 113 it->first.first->repaint(); 126 114 } 127 115 } … … 143 131 IntSize imageSize(image->width(), image->height()); 144 132 145 // Look ourselves up in the hashtables. 146 ObjectLayerSizeMap::iterator i = m_objectLayerSizeMap.find(object); 147 LayerSizeMap* innerMap = i != m_objectLayerSizeMap.end() ? &i->second : 0; 148 IntSize oldSize; 149 bool isFirstResize = true; 150 if (innerMap) { 151 LayerSizeMap::iterator j = innerMap->find(layer); 152 if (j != innerMap->end()) { 153 isFirstResize = false; 154 oldSize = j->second; 155 } 156 } 133 // Look ourselves up in the hashtable. 134 LastPaintSizeMapKey key(object, layer); 135 LastPaintSizeMap::iterator i = m_lastPaintSizeMap.find(key); 157 136 158 137 const AffineTransform& currentTransform = context->getCTM(); … … 160 139 if (!contextIsScaled && imageSize == size) { 161 140 // There is no scale in effect. If we had a scale in effect before, we can just remove this object from the list. 162 removeLayer(object, innerMap, layer); 141 if (i != m_lastPaintSizeMap.end()) 142 m_lastPaintSizeMap.remove(key); 143 163 144 return false; 164 145 } … … 170 151 return true; 171 152 } 172 173 153 // If an animated resize is active, paint in low quality and kick the timer ahead. 174 154 if (m_animatedResizeIsActive) { 175 set(object, innerMap, layer, size);155 m_lastPaintSizeMap.set(key, size); 176 156 restartTimer(); 177 157 return true; … … 180 160 // same as the last resize, draw at high res, but record the paint 181 161 // size and set the timer. 182 if (i sFirstResize || oldSize == size) {162 if (i == m_lastPaintSizeMap.end() || size == i->second) { 183 163 restartTimer(); 184 set(object, innerMap, layer, size);164 m_lastPaintSizeMap.set(key, size); 185 165 return false; 186 166 } … … 188 168 // set the timer. 189 169 if (!m_timer.isActive()) { 190 removeLayer(object, innerMap, layer);170 keyDestroyed(key); 191 171 return false; 192 172 } … … 194 174 // is active, so draw at low quality, set the flag for animated resizes and 195 175 // the object to the list for high quality redraw. 196 set(object, innerMap, layer, size);176 m_lastPaintSizeMap.set(key, size); 197 177 m_animatedResizeIsActive = true; 198 178 restartTimer(); … … 200 180 } 201 181 202 static ImageQualityController* gImageQualityController = 0;203 204 182 static ImageQualityController* imageQualityController() 205 183 { 206 if (!gImageQualityController) 207 gImageQualityController = new ImageQualityController; 208 209 return gImageQualityController; 184 static ImageQualityController* controller = new ImageQualityController; 185 return controller; 210 186 } 211 187 … … 248 224 ASSERT(!hasLayer()); 249 225 ASSERT(!m_layer); 250 if (gImageQualityController) { 251 gImageQualityController->objectDestroyed(this); 252 if (gImageQualityController->isEmpty()) { 253 delete gImageQualityController; 254 gImageQualityController = 0; 255 } 256 } 226 imageQualityController()->objectDestroyed(this); 257 227 } 258 228
Note: See TracChangeset
for help on using the changeset viewer.