2010-11-11 Alejandro G. Castro <alex@igalia.com>
[WebKit-https.git] / WebCore / bindings / js / JSSVGMatrixCustom.cpp
index db299ac..56f735e 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2009 Jeff Schiller <codedread@gmail.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
 
 #include "AffineTransform.h"
 #include "SVGException.h"
+#include <runtime/Error.h>
 
-using namespace KJS;
+using namespace JSC;
 
 namespace WebCore {
 
-JSValue* JSSVGMatrix::multiply(ExecState* exec, const ArgList& args)
+JSValue JSSVGMatrix::multiply(ExecState* exec)
 {
-    AffineTransform imp(*impl());
-
-    AffineTransform secondMatrix = toSVGMatrix(args[0]);    
-    return toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.multiply(secondMatrix)).get(), m_context.get());
-}
-
-JSValue* JSSVGMatrix::inverse(ExecState* exec, const ArgList&)
-{
-    AffineTransform imp(*impl());
-    KJS::JSValue* result = toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.inverse()).get(), m_context.get());
-
-    if (!imp.isInvertible())
-        setDOMException(exec, SVGException::SVG_MATRIX_NOT_INVERTABLE);
-
-    return result;
-}
+    if (exec->argumentCount() < 1)
+        return throwError(exec, createSyntaxError(exec, "Not enough arguments"));
 
-JSValue* JSSVGMatrix::translate(ExecState* exec, const ArgList& args)
-{
-    AffineTransform imp(*impl());
+    if (!exec->argument(0).inherits(&JSSVGMatrix::s_info))
+        return throwError(exec, createTypeError(exec, "secondMatrix argument was not a SVGMatrix"));
 
-    float x = args[0]->toFloat(exec);
-    float y = args[1]->toFloat(exec);
+    JSSVGMatrix* matrixObj = static_cast<JSSVGMatrix*>(asObject(exec->argument(0)));
 
-    return toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.translate(x, y)).get(), m_context.get());
-}
+    AffineTransform m1(*impl());
+    AffineTransform m2(*(matrixObj->impl()));
 
-JSValue* JSSVGMatrix::scale(ExecState* exec, const ArgList& args)
-{
-    AffineTransform imp(*impl());
-
-    float scaleFactor = args[0]->toFloat(exec);
-    return toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.scale(scaleFactor)).get(), m_context.get());
+    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
+    return toJS(exec, globalObject(), JSSVGStaticPODTypeWrapper<AffineTransform>::create(m1.multLeft(m2)).get(), context);
 }
 
-JSValue* JSSVGMatrix::scaleNonUniform(ExecState* exec, const ArgList& args)
+JSValue JSSVGMatrix::inverse(ExecState* exec)
 {
     AffineTransform imp(*impl());
 
-    float scaleFactorX = args[0]->toFloat(exec);
-    float scaleFactorY = args[1]->toFloat(exec);
-
-    return toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.scaleNonUniform(scaleFactorX, scaleFactorY)).get(), m_context.get());
-}
+    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
+    JSValue result = toJS(exec, globalObject(), JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.inverse()).get(), context);
 
-JSValue* JSSVGMatrix::rotate(ExecState* exec, const ArgList& args)
-{
-    AffineTransform imp(*impl());
+    if (!imp.isInvertible())
+        setDOMException(exec, SVGException::SVG_MATRIX_NOT_INVERTABLE);
 
-    float angle = args[0]->toFloat(exec);
-    return toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.rotate(angle)).get(), m_context.get());
+    return result;
 }
 
-JSValue* JSSVGMatrix::rotateFromVector(ExecState* exec, const ArgList& args)
+JSValue JSSVGMatrix::rotateFromVector(ExecState* exec)
 {
     AffineTransform imp(*impl());
  
-    float x = args[0]->toFloat(exec);
-    float y = args[1]->toFloat(exec);
+    float x = exec->argument(0).toFloat(exec);
+    float y = exec->argument(1).toFloat(exec);
 
-    KJS::JSValue* result = toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.rotateFromVector(x, y)).get(), m_context.get());
+    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
+    JSValue result = toJS(exec, globalObject(), JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.rotateFromVector(x, y)).get(), context);
 
     if (x == 0.0 || y == 0.0)
         setDOMException(exec, SVGException::SVG_INVALID_VALUE_ERR);
@@ -99,34 +77,6 @@ JSValue* JSSVGMatrix::rotateFromVector(ExecState* exec, const ArgList& args)
     return result;
 }
 
-JSValue* JSSVGMatrix::flipX(ExecState* exec, const ArgList&)
-{
-    AffineTransform imp(*impl());
-    return toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.flipX()).get(), m_context.get());
-}
-
-JSValue* JSSVGMatrix::flipY(ExecState* exec, const ArgList&)
-{
-    AffineTransform imp(*impl());
-    return toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.flipY()).get(), m_context.get());
-}
-
-JSValue* JSSVGMatrix::skewX(ExecState* exec, const ArgList& args)
-{
-    AffineTransform imp(*impl());
-
-    float angle = args[0]->toFloat(exec);
-    return toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.skewX(angle)).get(), m_context.get());
-}
-
-JSValue* JSSVGMatrix::skewY(ExecState* exec, const ArgList& args)
-{
-    AffineTransform imp(*impl());
-
-    float angle = args[0]->toFloat(exec);
-    return toJS(exec, JSSVGStaticPODTypeWrapper<AffineTransform>::create(imp.skewY(angle)).get(), m_context.get());
-}
-
 }
 
 #endif // ENABLE(SVG)