WebTransformationMatrix WebTransformOperations::blend(const WebTransformOperations& from, double progress) const { WebTransformationMatrix toReturn; bool fromIdentity = from.isIdentity(); bool toIdentity = isIdentity(); if (fromIdentity && toIdentity) return toReturn; if (matchesTypes(from)) { size_t numOperations = max(fromIdentity ? 0 : from.m_private->operations.size(), toIdentity ? 0 : m_private->operations.size()); for (size_t i = 0; i < numOperations; ++i) { WebTransformationMatrix blended = blendTransformOperations( fromIdentity ? 0 : &from.m_private->operations[i], toIdentity ? 0 : &m_private->operations[i], progress); toReturn.multiply(blended); } } else { toReturn = apply(); WebTransformationMatrix fromTransform = from.apply(); toReturn.blend(fromTransform, progress); } return toReturn; }
bool WebTransformOperations::matchesTypes(const WebTransformOperations& other) const { if (isIdentity() || other.isIdentity()) return true; if (m_private->operations.size() != other.m_private->operations.size()) return false; for (size_t i = 0; i < m_private->operations.size(); ++i) { if (m_private->operations[i].type != other.m_private->operations[i].type && !m_private->operations[i].isIdentity() && !other.m_private->operations[i].isIdentity()) return false; } return true; }