/*
 * Copyright (C) 2008, 2010 Apple Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

// Introduced in DOM Level ?:
[
    Constructor([Default=NullString] optional DOMString cssValue),
    ImplementedAs=CSSMatrix,
    RaisesException=Constructor
] interface WebKitCSSMatrix {

    // These attributes are simple aliases for certain elements of the 4x4 matrix
    attribute double a; // alias for m11
    attribute double b; // alias for m12
    attribute double c; // alias for m21
    attribute double d; // alias for m22
    attribute double e; // alias for m41
    attribute double f; // alias for m42

    attribute double m11;
    attribute double m12;
    attribute double m13;
    attribute double m14;
    attribute double m21;
    attribute double m22;
    attribute double m23;
    attribute double m24;
    attribute double m31;
    attribute double m32;
    attribute double m33;
    attribute double m34;
    attribute double m41;
    attribute double m42;
    attribute double m43;
    attribute double m44;

    [RaisesException] void setMatrixValue([Default=Undefined] optional DOMString string);

    // Multiply this matrix by secondMatrix, on the right (result = this * secondMatrix)
    [Immutable] WebKitCSSMatrix multiply([Default=Undefined] optional WebKitCSSMatrix secondMatrix);

    // Return the inverse of this matrix. Throw an exception if the matrix is not invertible
    [Immutable, RaisesException] WebKitCSSMatrix inverse();

    // Return this matrix translated by the passed values.
    // Passing a NaN will use a value of 0. This allows the 3D form to used for 2D operations
    [Immutable] WebKitCSSMatrix translate([Default=Undefined] optional double x,
                                          [Default=Undefined] optional double y,
                                          [Default=Undefined] optional double z);

    // Returns this matrix scaled by the passed values.
    // Passing scaleX or scaleZ as NaN uses a value of 1, but passing scaleY of NaN
    // makes it the same as scaleX. This allows the 3D form to used for 2D operations
    [Immutable] WebKitCSSMatrix scale([Default=Undefined] optional double scaleX,
                                      [Default=Undefined] optional double scaleY,
                                      [Default=Undefined] optional double scaleZ);

    // Returns this matrix rotated by the passed values.
    // If rotY and rotZ are NaN, rotate about Z (rotX=0, rotateY=0, rotateZ=rotX).
    // Otherwise use a rotation value of 0 for any passed NaN.
    [Immutable] WebKitCSSMatrix rotate([Default=Undefined] optional double rotX,
                                       [Default=Undefined] optional double rotY,
                                       [Default=Undefined] optional double rotZ);

    // Returns this matrix rotated about the passed axis by the passed angle.
    // Passing a NaN will use a value of 0. If the axis is (0,0,0) use a value
    // of (0,0,1).
    [Immutable] WebKitCSSMatrix rotateAxisAngle([Default=Undefined] optional double x,
                                                [Default=Undefined] optional double y,
                                                [Default=Undefined] optional double z,
                                                [Default=Undefined] optional double angle);

    // Returns this matrix skewed along the X axis by the passed values.
    // Passing a NaN will use a value of 0.
    [Immutable] WebKitCSSMatrix skewX([Default=Undefined] optional double angle);

    // Returns this matrix skewed along the Y axis by the passed values.
    // Passing a NaN will use a value of 0.
    [Immutable] WebKitCSSMatrix skewY([Default=Undefined] optional double angle);

    [NotEnumerable] DOMString toString();
};

