void TextureMapperLayer::computeTransformsRecursive() { if (m_size.isEmpty() && m_state.masksToBounds) return; // Compute transforms recursively on the way down to leafs. TransformationMatrix parentTransform; if (m_parent) parentTransform = m_parent->m_transform.combinedForChildren(); else if (m_effectTarget) parentTransform = m_effectTarget->m_transform.combined(); m_transform.combineTransforms(parentTransform); m_state.visible = m_state.backfaceVisibility || m_transform.combined().inverse().m33() >= 0; if (m_parent && m_parent->m_state.preserves3D) m_centerZ = m_transform.combined().mapPoint(FloatPoint3D(m_size.width() / 2, m_size.height() / 2, 0)).z(); if (m_state.maskLayer) m_state.maskLayer->computeTransformsRecursive(); if (m_state.replicaLayer) m_state.replicaLayer->computeTransformsRecursive(); for (size_t i = 0; i < m_children.size(); ++i) m_children[i]->computeTransformsRecursive(); // Reorder children if needed on the way back up. if (m_state.preserves3D) sortByZOrder(m_children, 0, m_children.size()); }
void TextureMapperLayer::computeTransformsRecursive() { if (m_state.size.isEmpty() && m_state.masksToBounds) return; // Compute transforms recursively on the way down to leafs. TransformationMatrix parentTransform; if (m_parent) parentTransform = m_parent->m_currentTransform.combinedForChildren(); else if (m_effectTarget) parentTransform = m_effectTarget->m_currentTransform.combined(); m_currentTransform.combineTransforms(parentTransform); m_state.visible = m_state.backfaceVisibility || !m_currentTransform.combined().isBackFaceVisible(); if (m_parent && m_parent->m_state.preserves3D) m_centerZ = m_currentTransform.combined().mapPoint(FloatPoint3D(m_state.size.width() / 2, m_state.size.height() / 2, 0)).z(); if (m_state.maskLayer) m_state.maskLayer->computeTransformsRecursive(); if (m_state.replicaLayer) m_state.replicaLayer->computeTransformsRecursive(); for (auto* child : m_children) { RELEASE_ASSERT(child->m_parent == this); child->computeTransformsRecursive(); } // Reorder children if needed on the way back up. if (m_state.preserves3D) sortByZOrder(m_children); }
void TextureMapperNode::performPostSyncOperations() { const LayerType prevLayerType = m_layerType; computeLayerType(); if (prevLayerType != m_layerType) m_state.dirty = true; if (m_transforms.dirty) setNeedsDisplay(); computeTransformations(); if (m_state.maskLayer && !m_state.dirty) m_state.dirty = m_state.maskLayer->m_state.dirty; if (m_state.replicaLayer && !m_state.dirty) m_state.dirty = m_state.replicaLayer->m_state.dirty; const int size = m_children.size(); for (int i = size - 1; i >= 0; --i) { TextureMapperNode* layer = m_children[i]; layer->performPostSyncOperations(); if (!m_state.dirty) m_state.dirty = layer->m_state.dirty; } m_state.hasSurfaceDescendants = hasSurfaceDescendants(); if (m_state.dirty) m_state.descendantsWithContent = countDescendantsWithContent(); if (m_state.preserves3D) sortByZOrder(m_children, 0, size); if (m_state.dirty) setNeedsDisplay(); }