From 6439161e806a77e3e534005aa490d2f292f493e3 Mon Sep 17 00:00:00 2001 From: Vidar Madsen/gimpressionist Date: Thu, 9 Sep 1999 20:28:34 +0000 Subject: [PATCH] Various fixes/enhancements * plug-ins/common/spheredesigner.c: Various fixes/enhancements * plug-ins/gimpressionist/Makefile.am * plug-ins/gimpressionist/ChangeLog * plug-ins/gimpressionist/*.[ch]: Added Color options (new file color.c) --- ChangeLog | 8 ++ plug-ins/common/spheredesigner.c | 79 ++++++++++---- plug-ins/gimpressionist/ChangeLog | 14 +++ plug-ins/gimpressionist/Makefile.am | 3 +- plug-ins/gimpressionist/color.c | 127 +++++++++++++++++++++++ plug-ins/gimpressionist/gimp.c | 4 +- plug-ins/gimpressionist/gimpressionist.c | 5 + plug-ins/gimpressionist/gimpressionist.h | 19 +++- plug-ins/gimpressionist/orientmap.c | 16 +-- plug-ins/gimpressionist/ppmtool.c | 2 +- plug-ins/gimpressionist/presets.c | 8 ++ plug-ins/gimpressionist/preview.c | 2 +- plug-ins/gimpressionist/repaint.c | 54 ++++++---- 13 files changed, 282 insertions(+), 59 deletions(-) create mode 100644 plug-ins/gimpressionist/color.c diff --git a/ChangeLog b/ChangeLog index e6cd62b02c..da19028796 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Thu Sep 9 22:23:06 CET 1999 vidar@prosalg.no (Vidar Madsen) + + * plug-ins/common/spheredesigner.c: Various fixes/enhancements + + * plug-ins/gimpressionist/ChangeLog + * plug-ins/gimpressionist/Makefile.am + * plug-ins/gimpressionist/*.[ch]: Added Color options (new file color.c) + 1999-09-09 Tomas Ogren * app/Makefile.am: Add the path_tool* here, makes gimp compile diff --git a/plug-ins/common/spheredesigner.c b/plug-ins/common/spheredesigner.c index fddba23fad..0a328bbe12 100644 --- a/plug-ins/common/spheredesigner.c +++ b/plug-ins/common/spheredesigner.c @@ -5,15 +5,18 @@ * SphereDesigner v0.4 - creates textured spheres * by Vidar Madsen * - * Status: Aug 31 1999 - Messy source, will clean up later. + * Status: Last updated 1999-09-09 + * + * Known issues: + * - Crash if you click OK or Cancel before first preview is rendered + * - Phong might look weird with transparent textures * * Todo: - * - Editing of lights * - Saving / Loading of presets - * - Transparency in textures (preliminary work started) * - Antialiasing * - Global controls: Gamma, ++ * - Beautification of GUI + * - Clean up messy source (lots of Glade remnants) * - (Probably more. ;-) */ @@ -118,6 +121,7 @@ typedef struct { vector color1, color2; gradient gradient; vector ambient, diffuse; + double oscale; vector scale, translate, rotate; image image; vector reflection; @@ -264,6 +268,7 @@ GtkWidget *texturelist = NULL; GtkObject *scalexscale,*scaleyscale,*scalezscale; GtkObject *rotxscale,*rotyscale,*rotzscale; GtkObject *posxscale,*posyscale,*poszscale; +GtkObject *scalescale; GtkObject *turbulencescale; GtkObject *amountscale; GtkObject *expscale; @@ -272,7 +277,6 @@ GtkWidget *texturemenu_menu; GtkWidget *typemenu; GtkWidget *texturemenu; - #define DOT(a,b) (a[0] * b[0] + a[1] * b[1] + a[2] * b[2]) #define B 256 @@ -1029,6 +1033,7 @@ void objcolor(vector *col, vector *p, common *obj) case TRANSPARENT: case SMOKE: /* Silently ignore non-color textures */ + continue; break; default: fprintf(stderr, "Warning: unknown texture %d\n", t->type); @@ -1228,8 +1233,8 @@ void calclight(vector *col, vector *point, common *obj) if(obj->texture[j].type == PHONG) continue; if(obj->texture[j].type == REFLECTION) continue; if(obj->texture[j].type == REFRACTION) continue; - if(obj->texture[i].type == TRANSPARENT) continue; - if(obj->texture[i].type == SMOKE) continue; + if(obj->texture[j].type == TRANSPARENT) continue; + if(obj->texture[j].type == SMOKE) continue; vcopy(&lcol, &pcol); vvmul(&lcol, &world.light[i].color); vvmul(&lcol, &obj->texture[j].diffuse); @@ -1364,8 +1369,11 @@ int traceray(ray *r, vector *col, int level, double imp) if((world.quality >= 4) && ((bobj->texture[i].type == REFLECTION) || (bobj->texture[i].type == PHONG))) { - vector refcol, norm; + vector refcol, norm, ocol; ray ref; + + objcolor(&ocol, &p, bobj); + vcopy(&ref.v1, &p); vcopy(&ref.v2, &r->v1); ref.inside = r->inside; @@ -1387,11 +1395,13 @@ int traceray(ray *r, vector *col, int level, double imp) if((world.quality >= 5) && (bobj->texture[i].type == REFLECTION)) { traceray(&ref, &refcol, level - 1, imp * vmax(&bobj->texture[i].reflection)); vvmul(&refcol, &bobj->texture[i].reflection); + refcol.w = ocol.w; vadd(col, &refcol); } if(bobj->texture[i].type == PHONG) { vcset(&refcol,0,0,0,0); calcphong(bobj, &ref, &refcol); + refcol.w = ocol.w; vadd(col, &refcol); } @@ -1543,6 +1553,7 @@ void setdefaults(texture *t) vset(&t->scale,1,1,1); vset(&t->rotate,0,0,0); vset(&t->translate,0,0,0); + t->oscale = 1.0; t->amount = 1.0; t->exp = 1.0; } @@ -1609,6 +1620,8 @@ void setvals(texture *t) noupdate = 1; gtk_adjustment_set_value(GTK_ADJUSTMENT(amountscale), t->amount); + gtk_adjustment_set_value(GTK_ADJUSTMENT(scalescale), t->oscale); + gtk_adjustment_set_value(GTK_ADJUSTMENT(scalexscale), t->scale.x); gtk_adjustment_set_value(GTK_ADJUSTMENT(scaleyscale), t->scale.y); gtk_adjustment_set_value(GTK_ADJUSTMENT(scalezscale), t->scale.z); @@ -1769,17 +1782,20 @@ void initworld(void) if(t->majtype == 0) { /* Normal texture */ if(t->type == PHONG) { memcpy(&t->phongcolor, &t->color1, sizeof(t->color1)); - t->phongsize = t->scale.x / 25.0; + t->phongsize = t->oscale / 25.0; } memcpy(&d->texture[d->numtexture],t,sizeof(texture)); + vmul(&d->texture[d->numtexture].scale, d->texture[d->numtexture].oscale); d->numtexture++; } else if(t->majtype == 1) { /* Bumpmap */ memcpy(&d->normal[d->numnormal],t,sizeof(texture)); + vmul(&d->normal[d->numnormal].scale, d->texture[d->numnormal].oscale); d->numnormal++; } else if(t->majtype == 2) { /* Lightsource */ light l; vcopy(&l.a, &t->translate); vcopy(&l.color, &t->color1); + vmul(&l.color, t->amount); memcpy(&world.light[world.numlight], &l, sizeof(l)); world.numlight++; } @@ -1858,6 +1874,7 @@ void getscales(GtkWidget *wg, gpointer data) f = GTK_ADJUSTMENT(turbulencescale)->value; vset(&t->turbulence, f,f,f); + t->oscale = GTK_ADJUSTMENT(scalescale)->value; t->scale.x = GTK_ADJUSTMENT(scalexscale)->value; t->scale.y = GTK_ADJUSTMENT(scaleyscale)->value; t->scale.z = GTK_ADJUSTMENT(scalezscale)->value; @@ -2049,7 +2066,7 @@ void sphere_ok(GtkWidget *widget, gpointer data) void sphere_cancel(GtkWidget *widget, gpointer data) { - gtk_widget_destroy (GTK_WIDGET (data)); + gtk_widget_hide (GTK_WIDGET (data)); gtk_main_quit(); } @@ -2099,7 +2116,7 @@ GtkWidget* makewindow (void) gtk_object_set_data (GTK_OBJECT (window), "window", window); gtk_container_border_width (GTK_CONTAINER (window), 5); gtk_window_set_title (GTK_WINDOW (window), "SphereDesigner"); - gtk_window_set_policy (GTK_WINDOW (window), TRUE, TRUE, FALSE); + gtk_window_set_policy (GTK_WINDOW (window), FALSE, TRUE, FALSE); table1 = gtk_table_new (3, 3, FALSE); gtk_object_set_data (GTK_OBJECT (window), "table1", table1); @@ -2195,7 +2212,7 @@ GtkWidget* makewindow (void) gtk_signal_connect (GTK_OBJECT (resetbutton), "clicked", GTK_SIGNAL_FUNC (sphere_reset), window); - frame4 = gtk_frame_new ("Properties"); + frame4 = gtk_frame_new ("Texture Properties"); gtk_object_set_data (GTK_OBJECT (window), "frame4", frame4); gtk_widget_show (frame4); gtk_table_attach (GTK_TABLE (table1), frame4, 2, 3, 0, 1, @@ -2258,6 +2275,23 @@ GtkWidget* makewindow (void) gtk_widget_show(tmpw); drawcolor2(tmpw); + label5 = gtk_label_new ("Scale:"); + gtk_object_set_data (GTK_OBJECT (window), "label5", label5); + gtk_widget_show (label5); + gtk_table_attach (GTK_TABLE (table2), label5, 0, 1, 3, 4, + (GtkAttachOptions) GTK_EXPAND | GTK_FILL, (GtkAttachOptions) GTK_EXPAND | GTK_FILL, 0, 0); + gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5); + + _scalescale = gtk_hscale_new (GTK_ADJUSTMENT (scalescale = gtk_adjustment_new (1.0, 0.0, 5.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_scalescale, 100, -1); + gtk_object_set_data (GTK_OBJECT (window), "_scalescale", _scalescale); + gtk_widget_show (_scalescale); + gtk_table_attach (GTK_TABLE (table2), _scalescale, 1, 2, 3, 4, + (GtkAttachOptions) GTK_EXPAND | GTK_FILL, (GtkAttachOptions) GTK_EXPAND, 0, 0); + gtk_scale_set_digits (GTK_SCALE (_scalescale), 2); + gtk_signal_connect(GTK_OBJECT(scalescale), "value_changed", + (GtkSignalFunc)getscales, NULL); + label5 = gtk_label_new ("Turbulence:"); gtk_object_set_data (GTK_OBJECT (window), "label5", label5); gtk_widget_show (label5); @@ -2266,6 +2300,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5); _turbulencescale = gtk_hscale_new (GTK_ADJUSTMENT (turbulencescale = gtk_adjustment_new (0.0, 0.0, 5.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_turbulencescale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_turbulencescale", _turbulencescale); gtk_widget_show (_turbulencescale); gtk_table_attach (GTK_TABLE (table2), _turbulencescale, 1, 2, 4, 5, @@ -2274,10 +2309,6 @@ GtkWidget* makewindow (void) gtk_signal_connect(GTK_OBJECT(turbulencescale), "value_changed", (GtkSignalFunc)getscales, NULL); - - - - label6 = gtk_label_new ("Scale X:"); gtk_object_set_data (GTK_OBJECT (window), "label6", label6); gtk_widget_show (label6); @@ -2286,6 +2317,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); _scalescale = gtk_hscale_new (GTK_ADJUSTMENT (scalexscale = gtk_adjustment_new (1.0, 0.0, 5.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_scalescale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_scalescale", _scalescale); gtk_scale_set_digits (GTK_SCALE (_scalescale), 2); gtk_widget_show (_scalescale); @@ -2302,6 +2334,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); _scalescale = gtk_hscale_new (GTK_ADJUSTMENT (scaleyscale = gtk_adjustment_new (1.0, 0.0, 5.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_scalescale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_scalescale", _scalescale); gtk_scale_set_digits (GTK_SCALE (_scalescale), 2); gtk_widget_show (_scalescale); @@ -2318,6 +2351,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); _scalescale = gtk_hscale_new (GTK_ADJUSTMENT (scalezscale = gtk_adjustment_new (1.0, 0.0, 5.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_scalescale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_scalescale", _scalescale); gtk_scale_set_digits (GTK_SCALE (_scalescale), 2); gtk_widget_show (_scalescale); @@ -2336,6 +2370,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); _rotscale = gtk_hscale_new (GTK_ADJUSTMENT (rotxscale = gtk_adjustment_new (1.0, 0.0, 360.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_rotscale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_rotscale", _rotscale); gtk_scale_set_digits (GTK_SCALE (_rotscale), 2); gtk_widget_show (_rotscale); @@ -2352,6 +2387,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); _rotscale = gtk_hscale_new (GTK_ADJUSTMENT (rotyscale = gtk_adjustment_new (1.0, 0.0, 360.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_rotscale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_rotscale", _rotscale); gtk_scale_set_digits (GTK_SCALE (_rotscale), 2); gtk_widget_show (_rotscale); @@ -2368,6 +2404,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); _rotscale = gtk_hscale_new (GTK_ADJUSTMENT (rotzscale = gtk_adjustment_new (1.0, 0.0, 360.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_rotscale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_rotscale", _rotscale); gtk_scale_set_digits (GTK_SCALE (_rotscale), 2); gtk_widget_show (_rotscale); @@ -2376,8 +2413,6 @@ GtkWidget* makewindow (void) gtk_signal_connect(GTK_OBJECT(rotzscale), "value_changed", (GtkSignalFunc)getscales, NULL); - - label6 = gtk_label_new ("Pos X:"); gtk_object_set_data (GTK_OBJECT (window), "label6", label6); gtk_widget_show (label6); @@ -2386,6 +2421,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); _scalescale = gtk_hscale_new (GTK_ADJUSTMENT (posxscale = gtk_adjustment_new (0.0, -20.0, 20.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_scalescale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_scalescale", _scalescale); gtk_scale_set_digits (GTK_SCALE (_scalescale), 2); gtk_widget_show (_scalescale); @@ -2402,6 +2438,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); _scalescale = gtk_hscale_new (GTK_ADJUSTMENT (posyscale = gtk_adjustment_new (1.0, -20.0, 20.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_scalescale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_scalescale", _scalescale); gtk_scale_set_digits (GTK_SCALE (_scalescale), 2); gtk_widget_show (_scalescale); @@ -2418,6 +2455,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5); _scalescale = gtk_hscale_new (GTK_ADJUSTMENT (poszscale = gtk_adjustment_new (1.0, -20.0, 20.1, 0.1, 0.1, 0.1))); + gtk_widget_set_usize(_scalescale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_scalescale", _scalescale); gtk_scale_set_digits (GTK_SCALE (_scalescale), 2); gtk_widget_show (_scalescale); @@ -2426,11 +2464,6 @@ GtkWidget* makewindow (void) gtk_signal_connect(GTK_OBJECT(poszscale), "value_changed", (GtkSignalFunc)getscales, NULL); - - - - - typemenu = gtk_option_menu_new (); gtk_object_set_data (GTK_OBJECT (window), "typemenu", typemenu); gtk_widget_show (typemenu); @@ -2476,6 +2509,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label7), 0, 0.5); _amountscale = gtk_hscale_new (GTK_ADJUSTMENT (amountscale = gtk_adjustment_new (1.0, 0, 1.01, .01, .01, .01))); + gtk_widget_set_usize(_amountscale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_amountscale", _amountscale); gtk_widget_show (_amountscale); gtk_table_attach (GTK_TABLE (table2), _amountscale, 1, 2, 5, 6, @@ -2492,6 +2526,7 @@ GtkWidget* makewindow (void) gtk_misc_set_alignment (GTK_MISC (label8), 0, 0.5); _expscale = gtk_hscale_new (GTK_ADJUSTMENT (expscale = gtk_adjustment_new (1.0, 0, 1.01, .01, .01, .01))); + gtk_widget_set_usize(_expscale, 100, -1); gtk_object_set_data (GTK_OBJECT (window), "_expscale", _expscale); gtk_widget_show (_expscale); gtk_table_attach (GTK_TABLE (table2), _expscale, 1, 2, 6, 7, diff --git a/plug-ins/gimpressionist/ChangeLog b/plug-ins/gimpressionist/ChangeLog index 2492222e01..e0199f8e8a 100644 --- a/plug-ins/gimpressionist/ChangeLog +++ b/plug-ins/gimpressionist/ChangeLog @@ -1,6 +1,20 @@ (The events are in chronological order, latest first) +September 9 1999: + - Added the Color page, with two color sampling schemes and + color noise. + +August 29 1999: + - Big rewrite of many internals to get rid of the clumsy + "struct rgbcolor" + +August 26 1999: + - GIMPressionist is included in the CVS GIMP-development tree + - Fixed a //-style comment in repaint.c + - Renamed buffer in sizemap.c (it was also declared in orientmap.c) + August 23 1999: + - Released 0.99.5 - Added the missing Shadow controls - Fixed the applybrush() function. (It was foobar with regards to shadow handling.) It's still shaky when using Tilable, though... diff --git a/plug-ins/gimpressionist/Makefile.am b/plug-ins/gimpressionist/Makefile.am index befbe22776..06dd884847 100644 --- a/plug-ins/gimpressionist/Makefile.am +++ b/plug-ins/gimpressionist/Makefile.am @@ -26,7 +26,8 @@ gimpressionist_SOURCES = \ preview.c \ repaint.c \ size.c \ - sizemap.c + sizemap.c \ + color.c AM_CPPFLAGS = \ -DDEFAULTPATH=\""~/$(gimpdir)/gimpressionist:$(gimpdatadir)/gimpressionist"\" diff --git a/plug-ins/gimpressionist/color.c b/plug-ins/gimpressionist/color.c new file mode 100644 index 0000000000..c882ce1f91 --- /dev/null +++ b/plug-ins/gimpressionist/color.c @@ -0,0 +1,127 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#else +#define HAVE_DIRENT_H +#define HAVE_UNISTD_H +#endif + +#include +#include +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include "gimpressionist.h" +#include "ppmtool.h" + + +#define NUMCOLORRADIO 2 + +GtkWidget *colorradio[NUMCOLORRADIO]; +GtkObject *colornoiseadjust = NULL; + + +void colorchange(GtkWidget *wg, void *d, int num) +{ + int n; + if(wg) { + n = (long)d; + pcvals.colortype = n; + } else { + int i; + n = num; + for(i = 0; i < NUMCOLORRADIO; i++) + if(i != n) + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(colorradio[i]), FALSE); + else + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(colorradio[n]), TRUE); + } +} + +void create_colorpage(GtkNotebook *notebook) +{ + GtkWidget *box0, *box1, *box2, *box3, *thispage; + GtkWidget *labelbox, *menubox; + GtkWidget *tmpw; + char title[100]; + int i; + + sprintf(title, "Color"); + + labelbox = gtk_hbox_new (FALSE, 0); + tmpw = gtk_label_new(title); + gtk_box_pack_start(GTK_BOX(labelbox), tmpw, FALSE, FALSE, 0); + gtk_widget_show_all(labelbox); + + menubox = gtk_hbox_new (FALSE, 0); + tmpw = gtk_label_new(title); + gtk_box_pack_start(GTK_BOX(menubox), tmpw, FALSE, FALSE, 0); + gtk_widget_show_all(menubox); + + thispage = gtk_vbox_new(FALSE, 0); + gtk_container_border_width (GTK_CONTAINER (thispage), 5); + gtk_widget_show(thispage); + + box0 = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(thispage), box0,FALSE,FALSE,0); + gtk_widget_show (box0); + + box1 = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(box0), box1,FALSE,FALSE,0); + gtk_widget_show (box1); + + box2 = gtk_vbox_new (TRUE, 0); + gtk_box_pack_start(GTK_BOX(box1), box2,FALSE,FALSE,0); + gtk_widget_show (box2); + + tmpw = gtk_label_new("Color:"); + gtk_box_pack_start(GTK_BOX(box2), tmpw,FALSE,FALSE,0); + gtk_widget_show (tmpw); + + box3 = gtk_vbox_new(FALSE,0); + gtk_box_pack_start(GTK_BOX(box1), box3,FALSE,FALSE, 10); + gtk_widget_show(box3); + + i = pcvals.colortype; + + colorradio[0] = tmpw = gtk_radio_button_new_with_label(NULL, "Average under brush"); + gtk_box_pack_start(GTK_BOX(box3), tmpw, FALSE, FALSE, 0); + gtk_widget_show(tmpw); + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (tmpw), FALSE); + gtk_signal_connect(GTK_OBJECT(tmpw), "clicked", + (GtkSignalFunc)colorchange, (void *)0); + gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, "Color is computed from the average of all pixels under the brush", NULL); + if(i == 0) + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (tmpw), TRUE); + + colorradio[1] = tmpw = gtk_radio_button_new_with_label(gtk_radio_button_group(GTK_RADIO_BUTTON(tmpw)), "Center of brush"); + gtk_box_pack_start(GTK_BOX(box3), tmpw, FALSE, FALSE, 0); + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (tmpw), FALSE); + gtk_widget_show(tmpw); + gtk_signal_connect(GTK_OBJECT(tmpw), "clicked", + (GtkSignalFunc)colorchange, (void *)1); + gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, "Samples the color from the pixel in the center of the brush", NULL); + if(i == 1) + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (tmpw), TRUE); + + + box1 = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(box0), box1,FALSE,FALSE,0); + gtk_widget_show (box1); + + tmpw = gtk_label_new("Color noise:"); + gtk_box_pack_start(GTK_BOX(box1), tmpw,FALSE,FALSE,0); + gtk_widget_show (tmpw); + + colornoiseadjust = gtk_adjustment_new(pcvals.colornoise, 0.0, 101.0, 1.0, 1.0, 1.0); + tmpw = gtk_hscale_new(GTK_ADJUSTMENT(colornoiseadjust)); + gtk_widget_set_usize (GTK_WIDGET(tmpw), 150, 30); + gtk_scale_set_draw_value (GTK_SCALE (tmpw), TRUE); + gtk_scale_set_digits(GTK_SCALE (tmpw), 1); + gtk_box_pack_start (GTK_BOX (box1), tmpw, FALSE, FALSE, 10); + gtk_widget_show (tmpw); + gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, "Adds random noise to the color", NULL); + + gtk_notebook_append_page_menu (notebook, thispage, labelbox, menubox); +} diff --git a/plug-ins/gimpressionist/gimp.c b/plug-ins/gimpressionist/gimp.c index 60b3e2439f..adb54767cb 100644 --- a/plug-ins/gimpressionist/gimp.c +++ b/plug-ins/gimpressionist/gimp.c @@ -72,7 +72,9 @@ gimpressionist_vals_t defaultpcvals = { 0, 10, - 4 + 4, + + 0, 0.0 }; static GDrawable *drawable; diff --git a/plug-ins/gimpressionist/gimpressionist.c b/plug-ins/gimpressionist/gimpressionist.c index 5f4a8ce290..a2af516e40 100644 --- a/plug-ins/gimpressionist/gimpressionist.c +++ b/plug-ins/gimpressionist/gimpressionist.c @@ -154,6 +154,7 @@ void storevals(void) pcvals.devthresh = GTK_ADJUSTMENT(devthreshadjust)->value; pcvals.placecenter = GTK_TOGGLE_BUTTON(placecenter)->active; pcvals.paperoverlay = GTK_TOGGLE_BUTTON(paperoverlay)->active; + pcvals.colornoise = GTK_ADJUSTMENT(colornoiseadjust)->value; } void restorevals(void) @@ -197,6 +198,9 @@ void restorevals(void) drawcolor(NULL); + gtk_adjustment_set_value(GTK_ADJUSTMENT(colornoiseadjust), pcvals.colornoise); + colorchange(NULL, NULL, pcvals.colortype); + update_orientmap_dialog(); } @@ -463,6 +467,7 @@ int create_dialog(void) create_orientationpage(GTK_NOTEBOOK (notebook)); create_sizepage(GTK_NOTEBOOK (notebook)); create_placementpage(GTK_NOTEBOOK (notebook)); + create_colorpage(GTK_NOTEBOOK (notebook)); create_generalpage(GTK_NOTEBOOK (notebook)); create_presetpage(GTK_NOTEBOOK (notebook)); diff --git a/plug-ins/gimpressionist/gimpressionist.h b/plug-ins/gimpressionist/gimpressionist.h index 13fc70f212..96272144d1 100644 --- a/plug-ins/gimpressionist/gimpressionist.h +++ b/plug-ins/gimpressionist/gimpressionist.h @@ -1,7 +1,5 @@ #include -#include "libgimp/gimpmath.h" - #define PLUG_IN_NAME "plug_in_gimpressionist" #define PLUG_IN_VERSION "v0.99.6, August 1999" @@ -13,6 +11,14 @@ #define MAXORIENTVECT 50 #define MAXSIZEVECT 50 +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif /* M_PI */ + +#ifndef M_PI_2 +#define M_PI_2 (M_PI / 2.0) +#endif /* M_PI_2 */ + /* Type declaration and definitions */ struct vector_t { @@ -75,7 +81,8 @@ typedef struct { int generalshadowdepth; int generalshadowblur; - int coloracc; + int colortype; + double colornoise; } gimpressionist_vals_t; /* Globals */ @@ -131,7 +138,9 @@ extern GtkObject *generalshadowadjust; extern GtkObject *generalshadowdepth; extern GtkObject *generalshadowblur; extern GtkObject *devthreshadjust; -extern GtkObject *coloraccadjust; + +extern GtkWidget *colortype; +extern GtkObject *colornoiseadjust; extern GtkWidget *placecenter; @@ -154,6 +163,7 @@ void create_sizepage(GtkNotebook *); void create_generalpage(GtkNotebook *); void create_presetpage(GtkNotebook *); void create_placementpage(GtkNotebook *); +void create_colorpage(GtkNotebook *); GtkWidget* create_preview(); void updatepreviewprev(GtkWidget *wg, void *d); @@ -170,6 +180,7 @@ void drawcolor(GtkWidget *w); void orientchange(GtkWidget *wg, void *d, int num); void sizechange(GtkWidget *wg, void *d, int num); void placechange(GtkWidget *wg, void *d, int num); +void colorchange(GtkWidget *wg, void *d, int num); void generalbgchange(GtkWidget *wg, void *d, int num); void reloadbrush(char *fn, struct ppm *p); diff --git a/plug-ins/gimpressionist/orientmap.c b/plug-ins/gimpressionist/orientmap.c index 61b59b0216..ec298e900b 100644 --- a/plug-ins/gimpressionist/orientmap.c +++ b/plug-ins/gimpressionist/orientmap.c @@ -34,12 +34,12 @@ int numvect = 0; double degtorad(double d) { - return d/180.0*G_PI; + return d/180.0*M_PI; } double radtodeg(double d) { - double v = d/G_PI*180.0; + double v = d/M_PI*180.0; if(v < 0.0) v += 360; return v; } @@ -117,18 +117,18 @@ double getdir(double x, double y, int from) } else if(vec[i].type == 1) { double a = atan2(vec[i].dy, vec[i].dx); a -= atan2(y-vec[i].y, x-vec[i].x); - tx = sin(a+G_PI_2); - ty = cos(a+G_PI_2); + tx = sin(a+M_PI_2); + ty = cos(a+M_PI_2); } else if(vec[i].type == 2) { double a = atan2(vec[i].dy, vec[i].dx); a += atan2(y-vec[i].y, x-vec[i].x); - tx = sin(a+G_PI_2); - ty = cos(a+G_PI_2); + tx = sin(a+M_PI_2); + ty = cos(a+M_PI_2); } else if(vec[i].type == 3) { double a = atan2(vec[i].dy, vec[i].dx); a -= atan2(y-vec[i].y, x-vec[i].x)*2; - tx = sin(a+G_PI_2); - ty = cos(a+G_PI_2); + tx = sin(a+M_PI_2); + ty = cos(a+M_PI_2); } dst = dist(x,y,vec[i].x,vec[i].y); diff --git a/plug-ins/gimpressionist/ppmtool.c b/plug-ins/gimpressionist/ppmtool.c index 81989f4dd7..55bd614343 100644 --- a/plug-ins/gimpressionist/ppmtool.c +++ b/plug-ins/gimpressionist/ppmtool.c @@ -332,7 +332,7 @@ void freerotate(struct ppm *p, double amount) double nx, ny; double R, a; struct ppm tmp = {0,0,NULL}; - double f = amount*G_PI*2/360.0; + double f = amount*M_PI*2/360.0; int rowstride = p->width * 3; a = p->width/(float)p->height; diff --git a/plug-ins/gimpressionist/presets.c b/plug-ins/gimpressionist/presets.c index 43eae5be6e..dbfd334145 100644 --- a/plug-ins/gimpressionist/presets.c +++ b/plug-ins/gimpressionist/presets.c @@ -245,6 +245,11 @@ void setval(char *key, char *val) pcvals.sizestrexp = atof(val); else if(!strcmp(key, "sizevoronoi")) pcvals.sizevoronoi = atoi(val); + + else if(!strcmp(key, "colortype")) + pcvals.colortype = atoi(val); + else if(!strcmp(key, "colornoise")) + pcvals.colornoise = atof(val); } int loadpreset(char *fn) @@ -497,6 +502,9 @@ void savepreset(GtkWidget *wg, GtkWidget *p) fprintf(f, "sizestrexp=%f\n", pcvals.sizestrexp); fprintf(f, "sizevoronoi=%d\n", pcvals.sizevoronoi); + fprintf(f, "colortype=%d\n", pcvals.colortype); + fprintf(f, "colornoise=%f\n", pcvals.colornoise); + fclose(f); presetsrefresh(); reselect(presetlist, fname); diff --git a/plug-ins/gimpressionist/preview.c b/plug-ins/gimpressionist/preview.c index e4b8543f9b..37cfe25a80 100644 --- a/plug-ins/gimpressionist/preview.c +++ b/plug-ins/gimpressionist/preview.c @@ -85,7 +85,7 @@ void updatepreviewprev(GtkWidget *wg, void *d) for(i = 0; i < PREVIEWSIZE; i++) { memset(buf,0,PREVIEWSIZE*3); - /* for(j = 0; j < p.width; j++) */ + //for(j = 0; j < p.width; j++) gtk_preview_draw_row(GTK_PREVIEW(previewprev), (guchar *)&p.col[i*PREVIEWSIZE*3], 0, i, PREVIEWSIZE); } killppm(&p); diff --git a/plug-ins/gimpressionist/repaint.c b/plug-ins/gimpressionist/repaint.c index eadf2f7153..b547602100 100644 --- a/plug-ins/gimpressionist/repaint.c +++ b/plug-ins/gimpressionist/repaint.c @@ -717,30 +717,42 @@ void repaint(struct ppm *p, struct ppm *a) thissum = brushsum[n]; /* Calculate color - avg. of in-brush pixels */ - r = g = b = 0; - for(y = 0; y < brush->height; y++) { - guchar *row = &p->col[(ty+y)*p->width*3]; - for(x = 0; x < brush->width; x++) { - int k = (tx+x) * 3; - double v; - if((h = brush->col[y*brush->width*3+x*3])) { - v = h / 255.0; - r += row[k+0] * v; - g += row[k+1] * v; - b += row[k+2] * v; + if(runningvals.colortype == 0) { + r = g = b = 0; + for(y = 0; y < brush->height; y++) { + guchar *row = &p->col[(ty+y)*p->width*3]; + for(x = 0; x < brush->width; x++) { + int k = (tx+x) * 3; + double v; + if((h = brush->col[y*brush->width*3+x*3])) { + v = h / 255.0; + r += row[k+0] * v; + g += row[k+1] * v; + b += row[k+2] * v; + } } } + r = r * 255.0 / thissum; + g = g * 255.0 / thissum; + b = b * 255.0 / thissum; + } else if(runningvals.colortype == 1) { + guchar *pixel = &p->col[(ty+brush->height/2)*p->width*3 + (tx+brush->width)*3]; + r = pixel[0]; + g = pixel[1]; + b = pixel[2]; + } else { + /* No such colortype! */ + r = g = b = 0; + } + if(runningvals.colornoise > 0.0) { + double v = runningvals.colornoise; + r = r + rand() / (float)RAND_MAX * v - v/2; + g = g + rand() / (float)RAND_MAX * v - v/2; + b = b + rand() / (float)RAND_MAX * v - v/2; + if(r < 0) r = 0; else if(r > 255) r = 255; + if(g < 0) g = 0; else if(g > 255) g = 255; + if(b < 0) b = 0; else if(b > 255) b = 255; } - r = r * 255.0 / thissum; - g = g * 255.0 / thissum; - b = b * 255.0 / thissum; - - /* Color = center pixel - Looks bad... */ - /* - r = p->col[ty+brush->height/2][tx+brush->width/2].r; - g = p->col[ty+brush->height/2][tx+brush->width/2].g; - b = p->col[ty+brush->height/2][tx+brush->width/2].b; - */ applybrush(brush, shadow, &tmp, &atmp, tx,ty, r,g,b); if(runningvals.generaltileable && runningvals.generalpaintedges) {