/*
 * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
 * Copyright (C) 2006 Apple Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

module svg {

    interface [Conditional=SVG] SVGTransform { 
        // Transform Types
        const unsigned short SVG_TRANSFORM_UNKNOWN = 0;
        const unsigned short SVG_TRANSFORM_MATRIX = 1;
        const unsigned short SVG_TRANSFORM_TRANSLATE = 2;
        const unsigned short SVG_TRANSFORM_SCALE = 3;
        const unsigned short SVG_TRANSFORM_ROTATE = 4;
        const unsigned short SVG_TRANSFORM_SKEWX = 5;
        const unsigned short SVG_TRANSFORM_SKEWY = 6;

        readonly attribute unsigned short type;
        readonly attribute SVGMatrix matrix;
        readonly attribute float angle;

        [StrictTypeChecking, RequiresAllArguments=Raise] void setMatrix(in SVGMatrix matrix);
        [StrictTypeChecking, RequiresAllArguments=Raise] void setTranslate(in float tx, in float ty);
        [StrictTypeChecking, RequiresAllArguments=Raise] void setScale(in float sx, in float sy);
        [StrictTypeChecking, RequiresAllArguments=Raise] void setRotate(in float angle, in float cx, in float cy);
        [StrictTypeChecking, RequiresAllArguments=Raise] void setSkewX(in float angle);
        [StrictTypeChecking, RequiresAllArguments=Raise] void setSkewY(in float angle);
    };

}
