-/* $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
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 *);
+
/*
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 }
};
{ "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 }
};
}
+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;
+}