/*
 * 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. 
 */

module css {

    // Introduced in DOM Level ?:
    interface [
        Constructor(in [Optional=DefaultIsNullString] DOMString cssValue),
        ConstructorRaisesException,
    ] 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;

        void setMatrixValue(in [Optional=DefaultIsUndefined] DOMString string) raises (DOMException);
        
        // Multiply this matrix by secondMatrix, on the right (result = this * secondMatrix)
        [Immutable] WebKitCSSMatrix multiply(in [Optional=DefaultIsUndefined] WebKitCSSMatrix secondMatrix);
        
        // Return the inverse of this matrix. Throw an exception if the matrix is not invertible
        [Immutable] WebKitCSSMatrix inverse() raises (DOMException);
        
        // 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(in [Optional=DefaultIsUndefined] double x, 
                                              in [Optional=DefaultIsUndefined] double y, 
                                              in [Optional=DefaultIsUndefined] 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(in [Optional=DefaultIsUndefined] double scaleX, 
                                          in [Optional=DefaultIsUndefined] double scaleY, 
                                          in [Optional=DefaultIsUndefined] 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(in [Optional=DefaultIsUndefined] double rotX, 
                                           in [Optional=DefaultIsUndefined] double rotY, 
                                           in [Optional=DefaultIsUndefined] 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(in [Optional=DefaultIsUndefined] double x, 
                                                    in [Optional=DefaultIsUndefined] double y, 
                                                    in [Optional=DefaultIsUndefined] double z, 
                                                    in [Optional=DefaultIsUndefined] 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(in [Optional=DefaultIsUndefined] 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(in [Optional=DefaultIsUndefined] double angle);

        [NotEnumerable] DOMString toString();
    };

}
