Changeset 156451 in webkit for trunk/Source/WebCore/rendering/RenderFlowThread.cpp
- Timestamp:
- Sep 26, 2013, 1:20:57 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/rendering/RenderFlowThread.cpp
r155211 r156451 237 237 // containers, but just adjusting the position of the RenderLayerBacking. 238 238 if (!m_needsTwoPhasesLayout) { 239 updateLayerToRegionMappings(); 240 // FIXME: If we have layers that moved from one region to another, we should trigger 239 // If we have layers that moved from one region to another, we trigger 241 240 // a composited layers rebuild in here to make sure that the regions will collect the right layers. 241 if (isOutOfFlowRenderFlowThread() && updateAllLayerToRegionMappings()) 242 layer()->compositor().setCompositingLayersNeedRebuild(); 242 243 } 243 244 #endif … … 251 252 252 253 #if USE(ACCELERATED_COMPOSITING) 254 bool RenderFlowThread::hasCompositingRegionDescendant() const 255 { 256 for (RenderRegionList::const_iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) { 257 RenderRegion* region = *iter; 258 if (region->hasLayer() && region->layer()->hasCompositingDescendant()) 259 return true; 260 } 261 return false; 262 } 263 264 const RenderLayerList* RenderFlowThread::getLayerListForRegion(RenderRegion* region) const 265 { 266 if (!m_regionToLayerListMap) 267 return 0; 268 ASSERT(!m_layersToRegionMappingsDirty); 269 RegionToLayerListMap::const_iterator iterator = m_regionToLayerListMap->find(region); 270 return iterator == m_regionToLayerListMap->end() ? 0 : &iterator->value; 271 } 272 273 // FIXME: make it const when it won't be calling regionAtBlockOffset. 253 274 RenderRegion* RenderFlowThread::regionForCompositedLayer(RenderLayer* childLayer) 254 275 { 255 LayoutPoint leftTopLocation = childLayer->renderBox() ? childLayer->renderBox()->flipForWritingMode(LayoutPoint()) : LayoutPoint(); 256 LayoutPoint flowThreadOffset = flooredLayoutPoint(childLayer->renderer().localToContainerPoint(leftTopLocation, this, ApplyContainerFlip)); 276 if (childLayer->renderBox()) { 277 RenderRegion* startRegion = 0; 278 RenderRegion* endRegion = 0; 279 getRegionRangeForBox(childLayer->renderBox(), startRegion, endRegion); 280 // The video tag is such a box that doesn't have a region range because it's inline (by default). 281 if (startRegion) 282 return startRegion; 283 } 284 285 // FIXME: remove this when we'll have region ranges for inlines as well. 286 LayoutPoint flowThreadOffset = flooredLayoutPoint(childLayer->renderer().localToContainerPoint(LayoutPoint(), this, ApplyContainerFlip)); 257 287 return regionAtBlockOffset(0, flipForWritingMode(isHorizontalWritingMode() ? flowThreadOffset.y() : flowThreadOffset.x()), true, DisallowRegionAutoGeneration); 258 288 } 259 289 260 void RenderFlowThread::updateRegionForRenderLayer(RenderLayer* layer, LayerToRegionMap& layerToRegionMap, RegionToLayerListMap& regionToLayerListMap, bool& needsLayerUpdate) 290 RenderRegion* RenderFlowThread::cachedRegionForCompositedLayer(RenderLayer* childLayer) const 291 { 292 if (!m_layerToRegionMap) 293 return 0; 294 ASSERT(!m_layersToRegionMappingsDirty); 295 return m_layerToRegionMap->get(childLayer); 296 } 297 298 // FIXME: Make it const when regionForCompositedLayer will be const. 299 void RenderFlowThread::updateLayerToRegionMappings(RenderLayer* layer, LayerToRegionMap& layerToRegionMap, RegionToLayerListMap& regionToLayerListMap, bool& needsLayerUpdate) 261 300 { 262 301 RenderRegion* region = regionForCompositedLayer(layer); 263 302 if (!needsLayerUpdate) { 264 ASSERT(m_layerToRegionMap);265 303 // Figure out if we moved this layer from a region to the other. 266 RenderRegion* previousRegion = m_layerToRegionMap->get(layer);304 RenderRegion* previousRegion = cachedRegionForCompositedLayer(layer); 267 305 if (previousRegion != region) 268 306 needsLayerUpdate = true; 269 307 } 308 270 309 if (!region) 271 310 return; 311 272 312 layerToRegionMap.set(layer, region); 313 273 314 RegionToLayerListMap::iterator iterator = regionToLayerListMap.find(region); 274 315 RenderLayerList& list = iterator == regionToLayerListMap.end() ? regionToLayerListMap.set(region, RenderLayerList()).iterator->value : iterator->value; 316 ASSERT(!list.contains(layer)); 275 317 list.append(layer); 276 318 } 277 319 278 bool RenderFlowThread::update LayerToRegionMappings()320 bool RenderFlowThread::updateAllLayerToRegionMappings() 279 321 { 280 322 // We only need to map layers to regions for named flow threads. … … 289 331 290 332 // If the RenderFlowThread had a z-index layer update, then we need to update the composited layers too. 291 bool needsLayerUpdate = m_layersToRegionMappingsDirty || !m_layerToRegionMap.get();333 bool needsLayerUpdate = layer()->isDirtyRenderFlowThread() || m_layersToRegionMappingsDirty || !m_layerToRegionMap.get(); 292 334 layer()->updateLayerListsIfNeeded(); 293 335 … … 295 337 RegionToLayerListMap regionToLayerListMap; 296 338 297 if (Vector<RenderLayer*>* negZOrderList = layer()->negZOrderList()) { 298 size_t listSize = negZOrderList->size(); 299 for (size_t i = 0; i < listSize; ++i) 300 updateRegionForRenderLayer(negZOrderList->at(i), layerToRegionMap, regionToLayerListMap, needsLayerUpdate); 301 } 302 303 if (Vector<RenderLayer*>* normalFlowList = layer()->normalFlowList()) { 304 size_t listSize = normalFlowList->size(); 305 for (size_t i = 0; i < listSize; ++i) 306 updateRegionForRenderLayer(normalFlowList->at(i), layerToRegionMap, regionToLayerListMap, needsLayerUpdate); 307 } 308 309 if (Vector<RenderLayer*>* posZOrderList = layer()->posZOrderList()) { 310 size_t listSize = posZOrderList->size(); 311 for (size_t i = 0; i < listSize; ++i) 312 updateRegionForRenderLayer(posZOrderList->at(i), layerToRegionMap, regionToLayerListMap, needsLayerUpdate); 313 } 339 RenderLayerList* lists[] = { layer()->negZOrderList(), layer()->normalFlowList(), layer()->posZOrderList()}; 340 for (size_t listIndex = 0; listIndex < sizeof(lists) / sizeof(lists[0]); ++listIndex) 341 if (RenderLayerList* list = lists[listIndex]) 342 for (size_t i = 0, listSize = list->size(); i < listSize; ++i) 343 updateLayerToRegionMappings(list->at(i), layerToRegionMap, regionToLayerListMap, needsLayerUpdate); 314 344 315 345 if (needsLayerUpdate) { … … 318 348 m_layerToRegionMap->swap(layerToRegionMap); 319 349 350 if (!m_regionToLayerListMap) 351 m_regionToLayerListMap = adoptPtr(new RegionToLayerListMap()); 352 m_regionToLayerListMap->swap(regionToLayerListMap); 353 320 354 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) { 321 355 RenderRegion* region = *iter; 322 region->setRequiresLayerForCompositing( regionToLayerListMap.contains(region));356 region->setRequiresLayerForCompositing(m_regionToLayerListMap->contains(region)); 323 357 } 324 358 }
Note:
See TracChangeset
for help on using the changeset viewer.