Only remains fonts+text functions to add
authorMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 25 Oct 2006 19:32:24 +0000 (19:32 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 25 Oct 2006 19:32:24 +0000 (19:32 +0000)
mmsoftware/js/classes/js_gd.c

index 005669d..18f8ccc 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: js_gd.c,v 1.3 2006/10/24 21:44:09 mmondor Exp $ */
+/* $Id: js_gd.c,v 1.4 2006/10/25 19:32:24 mmondor Exp $ */
 
 /*
  * Copyright (c) 2006, Matthew Mondor
@@ -277,6 +277,28 @@ static JSBool      gdimage_m_color_deallocate(JSContext *, JSObject *, uintN,
 static JSBool  gdimage_m_color_transparent(JSContext *, JSObject *, uintN,
                    jsval *, jsval *);
 
+static JSBool  gdimage_m_copy(JSContext *, JSObject *, uintN, jsval *,
+                   jsval *);
+static JSBool  gdimage_m_copy_resized(JSContext *, JSObject *, uintN, jsval *,
+                   jsval *);
+static JSBool  gdimage_m_copy_resampled(JSContext *, JSObject *, uintN,
+                   jsval *, jsval *);
+static JSBool  gdimage_m_copy_rotated(JSContext *, JSObject *, uintN, jsval *,
+                   jsval *);
+static JSBool  gdimage_m_copy_merge(JSContext *, JSObject *, uintN, jsval *,
+                   jsval *);
+static JSBool  gdimage_m_copy_merge_gray(JSContext *, JSObject *, uintN,
+                   jsval *, jsval *);
+static JSBool  gdimage_m_palette_copy(JSContext *, JSObject *, uintN, jsval *,
+                   jsval *);
+static JSBool  gdimage_m_square_to_circle(JSContext *, JSObject *, uintN,
+                   jsval *, jsval *);
+
+static JSBool  gdimage_m_compare(JSContext *, JSObject *, uintN, jsval *,
+                   jsval *);
+static JSBool  gdimage_m_interlace(JSContext *, JSObject *, uintN, jsval *,
+                   jsval *);
+
 
 
 /*
@@ -343,6 +365,15 @@ static struct property_spec        gd_sprops[] = {
        SP(gdEdged),
        SP(gdAlphaOpaque),
        SP(gdAlphaTransparent),
+       SP(GD_CMP_IMAGE),
+       SP(GD_CMP_NUM_COLORS),
+       SP(GD_CMP_COLOR),
+       SP(GD_CMP_SIZE_X),
+       SP(GD_CMP_SIZE_Y),
+       SP(GD_CMP_TRANSPARENT),
+       SP(GD_CMP_BACKGROUND),
+       SP(GD_CMP_INTERLACE),
+       SP(GD_CMP_TRUECOLOR),
        { NULL, 0 }
 };
 
@@ -445,6 +476,18 @@ static JSFunctionSpec gdimage_methods[] = {
        { "getTransparent", gdimage_m_get_transparent, 0, 0, 0 },
        { "colorDeallocate", gdimage_m_color_deallocate, 1, 0, 0 },
        { "colorTransparent", gdimage_m_color_transparent, 1, 0, 0 },
+
+       { "copy", gdimage_m_copy, 7, 0, 0 },
+       { "copyResized", gdimage_m_copy_resized, 9, 0, 0 },
+       { "copyResamped", gdimage_m_copy_resampled, 9, 0, 0 },
+       { "copyRotated", gdimage_m_copy_rotated, 8, 0, 0 },
+       { "copyMerge", gdimage_m_copy_merge, 8, 0, 0 },
+       { "copyMergeGray", gdimage_m_copy_merge_gray, 8, 0, 0 },
+       { "paletteCopy", gdimage_m_palette_copy, 1, 0, 0 },
+       { "squareToCircle", gdimage_m_square_to_circle, 1, 0, 0 },
+
+       { "compare", gdimage_m_compare, 1, 0, 0 },
+       { "interlace", gdimage_m_compare, 1, 0, 0 },
        { NULL, NULL, 0, 0, 0 }
 };
 
@@ -3262,3 +3305,422 @@ gdimage_m_color_transparent(JSContext *cx, JSObject *obj, uintN argc,
 }
 
 
+static JSBool
+gdimage_m_copy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+    jsval *rval)
+{
+       gdImagePtr      src, dst;
+       JSObject        *o;
+       int             i;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if (argc != 7) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_OBJECT(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       o = JSVAL_TO_OBJECT(argv[0]);
+       if (!JS_InstanceOf(cx, o, &gdimage_class, NULL)) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       for (i = 1; i < 7; i++) {
+               if (!JSVAL_IS_INT(argv[i])) {
+                       char    str[256];
+
+                       (void) snprintf(str, 255,
+                           "Argument %d not an Integer", i + 1);
+                       QUEUE_EXCEPTION(str);
+                       return JS_FALSE;
+               }
+       }
+
+       src = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(src != NULL);
+       dst = JS_GetInstancePrivate(cx, o, &gdimage_class, NULL);
+       assert(dst != NULL);
+
+       gdImageCopy(dst, src, JSVAL_TO_INT(argv[1]), JSVAL_TO_INT(argv[2]),
+           JSVAL_TO_INT(argv[3]), JSVAL_TO_INT(argv[4]),
+           JSVAL_TO_INT(argv[5]), JSVAL_TO_INT(argv[6]));
+
+       return JS_TRUE;
+}
+
+static JSBool
+gdimage_m_copy_resized(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+    jsval *rval)
+{
+       gdImagePtr      src, dst;
+       JSObject        *o;
+       int             i;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if (argc != 9) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_OBJECT(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       o = JSVAL_TO_OBJECT(argv[0]);
+       if (!JS_InstanceOf(cx, o, &gdimage_class, NULL)) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       for (i = 1; i < 9; i++) {
+               if (!JSVAL_IS_INT(argv[i])) {
+                       char    str[256];
+
+                       (void) snprintf(str, 255,
+                           "Argument %d not an Integer", i + 1);
+                       QUEUE_EXCEPTION(str);
+                       return JS_FALSE;
+               }
+       }
+
+       src = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(src != NULL);
+       dst = JS_GetInstancePrivate(cx, o, &gdimage_class, NULL);
+       assert(dst != NULL);
+
+       gdImageCopyResized(dst, src, JSVAL_TO_INT(argv[1]),
+           JSVAL_TO_INT(argv[2]), JSVAL_TO_INT(argv[3]),
+           JSVAL_TO_INT(argv[4]), JSVAL_TO_INT(argv[5]),
+           JSVAL_TO_INT(argv[6]), JSVAL_TO_INT(argv[7]),
+           JSVAL_TO_INT(argv[8]));
+
+       return JS_TRUE;
+}
+
+static JSBool
+gdimage_m_copy_resampled(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+    jsval *rval)
+{
+       gdImagePtr      src, dst;
+       JSObject        *o;
+       int             i;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if (argc != 9) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_OBJECT(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       o = JSVAL_TO_OBJECT(argv[0]);
+       if (!JS_InstanceOf(cx, o, &gdimage_class, NULL)) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       for (i = 1; i < 9; i++) {
+               if (!JSVAL_IS_INT(argv[i])) {
+                       char    str[256];
+
+                       (void) snprintf(str, 255,
+                           "Argument %d not an Integer", i + 1);
+                       QUEUE_EXCEPTION(str);
+                       return JS_FALSE;
+               }
+       }
+
+       src = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(src != NULL);
+       dst = JS_GetInstancePrivate(cx, o, &gdimage_class, NULL);
+       assert(dst != NULL);
+
+       gdImageCopyResampled(dst, src, JSVAL_TO_INT(argv[1]),
+           JSVAL_TO_INT(argv[2]), JSVAL_TO_INT(argv[3]),
+           JSVAL_TO_INT(argv[4]), JSVAL_TO_INT(argv[5]),
+           JSVAL_TO_INT(argv[6]), JSVAL_TO_INT(argv[7]),
+           JSVAL_TO_INT(argv[8]));
+
+       return JS_TRUE;
+}
+
+static JSBool
+gdimage_m_copy_rotated(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+    jsval *rval)
+{
+       gdImagePtr      src, dst;
+       JSObject        *o;
+       int             i;
+       jsdouble        dstx, dsty;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if (argc != 8) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_OBJECT(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       o = JSVAL_TO_OBJECT(argv[0]);
+       if (!JS_InstanceOf(cx, o, &gdimage_class, NULL)) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_NUMBER(argv[1]) ||
+           !JS_ValueToNumber(cx, argv[1], &dstx)) {
+               QUEUE_EXCEPTION("Argument 2 not a Number");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_NUMBER(argv[2]) ||
+           !JS_ValueToNumber(cx, argv[2], &dsty)) {
+               QUEUE_EXCEPTION("Argument 3 not a Number");
+               return JS_FALSE;
+       }
+       for (i = 3; i < 8; i++) {
+               if (!JSVAL_IS_INT(argv[i])) {
+                       char    str[256];
+
+                       (void) snprintf(str, 255,
+                           "Argument %d not an Integer", i + 1);
+                       QUEUE_EXCEPTION(str);
+                       return JS_FALSE;
+               }
+       }
+
+       src = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(src != NULL);
+       dst = JS_GetInstancePrivate(cx, o, &gdimage_class, NULL);
+       assert(dst != NULL);
+
+       gdImageCopyRotated(dst, src, (double)dstx, (double)dsty,
+           JSVAL_TO_INT(argv[3]), JSVAL_TO_INT(argv[4]),
+           JSVAL_TO_INT(argv[5]), JSVAL_TO_INT(argv[6]),
+           JSVAL_TO_INT(argv[7]));
+
+       return JS_TRUE;
+}
+
+static JSBool
+gdimage_m_copy_merge(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+    jsval *rval)
+{
+       gdImagePtr      src, dst;
+       JSObject        *o;
+       int             i;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if (argc != 8) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_OBJECT(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       o = JSVAL_TO_OBJECT(argv[0]);
+       if (!JS_InstanceOf(cx, o, &gdimage_class, NULL)) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       for (i = 1; i < 8; i++) {
+               if (!JSVAL_IS_INT(argv[i])) {
+                       char    str[256];
+
+                       (void) snprintf(str, 255,
+                           "Argument %d not an Integer", i + 1);
+                       QUEUE_EXCEPTION(str);
+                       return JS_FALSE;
+               }
+       }
+
+       src = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(src != NULL);
+       dst = JS_GetInstancePrivate(cx, o, &gdimage_class, NULL);
+       assert(dst != NULL);
+
+       gdImageCopyMerge(dst, src, JSVAL_TO_INT(argv[1]),
+           JSVAL_TO_INT(argv[2]), JSVAL_TO_INT(argv[3]),
+           JSVAL_TO_INT(argv[4]), JSVAL_TO_INT(argv[5]),
+           JSVAL_TO_INT(argv[6]), JSVAL_TO_INT(argv[7]));
+
+       return JS_TRUE;
+}
+
+static JSBool
+gdimage_m_copy_merge_gray(JSContext *cx, JSObject *obj, uintN argc,
+    jsval *argv, jsval *rval)
+{
+       gdImagePtr      src, dst;
+       JSObject        *o;
+       int             i;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if (argc != 8) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_OBJECT(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       o = JSVAL_TO_OBJECT(argv[0]);
+       if (!JS_InstanceOf(cx, o, &gdimage_class, NULL)) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       for (i = 1; i < 8; i++) {
+               if (!JSVAL_IS_INT(argv[i])) {
+                       char    str[256];
+
+                       (void) snprintf(str, 255,
+                           "Argument %d not an Integer", i + 1);
+                       QUEUE_EXCEPTION(str);
+                       return JS_FALSE;
+               }
+       }
+
+       src = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(src != NULL);
+       dst = JS_GetInstancePrivate(cx, o, &gdimage_class, NULL);
+       assert(dst != NULL);
+
+       gdImageCopyMergeGray(dst, src, JSVAL_TO_INT(argv[1]),
+           JSVAL_TO_INT(argv[2]), JSVAL_TO_INT(argv[3]),
+           JSVAL_TO_INT(argv[4]), JSVAL_TO_INT(argv[5]),
+           JSVAL_TO_INT(argv[6]), JSVAL_TO_INT(argv[7]));
+
+       return JS_TRUE;
+}
+
+static JSBool
+gdimage_m_palette_copy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+    jsval *rval)
+{
+       gdImagePtr      src, dst;
+       JSObject        *o;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if (argc != 1) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_OBJECT(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+       o = JSVAL_TO_OBJECT(argv[0]);
+       if (!JS_InstanceOf(cx, o, &gdimage_class, NULL)) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               return JS_FALSE;
+       }
+
+       src = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(src != NULL);
+       dst = JS_GetInstancePrivate(cx, o, &gdimage_class, NULL);
+       assert(dst != NULL);
+
+       gdImagePaletteCopy(dst, src);
+
+       return JS_TRUE;
+}
+
+static JSBool
+gdimage_m_square_to_circle(JSContext *cx, JSObject *obj, uintN argc,
+    jsval *argv, jsval *rval)
+{
+       gdImagePtr      img;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if (argc != 1) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_INT(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not an Integer");
+               return JS_FALSE;
+       }
+
+       img = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(img != NULL);
+
+       gdImageSquareToCircle(img, JSVAL_TO_INT(argv[0]));
+
+       return JS_TRUE;
+}
+
+
+/*
+ * Like the C function, returns a bitmap which may be compared against the
+ * GD.GD_CMP_* bits.
+ */
+static JSBool
+gdimage_m_compare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+    jsval *rval)
+{
+       gdImagePtr      img1, img2;
+       JSObject        *o;
+       int             v;
+
+       if (argc != 1) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               goto err;
+       }
+       if (!JSVAL_IS_OBJECT(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               goto err;
+       }
+       o = JSVAL_TO_OBJECT(argv[0]);
+       if (!JS_InstanceOf(cx, o, &gdimage_class, NULL)) {
+               QUEUE_EXCEPTION("Argument 1 not a GDImage object");
+               goto err;
+       }
+
+       img1 = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(img1 != NULL);
+       img2 = JS_GetInstancePrivate(cx, o, &gdimage_class, NULL);
+       assert(img2 != NULL);
+
+       v = gdImageCompare(img1, img2);
+       *rval = INT_TO_JSVAL(v);
+
+       return JS_TRUE;
+
+err:
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       return JS_FALSE;
+}
+
+static JSBool
+gdimage_m_interlace(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+    jsval *rval)
+{
+       gdImagePtr      img;
+
+       *rval = OBJECT_TO_JSVAL(NULL);
+
+       if (argc != 1) {
+               QUEUE_EXCEPTION("Wrong number of argumens");
+               return JS_FALSE;
+       }
+       if (!JSVAL_IS_BOOLEAN(argv[0])) {
+               QUEUE_EXCEPTION("Argument 1 not a Boolean");
+               return JS_FALSE;
+       }
+
+       img = JS_GetInstancePrivate(cx, obj, &gdimage_class, NULL);
+       assert(img != NULL);
+
+       gdImageInterlace(img, (int)JSVAL_TO_BOOLEAN(argv[0]));
+
+       return JS_TRUE;
+}