/*
 * Copyright (C) 2008 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 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 DOMString string) raises (DOMException);
        
        // Multiply this matrix by secondMatrix, on the right (result = this * secondMatrix)
        [Immutable] WebKitCSSMatrix multiply(in 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 double x, in double y, in 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 double scaleX, in double scaleY, in 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 double rotX, in double rotY, in 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 double x, in double y, in double z, in double angle);
        
        [DontEnum] DOMString toString();
    };

}
