static std::unique_ptr<Array<protocol::LayerTree::ScrollRect>> buildScrollRectsForLayer(GraphicsLayer* graphicsLayer, bool reportWheelScrollers) { std::unique_ptr<Array<protocol::LayerTree::ScrollRect>> scrollRects = Array<protocol::LayerTree::ScrollRect>::create(); WebLayer* webLayer = graphicsLayer->platformLayer(); WebVector<WebRect> nonFastScrollableRects = webLayer->nonFastScrollableRegion(); for (size_t i = 0; i < nonFastScrollableRects.size(); ++i) { scrollRects->addItem(buildScrollRect( nonFastScrollableRects[i], protocol::LayerTree::ScrollRect::TypeEnum::RepaintsOnScroll)); } WebVector<WebRect> touchEventHandlerRects = webLayer->touchEventHandlerRegion(); for (size_t i = 0; i < touchEventHandlerRects.size(); ++i) { scrollRects->addItem(buildScrollRect( touchEventHandlerRects[i], protocol::LayerTree::ScrollRect::TypeEnum::TouchEventHandler)); } if (reportWheelScrollers) { WebRect webRect(webLayer->position().x, webLayer->position().y, webLayer->bounds().width, webLayer->bounds().height); scrollRects->addItem(buildScrollRect( webRect, protocol::LayerTree::ScrollRect::TypeEnum::WheelEventHandler)); } return scrollRects->length() ? std::move(scrollRects) : nullptr; }
static PassRefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect> > buildScrollRectsForLayer(GraphicsLayer* graphicsLayer) { RefPtr<TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect> > scrollRects = TypeBuilder::Array<TypeBuilder::LayerTree::ScrollRect>::create(); WebLayer* webLayer = graphicsLayer->platformLayer(); for (size_t i = 0; i < webLayer->nonFastScrollableRegion().size(); ++i) { scrollRects->addItem(buildScrollRect(webLayer->nonFastScrollableRegion()[i], TypeBuilder::LayerTree::ScrollRect::Type::RepaintsOnScroll)); } for (size_t i = 0; i < webLayer->touchEventHandlerRegion().size(); ++i) { scrollRects->addItem(buildScrollRect(webLayer->touchEventHandlerRegion()[i], TypeBuilder::LayerTree::ScrollRect::Type::TouchEventHandler)); } if (webLayer->haveWheelEventHandlers()) { WebRect webRect(webLayer->position().x, webLayer->position().y, webLayer->bounds().width, webLayer->bounds().height); scrollRects->addItem(buildScrollRect(webRect, TypeBuilder::LayerTree::ScrollRect::Type::WheelEventHandler)); } return scrollRects->length() ? scrollRects.release() : nullptr; }
static std::unique_ptr<protocol::LayerTree::Layer> buildObjectForLayer( GraphicsLayer* graphicsLayer, int nodeId, bool reportWheelEventListeners) { WebLayer* webLayer = graphicsLayer->platformLayer(); std::unique_ptr<protocol::LayerTree::Layer> layerObject = protocol::LayerTree::Layer::create() .setLayerId(idForLayer(graphicsLayer)) .setOffsetX(webLayer->position().x) .setOffsetY(webLayer->position().y) .setWidth(webLayer->bounds().width) .setHeight(webLayer->bounds().height) .setPaintCount(graphicsLayer->paintCount()) .setDrawsContent(webLayer->drawsContent()) .build(); if (nodeId) layerObject->setBackendNodeId(nodeId); GraphicsLayer* parent = graphicsLayer->parent(); if (parent) layerObject->setParentLayerId(idForLayer(parent)); if (!graphicsLayer->contentsAreVisible()) layerObject->setInvisible(true); const TransformationMatrix& transform = graphicsLayer->transform(); if (!transform.isIdentity()) { TransformationMatrix::FloatMatrix4 flattenedMatrix; transform.toColumnMajorFloatArray(flattenedMatrix); std::unique_ptr<Array<double>> transformArray = Array<double>::create(); for (size_t i = 0; i < WTF_ARRAY_LENGTH(flattenedMatrix); ++i) transformArray->addItem(flattenedMatrix[i]); layerObject->setTransform(std::move(transformArray)); const FloatPoint3D& transformOrigin = graphicsLayer->transformOrigin(); // FIXME: rename these to setTransformOrigin* if (webLayer->bounds().width > 0) layerObject->setAnchorX(transformOrigin.x() / webLayer->bounds().width); else layerObject->setAnchorX(0.0); if (webLayer->bounds().height > 0) layerObject->setAnchorY(transformOrigin.y() / webLayer->bounds().height); else layerObject->setAnchorY(0.0); layerObject->setAnchorZ(transformOrigin.z()); } std::unique_ptr<Array<protocol::LayerTree::ScrollRect>> scrollRects = buildScrollRectsForLayer(graphicsLayer, reportWheelEventListeners); if (scrollRects) layerObject->setScrollRects(std::move(scrollRects)); return layerObject; }