Ref<TransformOperation> PerspectiveTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity) { if (from && !from->isSameType(*this)) return *this; if (blendToIdentity) { double p = floatValueForLength(m_p, 1); p = WebCore::blend(p, 1.0, progress); // FIXME: this seems wrong. https://bugs.webkit.org/show_bug.cgi?id=52700 return PerspectiveTransformOperation::create(Length(clampToPositiveInteger(p), Fixed)); } const PerspectiveTransformOperation* fromOp = downcast<PerspectiveTransformOperation>(from); Length fromP = fromOp ? fromOp->m_p : Length(m_p.type()); Length toP = m_p; TransformationMatrix fromT; TransformationMatrix toT; fromT.applyPerspective(floatValueForLength(fromP, 1)); toT.applyPerspective(floatValueForLength(toP, 1)); toT.blend(fromT, progress); TransformationMatrix::Decomposed4Type decomp; if (toT.decompose4(decomp)) { if (decomp.perspectiveZ) { double val = -1.0 / decomp.perspectiveZ; return PerspectiveTransformOperation::create(Length(clampToPositiveInteger(val), Fixed)); } } return PerspectiveTransformOperation::create(Length(0, Fixed)); }
PassRefPtr<TransformOperation> PerspectiveTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity) { if (from && !from->isSameType(*this)) return this; if (blendToIdentity) { double p = WebCore::blend(m_p, 1., progress); // FIXME: this seems wrong. https://bugs.webkit.org/show_bug.cgi?id=52700 return PerspectiveTransformOperation::create(clampToPositiveInteger(p)); } const PerspectiveTransformOperation* fromOp = static_cast<const PerspectiveTransformOperation*>(from); TransformationMatrix fromT; TransformationMatrix toT; fromT.applyPerspective(fromOp ? fromOp->m_p : 0); toT.applyPerspective(m_p); toT.blend(fromT, progress); TransformationMatrix::DecomposedType decomp; toT.decompose(decomp); if (decomp.perspectiveZ) { double val = -1.0 / decomp.perspectiveZ; return PerspectiveTransformOperation::create(clampToPositiveInteger(val)); } return PerspectiveTransformOperation::create(0); }
PassRefPtr<TransformOperation> PerspectiveTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity) { if (from && !from->isSameType(*this)) return this; if (blendToIdentity) return PerspectiveTransformOperation::create(m_p + (1. - m_p) * progress); const PerspectiveTransformOperation* fromOp = static_cast<const PerspectiveTransformOperation*>(from); double fromP = fromOp ? fromOp->m_p : 0; double toP = m_p; TransformationMatrix fromT; TransformationMatrix toT; fromT.applyPerspective(fromP); toT.applyPerspective(toP); toT.blend(fromT, progress); TransformationMatrix::DecomposedType decomp; toT.decompose(decomp); return PerspectiveTransformOperation::create(decomp.perspectiveZ ? -1.0 / decomp.perspectiveZ : 0.0); }