Esempio n. 1
0
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);
}