Boiler plate for canvas gradients and patterns.
authorrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Aug 2004 01:40:06 +0000 (01:40 +0000)
committerrjw <rjw@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 27 Aug 2004 01:40:06 +0000 (01:40 +0000)
        Reviewed by John.

        * khtml/ecma/kjs_html.cpp:
        (KJS::Context2DFunction::tryCall):
        (Context2D::tryPut):
        (Context2D::~Context2D):
        (KJS::GradientFunction::tryCall):
        (Gradient::Gradient):
        (Gradient::tryGet):
        (Gradient::getValueProperty):
        (Gradient::tryPut):
        (Gradient::putValue):
        (Gradient::~Gradient):
        (ImagePattern::ImagePattern):
        (ImagePattern::tryGet):
        (ImagePattern::getValueProperty):
        (ImagePattern::tryPut):
        (ImagePattern::putValue):
        (ImagePattern::~ImagePattern):
        * khtml/ecma/kjs_html.h:
        (KJS::Gradient::toBoolean):
        (KJS::Gradient::classInfo):
        (KJS::Gradient::):
        (KJS::ImagePattern::toBoolean):
        (KJS::ImagePattern::classInfo):
        (KJS::ImagePattern::):
        * khtml/ecma/kjs_html.lut.h:
        (KJS::):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7385 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/ecma/kjs_html.cpp
WebCore/khtml/ecma/kjs_html.h
WebCore/khtml/ecma/kjs_html.lut.h

index 16301e19c9e69ce44afd85ccec64a5cc04c6ba36..7b5a3bda618f5d2ede98ff1f04f94ed2e18ac99d 100644 (file)
@@ -1,3 +1,36 @@
+2004-08-26  Richard Williamson   <rjw@apple.com>
+
+        Boiler plate for canvas gradients and patterns.
+
+        Reviewed by John.
+
+        * khtml/ecma/kjs_html.cpp:
+        (KJS::Context2DFunction::tryCall):
+        (Context2D::tryPut):
+        (Context2D::~Context2D):
+        (KJS::GradientFunction::tryCall):
+        (Gradient::Gradient):
+        (Gradient::tryGet):
+        (Gradient::getValueProperty):
+        (Gradient::tryPut):
+        (Gradient::putValue):
+        (Gradient::~Gradient):
+        (ImagePattern::ImagePattern):
+        (ImagePattern::tryGet):
+        (ImagePattern::getValueProperty):
+        (ImagePattern::tryPut):
+        (ImagePattern::putValue):
+        (ImagePattern::~ImagePattern):
+        * khtml/ecma/kjs_html.h:
+        (KJS::Gradient::toBoolean):
+        (KJS::Gradient::classInfo):
+        (KJS::Gradient::):
+        (KJS::ImagePattern::toBoolean):
+        (KJS::ImagePattern::classInfo):
+        (KJS::ImagePattern::):
+        * khtml/ecma/kjs_html.lut.h:
+        (KJS::):
+
 2004-08-26  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by John
index ad6973e1be1e44d189ad7bea747e8f839f708c2a..7baec27f9a563204fdbfb91bc951563dafea3bb4 100644 (file)
@@ -3884,6 +3884,7 @@ Value KJS::Context2DFunction::tryCall(ExecState *exec, Object &thisObj, const Li
             break;
         }
         case Context2D::DrawImage: {
+            // FIXME:  Add support for other variants of arguments.
             if (args.size() != 6) {
                 Object err = Error::create(exec,SyntaxError);
                 exec->setException(err);
@@ -3972,15 +3973,56 @@ Value KJS::Context2DFunction::tryCall(ExecState *exec, Object &thisObj, const Li
         }
         
         case Context2D::CreateLinearGradient: {
-               // FIXME:  Implement gradients.
+            if (args.size() != 4) {
+                Object err = Error::create(exec,SyntaxError);
+                exec->setException(err);
+                return err;
+            }
+            float x0 = args[0].toNumber(exec);
+            float y0 = args[1].toNumber(exec);
+            float x1 = args[2].toNumber(exec);
+            float y1 = args[3].toNumber(exec);
+
+            return Object(new Gradient(x0, y0, x1, y1));
         }
         
         case Context2D::CreateRadialGradient: {
-               // FIXME:  Implement gradients.
+            if (args.size() != 6) {
+                Object err = Error::create(exec,SyntaxError);
+                exec->setException(err);
+                return err;
+            }
+            float x0 = args[0].toNumber(exec);
+            float y0 = args[1].toNumber(exec);
+            float r0 = args[2].toNumber(exec);
+            float x1 = args[3].toNumber(exec);
+            float y1 = args[4].toNumber(exec);
+            float r1 = args[5].toNumber(exec);
+
+            return Object(new Gradient(x0, y0, r0, x1, y1, r1));
         }
         
         case Context2D::CreatePattern: {
-               // FIXME:  Implement patterns.
+            if (args.size() != 2) {
+                Object err = Error::create(exec,SyntaxError);
+                exec->setException(err);
+                return err;
+            }
+            ObjectImp *o = static_cast<ObjectImp*>(args[0].imp());
+            if (o->type() != ObjectType || !o->inherits(&Image::info)) {
+                Object err = Error::create(exec,TypeError);
+                exec->setException(err);
+                return err;
+            }
+            int repetitionType = ImagePattern::Repeat;
+            QString repetitionString = args[1].toString(exec).qstring().lower();
+            if (repetitionString == "repeat-x")
+                repetitionType = ImagePattern::RepeatX;
+            else if (repetitionString == "repeat-y")
+                repetitionType = ImagePattern::RepeatY;
+            else if (repetitionString == "no-repeat")
+                repetitionType = ImagePattern::NoRepeat;
+            return Object(new ImagePattern(args[0], repetitionType));
         }
     }
 
@@ -4114,7 +4156,7 @@ Value Context2D::getValueProperty(ExecState *, int token) const
 
 void Context2D::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr)
 {
-    DOMObjectLookupPut<Context2D,DOMObject>(exec, propertyName, value, attr, &ImageTable, this );
+    DOMObjectLookupPut<Context2D,DOMObject>(exec, propertyName, value, attr, &Context2DTable, this );
 }
 
 CGContextRef Context2D::drawingContext()
@@ -4346,6 +4388,128 @@ Context2D::~Context2D()
 {
 }
 
+const ClassInfo KJS::Gradient::info = { "Gradient", 0, &GradientTable, 0 };
+
+/* Source for GradientTable. Use "make hashtables" to regenerate.
+@begin GradientTable 1
+  addColorStop             Gradient::AddColorStop                DontDelete|Function 2
+@end
+*/
+
+IMPLEMENT_PROTOFUNC(GradientFunction)
+
+Value KJS::GradientFunction::tryCall(ExecState *exec, Object &thisObj, const List &args)
+{
+    if (!thisObj.inherits(&Gradient::info)) {
+        Object err = Error::create(exec,TypeError);
+        exec->setException(err);
+        return err;
+    }
+
+    switch (id) {
+        case Gradient::AddColorStop: {
+            // FIXME:  Implement
+        }
+    }
+
+    return Undefined();
+}
+
+Gradient::Gradient(float x0, float y0, float x1, float y1)
+{
+    _gradientType = Gradient::Linear;
+    _x0 = x0;
+    _y0 = y0;
+    _x1 = x1;
+    _y1 = y1;
+}
+
+Gradient::Gradient(float x0, float y0, float r0, float x1, float y1, float r1)
+{
+    _gradientType = Gradient::Radial;
+    _x0 = x0;
+    _y0 = y0;
+    _r0 = r0;
+    _x1 = x1;
+    _y1 = y1;
+    _r1 = r1;
+}
+
+Value Gradient::tryGet(ExecState *exec, const Identifier &propertyName) const
+{
+    const HashTable* table = classInfo()->propHashTable; // get the right hashtable
+    const HashEntry* entry = Lookup::findEntry(table, propertyName);
+    if (entry) {
+        if (entry->attr & Function)
+            return lookupOrCreateFunction<KJS::GradientFunction>(exec, propertyName, this, entry->value, entry->params, entry->attr);
+        return getValueProperty(exec, entry->value);
+    }
+
+    return DOMObjectLookupGetValue<Gradient,DOMObject>(exec, propertyName, &GradientTable, this);
+}
+
+Value Gradient::getValueProperty(ExecState *, int token) const
+{
+    return Undefined();
+}
+
+void Gradient::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr)
+{
+    DOMObjectLookupPut<Gradient,DOMObject>(exec, propertyName, value, attr, &GradientTable, this );
+}
+
+void Gradient::putValue(ExecState *exec, int token, const Value& value, int /*attr*/)
+{
+}
+
+Gradient::~Gradient()
+{
+}
+
+const ClassInfo KJS::ImagePattern::info = { "ImagePattern", 0, &ImagePatternTable, 0 };
+
+/* Source for ImagePatternTable. Use "make hashtables" to regenerate.
+@begin ImagePatternTable 0
+@end
+*/
+
+ImagePattern::ImagePattern(Value i, int repetitionType)
+{
+    _repetitionType = repetitionType;
+    _image = i;
+}
+
+Value ImagePattern::tryGet(ExecState *exec, const Identifier &propertyName) const
+{
+    const HashTable* table = classInfo()->propHashTable; // get the right hashtable
+    const HashEntry* entry = Lookup::findEntry(table, propertyName);
+    if (entry) {
+        if (entry->attr & Function)
+            return lookupOrCreateFunction<KJS::GradientFunction>(exec, propertyName, this, entry->value, entry->params, entry->attr);
+        return getValueProperty(exec, entry->value);
+    }
+
+    return DOMObjectLookupGetValue<ImagePattern,DOMObject>(exec, propertyName, &ImagePatternTable, this);
+}
+
+Value ImagePattern::getValueProperty(ExecState *, int token) const
+{
+    return Undefined();
+}
+
+void ImagePattern::tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr)
+{
+    DOMObjectLookupPut<ImagePattern,DOMObject>(exec, propertyName, value, attr, &ImagePatternTable, this );
+}
+
+void ImagePattern::putValue(ExecState *exec, int token, const Value& value, int /*attr*/)
+{
+}
+
+ImagePattern::~ImagePattern()
+{
+}
+
 ////////////////////////////////////////////////////////////////
                      
 
index b9fa5de8ecc9b3fbd3db80fd5e0b974930690601..abb2fa382fc70964915e21a53f59e048e29d2f87 100644 (file)
@@ -311,6 +311,55 @@ private:
     Value _globalComposite;
   };
 
+  class Gradient : public DOMObject {
+  public:
+    //Gradient(const DOM::HTMLElement &e);
+    Gradient(float x0, float y0, float x1, float y1);
+    Gradient(float x0, float y0, float r0, float x1, float y1, float r1);
+    ~Gradient();
+    virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
+    Value getValueProperty(ExecState *exec, int token) const;
+    virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
+    void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
+    virtual bool toBoolean(ExecState *) const { return true; }
+    virtual const ClassInfo* classInfo() const { return &info; }
+    static const ClassInfo info;
+
+    enum { 
+        AddColorStop
+    };
+    
+    enum {
+        Radial, Linear
+    };
+
+private:    
+    int _gradientType;
+    float _x0, _y0, _r0, _x1, _y1, _r1;
+  };
+
+  class ImagePattern : public DOMObject {
+  public:
+    //ImagePattern(const DOM::HTMLElement &e);
+    ImagePattern(Value i, int type);
+    ~ImagePattern();
+    virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
+    Value getValueProperty(ExecState *exec, int token) const;
+    virtual void tryPut(ExecState *exec, const Identifier &propertyName, const Value& value, int attr = None);
+    void putValue(ExecState *exec, int token, const Value& value, int /*attr*/);
+    virtual bool toBoolean(ExecState *) const { return true; }
+    virtual const ClassInfo* classInfo() const { return &info; }
+    static const ClassInfo info;
+    
+    enum {
+        Repeat, RepeatX, RepeatY, NoRepeat
+    };
+    
+private:    
+    Value _image;
+    int _repetitionType;
+  };
+
   Value getHTMLCollection(ExecState *exec, const DOM::HTMLCollection &c);
   Value getSelectHTMLCollection(ExecState *exec, const DOM::HTMLCollection &c, const DOM::HTMLSelectElement &e);
 
index 8fa8d5e4ad98b458dc157b5f5baee97fa4f6b401..b6e9fd7957ad800162dea6bf746a3631b4e2b140 100644 (file)
@@ -1104,3 +1104,22 @@ const struct HashEntry Context2DTableEntries[] = {
 const struct HashTable Context2DTable = { 2, 61, Context2DTableEntries, 48 };
 
 } // namespace
+
+namespace KJS {
+
+const struct HashEntry GradientTableEntries[] = {
+   { "addColorStop", Gradient::AddColorStop, DontDelete|Function, 2, 0 }
+};
+
+const struct HashTable GradientTable = { 2, 1, GradientTableEntries, 1 };
+
+} // namespace
+
+namespace KJS {
+
+const struct HashEntry ImagePatternTableEntries[] = {
+};
+
+const struct HashTable ImagePatternTable = { 2, 0, ImagePatternTableEntries, 0 };
+
+} // namespace