diff --git a/ChangeLog b/ChangeLog index d94760625d..bf11315dd7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,30 @@ +2003-07-13 Helvetix Victorinox + + * app/paint-funcs/Makefile.am include files from app/composite/ + + * app/paint-funcs/paint-funcs.c stubbed out code for using + gimp_composite. To enable the use of gimp_composite, set the + value of gimp_composite_use_old to 0 (zero). + + * app/base/base.c calls gimp_composite_init() hook to initialse + all the gimp_composite "stuff." + + * app/composite/make-gimp-composite-dispatch.py now generates + gimp-composite-dispatch.h + + * app/composite/gimp-composite-dispatch.[ch] are in CVS although + they are generated files. This is preparation for building the + table at run-time, instead of compile time. + + * app/composite/gimp-composite.c doesn't #include the main + dispatch table. This is preparation for building the table at + run-time, instead of compile time. + + * app/composite/Makefile.am doesn't compile gimp-composite-mmx.c + (until the various remaining gcc problems and configuration issues + are worked out). + + 2003-07-11 Michael Natterer * app/config/gimpconfig.c (gimp_config_reset): don't return stuff diff --git a/app/Makefile.am b/app/Makefile.am index 12273b77e9..ea3dbb3ad1 100644 --- a/app/Makefile.am +++ b/app/Makefile.am @@ -78,8 +78,8 @@ gimp_1_3_LDADD = \ file/libappfile.a \ plug-in/libappplug-in.a \ paint-funcs/libapppaint-funcs.a \ - composite/libappcomposite.a \ base/libappbase.a \ + composite/libappcomposite.a \ $(top_builddir)/libgimpcolor/libgimpcolor-$(LT_RELEASE).la \ $(top_builddir)/libgimpmath/libgimpmath-$(LT_RELEASE).la \ $(top_builddir)/libgimpbase/libgimpbase-$(LT_RELEASE).la \ diff --git a/app/base/base.c b/app/base/base.c index 8d047fa255..897e7c951d 100644 --- a/app/base/base.c +++ b/app/base/base.c @@ -118,6 +118,7 @@ base_init (GimpBaseConfig *config, g_free (path); paint_funcs_setup (use_mmx); + gimp_composite_init(); } void diff --git a/app/composite/Makefile.am b/app/composite/Makefile.am index e6c143dc82..e394b0e44f 100644 --- a/app/composite/Makefile.am +++ b/app/composite/Makefile.am @@ -18,13 +18,16 @@ INCLUDES = \ noinst_LIBRARIES = libappcomposite.a +libappcomposite_mmx_sources = \ + gimp-composite-mmx.c \ + gimp-composite-mmx.h \ + libappcomposite_a_sources = \ gimp-composite.c \ gimp-composite-generic.c \ gimp-composite-generic.h \ gimp-composite.h \ - gimp-composite-mmx.c \ - gimp-composite-mmx.h \ + gimp-composite-dispatch.c \ gimp-composite-util.h libappcomposite_a_built_sources = gimp-composite-dispatch.c @@ -32,6 +35,7 @@ libappcomposite_a_built_sources = gimp-composite-dispatch.c libappcomposite_a_SOURCES = $(libappcomposite_a_built_sources) $(libappcomposite_a_sources) + gimp-composite.c: gimp-composite-dispatch.c gimp-composite-dispatch.c: gimp-composite-generic.o make-gimp-composite-dispatch.py @@ -46,7 +50,7 @@ EXTRA_PROGRAMS = test-composite # -# unit tests for GimpComposite +# unit tests and meta tools for GimpComposite # TESTS = test-composite diff --git a/app/composite/gimp-composite.c b/app/composite/gimp-composite.c index fe373dda07..88108a5974 100644 --- a/app/composite/gimp-composite.c +++ b/app/composite/gimp-composite.c @@ -151,7 +151,10 @@ struct { char announce_function; } gimp_composite_debug; -#include "gimp-composite-dispatch.c" +/*#include "gimp-composite-dispatch.c"*/ + +extern char *gimp_composite_function_name[GIMP_COMPOSITE_N][GIMP_PIXELFORMAT_N][GIMP_PIXELFORMAT_N][GIMP_PIXELFORMAT_N]; +extern void (*gimp_composite_function[GIMP_COMPOSITE_N][GIMP_PIXELFORMAT_N][GIMP_PIXELFORMAT_N][GIMP_PIXELFORMAT_N]); void gimp_composite_dispatch(GimpCompositeContext *ctx) diff --git a/app/composite/gimp-composite.h b/app/composite/gimp-composite.h index 12f97396c7..7d62f61965 100644 --- a/app/composite/gimp-composite.h +++ b/app/composite/gimp-composite.h @@ -39,6 +39,9 @@ typedef enum GIMP_PIXELFORMAT_N } GimpPixelFormat; +/* + * The following typedefs are temporary and only used in regression testing. + */ typedef struct { guint8 v; diff --git a/app/composite/make-gimp-composite-dispatch.py b/app/composite/make-gimp-composite-dispatch.py index 7c56906390..04a6e2ac24 100755 --- a/app/composite/make-gimp-composite-dispatch.py +++ b/app/composite/make-gimp-composite-dispatch.py @@ -118,56 +118,56 @@ def print_function_table(filename, function_table): for key in function_table_keys: if not function_table_declarations.has_key(function_table[key][0]): - print "void %s(GimpCompositeContext *);" % (function_table[key][0]) + print 'void %s(GimpCompositeContext *);' % (function_table[key][0]) function_table_declarations[function_table[key][0]] = function_table[key][0] pass pass - print "" - print "void (*%s[%d][%d][%d][%d])() = {" % (functionnameify(filename), - len(composite_modes), - len(pixel_format)-1, - len(pixel_format)-1, - len(pixel_format)-1) + print '' + print 'GimpCompositeFunction (*%s[%s][%s][%s][%s])() = {' % (functionnameify(filename), + "GIMP_COMPOSITE_N", + "GIMP_PIXELFORMAT_N", + "GIMP_PIXELFORMAT_N", + "GIMP_PIXELFORMAT_N") for mode in composite_modes: - print " { /* %s */" % (mode) + print ' { /* %s */' % (mode) for A in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): - print " { /* A = %s */" % (pixel_depth_name(A)) + print ' { /* A = %s */' % (pixel_depth_name(A)) for B in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): - print " /* %-6s */ {" % (pixel_depth_name(B)), + print ' /* %-6s */ {' % (pixel_depth_name(B)), for D in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): key = "%s_%s_%s_%s" % (string.lower(mode), pixel_depth_name(A), pixel_depth_name(B), pixel_depth_name(D)) if function_table.has_key(key): - print "%s, " % (function_table[key][0]), + print '%s, ' % (function_table[key][0]), else: - print "%s, " % ("NULL"), + print '%s, ' % ("NULL"), pass pass - print "}," + print '},' pass - print " }," + print ' },' pass - print " }," + print ' },' pass - print "};\n" + print '};\n' return def print_function_table_name(filename, function_table): - print "" - print "char *%s_name[%d][%d][%d][%d] = {" % (functionnameify(filename), - len(composite_modes), - len(pixel_format)-1, - len(pixel_format)-1, - len(pixel_format)-1) + print '' + print 'char *%s_name[%s][%s][%s][%s] = {' % (functionnameify(filename), + "GIMP_COMPOSITE_N", + "GIMP_PIXELFORMAT_N", + "GIMP_PIXELFORMAT_N", + "GIMP_PIXELFORMAT_N") for mode in composite_modes: - print " { /* %s */" % (mode) + print ' { /* %s */' % (mode) for A in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): - print " { /* A = %s */" % (pixel_depth_name(A)) + print ' { /* A = %s */' % (pixel_depth_name(A)) for B in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): - print " /* %-6s */ {" % (pixel_depth_name(B)), + print ' /* %-6s */ {' % (pixel_depth_name(B)), for D in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): key = "%s_%s_%s_%s" % (string.lower(mode), pixel_depth_name(A), pixel_depth_name(B), pixel_depth_name(D)) if function_table.has_key(key): @@ -176,14 +176,14 @@ def print_function_table_name(filename, function_table): print '"%s", ' % (""), pass pass - print "}," + print '},' pass - print " }," + print ' },' pass - print " }," + print ' },' pass - print "};\n" + print '};\n' return @@ -286,27 +286,27 @@ def main(argv): pass - print "/* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT */" - print "$Id$" + print '/* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT */' + print '$Id$' print '#include "gimp-composite.h"' - print "extern void %s(GimpCompositeContext *);" % ("gimp_composite_unsupported") + print 'extern void %s(GimpCompositeContext *);' % ("gimp_composite_unsupported") done = dict() for k in gimp_composite_function.keys(): f = gimp_composite_function[k] if not done.has_key(f[0]): - print "extern void %s(GimpCompositeContext *);" % (f[0]) + print 'extern void %s(GimpCompositeContext *);' % (f[0]) done.update({f[0] : None}) pass pass if 1: - print "char *gimp_composite_function_name[%d][%d][%d][%d] = {" % (len(composite_modes), len(pixel_format)-1, len(pixel_format)-1, len(pixel_format)-1) + print 'char *gimp_composite_function_name[%d][%d][%d][%d] = {' % (len(composite_modes), len(pixel_format)-1, len(pixel_format)-1, len(pixel_format)-1) for mode in composite_modes: - print " {" + print ' {' for A in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): - print " {" + print ' {' for B in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): - print " {", + print ' {', for D in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): key = "%s_%s_%s_%s" % (string.lower(mode), pixel_depth_name(A), pixel_depth_name(B), pixel_depth_name(D)) if gimp_composite_function.has_key(key): @@ -315,71 +315,67 @@ def main(argv): print '"%s", ' % ("gimp_composite_unsupported"), pass pass - print "}," + print '},' pass - print " }," + print ' },' pass - print " }," + print ' },' pass - print "};" + print '};' pass - print "" - print "void (*gimp_composite_function[%d][%d][%d][%d])() = {" % (len(composite_modes), len(pixel_format)-1, len(pixel_format)-1, len(pixel_format)-1) + print '' + print 'void (*gimp_composite_function[%d][%d][%d][%d])() = {' % (len(composite_modes), len(pixel_format)-1, len(pixel_format)-1, len(pixel_format)-1) for mode in composite_modes: - print " { /* %s */" % (mode) + print ' { /* %s */' % (mode) for A in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): - print " { /* A = %s */" % (pixel_depth_name(A)) + print ' { /* A = %s */' % (pixel_depth_name(A)) for B in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): - print " /* %s */ {" % (pixel_depth_name(B)), + print ' /* %s */ {' % (pixel_depth_name(B)), for D in filter(lambda pf: pf != "GIMP_PIXELFORMAT_ANY", pixel_format): key = "%s_%s_%s_%s" % (string.lower(mode), pixel_depth_name(A), pixel_depth_name(B), pixel_depth_name(D)) if gimp_composite_function.has_key(key): - print "%s, " % (gimp_composite_function[key][0]), + print '%s, ' % (gimp_composite_function[key][0]), else: - print "%s, " % ("gimp_composite_unsupported"), + print '%s, ' % ("gimp_composite_unsupported"), pass pass - print "}," + print '},' pass - print " }," + print ' },' pass - print " }," + print ' },' pass - print "};" + print '};' - print """ -static int gimp_composite_initialised = 0; + print 'static int gimp_composite_initialised = 0;' + print 'void' + print 'gimp_composite_init()' + print '{' + print 'if (!gimp_composite_initialised) {' -void -gimp_composite_init() -{ - if (!gimp_composite_initialised) { -""" for o in objects: - print " %s_init();" % (functionnameify(o.filename)) + print ' %s_init();' % (functionnameify(o.filename)) pass - print " gimp_composite_initialised = 1;" - print " }" - print "}" + print ' gimp_composite_initialised = 1;' + print ' }' + print '}' pass def gimp_composite_regression(function_tables): - print """ -void -gimp_composite_regression() -{ - GimpCompositeContext generic_ctx; - GimpCompositeContext special_ctx; -""" + print 'void' + print 'gimp_composite_regression()' + print '{' + print ' GimpCompositeContext generic_ctx;' + print ' GimpCompositeContext special_ctx;' generic_table = function_tables[0][1] @@ -390,11 +386,11 @@ gimp_composite_regression() for f in function_tables[1:]: key = "%s_%s_%s_%s" % (string.lower(mode), pixel_depth_name(A), pixel_depth_name(B), pixel_depth_name(D)) if f[1].has_key(key): - print "" - print " special_ctx.op = %s;" % (mode) - print " generic_ctx.op = %s;" % (mode) - print " %s(&special_ctx);" % (f[1][key][0]) - print " %s(&generic_ctx);" % (generic_table[key][0]) + print '' + print ' special_ctx.op = %s;' % (mode) + print ' generic_ctx.op = %s;' % (mode) + print ' %s(&special_ctx);' % (f[1][key][0]) + print ' %s(&generic_ctx);' % (generic_table[key][0]) print ' if (gimp_composite_regression_compare(&generic_ctx, &special_ctx)) {' print ' printf("%s disagrees with %s\\n");' % (f[1][key][0], generic_table[key][0]) print ' }' @@ -405,43 +401,53 @@ gimp_composite_regression() pass pass - - print """ -} -""" + print '}' + def gimp_composite_init(function_tables): for o in function_tables: - print "extern void %s_init();" % (functionnameify(o[0])) + print 'extern void %s_init();' % (functionnameify(o[0])) pass - print "" - - print """ -static int gimp_composite_initialised = 0; + print '' + print 'static int gimp_composite_initialised = 0;' + print '' + print 'void' + print 'gimp_composite_init()' + print '{' + print ' if (!gimp_composite_initialised) {' -void -gimp_composite_init() -{ - if (!gimp_composite_initialised) { -""" for o in function_tables: - print " %s_init();" % (functionnameify(o[0])) + print ' %s_init();' % (functionnameify(o[0])) pass - print " gimp_composite_initialised = 1;" - print " }" - print "}" + print ' gimp_composite_initialised = 1;' + print ' }' + print '}' pass +def gimp_composite_hfile(fpout): + print >>fpout, '/* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT */' + print >>fpout, '' + print >>fpout, 'typedef void (*GimpCompositeFunction)(GimpCompositeContext *);' + print >>fpout, 'typedef GimpCompositeFunction (*GimpCompositeFunctionTable[%s][%s][%s][%s]);' % ("GIMP_COMPOSITE_N", + "GIMP_PIXELFORMAT_N", + "GIMP_PIXELFORMAT_N", + "GIMP_PIXELFORMAT_N") + pass -print "/* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT */" +gimp_composite_hfile(open("gimp-composite-dispatch.h", "w")) + + +print '/* THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT */' print '#include "config.h"' print '#include ' print '#include "base/base-types.h"' print '#include "gimp-composite.h"' -print "extern void %s(GimpCompositeContext *);" % ("gimp_composite_unsupported") -print "" +print '#include "gimp-composite-dispatch.h"' +print 'extern GimpCompositeFunction %s;' % ("gimp_composite_unsupported") +print '' + d = list() for f in sys.argv[1:]: diff --git a/app/paint-funcs/Makefile.am b/app/paint-funcs/Makefile.am index dea9b01c8c..63a8b6dcd7 100644 --- a/app/paint-funcs/Makefile.am +++ b/app/paint-funcs/Makefile.am @@ -11,6 +11,7 @@ libapppaint_funcs_a_SOURCES = \ INCLUDES = \ -I$(top_srcdir) \ -I$(top_srcdir)/app \ + -I$(top_srcdir)/app/composite \ $(GLIB_CFLAGS) \ -I$(includedir) diff --git a/app/paint-funcs/paint-funcs.c b/app/paint-funcs/paint-funcs.c index 38e7a1d39b..4517a2dfed 100644 --- a/app/paint-funcs/paint-funcs.c +++ b/app/paint-funcs/paint-funcs.c @@ -36,6 +36,8 @@ #include "paint-funcs.h" #include "paint-funcs-generic.h" +#include "gimp-composite.h" +int gimp_composite_use_old = 1; #define RANDOM_SEED 314159265 #define EPSILON 0.0001 @@ -4544,6 +4546,7 @@ combine_sub_region (struct combine_regions_struct *st, alms.bytes1 = src1->bytes; alms.bytes2 = src2->bytes; + if (gimp_composite_use_old) { /* Determine whether the alpha channel of the destination can be * affected by the specified mode--This keeps consistency with * varying opacities @@ -4553,6 +4556,36 @@ combine_sub_region (struct combine_regions_struct *st, layer_mode_funcs[mode] (&alms); combine = (alms.combine == NO_COMBINATION) ? type : alms.combine; + } else { + GimpCompositeContext ctx; + + ctx.A = s1; + ctx.pixelformat_A = (src1->bytes == 1 ? GIMP_PIXELFORMAT_V8 + : src1->bytes == 2 ? GIMP_PIXELFORMAT_VA8 + : src1->bytes == 3 ? GIMP_PIXELFORMAT_RGB8 + : src1->bytes == 4 ? GIMP_PIXELFORMAT_RGBA8 + : GIMP_PIXELFORMAT_ANY); + ctx.B = s2; + ctx.pixelformat_B = (src2->bytes == 1 ? GIMP_PIXELFORMAT_V8 + : src2->bytes == 2 ? GIMP_PIXELFORMAT_VA8 + : src2->bytes == 3 ? GIMP_PIXELFORMAT_RGB8 + : src2->bytes == 4 ? GIMP_PIXELFORMAT_RGBA8 + : GIMP_PIXELFORMAT_ANY); + ctx.D = s; + ctx.pixelformat_D = gimp_composite_pixel_alpha[ctx.pixelformat_B]; + ctx.n_pixels = src1->w; + ctx.combine = combine; + ctx.op = mode; + ctx.dissolve.x = src1->x; + ctx.dissolve.y = src1->y + h; + ctx.dissolve.opacity = opacity; + + mode_affect = gimp_composite_operation_effects[mode].affect_opacity; + gimp_composite_dispatch(&ctx); + s = ctx.D; + combine = (ctx.combine == NO_COMBINATION) ? type : ctx.combine; + } + break; }