Changeset 156478 in webkit for trunk/Source/WebCore/rendering/RenderFlowThread.cpp
- Timestamp:
- Sep 26, 2013, 11:13:00 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/rendering/RenderFlowThread.cpp
r156451 r156478 237 237 // containers, but just adjusting the position of the RenderLayerBacking. 238 238 if (!m_needsTwoPhasesLayout) { 239 // If we have layers that moved from one region to another, we trigger 239 updateLayerToRegionMappings(); 240 // FIXME: If we have layers that moved from one region to another, we should trigger 240 241 // 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();243 242 } 244 243 #endif … … 252 251 253 252 #if USE(ACCELERATED_COMPOSITING) 254 bool RenderFlowThread::hasCompositingRegionDescendant() const255 {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) const265 {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.274 253 RenderRegion* RenderFlowThread::regionForCompositedLayer(RenderLayer* childLayer) 275 254 { 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)); 255 LayoutPoint leftTopLocation = childLayer->renderBox() ? childLayer->renderBox()->flipForWritingMode(LayoutPoint()) : LayoutPoint(); 256 LayoutPoint flowThreadOffset = flooredLayoutPoint(childLayer->renderer().localToContainerPoint(leftTopLocation, this, ApplyContainerFlip)); 287 257 return regionAtBlockOffset(0, flipForWritingMode(isHorizontalWritingMode() ? flowThreadOffset.y() : flowThreadOffset.x()), true, DisallowRegionAutoGeneration); 288 258 } 289 259 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) 260 void RenderFlowThread::updateRegionForRenderLayer(RenderLayer* layer, LayerToRegionMap& layerToRegionMap, RegionToLayerListMap& regionToLayerListMap, bool& needsLayerUpdate) 300 261 { 301 262 RenderRegion* region = regionForCompositedLayer(layer); 302 263 if (!needsLayerUpdate) { 264 ASSERT(m_layerToRegionMap); 303 265 // Figure out if we moved this layer from a region to the other. 304 RenderRegion* previousRegion = cachedRegionForCompositedLayer(layer);266 RenderRegion* previousRegion = m_layerToRegionMap->get(layer); 305 267 if (previousRegion != region) 306 268 needsLayerUpdate = true; 307 269 } 308 309 270 if (!region) 310 271 return; 311 312 272 layerToRegionMap.set(layer, region); 313 314 273 RegionToLayerListMap::iterator iterator = regionToLayerListMap.find(region); 315 274 RenderLayerList& list = iterator == regionToLayerListMap.end() ? regionToLayerListMap.set(region, RenderLayerList()).iterator->value : iterator->value; 316 ASSERT(!list.contains(layer));317 275 list.append(layer); 318 276 } 319 277 320 bool RenderFlowThread::update AllLayerToRegionMappings()278 bool RenderFlowThread::updateLayerToRegionMappings() 321 279 { 322 280 // We only need to map layers to regions for named flow threads. … … 331 289 332 290 // If the RenderFlowThread had a z-index layer update, then we need to update the composited layers too. 333 bool needsLayerUpdate = layer()->isDirtyRenderFlowThread() ||m_layersToRegionMappingsDirty || !m_layerToRegionMap.get();291 bool needsLayerUpdate = m_layersToRegionMappingsDirty || !m_layerToRegionMap.get(); 334 292 layer()->updateLayerListsIfNeeded(); 335 293 … … 337 295 RegionToLayerListMap regionToLayerListMap; 338 296 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); 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 } 344 314 345 315 if (needsLayerUpdate) { … … 348 318 m_layerToRegionMap->swap(layerToRegionMap); 349 319 350 if (!m_regionToLayerListMap)351 m_regionToLayerListMap = adoptPtr(new RegionToLayerListMap());352 m_regionToLayerListMap->swap(regionToLayerListMap);353 354 320 for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) { 355 321 RenderRegion* region = *iter; 356 region->setRequiresLayerForCompositing( m_regionToLayerListMap->contains(region));322 region->setRequiresLayerForCompositing(regionToLayerListMap.contains(region)); 357 323 } 358 324 }
Note:
See TracChangeset
for help on using the changeset viewer.