void RenderLayerStackingNode::rebuildZOrderLists(OwnPtr<Vector<RenderLayerStackingNode*> >& posZOrderList, OwnPtr<Vector<RenderLayerStackingNode*> >& negZOrderList, const RenderLayerStackingNode* nodeToForceAsStackingContainer, CollectLayersBehavior collectLayersBehavior) { for (RenderLayer* child = layer()->firstChild(); child; child = child->nextSibling()) { if (!layer()->reflectionInfo() || layer()->reflectionInfo()->reflectionLayer() != child) child->stackingNode()->collectLayers(posZOrderList, negZOrderList, nodeToForceAsStackingContainer, collectLayersBehavior); } // Sort the two lists. if (posZOrderList) std::stable_sort(posZOrderList->begin(), posZOrderList->end(), compareZIndex); if (negZOrderList) std::stable_sort(negZOrderList->begin(), negZOrderList->end(), compareZIndex); // Append layers for top layer elements after normal layer collection, to ensure they are on top regardless of z-indexes. // The renderers of top layer elements are children of the view, sorted in top layer stacking order. if (layer()->isRootLayer()) { RenderObject* view = renderer()->view(); for (RenderObject* child = view->firstChild(); child; child = child->nextSibling()) { Element* childElement = (child->node() && child->node()->isElementNode()) ? toElement(child->node()) : 0; if (childElement && childElement->isInTopLayer()) { RenderLayer* layer = toRenderLayerModelObject(child)->layer(); // Create the buffer if it doesn't exist yet. if (!posZOrderList) posZOrderList = adoptPtr(new Vector<RenderLayerStackingNode*>); posZOrderList->append(layer->stackingNode()); } } } }
void RenderSVGResourceContainer::addClientRenderLayer(Node* node) { ASSERT(node); if (!node->renderer() || !node->renderer()->hasLayer()) return; m_clientLayers.add(toRenderLayerModelObject(node->renderer())->layer()); }
void InspectorLayerTreeAgent::gatherLayersUsingRenderObjectHierarchy(ErrorString* errorString, RenderObject* renderer, RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::Layer> >& layers) { if (renderer->hasLayer()) { gatherLayersUsingRenderLayerHierarchy(errorString, toRenderLayerModelObject(renderer)->layer(), layers); return; } for (renderer = renderer->firstChildSlow(); renderer; renderer = renderer->nextSibling()) gatherLayersUsingRenderObjectHierarchy(errorString, renderer, layers); }
void InspectorLayerTreeAgent::didPaint(RenderObject* renderer, GraphicsContext*, const LayoutRect& rect) { RenderLayer* renderLayer = toRenderLayerModelObject(renderer)->layer(); CompositedLayerMapping* compositedLayerMapping = renderLayer->compositedLayerMapping(); // Should only happen for FrameView paints when compositing is off. Consider different instrumentation method for that. if (!compositedLayerMapping) return; GraphicsLayer* graphicsLayer = compositedLayerMapping->mainGraphicsLayer(); RefPtr<TypeBuilder::DOM::Rect> domRect = TypeBuilder::DOM::Rect::create() .setX(rect.x()) .setY(rect.y()) .setWidth(rect.width()) .setHeight(rect.height()); m_frontend->layerPainted(idForLayer(graphicsLayer), domRect.release()); }
RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() { if (!m_node || !m_node->renderer()) return 0; // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries // to find a suitable layer. RenderLayerModelObject* renderer = toRenderLayerModelObject(m_node->renderer()); RenderLayerModelObject* repaintContainer; do { repaintContainer = renderer->containerForRepaint(); if (!repaintContainer) { renderer = renderer->frame()->ownerRenderer(); if (!renderer) return 0; } } while (!repaintContainer); RenderLayer* renderLayer = repaintContainer->layer(); if (!renderLayer || !renderLayer->isComposited()) return 0; GraphicsLayer* newGraphicsLayer = renderLayer->backing()->graphicsLayer(); m_clipLayer->setSublayerTransform(SkMatrix44()); if (!newGraphicsLayer->drawsContent()) { if (renderLayer->usesCompositedScrolling()) { ASSERT(renderLayer->backing() && renderLayer->backing()->scrollingContentsLayer()); newGraphicsLayer = renderLayer->backing()->scrollingContentsLayer(); } else ASSERT_NOT_REACHED(); } if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->setLinkHighlight(this); } return renderLayer; }
RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() { if (!m_node || !m_node->renderer()) return 0; // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries // to find a suitable layer. RenderLayerModelObject* renderer = toRenderLayerModelObject(m_node->renderer()); RenderLayerModelObject* repaintContainer; do { repaintContainer = renderer->containerForRepaint(); if (!repaintContainer) { renderer = renderer->frame()->ownerRenderer(); if (!renderer) return 0; } } while (!repaintContainer); RenderLayer* renderLayer = repaintContainer->layer(); if (!renderLayer || !renderLayer->isComposited()) return 0; GraphicsLayerChromium* newGraphicsLayer = static_cast<GraphicsLayerChromium*>(renderLayer->backing()->graphicsLayer()); m_clipLayer->setSublayerTransform(SkMatrix44()); m_usingNonCompositedContentHost = !newGraphicsLayer->drawsContent(); if (m_usingNonCompositedContentHost ) { m_clipLayer->setSublayerTransform(newGraphicsLayer->platformLayer()->transform()); newGraphicsLayer = static_cast<GraphicsLayerChromium*>(m_owningWebViewImpl->nonCompositedContentHost()->topLevelRootLayer()); } if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->setLinkHighlight(this); } return renderLayer; }
void RenderLayerStackingNode::rebuildZOrderLists() { ASSERT(m_layerListMutationAllowed); ASSERT(isDirtyStackingContext()); for (RenderLayer* child = layer()->firstChild(); child; child = child->nextSibling()) { if (!layer()->reflectionInfo() || layer()->reflectionInfo()->reflectionLayer() != child) child->stackingNode()->collectLayers(m_posZOrderList, m_negZOrderList); } // Sort the two lists. if (m_posZOrderList) std::stable_sort(m_posZOrderList->begin(), m_posZOrderList->end(), compareZIndex); if (m_negZOrderList) std::stable_sort(m_negZOrderList->begin(), m_negZOrderList->end(), compareZIndex); // Append layers for top layer elements after normal layer collection, to ensure they are on top regardless of z-indexes. // The renderers of top layer elements are children of the view, sorted in top layer stacking order. if (layer()->isRootLayer()) { RenderView* view = renderer()->view(); for (RenderObject* child = view->firstChild(); child; child = child->nextSibling()) { Element* childElement = (child->node() && child->node()->isElementNode()) ? toElement(child->node()) : 0; if (childElement && childElement->isInTopLayer()) { RenderLayer* layer = toRenderLayerModelObject(child)->layer(); // Create the buffer if it doesn't exist yet. if (!m_posZOrderList) m_posZOrderList = adoptPtr(new Vector<RenderLayerStackingNode*>); m_posZOrderList->append(layer->stackingNode()); } } } #if ASSERT_ENABLED updateStackingParentForZOrderLists(this); #endif m_zOrderListsDirty = false; }
static inline bool isComposited(RenderObject* object) { return object->hasLayer() && toRenderLayerModelObject(object)->layer()->isComposited(); }