From 8db2c3a291af81c4e4b739148607166e55a42076 Mon Sep 17 00:00:00 2001
From: "Mirar (Pontus Hagland)" <pike@sort.mirar.org>
Date: Sun, 23 May 1999 19:47:04 +0200
Subject: [PATCH] image module startup changed, using headerfile initstuff.h

Rev: src/modules/Image/Makefile.in:1.23
Rev: src/modules/Image/colors.c:1.17
Rev: src/modules/Image/colortable.c:1.67
Rev: src/modules/Image/encodings/Makefile.in:1.26
Rev: src/modules/Image/encodings/_xpm.c:1.7
Rev: src/modules/Image/encodings/any.c:1.9
Rev: src/modules/Image/encodings/avs.c:1.6
Rev: src/modules/Image/encodings/bmp.c:1.14
Rev: src/modules/Image/encodings/gif.c:1.48
Rev: src/modules/Image/encodings/hrz.c:1.2
Rev: src/modules/Image/encodings/ilbm.c:1.11
Rev: src/modules/Image/encodings/pcx.c:1.6
Rev: src/modules/Image/encodings/png.c:1.24
Rev: src/modules/Image/encodings/pnm.c:1.19
Rev: src/modules/Image/encodings/psd.c:1.10
Rev: src/modules/Image/encodings/tga.c:1.7
Rev: src/modules/Image/encodings/x.c:1.22
Rev: src/modules/Image/encodings/xbm.c:1.5
Rev: src/modules/Image/encodings/xcf.c:1.8
Rev: src/modules/Image/encodings/xwd.c:1.12
Rev: src/modules/Image/font.c:1.48
Rev: src/modules/Image/image.c:1.136
Rev: src/modules/Image/image.h:1.32
Rev: src/modules/Image/image_module.c:1.1
Rev: src/modules/Image/initstuff.h:1.1
Rev: src/modules/Image/layers.c:1.12
Rev: src/modules/Image/pattern.c:1.16
---
 .gitattributes                          |   1 +
 src/modules/Image/Makefile.in           |   5 +-
 src/modules/Image/colors.c              |  23 +--
 src/modules/Image/colortable.c          |  34 +---
 src/modules/Image/encodings/Makefile.in |   6 +-
 src/modules/Image/encodings/_xpm.c      |  18 +-
 src/modules/Image/encodings/any.c       |  21 +--
 src/modules/Image/encodings/avs.c       |  18 +-
 src/modules/Image/encodings/bmp.c       |  24 +--
 src/modules/Image/encodings/gif.c       |  21 +--
 src/modules/Image/encodings/hrz.c       |  19 +--
 src/modules/Image/encodings/ilbm.c      |  25 +--
 src/modules/Image/encodings/pcx.c       |  30 +---
 src/modules/Image/encodings/png.c       |  15 +-
 src/modules/Image/encodings/pnm.c       |  22 +--
 src/modules/Image/encodings/psd.c       |  17 +-
 src/modules/Image/encodings/tga.c       |  37 ++--
 src/modules/Image/encodings/x.c         |  19 +--
 src/modules/Image/encodings/xbm.c       |  25 +--
 src/modules/Image/encodings/xcf.c       |  19 +--
 src/modules/Image/encodings/xwd.c       |  13 +-
 src/modules/Image/font.c                |  18 +-
 src/modules/Image/image.c               | 153 +----------------
 src/modules/Image/image.h               |   3 +-
 src/modules/Image/image_module.c        | 216 ++++++++++++++++++++++++
 src/modules/Image/initstuff.h           |  45 +++++
 src/modules/Image/layers.c              |  23 +--
 src/modules/Image/pattern.c             |  10 +-
 28 files changed, 360 insertions(+), 520 deletions(-)
 create mode 100644 src/modules/Image/image_module.c
 create mode 100644 src/modules/Image/initstuff.h

diff --git a/.gitattributes b/.gitattributes
index bc1a8e1a67..c59959d55e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -202,6 +202,7 @@ testfont binary
 /src/modules/Image/illustration.pike foreign_ident
 /src/modules/Image/image.c foreign_ident
 /src/modules/Image/image.h foreign_ident
+/src/modules/Image/image_module.c foreign_ident
 /src/modules/Image/layers.c foreign_ident
 /src/modules/Image/matrix.c foreign_ident
 /src/modules/Image/mkwmml.pike foreign_ident
diff --git a/src/modules/Image/Makefile.in b/src/modules/Image/Makefile.in
index 5d2c753ae6..8dfe0c2054 100644
--- a/src/modules/Image/Makefile.in
+++ b/src/modules/Image/Makefile.in
@@ -1,7 +1,8 @@
-# $Id: Makefile.in,v 1.22 1999/04/23 21:34:24 grubba Exp $
+# $Id: Makefile.in,v 1.23 1999/05/23 17:46:37 mirar Exp $
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../..:../..
-OBJS = image.o font.o togif.o matrix.o pnm_compat.o blit.o \
+OBJS = image_module.o \
+	image.o font.o togif.o matrix.o pnm_compat.o blit.o \
 	pattern.o dct.o operator.o x.o colortable.o polyfill.o \
 	orient.o colors.o search.o layers.o
 MODNAME=image
diff --git a/src/modules/Image/colors.c b/src/modules/Image/colors.c
index 7fe6a780e3..38f557f5e0 100644
--- a/src/modules/Image/colors.c
+++ b/src/modules/Image/colors.c
@@ -1,7 +1,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: colors.c,v 1.16 1999/05/20 17:07:00 mirar Exp $
+**!	$Id: colors.c,v 1.17 1999/05/23 17:46:38 mirar Exp $
 **! submodule Color
 **!
 **!	This module keeps names and easy handling 
@@ -97,7 +97,7 @@
 #include "global.h"
 #include <config.h>
 
-RCSID("$Id: colors.c,v 1.16 1999/05/20 17:07:00 mirar Exp $");
+RCSID("$Id: colors.c,v 1.17 1999/05/23 17:46:38 mirar Exp $");
 
 #include "config.h"
 
@@ -1431,6 +1431,8 @@ void init_image_colors(void)
 
    no_name=make_shared_string("");
 
+   /* make color object program */
+
    start_new_program();
 
    ADD_STORAGE(struct color_struct);
@@ -1471,8 +1473,9 @@ void init_image_colors(void)
    ADD_FUNCTION("`+",image_color_add,tFunc(tObj,tObj),0);
 
    image_color_program=end_program();
+
+   /* this is the Image.Color stuff */
    
-   start_new_program();
    ADD_FUNCTION("`[]",image_get_color,tFunc(tStr,tObj),0);
    ADD_FUNCTION("`()",image_make_color,tFuncV(,tOr(tStr,tInt),tObj),0);
    ADD_FUNCTION("rgb",image_make_rgb_color,tFunc(tInt tInt tInt,tObj),0);
@@ -1490,23 +1493,11 @@ void init_image_colors(void)
    ADD_FUNCTION("_values",image_colors_values,tFunc(,tArr(tObj)),0);
 
    add_program_constant("Color",image_color_program,0);
-
-   prg=end_program();
-   push_object(clone_object(prg,0));
-   free_program(prg);
-   str=make_shared_string("Color");
-   add_constant(str,sp-1,0);
-   free_string(str);
-   pop_stack();
 }
 
 void exit_image_colors(void)
 {
-   if (image_color_program)
-   {
-      free_program(image_color_program);
-      image_color_program=NULL;
-   }
+   free_program(image_color_program);
    if (colors)
    {
       int i;
diff --git a/src/modules/Image/colortable.c b/src/modules/Image/colortable.c
index 7d9bb24542..f3745ec4e3 100644
--- a/src/modules/Image/colortable.c
+++ b/src/modules/Image/colortable.c
@@ -1,12 +1,12 @@
 #include "global.h"
 #include <config.h>
 
-/* $Id: colortable.c,v 1.66 1999/04/20 18:16:09 mirar Exp $ */
+/* $Id: colortable.c,v 1.67 1999/05/23 17:46:39 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: colortable.c,v 1.66 1999/04/20 18:16:09 mirar Exp $
+**!	$Id: colortable.c,v 1.67 1999/05/23 17:46:39 mirar Exp $
 **! class Colortable
 **!
 **!	This object keeps colortable information,
@@ -21,7 +21,7 @@
 #undef COLORTABLE_DEBUG
 #undef COLORTABLE_REDUCE_DEBUG
 
-RCSID("$Id: colortable.c,v 1.66 1999/04/20 18:16:09 mirar Exp $");
+RCSID("$Id: colortable.c,v 1.67 1999/05/23 17:46:39 mirar Exp $");
 
 #include <math.h> /* fabs() */
 
@@ -39,16 +39,12 @@ RCSID("$Id: colortable.c,v 1.66 1999/04/20 18:16:09 mirar Exp $");
 #include "builtin_functions.h"
 #include "../../error.h"
 #include "module_support.h"
+#include "operators.h"
+#include "dmalloc.h"
 
 #include "image.h"
 #include "colortable.h"
-#include "dmalloc.h"
-
-void f_index(INT32);
-
-struct program *image_colortable_program;
-extern struct program *image_program;
-extern struct program *image_color_program;
+#include "initstuff.h"
 
 #define WEIGHT_NEEDED (nct_weight_t)(0x10000000)
 #define WEIGHT_REMOVE (nct_weight_t)(0x10000001)
@@ -1908,7 +1904,6 @@ int image_colortable_initiate_dither(struct neo_colortable *nct,
 	 return 1;
 
       case NCTD_ORDERED:
-	 fprintf(stderr,"init ordered\n");
 	 /* copy it all */
 	 dith->u.ordered=nct->du.ordered;
 
@@ -4367,16 +4362,16 @@ void image_colortable_corners(INT32 args)
 
 /***************** global init etc *****************************/
 
-void init_colortable_programs(void)
+void init_image_colortable(void)
 {
    s_array=make_shared_string("array");
    s_string=make_shared_string("string");
    s_mapping=make_shared_string("mapping");
 
-   start_new_program();
    ADD_STORAGE(struct neo_colortable);
 
    set_init_callback(init_colortable_struct);
+   set_exit_callback(exit_colortable_struct);
 
    /* function(void:void)|"
 		"function(array(array(int)):void)|"
@@ -4441,23 +4436,12 @@ void init_colortable_programs(void)
 
    ADD_FUNCTION("corners",image_colortable_corners,tFunc(,tArray),0);
 
-   set_exit_callback(exit_colortable_struct);
-  
-   image_colortable_program=end_program();
-   add_program_constant("colortable",image_colortable_program, 0); /* compat */
-   add_program_constant("Colortable",image_colortable_program, 0); 
 }
 
-void exit_colortable(void) 
+void exit_image_colortable(void) 
 {
    free_string(s_array);
    free_string(s_mapping);
    free_string(s_string);
-
-   if(image_colortable_program)
-   {
-      free_program(image_colortable_program);
-      image_colortable_program=0;
-   }
 }
 
diff --git a/src/modules/Image/encodings/Makefile.in b/src/modules/Image/encodings/Makefile.in
index 637f49f907..1d63bf79fe 100644
--- a/src/modules/Image/encodings/Makefile.in
+++ b/src/modules/Image/encodings/Makefile.in
@@ -1,13 +1,13 @@
-# $Id: Makefile.in,v 1.25 1999/04/15 02:40:07 per Exp $
+# $Id: Makefile.in,v 1.26 1999/05/23 17:46:47 mirar Exp $
 SRCDIR=@srcdir@
 VPATH=@srcdir@:@srcdir@/../../..:../../..
-OBJS = gif.o gif_lzw.o pnm.o x.o xwd.o png.o any.o bmp.o tga.o pcx.o xbm.o _xpm.o ilbm.o iff.o xcf.o hrz.o avs.o psd.o
+OBJS = gif.o gif_lzw.o pnm.o x.o xwd.o png.o any.o bmp.o tga.o pcx.o xbm.o _xpm.o ilbm.o iff.o xcf.o hrz.o avs.o psd.o gd.o
 
 @SET_MAKE@
 
 CC=@CC@
 CPP=@CPP@
-AR=ar
+# AR=ar
 RANLIB=@RANLIB@
 
 PREFLAGS=-I. -I$(SRCDIR) -I$(SRCDIR)/../../.. -I$(SRCDIR)/.. -I../../.. -I.. -I. $(MODULE_CPPFLAGS) $(DEFINES) 
diff --git a/src/modules/Image/encodings/_xpm.c b/src/modules/Image/encodings/_xpm.c
index a9d5bd4c67..b597e72521 100644
--- a/src/modules/Image/encodings/_xpm.c
+++ b/src/modules/Image/encodings/_xpm.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: _xpm.c,v 1.6 1999/04/15 20:31:18 per Exp $");
+RCSID("$Id: _xpm.c,v 1.7 1999/05/23 17:46:48 mirar Exp $");
 
 #include "config.h"
 
@@ -386,28 +386,12 @@ void f__xpm_trim_rows( INT32 args )
   pop_n_elems(args-1);
 }
 
-static struct program *image_encoding__xpm_program=NULL;
 void init_image__xpm( )
 {
-  start_new_program();
    add_function( "_xpm_write_rows", f__xpm_write_rows, "mixed", 0); 
   add_function( "_xpm_trim_rows", f__xpm_trim_rows, "mixed", 0);
-  image_encoding__xpm_program=end_program();
-
-  push_object(clone_object(image_encoding__xpm_program,0));
-  {
-    struct pike_string *s=make_shared_string("_XPM");
-    add_constant(s,sp-1,0);
-    free_string(s);
-  }
-  pop_stack();
 }
 
 void exit_image__xpm(void)
 {
-  if(image_encoding__xpm_program)
-  {
-    free_program(image_encoding__xpm_program);
-    image_encoding__xpm_program=0;
-  }
 }
diff --git a/src/modules/Image/encodings/any.c b/src/modules/Image/encodings/any.c
index bbe7ac0055..69a513484d 100644
--- a/src/modules/Image/encodings/any.c
+++ b/src/modules/Image/encodings/any.c
@@ -1,9 +1,9 @@
-/* $Id: any.c,v 1.8 1999/05/02 15:29:25 mirar Exp $ */
+/* $Id: any.c,v 1.9 1999/05/23 17:46:49 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: any.c,v 1.8 1999/05/02 15:29:25 mirar Exp $
+**!	$Id: any.c,v 1.9 1999/05/23 17:46:49 mirar Exp $
 **! submodule ANY
 **!
 **!	This method calls the other decoding methods
@@ -23,7 +23,7 @@
 #include <ctype.h>
 
 #include "stralloc.h"
-RCSID("$Id: any.c,v 1.8 1999/05/02 15:29:25 mirar Exp $");
+RCSID("$Id: any.c,v 1.9 1999/05/23 17:46:49 mirar Exp $");
 #include "pike_macros.h"
 #include "operators.h"
 #include "builtin_functions.h"
@@ -174,27 +174,12 @@ void image_any_decode_alpha(INT32 args)
 
 void init_image_any(void)
 {
-   struct program *p;
-
-   start_new_program();
-   
    add_function("_decode",image_any__decode,
 		"function(string:mapping)",0);
    add_function("decode",image_any_decode,
 		"function(string:mapping)",0);
    add_function("decode_alpha",image_any_decode_alpha,
 		"function(string:mapping)",0);
-   /** done **/
-
-   p=end_program();
-   push_object(clone_object(p,0));
-   {
-     struct pike_string *s=make_shared_string("ANY");
-     add_constant(s,sp-1,0);
-     free_string(s);
-   }
-   free_program(p);
-   pop_stack();
 }
 
 void exit_image_any(void)
diff --git a/src/modules/Image/encodings/avs.c b/src/modules/Image/encodings/avs.c
index 49db81cbcc..e9a3634e49 100644
--- a/src/modules/Image/encodings/avs.c
+++ b/src/modules/Image/encodings/avs.c
@@ -8,7 +8,7 @@
 #endif
 
 #include "stralloc.h"
-RCSID("$Id: avs.c,v 1.5 1999/05/13 03:25:48 neotron Exp $");
+RCSID("$Id: avs.c,v 1.6 1999/05/23 17:46:50 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -44,8 +44,6 @@ extern struct program *image_program;
 **! g and b.
 */
 
-struct program *image_encoding_avs_program;
-
 void image_avs_f__decode(INT32 args)
 {
   extern void f_aggregate_mapping(INT32 args);
@@ -138,25 +136,11 @@ void image_avs_f_encode(INT32 args )
 
 void init_image_avs()
 {
-  start_new_program();
   add_function( "decode",  image_avs_f_decode,  "function(string:object)", 0);
   add_function( "_decode", image_avs_f__decode, "function(string:mapping)", 0);
   add_function( "encode",  image_avs_f_encode,  "function(object:string)", 0);
-  image_encoding_avs_program=end_program();
-  push_object(clone_object(image_encoding_avs_program,0));
-  {
-    struct pike_string *s=make_shared_string("AVS");
-    add_constant(s,sp-1,0);
-    free_string(s);
-  }
-  pop_stack();
 }
 
 void exit_image_avs()
 {
-  if(image_encoding_avs_program)
-  {
-    free_program(image_encoding_avs_program);
-    image_encoding_avs_program=NULL;
-  }
 }
diff --git a/src/modules/Image/encodings/bmp.c b/src/modules/Image/encodings/bmp.c
index 3e388c68b0..3b963825f5 100644
--- a/src/modules/Image/encodings/bmp.c
+++ b/src/modules/Image/encodings/bmp.c
@@ -1,9 +1,9 @@
-/* $Id: bmp.c,v 1.13 1999/05/08 00:44:41 hubbe Exp $ */
+/* $Id: bmp.c,v 1.14 1999/05/23 17:46:51 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: bmp.c,v 1.13 1999/05/08 00:44:41 hubbe Exp $
+**!	$Id: bmp.c,v 1.14 1999/05/23 17:46:51 mirar Exp $
 **! submodule BMP
 **!
 **!	This submodule keeps the BMP (Windows Bitmap)
@@ -22,7 +22,7 @@
 #include <ctype.h>
 
 #include "stralloc.h"
-RCSID("$Id: bmp.c,v 1.13 1999/05/08 00:44:41 hubbe Exp $");
+RCSID("$Id: bmp.c,v 1.14 1999/05/23 17:46:51 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -990,12 +990,8 @@ void img_bmp_decode(INT32 args)
    f_index(2);
 }
 
-struct program *image_bmp_module_program=NULL;
-
 void init_image_bmp(void)
 {
-   start_new_program();
-   
    add_function("encode",img_bmp_encode,
 		"function(object,void|object|int|mapping:string)",0);
    add_function("_decode",img_bmp__decode,
@@ -1004,22 +1000,8 @@ void init_image_bmp(void)
 		"function(string,void|mapping:object)",0);
    add_function("decode_header",img_bmp_decode_header,
 		"function(string,void|mapping:mapping)",0);
-
-   image_bmp_module_program=end_program();
-   push_object(clone_object(image_bmp_module_program,0));
-   {
-     struct pike_string *s=make_shared_string("BMP");
-     add_constant(s,sp-1,0);
-     free_string(s);
-   }
-   pop_stack();
 }
 
 void exit_image_bmp(void)
 {
-  if(image_bmp_module_program)
-  {
-    free_program(image_bmp_module_program);
-    image_bmp_module_program=0;
-  }
 }
diff --git a/src/modules/Image/encodings/gif.c b/src/modules/Image/encodings/gif.c
index 3271be326a..c3acaa8a16 100644
--- a/src/modules/Image/encodings/gif.c
+++ b/src/modules/Image/encodings/gif.c
@@ -1,9 +1,9 @@
-/* $Id: gif.c,v 1.47 1999/04/13 12:32:41 mirar Exp $ */
+/* $Id: gif.c,v 1.48 1999/05/23 17:46:52 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: gif.c,v 1.47 1999/04/13 12:32:41 mirar Exp $
+**!	$Id: gif.c,v 1.48 1999/05/23 17:46:52 mirar Exp $
 **! submodule GIF
 **!
 **!	This submodule keep the GIF encode/decode capabilities
@@ -31,7 +31,7 @@
 #include <ctype.h>
 
 #include "stralloc.h"
-RCSID("$Id: gif.c,v 1.47 1999/04/13 12:32:41 mirar Exp $");
+RCSID("$Id: gif.c,v 1.48 1999/05/23 17:46:52 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -2530,7 +2530,6 @@ struct program *image_encoding_gif_program=NULL;
 
 void init_image_gif(void)
 {
-   start_new_program();
    
    add_function("render_block",image_gif_render_block,
 		"function(object,object,void|int,void|int,void|int,void|object,void|int,void|int,void|int,void|int,void|int,void|int,void|int:string)"
@@ -2584,22 +2583,8 @@ void init_image_gif(void)
    add_integer_constant("ERROR_TOO_MUCH_DATA",GIF_ERROR_TOO_MUCH_DATA,0);
 
    /** done **/
-
-   image_encoding_gif_program=end_program();
-   push_object(clone_object(image_encoding_gif_program,0));
-   {
-     struct pike_string *s=make_shared_string("GIF");
-     add_constant(s,sp-1,0);
-     free_string(s);
-   }
-   pop_stack();
 }
 
 void exit_image_gif(void)
 {
-  if(image_encoding_gif_program)
-  {
-    free_program(image_encoding_gif_program);
-    image_encoding_gif_program=0;
-  }
 }
diff --git a/src/modules/Image/encodings/hrz.c b/src/modules/Image/encodings/hrz.c
index a926aa92d7..0f165ba31f 100644
--- a/src/modules/Image/encodings/hrz.c
+++ b/src/modules/Image/encodings/hrz.c
@@ -4,7 +4,7 @@
 #include <ctype.h>
 
 #include "stralloc.h"
-RCSID("$Id: hrz.c,v 1.1 1999/04/12 10:30:03 per Exp $");
+RCSID("$Id: hrz.c,v 1.2 1999/05/23 17:46:53 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -13,6 +13,7 @@ RCSID("$Id: hrz.c,v 1.1 1999/04/12 10:30:03 per Exp $");
 #include "threads.h"
 #include "array.h"
 #include "error.h"
+#include "builtin_functions.h"
 
 
 #include "image.h"
@@ -40,8 +41,6 @@ extern struct program *image_program;
 **! HRZ is (was?) used for amatuer radio slow-scan TV.
 */
 
-struct program *image_encoding_hrz_program;
-
 void image_hrz_f_decode(INT32 args)
 {
   struct object *io;
@@ -106,25 +105,11 @@ void image_hrz_f_encode(INT32 args )
 
 void init_image_hrz()
 {
-  start_new_program();
   add_function( "decode", image_hrz_f_decode, "function(string:object)", 0);
   add_function( "_decode", image_hrz_f__decode, "function(string:mapping)", 0);
   add_function( "encode", image_hrz_f_encode, "function(object:string)", 0);
-  image_encoding_hrz_program=end_program();
-  push_object(clone_object(image_encoding_hrz_program,0));
-  {
-    struct pike_string *s=make_shared_string("HRZ");
-    add_constant(s,sp-1,0);
-    free_string(s);
-  }
-  pop_stack();
 }
 
 void exit_image_hrz()
 {
-  if(image_encoding_hrz_program)
-  {
-    free_program(image_encoding_hrz_program);
-    image_encoding_hrz_program=NULL;
-  }
 }
diff --git a/src/modules/Image/encodings/ilbm.c b/src/modules/Image/encodings/ilbm.c
index 139303c696..c05fe036f7 100644
--- a/src/modules/Image/encodings/ilbm.c
+++ b/src/modules/Image/encodings/ilbm.c
@@ -1,9 +1,9 @@
-/* $Id: ilbm.c,v 1.10 1999/04/19 21:10:35 marcus Exp $ */
+/* $Id: ilbm.c,v 1.11 1999/05/23 17:46:54 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: ilbm.c,v 1.10 1999/04/19 21:10:35 marcus Exp $
+**!	$Id: ilbm.c,v 1.11 1999/05/23 17:46:54 mirar Exp $
 **! submodule ILBM
 **!
 **!	This submodule keep the ILBM encode/decode capabilities
@@ -14,7 +14,7 @@
 #include "global.h"
 
 #include "stralloc.h"
-RCSID("$Id: ilbm.c,v 1.10 1999/04/19 21:10:35 marcus Exp $");
+RCSID("$Id: ilbm.c,v 1.11 1999/05/23 17:46:54 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -248,9 +248,9 @@ static void parse_body(struct BMHD *bmhd, unsigned char *body, INT32 blen,
   unsigned int x, y;
   int rbyt = ((bmhd->w+15)&~15)>>3;
   int eplanes = (bmhd->masking == mskHasMask? bmhd->nPlanes+1:bmhd->nPlanes);
-  unsigned char *line;
+  unsigned char *line=0;
   INT32 *cptr, *cline = alloca((rbyt<<3)*sizeof(INT32));
-  INT32 suse;
+  INT32 suse=0;
   rgb_group *dest = img->img;
   rgb_group *adest = (alpha==NULL? NULL : alpha->img);
 
@@ -826,7 +826,6 @@ void init_image_ilbm(void)
      pop_stack();
    }
 
-   start_new_program();
    
    add_function("__decode",image_ilbm___decode,
 		"function(string:array)",0);
@@ -836,25 +835,11 @@ void init_image_ilbm(void)
 		"function(string|array:object)",0);
    add_function("encode",image_ilbm_encode,
 		"function(object,void|mapping(string:mixed):string)",0);
-
-   image_encoding_ilbm_program=end_program();
-   push_object(clone_object(image_encoding_ilbm_program,0));
-   {
-     struct pike_string *s=make_shared_string("ILBM");
-     add_constant(s,sp-1,0);
-     free_string(s);
-   }
-   pop_stack();
 }
 
 void exit_image_ilbm(void)
 {
   int n;
-  if(image_encoding_ilbm_program)
-  {
-    free_program(image_encoding_ilbm_program);
-    image_encoding_ilbm_program=NULL;
-  }
   for(n=0; n<4; n++)
     free_svalue(&string_[n]);
 }
diff --git a/src/modules/Image/encodings/pcx.c b/src/modules/Image/encodings/pcx.c
index 1a732bf309..dbdcb0d5e4 100644
--- a/src/modules/Image/encodings/pcx.c
+++ b/src/modules/Image/encodings/pcx.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: pcx.c,v 1.5 1999/04/15 04:08:35 hubbe Exp $");
+RCSID("$Id: pcx.c,v 1.6 1999/05/23 17:46:55 mirar Exp $");
 
 #include "config.h"
 
@@ -582,7 +582,6 @@ void image_pcx_encode( INT32 args )
 static struct program *image_encoding_pcx_program=NULL;
 void init_image_pcx( )
 {
-  start_new_program();
   add_function( "_decode", image_pcx__decode, 
                 "function(string:mapping(string:object))", 0);
   add_function( "decode", image_pcx_decode, 
@@ -591,15 +590,7 @@ void init_image_pcx( )
                 "function(object,mapping|void:string)", 0);
   add_function( "_encode", image_pcx_encode, 
                 "function(object,mapping|void:string)", 0);
-  image_encoding_pcx_program=end_program();
 
-  push_object(clone_object(image_encoding_pcx_program,0));
-  {
-    struct pike_string *s=make_shared_string("PCX");
-    add_constant(s,sp-1,0);
-    free_string(s);
-  }
-  pop_stack();
   opt_raw=make_shared_string("raw");
   opt_dpy=make_shared_string("dpy");
   opt_xdpy=make_shared_string("xdpy");
@@ -611,16 +602,11 @@ void init_image_pcx( )
 
 void exit_image_pcx(void)
 {
-  if(image_encoding_pcx_program)
-  {
-    free_program(image_encoding_pcx_program);
-    image_encoding_pcx_program=0;
-    free_string(opt_raw);
-    free_string(opt_dpy);
-    free_string(opt_xdpy);
-    free_string(opt_ydpy);
-    free_string(opt_xoffset);
-    free_string(opt_colortable);
-    free_string(opt_yoffset);
-  }
+   free_string(opt_raw);
+   free_string(opt_dpy);
+   free_string(opt_xdpy);
+   free_string(opt_ydpy);
+   free_string(opt_xoffset);
+   free_string(opt_colortable);
+   free_string(opt_yoffset);
 }
diff --git a/src/modules/Image/encodings/png.c b/src/modules/Image/encodings/png.c
index fb6045e8fe..a006550758 100644
--- a/src/modules/Image/encodings/png.c
+++ b/src/modules/Image/encodings/png.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: png.c,v 1.23 1999/05/10 23:03:45 mirar Exp $");
+RCSID("$Id: png.c,v 1.24 1999/05/23 17:46:56 mirar Exp $");
 
 #include "config.h"
 
@@ -1671,13 +1671,8 @@ void exit_image_png(void)
      free_program(gz_deflate);
 }
 
-struct object *init_image_png(void)
+void init_image_png(void)
 {
-   struct program *p;
-   struct object *o;
-
-   start_new_program();
-
    push_text("Gz");
    push_int(0);
    SAFE_APPLY_MASTER("resolv",2);
@@ -1709,7 +1704,6 @@ struct object *init_image_png(void)
    }
    pop_stack();
 
-
    if (gz_deflate && gz_inflate && gz_crc32.type!=T_INT)
    {
       add_function("_chunk",image_png__chunk,
@@ -1740,9 +1734,4 @@ struct object *init_image_png(void)
    param_bpp=make_shared_string("bpp");
    param_type=make_shared_string("type");
    param_background=make_shared_string("background");
-   
-   o = clone_object((p = end_program()),0);
-   free_program(p);
-
-   return o;
 }
diff --git a/src/modules/Image/encodings/pnm.c b/src/modules/Image/encodings/pnm.c
index 459565eccd..acb5982d7c 100644
--- a/src/modules/Image/encodings/pnm.c
+++ b/src/modules/Image/encodings/pnm.c
@@ -1,9 +1,9 @@
-/* $Id: pnm.c,v 1.18 1999/04/13 12:32:44 mirar Exp $ */
+/* $Id: pnm.c,v 1.19 1999/05/23 17:46:58 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: pnm.c,v 1.18 1999/04/13 12:32:44 mirar Exp $
+**!	$Id: pnm.c,v 1.19 1999/05/23 17:46:58 mirar Exp $
 **! submodule PNM
 **!
 **!	This submodule keeps the PNM encode/decode capabilities
@@ -49,7 +49,7 @@
 #include <ctype.h>
 
 #include "stralloc.h"
-RCSID("$Id: pnm.c,v 1.18 1999/04/13 12:32:44 mirar Exp $");
+RCSID("$Id: pnm.c,v 1.19 1999/05/23 17:46:58 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -583,8 +583,6 @@ struct program *image_pnm_module_program=NULL;
 
 void init_image_pnm(void)
 {
-   start_new_program();
-   
    add_function("encode",img_pnm_encode_binary,
 		"function(object:string)",0);
    add_function("encode_binary",img_pnm_encode_binary,
@@ -608,22 +606,8 @@ void init_image_pnm(void)
 
    add_function("decode",img_pnm_decode,
 		"function(string:object)",0);
-
-   image_pnm_module_program=end_program();
-   push_object(clone_object(image_pnm_module_program,0));
-   {
-     struct pike_string *s=make_shared_string("PNM");
-     add_constant(s,sp-1,0);
-     free_string(s);
-   }
-   pop_stack();
 }
 
 void exit_image_pnm(void)
 {
-  if(image_pnm_module_program)
-  {
-    free_program(image_pnm_module_program);
-    image_pnm_module_program=0;
-  }
 }
diff --git a/src/modules/Image/encodings/psd.c b/src/modules/Image/encodings/psd.c
index 90eec727d3..8345fdf73d 100644
--- a/src/modules/Image/encodings/psd.c
+++ b/src/modules/Image/encodings/psd.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: psd.c,v 1.9 1999/05/08 00:44:42 hubbe Exp $");
+RCSID("$Id: psd.c,v 1.10 1999/05/23 17:46:59 mirar Exp $");
 
 #include "config.h"
 
@@ -625,7 +625,6 @@ static void f_apply_cmap( INT32 args )
 static struct program *image_encoding_psd_program=NULL;
 void init_image_psd()
 {
-  start_new_program();
   add_function( "___decode", image_f_psd___decode, 
                 "function(string:mapping)", 0);
   add_function( "___decode_image_channel", f_decode_image_channel, 
@@ -650,15 +649,6 @@ void init_image_psd()
   add_integer_constant("LAYER_FLAG_BIT4", 0x04, 0 );
   add_integer_constant("LAYER_FLAG_NOPIX", 0x08, 0 );
 
-  image_encoding_psd_program=end_program();
-  
-  push_object(clone_object(image_encoding_psd_program,0));
-  {
-    struct pike_string *s=make_shared_string("_PSD");
-    add_constant(s,sp-1,0);
-    free_string(s);
-  }
-  pop_stack();
 #define STRING(X) s_##X = make_shared_binary_string(#X,sizeof( #X )-sizeof(""));
 #include "psd_constant_strings.h"
 #undef STRING
@@ -667,13 +657,8 @@ void init_image_psd()
 
 void exit_image_psd()
 {
-  if(image_encoding_psd_program)
-  {
-    free_program(image_encoding_psd_program);
-    image_encoding_psd_program=0;
 #define STRING(X) free_string(s_##X)
 #include "psd_constant_strings.h"
 #undef STRING
-  }
 }
 
diff --git a/src/modules/Image/encodings/tga.c b/src/modules/Image/encodings/tga.c
index 3a2ff2c2d8..96657ee27c 100644
--- a/src/modules/Image/encodings/tga.c
+++ b/src/modules/Image/encodings/tga.c
@@ -1,6 +1,6 @@
 
 /*
- * $Id: tga.c,v 1.6 1999/05/10 23:03:46 mirar Exp $
+ * $Id: tga.c,v 1.7 1999/05/23 17:47:00 mirar Exp $
  *
  *  Targa codec for pike. Based on the tga plugin for gimp.
  *
@@ -73,7 +73,7 @@
 #include "image.h"
 #include "colortable.h"
 
-RCSID("$Id: tga.c,v 1.6 1999/05/10 23:03:46 mirar Exp $");
+RCSID("$Id: tga.c,v 1.7 1999/05/23 17:47:00 mirar Exp $");
 
 #ifndef MIN
 # define MIN(X,Y) ((X)<(Y)?(X):(Y))
@@ -428,7 +428,7 @@ static struct image_alpha ReadImage(struct buffer *fp, struct tga_header *hdr)
   int i, j, k;
   int pelbytes=0, npels, pels, read_so_far=0, rle=0;
   unsigned char *cmap=NULL, *data;
-  int itype;
+  int itype=0;
 
   int (*myfread)(unsigned char *, int, int, struct buffer *);
 
@@ -829,7 +829,16 @@ void image_tga__decode( INT32 args )
   push_object( i.ao );
   push_constant_text( "image" );
   push_object( i.io );
-  f_aggregate_mapping( 4 );
+
+  push_constant_text( "type" );
+  push_constant_text( "image/x-targa" );
+
+  push_constant_text( "xsize" );
+  push_int( i.img->xsize );
+  push_constant_text( "ysize" );
+  push_int( i.img->ysize );
+
+  f_aggregate_mapping( 10 );
 }
 
 /*
@@ -932,33 +941,19 @@ void image_tga_encode( INT32 args )
 static struct program *image_encoding_tga_program=NULL;
 void init_image_tga( )
 {
-   start_new_program();
    add_function( "_decode", image_tga__decode, 
                  "function(string:mapping(string:object))", 0);
    add_function( "decode", image_tga_decode, 
                  "function(string:object)", 0);
    add_function( "encode", image_tga_encode, 
                  "function(object,mapping|void:string)", 0);
-   image_encoding_tga_program=end_program();
-
-   push_object(clone_object(image_encoding_tga_program,0));
-   {
-     struct pike_string *s=make_shared_string("TGA");
-     add_constant(s,sp-1,0);
-     free_string(s);
-   }
-   pop_stack();
+
    param_alpha=make_shared_string("alpha");
    param_raw=make_shared_string("raw");
 }
 
 void exit_image_tga(void)
 {
-  if(image_encoding_tga_program)
-  {
-    free_program(image_encoding_tga_program);
-    image_encoding_tga_program=0;
-    free_string(param_alpha);
-    free_string(param_raw);
-  }
+   free_string(param_alpha);
+   free_string(param_raw);
 }
diff --git a/src/modules/Image/encodings/x.c b/src/modules/Image/encodings/x.c
index 47e0fdc595..d0bc918105 100644
--- a/src/modules/Image/encodings/x.c
+++ b/src/modules/Image/encodings/x.c
@@ -1,9 +1,9 @@
-/* $Id: x.c,v 1.21 1999/05/20 14:08:56 mirar Exp $ */
+/* $Id: x.c,v 1.22 1999/05/23 17:47:01 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: x.c,v 1.21 1999/05/20 14:08:56 mirar Exp $
+**!	$Id: x.c,v 1.22 1999/05/23 17:47:01 mirar Exp $
 **! submodule X
 **!
 **!	This submodule handles encoding and decoding of
@@ -29,7 +29,7 @@
 #include <winsock.h>
 #endif
 
-RCSID("$Id: x.c,v 1.21 1999/05/20 14:08:56 mirar Exp $");
+RCSID("$Id: x.c,v 1.22 1999/05/23 17:47:01 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -1092,9 +1092,6 @@ struct program *image_x_module_program=NULL;
 
 void init_image_x(void)
 {
-   struct pike_string *s;
-   start_new_program();
-   
    add_function("encode_truecolor",image_x_encode_truecolor,
 		"function(object,int,int,int,int,int,int,int,int,int,void|object:string)",0);
    add_function("encode_truecolor_masks",image_x_encode_truecolor_masks,
@@ -1105,18 +1102,8 @@ void init_image_x(void)
    add_function("examine_mask",image_x_call_examine_mask,
 		"function(int:array(int))",0);
 
-   image_x_module_program=end_program();
-   push_object(clone_object(image_x_module_program,0));
-   add_constant(s=make_shared_string("X"),sp-1,0);
-   free_string(s);
-   pop_stack();
 }
 
 void exit_image_x(void)
 {
-   if(image_x_module_program)
-   {
-      free_program(image_x_module_program);
-      image_x_module_program=0;
-   }
 }
diff --git a/src/modules/Image/encodings/xbm.c b/src/modules/Image/encodings/xbm.c
index 6115aa7df4..46151716aa 100644
--- a/src/modules/Image/encodings/xbm.c
+++ b/src/modules/Image/encodings/xbm.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: xbm.c,v 1.4 1999/05/10 23:03:47 mirar Exp $");
+RCSID("$Id: xbm.c,v 1.5 1999/05/23 17:47:02 mirar Exp $");
 
 #include "config.h"
 
@@ -422,22 +422,12 @@ void image_xbm_encode( INT32 args )
 static struct program *image_encoding_xbm_program=NULL;
 void init_image_xbm( )
 {
-  start_new_program();
   add_function( "_decode", image_xbm__decode, 
                 "function(string,mapping|void:mapping(string:object))", 0);
   add_function( "decode", image_xbm_decode, 
                 "function(string:object)", 0);
   add_function( "encode", image_xbm_encode,  
                 "function(object,mapping|void:string)", 0); 
-  image_encoding_xbm_program=end_program();
-
-  push_object(clone_object(image_encoding_xbm_program,0));
-  {
-    struct pike_string *s=make_shared_string("XBM");
-    add_constant(s,sp-1,0);
-    free_string(s);
-  }
-  pop_stack();
   param_name=make_shared_string("name");
   param_fg=make_shared_string("fg");
   param_bg=make_shared_string("bg");
@@ -446,13 +436,8 @@ void init_image_xbm( )
 
 void exit_image_xbm(void)
 {
-  if(image_encoding_xbm_program)
-  {
-    free_program(image_encoding_xbm_program);
-    image_encoding_xbm_program=0;
-    free_string(param_name);
-    free_string(param_fg);
-    free_string(param_bg);
-    free_string(param_invert);
-  }
+   free_string(param_name);
+   free_string(param_fg);
+   free_string(param_bg);
+   free_string(param_invert);
 }
diff --git a/src/modules/Image/encodings/xcf.c b/src/modules/Image/encodings/xcf.c
index 5c16c5bcc2..99dbb5c560 100644
--- a/src/modules/Image/encodings/xcf.c
+++ b/src/modules/Image/encodings/xcf.c
@@ -1,5 +1,5 @@
 #include "global.h"
-RCSID("$Id: xcf.c,v 1.7 1999/04/15 04:08:39 hubbe Exp $");
+RCSID("$Id: xcf.c,v 1.8 1999/05/23 17:47:03 mirar Exp $");
 
 #include "config.h"
 
@@ -1233,7 +1233,6 @@ void image_xcf_f__decode_tiles( INT32 args )
 static struct program *image_encoding_xcf_program=NULL;
 void init_image_xcf()
 {
-  start_new_program();
   add_function( "___decode", image_xcf____decode, 
                 "function(string:mapping)", 0);
 
@@ -1310,17 +1309,6 @@ void init_image_xcf()
   add_integer_constant( "INDEXED_GIMAGE", INDEXED_GIMAGE, 0 );
   add_integer_constant( "INDEXEDA_GIMAGE", INDEXEDA_GIMAGE, 0 );
 
-  image_encoding_xcf_program=end_program();
-
-
-  push_object(clone_object(image_encoding_xcf_program,0));
-
-  {
-    struct pike_string *s=make_shared_string("_XCF");
-    add_constant(s,sp-1,0);
-    free_string(s);
-  }
-  pop_stack();
 #define STRING(X) s_##X = make_shared_binary_string(#X,sizeof( #X )-sizeof(""));
 #include "xcf_constant_strings.h"
 #undef STRING
@@ -1329,13 +1317,8 @@ void init_image_xcf()
 
 void exit_image_xcf()
 {
-  if(image_encoding_xcf_program)
-  {
-    free_program(image_encoding_xcf_program);
-    image_encoding_xcf_program=0;
 #define STRING(X) free_string(s_##X)
 #include "xcf_constant_strings.h"
 #undef STRING
-  }
 }
 
diff --git a/src/modules/Image/encodings/xwd.c b/src/modules/Image/encodings/xwd.c
index f95bbc6cb0..686835034f 100644
--- a/src/modules/Image/encodings/xwd.c
+++ b/src/modules/Image/encodings/xwd.c
@@ -1,9 +1,9 @@
-/* $Id: xwd.c,v 1.11 1999/05/20 14:08:14 mirar Exp $ */
+/* $Id: xwd.c,v 1.12 1999/05/23 17:47:04 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: xwd.c,v 1.11 1999/05/20 14:08:14 mirar Exp $
+**!	$Id: xwd.c,v 1.12 1999/05/23 17:47:04 mirar Exp $
 **! submodule XWD
 **!
 **!	This submodule keeps the XWD (X Windows Dump) 
@@ -25,7 +25,7 @@
 #include <ctype.h>
 
 #include "stralloc.h"
-RCSID("$Id: xwd.c,v 1.11 1999/05/20 14:08:14 mirar Exp $");
+RCSID("$Id: xwd.c,v 1.12 1999/05/23 17:47:04 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -393,9 +393,6 @@ struct program *image_xwd_module_program=NULL;
 
 void init_image_xwd(void)
 {
-  struct program *p;
-   start_new_program();
-   
    add_function("_decode",image_xwd__decode,
 		"function(string,void|int:mapping(string:int|array|object))",0);
    add_function("decode",image_xwd_decode,
@@ -404,10 +401,6 @@ void init_image_xwd(void)
    add_function("decode_header",image_xwd_decode_header,
 		"function(string:object)",0);
 
-   push_object(clone_object(p=end_program(),0));
-   simple_add_constant("XWD",sp-1,0);
-   free_program(p);
-   pop_stack();
 }
 
 void exit_image_xwd(void)
diff --git a/src/modules/Image/font.c b/src/modules/Image/font.c
index 4738ed2371..c6f8239764 100644
--- a/src/modules/Image/font.c
+++ b/src/modules/Image/font.c
@@ -1,4 +1,4 @@
-/* $Id: font.c,v 1.47 1999/04/25 20:03:36 grubba Exp $ */
+/* $Id: font.c,v 1.48 1999/05/23 17:46:40 mirar Exp $ */
 #include "global.h"
 #include <config.h>
 
@@ -7,7 +7,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: font.c,v 1.47 1999/04/25 20:03:36 grubba Exp $
+**!	$Id: font.c,v 1.48 1999/05/23 17:46:40 mirar Exp $
 **! class Font
 **!
 **! note
@@ -877,9 +877,8 @@ int baseline();             // font baseline
 
 */
 
-void init_font_programs(void)
+void init_image_font(void)
 {
-   start_new_program();
    ADD_STORAGE(struct font*);
 
    /* function(string:object|int) */
@@ -919,19 +918,10 @@ void init_font_programs(void)
    
    set_init_callback(init_font_struct);
    set_exit_callback(exit_font_struct);
-  
-   font_program=end_program();
-   add_program_constant("font",font_program, 0); /* compat */
-   add_program_constant("Font",font_program, 0);
 }
 
-void exit_font(void) 
+void exit_image_font(void) 
 {
-  if(font_program)
-  {
-    free_program(font_program);
-    font_program=0;
-  }
 }
 
 
diff --git a/src/modules/Image/image.c b/src/modules/Image/image.c
index 431e461a9d..c8ad661283 100644
--- a/src/modules/Image/image.c
+++ b/src/modules/Image/image.c
@@ -1,9 +1,9 @@
-/* $Id: image.c,v 1.135 1999/05/20 17:34:35 mirar Exp $ */
+/* $Id: image.c,v 1.136 1999/05/23 17:46:41 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: image.c,v 1.135 1999/05/20 17:34:35 mirar Exp $
+**!	$Id: image.c,v 1.136 1999/05/23 17:46:41 mirar Exp $
 **! class Image
 **!
 **!	The main object of the <ref>Image</ref> module, this object
@@ -97,7 +97,7 @@
 
 #include "stralloc.h"
 #include "global.h"
-RCSID("$Id: image.c,v 1.135 1999/05/20 17:34:35 mirar Exp $");
+RCSID("$Id: image.c,v 1.136 1999/05/23 17:46:41 mirar Exp $");
 #include "pike_macros.h"
 #include "object.h"
 #include "constants.h"
@@ -3554,73 +3554,10 @@ extern void exit_image_hrz(void);
 extern void init_image_avs(void);
 extern void exit_image_avs(void);
 
-/* dynamic encoders (dependent on other modules, loaded dynamically) */
-
-extern struct object* init_image_png(void);
-extern void exit_image_png(void);
-
-static struct pike_string 
-   *magic_PNG;
-
-static struct object *png_object=NULL;
-
-static void image_index_magic(INT32 args)
-{
-   struct svalue tmp;
-   if (args!=1) 
-      error("Image.`[]: Too few or too many arguments\n");
-   if (sp[-1].type!=T_STRING)
-      error("Image.`[]: Illegal type of argument\n");
-
-   if (sp[-1].u.string==magic_PNG)
-   {
-      pop_stack();
-      if (!png_object)
-	 png_object=init_image_png();
-      ref_push_object(png_object);
-      return;
-   }   
-
-   stack_dup();
-   ref_push_object(THISOBJ);
-   stack_swap();
-   f_arrow(2);
-
-   if (sp[-1].type==T_INT)
-   {
-      pop_stack();
-      push_text("_Image_");
-      stack_swap();
-      f_add(2);
-      push_int(0);
-      SAFE_APPLY_MASTER("resolv",2);
-   }
-   else
-   {
-      stack_swap();
-      pop_stack();
-   }
-}
-
 #define tRGB tOr3(tColor,tVoid,tInt) tOr(tInt,tVoid) tOr(tInt,tVoid)
 
-void pike_module_init(void)
+void init_image_image(void)
 {
-   int i;
-#ifdef PIKE_DEBUG
-   struct svalue *save_sp = sp;
-#define IMAGE_CHECK_STACK()	do { if (save_sp != sp) { fatal("%s:%d: %d droppings on stack!\n", __FILE__, __LINE__, sp - save_sp); } } while(0)
-#else
-#define IMAGE_CHECK_STACK()
-#endif /* PIKE_DEBUG */
-
-   magic_PNG=make_shared_string("PNG");
-
-   image_noise_init();
-
-   IMAGE_CHECK_STACK();
-
-   start_new_program();
    ADD_STORAGE(struct image);
 
    ADD_FUNCTION("create",image_create,
@@ -3912,90 +3849,10 @@ void pike_module_init(void)
 
    set_init_callback(init_image_struct);
    set_exit_callback(exit_image_struct);
-  
-   image_program=end_program();
-   add_program_constant("image",image_program, 0); /* compat */
-   add_program_constant("Image",image_program, 0);
-  
-   for (i=0; i<CIRCLE_STEPS; i++) 
-      circle_sin_table[i]=(INT32)4096*sin(((double)i)*2.0*3.141592653589793/(double)CIRCLE_STEPS);
-
-   init_font_programs();
-   init_colortable_programs();
-   init_image_colors();
-
-   ADD_FUNCTION("`[]",image_index_magic,
-		tFunc(tStr,tObj),0);
-
-   init_image_gif();
-   IMAGE_CHECK_STACK();
-   init_image_pnm();
-   IMAGE_CHECK_STACK();
-   init_image_bmp();
-   IMAGE_CHECK_STACK();
-   init_image_xwd();
-   IMAGE_CHECK_STACK();
-   init_image_any();
-   IMAGE_CHECK_STACK();
-   init_image_tga();
-   IMAGE_CHECK_STACK();
-   init_image_pcx();
-   IMAGE_CHECK_STACK();
-   init_image_xbm();
-   IMAGE_CHECK_STACK();
-   init_image__xpm();
-   IMAGE_CHECK_STACK();
-   init_image_ilbm();
-   IMAGE_CHECK_STACK();
-   init_image_xcf();
-   IMAGE_CHECK_STACK();
-   init_image_psd();
-   IMAGE_CHECK_STACK();
-   init_image_x();
-   IMAGE_CHECK_STACK();
-   init_image_hrz();
-   IMAGE_CHECK_STACK();
-   init_image_avs();
-   IMAGE_CHECK_STACK();
-   init_image_layers();
-   IMAGE_CHECK_STACK();
 }
 
-void pike_module_exit(void) 
+void exit_image_image(void) 
 {
-   if(image_program)
-   {
-      free_program(image_program);
-      image_program=0;
-   }
-   exit_font();
-   exit_colortable();
-   exit_image_colors();
-
-   exit_image_gif();
-   exit_image_pnm();
-   exit_image_bmp();
-   exit_image_xwd();
-   exit_image_any();
-   exit_image_tga();
-   exit_image_pcx();
-   exit_image__xpm();
-   exit_image_xbm();
-   exit_image_ilbm();
-   exit_image_xcf();
-   exit_image_psd();
-   exit_image_hrz();
-   exit_image_avs();
-   exit_image_layers();
-   if (png_object) 
-   {
-      free_object(png_object);
-      png_object=NULL;
-      exit_image_png();
-   }
-   exit_image_x();
-
-   free_string(magic_PNG);
 }
 
 
diff --git a/src/modules/Image/image.h b/src/modules/Image/image.h
index 82a0437769..2eb7a78871 100644
--- a/src/modules/Image/image.h
+++ b/src/modules/Image/image.h
@@ -1,7 +1,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: image.h,v 1.31 1999/05/20 17:08:03 mirar Exp $
+**!	$Id: image.h,v 1.32 1999/05/23 17:46:43 mirar Exp $
 */
 
 #ifdef PIKE_IMAGE_IMAGE_H
@@ -78,6 +78,7 @@ struct color_struct
 };
 
 #define tColor tOr3(tArr(tInt),tString,tObj)
+#define tLayerMap tMap(tString,tOr4(tString,tColor,tFloat,tInt))
 
 /* COMPAT: encoding of a gif - from togif */
 
diff --git a/src/modules/Image/image_module.c b/src/modules/Image/image_module.c
new file mode 100644
index 0000000000..0f296a9b10
--- /dev/null
+++ b/src/modules/Image/image_module.c
@@ -0,0 +1,216 @@
+#include "global.h"
+#include "stralloc.h"
+#include "global.h"
+RCSID("$Id: image_module.c,v 1.1 1999/05/23 17:46:44 mirar Exp $");
+#include "pike_macros.h"
+#include "interpret.h"
+#include "program.h"
+#include "object.h"
+#include "operators.h"
+
+#include "image.h"
+
+#define IMAGE_INITER
+
+
+#define IMAGE_CLASS(name,init,exit,prog) \
+    void init(void); void exit(void); struct program *prog;
+#define IMAGE_SUBMODULE(name,init,exit)  \
+    void init(void); void exit(void); 
+#define IMAGE_SUBMODMAG(name,init,exit) \
+    void init(void); void exit(void);
+#define IMAGE_FUNCTION(name,func,def0,def1) \
+    void func(INT32 args);
+#include "initstuff.h"
+
+static struct 
+{
+   char *name;
+   void (*init)(void);
+   void (*exit)(void);
+   struct program **dest;
+} initclass[]=
+{
+#undef IMAGE_CLASS
+#undef IMAGE_SUBMODULE
+#undef IMAGE_FUNCTION
+#undef IMAGE_SUBMODMAG
+#define IMAGE_SUBMODMAG(a,b,c) 
+#define IMAGE_FUNCTION(a,b,c,d)
+#define IMAGE_CLASS(name,init,exit,prog) { name,init,exit,&prog },
+#define IMAGE_SUBMODULE(a,b,c)
+#include "initstuff.h"
+};
+
+static struct 
+{
+   char *name;
+   void (*init)(void);
+   void (*exit)(void);
+} initsubmodule[]=
+{
+#undef IMAGE_CLASS
+#undef IMAGE_SUBMODULE
+#define IMAGE_CLASS(name,init,exit,prog) 
+#define IMAGE_SUBMODULE(name,init,exit) { name,init,exit },
+#include "initstuff.h"
+};
+
+static struct 
+{
+   char *name;
+   void (*init)(void);
+   void (*exit)(void);
+   struct pike_string *ps;
+   struct object *o;
+} submagic[]=
+{
+#undef IMAGE_SUBMODULE
+#undef IMAGE_SUBMODMAG
+#define IMAGE_SUBMODULE(a,b,c)
+#define IMAGE_SUBMODMAG(name,init,exit) { name,init,exit,NULL,NULL },
+#include "initstuff.h"
+};
+
+#ifdef PIKE_DEBUG
+#define IMAGE_CHECK_STACK(X)	do { if (save_sp != sp) { fatal("%s:%d: %d droppings on stack! previous init: %s\n", __FILE__, __LINE__, sp - save_sp,X); } } while(0)
+#else
+#define IMAGE_CHECK_STACK(X)
+#endif /* PIKE_DEBUG */
+
+
+static void image_magic_index(INT32 args)
+{
+   struct svalue tmp;
+   int i;
+
+   if (args!=1) 
+      error("Image.`[]: Too few or too many arguments\n");
+   if (sp[-1].type!=T_STRING)
+      error("Image.`[]: Illegal type of argument\n");
+
+   for (i=0; i<(int)NELEM(submagic); i++)
+      if (sp[-1].u.string==submagic[i].ps)
+      {
+#ifdef PIKE_DEBUG
+   struct svalue *save_sp;
+#endif
+	 pop_stack();
+
+#ifdef PIKE_DEBUG
+	 save_sp = sp;
+#endif
+
+	 if (!submagic[i].o)
+	 {
+	    struct program *p;
+	    start_new_program();
+	    (submagic[i].init)();
+	    IMAGE_CHECK_STACK(submagic[i].name);
+	    p=end_program();
+	    submagic[i].o=clone_object(p,0);
+	    free_program(p);
+	 }
+	 
+	 ref_push_object(submagic[i].o);
+	 return;
+      }
+
+   stack_dup();
+   ref_push_object(fp->current_object);
+   stack_swap();
+   f_arrow(2);
+
+   if (sp[-1].type==T_INT)
+   {
+      pop_stack();
+      push_text("_Image_");
+      stack_swap();
+      f_add(2);
+      push_int(0);
+      SAFE_APPLY_MASTER("resolv",2);
+   }
+   else
+   {
+      stack_swap();
+      pop_stack();
+   }
+}
+
+void pike_module_init(void)
+{
+   char type_of_index[]=
+      tFunc(tStr,tOr3(tObj,tPrg,""))
+/*       "\004" tStr "\021" tVoid  */
+/*       "\373" tObj "\373" tPrg */
+
+#undef IMAGE_FUNCTION
+#undef IMAGE_SUBMODMAG
+#define IMAGE_SUBMODMAG(name,init,exit) 
+#define IMAGE_FUNCTION(name,func,def0,def1) tOr(def0,"")
+#include "initstuff.h"
+      tFunc(tStr,tMixed); /* this */
+
+#ifdef PIKE_DEBUG
+   struct svalue *save_sp = sp;
+#endif
+
+   int i;
+   for (i=0; i<(int)NELEM(initclass); i++)
+   {
+      start_new_program();
+      (initclass[i].init)();
+      IMAGE_CHECK_STACK(initclass[i].name);
+      initclass[i].dest[0]=end_program();
+      add_program_constant(initclass[i].name,initclass[i].dest[0],0);
+   }
+
+   for (i=0; i<(int)NELEM(initsubmodule); i++)
+   {
+      struct program *p;
+      struct pike_string *s;
+      
+      start_new_program();
+      (initsubmodule[i].init)();
+      IMAGE_CHECK_STACK(initsubmodule[i].name);
+      p=end_program();
+      push_object(clone_object(p,0));
+      s=make_shared_string(initsubmodule[i].name);
+      add_constant(s,sp-1,0);
+      free_string(s);
+      free_program(p);
+      pop_stack();
+   }
+
+   for (i=0; i<(int)NELEM(submagic); i++)
+      submagic[i].ps=make_shared_string(submagic[i].name);
+
+#undef IMAGE_FUNCTION
+#define IMAGE_FUNCTION(name,func,def0,def1) ADD_FUNCTION(name,func,def0,def1);
+#include "initstuff.h"
+
+   quick_add_function("`[]",3,image_magic_index,
+		      type_of_index,CONSTANT_STRLEN(type_of_index),0,0);
+
+   /* compat stuff */
+   add_program_constant("image",image_program,0); 
+   add_program_constant("colortable",image_program,0);
+}
+
+void pike_module_exit(void) 
+{
+   int i;
+   for (i=0; i<(int)NELEM(initclass); i++)
+   {
+      (initclass[i].exit)();
+      free_program(initclass[i].dest[0]);
+   }
+   for (i=0; i<(int)NELEM(initsubmodule); i++)
+      (initsubmodule[i].exit)();
+   for (i=0; i<(int)NELEM(submagic); i++)
+      if (submagic[i].o)
+      {
+	 (submagic[i].exit)();
+	 free_object(submagic[i].o);
+      }
+}
diff --git a/src/modules/Image/initstuff.h b/src/modules/Image/initstuff.h
new file mode 100644
index 0000000000..58b987aaa7
--- /dev/null
+++ b/src/modules/Image/initstuff.h
@@ -0,0 +1,45 @@
+#ifndef IMAGE_INITER
+#define IMAGE_CLASS(a,b,c,what) extern struct program *what;
+#define IMAGE_SUBMODULE(a,b,c) 
+#define IMAGE_SUBMODMAG(a,b,c) 
+#define IMAGE_FUNCTION(a,name,c,d) void name(INT32 args);
+#endif
+
+IMAGE_CLASS("Image",      init_image_image,      exit_image_image, 
+	    image_program )
+
+IMAGE_CLASS("Colortable", init_image_colortable, exit_image_colortable, 
+	    image_colortable_program )
+
+IMAGE_CLASS("Color",      init_image_colors,     exit_image_colors,
+	    image_colors_program )
+
+IMAGE_CLASS("Layer",      init_image_layers,     exit_image_layers,
+	    image_layer_program )
+
+IMAGE_CLASS("font",       init_image_font,       exit_image_font,
+	    image_font_program )
+
+IMAGE_SUBMODULE("ANY",   init_image_any,  exit_image_any  ) 
+IMAGE_SUBMODULE("AVS",   init_image_avs,  exit_image_avs  ) 
+IMAGE_SUBMODULE("BMP",   init_image_bmp,  exit_image_bmp  ) 
+IMAGE_SUBMODULE("GD",    init_image_gd,   exit_image_gd   )
+IMAGE_SUBMODULE("GIF",   init_image_gif,  exit_image_gif  )
+IMAGE_SUBMODULE("HRZ",   init_image_hrz,  exit_image_hrz  ) 
+IMAGE_SUBMODULE("ILBM",  init_image_ilbm, exit_image_ilbm ) 
+IMAGE_SUBMODULE("PCX",   init_image_pcx,  exit_image_pcx  ) 
+IMAGE_SUBMODULE("PNM",   init_image_pnm,  exit_image_pnm  ) 
+IMAGE_SUBMODULE("PSD",   init_image_psd,  exit_image_psd  ) 
+IMAGE_SUBMODULE("TGA",   init_image_tga,  exit_image_tga  ) 
+IMAGE_SUBMODULE("X",     init_image_x,    exit_image_x    ) 
+IMAGE_SUBMODULE("XBM",   init_image_xbm,  exit_image_xbm  ) 
+IMAGE_SUBMODULE("XCF",   init_image_xcf,  exit_image_xcf  ) 
+IMAGE_SUBMODULE("XWD",   init_image_xwd,  exit_image_xwd  ) 
+IMAGE_SUBMODULE("_XPM",  init_image__xpm, exit_image__xpm ) 
+
+IMAGE_SUBMODMAG("PNG",   init_image_png,  exit_image_png  )
+
+IMAGE_FUNCTION("lay",image_lay,
+	       tOr(tFunc(tArr(tOr(tObj,tLayerMap)),tObj),
+		   tFunc(tArr(tOr(tObj,tLayerMap))
+			 tInt tInt tInt tInt,tObj)),0)
diff --git a/src/modules/Image/layers.c b/src/modules/Image/layers.c
index 0b0e7baab6..2a18dc9e98 100644
--- a/src/modules/Image/layers.c
+++ b/src/modules/Image/layers.c
@@ -1,7 +1,7 @@
 /*
 **! module Image
 **! note
-**!	$Id: layers.c,v 1.11 1999/05/08 00:42:12 hubbe Exp $
+**!	$Id: layers.c,v 1.12 1999/05/23 17:46:44 mirar Exp $
 **! class Layer
 */
 
@@ -10,7 +10,7 @@
 
 #include <math.h> /* floor */
 
-RCSID("$Id: layers.c,v 1.11 1999/05/08 00:42:12 hubbe Exp $");
+RCSID("$Id: layers.c,v 1.12 1999/05/23 17:46:44 mirar Exp $");
 
 #include "config.h"
 
@@ -2060,14 +2060,12 @@ void init_image_layers(void)
    for (i=0; i<LAYER_MODES; i++)
       layer_mode[i].ps=make_shared_string(layer_mode[i].name);
 
-   start_new_program();
+   /* layer object */
 
    ADD_STORAGE(struct layer);
    set_init_callback(init_layer);
    set_exit_callback(exit_layer);
 
-#define tLayerMap tMap(tString,tOr4(tString,tColor,tFloat,tInt))
-
    ADD_FUNCTION("create",image_layer_create,
 		tOr4(tFunc(,tVoid),
 		     tFunc(tObj tOr(tObj,tVoid) tOr(tString,tVoid),tVoid),
@@ -2109,15 +2107,6 @@ void init_image_layers(void)
    ADD_FUNCTION("fill_alpha",image_layer_fill_alpha,tFunc(,tObj),0);
 
    ADD_FUNCTION("tiled",image_layer_tiled,tFunc(,tInt01),0);
-
-   image_layer_program=end_program();
-
-   add_program_constant("Layer",image_layer_program,0);
-
-   ADD_FUNCTION("lay",image_lay,
-		tOr(tFunc(tArr(tOr(tObj,tLayerMap)),tObj),
-		    tFunc(tArr(tOr(tObj,tLayerMap))
-			  tInt tInt tInt tInt,tObj)),0);
 }
 
 void exit_image_layers(void)
@@ -2126,10 +2115,4 @@ void exit_image_layers(void)
    
    for (i=0; i<LAYER_MODES; i++)
       free_string(layer_mode[i].ps);
-
-   if (image_layer_program)
-   {
-      free_program(image_layer_program);
-      image_layer_program=NULL;
-   }
 }
diff --git a/src/modules/Image/pattern.c b/src/modules/Image/pattern.c
index 0bd4b53075..6dc60393de 100644
--- a/src/modules/Image/pattern.c
+++ b/src/modules/Image/pattern.c
@@ -1,9 +1,9 @@
-/* $Id: pattern.c,v 1.15 1999/04/13 12:32:30 mirar Exp $ */
+/* $Id: pattern.c,v 1.16 1999/05/23 17:46:45 mirar Exp $ */
 
 /*
 **! module Image
 **! note
-**!	$Id: pattern.c,v 1.15 1999/04/13 12:32:30 mirar Exp $
+**!	$Id: pattern.c,v 1.16 1999/05/23 17:46:45 mirar Exp $
 **! class Image
 */
 
@@ -545,9 +545,3 @@ void image_random(INT32 args)
 
    push_object(o);
 }
-
-
-void image_noise_init(void)
-{
-
-}
-- 
GitLab