/*
 * 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([Optional=DefaultIsNullString] DOMString cssValue),
    RaisesException
] 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([Optional=DefaultIsUndefined] DOMString string);
    
    // Multiply this matrix by secondMatrix, on the right (result = this * secondMatrix)
    [Immutable] WebKitCSSMatrix multiply([Optional=DefaultIsUndefined] 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([Optional=DefaultIsUndefined] double x, 
                                          [Optional=DefaultIsUndefined] double y, 
                                          [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([Optional=DefaultIsUndefined] double scaleX, 
                                      [Optional=DefaultIsUndefined] double scaleY, 
                                      [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([Optional=DefaultIsUndefined] double rotX, 
                                       [Optional=DefaultIsUndefined] double rotY, 
                                       [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([Optional=DefaultIsUndefined] double x, 
                                                [Optional=DefaultIsUndefined] double y, 
                                                [Optional=DefaultIsUndefined] double z, 
                                                [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([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([Optional=DefaultIsUndefined] double angle);

    [NotEnumerable] DOMString toString();
};

