Beispiel #1
0
String SVGTransform::valueAsString() const
{
    const String& prefix = transformTypePrefixForParsing(m_type);
    switch (m_type) {
    case SVG_TRANSFORM_UNKNOWN:
        return prefix;
    case SVG_TRANSFORM_MATRIX: {
        StringBuilder builder;
        builder.append(prefix + String::number(m_matrix.a()) + ' ' + String::number(m_matrix.b()) + ' ' + String::number(m_matrix.c()) + ' ' +
                       String::number(m_matrix.d()) + ' ' + String::number(m_matrix.e()) + ' ' + String::number(m_matrix.f()) + ')');
        return builder.toString();
    }
    case SVG_TRANSFORM_TRANSLATE:
        return prefix + String::number(m_matrix.e()) + ' ' + String::number(m_matrix.f()) + ')';
    case SVG_TRANSFORM_SCALE:
        return prefix + String::number(m_matrix.xScale()) + ' ' + String::number(m_matrix.yScale()) + ')';
    case SVG_TRANSFORM_ROTATE: {
        double angleInRad = deg2rad(m_angle);
        double cosAngle = cos(angleInRad);
        double sinAngle = sin(angleInRad);
        float cx = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * (1 - cosAngle) - m_matrix.f() * sinAngle) / (1 - cosAngle) / 2 : 0);
        float cy = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * sinAngle / (1 - cosAngle) + m_matrix.f()) / 2 : 0);
        if (cx || cy)
            return prefix + String::number(m_angle) + ' ' + String::number(cx) + ' ' + String::number(cy) + ')';
        return prefix + String::number(m_angle) + ')';
    }
    case SVG_TRANSFORM_SKEWX:
        return prefix + String::number(m_angle) + ')';
    case SVG_TRANSFORM_SKEWY:
        return prefix + String::number(m_angle) + ')';
    }

    ASSERT_NOT_REACHED();
    return emptyString();
}
String SVGTransform::valueAsString() const
{
    double arguments[6];
    size_t argumentCount = 0;
    switch (m_transformType) {
    case SVG_TRANSFORM_UNKNOWN:
        return emptyString();
    case SVG_TRANSFORM_MATRIX: {
        arguments[argumentCount++] = m_matrix.a();
        arguments[argumentCount++] = m_matrix.b();
        arguments[argumentCount++] = m_matrix.c();
        arguments[argumentCount++] = m_matrix.d();
        arguments[argumentCount++] = m_matrix.e();
        arguments[argumentCount++] = m_matrix.f();
        break;
    }
    case SVG_TRANSFORM_TRANSLATE: {
        arguments[argumentCount++] = m_matrix.e();
        arguments[argumentCount++] = m_matrix.f();
        break;
    }
    case SVG_TRANSFORM_SCALE: {
        arguments[argumentCount++] = m_matrix.a();
        arguments[argumentCount++] = m_matrix.d();
        break;
    }
    case SVG_TRANSFORM_ROTATE: {
        arguments[argumentCount++] = m_angle;

        double angleInRad = deg2rad(m_angle);
        double cosAngle = cos(angleInRad);
        double sinAngle = sin(angleInRad);
        float cx = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * (1 - cosAngle) - m_matrix.f() * sinAngle) / (1 - cosAngle) / 2 : 0);
        float cy = narrowPrecisionToFloat(cosAngle != 1 ? (m_matrix.e() * sinAngle / (1 - cosAngle) + m_matrix.f()) / 2 : 0);
        if (cx || cy) {
            arguments[argumentCount++] = cx;
            arguments[argumentCount++] = cy;
        }
        break;
    }
    case SVG_TRANSFORM_SKEWX:
        arguments[argumentCount++] = m_angle;
        break;
    case SVG_TRANSFORM_SKEWY:
        arguments[argumentCount++] = m_angle;
        break;
    }
    ASSERT(argumentCount <= WTF_ARRAY_LENGTH(arguments));

    StringBuilder builder;
    builder.append(transformTypePrefixForParsing(m_transformType));

    for (size_t i = 0; i < argumentCount; ++i) {
        if (i)
            builder.append(' ');
        builder.appendNumber(arguments[i]);
    }
    builder.append(')');
    return builder.toString();
}