More plugins gone bye-bye

-Yosh
This commit is contained in:
Manish Singh 1998-02-20 00:34:10 +00:00
parent 4607c5e5e5
commit 6ad4b66240
90 changed files with 0 additions and 23071 deletions

View File

@ -294,7 +294,6 @@ plug-ins/ifscompose/Makefile
plug-ins/iwarp/Makefile
plug-ins/hrz/Makefile
plug-ins/hot/Makefile
plug-ins/holes/Makefile
plug-ins/gz/Makefile
plug-ins/header/Makefile
plug-ins/grid/Makefile
@ -338,12 +337,6 @@ plug-ins/png/Makefile
plug-ins/tiff/Makefile
plug-ins/xd/Makefile
plug-ins/bmp/Makefile
plug-ins/aa/Makefile
plug-ins/gag-0.3/Makefile
plug-ins/Anamorphose/Makefile
plug-ins/CentralReflection/Makefile
plug-ins/Curtain/Makefile
plug-ins/Encrypt_Decrypt/Makefile
plug-ins/MapObject/Makefile
plug-ins/megawidget/Makefile
plug-ins/libgck/Makefile
@ -355,9 +348,7 @@ plug-ins/flame/Makefile
plug-ins/gimptcl/Makefile
plug-ins/gimptcl/scripts/Makefile
plug-ins/fuse/Makefile
plug-ins/rcm/Makefile
plug-ins/struc/Makefile
plug-ins/twist/Makefile
plug-ins/user_filter/Makefile
plug-ins/zealouscrop/Makefile
plug-ins/xwd/Makefile
@ -412,9 +403,7 @@ plug-ins/colorify/Makefile
plug-ins/papertile/Makefile
plug-ins/illusion/Makefile
plug-ins/fractaltrace/Makefile
plug-ins/DigitalSignature/Makefile
plug-ins/FractalExplorer/Makefile
plug-ins/stegano/Makefile
plug-ins/fs/Makefile
plug-ins/flarefx/Makefile
app/Makefile

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
Anamorphose

View File

@ -1,727 +0,0 @@
/**********************************************************************
* Conical Anamorphose Distortion Plug-In (Version 1.03)
* Daniel Cotting (cotting@mygale.org)
**********************************************************************
* Official homepages: http://www.mygale.org/~cotting
* http://cotting.citeweb.net
* http://village.cyberbrain.com/cotting
**********************************************************************
*/
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdlib.h>
#include <math.h>
#include "libgimp/gimp.h"
#include "gtk/gtk.h"
#include "logo.h"
#define ENTRY_WIDTH 100
/* Declare local functions.
*/
static void query(void);
static void run(char *name, int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static void drawanamorphose(GDrawable *drawable);
static gint anamorphose_dialog(GDrawable *drawable);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
typedef struct
{
gdouble cone_radius;
gdouble base_angle;
gint keep_surr, use_bkgr, set_transparent, use_antialias,flip,dedouble;
} anamorphoseValues;
static anamorphoseValues lvals =
{
/* anamorphose cone radius value */
100,60,
/* Surroundings options */
TRUE, FALSE, FALSE, TRUE, TRUE, FALSE
};
typedef struct
{
gint run;
} anamorphoseInterface;
static anamorphoseInterface bint =
{
FALSE /* run */
};
GtkWidget * anamorphose_logo_dialog(void);
GtkWidget *maindlg;
GtkWidget *logodlg;
GtkTooltips *tips;
GdkColor tips_fg,tips_bg;
MAIN()
static void
query(void)
{
static GParamDef args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image (unused)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
{ PARAM_FLOAT, "cone_radius", "Radius of the reflecting cone in the center" },
{ PARAM_FLOAT, "base_angle", "Base angle of the reflecting cone (in degrees)" },
{ PARAM_INT32, "keep_surroundings", "Keep anamorphose surroundings" },
{ PARAM_INT32, "set_background", "Set anamorphose surroundings to bkgr value" },
{ PARAM_INT32, "set_transparent", "Set anamorphose surroundings transparent (Only on Image w/ Alpha-Layer)" },
{ PARAM_INT32, "use_antialias", "Use antialias for better and smoother results" },
{ PARAM_INT32, "flip", "Flip the image vertically" },
{ PARAM_INT32, "double", "Use double reflection algorithm" },
};
static GParamDef *return_vals = NULL;
static int nargs = sizeof(args)/ sizeof(args[0]);
static int nreturn_vals = 0;
gimp_install_procedure("plug_in_anamorphose",
"Apply an anamorphose effect",
"",
"Daniel Cotting (cotting@mygale.org, http://www.mygale.org/~cotting)",
"Daniel Cotting (cotting@mygale.org, http://www.mygale.org/~cotting)",
"October, 1997",
"<Image>/Filters/Glass Effects/Conical Anamorphose",
"RGB*, GRAY*, INDEXED*",
PROC_PLUG_IN,
nargs, nreturn_vals,
args, return_vals);
}
static void
run(char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals)
{
static GParam values[1];
GDrawable *drawable;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
run_mode = param[0].data.d_int32;
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
*nreturn_vals = 1;
*return_vals = values;
drawable = gimp_drawable_get(param[2].data.d_drawable);
switch(run_mode) {
case RUN_INTERACTIVE:
gimp_get_data("plug_in_anamorphose", &lvals);
if(!anamorphose_dialog(drawable)) return;
break;
case RUN_NONINTERACTIVE:
if(nparams != 11) status = STATUS_CALLING_ERROR;
if(status == STATUS_SUCCESS) {
lvals.cone_radius = param[3].data.d_float;
lvals.base_angle = param[4].data.d_float;
lvals.keep_surr = param[5].data.d_int32;
lvals.use_bkgr = param[6].data.d_int32;
lvals.set_transparent = param[7].data.d_int32;
lvals.use_antialias = param[8].data.d_int32;
lvals.flip = param[9].data.d_int32;
lvals.dedouble = param[10].data.d_int32;
}
if(status == STATUS_SUCCESS && (lvals.cone_radius <= 0))
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
gimp_get_data ("plug_in_anamorphose", &lvals);
break;
default:
break;
}
gimp_tile_cache_ntiles(2 *(drawable->width / gimp_tile_width() + 1));
gimp_progress_init("Applying anamorphose. Please wait...");
drawanamorphose(drawable);
if(run_mode != RUN_NONINTERACTIVE)
gimp_displays_flush();
if(run_mode == RUN_INTERACTIVE)
gimp_set_data("plug_in_anamorphose", &lvals, sizeof(anamorphoseValues));
values[0].data.d_status = status;
gimp_drawable_detach(drawable);
}
static void
set_tooltip (GtkTooltips *tooltips, GtkWidget *widget, const char *desc)
{
if (desc && desc[0])
gtk_tooltips_set_tips (tooltips, widget, (char *) desc);
}
static void
drawanamorphose(GDrawable *drawable)
{
GPixelRgn srcPR, destPR;
gint width, height;
gint bytes;
gdouble abstand;
gdouble radius;
gdouble angle, alpha, gamma, abstandvonzentrum, distanzzukreis, pi ,seiteb, verhaltniss, a1,a2,a3,a4,faktor,a_tot;
gint row;
gint x1, y1, x2, y2, ix, iy;
guchar *src, *dest;
gint i, col, succeeded;
gfloat regionwidth, regionheight, dx, dy, xsqr, ysqr;
gfloat a, b, asqr, bsqr, x, y;
glong pixelpos, pos;
guchar bgr_red, bgr_blue, bgr_green, alphaval;
GDrawableType drawtype = gimp_drawable_type(drawable->id);
gimp_palette_get_background(&bgr_red, &bgr_green, &bgr_blue);
gimp_drawable_mask_bounds(drawable->id, &x1, &y1, &x2, &y2);
regionwidth = x2-x1;
a = regionwidth/2;
regionheight = y2-y1;
b = regionheight/2;
asqr = a*a;
bsqr = b*b;
radius=lvals.cone_radius;
angle=lvals.base_angle;
width = drawable->width;
height = drawable->height;
bytes = drawable->bpp;
gimp_pixel_rgn_init(&srcPR, drawable, 0, 0, width, height, FALSE, FALSE);
gimp_pixel_rgn_init(&destPR, drawable, 0, 0, width, height, TRUE, TRUE);
src = g_malloc((x2-x1)*(y2-y1)*bytes);
dest = g_malloc((x2-x1)*(y2-y1)*bytes);
gimp_pixel_rgn_get_rect(&srcPR, src, x1, y1, regionwidth, regionheight);
for(col = 0; col < regionwidth; col++) {
dx = (gfloat)col - a+0.5;
xsqr = dx*dx;
for(row = 0; row < regionheight; row++) {
pixelpos = (col+row*regionwidth)*bytes;
dy = -((gfloat)row - b-0.5);
ysqr = dy*dy;
abstand=(sqrt(dx*dx+dy*dy));
succeeded=1;
if (abstand>radius){
alpha=2.0*angle-90.0;
gamma=90.0-angle;
distanzzukreis=abstand-radius;
pi=atan(1.0)*4.0;
seiteb=sin(alpha/180.0*pi)/sin(gamma/180.0*pi)*distanzzukreis;
abstandvonzentrum=radius-(sin(gamma/180.0*pi)*seiteb);
if ((abstandvonzentrum<0) && (lvals.dedouble==0)) {
succeeded=0;
}else{
verhaltniss=abstandvonzentrum/abstand;
if (lvals.flip) dy = -dy;
x = dx*verhaltniss+a;
y = dy*verhaltniss+b;
ix=(int)x;
iy=(int)y;
if (lvals.use_antialias) {
if ((ix - x)<0){
if ((iy - y)<0){} else {iy-=1;}
} else{
if ((iy - y)<0){ix-=1;} else {iy-=1;ix-=1;}
}
a1=1/((ix-x)*(ix-x)+(iy-y)*(iy-y));
a2=1/((ix+1-x)*(ix+1-x)+(iy-y)*(iy-y));
a3=1/((ix-x)*(ix-x)+(iy+1-y)*(iy+1-y));
a4=1/((ix+1-x)*(ix+1-x)+(iy+1-y)*(iy+1-y));
a_tot=a1+a2+a3+a4;
faktor=1/a_tot;
a1*=faktor;
a2*=faktor;
a3*=faktor;
a4*=faktor;
pos = ((gint)(iy)*regionwidth + (gint)(ix)) * bytes;
for (i = 0; i < bytes; i++) {
dest[pixelpos+i] = (gint)((gdouble)(src[pos+i])*a1+(gdouble)(src[pos+i+bytes])*a2+(gdouble)(src[pos+i+(gint)(regionwidth*bytes)])*a3+(gdouble)(src[pos+i+(gint)(regionwidth*bytes)+bytes])*a4);
}
} else {
pos = ((gint)(iy)*regionwidth + (gint)(ix)) * bytes;
for(i = 0; i < bytes; i++) {
dest[pixelpos+i] = src[pos+i];
}
}
}
} else {
succeeded=0;
}
if (succeeded==0){
if(lvals.keep_surr) {
for(i = 0; i < bytes; i++) {
dest[pixelpos+i] = src[pixelpos+i];
}
}
else {
if(lvals.set_transparent) alphaval = 0;
else alphaval = 255;
switch(drawtype) {
case INDEXEDA_IMAGE:
dest[pixelpos+1] = alphaval;
case INDEXED_IMAGE:
dest[pixelpos+0] = 0;
break;
case RGBA_IMAGE:
dest[pixelpos+3] = alphaval;
case RGB_IMAGE:
dest[pixelpos+0] = bgr_red;
dest[pixelpos+1] = bgr_green;
dest[pixelpos+2] = bgr_blue;
break;
case GRAYA_IMAGE:
dest[pixelpos+1] = alphaval;
case GRAY_IMAGE:
dest[pixelpos+0] = bgr_red;
break;
}
}
}
}
if(((gint)(regionwidth-col) % 5) == 0)
gimp_progress_update((gdouble)col/(gdouble)regionwidth);
}
gimp_pixel_rgn_set_rect(&destPR, dest, x1, y1, regionwidth, regionheight);
g_free(src);
g_free(dest);
gimp_drawable_flush(drawable);
gimp_drawable_merge_shadow(drawable->id, TRUE);
gimp_drawable_update(drawable->id, x1, y1,(x2 - x1),(y2 - y1));
}
static void
anamorphose_close_callback(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}
static void
anamorphose_ok_callback(GtkWidget *widget, gpointer data)
{
bint.run = TRUE;
gtk_widget_destroy(GTK_WIDGET (data));
}
static void
anamorphose_toggle_update(GtkWidget *widget, gpointer data)
{
int *toggle_val;
toggle_val = (int *)data;
if(GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
anamorphose_entry_callback(GtkWidget *widget, gpointer data)
{
lvals.cone_radius = atof(gtk_entry_get_text(GTK_ENTRY(widget)));
if(lvals.cone_radius <= 0) lvals.cone_radius = 10;
}
static void
anamorphose_entry_callback2(GtkWidget *widget, gpointer data)
{
lvals.base_angle= atof(gtk_entry_get_text(GTK_ENTRY(widget)));
if(lvals.base_angle <= 0) lvals.base_angle = 60;
if(lvals.base_angle >= 90) lvals.base_angle = 60;
}
static void
anamorphose_logo_ok_callback(GtkWidget *widget, gpointer data)
{
gtk_widget_set_sensitive (maindlg, TRUE);
gtk_widget_destroy(logodlg);
}
static void
anamorphose_about_callback(GtkWidget *widget, gpointer data)
{
gtk_widget_set_sensitive (maindlg, FALSE);
anamorphose_logo_dialog();
}
static gint
anamorphose_dialog(GDrawable *drawable)
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *button;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
gchar buffer[12];
gchar **argv;
gint argc;
GSList *group = NULL;
GDrawableType drawtype;
drawtype = gimp_drawable_type(drawable->id);
argc = 1;
argv = g_new(gchar *, 1);
argv[0] = g_strdup("apply_anamorphose");
gtk_init(&argc, &argv);
gtk_rc_parse(gimp_gtkrc());
dlg = maindlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dlg), "Apply anamorphose effect");
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc)anamorphose_close_callback,
NULL);
frame = gtk_frame_new("Parameter Settings");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(vbox), 10);
gtk_container_add(GTK_CONTAINER(frame), vbox);
/* use black as foreground: */
tips = gtk_tooltips_new ();
tips_fg.red = 0;
tips_fg.green = 0;
tips_fg.blue = 0;
/* postit yellow (khaki) as background: */
gdk_color_alloc (gtk_widget_get_colormap (frame), &tips_fg);
tips_bg.red = 61669;
tips_bg.green = 59113;
tips_bg.blue = 35979;
gdk_color_alloc (gtk_widget_get_colormap (frame), &tips_bg);
gtk_tooltips_set_colors (tips,&tips_bg,&tips_fg);
toggle = gtk_radio_button_new_with_label(group,
"Keep original surroundings");
group = gtk_radio_button_group(GTK_RADIO_BUTTON(toggle));
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
(GtkSignalFunc) anamorphose_toggle_update,
&lvals.keep_surr);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle), lvals.keep_surr);
gtk_widget_show(toggle);
set_tooltip(tips,toggle,"In the center, where the cone is placed, the plug-in can't render a reflected image. If this option is enabled, this area will be filled with the original image.");
toggle =
gtk_radio_button_new_with_label(group,
drawtype == INDEXEDA_IMAGE ||
drawtype == INDEXED_IMAGE ?
"Set surroundings to index 0" :
"Set surroundings to background color");
group = gtk_radio_button_group(GTK_RADIO_BUTTON(toggle));
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
(GtkSignalFunc) anamorphose_toggle_update,
&lvals.use_bkgr);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle), lvals.use_bkgr);
gtk_widget_show(toggle);
set_tooltip(tips,toggle,"In the center, where the cone is placed, the plug-in can't render a reflected image. If this option is enabled, this area will be filled with the active background color or the index-0-color, depending on the image type.");
if((drawtype == INDEXEDA_IMAGE) ||
(drawtype == GRAYA_IMAGE) ||
(drawtype == RGBA_IMAGE)) {
toggle = gtk_radio_button_new_with_label(group,
"Make surroundings transparent");
group = gtk_radio_button_group(GTK_RADIO_BUTTON(toggle));
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
(GtkSignalFunc) anamorphose_toggle_update,
&lvals.set_transparent);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle),
lvals.set_transparent);
gtk_widget_show(toggle);
set_tooltip(tips,toggle,"In the center, where the cone is placed, the plug-in can't render a reflected image. If this option is enabled, this area will be kept transparent.");
}
if((drawtype != INDEXEDA_IMAGE) && (drawtype != INDEXED_IMAGE)){
toggle = gtk_check_button_new_with_label ("Use antialias (recommended)");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&lvals.use_antialias);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), lvals.use_antialias);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"If this option is enabled, an antialias algorithm will be used to produce a better and smoother output.");
} else { lvals.use_antialias=FALSE;}
toggle = gtk_check_button_new_with_label ("Flip image vertically");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&lvals.flip);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), lvals.flip);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"With this option you can flip the image vertically.");
toggle = gtk_check_button_new_with_label ("Double reflection");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&lvals.dedouble);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), lvals.dedouble);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"If this option is enabled, the plug-in will use the double reflection functionality. The produced images are only mathematically possible. A cone won't reflect all pixels to their original location.");
hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
label = gtk_label_new("Radius of cone: ");
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0);
gtk_widget_show(label);
entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
gtk_widget_set_usize(entry, ENTRY_WIDTH, 0);
sprintf(buffer, "%.2f", lvals.cone_radius);
gtk_entry_set_text(GTK_ENTRY(entry), buffer);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
(GtkSignalFunc)anamorphose_entry_callback,
NULL);
gtk_widget_show(entry);
gtk_widget_show(hbox);
set_tooltip(tips,entry,"Specify the base radius of the reflecting cone, here.");
hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
label = gtk_label_new("Base angle of cone (in degrees): ");
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0);
gtk_widget_show(label);
entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
gtk_widget_set_usize(entry, ENTRY_WIDTH, 0);
sprintf(buffer, "%.2f", lvals.base_angle);
gtk_entry_set_text(GTK_ENTRY(entry), buffer);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
(GtkSignalFunc)anamorphose_entry_callback2,
NULL);
gtk_widget_show(entry);
set_tooltip(tips,entry,"Specify the base angle of the reflecting cone, here. The angle must have a value between 0 and 90 degrees.");
gtk_widget_show(hbox);
gtk_widget_show(vbox);
gtk_widget_show(frame);
button = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)anamorphose_ok_callback,
dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
set_tooltip(tips,button,"Close the dialog box and apply distortion.");
button = gtk_button_new_with_label("Cancel");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)gtk_widget_destroy,
GTK_OBJECT(dlg));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Close the dialog box without applying distortion.");
button = gtk_button_new_with_label("About...");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)anamorphose_about_callback,button);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Show information about the author and the plug-in.");
gtk_widget_show(dlg);
gtk_main();
gtk_object_unref (GTK_OBJECT (tips));
gdk_flush();
return bint.run;
}
GtkWidget *
anamorphose_logo_dialog()
{
GtkWidget *xdlg;
GtkWidget *xlabel;
GtkWidget *xbutton;
GtkWidget *xlogo_box;
GtkWidget *xpreview;
GtkWidget *xframe,*xframe2;
GtkWidget *xvbox;
GtkWidget *xhbox;
char *text;
guchar *temp,*temp2;
guchar *datapointer;
gint y,x;
xdlg = logodlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(xdlg), "About");
gtk_window_position(GTK_WINDOW(xdlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(xdlg), "destroy",
(GtkSignalFunc)anamorphose_close_callback,
NULL);
xbutton = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(xbutton, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(xbutton), "clicked",
(GtkSignalFunc)anamorphose_logo_ok_callback,
xdlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(xdlg)->action_area),
xbutton, TRUE, TRUE, 0);
gtk_widget_grab_default(xbutton);
gtk_widget_show(xbutton);
set_tooltip(tips,xbutton,"Close the information box.");
xframe = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(xframe), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(xframe), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(xdlg)->vbox), xframe, TRUE, TRUE, 0);
xvbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(xvbox), 10);
gtk_container_add(GTK_CONTAINER(xframe), xvbox);
/* The logo frame & drawing area */
xhbox = gtk_hbox_new (FALSE, 5);
gtk_box_pack_start (GTK_BOX (xvbox), xhbox, FALSE, TRUE, 0);
xlogo_box = gtk_vbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (xhbox), xlogo_box, FALSE, FALSE, 0);
xframe2 = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (xframe2), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (xlogo_box), xframe2, FALSE, FALSE, 0);
xpreview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (xpreview), logo_width, logo_height);
temp = g_malloc((logo_width+10)*3);
datapointer=header_data+logo_width*logo_height-1;
for (y = 0; y < logo_height; y++){
temp2=temp;
for (x = 0; x< logo_width; x++) {
HEADER_PIXEL(datapointer,temp2); temp2+=3;}
gtk_preview_draw_row (GTK_PREVIEW (xpreview),
temp,
0, y, logo_width);
}
g_free(temp);
gtk_container_add (GTK_CONTAINER (xframe2), xpreview);
gtk_widget_show (xpreview);
gtk_widget_show (xframe2);
gtk_widget_show (xlogo_box);
gtk_widget_show (xhbox);
xhbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(xvbox), xhbox, TRUE, TRUE, 0);
text = "\nCotting Software Productions\n"
"Bahnhofstrasse 31\n"
"CH-3066 Stettlen (Switzerland)\n\n"
"cotting@mygale.org\n"
"http://www.mygale.org/~cotting\n\n"
"Conical Anamorphose\nPlug-In for the GIMP\n"
"Version 1.03\n";
xlabel = gtk_label_new(text);
gtk_box_pack_start(GTK_BOX(xhbox), xlabel, TRUE, FALSE, 0);
gtk_widget_show(xlabel);
gtk_widget_show(xhbox);
gtk_widget_show(xvbox);
gtk_widget_show(xframe);
gtk_widget_show(xdlg);
gtk_main();
gdk_flush();
return xdlg;
}

View File

@ -1,73 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 1.03 the size of
the logo in the about box has been reduced
in order to make smaller binaries.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is avaiable
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,43 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = Anamorphose
Anamorphose_SOURCES = \
Anamorphose.c logo.h
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
Anamorphose_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,73 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 1.03 the size of
the logo in the about box has been reduced
in order to make smaller binaries.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is avaiable
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,75 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 1.01 the size of
the logo in the about box has been reduced
in order to make smaller binaries. In
general the compiled plug-in will be
about 25-30% of the size of version 1.00.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is avaiable
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
35 to 40 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,788 +0,0 @@
/* GIMP header image file format (Indexed): //logo.h */
static unsigned int logo_width = 200;
static unsigned int logo_height = 72;
/* Call this macro repeatedly. After each use, the pixel data can be extracted */
#define HEADER_PIXEL(data,pixel) \
pixel[0] = palette_data[data[0]*3+2]; \
pixel[1] = palette_data[data[0]*3+1]; \
pixel[2] = palette_data[data[0]*3+0]; \
data--;
static unsigned char
palette_data[] = { 4,2,2,4,110,178,32,4,122,4,36,
86,15,3,66,4,58,127,36,8,186,4,34,122,17,2,
34,4,19,66,12,4,162,90,2,69,88,2,48,7,20,
2,25,2,103,8,14,48,4,58,186,90,3,154,82,2,
129,55,2,34,17,2,18,17,34,191,94,2,101,57,2,
70,7,32,154,12,22,157,17,3,50,4,88,150,96,3,
186,86,2,138,87,2,86,212,214,210,4,19,98,52,2,
154,15,11,2,4,132,216,7,18,125,12,6,82,37,12,
18,4,88,189,86,14,48,128,2,157,32,4,138,4,60,
155,4,48,126,60,2,218,7,10,52,13,12,66,129,2,
50,56,2,52,52,14,98,4,47,157,6,20,87,48,2,
24,58,2,101,120,2,141,52,5,170,4,113,215,127,2,
73,4,90,210,4,52,112,36,18,194,59,2,85,42,2,
10,107,2,173,95,2,114,31,3,52,4,79,160,84,3,
189,14,10,40,30,2,69,96,2,58,113,2,126,9,37,
231,17,33,170,28,14,2,4,30,146,68,10,37,132,2,
82,23,4,7,4,10,122,4,36,108,32,2,37,7,27,
2,4,98,175,84,10,146,4,101,191,4,14,146,8,29,
86,4,2,170,8,60,230,84,10,162,72,2,39,102,2,
142,4,142,221,4,49,143,68,12,170,4,124,213,15,4,
74,114,2,69,112,2,158,32,3,23,8,50,190,111,2,
104,6,40,154,96,2,210,6,28,104,60,2,138,61,2,
25,68,2,114,58,2,125,39,2,114,73,2,69,16,4,
58,4,88,177,56,14,26,138,2,173,4,68,176,71,2,
55,76,2,210,4,78,130,17,3,42,6,27,69,112,2,
49,12,26,178,47,13,159,18,11,10,13,11,74,141,2,
58,52,18,234,4,82,186,4,126,198,4,103,213,4,62,
206,4,72,226,12,46,210,72,12,222,12,26,146,20,34,
210,4,113,197,4,131,229,4,48,170,4,76,170,7,43,
95,52,30,218,15,11,170,52,14,202,12,14,86,4,40,
174,108,14,202,156,2,186,60,12,130,5,40,129,73,13,
189,12,42,138,44,14,202,4,59,143,4,124,229,4,69,
191,4,69,157,4,60,114,4,43,110,14,14,58,20,26,
157,28,26,210,4,87,162,4,91,202,4,110,226,4,98,
226,4,101,202,17,14,186,28,18,18,60,2,234,28,10,
114,4,30,114,8,10,162,12,54,186,20,26,130,100,10,
170,40,18,154,4,22,114,28,26,234,4,22,58,4,66,
226,4,54,202,12,42,202,4,38,98,4,145,234,4,76,
146,4,94,148,4,138,213,4,94,186,4,54,126,4,54,
154,4,118,211,4,106,178,4,106,188,4,54,142,4,94,
170,4,70,202,4,118,197,4,54,173,4,82,178,72,4,
172,36,10,138,76,14,162,4,98,210,4,118,226,112,2,
114,24,19,8,30,2,85,84,6,226,141,2,73,28,30,
10,28,46,186,112,4,206,36,10,90,36,2,174,108,2,
58,41,3,130,44,10,194,9,33,130,92,2,162,51,2,
42,12,32,162,81,3,146,44,11,26,28,6,146,44,2,
178,30,12,10,60,10,178,64,2,146,28,10,178,92,10,
210,5,41,146,40,2,102,96,2,125,100,2,88,74,2,
157,142,2,159,26,10,55,143,2,50,73,2,102,134,2,
142,73,2,84,127,2,126,142,2,82,156,2,178,28,10,
158,28,26,114,84,14,202,12,4,10,5,20,74,17,2,
26,92,2,194,7,19,106};
static unsigned char header_data[] = { 71,99,218,218,99,11,71,218,71,71,
218,99,99,99,71,99,218,99,99,99,99,218,71,218,99,218,218,99,99,218,
218,99,99,218,99,218,99,58,218,99,99,99,58,218,99,99,99,58,99,58,
99,58,11,58,99,58,58,11,99,58,99,58,99,99,99,218,99,218,99,58,
99,71,99,218,71,12,12,12,12,12,12,12,12,12,92,19,19,19,92,92,
92,92,19,108,19,19,19,19,19,19,53,53,53,53,101,19,19,53,53,19,
19,19,12,92,92,12,12,12,71,71,218,99,218,218,71,71,12,12,218,99,
58,58,58,99,99,99,58,99,99,99,11,58,11,58,58,99,58,99,99,99,
58,99,99,99,99,58,99,99,99,99,99,218,99,99,11,99,99,99,11,99,
99,218,218,218,99,218,99,99,218,218,99,99,218,99,218,218,99,99,218,11,
218,71,99,218,99,218,218,99,71,8,218,99,218,218,99,99,99,99,99,99,
218,218,99,99,218,99,218,99,218,71,99,99,99,218,99,99,218,99,99,99,
218,218,99,99,99,99,58,99,58,30,99,99,99,99,99,99,58,99,99,58,
99,58,99,58,99,99,58,58,58,99,58,58,99,218,218,71,99,99,71,71,
71,123,12,118,71,71,12,71,123,12,12,19,19,19,53,19,19,53,53,19,
19,53,101,63,20,63,20,63,53,53,53,101,53,53,53,19,53,53,53,19,
92,12,12,12,71,12,12,12,12,12,92,71,218,218,71,218,71,71,71,71,
99,218,58,58,58,99,99,99,99,58,58,58,99,58,99,58,58,99,58,58,
99,99,58,99,99,99,99,58,99,58,30,99,99,99,218,99,58,99,99,58,
11,99,99,218,99,218,218,99,99,218,71,99,218,99,99,218,99,99,218,99,
11,218,99,218,99,11,218,99,99,8,71,71,71,99,218,71,218,99,71,218,
11,99,218,218,99,218,99,218,99,99,99,99,218,99,99,99,99,99,218,99,
99,99,99,99,99,11,99,99,99,99,99,99,58,99,58,99,58,99,58,58,
99,11,58,58,99,58,99,99,58,58,218,99,123,71,71,71,123,71,71,218,
99,99,218,71,12,12,12,12,92,19,19,53,19,53,53,53,53,19,53,53,
53,53,19,53,19,53,53,53,53,53,63,63,101,63,63,20,53,19,53,53,
53,19,92,92,12,12,12,71,71,71,71,12,12,71,71,12,12,12,12,12,
12,218,218,99,58,58,99,58,99,58,99,58,99,99,58,218,58,99,58,99,
99,99,99,11,58,99,99,58,99,99,58,58,99,99,99,99,99,99,99,99,
99,58,218,99,218,99,99,99,218,99,99,218,99,11,218,99,218,218,99,99,
218,99,218,11,99,71,99,218,71,8,99,99,218,99,99,99,218,99,99,218,
218,99,11,99,99,218,99,218,99,218,218,99,58,99,99,99,58,11,99,99,
58,99,99,58,58,58,58,99,99,99,99,218,58,99,99,99,58,58,99,99,
58,58,99,58,99,58,99,99,58,58,99,218,71,71,218,218,218,58,58,58,
218,99,71,123,12,12,12,19,19,108,108,108,92,92,92,12,71,12,12,92,
19,53,53,53,101,53,53,19,53,101,53,20,53,79,79,0,34,79,20,63,
53,53,53,19,19,19,12,12,12,71,71,71,71,71,71,123,71,12,12,12,
12,12,71,71,218,58,99,58,218,58,218,99,58,99,58,99,99,218,58,58,
58,99,58,58,99,99,58,99,58,99,99,218,58,58,99,99,99,99,99,99,
58,11,99,99,218,218,218,99,218,99,99,218,218,99,218,99,99,218,218,99,
218,99,71,218,99,218,99,99,99,8,218,218,99,218,99,218,99,218,218,99,
11,218,218,218,218,99,71,99,218,99,99,99,218,58,99,99,99,99,218,30,
58,99,58,99,58,11,58,99,58,99,58,58,58,99,58,58,99,99,58,58,
58,99,58,99,58,58,99,58,218,99,99,218,58,99,58,58,58,58,58,218,
71,12,12,71,71,12,12,12,12,71,71,118,71,71,118,71,71,12,223,19,
19,53,53,53,53,63,229,20,79,20,34,0,20,101,101,63,20,101,101,53,
108,53,53,53,53,53,101,19,92,12,12,12,12,71,71,218,218,218,71,71,
118,12,71,71,218,218,58,58,58,58,58,58,218,58,58,58,99,99,218,99,
58,58,99,99,58,99,58,99,58,58,58,99,99,99,58,99,99,99,58,58,
99,58,58,99,99,99,99,99,99,99,218,99,99,218,99,218,218,99,99,218,
99,58,99,99,218,99,218,218,218,8,99,218,99,218,99,218,11,99,218,99,
99,99,99,99,218,99,58,99,99,99,58,99,218,99,99,99,99,99,58,99,
58,218,99,99,99,58,218,58,58,58,99,99,58,99,218,58,99,99,58,218,
58,99,58,99,99,99,58,99,58,58,58,58,99,58,58,58,58,218,218,12,
71,71,71,12,12,71,71,12,71,12,71,71,71,71,12,92,19,53,53,53,
101,63,79,34,251,0,0,63,20,53,19,53,53,53,53,19,19,53,19,19,
19,108,19,19,19,19,19,19,53,53,108,12,12,12,71,71,218,58,58,58,
99,218,71,71,71,12,218,99,99,58,58,58,58,218,58,58,58,58,58,99,
99,58,58,99,58,218,58,99,99,99,99,58,99,128,99,58,99,99,11,99,
99,58,11,58,99,99,99,218,58,11,99,58,99,218,99,99,218,99,99,99,
218,71,99,99,218,99,11,99,218,8,218,99,218,99,218,99,99,218,99,218,
58,218,58,218,99,99,218,99,58,99,99,99,99,78,11,58,99,58,99,99,
99,58,58,99,58,11,58,58,218,99,99,58,58,58,99,58,58,58,99,99,
58,58,58,58,58,58,99,58,99,99,99,58,58,58,58,58,218,71,118,12,
71,71,71,71,71,12,71,71,71,71,71,12,92,19,19,53,53,63,20,251,
0,79,79,0,79,34,34,79,0,63,229,20,63,101,53,101,19,53,19,92,
12,71,12,92,12,12,12,12,12,92,19,92,92,71,12,118,71,218,99,58,
58,58,58,58,218,123,71,218,58,58,58,99,58,58,58,218,58,218,58,58,
218,58,99,58,58,58,99,99,58,99,58,99,218,99,99,99,58,58,58,11,
58,58,99,58,99,99,30,99,99,99,58,218,218,30,99,218,99,99,99,218,
99,99,218,218,99,99,218,71,99,8,99,99,71,99,218,218,99,218,99,218,
99,218,99,58,11,58,99,99,11,58,99,58,99,99,99,99,58,58,99,99,
58,99,99,99,99,58,99,78,58,58,99,99,218,78,58,218,58,99,212,58,
99,58,58,58,218,58,58,58,58,58,58,58,58,58,218,71,12,12,71,71,
123,218,218,58,99,71,123,71,71,12,19,19,19,53,53,19,19,53,63,53,
101,101,101,63,101,101,20,20,79,0,0,79,79,34,251,79,79,251,101,53,
19,92,12,71,71,71,218,12,218,12,71,71,71,71,71,12,71,71,123,71,
58,58,58,58,58,58,58,99,99,58,58,58,99,58,58,58,99,58,99,58,
99,58,58,99,58,58,58,58,99,58,99,58,99,58,99,58,99,99,58,58,
99,99,99,58,99,58,58,58,99,99,99,30,128,58,99,99,99,99,99,58,
218,99,99,218,218,99,99,218,71,8,71,218,99,99,99,99,218,99,99,99,
99,30,58,11,58,58,99,58,58,58,58,30,58,58,99,99,99,58,99,58,
99,58,99,58,58,58,218,99,58,99,58,58,58,218,99,58,58,58,58,58,
58,99,99,99,58,99,99,58,58,212,99,58,58,218,71,71,218,218,99,58,
58,58,58,218,123,71,71,12,108,19,19,108,19,19,223,92,19,92,12,12,
19,19,19,19,53,53,63,63,229,0,34,34,79,0,79,0,75,34,0,34,
79,20,53,19,92,12,71,71,71,218,71,123,71,123,71,71,71,71,71,71,
71,218,58,58,58,58,58,58,58,99,58,58,58,58,58,58,58,58,99,58,
58,99,99,58,99,58,58,58,58,58,58,99,58,99,58,99,58,58,99,99,
58,58,99,99,58,58,218,58,58,99,58,99,11,58,58,99,58,218,99,99,
99,99,218,99,99,218,99,99,99,8,99,218,99,218,99,99,99,99,58,58,
11,58,99,58,58,30,58,11,58,11,58,99,99,58,99,58,58,58,99,58,
58,99,58,99,99,58,58,99,58,99,58,99,58,99,212,58,58,58,58,58,
58,58,58,58,58,58,58,58,58,58,212,58,218,218,218,99,58,58,58,58,
58,99,71,71,71,12,71,71,12,12,12,71,71,123,71,218,71,71,71,92,
19,108,63,79,229,126,0,79,0,0,34,34,34,126,34,251,79,0,126,34,
79,0,79,20,63,19,19,12,71,71,71,218,71,99,71,71,71,71,71,71,
71,71,218,58,58,58,212,58,58,58,58,58,58,58,58,58,58,58,58,58,
58,58,99,58,58,99,58,58,99,99,128,218,58,58,99,58,99,58,58,99,
218,58,58,218,99,99,99,99,99,99,58,99,99,58,30,218,99,99,99,99,
99,99,218,99,99,99,218,218,99,8,218,99,99,99,58,99,99,99,99,99,
58,58,218,99,99,99,58,99,58,58,58,99,58,99,58,99,99,99,58,58,
99,99,58,58,58,58,58,58,99,99,58,99,99,58,58,58,58,99,58,58,
99,58,99,58,78,212,99,212,99,58,58,99,58,58,78,78,246,99,212,58,
99,71,123,71,71,71,71,71,218,218,71,123,218,218,218,118,12,19,63,63,
0,0,0,34,34,0,34,79,79,79,0,34,79,79,20,101,53,101,53,19,
53,53,101,101,53,53,19,19,19,92,218,218,218,218,218,212,78,58,218,218,
71,71,71,11,58,246,58,78,246,58,58,58,99,99,58,58,99,58,212,58,
99,58,99,58,58,99,58,58,58,58,58,212,218,58,58,99,58,58,99,58,
99,99,99,58,58,99,99,99,58,99,58,58,99,99,99,58,58,99,99,99,
99,99,99,11,58,99,99,99,218,8,99,99,218,99,99,218,99,218,58,58,
11,78,58,99,58,99,58,99,58,11,58,99,58,99,58,58,58,99,99,58,
99,99,99,58,58,58,58,58,58,58,58,58,58,58,58,212,99,58,212,99,
58,58,78,58,78,58,58,58,58,58,58,58,58,58,246,58,246,58,58,71,
218,71,71,71,218,71,71,71,71,218,218,71,71,92,92,53,63,126,79,0,
0,79,0,79,34,79,0,126,79,79,79,79,79,229,229,101,53,108,92,71,
71,71,71,71,71,12,12,19,108,19,92,71,71,71,71,218,212,246,78,58,
58,218,218,71,71,58,58,212,212,78,212,78,78,58,58,58,58,58,99,58,
78,58,58,99,58,58,58,58,58,58,58,58,99,58,99,58,58,212,99,58,
58,99,58,99,58,99,99,58,58,99,99,58,58,58,58,11,78,99,99,99,
99,58,99,58,71,99,99,99,99,8,99,99,99,218,99,58,99,30,58,11,
58,11,58,58,99,58,58,99,58,99,58,99,99,58,99,58,99,58,58,99,
58,58,58,58,58,78,58,99,58,99,58,58,58,58,99,58,212,99,58,58,
58,78,78,78,58,58,58,58,58,212,58,78,58,78,78,78,58,99,218,218,
71,218,218,71,58,99,58,99,71,71,71,12,19,20,79,251,0,251,79,251,
79,63,126,79,79,79,79,229,79,79,79,126,126,79,79,63,20,53,53,92,
12,12,218,71,71,218,218,218,71,218,71,71,71,218,71,218,218,58,246,246,
78,212,78,58,218,218,58,58,58,246,78,212,78,212,58,58,58,58,58,212,
78,78,78,58,58,99,58,58,58,58,58,58,58,58,58,218,99,99,58,99,
58,58,218,99,58,58,99,58,99,99,58,99,99,99,58,99,99,58,58,58,
218,99,11,58,99,99,99,218,99,8,99,30,218,58,11,99,99,58,99,58,
99,58,58,99,218,99,218,58,99,99,58,58,58,58,99,58,99,99,58,99,
58,58,58,78,78,58,58,58,58,58,99,246,78,78,58,58,58,58,58,78,
78,212,78,246,246,58,58,58,212,58,212,246,78,246,58,212,218,218,218,218,
218,58,246,58,246,58,218,218,123,12,19,19,53,53,101,53,63,101,63,63,
63,63,63,63,63,101,63,53,63,53,53,53,53,108,19,19,19,19,108,19,
92,92,12,12,71,71,218,99,99,218,218,218,218,218,71,71,71,218,218,246,
78,78,246,78,78,78,58,58,58,78,78,78,78,246,58,58,58,58,58,78,
212,78,78,58,58,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,
58,99,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,99,99,99,
58,99,58,99,99,58,99,99,99,8,99,99,30,58,58,58,58,58,58,99,
58,11,99,58,99,58,58,58,58,58,58,99,58,58,58,58,58,58,99,58,
99,58,78,58,58,58,99,58,58,78,246,78,58,78,58,58,58,58,78,212,
246,78,246,78,78,99,212,246,78,246,58,246,246,78,246,218,218,218,58,58,
246,78,78,246,58,218,218,71,12,12,108,92,108,19,108,53,63,63,63,53,
53,53,19,223,92,92,49,118,118,118,118,118,118,118,71,118,118,12,12,12,
92,71,71,123,218,99,11,58,58,58,58,78,58,99,99,123,71,218,218,218,
246,246,78,212,78,212,78,246,78,78,58,78,246,78,246,78,58,58,58,58,
99,78,246,78,246,99,58,58,58,58,58,78,78,78,78,99,58,99,58,99,
78,58,58,99,58,218,218,58,58,99,58,58,58,218,99,58,58,58,58,11,
58,99,99,99,58,99,99,218,58,8,99,99,58,99,58,11,58,11,58,58,
99,58,99,58,99,58,99,58,58,218,58,58,58,99,58,99,58,58,58,99,
78,58,58,58,99,58,58,78,78,58,246,78,246,99,58,58,58,212,78,78,
246,58,246,58,78,78,78,58,246,78,78,58,246,58,58,58,212,58,246,78,
212,246,58,58,71,71,71,71,12,92,92,92,108,53,53,53,19,19,223,223,
49,223,92,49,49,223,92,49,118,118,118,71,118,112,118,11,11,112,71,112,
71,71,11,11,11,99,99,58,58,78,78,78,246,78,246,58,99,71,218,71,
218,78,78,246,78,246,58,246,78,246,212,58,246,58,246,78,212,78,246,58,
58,58,78,246,246,78,78,99,58,58,58,212,78,58,78,58,58,58,58,58,
78,58,78,99,58,58,99,58,58,58,58,99,58,58,99,218,58,99,58,58,
58,58,99,58,99,99,58,99,99,8,99,99,58,58,58,99,58,99,99,58,
99,58,58,58,58,58,58,218,99,58,99,58,58,58,58,58,99,58,58,78,
58,78,78,78,78,58,78,58,78,78,78,212,78,58,78,58,78,212,78,246,
78,246,78,78,212,246,246,78,246,212,246,246,78,246,58,246,78,246,58,246,
246,58,99,218,218,218,71,12,92,19,19,19,19,19,223,223,49,223,49,118,
49,112,30,30,237,103,208,208,245,208,245,208,245,245,245,103,208,103,22,237,
30,30,11,11,11,11,71,71,11,99,58,78,78,246,58,246,246,246,58,99,
99,218,212,78,246,78,246,78,246,58,78,58,246,78,58,246,78,212,78,246,
58,212,58,78,78,212,78,78,58,58,99,78,78,78,78,78,58,58,99,58,
58,78,78,78,58,58,99,58,99,58,58,99,58,218,58,58,99,58,58,218,
99,58,99,99,58,99,30,99,99,8,58,99,58,99,58,58,58,99,58,99,
58,218,218,58,99,58,99,58,58,58,78,99,78,58,99,58,58,78,58,78,
78,58,78,78,58,78,78,246,246,212,78,78,78,58,78,246,78,246,58,246,
212,78,58,78,78,58,246,78,78,78,58,246,78,246,78,58,246,78,78,78,
58,218,99,11,71,12,92,92,92,223,223,223,223,223,49,118,112,22,237,208,
72,245,55,243,245,72,72,72,65,208,236,208,208,245,72,55,243,55,55,243,
245,245,245,103,237,237,30,11,11,112,71,11,99,58,78,246,246,246,246,78,
58,218,58,58,246,78,212,78,246,78,246,78,212,78,78,212,78,246,78,78,
58,78,78,78,78,78,246,246,246,58,58,78,58,246,78,212,78,78,99,58,
58,78,58,58,58,58,58,99,58,58,58,58,78,58,58,99,99,58,58,58,
99,218,58,99,99,99,58,99,58,8,99,99,99,58,11,58,58,58,99,58,
58,58,58,58,58,58,58,99,99,78,78,58,58,78,58,58,99,78,78,78,
78,78,78,78,78,78,212,246,246,246,246,78,78,246,246,58,246,78,246,78,
78,78,212,246,246,246,78,78,212,246,246,246,58,246,246,78,246,246,78,58,
218,99,71,12,12,92,92,82,223,49,223,118,112,22,208,72,72,208,65,22,
22,112,11,112,112,112,112,112,118,118,118,112,112,112,30,244,244,30,237,65,
236,72,55,55,243,243,208,208,237,237,11,71,11,11,71,11,99,58,246,246,
246,78,78,246,58,246,78,246,58,246,58,246,58,246,246,78,78,78,212,78,
212,246,212,78,246,246,58,78,78,246,99,246,246,58,246,58,78,78,78,58,
78,78,78,78,78,78,58,58,58,99,58,58,78,99,58,58,58,218,99,99,
58,58,99,58,99,58,58,99,99,8,58,58,99,58,99,218,99,58,99,99,
99,58,99,58,99,58,58,58,58,78,58,58,58,58,58,58,58,78,212,78,
78,58,246,78,58,246,246,246,246,246,246,246,78,58,246,78,246,58,246,58,
246,78,78,78,58,246,212,78,78,78,58,246,78,212,246,58,78,212,58,99,
218,71,12,92,19,223,49,49,118,62,30,22,208,208,103,30,244,112,244,118,
112,23,49,49,49,49,49,49,49,49,82,82,223,82,49,118,23,118,118,112,
11,30,237,22,65,245,55,243,245,245,103,237,237,11,71,11,71,71,218,58,
246,246,78,246,78,212,78,246,246,78,246,246,78,78,212,78,212,78,246,78,
78,58,246,78,58,246,78,212,78,246,78,78,78,78,78,212,246,246,246,78,
58,78,78,78,58,78,78,58,58,58,58,58,99,58,58,58,58,58,99,58,
58,58,58,58,58,99,99,58,58,8,99,99,58,58,58,99,99,99,99,58,
58,99,78,58,78,99,58,58,99,78,78,78,58,78,58,58,78,246,78,212,
78,78,58,78,246,246,246,246,246,246,58,78,78,246,58,246,78,246,78,246,
78,212,78,212,212,246,78,78,246,246,78,212,58,99,212,246,246,58,99,218,
118,12,92,223,223,49,49,11,237,208,208,103,244,23,118,112,118,112,49,49,
19,82,82,82,223,49,66,49,49,82,223,223,101,19,223,82,223,82,223,82,
82,49,23,112,11,244,30,65,72,55,55,245,208,22,237,112,11,118,71,218,
218,58,58,78,246,78,212,78,78,212,99,78,212,246,78,246,78,246,78,212,
246,246,78,246,246,78,246,78,246,58,246,78,58,78,246,246,246,246,212,246,
78,78,78,78,78,58,78,78,99,58,78,78,78,99,58,58,99,58,99,99,
58,99,99,99,99,58,99,58,99,8,99,99,99,58,58,99,58,58,99,58,
58,58,78,78,58,58,58,58,58,58,78,78,78,78,78,58,246,246,246,246,
246,78,78,212,246,246,246,246,246,246,78,212,78,246,78,212,78,246,58,246,
78,246,78,58,58,212,246,58,78,246,246,58,58,58,58,246,58,218,71,12,
223,223,49,49,49,30,65,72,72,30,112,118,118,112,118,49,223,223,223,49,
244,244,244,244,23,23,23,23,70,66,49,70,49,70,70,118,23,23,23,23,
49,223,19,82,223,223,23,11,244,237,208,72,55,55,208,103,30,11,11,49,
71,71,99,58,246,78,246,246,58,246,58,58,246,212,78,246,58,246,78,58,
58,212,78,78,212,78,212,78,78,78,212,78,78,78,246,212,246,246,246,212,
246,58,78,78,78,78,58,78,78,99,58,58,78,58,58,58,99,58,58,58,
58,58,58,58,99,58,99,58,99,8,99,58,58,218,58,58,58,99,58,58,
58,99,58,58,99,58,78,78,78,78,78,78,78,58,246,246,246,212,246,246,
212,246,78,246,246,246,246,246,212,246,246,78,246,58,212,246,78,78,78,246,
58,246,212,99,58,246,78,246,246,58,58,58,58,78,246,58,99,118,12,92,
223,223,223,11,22,72,208,244,49,112,112,118,49,82,223,49,244,244,242,62,
23,62,23,23,244,244,244,244,244,244,62,30,244,244,244,244,23,112,210,23,
62,244,244,23,223,82,53,82,49,112,30,30,65,72,55,245,208,237,30,112,
71,49,118,71,99,78,78,78,246,246,58,99,58,246,212,78,246,58,246,212,
99,58,212,246,78,246,78,246,212,246,78,246,246,212,246,246,246,212,246,246,
246,246,78,78,246,246,78,78,78,78,58,58,78,58,58,58,58,58,99,99,
99,78,99,58,99,99,58,99,58,8,58,99,58,99,99,58,58,99,58,58,
58,58,58,58,78,58,78,78,58,78,58,246,78,78,78,212,246,246,212,246,
246,246,246,246,246,246,246,246,246,246,246,58,246,58,99,212,246,212,78,78,
78,99,58,58,78,246,58,78,246,58,58,58,58,212,58,218,71,12,49,49,
49,112,22,72,65,112,49,112,112,112,223,19,118,62,244,62,62,23,23,244,
244,244,244,112,23,49,49,223,19,223,82,223,223,49,223,23,118,112,244,30,
62,62,62,62,23,62,23,223,82,8,82,71,30,244,22,72,55,245,103,237,
11,71,12,12,71,99,78,78,78,58,212,58,58,58,58,212,78,58,246,78,
58,58,58,212,78,246,58,78,78,212,212,246,246,246,212,246,246,246,246,246,
246,246,58,78,78,58,246,212,78,78,58,78,58,78,78,78,58,78,58,58,
218,58,58,99,58,99,99,99,58,8,218,99,58,58,58,99,58,58,99,78,
78,58,99,58,58,78,58,78,246,78,78,58,78,212,246,246,246,246,246,246,
246,246,246,212,246,212,246,246,246,212,78,246,58,58,58,246,78,78,212,246,
58,58,58,58,212,78,246,212,58,58,58,58,58,58,71,12,49,223,223,49,
30,208,72,30,49,49,112,49,223,223,23,22,244,62,23,23,62,22,112,118,
49,49,223,118,23,244,30,242,22,242,242,62,242,244,244,112,23,49,49,223,
23,112,30,244,62,112,210,23,23,49,82,8,223,244,237,30,208,55,243,245,
22,30,71,118,12,71,99,78,78,246,212,58,58,58,58,246,246,246,78,246,
58,58,58,78,212,78,246,246,246,58,58,212,246,246,246,246,246,246,246,246,
246,78,246,58,246,246,246,78,212,78,78,78,58,78,58,78,58,58,99,58,
58,58,99,58,58,58,58,58,58,8,58,99,58,58,58,58,99,58,78,78,
58,58,78,58,58,78,78,58,78,78,78,78,78,246,212,246,246,246,246,246,
246,246,246,246,246,246,212,246,246,246,78,58,58,58,58,246,78,78,246,99,
212,58,212,58,212,78,78,58,58,218,58,212,58,99,71,49,223,49,49,30,
55,72,112,49,244,11,49,82,112,242,242,62,23,62,244,112,118,223,82,118,
30,236,29,225,231,33,248,42,42,42,219,2,42,219,110,107,231,29,65,244,
112,223,223,49,112,30,30,23,23,23,23,49,82,101,49,30,30,242,72,243,
208,103,30,71,118,12,71,99,78,78,78,58,58,58,58,58,78,58,246,78,
58,58,99,58,246,58,246,58,246,58,99,58,212,246,246,212,246,246,246,246,
246,246,246,246,212,246,246,246,246,78,58,78,78,78,78,78,58,78,78,78,
58,78,99,99,99,58,58,99,99,8,99,58,99,99,58,58,58,58,78,78,
78,78,58,58,58,78,78,78,78,78,246,246,58,246,246,246,246,246,246,246,
246,246,212,246,99,58,246,246,246,246,212,58,58,58,99,212,78,212,212,58,
78,58,58,58,246,246,78,58,71,218,58,58,11,71,118,223,49,23,103,243,
22,49,118,30,118,82,49,30,242,62,70,62,244,118,223,82,112,65,93,205,
217,42,80,147,98,4,26,8,8,8,8,121,8,8,26,4,98,210,111,219,
29,29,65,112,223,82,23,30,244,62,62,62,62,49,82,82,112,30,30,65,
243,245,103,30,71,118,12,71,218,212,246,58,58,212,212,58,58,246,212,78,
58,58,212,58,58,246,78,246,58,58,58,58,246,212,246,246,246,246,246,246,
246,212,246,246,246,246,212,246,246,212,78,246,212,78,58,78,78,78,58,78,
78,78,58,58,58,58,99,58,58,8,58,58,58,58,58,58,58,58,237,78,
58,78,78,58,78,78,212,78,246,78,78,246,246,246,246,246,246,246,246,246,
246,246,246,58,58,58,246,246,246,246,58,58,99,58,58,246,246,78,99,78,
246,78,58,58,58,58,58,218,12,99,58,99,71,92,49,223,118,22,41,65,
223,23,30,118,19,23,22,242,23,23,30,112,223,19,112,29,222,232,87,80,
98,26,121,8,20,253,20,20,20,20,101,20,20,20,253,253,20,8,121,26,
4,14,2,231,29,30,49,82,112,30,244,62,23,210,118,82,101,223,30,244,
65,55,243,103,237,71,118,71,71,99,58,58,58,58,218,58,58,58,246,212,
58,58,212,78,99,58,246,246,78,58,58,58,58,246,246,246,246,246,246,246,
246,246,246,212,246,246,246,246,246,246,246,78,78,78,78,78,58,78,58,78,
78,58,58,58,78,99,58,58,99,8,99,58,58,99,99,58,58,58,58,237,
78,78,58,78,78,246,78,246,78,246,78,246,246,246,246,246,246,246,246,246,
246,246,58,58,58,58,246,246,246,58,99,78,246,212,99,246,212,58,78,246,
58,246,58,58,58,212,218,12,118,58,58,71,12,49,19,49,237,41,65,49,
118,112,223,82,244,236,62,66,62,30,82,8,112,93,68,6,137,88,162,253,
253,20,253,19,223,23,244,244,54,242,54,242,244,62,112,49,223,20,20,20,
20,253,26,98,14,33,29,244,82,101,112,22,62,62,62,23,49,53,82,30,
112,22,243,243,208,11,71,118,12,218,99,58,58,58,12,71,58,58,58,58,
99,58,58,246,246,58,58,246,246,58,58,58,99,58,246,246,246,246,78,58,
246,212,246,246,246,246,246,212,246,246,78,78,78,78,58,78,78,78,78,58,
78,58,78,237,78,58,99,99,78,8,58,99,58,58,78,78,78,78,78,78,
58,78,78,58,78,246,78,212,246,246,246,246,246,246,246,246,246,103,246,246,
246,246,58,58,58,99,212,246,246,58,212,78,246,58,58,58,58,58,212,78,
78,78,58,58,58,58,123,49,218,99,11,118,223,223,82,237,41,208,23,118,
237,223,82,244,18,210,23,23,112,19,223,103,64,6,148,147,26,253,20,8,
66,23,54,111,219,219,137,24,76,24,163,25,137,42,204,42,151,109,244,223,
20,20,20,20,8,4,111,231,236,23,82,12,237,62,62,23,62,223,253,223,
237,244,22,41,245,103,11,112,118,71,218,58,58,99,92,92,128,58,58,58,
58,58,58,212,78,58,58,212,58,58,58,78,78,58,212,246,246,246,58,58,
212,246,212,246,246,246,246,246,246,212,246,78,246,246,78,78,78,78,78,58,
78,58,58,78,99,58,58,58,99,8,99,58,58,58,58,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,246,246,246,246,103,246,246,246,246,246,
246,78,58,58,58,58,58,212,58,58,78,212,78,78,99,58,58,212,78,246,
212,212,58,58,58,218,92,12,218,99,71,12,223,82,118,243,55,23,223,30,
223,19,244,93,54,49,23,112,82,82,245,153,138,234,162,8,253,101,49,30,
111,125,24,201,142,16,159,142,43,95,197,156,193,193,51,141,224,25,248,231,
65,118,20,20,20,20,121,210,231,55,244,82,49,30,244,62,62,244,223,20,
118,237,112,208,243,245,237,71,118,49,71,58,58,218,92,92,12,58,58,99,
58,58,212,78,212,212,58,58,58,58,58,212,78,58,58,246,246,246,99,58,
99,246,246,246,246,246,246,246,246,246,212,246,58,78,78,78,78,78,58,78,
78,58,78,78,58,78,58,99,58,8,99,99,58,58,58,78,78,58,78,58,
78,78,78,246,78,78,78,246,246,246,246,246,246,246,246,103,246,246,246,246,
246,58,58,58,58,58,58,58,58,58,78,78,246,78,58,58,58,212,78,58,
58,78,58,58,58,12,92,12,99,218,118,19,82,223,22,116,237,49,112,112,
101,112,93,109,70,112,118,82,223,55,136,185,44,26,253,253,82,62,107,163,
117,16,114,159,161,106,98,46,26,26,26,26,26,4,32,81,44,142,43,234,
10,56,236,23,20,20,20,8,4,219,225,237,19,82,11,244,62,54,62,223,
20,112,30,244,72,239,103,237,71,12,12,71,58,71,92,92,12,128,58,58,
58,58,246,78,246,58,58,58,99,58,58,246,78,78,58,246,246,58,58,58,
58,212,246,212,246,246,246,246,246,246,78,78,246,58,246,58,78,246,78,58,
78,58,78,78,58,58,58,58,58,8,58,58,58,58,78,237,58,78,78,78,
78,78,78,58,246,246,212,246,246,246,246,246,246,246,246,246,246,246,246,246,
78,58,58,58,58,58,99,58,58,246,246,246,58,246,58,58,58,78,246,218,
11,58,58,58,58,12,92,71,218,11,49,223,101,23,239,93,23,118,244,223,
223,65,29,70,70,112,82,82,72,233,135,152,121,253,20,49,242,179,176,39,
198,156,32,47,26,26,69,113,26,47,9,47,162,113,26,121,113,252,152,159,
43,234,217,238,30,253,20,251,8,4,107,17,30,82,223,22,62,62,54,244,
82,19,237,112,244,41,245,30,112,71,92,71,99,71,12,92,92,71,78,58,
58,246,246,58,78,212,58,58,58,58,58,78,246,58,99,58,212,58,58,58,
58,78,246,246,246,246,246,246,246,246,246,246,78,78,78,78,246,58,78,78,
58,58,58,99,58,99,58,58,58,8,58,99,99,58,58,78,78,58,78,58,
78,58,78,78,78,78,78,246,246,246,246,246,246,246,246,246,78,246,246,246,
58,58,78,58,78,58,58,99,58,78,58,246,246,58,58,58,212,58,58,12,
71,58,58,58,99,92,92,71,218,71,223,8,19,22,150,30,49,11,23,101,
30,93,54,49,112,49,20,30,254,181,95,26,253,253,49,65,163,166,206,202,
52,26,8,121,4,161,43,114,139,131,57,200,195,188,192,88,26,26,121,98,
197,67,234,145,230,22,82,20,20,8,98,107,100,112,253,112,103,244,54,62,
49,20,49,237,118,208,243,103,11,11,12,92,92,92,92,12,49,12,58,58,
78,58,246,78,246,78,212,99,58,58,78,246,58,78,58,58,58,99,58,58,
58,99,246,246,246,246,246,246,246,246,246,246,246,78,246,78,246,78,58,78,
78,58,78,78,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,78,78,78,78,246,246,246,246,246,246,246,246,246,246,246,58,212,58,246,
99,212,58,99,78,99,58,58,78,246,58,58,58,78,78,58,78,78,99,71,
12,71,58,58,12,12,12,71,11,12,223,101,49,243,100,118,223,112,82,19,
93,225,113,23,244,101,223,41,129,199,52,253,20,223,242,124,39,57,117,122,
121,121,47,44,195,35,94,196,165,189,189,189,27,84,200,139,67,186,26,121,
240,106,159,234,175,68,242,20,20,20,8,210,238,93,223,19,237,244,23,54,
62,19,101,244,112,30,243,208,237,11,12,92,49,223,12,12,92,12,58,78,
246,78,58,246,78,212,78,78,58,58,212,58,58,58,78,99,58,58,99,58,
58,58,246,246,246,246,246,246,246,246,246,246,78,246,58,78,58,78,78,78,
78,78,237,78,58,58,58,58,58,8,99,58,99,58,78,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,103,246,246,246,246,218,58,58,78,78,
58,99,71,12,58,78,58,78,58,78,123,12,78,78,58,212,78,78,123,92,
12,12,99,99,12,92,92,71,11,118,82,101,112,116,236,82,112,112,82,118,
100,110,66,23,49,101,244,215,73,43,69,253,101,23,219,59,97,202,52,8,
8,4,120,97,187,139,27,143,46,113,26,26,46,88,60,27,131,200,192,47,
82,66,81,159,234,170,68,118,20,251,20,26,2,64,244,101,118,22,23,62,
62,49,20,118,244,23,208,245,30,11,71,12,92,12,12,49,12,12,71,58,
246,246,78,246,78,246,58,78,58,78,212,218,12,246,78,99,58,78,78,11,
12,58,58,246,246,103,246,246,58,246,246,246,246,78,246,78,78,78,58,78,
78,58,58,58,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,212,78,246,246,78,99,58,246,246,246,246,246,246,71,12,99,58,58,99,
58,58,53,251,71,78,78,78,78,246,19,19,71,246,246,78,212,246,12,92,
12,12,12,12,92,12,12,71,218,118,19,101,244,239,65,223,244,11,53,112,
222,235,66,112,223,20,72,45,90,221,8,253,19,242,214,97,57,152,26,8,
26,188,57,187,139,186,8,8,8,8,121,121,8,8,26,4,44,131,94,67,
162,82,113,44,159,76,220,29,82,0,20,8,98,238,245,82,82,237,23,62,
54,112,20,223,237,49,22,245,237,11,71,49,12,92,12,12,12,12,71,78,
246,58,246,58,246,78,246,58,246,212,58,19,101,218,78,78,99,58,58,53,
101,71,58,246,246,246,78,71,92,58,246,246,212,246,78,58,58,78,78,58,
78,78,78,78,58,58,58,58,58,8,99,99,58,99,58,78,78,58,99,58,
78,78,58,246,78,58,71,92,218,246,246,246,103,246,12,92,92,58,58,58,
58,218,63,53,19,246,246,78,78,212,53,92,92,212,246,78,78,58,92,218,
12,12,92,92,92,12,12,71,11,118,101,101,22,116,242,223,237,11,8,30,
17,62,70,112,8,53,72,172,134,143,8,20,223,109,102,57,97,81,121,82,
252,114,35,157,165,26,253,8,8,46,182,4,26,26,8,8,113,160,190,35,
186,66,121,106,117,152,232,68,49,79,20,8,26,42,17,223,53,22,112,244,
54,244,8,82,30,118,30,245,30,11,99,12,12,92,123,12,12,12,71,78,
246,78,246,78,58,246,246,58,246,58,12,53,53,12,78,78,78,99,12,63,
63,92,78,78,246,246,78,229,229,12,246,246,246,212,78,71,71,58,78,78,
58,78,78,58,58,58,212,58,58,8,99,58,58,58,58,78,78,58,99,218,
99,58,246,78,78,58,12,92,12,78,246,246,246,218,92,92,19,71,58,58,
58,12,38,92,53,71,246,58,246,218,108,92,92,218,246,212,78,58,12,218,
12,12,12,92,12,92,12,71,71,118,82,8,103,116,242,82,244,11,82,30,
222,210,223,23,8,101,55,172,183,186,8,253,223,110,102,157,97,161,8,8,
127,67,190,140,189,26,8,8,69,127,120,5,52,26,26,8,121,9,84,187,
43,113,82,98,142,152,89,119,244,20,0,253,121,219,64,23,101,30,30,23,
54,244,82,101,30,112,112,72,237,71,30,12,12,92,118,12,12,12,71,58,
246,246,58,246,58,212,78,246,58,246,108,63,53,19,78,78,78,58,53,101,
53,108,78,246,246,246,108,79,20,53,246,246,246,78,99,92,92,12,99,78,
78,58,58,218,218,218,99,58,58,8,99,99,58,58,58,99,99,218,71,11,
99,99,78,246,212,71,218,71,92,71,246,246,246,71,92,92,19,19,58,58,
58,92,53,92,92,108,58,246,246,71,92,92,92,92,212,246,246,58,123,48,
12,12,12,92,92,12,12,12,99,118,19,101,237,116,65,49,30,112,82,244,
222,235,26,118,82,101,65,136,183,7,8,8,82,242,21,157,57,192,69,8,
26,7,191,157,190,60,9,8,26,52,84,131,60,4,121,8,26,113,67,94,
142,113,82,98,43,152,10,119,244,251,0,253,121,111,64,23,101,244,22,49,
62,62,82,101,112,23,112,103,30,71,11,12,12,118,12,12,118,12,71,78,
78,246,78,58,218,58,78,246,246,12,53,101,53,19,58,78,58,12,63,63,
53,63,218,246,246,71,79,20,63,101,218,246,246,218,12,19,108,12,99,58,
99,71,218,71,71,218,71,218,71,8,99,58,99,99,58,58,11,218,71,218,
71,71,218,58,58,99,218,99,71,92,218,78,246,92,92,12,223,53,71,58,
58,19,19,92,92,19,12,78,78,12,92,92,92,92,71,78,78,218,123,241,
48,12,12,92,49,12,118,12,71,49,223,101,11,116,65,66,112,11,82,112,
100,54,66,66,223,20,244,105,90,159,8,8,8,244,10,167,187,202,98,8,
121,47,192,169,190,35,195,188,188,195,57,84,106,47,8,8,8,122,195,140,
95,66,82,98,142,221,175,119,244,251,251,20,8,219,64,112,101,30,242,118,
23,62,19,20,11,118,112,22,11,11,99,12,12,12,12,71,12,118,71,58,
246,58,246,99,12,99,212,78,58,19,53,53,101,53,58,78,218,53,101,53,
53,63,218,246,246,63,0,101,19,53,12,78,58,12,108,92,19,108,92,71,
71,12,71,71,123,71,71,123,71,8,99,99,58,58,58,11,58,11,99,218,
99,11,99,99,218,99,218,99,71,12,12,99,99,92,92,92,12,19,53,71,
99,38,53,12,12,92,19,218,212,92,92,92,48,12,108,128,246,218,123,48,
128,123,12,12,12,12,12,118,71,71,223,8,112,41,55,49,49,244,223,49,
93,231,70,82,223,20,82,116,181,158,252,8,20,223,242,214,57,157,156,46,
8,66,26,147,44,198,86,196,86,198,44,52,4,8,8,8,46,60,97,194,
52,82,82,180,159,177,232,64,66,79,20,8,26,231,100,49,8,237,62,23,
62,244,82,82,30,223,11,237,112,11,11,12,12,71,12,12,118,12,71,218,
246,78,58,218,92,99,246,212,92,53,79,79,53,53,218,58,19,63,38,126,
53,101,92,58,19,251,63,223,19,19,92,71,12,223,92,223,223,92,19,92,
12,71,123,71,71,71,71,71,71,8,11,58,11,58,99,58,99,58,99,58,
58,218,218,218,99,218,11,99,99,71,92,92,12,49,92,71,99,12,53,53,
92,20,53,123,48,12,92,19,218,19,92,12,241,48,92,92,58,218,92,241,
128,212,71,12,118,12,12,71,71,112,223,19,82,55,116,112,49,244,223,19,
208,238,235,66,223,253,82,22,250,73,95,113,8,82,49,111,102,207,132,188,
252,69,8,121,162,4,47,52,127,4,4,26,26,8,8,46,186,86,169,95,
66,8,4,95,192,87,45,236,101,251,253,8,70,222,236,223,223,237,244,23,
54,244,82,82,237,118,11,244,71,11,99,71,118,12,12,12,12,12,12,58,
78,78,246,123,108,12,212,12,53,63,13,83,63,53,12,92,53,226,13,13,
53,53,53,226,75,63,12,71,92,19,19,92,92,92,19,12,12,12,92,12,
71,71,71,71,71,12,71,71,71,8,99,99,58,99,99,58,58,99,58,58,
11,218,71,71,11,218,99,99,58,218,12,19,92,92,92,99,78,58,92,101,
75,251,53,12,123,48,92,108,101,63,92,12,241,241,92,92,108,92,108,128,
212,246,58,12,12,12,49,12,12,118,12,49,19,237,116,22,49,118,244,82,
112,17,231,70,223,82,20,82,93,45,133,7,46,8,8,49,50,224,168,207,
142,60,127,46,8,26,8,8,8,8,8,8,121,26,47,192,166,169,7,113,
66,113,7,156,36,217,28,23,251,251,20,26,111,222,30,8,49,22,112,62,
242,112,101,112,30,49,244,11,112,11,99,71,12,12,118,12,12,12,71,246,
246,78,212,92,108,92,218,53,38,13,0,0,63,101,20,63,101,75,83,83,
63,101,229,79,126,92,58,78,12,19,92,92,19,92,12,71,71,118,71,71,
218,12,71,71,71,71,71,218,99,8,218,99,218,58,58,218,99,99,58,99,
58,58,99,99,218,99,218,99,58,58,99,92,92,92,19,58,78,78,99,108,
0,34,38,123,123,48,123,92,53,108,92,12,241,241,241,123,92,19,19,123,
241,212,246,99,12,71,12,71,12,71,118,223,82,118,245,100,112,49,30,118,
223,237,238,111,113,223,19,20,49,93,144,184,44,113,8,253,19,210,173,141,
168,57,196,142,60,52,122,182,113,113,122,3,60,159,130,86,43,122,26,223,
47,106,95,76,89,68,244,20,251,20,8,210,238,72,223,19,30,112,23,62,
244,223,20,118,112,112,244,118,11,99,99,218,71,218,71,12,12,71,58,58,
78,246,246,92,63,53,53,101,83,0,83,83,53,63,63,53,20,83,0,0,
53,53,79,0,226,78,58,78,12,108,92,19,92,71,58,58,99,71,71,123,
71,218,218,71,218,218,99,218,99,8,99,99,218,218,99,99,99,99,58,99,
99,58,99,11,71,99,99,58,58,58,58,71,92,92,19,78,78,58,78,218,
53,63,101,123,123,48,48,123,92,19,92,92,241,241,241,241,92,92,92,12,
241,212,78,78,123,118,12,12,12,12,112,92,49,223,30,247,65,49,23,112,
82,23,72,231,14,26,82,19,101,49,17,146,102,154,147,69,8,82,49,23,
249,104,158,39,206,169,86,130,202,142,202,114,39,117,76,88,4,66,66,113,
7,95,234,175,68,22,101,20,251,8,4,107,100,112,101,112,30,23,112,62,
49,101,49,244,118,112,112,118,11,78,99,99,99,58,71,12,92,99,246,78,
246,58,218,108,108,53,63,229,0,83,34,13,53,53,101,38,13,0,0,13,
53,101,63,101,99,78,58,78,71,19,19,92,71,58,99,58,11,218,218,71,
99,99,99,99,218,58,99,218,218,8,71,218,99,99,218,58,99,99,99,99,
99,58,99,58,99,218,11,58,58,99,58,58,71,92,92,58,78,78,78,78,
118,19,53,123,48,128,128,48,123,12,92,92,48,128,212,48,241,12,12,92,
241,128,246,246,246,71,12,12,12,71,71,118,49,223,49,208,116,22,49,23,
11,223,223,72,225,235,113,82,82,101,49,65,68,164,201,7,162,26,8,121,
66,223,23,216,14,36,177,152,154,152,80,255,98,66,66,223,66,4,32,152,
152,163,228,222,112,251,20,20,8,113,219,222,22,82,23,22,62,112,54,244,
101,82,112,112,23,118,112,11,11,78,58,58,246,99,71,71,99,58,246,212,
58,58,123,108,108,53,20,13,101,19,34,13,53,53,53,0,75,38,0,34,
63,53,53,71,58,78,58,78,11,92,92,71,58,58,58,58,99,218,11,99,
11,58,218,218,99,99,218,99,99,8,99,71,99,99,99,99,99,218,58,99,
218,58,99,99,99,58,58,78,58,99,58,58,58,71,12,78,78,78,78,78,
58,12,19,12,48,218,246,218,48,12,92,92,241,48,58,212,48,241,12,92,
48,241,212,58,212,212,123,118,12,71,118,118,12,223,49,118,55,239,244,223,
112,112,82,118,236,225,14,4,26,82,101,19,112,93,153,21,224,174,88,162,
26,26,121,82,66,66,66,66,66,66,26,82,66,26,113,127,32,44,51,87,
248,222,236,223,20,20,20,8,70,111,17,237,223,49,237,30,62,54,30,118,
253,49,112,118,23,118,118,11,99,58,58,58,212,99,71,218,246,78,78,58,
58,58,108,108,63,38,13,92,58,12,13,251,53,63,251,79,12,71,34,34,
251,53,19,58,78,78,78,58,58,71,71,58,99,99,58,99,58,11,58,99,
99,99,99,218,218,99,218,218,99,8,71,99,218,218,218,99,218,99,99,99,
99,71,58,99,99,99,99,58,58,99,58,58,78,58,99,78,58,78,58,78,
78,78,99,218,128,58,58,78,128,48,12,92,123,241,78,246,58,48,241,218,
12,128,212,212,58,58,212,218,71,12,71,12,118,12,223,49,11,243,55,244,
49,112,244,223,49,236,17,111,4,121,82,82,8,223,244,29,153,61,148,234,
152,32,147,52,4,4,113,26,113,26,98,98,147,255,7,193,24,163,217,238,
110,112,101,20,20,253,8,70,107,222,22,223,223,244,244,244,244,242,112,82,
223,118,23,23,49,118,71,11,58,58,58,246,246,58,99,78,58,212,212,78,
58,99,53,53,38,83,19,58,246,19,34,79,251,34,34,71,58,71,79,13,
83,63,218,58,58,99,58,78,58,99,78,58,99,99,99,58,58,99,99,58,
218,11,218,99,11,218,11,99,71,8,71,218,218,11,71,99,218,99,99,99,
99,218,11,99,58,58,58,58,11,58,99,218,58,58,78,78,78,78,58,58,
78,78,78,78,58,78,78,78,58,58,48,123,48,48,128,78,246,78,128,241,
241,241,128,212,58,58,58,58,218,12,118,71,71,112,118,223,49,11,245,55,
30,49,112,244,223,19,30,93,107,111,4,26,101,101,8,101,112,242,93,203,
6,170,21,74,51,51,104,24,234,76,24,104,76,124,232,56,225,18,30,223,
20,20,20,20,8,66,235,231,236,112,223,118,30,112,112,54,244,112,82,49,
112,23,118,118,12,11,99,99,246,58,58,58,78,58,246,246,78,78,212,78,
58,12,53,229,34,40,78,78,58,38,0,13,13,79,71,58,58,71,13,0,
38,71,58,99,58,99,58,99,78,58,58,99,99,99,71,99,58,99,218,99,
71,99,218,99,99,71,218,99,71,8,71,71,71,123,218,218,11,218,218,218,
218,99,218,218,99,99,99,99,58,99,99,99,99,99,58,78,78,58,58,99,
99,78,78,246,78,212,78,78,58,78,128,48,48,241,48,246,78,58,246,128,
128,128,128,128,212,78,212,78,58,218,71,71,12,12,118,118,49,49,112,208,
41,22,49,112,244,23,19,49,22,93,219,14,4,8,82,101,20,101,223,49,
30,65,18,29,17,203,228,230,56,96,91,225,225,236,242,112,49,82,20,20,
20,20,82,113,210,107,29,22,118,223,112,30,244,244,62,112,23,82,223,49,
118,118,49,49,118,71,99,246,58,58,212,246,246,78,212,58,246,246,78,58,
218,53,209,126,40,78,78,78,218,0,34,34,79,71,78,99,58,71,251,229,
12,58,99,99,99,58,58,58,58,99,99,99,99,218,99,58,99,99,99,218,
99,218,11,218,218,11,218,71,71,8,71,123,71,71,218,123,71,99,11,99,
218,11,99,71,218,99,58,99,99,58,218,218,99,99,58,58,58,58,99,58,
58,99,58,246,246,246,78,58,58,58,78,58,48,48,241,78,246,78,78,58,
58,241,241,241,212,58,246,78,246,58,218,71,71,71,118,118,118,49,49,112,
103,243,236,112,49,244,112,49,223,118,65,93,107,14,98,113,82,8,101,253,
101,20,101,82,82,223,118,118,49,49,49,82,82,101,101,20,20,253,253,121,
26,70,235,110,29,103,118,223,223,11,244,244,54,242,244,49,19,223,49,118,
118,49,12,71,11,99,212,246,78,78,78,78,212,246,78,58,78,212,78,58,
12,38,213,71,78,58,58,78,40,83,79,20,99,58,99,58,99,12,92,71,
78,58,99,99,99,99,99,99,99,99,218,218,99,218,218,99,218,218,11,218,
11,218,218,71,218,218,71,123,71,8,71,71,12,71,71,218,218,218,71,71,
218,218,218,218,71,218,218,99,99,218,99,99,99,99,99,99,58,99,58,99,
99,99,99,58,78,78,78,78,58,99,58,58,58,128,48,128,78,78,58,78,
212,212,212,241,128,58,246,246,58,246,58,218,218,118,71,71,118,12,118,49,
23,237,245,55,208,23,118,23,112,223,223,118,244,236,18,110,14,210,4,66,
121,8,82,20,82,101,101,251,20,20,20,101,8,20,8,8,26,26,210,235,
109,110,65,30,118,223,49,244,244,244,244,242,65,30,223,82,49,118,118,49,
92,49,118,71,11,78,246,78,58,246,212,246,78,78,246,78,246,78,212,218,
53,92,99,78,58,58,58,246,53,0,53,99,99,58,99,58,99,71,218,58,
99,58,99,218,58,99,58,78,99,99,11,99,71,99,99,218,99,99,218,71,
123,218,71,218,12,71,71,71,71,8,71,71,71,71,71,118,71,71,218,99,
71,71,71,123,71,71,218,99,99,218,218,71,11,218,99,99,58,99,58,99,
99,99,218,58,58,78,78,78,58,99,99,58,58,58,58,128,246,78,58,58,
58,58,246,128,128,58,212,246,78,78,78,58,58,218,71,71,11,118,118,49,
12,23,11,103,243,72,237,23,23,112,23,223,19,223,112,22,109,18,29,111,
111,210,210,70,4,26,26,26,26,26,26,4,4,70,98,235,2,18,29,65,
54,23,223,49,23,244,244,112,244,54,22,244,118,82,223,223,118,92,49,49,
223,71,11,99,99,78,246,58,246,78,58,212,78,78,58,58,246,78,58,218,
71,78,58,58,99,58,58,99,19,77,58,58,58,218,99,58,58,58,58,58,
218,99,11,218,58,99,218,58,218,218,71,218,218,71,99,71,218,71,71,218,
71,123,71,71,71,71,71,71,12,8,118,118,71,71,118,71,71,71,118,12,
71,123,71,71,71,71,71,71,218,99,99,99,218,218,71,218,99,99,58,99,
99,218,99,218,58,58,246,78,78,99,99,99,99,58,246,78,58,246,58,58,
58,58,58,78,78,58,58,58,246,212,99,58,58,58,218,99,71,118,11,118,
49,49,49,23,11,208,55,245,22,112,23,23,23,23,49,49,49,223,112,30,
22,236,18,18,18,29,18,18,18,18,107,236,29,236,236,22,30,23,223,223,
223,118,118,112,244,112,244,242,242,30,23,223,82,223,49,49,49,223,49,12,
71,71,99,58,246,212,58,58,58,78,78,78,58,58,58,58,78,212,246,78,
78,58,58,11,99,58,78,78,99,58,58,99,218,99,58,99,58,58,58,218,
99,71,218,99,218,58,99,218,218,71,218,123,71,99,71,218,71,71,71,12,
71,71,12,12,12,12,12,12,12,8,12,12,12,12,12,12,118,118,71,71,
71,218,71,123,71,71,71,71,123,71,218,11,218,71,218,123,218,99,218,58,
99,99,11,218,71,99,99,58,78,58,99,99,71,99,58,78,246,246,246,58,
58,218,58,99,78,78,246,78,78,246,58,58,58,212,58,58,99,71,71,118,
71,118,118,23,49,112,112,103,72,72,65,244,112,23,118,118,70,223,223,223,
223,49,118,23,118,112,112,244,112,112,23,23,23,49,49,223,223,49,23,118,
244,244,112,62,244,109,22,30,49,223,223,82,49,223,49,223,223,118,118,71,
99,99,99,78,78,246,58,58,78,78,58,58,58,99,78,246,78,78,78,78,
99,99,99,58,99,58,78,78,58,99,99,11,218,99,99,58,58,11,99,218,
218,218,71,99,218,218,11,218,123,71,218,71,71,218,71,71,123,71,118,12,
71,12,12,12,12,12,12,12,12,8,12,12,12,12,12,12,71,71,71,118,
71,118,71,71,118,12,71,71,71,71,99,218,123,71,218,71,218,71,99,99,
99,218,218,71,218,218,99,58,58,58,58,218,99,218,218,99,58,99,78,58,
58,99,99,99,58,58,78,246,246,78,78,78,58,99,58,58,99,58,99,71,
11,71,12,23,118,118,118,23,112,30,103,208,208,65,242,112,118,23,23,118,
118,118,49,112,23,112,11,112,112,112,118,49,49,49,49,112,23,23,112,244,
244,22,22,22,242,112,49,223,223,66,223,49,223,49,223,49,12,71,71,99,
99,58,212,212,246,58,78,78,58,58,99,99,99,58,78,78,78,78,58,58,
99,99,99,58,58,58,58,58,99,218,71,218,99,99,218,58,99,99,71,218,
71,71,218,99,71,99,123,71,118,118,123,71,71,123,71,71,12,12,118,12,
12,12,12,12,12,12,71,12,71,8,12,92,12,92,71,12,118,118,12,12,
118,71,71,12,71,71,118,12,12,71,118,218,71,71,71,12,71,12,218,218,
99,99,218,218,71,71,71,218,99,99,99,99,71,71,218,71,99,58,58,58,
58,58,99,11,99,99,99,58,246,78,246,78,58,99,99,99,58,58,99,99,
99,11,71,112,112,118,118,92,118,23,118,112,30,237,103,65,65,22,30,54,
244,244,23,112,244,112,244,112,244,23,244,23,112,62,244,244,30,242,22,242,
22,30,23,49,49,19,82,223,223,49,49,49,223,49,12,11,11,218,99,58,
58,78,78,78,246,78,78,99,99,58,99,58,58,78,78,78,58,99,218,218,
71,99,99,99,58,99,58,99,71,123,71,218,99,99,218,99,218,71,12,71,
71,218,71,71,218,71,71,71,71,71,12,71,71,71,118,12,12,12,71,71,
12,12,12,12,118,12,12,92,12,8,12,12,71,12,12,12,12,12,71,12,
118,12,12,12,118,12,71,12,12,71,71,71,71,123,71,12,12,71,71,218,
218,218,11,71,123,71,71,218,71,99,99,58,99,99,71,218,218,99,218,58,
58,58,58,99,218,71,99,218,58,58,58,246,212,58,58,99,99,58,99,58,
58,58,58,218,71,71,112,71,118,118,49,23,118,118,49,112,112,30,237,22,
22,22,103,22,22,22,22,22,30,242,22,22,22,103,22,22,30,112,112,23,
49,49,49,82,223,66,49,49,49,49,223,12,118,71,218,99,99,58,99,58,
78,246,78,246,58,58,99,99,218,218,99,99,99,58,58,58,99,218,71,218,
99,99,58,58,58,99,218,123,71,71,218,218,99,99,99,123,71,71,71,92,
71,71,218,218,71,12,12,12,118,71,12,118,71,71,71,12,12,12,12,12,
12,12,118,118,12,12,12,12,12,8,92,92,92,12,12,12,12,12,12,12,
92,12,12,12,71,12,118,12,12,12,12,12,71,71,71,12,12,71,118,71,
71,123,71,71,71,118,71,71,71,123,71,218,218,99,218,71,12,71,71,218,
218,58,58,99,58,71,71,218,218,218,99,58,58,58,58,58,99,99,99,218,
218,99,58,58,99,99,99,11,11,11,23,112,118,112,49,118,118,118,23,118,
49,118,23,112,112,112,112,244,112,112,118,112,118,49,49,223,49,223,223,49,
223,223,49,49,223,49,223,223,118,118,71,11,218,99,218,99,218,78,58,58,
58,58,58,218,218,218,218,218,58,99,58,58,58,58,218,99,71,71,123,71,
218,99,58,99,99,71,71,12,12,71,71,71,218,218,218,71,118,71,71,12,
123,71,12,71,71,12,12,12,118,71,12,12,12,118,118,12,71,118,12,118,
12,12,12,12,12,92,12,12,92,8,92,92,12,12,92,12,92,12,12,12,
12,12,118,12,12,12,12,12,12,12,118,12,12,71,118,71,12,12,71,118,
71,71,71,123,218,118,12,71,71,71,71,99,99,218,218,71,71,71,71,71,
99,218,99,58,99,218,218,71,71,71,218,71,58,99,58,58,99,58,218,99,
99,218,99,99,58,58,58,99,58,99,218,11,71,112,11,112,118,23,118,23,
49,118,118,92,49,92,49,92,49,92,49,223,223,49,223,49,49,49,49,82,
49,49,49,223,118,118,71,71,11,71,99,218,218,99,58,58,58,58,58,58,
58,218,218,218,71,218,218,99,99,99,99,58,218,218,71,123,71,71,218,11,
99,99,218,218,71,71,12,71,12,218,218,218,71,218,118,12,71,118,71,71,
71,71,71,71,118,71,12,12,12,71,12,12,12,12,12,12,12,49,12,12,
12,92,12,49,12,92,12,12,92,8,92,92,92,92,92,12,92,12,12,92,
12,92,12,92,12,71,71,12,12,12,12,71,12,118,71,118,71,118,12,12,
12,12,71,71,218,71,71,118,118,12,12,118,71,218,71,218,123,12,12,12,
12,71,71,99,99,99,218,71,71,71,71,123,71,218,218,58,99,99,58,218,
99,218,218,11,99,218,99,218,218,58,58,58,99,218,71,11,71,71,118,11,
112,71,112,118,112,12,118,118,118,118,118,118,118,118,118,118,223,223,49,49,
118,118,118,71,71,71,218,71,218,71,99,99,99,218,58,58,58,218,218,218,
218,71,71,218,123,71,218,99,58,218,218,99,71,118,12,71,71,71,218,218,
218,99,71,118,12,12,12,71,71,123,71,71,71,12,118,12,92,71,118,71,
12,12,71,12,12,92,12,12,12,118,12,12,12,12,12,92,12,12,12,92,
71,92,12,92,92,92,92,92,12,8,92,92,92,92,92,92,92,92,92,12,
92,12,92,12,92,92,12,118,92,12,12,92,92,12,12,12,12,12,12,12,
12,12,71,118,12,118,71,71,12,12,12,12,118,71,218,71,218,71,118,12,
12,71,12,71,218,71,99,218,123,71,71,12,71,118,71,71,99,218,218,99,
218,99,218,218,218,71,123,71,218,218,218,218,99,99,99,58,99,99,99,218,
99,71,71,71,11,71,11,11,11,11,11,11,11,11,71,118,12,118,218,218,
71,218,71,71,218,71,99,71,99,99,99,58,218,99,218,218,71,71,71,71,
71,71,123,71,11,99,99,99,218,218,71,71,12,12,12,71,123,218,71,218,
71,118,71,12,118,12,12,71,71,218,118,12,12,12,92,12,71,118,71,71,
12,71,92,12,92,12,12,12,118,12,12,92,92,12,92,12,92,92,92,92,
92,92,92,92,12,92,92,92,92,8,92,92,92,12,92,92,92,92,92,92,
92,92,92,12,92,92,12,12,92,92,92,12,92,92,12,12,118,12,12,92,
92,12,12,12,71,71,71,118,12,118,12,12,12,71,12,71,71,71,71,12,
12,12,118,12,12,118,218,71,71,71,12,71,71,71,12,12,71,71,71,11,
218,99,218,218,218,218,71,71,71,71,71,71,71,71,218,218,218,218,99,218,
218,218,99,218,99,218,218,218,218,218,218,218,218,99,218,11,218,71,71,71,
71,123,71,123,71,218,99,218,218,11,218,99,71,71,71,71,71,71,71,92,
71,71,71,123,71,218,71,71,71,118,12,12,12,12,71,71,71,218,71,71,
12,12,12,12,12,12,12,71,71,71,12,12,12,12,12,12,12,12,118,12,
12,92,92,92,12,92,12,71,12,92,92,12,92,92,92,92,92,12,92,92,
92,92,92,92,92,92,92,92,92,8,92,19,92,92,92,92,92,223,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,12,118,12,12,
12,92,92,12,92,12,12,12,71,12,49,12,92,92,12,12,71,12,12,12,
12,71,12,12,12,12,71,12,71,71,218,218,71,118,12,12,12,71,12,12,
71,123,71,71,99,71,71,123,71,123,71,123,71,71,71,71,71,71,71,71,
71,218,218,218,71,71,218,71,218,71,218,71,71,123,71,123,71,123,71,123,
218,71,218,218,218,218,71,71,71,71,71,12,12,12,12,12,12,12,71,71,
71,123,218,218,71,71,12,12,12,71,12,12,12,12,71,71,71,12,118,12,
12,92,12,12,12,12,12,12,71,12,92,12,92,12,12,118,12,12,12,92,
92,92,92,92,92,12,92,92,12,92,92,92,92,19,12,92,92,92,92,92,
12,92,92,92,92,92,92,92,92,8,19,108,19,108,12,19,92,92,92,92,
92,92,92,92,92,19,92,92,92,92,92,92,92,92,92,92,92,92,12,92,
92,92,92,92,92,92,12,12,12,12,71,12,92,92,92,92,12,92,118,12,
12,12,12,12,92,12,12,12,71,12,71,71,71,12,12,12,12,12,12,92,
112,118,71,12,71,71,71,218,71,71,71,71,71,71,12,12,12,12,12,12,
12,118,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
71,71,71,71,71,71,71,71,118,71,12,71,12,12,12,12,12,71,71,123,
71,71,71,92,12,12,12,12,92,92,71,12,12,12,12,71,12,12,92,12,
92,92,12,118,12,12,118,12,12,92,92,92,92,12,12,12,12,92,92,92,
92,12,92,12,92,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,19,19,108,92,8,92,92,19,92,108,92,19,92,92,92,
92,108,92,92,92,12,92,92,12,92,92,92,92,92,92,92,92,92,92,12,
12,92,92,92,92,223,12,92,12,12,12,12,12,92,92,12,92,12,12,12,
12,12,12,12,49,12,92,92,92,92,12,12,71,12,12,12,12,12,12,12,
92,92,118,92,12,12,118,12,12,12,12,12,12,71,12,12,12,12,12,12,
12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
12,12,118,118,12,118,12,12,12,12,12,12,12,12,12,12,12,12,71,12,
12,12,71,92,12,92,92,49,12,12,12,12,118,12,12,118,92,12,92,92,
12,12,12,12,123,12,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,92,92,19,92,92,108,
92,19,92,108,108,92,108,92,108,8,19,108,19,92,19,108,108,108,92,19,
92,92,19,92,108,108,92,108,108,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,12,12,12,12,12,12,92,92,92,92,92,92,12,12,12,12,12,118,12,
12,12,12,92,12,12,12,12,71,12,12,12,12,71,71,12,12,71,118,118,
12,12,12,12,12,118,12,12,12,92,12,12,12,12,12,71,12,12,118,12,
12,71,12,12,12,12,12,92,118,118,12,12,12,12,71,12,12,12,49,12,
92,12,92,92,92,12,92,12,12,12,12,12,92,92,92,92,92,92,92,92,
12,12,71,92,92,92,12,92,223,92,92,92,12,92,92,92,92,92,12,19,
92,92,92,92,92,92,108,92,108,19,92,108,108,108,92,92,19,108,92,108,
19,92,19,92,108,92,108,19,19,8,19,108,19,108,108,19,92,19,108,19,
19,108,108,19,19,92,108,92,92,108,19,12,108,108,92,19,108,108,92,19,
92,92,92,92,92,92,108,19,92,92,92,92,12,92,92,92,92,92,92,92,
92,92,92,12,12,118,123,92,12,12,92,92,92,92,92,92,12,12,12,12,
12,92,12,12,92,12,92,92,92,92,92,92,12,12,12,12,12,12,12,71,
71,12,12,12,12,12,12,12,71,12,12,12,12,12,12,92,12,12,92,12,
92,12,12,49,12,92,12,12,12,12,12,71,12,12,12,12,92,12,92,12,
92,92,92,92,92,12,12,12,12,92,12,12,92,92,92,92,92,92,12,12,
12,92,92,92,92,19,108,92,92,92,92,92,92,92,92,19,92,108,108,92,
92,92,92,19,108,92,19,108,92,108,108,92,19,92,108,19,108,92,108,92,
19,108,108,92,108,108,19,92,108,8,19,19,19,19,19,108,19,19,108,92,
19,19,108,92,19,19,108,19,108,92,108,19,92,19,92,92,92,19,92,92,
92,92,92,92,92,92,19,108,92,19,19,92,92,92,92,92,92,92,223,92,
223,92,92,92,92,92,92,92,92,92,92,92,92,223,92,92,92,12,92,12,
12,12,12,12,92,12,12,92,12,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,92,49,92,12,92,92,12,12,92,12,92,12,92,12,12,92,12,
12,12,12,12,12,12,12,92,92,92,12,92,92,92,92,92,92,92,92,92,
92,92,12,12,12,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,19,92,92,108,12,92,92,92,12,19,92,92,108,92,19,19,92,
92,92,92,92,108,19,92,19,19,92,92,108,108,92,108,92,19,19,19,108,
19,19,19,19,19,19,108,19,19,8,19,53,19,53,19,53,19,53,19,108,
19,108,19,108,108,108,19,108,19,108,19,108,108,108,108,19,108,19,108,19,
19,92,108,19,19,12,108,92,108,92,108,19,108,92,92,92,92,92,92,19,
92,19,108,92,19,92,92,92,92,92,92,92,92,92,92,92,108,108,19,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,92,92,92,12,92,19,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,108,19,92,92,223,92,92,92,92,92,92,
19,108,108,108,108,19,92,92,92,92,108,108,108,108,108,92,108,92,108,19,
92,19,108,108,19,108,108,108,108,108,19,19,19,19,19,19,108,108,53,19,
108,19,108,53,19,53,19,53,19,8,19,19,19,19,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,108,19,108,19,
19,19,19,19,108,19,108,19,108,19,108,19,19,19,19,108,19,92,92,92,
19,19,108,19,108,19,19,92,92,92,92,92,92,92,92,19,19,108,19,108,
19,92,19,92,92,92,92,92,92,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,19,19,19,92,19,19,92,19,19,108,92,92,92,19,92,92,92,
92,92,92,92,92,19,19,19,19,108,19,108,92,92,92,92,92,92,19,19,
92,19,223,19,108,19,108,92,19,19,19,19,19,19,108,19,108,19,108,19,
19,19,19,19,19,19,19,19,19,108,19,108,19,108,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,8};

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
CentralReflection

View File

@ -1,680 +0,0 @@
/**********************************************************************
* CentralReflection Distortion Plug-In (Version 1.04)
* Daniel Cotting (cotting@mygale.org)
**********************************************************************
* Official homepages: http://www.mygale.org/~cotting
* http://cotting.citeweb.net
* http://village.cyberbrain.com/cotting
**********************************************************************
*/
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdlib.h>
#include <math.h>
#include <signal.h>
#include <unistd.h>
#include "libgimp/gimp.h"
#include "gtk/gtk.h"
#include "logo.h"
#define ENTRY_WIDTH 100
/* Declare local functions.
*/
static void query(void);
static void run(char *name, int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static void drawCentralReflection(GDrawable *drawable);
static gint CentralReflection_dialog(GDrawable *drawable);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
typedef struct
{
gdouble cone_radius;
gint keep_surr, use_bkgr, set_transparent, use_antialias,flip;
} CentralReflectionValues;
static CentralReflectionValues lvals =
{
/* CentralReflection cone radius value */
100,
/* Surroundings options */
TRUE, FALSE, FALSE, TRUE, TRUE
};
typedef struct
{
gint run;
} CentralReflectionInterface;
static CentralReflectionInterface bint =
{
FALSE /* run */
};
GtkWidget * CentralReflection_logo_dialog(void);
GtkWidget *maindlg;
GtkWidget *logodlg;
GtkTooltips *tips;
GdkColor tips_fg,tips_bg;
MAIN()
static void
query(void)
{
static GParamDef args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image (unused)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
{ PARAM_FLOAT, "circle_radius", "Radius of the reflecting circle" },
{ PARAM_INT32, "keep_surroundings", "Keep Central-Reflection surroundings" },
{ PARAM_INT32, "set_background", "Set Central-Reflection surroundings to bkgr value" },
{ PARAM_INT32, "set_transparent", "Set Central-Reflection surroundings transparent (Only on Image w/ Alpha-Layer)" },
{ PARAM_INT32, "use_antialias", "Use antialias for better and smoother results" },
{ PARAM_INT32, "flip", "Flip the image vertically" },
};
static GParamDef *return_vals = NULL;
static int nargs = sizeof(args)/ sizeof(args[0]);
static int nreturn_vals = 0;
gimp_install_procedure("plug_in_CentralReflection",
"Apply a Central-Reflection effect",
"",
"Daniel Cotting (cotting@mygale.org, http://www.mygale.org/~cotting)",
"Daniel Cotting (cotting@mygale.org, http://www.mygale.org/~cotting)",
"October, 1997",
"<Image>/Filters/Glass Effects/Central Reflection",
"RGB*, GRAY*, INDEXED*",
PROC_PLUG_IN,
nargs, nreturn_vals,
args, return_vals);
}
static void
run(char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals)
{
static GParam values[1];
GDrawable *drawable;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
run_mode = param[0].data.d_int32;
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
*nreturn_vals = 1;
*return_vals = values;
drawable = gimp_drawable_get(param[2].data.d_drawable);
switch(run_mode) {
case RUN_INTERACTIVE:
gimp_get_data("plug_in_CentralReflection", &lvals);
if(!CentralReflection_dialog(drawable)) return;
break;
case RUN_NONINTERACTIVE:
if(nparams != 9) status = STATUS_CALLING_ERROR;
if(status == STATUS_SUCCESS) {
lvals.cone_radius = param[3].data.d_float;
lvals.keep_surr = param[4].data.d_int32;
lvals.use_bkgr = param[5].data.d_int32;
lvals.set_transparent = param[6].data.d_int32;
lvals.use_antialias = param[7].data.d_int32;
lvals.flip = param[8].data.d_int32;
}
if(status == STATUS_SUCCESS && (lvals.cone_radius <= 0))
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
gimp_get_data ("plug_in_CentralReflection", &lvals);
break;
default:
break;
}
printf("creflect: waiting... (pid %d)\n", getpid());
kill(getpid(), SIGSTOP);
gimp_tile_cache_ntiles(2 *(drawable->width / gimp_tile_width() + 1));
gimp_progress_init("Applying Central-Reflection. Please wait...");
drawCentralReflection(drawable);
if(run_mode != RUN_NONINTERACTIVE)
gimp_displays_flush();
if(run_mode == RUN_INTERACTIVE)
gimp_set_data("plug_in_CentralReflection", &lvals, sizeof(CentralReflectionValues));
values[0].data.d_status = status;
gimp_drawable_detach(drawable);
}
static void
set_tooltip (GtkTooltips *tooltips, GtkWidget *widget, const char *desc)
{
if (desc && desc[0])
gtk_tooltips_set_tips (tooltips, widget, (char *) desc);
}
static void
drawCentralReflection(GDrawable *drawable)
{
GPixelRgn srcPR, destPR;
gint width, height;
gint bytes;
gdouble abstand;
gdouble radius;
gdouble verhaltniss, a1,a2,a3,a4,faktor,a_tot;
gint row;
gint x1, y1, x2, y2, ix, iy;
guchar *src, *dest;
gint i, col, succeeded;
gfloat regionwidth, regionheight, dx, dy;
gfloat a, b, x, y;
glong pixelpos, pos;
guchar bgr_red, bgr_blue, bgr_green, alphaval;
GDrawableType drawtype = gimp_drawable_type(drawable->id);
gimp_palette_get_background(&bgr_red, &bgr_green, &bgr_blue);
gimp_drawable_mask_bounds(drawable->id, &x1, &y1, &x2, &y2);
regionwidth = x2-x1;
a = regionwidth/2;
regionheight = y2-y1;
b = regionheight/2;
radius=lvals.cone_radius;
width = drawable->width;
height = drawable->height;
bytes = drawable->bpp;
gimp_pixel_rgn_init(&srcPR, drawable, 0, 0, width, height, FALSE, FALSE);
gimp_pixel_rgn_init(&destPR, drawable, 0, 0, width, height, TRUE, TRUE);
src = g_malloc((x2-x1)*(y2-y1)*bytes);
dest = g_malloc((x2-x1)*(y2-y1)*bytes);
gimp_pixel_rgn_get_rect(&srcPR, src, x1, y1, regionwidth, regionheight);
for(col = 0; col < regionwidth; col++) {
dx = (gfloat)col - a;
for(row = 0; row < regionheight; row++) {
pixelpos = (col+row*regionwidth)*bytes;
dy = -((gfloat)row - b);
abstand=(sqrt(dx*dx+dy*dy));
succeeded=1;
verhaltniss=radius/abstand;
if (lvals.flip) dy = -dy;
x = dx/(abstand/(radius*verhaltniss))+a;
y = dy/(abstand/(radius*verhaltniss))+b;
if (x>regionwidth) succeeded=0;
if (y>regionheight) succeeded=0;
if (x<0) succeeded=0;
if (y<0) succeeded=0;
if (succeeded){
ix=(int)x;
iy=(int)y;
if (lvals.use_antialias) {
if ((ix - x)<0){
if ((iy - y)<0){} else {iy-=1;}
} else{
if ((iy - y)<0){ix-=1;} else {iy-=1;ix-=1;}
}
a1=1/((ix-x)*(ix-x)+(iy-y)*(iy-y));
a2=1/((ix+1-x)*(ix+1-x)+(iy-y)*(iy-y));
a3=1/((ix-x)*(ix-x)+(iy+1-y)*(iy+1-y));
a4=1/((ix+1-x)*(ix+1-x)+(iy+1-y)*(iy+1-y));
a_tot=a1+a2+a3+a4;
faktor=1/a_tot;
a1*=faktor;
a2*=faktor;
a3*=faktor;
a4*=faktor;
pos = ((gint)(iy)*regionwidth + (gint)(ix)) * bytes;
for (i = 0; i < bytes; i++) {
dest[pixelpos+i] = (gint)((gdouble)(src[pos+i])*a1+(gdouble)(src[pos+i+bytes])*a2+(gdouble)(src[pos+i+(gint)(regionwidth*bytes)])*a3+(gdouble)(src[pos+i+(gint)(regionwidth*bytes)+bytes])*a4);
}
} else {
pos = ((gint)(iy)*regionwidth + (gint)(ix)) * bytes;
for(i = 0; i < bytes; i++) {
dest[pixelpos+i] = src[pos+i];
}
}
}
if (succeeded==0){
if(lvals.keep_surr) {
for(i = 0; i < bytes; i++) {
dest[pixelpos+i] = src[pixelpos+i];
}
} else {
if(lvals.set_transparent) alphaval = 0;
else alphaval = 255;
switch(drawtype) {
case INDEXEDA_IMAGE:
dest[pixelpos+1] = alphaval;
case INDEXED_IMAGE:
dest[pixelpos+0] = 0;
break;
case RGBA_IMAGE:
dest[pixelpos+3] = alphaval;
case RGB_IMAGE:
dest[pixelpos+0] = bgr_red;
dest[pixelpos+1] = bgr_green;
dest[pixelpos+2] = bgr_blue;
break;
case GRAYA_IMAGE:
dest[pixelpos+1] = alphaval;
case GRAY_IMAGE:
dest[pixelpos+0] = bgr_red;
break;
}
}
}
}
if(((gint)(regionwidth-col) % 5) == 0)
gimp_progress_update((gdouble)col/(gdouble)regionwidth);
}
gimp_pixel_rgn_set_rect(&destPR, dest, x1, y1, regionwidth, regionheight);
g_free(src);
g_free(dest);
gimp_drawable_flush(drawable);
gimp_drawable_merge_shadow(drawable->id, TRUE);
gimp_drawable_update(drawable->id, x1, y1,(x2 - x1),(y2 - y1));
}
static void
CentralReflection_close_callback(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}
static void
CentralReflection_ok_callback(GtkWidget *widget, gpointer data)
{
bint.run = TRUE;
gtk_widget_destroy(GTK_WIDGET (data));
}
static void
CentralReflection_toggle_update(GtkWidget *widget, gpointer data)
{
int *toggle_val;
toggle_val = (int *)data;
if(GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
CentralReflection_entry_callback(GtkWidget *widget, gpointer data)
{
lvals.cone_radius = atof(gtk_entry_get_text(GTK_ENTRY(widget)));
if(lvals.cone_radius <= 0) lvals.cone_radius = 10;
}
static void
CentralReflection_logo_ok_callback(GtkWidget *widget, gpointer data)
{
gtk_widget_set_sensitive (maindlg, TRUE);
gtk_widget_destroy(logodlg);
}
static void
CentralReflection_about_callback(GtkWidget *widget, gpointer data)
{
gtk_widget_set_sensitive (maindlg, FALSE);
CentralReflection_logo_dialog();
}
static gint
CentralReflection_dialog(GDrawable *drawable)
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *button;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
gchar buffer[12];
gchar **argv;
gint argc;
GSList *group = NULL;
GDrawableType drawtype;
drawtype = gimp_drawable_type(drawable->id);
argc = 1;
argv = g_new(gchar *, 1);
argv[0] = g_strdup("apply_CentralReflection");
gtk_init(&argc, &argv);
gtk_rc_parse(gimp_gtkrc());
dlg = maindlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dlg), "Central-Reflection");
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc)CentralReflection_close_callback,
NULL);
frame = gtk_frame_new("Parameter Settings");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(vbox), 10);
gtk_container_add(GTK_CONTAINER(frame), vbox);
/* use black as foreground: */
tips = gtk_tooltips_new ();
tips_fg.red = 0;
tips_fg.green = 0;
tips_fg.blue = 0;
/* postit yellow (khaki) as background: */
gdk_color_alloc (gtk_widget_get_colormap (frame), &tips_fg);
tips_bg.red = 61669;
tips_bg.green = 59113;
tips_bg.blue = 35979;
gdk_color_alloc (gtk_widget_get_colormap (frame), &tips_bg);
gtk_tooltips_set_colors (tips,&tips_bg,&tips_fg);
toggle = gtk_radio_button_new_with_label(group,
"Keep original surroundings");
group = gtk_radio_button_group(GTK_RADIO_BUTTON(toggle));
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
(GtkSignalFunc) CentralReflection_toggle_update,
&lvals.keep_surr);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle), lvals.keep_surr);
gtk_widget_show(toggle);
set_tooltip(tips,toggle,"In the center, where pixels of outside the image borders would be reflected to, the plug-in can't calculate a reasonable image. If this option is enabled, this area will be filled with the original image.");
toggle =
gtk_radio_button_new_with_label(group,
drawtype == INDEXEDA_IMAGE ||
drawtype == INDEXED_IMAGE ?
"Set surroundings to index 0" :
"Set surroundings to background color");
group = gtk_radio_button_group(GTK_RADIO_BUTTON(toggle));
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
(GtkSignalFunc) CentralReflection_toggle_update,
&lvals.use_bkgr);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle), lvals.use_bkgr);
gtk_widget_show(toggle);
set_tooltip(tips,toggle,"In the center, where pixels of outside the image borders would be reflected to, the plug-in can't calculate a reasonable image. If this option is enabled, this area will be filled with the active background color or the index-0-color, depending on the image type.");
if((drawtype == INDEXEDA_IMAGE) ||
(drawtype == GRAYA_IMAGE) ||
(drawtype == RGBA_IMAGE)) {
toggle = gtk_radio_button_new_with_label(group,
"Make surroundings transparent");
group = gtk_radio_button_group(GTK_RADIO_BUTTON(toggle));
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
(GtkSignalFunc) CentralReflection_toggle_update,
&lvals.set_transparent);
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle),
lvals.set_transparent);
gtk_widget_show(toggle);
set_tooltip(tips,toggle,"In the center, where pixels of outside the image borders would be reflected to, the plug-in can't calculate a reasonable image. If this option is enabled, this area will be kept transparent.");
}
if((drawtype != INDEXEDA_IMAGE) && (drawtype != INDEXED_IMAGE)){
toggle = gtk_check_button_new_with_label ("Use antialias (recommended)");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&lvals.use_antialias);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), lvals.use_antialias);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"If this option is enabled, an antialias algorithm will be used to produce a better and smoother output.");
} else{ lvals.use_antialias=FALSE;}
toggle = gtk_check_button_new_with_label ("Flip image vertically");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&lvals.flip);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), lvals.flip);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"With this option you can flip the image vertically.");
hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
label = gtk_label_new("Radius of reflection-circle: ");
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0);
gtk_widget_show(label);
entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
gtk_widget_set_usize(entry, ENTRY_WIDTH, 0);
sprintf(buffer, "%.2f", lvals.cone_radius);
gtk_entry_set_text(GTK_ENTRY(entry), buffer);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
(GtkSignalFunc)CentralReflection_entry_callback,
NULL);
gtk_widget_show(entry);
set_tooltip(tips,entry,"This specifies the radius of the circle, at which every pixel is mirrored. Pixels outside the circle will be reflected into its inner part and vice versa.");
gtk_widget_show(hbox);
gtk_widget_show(vbox);
gtk_widget_show(frame);
button = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)CentralReflection_ok_callback,
dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
set_tooltip(tips,button,"Close the dialog box and apply distortion.");
button = gtk_button_new_with_label("Cancel");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)gtk_widget_destroy,
GTK_OBJECT(dlg));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Close the dialog box without applying distortion.");
button = gtk_button_new_with_label("About...");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)CentralReflection_about_callback,button);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Show information about the author and the plug-in.");
gtk_widget_show(dlg);
gtk_main();
gtk_object_unref(GTK_OBJECT(tips));
gdk_flush();
return bint.run;
}
GtkWidget *
CentralReflection_logo_dialog()
{
GtkWidget *xdlg;
GtkWidget *xlabel;
GtkWidget *xbutton;
GtkWidget *xlogo_box;
GtkWidget *xpreview;
GtkWidget *xframe,*xframe2;
GtkWidget *xvbox;
GtkWidget *xhbox;
char *text;
guchar *temp,*temp2;
guchar *datapointer;
gint y,x;
xdlg = logodlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(xdlg), "About");
gtk_window_position(GTK_WINDOW(xdlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(xdlg), "destroy",
(GtkSignalFunc)CentralReflection_close_callback,
NULL);
xbutton = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(xbutton, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(xbutton), "clicked",
(GtkSignalFunc)CentralReflection_logo_ok_callback,
xdlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(xdlg)->action_area),
xbutton, TRUE, TRUE, 0);
gtk_widget_grab_default(xbutton);
gtk_widget_show(xbutton);
set_tooltip(tips,xbutton,"Close the information box.");
xframe = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(xframe), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(xframe), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(xdlg)->vbox), xframe, TRUE, TRUE, 0);
xvbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(xvbox), 10);
gtk_container_add(GTK_CONTAINER(xframe), xvbox);
/* The logo frame & drawing area */
xhbox = gtk_hbox_new (FALSE, 5);
gtk_box_pack_start (GTK_BOX (xvbox), xhbox, FALSE, TRUE, 0);
xlogo_box = gtk_vbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (xhbox), xlogo_box, FALSE, FALSE, 0);
xframe2 = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (xframe2), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (xlogo_box), xframe2, FALSE, FALSE, 0);
xpreview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (xpreview), logo_width, logo_height);
temp = g_malloc((logo_width+10)*3);
datapointer=header_data+logo_width*logo_height-1;
for (y = 0; y < logo_height; y++){
temp2=temp;
for (x = 0; x< logo_width; x++) {
HEADER_PIXEL(datapointer,temp2); temp2+=3;}
gtk_preview_draw_row (GTK_PREVIEW (xpreview),
temp,
0, y, logo_width);
}
g_free(temp);
gtk_container_add (GTK_CONTAINER (xframe2), xpreview);
gtk_widget_show (xpreview);
gtk_widget_show (xframe2);
gtk_widget_show (xlogo_box);
gtk_widget_show (xhbox);
xhbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(xvbox), xhbox, TRUE, TRUE, 0);
text = "\nCotting Software Productions\n"
"Bahnhofstrasse 31\n"
"CH-3066 Stettlen (Switzerland)\n\n"
"cotting@mygale.org\n"
"http://www.mygale.org/~cotting\n\n"
"Central-Reflection\n Plug-In for the GIMP\n"
"Version 1.04\n";
xlabel = gtk_label_new(text);
gtk_box_pack_start(GTK_BOX(xhbox), xlabel, TRUE, FALSE, 0);
gtk_widget_show(xlabel);
gtk_widget_show(xhbox);
gtk_widget_show(xvbox);
gtk_widget_show(xframe);
gtk_widget_show(xdlg);
gtk_main();
gdk_flush();
return xdlg;
}

View File

@ -1,73 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 1.04 the size of
the logo in the about box has been reduced
in order to make smaller binaries.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is avaiable
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,43 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = CentralReflection
CentralReflection_SOURCES = \
CentralReflection.c logo.h
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
CentralReflection_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,73 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 1.04 the size of
the logo in the about box has been reduced
in order to make smaller binaries.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is avaiable
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,75 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 1.01 the size of
the logo in the about box has been reduced
in order to make smaller binaries. In
general the compiled plug-in will be
about 25-30% of the size of version 1.00.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is avaiable
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
35 to 40 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,788 +0,0 @@
/* GIMP header image file format (Indexed): //logo.h */
static unsigned int logo_width = 200;
static unsigned int logo_height = 72;
/* Call this macro repeatedly. After each use, the pixel data can be extracted */
#define HEADER_PIXEL(data,pixel) \
pixel[0] = palette_data[data[0]*3+2]; \
pixel[1] = palette_data[data[0]*3+1]; \
pixel[2] = palette_data[data[0]*3+0]; \
data--;
static unsigned char
palette_data[] = { 4,2,2,4,110,178,32,4,122,4,36,
86,15,3,66,4,58,127,36,8,186,4,34,122,17,2,
34,4,19,66,12,4,162,90,2,69,88,2,48,7,20,
2,25,2,103,8,14,48,4,58,186,90,3,154,82,2,
129,55,2,34,17,2,18,17,34,191,94,2,101,57,2,
70,7,32,154,12,22,157,17,3,50,4,88,150,96,3,
186,86,2,138,87,2,86,212,214,210,4,19,98,52,2,
154,15,11,2,4,132,216,7,18,125,12,6,82,37,12,
18,4,88,189,86,14,48,128,2,157,32,4,138,4,60,
155,4,48,126,60,2,218,7,10,52,13,12,66,129,2,
50,56,2,52,52,14,98,4,47,157,6,20,87,48,2,
24,58,2,101,120,2,141,52,5,170,4,113,215,127,2,
73,4,90,210,4,52,112,36,18,194,59,2,85,42,2,
10,107,2,173,95,2,114,31,3,52,4,79,160,84,3,
189,14,10,40,30,2,69,96,2,58,113,2,126,9,37,
231,17,33,170,28,14,2,4,30,146,68,10,37,132,2,
82,23,4,7,4,10,122,4,36,108,32,2,37,7,27,
2,4,98,175,84,10,146,4,101,191,4,14,146,8,29,
86,4,2,170,8,60,230,84,10,162,72,2,39,102,2,
142,4,142,221,4,49,143,68,12,170,4,124,213,15,4,
74,114,2,69,112,2,158,32,3,23,8,50,190,111,2,
104,6,40,154,96,2,210,6,28,104,60,2,138,61,2,
25,68,2,114,58,2,125,39,2,114,73,2,69,16,4,
58,4,88,177,56,14,26,138,2,173,4,68,176,71,2,
55,76,2,210,4,78,130,17,3,42,6,27,69,112,2,
49,12,26,178,47,13,159,18,11,10,13,11,74,141,2,
58,52,18,234,4,82,186,4,126,198,4,103,213,4,62,
206,4,72,226,12,46,210,72,12,222,12,26,146,20,34,
210,4,113,197,4,131,229,4,48,170,4,76,170,7,43,
95,52,30,218,15,11,170,52,14,202,12,14,86,4,40,
174,108,14,202,156,2,186,60,12,130,5,40,129,73,13,
189,12,42,138,44,14,202,4,59,143,4,124,229,4,69,
191,4,69,157,4,60,114,4,43,110,14,14,58,20,26,
157,28,26,210,4,87,162,4,91,202,4,110,226,4,98,
226,4,101,202,17,14,186,28,18,18,60,2,234,28,10,
114,4,30,114,8,10,162,12,54,186,20,26,130,100,10,
170,40,18,154,4,22,114,28,26,234,4,22,58,4,66,
226,4,54,202,12,42,202,4,38,98,4,145,234,4,76,
146,4,94,148,4,138,213,4,94,186,4,54,126,4,54,
154,4,118,211,4,106,178,4,106,188,4,54,142,4,94,
170,4,70,202,4,118,197,4,54,173,4,82,178,72,4,
172,36,10,138,76,14,162,4,98,210,4,118,226,112,2,
114,24,19,8,30,2,85,84,6,226,141,2,73,28,30,
10,28,46,186,112,4,206,36,10,90,36,2,174,108,2,
58,41,3,130,44,10,194,9,33,130,92,2,162,51,2,
42,12,32,162,81,3,146,44,11,26,28,6,146,44,2,
178,30,12,10,60,10,178,64,2,146,28,10,178,92,10,
210,5,41,146,40,2,102,96,2,125,100,2,88,74,2,
157,142,2,159,26,10,55,143,2,50,73,2,102,134,2,
142,73,2,84,127,2,126,142,2,82,156,2,178,28,10,
158,28,26,114,84,14,202,12,4,10,5,20,74,17,2,
26,92,2,194,7,19,106};
static unsigned char header_data[] = { 71,99,218,218,99,11,71,218,71,71,
218,99,99,99,71,99,218,99,99,99,99,218,71,218,99,218,218,99,99,218,
218,99,99,218,99,218,99,58,218,99,99,99,58,218,99,99,99,58,99,58,
99,58,11,58,99,58,58,11,99,58,99,58,99,99,99,218,99,218,99,58,
99,71,99,218,71,12,12,12,12,12,12,12,12,12,92,19,19,19,92,92,
92,92,19,108,19,19,19,19,19,19,53,53,53,53,101,19,19,53,53,19,
19,19,12,92,92,12,12,12,71,71,218,99,218,218,71,71,12,12,218,99,
58,58,58,99,99,99,58,99,99,99,11,58,11,58,58,99,58,99,99,99,
58,99,99,99,99,58,99,99,99,99,99,218,99,99,11,99,99,99,11,99,
99,218,218,218,99,218,99,99,218,218,99,99,218,99,218,218,99,99,218,11,
218,71,99,218,99,218,218,99,71,8,218,99,218,218,99,99,99,99,99,99,
218,218,99,99,218,99,218,99,218,71,99,99,99,218,99,99,218,99,99,99,
218,218,99,99,99,99,58,99,58,30,99,99,99,99,99,99,58,99,99,58,
99,58,99,58,99,99,58,58,58,99,58,58,99,218,218,71,99,99,71,71,
71,123,12,118,71,71,12,71,123,12,12,19,19,19,53,19,19,53,53,19,
19,53,101,63,20,63,20,63,53,53,53,101,53,53,53,19,53,53,53,19,
92,12,12,12,71,12,12,12,12,12,92,71,218,218,71,218,71,71,71,71,
99,218,58,58,58,99,99,99,99,58,58,58,99,58,99,58,58,99,58,58,
99,99,58,99,99,99,99,58,99,58,30,99,99,99,218,99,58,99,99,58,
11,99,99,218,99,218,218,99,99,218,71,99,218,99,99,218,99,99,218,99,
11,218,99,218,99,11,218,99,99,8,71,71,71,99,218,71,218,99,71,218,
11,99,218,218,99,218,99,218,99,99,99,99,218,99,99,99,99,99,218,99,
99,99,99,99,99,11,99,99,99,99,99,99,58,99,58,99,58,99,58,58,
99,11,58,58,99,58,99,99,58,58,218,99,123,71,71,71,123,71,71,218,
99,99,218,71,12,12,12,12,92,19,19,53,19,53,53,53,53,19,53,53,
53,53,19,53,19,53,53,53,53,53,63,63,101,63,63,20,53,19,53,53,
53,19,92,92,12,12,12,71,71,71,71,12,12,71,71,12,12,12,12,12,
12,218,218,99,58,58,99,58,99,58,99,58,99,99,58,218,58,99,58,99,
99,99,99,11,58,99,99,58,99,99,58,58,99,99,99,99,99,99,99,99,
99,58,218,99,218,99,99,99,218,99,99,218,99,11,218,99,218,218,99,99,
218,99,218,11,99,71,99,218,71,8,99,99,218,99,99,99,218,99,99,218,
218,99,11,99,99,218,99,218,99,218,218,99,58,99,99,99,58,11,99,99,
58,99,99,58,58,58,58,99,99,99,99,218,58,99,99,99,58,58,99,99,
58,58,99,58,99,58,99,99,58,58,99,218,71,71,218,218,218,58,58,58,
218,99,71,123,12,12,12,19,19,108,108,108,92,92,92,12,71,12,12,92,
19,53,53,53,101,53,53,19,53,101,53,20,53,79,79,0,34,79,20,63,
53,53,53,19,19,19,12,12,12,71,71,71,71,71,71,123,71,12,12,12,
12,12,71,71,218,58,99,58,218,58,218,99,58,99,58,99,99,218,58,58,
58,99,58,58,99,99,58,99,58,99,99,218,58,58,99,99,99,99,99,99,
58,11,99,99,218,218,218,99,218,99,99,218,218,99,218,99,99,218,218,99,
218,99,71,218,99,218,99,99,99,8,218,218,99,218,99,218,99,218,218,99,
11,218,218,218,218,99,71,99,218,99,99,99,218,58,99,99,99,99,218,30,
58,99,58,99,58,11,58,99,58,99,58,58,58,99,58,58,99,99,58,58,
58,99,58,99,58,58,99,58,218,99,99,218,58,99,58,58,58,58,58,218,
71,12,12,71,71,12,12,12,12,71,71,118,71,71,118,71,71,12,223,19,
19,53,53,53,53,63,229,20,79,20,34,0,20,101,101,63,20,101,101,53,
108,53,53,53,53,53,101,19,92,12,12,12,12,71,71,218,218,218,71,71,
118,12,71,71,218,218,58,58,58,58,58,58,218,58,58,58,99,99,218,99,
58,58,99,99,58,99,58,99,58,58,58,99,99,99,58,99,99,99,58,58,
99,58,58,99,99,99,99,99,99,99,218,99,99,218,99,218,218,99,99,218,
99,58,99,99,218,99,218,218,218,8,99,218,99,218,99,218,11,99,218,99,
99,99,99,99,218,99,58,99,99,99,58,99,218,99,99,99,99,99,58,99,
58,218,99,99,99,58,218,58,58,58,99,99,58,99,218,58,99,99,58,218,
58,99,58,99,99,99,58,99,58,58,58,58,99,58,58,58,58,218,218,12,
71,71,71,12,12,71,71,12,71,12,71,71,71,71,12,92,19,53,53,53,
101,63,79,34,251,0,0,63,20,53,19,53,53,53,53,19,19,53,19,19,
19,108,19,19,19,19,19,19,53,53,108,12,12,12,71,71,218,58,58,58,
99,218,71,71,71,12,218,99,99,58,58,58,58,218,58,58,58,58,58,99,
99,58,58,99,58,218,58,99,99,99,99,58,99,128,99,58,99,99,11,99,
99,58,11,58,99,99,99,218,58,11,99,58,99,218,99,99,218,99,99,99,
218,71,99,99,218,99,11,99,218,8,218,99,218,99,218,99,99,218,99,218,
58,218,58,218,99,99,218,99,58,99,99,99,99,78,11,58,99,58,99,99,
99,58,58,99,58,11,58,58,218,99,99,58,58,58,99,58,58,58,99,99,
58,58,58,58,58,58,99,58,99,99,99,58,58,58,58,58,218,71,118,12,
71,71,71,71,71,12,71,71,71,71,71,12,92,19,19,53,53,63,20,251,
0,79,79,0,79,34,34,79,0,63,229,20,63,101,53,101,19,53,19,92,
12,71,12,92,12,12,12,12,12,92,19,92,92,71,12,118,71,218,99,58,
58,58,58,58,218,123,71,218,58,58,58,99,58,58,58,218,58,218,58,58,
218,58,99,58,58,58,99,99,58,99,58,99,218,99,99,99,58,58,58,11,
58,58,99,58,99,99,30,99,99,99,58,218,218,30,99,218,99,99,99,218,
99,99,218,218,99,99,218,71,99,8,99,99,71,99,218,218,99,218,99,218,
99,218,99,58,11,58,99,99,11,58,99,58,99,99,99,99,58,58,99,99,
58,99,99,99,99,58,99,78,58,58,99,99,218,78,58,218,58,99,212,58,
99,58,58,58,218,58,58,58,58,58,58,58,58,58,218,71,12,12,71,71,
123,218,218,58,99,71,123,71,71,12,19,19,19,53,53,19,19,53,63,53,
101,101,101,63,101,101,20,20,79,0,0,79,79,34,251,79,79,251,101,53,
19,92,12,71,71,71,218,12,218,12,71,71,71,71,71,12,71,71,123,71,
58,58,58,58,58,58,58,99,99,58,58,58,99,58,58,58,99,58,99,58,
99,58,58,99,58,58,58,58,99,58,99,58,99,58,99,58,99,99,58,58,
99,99,99,58,99,58,58,58,99,99,99,30,128,58,99,99,99,99,99,58,
218,99,99,218,218,99,99,218,71,8,71,218,99,99,99,99,218,99,99,99,
99,30,58,11,58,58,99,58,58,58,58,30,58,58,99,99,99,58,99,58,
99,58,99,58,58,58,218,99,58,99,58,58,58,218,99,58,58,58,58,58,
58,99,99,99,58,99,99,58,58,212,99,58,58,218,71,71,218,218,99,58,
58,58,58,218,123,71,71,12,108,19,19,108,19,19,223,92,19,92,12,12,
19,19,19,19,53,53,63,63,229,0,34,34,79,0,79,0,75,34,0,34,
79,20,53,19,92,12,71,71,71,218,71,123,71,123,71,71,71,71,71,71,
71,218,58,58,58,58,58,58,58,99,58,58,58,58,58,58,58,58,99,58,
58,99,99,58,99,58,58,58,58,58,58,99,58,99,58,99,58,58,99,99,
58,58,99,99,58,58,218,58,58,99,58,99,11,58,58,99,58,218,99,99,
99,99,218,99,99,218,99,99,99,8,99,218,99,218,99,99,99,99,58,58,
11,58,99,58,58,30,58,11,58,11,58,99,99,58,99,58,58,58,99,58,
58,99,58,99,99,58,58,99,58,99,58,99,58,99,212,58,58,58,58,58,
58,58,58,58,58,58,58,58,58,58,212,58,218,218,218,99,58,58,58,58,
58,99,71,71,71,12,71,71,12,12,12,71,71,123,71,218,71,71,71,92,
19,108,63,79,229,126,0,79,0,0,34,34,34,126,34,251,79,0,126,34,
79,0,79,20,63,19,19,12,71,71,71,218,71,99,71,71,71,71,71,71,
71,71,218,58,58,58,212,58,58,58,58,58,58,58,58,58,58,58,58,58,
58,58,99,58,58,99,58,58,99,99,128,218,58,58,99,58,99,58,58,99,
218,58,58,218,99,99,99,99,99,99,58,99,99,58,30,218,99,99,99,99,
99,99,218,99,99,99,218,218,99,8,218,99,99,99,58,99,99,99,99,99,
58,58,218,99,99,99,58,99,58,58,58,99,58,99,58,99,99,99,58,58,
99,99,58,58,58,58,58,58,99,99,58,99,99,58,58,58,58,99,58,58,
99,58,99,58,78,212,99,212,99,58,58,99,58,58,78,78,246,99,212,58,
99,71,123,71,71,71,71,71,218,218,71,123,218,218,218,118,12,19,63,63,
0,0,0,34,34,0,34,79,79,79,0,34,79,79,20,101,53,101,53,19,
53,53,101,101,53,53,19,19,19,92,218,218,218,218,218,212,78,58,218,218,
71,71,71,11,58,246,58,78,246,58,58,58,99,99,58,58,99,58,212,58,
99,58,99,58,58,99,58,58,58,58,58,212,218,58,58,99,58,58,99,58,
99,99,99,58,58,99,99,99,58,99,58,58,99,99,99,58,58,99,99,99,
99,99,99,11,58,99,99,99,218,8,99,99,218,99,99,218,99,218,58,58,
11,78,58,99,58,99,58,99,58,11,58,99,58,99,58,58,58,99,99,58,
99,99,99,58,58,58,58,58,58,58,58,58,58,58,58,212,99,58,212,99,
58,58,78,58,78,58,58,58,58,58,58,58,58,58,246,58,246,58,58,71,
218,71,71,71,218,71,71,71,71,218,218,71,71,92,92,53,63,126,79,0,
0,79,0,79,34,79,0,126,79,79,79,79,79,229,229,101,53,108,92,71,
71,71,71,71,71,12,12,19,108,19,92,71,71,71,71,218,212,246,78,58,
58,218,218,71,71,58,58,212,212,78,212,78,78,58,58,58,58,58,99,58,
78,58,58,99,58,58,58,58,58,58,58,58,99,58,99,58,58,212,99,58,
58,99,58,99,58,99,99,58,58,99,99,58,58,58,58,11,78,99,99,99,
99,58,99,58,71,99,99,99,99,8,99,99,99,218,99,58,99,30,58,11,
58,11,58,58,99,58,58,99,58,99,58,99,99,58,99,58,99,58,58,99,
58,58,58,58,58,78,58,99,58,99,58,58,58,58,99,58,212,99,58,58,
58,78,78,78,58,58,58,58,58,212,58,78,58,78,78,78,58,99,218,218,
71,218,218,71,58,99,58,99,71,71,71,12,19,20,79,251,0,251,79,251,
79,63,126,79,79,79,79,229,79,79,79,126,126,79,79,63,20,53,53,92,
12,12,218,71,71,218,218,218,71,218,71,71,71,218,71,218,218,58,246,246,
78,212,78,58,218,218,58,58,58,246,78,212,78,212,58,58,58,58,58,212,
78,78,78,58,58,99,58,58,58,58,58,58,58,58,58,218,99,99,58,99,
58,58,218,99,58,58,99,58,99,99,58,99,99,99,58,99,99,58,58,58,
218,99,11,58,99,99,99,218,99,8,99,30,218,58,11,99,99,58,99,58,
99,58,58,99,218,99,218,58,99,99,58,58,58,58,99,58,99,99,58,99,
58,58,58,78,78,58,58,58,58,58,99,246,78,78,58,58,58,58,58,78,
78,212,78,246,246,58,58,58,212,58,212,246,78,246,58,212,218,218,218,218,
218,58,246,58,246,58,218,218,123,12,19,19,53,53,101,53,63,101,63,63,
63,63,63,63,63,101,63,53,63,53,53,53,53,108,19,19,19,19,108,19,
92,92,12,12,71,71,218,99,99,218,218,218,218,218,71,71,71,218,218,246,
78,78,246,78,78,78,58,58,58,78,78,78,78,246,58,58,58,58,58,78,
212,78,78,58,58,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,
58,99,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,99,99,99,
58,99,58,99,99,58,99,99,99,8,99,99,30,58,58,58,58,58,58,99,
58,11,99,58,99,58,58,58,58,58,58,99,58,58,58,58,58,58,99,58,
99,58,78,58,58,58,99,58,58,78,246,78,58,78,58,58,58,58,78,212,
246,78,246,78,78,99,212,246,78,246,58,246,246,78,246,218,218,218,58,58,
246,78,78,246,58,218,218,71,12,12,108,92,108,19,108,53,63,63,63,53,
53,53,19,223,92,92,49,118,118,118,118,118,118,118,71,118,118,12,12,12,
92,71,71,123,218,99,11,58,58,58,58,78,58,99,99,123,71,218,218,218,
246,246,78,212,78,212,78,246,78,78,58,78,246,78,246,78,58,58,58,58,
99,78,246,78,246,99,58,58,58,58,58,78,78,78,78,99,58,99,58,99,
78,58,58,99,58,218,218,58,58,99,58,58,58,218,99,58,58,58,58,11,
58,99,99,99,58,99,99,218,58,8,99,99,58,99,58,11,58,11,58,58,
99,58,99,58,99,58,99,58,58,218,58,58,58,99,58,99,58,58,58,99,
78,58,58,58,99,58,58,78,78,58,246,78,246,99,58,58,58,212,78,78,
246,58,246,58,78,78,78,58,246,78,78,58,246,58,58,58,212,58,246,78,
212,246,58,58,71,71,71,71,12,92,92,92,108,53,53,53,19,19,223,223,
49,223,92,49,49,223,92,49,118,118,118,71,118,112,118,11,11,112,71,112,
71,71,11,11,11,99,99,58,58,78,78,78,246,78,246,58,99,71,218,71,
218,78,78,246,78,246,58,246,78,246,212,58,246,58,246,78,212,78,246,58,
58,58,78,246,246,78,78,99,58,58,58,212,78,58,78,58,58,58,58,58,
78,58,78,99,58,58,99,58,58,58,58,99,58,58,99,218,58,99,58,58,
58,58,99,58,99,99,58,99,99,8,99,99,58,58,58,99,58,99,99,58,
99,58,58,58,58,58,58,218,99,58,99,58,58,58,58,58,99,58,58,78,
58,78,78,78,78,58,78,58,78,78,78,212,78,58,78,58,78,212,78,246,
78,246,78,78,212,246,246,78,246,212,246,246,78,246,58,246,78,246,58,246,
246,58,99,218,218,218,71,12,92,19,19,19,19,19,223,223,49,223,49,118,
49,112,30,30,237,103,208,208,245,208,245,208,245,245,245,103,208,103,22,237,
30,30,11,11,11,11,71,71,11,99,58,78,78,246,58,246,246,246,58,99,
99,218,212,78,246,78,246,78,246,58,78,58,246,78,58,246,78,212,78,246,
58,212,58,78,78,212,78,78,58,58,99,78,78,78,78,78,58,58,99,58,
58,78,78,78,58,58,99,58,99,58,58,99,58,218,58,58,99,58,58,218,
99,58,99,99,58,99,30,99,99,8,58,99,58,99,58,58,58,99,58,99,
58,218,218,58,99,58,99,58,58,58,78,99,78,58,99,58,58,78,58,78,
78,58,78,78,58,78,78,246,246,212,78,78,78,58,78,246,78,246,58,246,
212,78,58,78,78,58,246,78,78,78,58,246,78,246,78,58,246,78,78,78,
58,218,99,11,71,12,92,92,92,223,223,223,223,223,49,118,112,22,237,208,
72,245,55,243,245,72,72,72,65,208,236,208,208,245,72,55,243,55,55,243,
245,245,245,103,237,237,30,11,11,112,71,11,99,58,78,246,246,246,246,78,
58,218,58,58,246,78,212,78,246,78,246,78,212,78,78,212,78,246,78,78,
58,78,78,78,78,78,246,246,246,58,58,78,58,246,78,212,78,78,99,58,
58,78,58,58,58,58,58,99,58,58,58,58,78,58,58,99,99,58,58,58,
99,218,58,99,99,99,58,99,58,8,99,99,99,58,11,58,58,58,99,58,
58,58,58,58,58,58,58,99,99,78,78,58,58,78,58,58,99,78,78,78,
78,78,78,78,78,78,212,246,246,246,246,78,78,246,246,58,246,78,246,78,
78,78,212,246,246,246,78,78,212,246,246,246,58,246,246,78,246,246,78,58,
218,99,71,12,12,92,92,82,223,49,223,118,112,22,208,72,72,208,65,22,
22,112,11,112,112,112,112,112,118,118,118,112,112,112,30,244,244,30,237,65,
236,72,55,55,243,243,208,208,237,237,11,71,11,11,71,11,99,58,246,246,
246,78,78,246,58,246,78,246,58,246,58,246,58,246,246,78,78,78,212,78,
212,246,212,78,246,246,58,78,78,246,99,246,246,58,246,58,78,78,78,58,
78,78,78,78,78,78,58,58,58,99,58,58,78,99,58,58,58,218,99,99,
58,58,99,58,99,58,58,99,99,8,58,58,99,58,99,218,99,58,99,99,
99,58,99,58,99,58,58,58,58,78,58,58,58,58,58,58,58,78,212,78,
78,58,246,78,58,246,246,246,246,246,246,246,78,58,246,78,246,58,246,58,
246,78,78,78,58,246,212,78,78,78,58,246,78,212,246,58,78,212,58,99,
218,71,12,92,19,223,49,49,118,62,30,22,208,208,103,30,244,112,244,118,
112,23,49,49,49,49,49,49,49,49,82,82,223,82,49,118,23,118,118,112,
11,30,237,22,65,245,55,243,245,245,103,237,237,11,71,11,71,71,218,58,
246,246,78,246,78,212,78,246,246,78,246,246,78,78,212,78,212,78,246,78,
78,58,246,78,58,246,78,212,78,246,78,78,78,78,78,212,246,246,246,78,
58,78,78,78,58,78,78,58,58,58,58,58,99,58,58,58,58,58,99,58,
58,58,58,58,58,99,99,58,58,8,99,99,58,58,58,99,99,99,99,58,
58,99,78,58,78,99,58,58,99,78,78,78,58,78,58,58,78,246,78,212,
78,78,58,78,246,246,246,246,246,246,58,78,78,246,58,246,78,246,78,246,
78,212,78,212,212,246,78,78,246,246,78,212,58,99,212,246,246,58,99,218,
118,12,92,223,223,49,49,11,237,208,208,103,244,23,118,112,118,112,49,49,
19,82,82,82,223,49,66,49,49,82,223,223,101,19,223,82,223,82,223,82,
82,49,23,112,11,244,30,65,72,55,55,245,208,22,237,112,11,118,71,218,
218,58,58,78,246,78,212,78,78,212,99,78,212,246,78,246,78,246,78,212,
246,246,78,246,246,78,246,78,246,58,246,78,58,78,246,246,246,246,212,246,
78,78,78,78,78,58,78,78,99,58,78,78,78,99,58,58,99,58,99,99,
58,99,99,99,99,58,99,58,99,8,99,99,99,58,58,99,58,58,99,58,
58,58,78,78,58,58,58,58,58,58,78,78,78,78,78,58,246,246,246,246,
246,78,78,212,246,246,246,246,246,246,78,212,78,246,78,212,78,246,58,246,
78,246,78,58,58,212,246,58,78,246,246,58,58,58,58,246,58,218,71,12,
223,223,49,49,49,30,65,72,72,30,112,118,118,112,118,49,223,223,223,49,
244,244,244,244,23,23,23,23,70,66,49,70,49,70,70,118,23,23,23,23,
49,223,19,82,223,223,23,11,244,237,208,72,55,55,208,103,30,11,11,49,
71,71,99,58,246,78,246,246,58,246,58,58,246,212,78,246,58,246,78,58,
58,212,78,78,212,78,212,78,78,78,212,78,78,78,246,212,246,246,246,212,
246,58,78,78,78,78,58,78,78,99,58,58,78,58,58,58,99,58,58,58,
58,58,58,58,99,58,99,58,99,8,99,58,58,218,58,58,58,99,58,58,
58,99,58,58,99,58,78,78,78,78,78,78,78,58,246,246,246,212,246,246,
212,246,78,246,246,246,246,246,212,246,246,78,246,58,212,246,78,78,78,246,
58,246,212,99,58,246,78,246,246,58,58,58,58,78,246,58,99,118,12,92,
223,223,223,11,22,72,208,244,49,112,112,118,49,82,223,49,244,244,242,62,
23,62,23,23,244,244,244,244,244,244,62,30,244,244,244,244,23,112,210,23,
62,244,244,23,223,82,53,82,49,112,30,30,65,72,55,245,208,237,30,112,
71,49,118,71,99,78,78,78,246,246,58,99,58,246,212,78,246,58,246,212,
99,58,212,246,78,246,78,246,212,246,78,246,246,212,246,246,246,212,246,246,
246,246,78,78,246,246,78,78,78,78,58,58,78,58,58,58,58,58,99,99,
99,78,99,58,99,99,58,99,58,8,58,99,58,99,99,58,58,99,58,58,
58,58,58,58,78,58,78,78,58,78,58,246,78,78,78,212,246,246,212,246,
246,246,246,246,246,246,246,246,246,246,246,58,246,58,99,212,246,212,78,78,
78,99,58,58,78,246,58,78,246,58,58,58,58,212,58,218,71,12,49,49,
49,112,22,72,65,112,49,112,112,112,223,19,118,62,244,62,62,23,23,244,
244,244,244,112,23,49,49,223,19,223,82,223,223,49,223,23,118,112,244,30,
62,62,62,62,23,62,23,223,82,8,82,71,30,244,22,72,55,245,103,237,
11,71,12,12,71,99,78,78,78,58,212,58,58,58,58,212,78,58,246,78,
58,58,58,212,78,246,58,78,78,212,212,246,246,246,212,246,246,246,246,246,
246,246,58,78,78,58,246,212,78,78,58,78,58,78,78,78,58,78,58,58,
218,58,58,99,58,99,99,99,58,8,218,99,58,58,58,99,58,58,99,78,
78,58,99,58,58,78,58,78,246,78,78,58,78,212,246,246,246,246,246,246,
246,246,246,212,246,212,246,246,246,212,78,246,58,58,58,246,78,78,212,246,
58,58,58,58,212,78,246,212,58,58,58,58,58,58,71,12,49,223,223,49,
30,208,72,30,49,49,112,49,223,223,23,22,244,62,23,23,62,22,112,118,
49,49,223,118,23,244,30,242,22,242,242,62,242,244,244,112,23,49,49,223,
23,112,30,244,62,112,210,23,23,49,82,8,223,244,237,30,208,55,243,245,
22,30,71,118,12,71,99,78,78,246,212,58,58,58,58,246,246,246,78,246,
58,58,58,78,212,78,246,246,246,58,58,212,246,246,246,246,246,246,246,246,
246,78,246,58,246,246,246,78,212,78,78,78,58,78,58,78,58,58,99,58,
58,58,99,58,58,58,58,58,58,8,58,99,58,58,58,58,99,58,78,78,
58,58,78,58,58,78,78,58,78,78,78,78,78,246,212,246,246,246,246,246,
246,246,246,246,246,246,212,246,246,246,78,58,58,58,58,246,78,78,246,99,
212,58,212,58,212,78,78,58,58,218,58,212,58,99,71,49,223,49,49,30,
55,72,112,49,244,11,49,82,112,242,242,62,23,62,244,112,118,223,82,118,
30,236,29,225,231,33,248,42,42,42,219,2,42,219,110,107,231,29,65,244,
112,223,223,49,112,30,30,23,23,23,23,49,82,101,49,30,30,242,72,243,
208,103,30,71,118,12,71,99,78,78,78,58,58,58,58,58,78,58,246,78,
58,58,99,58,246,58,246,58,246,58,99,58,212,246,246,212,246,246,246,246,
246,246,246,246,212,246,246,246,246,78,58,78,78,78,78,78,58,78,78,78,
58,78,99,99,99,58,58,99,99,8,99,58,99,99,58,58,58,58,78,78,
78,78,58,58,58,78,78,78,78,78,246,246,58,246,246,246,246,246,246,246,
246,246,212,246,99,58,246,246,246,246,212,58,58,58,99,212,78,212,212,58,
78,58,58,58,246,246,78,58,71,218,58,58,11,71,118,223,49,23,103,243,
22,49,118,30,118,82,49,30,242,62,70,62,244,118,223,82,112,65,93,205,
217,42,80,147,98,4,26,8,8,8,8,121,8,8,26,4,98,210,111,219,
29,29,65,112,223,82,23,30,244,62,62,62,62,49,82,82,112,30,30,65,
243,245,103,30,71,118,12,71,218,212,246,58,58,212,212,58,58,246,212,78,
58,58,212,58,58,246,78,246,58,58,58,58,246,212,246,246,246,246,246,246,
246,212,246,246,246,246,212,246,246,212,78,246,212,78,58,78,78,78,58,78,
78,78,58,58,58,58,99,58,58,8,58,58,58,58,58,58,58,58,237,78,
58,78,78,58,78,78,212,78,246,78,78,246,246,246,246,246,246,246,246,246,
246,246,246,58,58,58,246,246,246,246,58,58,99,58,58,246,246,78,99,78,
246,78,58,58,58,58,58,218,12,99,58,99,71,92,49,223,118,22,41,65,
223,23,30,118,19,23,22,242,23,23,30,112,223,19,112,29,222,232,87,80,
98,26,121,8,20,253,20,20,20,20,101,20,20,20,253,253,20,8,121,26,
4,14,2,231,29,30,49,82,112,30,244,62,23,210,118,82,101,223,30,244,
65,55,243,103,237,71,118,71,71,99,58,58,58,58,218,58,58,58,246,212,
58,58,212,78,99,58,246,246,78,58,58,58,58,246,246,246,246,246,246,246,
246,246,246,212,246,246,246,246,246,246,246,78,78,78,78,78,58,78,58,78,
78,58,58,58,78,99,58,58,99,8,99,58,58,99,99,58,58,58,58,237,
78,78,58,78,78,246,78,246,78,246,78,246,246,246,246,246,246,246,246,246,
246,246,58,58,58,58,246,246,246,58,99,78,246,212,99,246,212,58,78,246,
58,246,58,58,58,212,218,12,118,58,58,71,12,49,19,49,237,41,65,49,
118,112,223,82,244,236,62,66,62,30,82,8,112,93,68,6,137,88,162,253,
253,20,253,19,223,23,244,244,54,242,54,242,244,62,112,49,223,20,20,20,
20,253,26,98,14,33,29,244,82,101,112,22,62,62,62,23,49,53,82,30,
112,22,243,243,208,11,71,118,12,218,99,58,58,58,12,71,58,58,58,58,
99,58,58,246,246,58,58,246,246,58,58,58,99,58,246,246,246,246,78,58,
246,212,246,246,246,246,246,212,246,246,78,78,78,78,58,78,78,78,78,58,
78,58,78,237,78,58,99,99,78,8,58,99,58,58,78,78,78,78,78,78,
58,78,78,58,78,246,78,212,246,246,246,246,246,246,246,246,246,103,246,246,
246,246,58,58,58,99,212,246,246,58,212,78,246,58,58,58,58,58,212,78,
78,78,58,58,58,58,123,49,218,99,11,118,223,223,82,237,41,208,23,118,
237,223,82,244,18,210,23,23,112,19,223,103,64,6,148,147,26,253,20,8,
66,23,54,111,219,219,137,24,76,24,163,25,137,42,204,42,151,109,244,223,
20,20,20,20,8,4,111,231,236,23,82,12,237,62,62,23,62,223,253,223,
237,244,22,41,245,103,11,112,118,71,218,58,58,99,92,92,128,58,58,58,
58,58,58,212,78,58,58,212,58,58,58,78,78,58,212,246,246,246,58,58,
212,246,212,246,246,246,246,246,246,212,246,78,246,246,78,78,78,78,78,58,
78,58,58,78,99,58,58,58,99,8,99,58,58,58,58,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,246,246,246,246,103,246,246,246,246,246,
246,78,58,58,58,58,58,212,58,58,78,212,78,78,99,58,58,212,78,246,
212,212,58,58,58,218,92,12,218,99,71,12,223,82,118,243,55,23,223,30,
223,19,244,93,54,49,23,112,82,82,245,153,138,234,162,8,253,101,49,30,
111,125,24,201,142,16,159,142,43,95,197,156,193,193,51,141,224,25,248,231,
65,118,20,20,20,20,121,210,231,55,244,82,49,30,244,62,62,244,223,20,
118,237,112,208,243,245,237,71,118,49,71,58,58,218,92,92,12,58,58,99,
58,58,212,78,212,212,58,58,58,58,58,212,78,58,58,246,246,246,99,58,
99,246,246,246,246,246,246,246,246,246,212,246,58,78,78,78,78,78,58,78,
78,58,78,78,58,78,58,99,58,8,99,99,58,58,58,78,78,58,78,58,
78,78,78,246,78,78,78,246,246,246,246,246,246,246,246,103,246,246,246,246,
246,58,58,58,58,58,58,58,58,58,78,78,246,78,58,58,58,212,78,58,
58,78,58,58,58,12,92,12,99,218,118,19,82,223,22,116,237,49,112,112,
101,112,93,109,70,112,118,82,223,55,136,185,44,26,253,253,82,62,107,163,
117,16,114,159,161,106,98,46,26,26,26,26,26,4,32,81,44,142,43,234,
10,56,236,23,20,20,20,8,4,219,225,237,19,82,11,244,62,54,62,223,
20,112,30,244,72,239,103,237,71,12,12,71,58,71,92,92,12,128,58,58,
58,58,246,78,246,58,58,58,99,58,58,246,78,78,58,246,246,58,58,58,
58,212,246,212,246,246,246,246,246,246,78,78,246,58,246,58,78,246,78,58,
78,58,78,78,58,58,58,58,58,8,58,58,58,58,78,237,58,78,78,78,
78,78,78,58,246,246,212,246,246,246,246,246,246,246,246,246,246,246,246,246,
78,58,58,58,58,58,99,58,58,246,246,246,58,246,58,58,58,78,246,218,
11,58,58,58,58,12,92,71,218,11,49,223,101,23,239,93,23,118,244,223,
223,65,29,70,70,112,82,82,72,233,135,152,121,253,20,49,242,179,176,39,
198,156,32,47,26,26,69,113,26,47,9,47,162,113,26,121,113,252,152,159,
43,234,217,238,30,253,20,251,8,4,107,17,30,82,223,22,62,62,54,244,
82,19,237,112,244,41,245,30,112,71,92,71,99,71,12,92,92,71,78,58,
58,246,246,58,78,212,58,58,58,58,58,78,246,58,99,58,212,58,58,58,
58,78,246,246,246,246,246,246,246,246,246,246,78,78,78,78,246,58,78,78,
58,58,58,99,58,99,58,58,58,8,58,99,99,58,58,78,78,58,78,58,
78,58,78,78,78,78,78,246,246,246,246,246,246,246,246,246,78,246,246,246,
58,58,78,58,78,58,58,99,58,78,58,246,246,58,58,58,212,58,58,12,
71,58,58,58,99,92,92,71,218,71,223,8,19,22,150,30,49,11,23,101,
30,93,54,49,112,49,20,30,254,181,95,26,253,253,49,65,163,166,206,202,
52,26,8,121,4,161,43,114,139,131,57,200,195,188,192,88,26,26,121,98,
197,67,234,145,230,22,82,20,20,8,98,107,100,112,253,112,103,244,54,62,
49,20,49,237,118,208,243,103,11,11,12,92,92,92,92,12,49,12,58,58,
78,58,246,78,246,78,212,99,58,58,78,246,58,78,58,58,58,99,58,58,
58,99,246,246,246,246,246,246,246,246,246,246,246,78,246,78,246,78,58,78,
78,58,78,78,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,78,78,78,78,246,246,246,246,246,246,246,246,246,246,246,58,212,58,246,
99,212,58,99,78,99,58,58,78,246,58,58,58,78,78,58,78,78,99,71,
12,71,58,58,12,12,12,71,11,12,223,101,49,243,100,118,223,112,82,19,
93,225,113,23,244,101,223,41,129,199,52,253,20,223,242,124,39,57,117,122,
121,121,47,44,195,35,94,196,165,189,189,189,27,84,200,139,67,186,26,121,
240,106,159,234,175,68,242,20,20,20,8,210,238,93,223,19,237,244,23,54,
62,19,101,244,112,30,243,208,237,11,12,92,49,223,12,12,92,12,58,78,
246,78,58,246,78,212,78,78,58,58,212,58,58,58,78,99,58,58,99,58,
58,58,246,246,246,246,246,246,246,246,246,246,78,246,58,78,58,78,78,78,
78,78,237,78,58,58,58,58,58,8,99,58,99,58,78,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,103,246,246,246,246,218,58,58,78,78,
58,99,71,12,58,78,58,78,58,78,123,12,78,78,58,212,78,78,123,92,
12,12,99,99,12,92,92,71,11,118,82,101,112,116,236,82,112,112,82,118,
100,110,66,23,49,101,244,215,73,43,69,253,101,23,219,59,97,202,52,8,
8,4,120,97,187,139,27,143,46,113,26,26,46,88,60,27,131,200,192,47,
82,66,81,159,234,170,68,118,20,251,20,26,2,64,244,101,118,22,23,62,
62,49,20,118,244,23,208,245,30,11,71,12,92,12,12,49,12,12,71,58,
246,246,78,246,78,246,58,78,58,78,212,218,12,246,78,99,58,78,78,11,
12,58,58,246,246,103,246,246,58,246,246,246,246,78,246,78,78,78,58,78,
78,58,58,58,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,212,78,246,246,78,99,58,246,246,246,246,246,246,71,12,99,58,58,99,
58,58,53,251,71,78,78,78,78,246,19,19,71,246,246,78,212,246,12,92,
12,12,12,12,92,12,12,71,218,118,19,101,244,239,65,223,244,11,53,112,
222,235,66,112,223,20,72,45,90,221,8,253,19,242,214,97,57,152,26,8,
26,188,57,187,139,186,8,8,8,8,121,121,8,8,26,4,44,131,94,67,
162,82,113,44,159,76,220,29,82,0,20,8,98,238,245,82,82,237,23,62,
54,112,20,223,237,49,22,245,237,11,71,49,12,92,12,12,12,12,71,78,
246,58,246,58,246,78,246,58,246,212,58,19,101,218,78,78,99,58,58,53,
101,71,58,246,246,246,78,71,92,58,246,246,212,246,78,58,58,78,78,58,
78,78,78,78,58,58,58,58,58,8,99,99,58,99,58,78,78,58,99,58,
78,78,58,246,78,58,71,92,218,246,246,246,103,246,12,92,92,58,58,58,
58,218,63,53,19,246,246,78,78,212,53,92,92,212,246,78,78,58,92,218,
12,12,92,92,92,12,12,71,11,118,101,101,22,116,242,223,237,11,8,30,
17,62,70,112,8,53,72,172,134,143,8,20,223,109,102,57,97,81,121,82,
252,114,35,157,165,26,253,8,8,46,182,4,26,26,8,8,113,160,190,35,
186,66,121,106,117,152,232,68,49,79,20,8,26,42,17,223,53,22,112,244,
54,244,8,82,30,118,30,245,30,11,99,12,12,92,123,12,12,12,71,78,
246,78,246,78,58,246,246,58,246,58,12,53,53,12,78,78,78,99,12,63,
63,92,78,78,246,246,78,229,229,12,246,246,246,212,78,71,71,58,78,78,
58,78,78,58,58,58,212,58,58,8,99,58,58,58,58,78,78,58,99,218,
99,58,246,78,78,58,12,92,12,78,246,246,246,218,92,92,19,71,58,58,
58,12,38,92,53,71,246,58,246,218,108,92,92,218,246,212,78,58,12,218,
12,12,12,92,12,92,12,71,71,118,82,8,103,116,242,82,244,11,82,30,
222,210,223,23,8,101,55,172,183,186,8,253,223,110,102,157,97,161,8,8,
127,67,190,140,189,26,8,8,69,127,120,5,52,26,26,8,121,9,84,187,
43,113,82,98,142,152,89,119,244,20,0,253,121,219,64,23,101,30,30,23,
54,244,82,101,30,112,112,72,237,71,30,12,12,92,118,12,12,12,71,58,
246,246,58,246,58,212,78,246,58,246,108,63,53,19,78,78,78,58,53,101,
53,108,78,246,246,246,108,79,20,53,246,246,246,78,99,92,92,12,99,78,
78,58,58,218,218,218,99,58,58,8,99,99,58,58,58,99,99,218,71,11,
99,99,78,246,212,71,218,71,92,71,246,246,246,71,92,92,19,19,58,58,
58,92,53,92,92,108,58,246,246,71,92,92,92,92,212,246,246,58,123,48,
12,12,12,92,92,12,12,12,99,118,19,101,237,116,65,49,30,112,82,244,
222,235,26,118,82,101,65,136,183,7,8,8,82,242,21,157,57,192,69,8,
26,7,191,157,190,60,9,8,26,52,84,131,60,4,121,8,26,113,67,94,
142,113,82,98,43,152,10,119,244,251,0,253,121,111,64,23,101,244,22,49,
62,62,82,101,112,23,112,103,30,71,11,12,12,118,12,12,118,12,71,78,
78,246,78,58,218,58,78,246,246,12,53,101,53,19,58,78,58,12,63,63,
53,63,218,246,246,71,79,20,63,101,218,246,246,218,12,19,108,12,99,58,
99,71,218,71,71,218,71,218,71,8,99,58,99,99,58,58,11,218,71,218,
71,71,218,58,58,99,218,99,71,92,218,78,246,92,92,12,223,53,71,58,
58,19,19,92,92,19,12,78,78,12,92,92,92,92,71,78,78,218,123,241,
48,12,12,92,49,12,118,12,71,49,223,101,11,116,65,66,112,11,82,112,
100,54,66,66,223,20,244,105,90,159,8,8,8,244,10,167,187,202,98,8,
121,47,192,169,190,35,195,188,188,195,57,84,106,47,8,8,8,122,195,140,
95,66,82,98,142,221,175,119,244,251,251,20,8,219,64,112,101,30,242,118,
23,62,19,20,11,118,112,22,11,11,99,12,12,12,12,71,12,118,71,58,
246,58,246,99,12,99,212,78,58,19,53,53,101,53,58,78,218,53,101,53,
53,63,218,246,246,63,0,101,19,53,12,78,58,12,108,92,19,108,92,71,
71,12,71,71,123,71,71,123,71,8,99,99,58,58,58,11,58,11,99,218,
99,11,99,99,218,99,218,99,71,12,12,99,99,92,92,92,12,19,53,71,
99,38,53,12,12,92,19,218,212,92,92,92,48,12,108,128,246,218,123,48,
128,123,12,12,12,12,12,118,71,71,223,8,112,41,55,49,49,244,223,49,
93,231,70,82,223,20,82,116,181,158,252,8,20,223,242,214,57,157,156,46,
8,66,26,147,44,198,86,196,86,198,44,52,4,8,8,8,46,60,97,194,
52,82,82,180,159,177,232,64,66,79,20,8,26,231,100,49,8,237,62,23,
62,244,82,82,30,223,11,237,112,11,11,12,12,71,12,12,118,12,71,218,
246,78,58,218,92,99,246,212,92,53,79,79,53,53,218,58,19,63,38,126,
53,101,92,58,19,251,63,223,19,19,92,71,12,223,92,223,223,92,19,92,
12,71,123,71,71,71,71,71,71,8,11,58,11,58,99,58,99,58,99,58,
58,218,218,218,99,218,11,99,99,71,92,92,12,49,92,71,99,12,53,53,
92,20,53,123,48,12,92,19,218,19,92,12,241,48,92,92,58,218,92,241,
128,212,71,12,118,12,12,71,71,112,223,19,82,55,116,112,49,244,223,19,
208,238,235,66,223,253,82,22,250,73,95,113,8,82,49,111,102,207,132,188,
252,69,8,121,162,4,47,52,127,4,4,26,26,8,8,46,186,86,169,95,
66,8,4,95,192,87,45,236,101,251,253,8,70,222,236,223,223,237,244,23,
54,244,82,82,237,118,11,244,71,11,99,71,118,12,12,12,12,12,12,58,
78,78,246,123,108,12,212,12,53,63,13,83,63,53,12,92,53,226,13,13,
53,53,53,226,75,63,12,71,92,19,19,92,92,92,19,12,12,12,92,12,
71,71,71,71,71,12,71,71,71,8,99,99,58,99,99,58,58,99,58,58,
11,218,71,71,11,218,99,99,58,218,12,19,92,92,92,99,78,58,92,101,
75,251,53,12,123,48,92,108,101,63,92,12,241,241,92,92,108,92,108,128,
212,246,58,12,12,12,49,12,12,118,12,49,19,237,116,22,49,118,244,82,
112,17,231,70,223,82,20,82,93,45,133,7,46,8,8,49,50,224,168,207,
142,60,127,46,8,26,8,8,8,8,8,8,121,26,47,192,166,169,7,113,
66,113,7,156,36,217,28,23,251,251,20,26,111,222,30,8,49,22,112,62,
242,112,101,112,30,49,244,11,112,11,99,71,12,12,118,12,12,12,71,246,
246,78,212,92,108,92,218,53,38,13,0,0,63,101,20,63,101,75,83,83,
63,101,229,79,126,92,58,78,12,19,92,92,19,92,12,71,71,118,71,71,
218,12,71,71,71,71,71,218,99,8,218,99,218,58,58,218,99,99,58,99,
58,58,99,99,218,99,218,99,58,58,99,92,92,92,19,58,78,78,99,108,
0,34,38,123,123,48,123,92,53,108,92,12,241,241,241,123,92,19,19,123,
241,212,246,99,12,71,12,71,12,71,118,223,82,118,245,100,112,49,30,118,
223,237,238,111,113,223,19,20,49,93,144,184,44,113,8,253,19,210,173,141,
168,57,196,142,60,52,122,182,113,113,122,3,60,159,130,86,43,122,26,223,
47,106,95,76,89,68,244,20,251,20,8,210,238,72,223,19,30,112,23,62,
244,223,20,118,112,112,244,118,11,99,99,218,71,218,71,12,12,71,58,58,
78,246,246,92,63,53,53,101,83,0,83,83,53,63,63,53,20,83,0,0,
53,53,79,0,226,78,58,78,12,108,92,19,92,71,58,58,99,71,71,123,
71,218,218,71,218,218,99,218,99,8,99,99,218,218,99,99,99,99,58,99,
99,58,99,11,71,99,99,58,58,58,58,71,92,92,19,78,78,58,78,218,
53,63,101,123,123,48,48,123,92,19,92,92,241,241,241,241,92,92,92,12,
241,212,78,78,123,118,12,12,12,12,112,92,49,223,30,247,65,49,23,112,
82,23,72,231,14,26,82,19,101,49,17,146,102,154,147,69,8,82,49,23,
249,104,158,39,206,169,86,130,202,142,202,114,39,117,76,88,4,66,66,113,
7,95,234,175,68,22,101,20,251,8,4,107,100,112,101,112,30,23,112,62,
49,101,49,244,118,112,112,118,11,78,99,99,99,58,71,12,92,99,246,78,
246,58,218,108,108,53,63,229,0,83,34,13,53,53,101,38,13,0,0,13,
53,101,63,101,99,78,58,78,71,19,19,92,71,58,99,58,11,218,218,71,
99,99,99,99,218,58,99,218,218,8,71,218,99,99,218,58,99,99,99,99,
99,58,99,58,99,218,11,58,58,99,58,58,71,92,92,58,78,78,78,78,
118,19,53,123,48,128,128,48,123,12,92,92,48,128,212,48,241,12,12,92,
241,128,246,246,246,71,12,12,12,71,71,118,49,223,49,208,116,22,49,23,
11,223,223,72,225,235,113,82,82,101,49,65,68,164,201,7,162,26,8,121,
66,223,23,216,14,36,177,152,154,152,80,255,98,66,66,223,66,4,32,152,
152,163,228,222,112,251,20,20,8,113,219,222,22,82,23,22,62,112,54,244,
101,82,112,112,23,118,112,11,11,78,58,58,246,99,71,71,99,58,246,212,
58,58,123,108,108,53,20,13,101,19,34,13,53,53,53,0,75,38,0,34,
63,53,53,71,58,78,58,78,11,92,92,71,58,58,58,58,99,218,11,99,
11,58,218,218,99,99,218,99,99,8,99,71,99,99,99,99,99,218,58,99,
218,58,99,99,99,58,58,78,58,99,58,58,58,71,12,78,78,78,78,78,
58,12,19,12,48,218,246,218,48,12,92,92,241,48,58,212,48,241,12,92,
48,241,212,58,212,212,123,118,12,71,118,118,12,223,49,118,55,239,244,223,
112,112,82,118,236,225,14,4,26,82,101,19,112,93,153,21,224,174,88,162,
26,26,121,82,66,66,66,66,66,66,26,82,66,26,113,127,32,44,51,87,
248,222,236,223,20,20,20,8,70,111,17,237,223,49,237,30,62,54,30,118,
253,49,112,118,23,118,118,11,99,58,58,58,212,99,71,218,246,78,78,58,
58,58,108,108,63,38,13,92,58,12,13,251,53,63,251,79,12,71,34,34,
251,53,19,58,78,78,78,58,58,71,71,58,99,99,58,99,58,11,58,99,
99,99,99,218,218,99,218,218,99,8,71,99,218,218,218,99,218,99,99,99,
99,71,58,99,99,99,99,58,58,99,58,58,78,58,99,78,58,78,58,78,
78,78,99,218,128,58,58,78,128,48,12,92,123,241,78,246,58,48,241,218,
12,128,212,212,58,58,212,218,71,12,71,12,118,12,223,49,11,243,55,244,
49,112,244,223,49,236,17,111,4,121,82,82,8,223,244,29,153,61,148,234,
152,32,147,52,4,4,113,26,113,26,98,98,147,255,7,193,24,163,217,238,
110,112,101,20,20,253,8,70,107,222,22,223,223,244,244,244,244,242,112,82,
223,118,23,23,49,118,71,11,58,58,58,246,246,58,99,78,58,212,212,78,
58,99,53,53,38,83,19,58,246,19,34,79,251,34,34,71,58,71,79,13,
83,63,218,58,58,99,58,78,58,99,78,58,99,99,99,58,58,99,99,58,
218,11,218,99,11,218,11,99,71,8,71,218,218,11,71,99,218,99,99,99,
99,218,11,99,58,58,58,58,11,58,99,218,58,58,78,78,78,78,58,58,
78,78,78,78,58,78,78,78,58,58,48,123,48,48,128,78,246,78,128,241,
241,241,128,212,58,58,58,58,218,12,118,71,71,112,118,223,49,11,245,55,
30,49,112,244,223,19,30,93,107,111,4,26,101,101,8,101,112,242,93,203,
6,170,21,74,51,51,104,24,234,76,24,104,76,124,232,56,225,18,30,223,
20,20,20,20,8,66,235,231,236,112,223,118,30,112,112,54,244,112,82,49,
112,23,118,118,12,11,99,99,246,58,58,58,78,58,246,246,78,78,212,78,
58,12,53,229,34,40,78,78,58,38,0,13,13,79,71,58,58,71,13,0,
38,71,58,99,58,99,58,99,78,58,58,99,99,99,71,99,58,99,218,99,
71,99,218,99,99,71,218,99,71,8,71,71,71,123,218,218,11,218,218,218,
218,99,218,218,99,99,99,99,58,99,99,99,99,99,58,78,78,58,58,99,
99,78,78,246,78,212,78,78,58,78,128,48,48,241,48,246,78,58,246,128,
128,128,128,128,212,78,212,78,58,218,71,71,12,12,118,118,49,49,112,208,
41,22,49,112,244,23,19,49,22,93,219,14,4,8,82,101,20,101,223,49,
30,65,18,29,17,203,228,230,56,96,91,225,225,236,242,112,49,82,20,20,
20,20,82,113,210,107,29,22,118,223,112,30,244,244,62,112,23,82,223,49,
118,118,49,49,118,71,99,246,58,58,212,246,246,78,212,58,246,246,78,58,
218,53,209,126,40,78,78,78,218,0,34,34,79,71,78,99,58,71,251,229,
12,58,99,99,99,58,58,58,58,99,99,99,99,218,99,58,99,99,99,218,
99,218,11,218,218,11,218,71,71,8,71,123,71,71,218,123,71,99,11,99,
218,11,99,71,218,99,58,99,99,58,218,218,99,99,58,58,58,58,99,58,
58,99,58,246,246,246,78,58,58,58,78,58,48,48,241,78,246,78,78,58,
58,241,241,241,212,58,246,78,246,58,218,71,71,71,118,118,118,49,49,112,
103,243,236,112,49,244,112,49,223,118,65,93,107,14,98,113,82,8,101,253,
101,20,101,82,82,223,118,118,49,49,49,82,82,101,101,20,20,253,253,121,
26,70,235,110,29,103,118,223,223,11,244,244,54,242,244,49,19,223,49,118,
118,49,12,71,11,99,212,246,78,78,78,78,212,246,78,58,78,212,78,58,
12,38,213,71,78,58,58,78,40,83,79,20,99,58,99,58,99,12,92,71,
78,58,99,99,99,99,99,99,99,99,218,218,99,218,218,99,218,218,11,218,
11,218,218,71,218,218,71,123,71,8,71,71,12,71,71,218,218,218,71,71,
218,218,218,218,71,218,218,99,99,218,99,99,99,99,99,99,58,99,58,99,
99,99,99,58,78,78,78,78,58,99,58,58,58,128,48,128,78,78,58,78,
212,212,212,241,128,58,246,246,58,246,58,218,218,118,71,71,118,12,118,49,
23,237,245,55,208,23,118,23,112,223,223,118,244,236,18,110,14,210,4,66,
121,8,82,20,82,101,101,251,20,20,20,101,8,20,8,8,26,26,210,235,
109,110,65,30,118,223,49,244,244,244,244,242,65,30,223,82,49,118,118,49,
92,49,118,71,11,78,246,78,58,246,212,246,78,78,246,78,246,78,212,218,
53,92,99,78,58,58,58,246,53,0,53,99,99,58,99,58,99,71,218,58,
99,58,99,218,58,99,58,78,99,99,11,99,71,99,99,218,99,99,218,71,
123,218,71,218,12,71,71,71,71,8,71,71,71,71,71,118,71,71,218,99,
71,71,71,123,71,71,218,99,99,218,218,71,11,218,99,99,58,99,58,99,
99,99,218,58,58,78,78,78,58,99,99,58,58,58,58,128,246,78,58,58,
58,58,246,128,128,58,212,246,78,78,78,58,58,218,71,71,11,118,118,49,
12,23,11,103,243,72,237,23,23,112,23,223,19,223,112,22,109,18,29,111,
111,210,210,70,4,26,26,26,26,26,26,4,4,70,98,235,2,18,29,65,
54,23,223,49,23,244,244,112,244,54,22,244,118,82,223,223,118,92,49,49,
223,71,11,99,99,78,246,58,246,78,58,212,78,78,58,58,246,78,58,218,
71,78,58,58,99,58,58,99,19,77,58,58,58,218,99,58,58,58,58,58,
218,99,11,218,58,99,218,58,218,218,71,218,218,71,99,71,218,71,71,218,
71,123,71,71,71,71,71,71,12,8,118,118,71,71,118,71,71,71,118,12,
71,123,71,71,71,71,71,71,218,99,99,99,218,218,71,218,99,99,58,99,
99,218,99,218,58,58,246,78,78,99,99,99,99,58,246,78,58,246,58,58,
58,58,58,78,78,58,58,58,246,212,99,58,58,58,218,99,71,118,11,118,
49,49,49,23,11,208,55,245,22,112,23,23,23,23,49,49,49,223,112,30,
22,236,18,18,18,29,18,18,18,18,107,236,29,236,236,22,30,23,223,223,
223,118,118,112,244,112,244,242,242,30,23,223,82,223,49,49,49,223,49,12,
71,71,99,58,246,212,58,58,58,78,78,78,58,58,58,58,78,212,246,78,
78,58,58,11,99,58,78,78,99,58,58,99,218,99,58,99,58,58,58,218,
99,71,218,99,218,58,99,218,218,71,218,123,71,99,71,218,71,71,71,12,
71,71,12,12,12,12,12,12,12,8,12,12,12,12,12,12,118,118,71,71,
71,218,71,123,71,71,71,71,123,71,218,11,218,71,218,123,218,99,218,58,
99,99,11,218,71,99,99,58,78,58,99,99,71,99,58,78,246,246,246,58,
58,218,58,99,78,78,246,78,78,246,58,58,58,212,58,58,99,71,71,118,
71,118,118,23,49,112,112,103,72,72,65,244,112,23,118,118,70,223,223,223,
223,49,118,23,118,112,112,244,112,112,23,23,23,49,49,223,223,49,23,118,
244,244,112,62,244,109,22,30,49,223,223,82,49,223,49,223,223,118,118,71,
99,99,99,78,78,246,58,58,78,78,58,58,58,99,78,246,78,78,78,78,
99,99,99,58,99,58,78,78,58,99,99,11,218,99,99,58,58,11,99,218,
218,218,71,99,218,218,11,218,123,71,218,71,71,218,71,71,123,71,118,12,
71,12,12,12,12,12,12,12,12,8,12,12,12,12,12,12,71,71,71,118,
71,118,71,71,118,12,71,71,71,71,99,218,123,71,218,71,218,71,99,99,
99,218,218,71,218,218,99,58,58,58,58,218,99,218,218,99,58,99,78,58,
58,99,99,99,58,58,78,246,246,78,78,78,58,99,58,58,99,58,99,71,
11,71,12,23,118,118,118,23,112,30,103,208,208,65,242,112,118,23,23,118,
118,118,49,112,23,112,11,112,112,112,118,49,49,49,49,112,23,23,112,244,
244,22,22,22,242,112,49,223,223,66,223,49,223,49,223,49,12,71,71,99,
99,58,212,212,246,58,78,78,58,58,99,99,99,58,78,78,78,78,58,58,
99,99,99,58,58,58,58,58,99,218,71,218,99,99,218,58,99,99,71,218,
71,71,218,99,71,99,123,71,118,118,123,71,71,123,71,71,12,12,118,12,
12,12,12,12,12,12,71,12,71,8,12,92,12,92,71,12,118,118,12,12,
118,71,71,12,71,71,118,12,12,71,118,218,71,71,71,12,71,12,218,218,
99,99,218,218,71,71,71,218,99,99,99,99,71,71,218,71,99,58,58,58,
58,58,99,11,99,99,99,58,246,78,246,78,58,99,99,99,58,58,99,99,
99,11,71,112,112,118,118,92,118,23,118,112,30,237,103,65,65,22,30,54,
244,244,23,112,244,112,244,112,244,23,244,23,112,62,244,244,30,242,22,242,
22,30,23,49,49,19,82,223,223,49,49,49,223,49,12,11,11,218,99,58,
58,78,78,78,246,78,78,99,99,58,99,58,58,78,78,78,58,99,218,218,
71,99,99,99,58,99,58,99,71,123,71,218,99,99,218,99,218,71,12,71,
71,218,71,71,218,71,71,71,71,71,12,71,71,71,118,12,12,12,71,71,
12,12,12,12,118,12,12,92,12,8,12,12,71,12,12,12,12,12,71,12,
118,12,12,12,118,12,71,12,12,71,71,71,71,123,71,12,12,71,71,218,
218,218,11,71,123,71,71,218,71,99,99,58,99,99,71,218,218,99,218,58,
58,58,58,99,218,71,99,218,58,58,58,246,212,58,58,99,99,58,99,58,
58,58,58,218,71,71,112,71,118,118,49,23,118,118,49,112,112,30,237,22,
22,22,103,22,22,22,22,22,30,242,22,22,22,103,22,22,30,112,112,23,
49,49,49,82,223,66,49,49,49,49,223,12,118,71,218,99,99,58,99,58,
78,246,78,246,58,58,99,99,218,218,99,99,99,58,58,58,99,218,71,218,
99,99,58,58,58,99,218,123,71,71,218,218,99,99,99,123,71,71,71,92,
71,71,218,218,71,12,12,12,118,71,12,118,71,71,71,12,12,12,12,12,
12,12,118,118,12,12,12,12,12,8,92,92,92,12,12,12,12,12,12,12,
92,12,12,12,71,12,118,12,12,12,12,12,71,71,71,12,12,71,118,71,
71,123,71,71,71,118,71,71,71,123,71,218,218,99,218,71,12,71,71,218,
218,58,58,99,58,71,71,218,218,218,99,58,58,58,58,58,99,99,99,218,
218,99,58,58,99,99,99,11,11,11,23,112,118,112,49,118,118,118,23,118,
49,118,23,112,112,112,112,244,112,112,118,112,118,49,49,223,49,223,223,49,
223,223,49,49,223,49,223,223,118,118,71,11,218,99,218,99,218,78,58,58,
58,58,58,218,218,218,218,218,58,99,58,58,58,58,218,99,71,71,123,71,
218,99,58,99,99,71,71,12,12,71,71,71,218,218,218,71,118,71,71,12,
123,71,12,71,71,12,12,12,118,71,12,12,12,118,118,12,71,118,12,118,
12,12,12,12,12,92,12,12,92,8,92,92,12,12,92,12,92,12,12,12,
12,12,118,12,12,12,12,12,12,12,118,12,12,71,118,71,12,12,71,118,
71,71,71,123,218,118,12,71,71,71,71,99,99,218,218,71,71,71,71,71,
99,218,99,58,99,218,218,71,71,71,218,71,58,99,58,58,99,58,218,99,
99,218,99,99,58,58,58,99,58,99,218,11,71,112,11,112,118,23,118,23,
49,118,118,92,49,92,49,92,49,92,49,223,223,49,223,49,49,49,49,82,
49,49,49,223,118,118,71,71,11,71,99,218,218,99,58,58,58,58,58,58,
58,218,218,218,71,218,218,99,99,99,99,58,218,218,71,123,71,71,218,11,
99,99,218,218,71,71,12,71,12,218,218,218,71,218,118,12,71,118,71,71,
71,71,71,71,118,71,12,12,12,71,12,12,12,12,12,12,12,49,12,12,
12,92,12,49,12,92,12,12,92,8,92,92,92,92,92,12,92,12,12,92,
12,92,12,92,12,71,71,12,12,12,12,71,12,118,71,118,71,118,12,12,
12,12,71,71,218,71,71,118,118,12,12,118,71,218,71,218,123,12,12,12,
12,71,71,99,99,99,218,71,71,71,71,123,71,218,218,58,99,99,58,218,
99,218,218,11,99,218,99,218,218,58,58,58,99,218,71,11,71,71,118,11,
112,71,112,118,112,12,118,118,118,118,118,118,118,118,118,118,223,223,49,49,
118,118,118,71,71,71,218,71,218,71,99,99,99,218,58,58,58,218,218,218,
218,71,71,218,123,71,218,99,58,218,218,99,71,118,12,71,71,71,218,218,
218,99,71,118,12,12,12,71,71,123,71,71,71,12,118,12,92,71,118,71,
12,12,71,12,12,92,12,12,12,118,12,12,12,12,12,92,12,12,12,92,
71,92,12,92,92,92,92,92,12,8,92,92,92,92,92,92,92,92,92,12,
92,12,92,12,92,92,12,118,92,12,12,92,92,12,12,12,12,12,12,12,
12,12,71,118,12,118,71,71,12,12,12,12,118,71,218,71,218,71,118,12,
12,71,12,71,218,71,99,218,123,71,71,12,71,118,71,71,99,218,218,99,
218,99,218,218,218,71,123,71,218,218,218,218,99,99,99,58,99,99,99,218,
99,71,71,71,11,71,11,11,11,11,11,11,11,11,71,118,12,118,218,218,
71,218,71,71,218,71,99,71,99,99,99,58,218,99,218,218,71,71,71,71,
71,71,123,71,11,99,99,99,218,218,71,71,12,12,12,71,123,218,71,218,
71,118,71,12,118,12,12,71,71,218,118,12,12,12,92,12,71,118,71,71,
12,71,92,12,92,12,12,12,118,12,12,92,92,12,92,12,92,92,92,92,
92,92,92,92,12,92,92,92,92,8,92,92,92,12,92,92,92,92,92,92,
92,92,92,12,92,92,12,12,92,92,92,12,92,92,12,12,118,12,12,92,
92,12,12,12,71,71,71,118,12,118,12,12,12,71,12,71,71,71,71,12,
12,12,118,12,12,118,218,71,71,71,12,71,71,71,12,12,71,71,71,11,
218,99,218,218,218,218,71,71,71,71,71,71,71,71,218,218,218,218,99,218,
218,218,99,218,99,218,218,218,218,218,218,218,218,99,218,11,218,71,71,71,
71,123,71,123,71,218,99,218,218,11,218,99,71,71,71,71,71,71,71,92,
71,71,71,123,71,218,71,71,71,118,12,12,12,12,71,71,71,218,71,71,
12,12,12,12,12,12,12,71,71,71,12,12,12,12,12,12,12,12,118,12,
12,92,92,92,12,92,12,71,12,92,92,12,92,92,92,92,92,12,92,92,
92,92,92,92,92,92,92,92,92,8,92,19,92,92,92,92,92,223,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,12,118,12,12,
12,92,92,12,92,12,12,12,71,12,49,12,92,92,12,12,71,12,12,12,
12,71,12,12,12,12,71,12,71,71,218,218,71,118,12,12,12,71,12,12,
71,123,71,71,99,71,71,123,71,123,71,123,71,71,71,71,71,71,71,71,
71,218,218,218,71,71,218,71,218,71,218,71,71,123,71,123,71,123,71,123,
218,71,218,218,218,218,71,71,71,71,71,12,12,12,12,12,12,12,71,71,
71,123,218,218,71,71,12,12,12,71,12,12,12,12,71,71,71,12,118,12,
12,92,12,12,12,12,12,12,71,12,92,12,92,12,12,118,12,12,12,92,
92,92,92,92,92,12,92,92,12,92,92,92,92,19,12,92,92,92,92,92,
12,92,92,92,92,92,92,92,92,8,19,108,19,108,12,19,92,92,92,92,
92,92,92,92,92,19,92,92,92,92,92,92,92,92,92,92,92,92,12,92,
92,92,92,92,92,92,12,12,12,12,71,12,92,92,92,92,12,92,118,12,
12,12,12,12,92,12,12,12,71,12,71,71,71,12,12,12,12,12,12,92,
112,118,71,12,71,71,71,218,71,71,71,71,71,71,12,12,12,12,12,12,
12,118,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
71,71,71,71,71,71,71,71,118,71,12,71,12,12,12,12,12,71,71,123,
71,71,71,92,12,12,12,12,92,92,71,12,12,12,12,71,12,12,92,12,
92,92,12,118,12,12,118,12,12,92,92,92,92,12,12,12,12,92,92,92,
92,12,92,12,92,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,19,19,108,92,8,92,92,19,92,108,92,19,92,92,92,
92,108,92,92,92,12,92,92,12,92,92,92,92,92,92,92,92,92,92,12,
12,92,92,92,92,223,12,92,12,12,12,12,12,92,92,12,92,12,12,12,
12,12,12,12,49,12,92,92,92,92,12,12,71,12,12,12,12,12,12,12,
92,92,118,92,12,12,118,12,12,12,12,12,12,71,12,12,12,12,12,12,
12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
12,12,118,118,12,118,12,12,12,12,12,12,12,12,12,12,12,12,71,12,
12,12,71,92,12,92,92,49,12,12,12,12,118,12,12,118,92,12,92,92,
12,12,12,12,123,12,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,92,92,19,92,92,108,
92,19,92,108,108,92,108,92,108,8,19,108,19,92,19,108,108,108,92,19,
92,92,19,92,108,108,92,108,108,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,12,12,12,12,12,12,92,92,92,92,92,92,12,12,12,12,12,118,12,
12,12,12,92,12,12,12,12,71,12,12,12,12,71,71,12,12,71,118,118,
12,12,12,12,12,118,12,12,12,92,12,12,12,12,12,71,12,12,118,12,
12,71,12,12,12,12,12,92,118,118,12,12,12,12,71,12,12,12,49,12,
92,12,92,92,92,12,92,12,12,12,12,12,92,92,92,92,92,92,92,92,
12,12,71,92,92,92,12,92,223,92,92,92,12,92,92,92,92,92,12,19,
92,92,92,92,92,92,108,92,108,19,92,108,108,108,92,92,19,108,92,108,
19,92,19,92,108,92,108,19,19,8,19,108,19,108,108,19,92,19,108,19,
19,108,108,19,19,92,108,92,92,108,19,12,108,108,92,19,108,108,92,19,
92,92,92,92,92,92,108,19,92,92,92,92,12,92,92,92,92,92,92,92,
92,92,92,12,12,118,123,92,12,12,92,92,92,92,92,92,12,12,12,12,
12,92,12,12,92,12,92,92,92,92,92,92,12,12,12,12,12,12,12,71,
71,12,12,12,12,12,12,12,71,12,12,12,12,12,12,92,12,12,92,12,
92,12,12,49,12,92,12,12,12,12,12,71,12,12,12,12,92,12,92,12,
92,92,92,92,92,12,12,12,12,92,12,12,92,92,92,92,92,92,12,12,
12,92,92,92,92,19,108,92,92,92,92,92,92,92,92,19,92,108,108,92,
92,92,92,19,108,92,19,108,92,108,108,92,19,92,108,19,108,92,108,92,
19,108,108,92,108,108,19,92,108,8,19,19,19,19,19,108,19,19,108,92,
19,19,108,92,19,19,108,19,108,92,108,19,92,19,92,92,92,19,92,92,
92,92,92,92,92,92,19,108,92,19,19,92,92,92,92,92,92,92,223,92,
223,92,92,92,92,92,92,92,92,92,92,92,92,223,92,92,92,12,92,12,
12,12,12,12,92,12,12,92,12,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,92,49,92,12,92,92,12,12,92,12,92,12,92,12,12,92,12,
12,12,12,12,12,12,12,92,92,92,12,92,92,92,92,92,92,92,92,92,
92,92,12,12,12,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,19,92,92,108,12,92,92,92,12,19,92,92,108,92,19,19,92,
92,92,92,92,108,19,92,19,19,92,92,108,108,92,108,92,19,19,19,108,
19,19,19,19,19,19,108,19,19,8,19,53,19,53,19,53,19,53,19,108,
19,108,19,108,108,108,19,108,19,108,19,108,108,108,108,19,108,19,108,19,
19,92,108,19,19,12,108,92,108,92,108,19,108,92,92,92,92,92,92,19,
92,19,108,92,19,92,92,92,92,92,92,92,92,92,92,92,108,108,19,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,92,92,92,12,92,19,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,108,19,92,92,223,92,92,92,92,92,92,
19,108,108,108,108,19,92,92,92,92,108,108,108,108,108,92,108,92,108,19,
92,19,108,108,19,108,108,108,108,108,19,19,19,19,19,19,108,108,53,19,
108,19,108,53,19,53,19,53,19,8,19,19,19,19,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,108,19,108,19,
19,19,19,19,108,19,108,19,108,19,108,19,19,19,19,108,19,92,92,92,
19,19,108,19,108,19,19,92,92,92,92,92,92,92,92,19,19,108,19,108,
19,92,19,92,92,92,92,92,92,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,19,19,19,92,19,19,92,19,19,108,92,92,92,19,92,92,92,
92,92,92,92,92,19,19,19,19,108,19,108,92,92,92,92,92,92,19,19,
92,19,223,19,108,19,108,92,19,19,19,19,19,19,108,19,108,19,108,19,
19,19,19,19,19,19,19,19,19,108,19,108,19,108,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,8};

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
Curtain

View File

@ -1,507 +0,0 @@
/**********************************************************************
* Curtain Plug-In (Version 1.03)
* Daniel Cotting (cotting@mygale.org)
**********************************************************************
* Official homepages: http://www.mygale.org/~cotting
* http://cotting.citeweb.net
* http://village.cyberbrain.com/cotting
**********************************************************************
*/
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdlib.h>
#include <math.h>
#include "libgimp/gimp.h"
#include "gtk/gtk.h"
#include "logo.h"
#define ENTRY_WIDTH 100
typedef struct {
gint horiz;
gint vert;
} CurtainValues;
typedef struct {
gint run;
} CurtainInterface;
/* Declare local functions.
*/
static void query(void);
static void run(char *name, int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static void drawCurtain(GDrawable *drawable);
static gint curtain_dialog(void);
GtkWidget * curtain_logo_dialog(void);
GtkWidget *maindlg;
GtkWidget *logodlg;
GtkTooltips *tips;
GdkColor tips_fg,tips_bg;
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static CurtainValues wvals = {
TRUE, FALSE
}; /* wvals */
static CurtainInterface bint =
{
FALSE /* run */
};
MAIN()
static void
query(void)
{
static GParamDef args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image (unused)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
{ PARAM_INT32, "horizontal", "horizontal curtain flag (TRUE/FALSE)" },
{ PARAM_INT32, "vertical", "vertical curtain flag (TRUE/FALSE)" },
};
static GParamDef *return_vals = NULL;
static int nargs = sizeof(args)/ sizeof(args[0]);
static int nreturn_vals = 0;
gimp_install_procedure("plug_in_curtain",
"Apply a curtain effect",
"",
"Daniel Cotting (cotting@mygale.org, http://www.mygale.org/~cotting)",
"Daniel Cotting (cotting@mygale.org, http://www.mygale.org/~cotting)",
"October, 1997",
"<Image>/Filters/Distorts/Curtain",
"RGB*, GRAY*, INDEXED*",
PROC_PLUG_IN,
nargs, nreturn_vals,
args, return_vals);
}
static void
run(char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals)
{
static GParam values[1];
GDrawable *drawable;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
run_mode = param[0].data.d_int32;
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
*nreturn_vals = 1;
*return_vals = values;
drawable = gimp_drawable_get(param[2].data.d_drawable);
switch(run_mode) {
case RUN_INTERACTIVE:
/* Possibly retrieve data */
gimp_get_data("plug_in_curtain", &wvals);
/* Get information from the dialog */
if (!curtain_dialog())
return;
break;
case RUN_NONINTERACTIVE:
if (nparams != 5)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS) {
wvals.horiz = param[3].data.d_int32;
wvals.vert = param[4].data.d_int32; }
break;
case RUN_WITH_LAST_VALS:
/* Possibly retrieve data */
gimp_get_data("plug_in_curtain", &wvals);
break;
default:
break;
}
gimp_tile_cache_ntiles(2 *(drawable->width / gimp_tile_width() + 1));
gimp_progress_init("Applying curtain. Please wait...");
drawCurtain(drawable);
if(run_mode != RUN_NONINTERACTIVE)
gimp_displays_flush();
if(run_mode == RUN_INTERACTIVE)
gimp_set_data("plug_in_curtain", &wvals, sizeof(CurtainValues));
values[0].data.d_status = status;
gimp_drawable_detach(drawable);
}
static void
set_tooltip (GtkTooltips *tooltips, GtkWidget *widget, const char *desc)
{
if (desc && desc[0])
gtk_tooltips_set_tips (tooltips, widget, (char *) desc);
}
static void
drawCurtain(GDrawable *drawable)
{
GPixelRgn srcPR, destPR;
gint width, height;
gint bytes;
gint row;
gint x1, y1, x2, y2, ix, iy;
guchar *src, *dest;
gint i, col, position;
gfloat regionwidth, regionheight, dx, dy;
gfloat a, b, x, y;
glong pixelpos, pos;
guchar bgr_red, bgr_blue, bgr_green;
gimp_palette_get_background(&bgr_red, &bgr_green, &bgr_blue);
gimp_drawable_mask_bounds(drawable->id, &x1, &y1, &x2, &y2);
regionwidth = x2-x1;
a = regionwidth/2;
regionheight = y2-y1;
b = regionheight/2;
width = drawable->width;
height = drawable->height;
bytes = drawable->bpp;
gimp_pixel_rgn_init(&srcPR, drawable, 0, 0, width, height, FALSE, FALSE);
gimp_pixel_rgn_init(&destPR, drawable, 0, 0, width, height, TRUE, TRUE);
src = g_malloc((x2-x1)*(y2-y1)*bytes);
dest = g_malloc((x2-x1)*(y2-y1)*bytes);
gimp_pixel_rgn_get_rect(&srcPR, src, x1, y1, regionwidth, regionheight);
for(col = 0; col < regionwidth; col++) {
dx = (gfloat)col - a;
for(row = 0; row < regionheight; row++) {
pixelpos = (col+row*regionwidth)*bytes;
dy = -((gfloat)row - b);
x = dx+a;
y = -dy+b;
ix=(int)x;
iy=(int)y;
/*
Flags horiz and vert inversed by mistake!
Corrected this with a small hack in the next lines.
(one more inversion)
*/
if ((((int)((float)ix/2.0))*2==ix) && (wvals.vert)) {
pos = ((gint)(regionheight-1-iy)*regionwidth) * bytes;
}else{
pos = ((gint)(iy)*regionwidth) * bytes;
}
for(i = 0; i < bytes; i++) {
if ((((int)((float)iy/2.0))*2==iy) && (wvals.horiz)) {
position=pos+regionwidth*bytes-ix*bytes+i;}else{position=pos+ix*bytes+i;}
dest[pixelpos+i] = src[position];
}
}
if(((gint)(regionwidth-col) % 5) == 0)
gimp_progress_update((gdouble)col/(gdouble)regionwidth);
}
gimp_pixel_rgn_set_rect(&destPR, dest, x1, y1, regionwidth, regionheight);
g_free(src);
g_free(dest);
gimp_drawable_flush(drawable);
gimp_drawable_merge_shadow(drawable->id, TRUE);
gimp_drawable_update(drawable->id, x1, y1,(x2 - x1),(y2 - y1));
}
static void
curtain_close_callback(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}
static void
curtain_ok_callback(GtkWidget *widget, gpointer data)
{
bint.run = TRUE;
gtk_widget_destroy(GTK_WIDGET (data));
}
static void
toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
static void
curtain_logo_ok_callback(GtkWidget *widget, gpointer data)
{
gtk_widget_set_sensitive (maindlg, TRUE);
gtk_widget_destroy(logodlg);
}
static void
curtain_about_callback(GtkWidget *widget, gpointer data)
{
gtk_widget_set_sensitive (maindlg, FALSE);
curtain_logo_dialog();
}
static gint
curtain_dialog()
{
GtkWidget *dlg;
GtkWidget *button;
GtkWidget *toggle,*toggle2;
GtkWidget *frame;
GtkWidget *vbox;
gchar **argv;
gint argc;
argc = 1;
argv = g_new(gchar *, 1);
argv[0] = g_strdup("apply_curtain_filter");
gtk_init(&argc, &argv);
gtk_rc_parse(gimp_gtkrc());
bint.run=FALSE;
dlg = maindlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dlg), "Curtain");
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc)curtain_close_callback,
NULL);
frame = gtk_frame_new("Parameter Settings");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(vbox), 10);
gtk_container_add(GTK_CONTAINER(frame), vbox);
/* use black as foreground: */
tips = gtk_tooltips_new ();
tips_fg.red = 0;
tips_fg.green = 0;
tips_fg.blue = 0;
/* postit yellow (khaki) as background: */
gdk_color_alloc (gtk_widget_get_colormap (frame), &tips_fg);
tips_bg.red = 61669;
tips_bg.green = 59113;
tips_bg.blue = 35979;
gdk_color_alloc (gtk_widget_get_colormap (frame), &tips_bg);
gtk_tooltips_set_colors (tips,&tips_bg,&tips_fg);
toggle = gtk_check_button_new_with_label ("Apply horizontal curtain");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&wvals.horiz);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), wvals.horiz);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"If this option is enabled, a horizontal curtain effect will be applied.");
toggle2 = gtk_check_button_new_with_label ("Apply vertical curtain");
gtk_box_pack_start(GTK_BOX(vbox), toggle2, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle2), "toggled",
(GtkSignalFunc) toggle_update,
&wvals.vert);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle2), wvals.vert);
gtk_widget_show (toggle2);
set_tooltip(tips,toggle2,"If this option is enabled, a vertical curtain effect will be applied.");
gtk_widget_show(vbox);
gtk_widget_show(frame);
button = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)curtain_ok_callback,
dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
set_tooltip(tips,button,"Click here to close this dialog box and apply the curtain effects.");
button = gtk_button_new_with_label("Cancel");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)gtk_widget_destroy,
GTK_OBJECT(dlg));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Click here to close this dialog box without altering the image.");
button = gtk_button_new_with_label("About...");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)curtain_about_callback,dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Click here for information about the author and the plug-in.");
gtk_widget_show(dlg);
gtk_main();
gtk_object_unref (GTK_OBJECT (tips));
gdk_flush();
return bint.run;
}
GtkWidget *
curtain_logo_dialog()
{
GtkWidget *xdlg;
GtkWidget *xlabel;
GtkWidget *xbutton;
GtkWidget *xlogo_box;
GtkWidget *xpreview;
GtkWidget *xframe,*xframe2;
GtkWidget *xvbox;
GtkWidget *xhbox;
char *text;
guchar *temp,*temp2;
guchar *datapointer;
gint y,x;
xdlg = logodlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(xdlg), "About");
gtk_window_position(GTK_WINDOW(xdlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(xdlg), "destroy",
(GtkSignalFunc)curtain_close_callback,
NULL);
xbutton = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(xbutton, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(xbutton), "clicked",
(GtkSignalFunc)curtain_logo_ok_callback,
xdlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(xdlg)->action_area),
xbutton, TRUE, TRUE, 0);
gtk_widget_grab_default(xbutton);
gtk_widget_show(xbutton);
set_tooltip(tips,xbutton,"Click here to close the information box.");
xframe = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(xframe), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(xframe), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(xdlg)->vbox), xframe, TRUE, TRUE, 0);
xvbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(xvbox), 10);
gtk_container_add(GTK_CONTAINER(xframe), xvbox);
/* The logo frame & drawing area */
xhbox = gtk_hbox_new (FALSE, 5);
gtk_box_pack_start (GTK_BOX (xvbox), xhbox, FALSE, TRUE, 0);
xlogo_box = gtk_vbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (xhbox), xlogo_box, FALSE, FALSE, 0);
xframe2 = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (xframe2), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (xlogo_box), xframe2, FALSE, FALSE, 0);
xpreview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (xpreview), logo_width, logo_height);
temp = g_malloc((logo_width+10)*3);
datapointer=header_data+logo_height*logo_width-1;
for (y = 0; y < logo_height; y++){
temp2=temp;
for (x = 0; x< logo_width; x++) {
HEADER_PIXEL(datapointer,temp2); temp2+=3;}
gtk_preview_draw_row (GTK_PREVIEW (xpreview),
temp,
0, y, logo_width);
}
g_free(temp);
gtk_container_add (GTK_CONTAINER (xframe2), xpreview);
gtk_widget_show (xpreview);
gtk_widget_show (xframe2);
gtk_widget_show (xlogo_box);
gtk_widget_show (xhbox);
xhbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(xvbox), xhbox, TRUE, TRUE, 0);
text = "\nCotting Software Productions\n"
"Bahnhofstrasse 31\n"
"CH-3066 Stettlen (Switzerland)\n\n"
"cotting@mygale.org\n"
"http://www.mygale.org/~cotting\n\n"
"Curtain Plug-In for the GIMP\n"
"Version 1.03\n";
xlabel = gtk_label_new(text);
gtk_box_pack_start(GTK_BOX(xhbox), xlabel, TRUE, FALSE, 0);
gtk_widget_show(xlabel);
gtk_widget_show(xhbox);
gtk_widget_show(xvbox);
gtk_widget_show(xframe);
gtk_widget_show(xdlg);
gtk_main();
gdk_flush();
return xdlg;
}

View File

@ -1,73 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 1.03 the size of
the logo in the about box has been reduced
in order to make smaller binaries.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is avaiable
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,43 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = Curtain
Curtain_SOURCES = \
Curtain.c logo.h
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
Curtain_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,73 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 1.03 the size of
the logo in the about box has been reduced
in order to make smaller binaries.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is avaiable
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,75 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 1.01 the size of
the logo in the about box has been reduced
in order to make smaller binaries. In
general the compiled plug-in will be
about 25-30% of the size of version 1.00.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is avaiable
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
35 to 40 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,788 +0,0 @@
/* GIMP header image file format (Indexed): //logo.h */
static unsigned int logo_width = 200;
static unsigned int logo_height = 72;
/* Call this macro repeatedly. After each use, the pixel data can be extracted */
#define HEADER_PIXEL(data,pixel) \
pixel[0] = palette_data[data[0]*3+2]; \
pixel[1] = palette_data[data[0]*3+1]; \
pixel[2] = palette_data[data[0]*3+0]; \
data--;
static unsigned char
palette_data[] = { 4,2,2,4,110,178,32,4,122,4,36,
86,15,3,66,4,58,127,36,8,186,4,34,122,17,2,
34,4,19,66,12,4,162,90,2,69,88,2,48,7,20,
2,25,2,103,8,14,48,4,58,186,90,3,154,82,2,
129,55,2,34,17,2,18,17,34,191,94,2,101,57,2,
70,7,32,154,12,22,157,17,3,50,4,88,150,96,3,
186,86,2,138,87,2,86,212,214,210,4,19,98,52,2,
154,15,11,2,4,132,216,7,18,125,12,6,82,37,12,
18,4,88,189,86,14,48,128,2,157,32,4,138,4,60,
155,4,48,126,60,2,218,7,10,52,13,12,66,129,2,
50,56,2,52,52,14,98,4,47,157,6,20,87,48,2,
24,58,2,101,120,2,141,52,5,170,4,113,215,127,2,
73,4,90,210,4,52,112,36,18,194,59,2,85,42,2,
10,107,2,173,95,2,114,31,3,52,4,79,160,84,3,
189,14,10,40,30,2,69,96,2,58,113,2,126,9,37,
231,17,33,170,28,14,2,4,30,146,68,10,37,132,2,
82,23,4,7,4,10,122,4,36,108,32,2,37,7,27,
2,4,98,175,84,10,146,4,101,191,4,14,146,8,29,
86,4,2,170,8,60,230,84,10,162,72,2,39,102,2,
142,4,142,221,4,49,143,68,12,170,4,124,213,15,4,
74,114,2,69,112,2,158,32,3,23,8,50,190,111,2,
104,6,40,154,96,2,210,6,28,104,60,2,138,61,2,
25,68,2,114,58,2,125,39,2,114,73,2,69,16,4,
58,4,88,177,56,14,26,138,2,173,4,68,176,71,2,
55,76,2,210,4,78,130,17,3,42,6,27,69,112,2,
49,12,26,178,47,13,159,18,11,10,13,11,74,141,2,
58,52,18,234,4,82,186,4,126,198,4,103,213,4,62,
206,4,72,226,12,46,210,72,12,222,12,26,146,20,34,
210,4,113,197,4,131,229,4,48,170,4,76,170,7,43,
95,52,30,218,15,11,170,52,14,202,12,14,86,4,40,
174,108,14,202,156,2,186,60,12,130,5,40,129,73,13,
189,12,42,138,44,14,202,4,59,143,4,124,229,4,69,
191,4,69,157,4,60,114,4,43,110,14,14,58,20,26,
157,28,26,210,4,87,162,4,91,202,4,110,226,4,98,
226,4,101,202,17,14,186,28,18,18,60,2,234,28,10,
114,4,30,114,8,10,162,12,54,186,20,26,130,100,10,
170,40,18,154,4,22,114,28,26,234,4,22,58,4,66,
226,4,54,202,12,42,202,4,38,98,4,145,234,4,76,
146,4,94,148,4,138,213,4,94,186,4,54,126,4,54,
154,4,118,211,4,106,178,4,106,188,4,54,142,4,94,
170,4,70,202,4,118,197,4,54,173,4,82,178,72,4,
172,36,10,138,76,14,162,4,98,210,4,118,226,112,2,
114,24,19,8,30,2,85,84,6,226,141,2,73,28,30,
10,28,46,186,112,4,206,36,10,90,36,2,174,108,2,
58,41,3,130,44,10,194,9,33,130,92,2,162,51,2,
42,12,32,162,81,3,146,44,11,26,28,6,146,44,2,
178,30,12,10,60,10,178,64,2,146,28,10,178,92,10,
210,5,41,146,40,2,102,96,2,125,100,2,88,74,2,
157,142,2,159,26,10,55,143,2,50,73,2,102,134,2,
142,73,2,84,127,2,126,142,2,82,156,2,178,28,10,
158,28,26,114,84,14,202,12,4,10,5,20,74,17,2,
26,92,2,194,7,19,106};
static unsigned char header_data[] = { 71,99,218,218,99,11,71,218,71,71,
218,99,99,99,71,99,218,99,99,99,99,218,71,218,99,218,218,99,99,218,
218,99,99,218,99,218,99,58,218,99,99,99,58,218,99,99,99,58,99,58,
99,58,11,58,99,58,58,11,99,58,99,58,99,99,99,218,99,218,99,58,
99,71,99,218,71,12,12,12,12,12,12,12,12,12,92,19,19,19,92,92,
92,92,19,108,19,19,19,19,19,19,53,53,53,53,101,19,19,53,53,19,
19,19,12,92,92,12,12,12,71,71,218,99,218,218,71,71,12,12,218,99,
58,58,58,99,99,99,58,99,99,99,11,58,11,58,58,99,58,99,99,99,
58,99,99,99,99,58,99,99,99,99,99,218,99,99,11,99,99,99,11,99,
99,218,218,218,99,218,99,99,218,218,99,99,218,99,218,218,99,99,218,11,
218,71,99,218,99,218,218,99,71,8,218,99,218,218,99,99,99,99,99,99,
218,218,99,99,218,99,218,99,218,71,99,99,99,218,99,99,218,99,99,99,
218,218,99,99,99,99,58,99,58,30,99,99,99,99,99,99,58,99,99,58,
99,58,99,58,99,99,58,58,58,99,58,58,99,218,218,71,99,99,71,71,
71,123,12,118,71,71,12,71,123,12,12,19,19,19,53,19,19,53,53,19,
19,53,101,63,20,63,20,63,53,53,53,101,53,53,53,19,53,53,53,19,
92,12,12,12,71,12,12,12,12,12,92,71,218,218,71,218,71,71,71,71,
99,218,58,58,58,99,99,99,99,58,58,58,99,58,99,58,58,99,58,58,
99,99,58,99,99,99,99,58,99,58,30,99,99,99,218,99,58,99,99,58,
11,99,99,218,99,218,218,99,99,218,71,99,218,99,99,218,99,99,218,99,
11,218,99,218,99,11,218,99,99,8,71,71,71,99,218,71,218,99,71,218,
11,99,218,218,99,218,99,218,99,99,99,99,218,99,99,99,99,99,218,99,
99,99,99,99,99,11,99,99,99,99,99,99,58,99,58,99,58,99,58,58,
99,11,58,58,99,58,99,99,58,58,218,99,123,71,71,71,123,71,71,218,
99,99,218,71,12,12,12,12,92,19,19,53,19,53,53,53,53,19,53,53,
53,53,19,53,19,53,53,53,53,53,63,63,101,63,63,20,53,19,53,53,
53,19,92,92,12,12,12,71,71,71,71,12,12,71,71,12,12,12,12,12,
12,218,218,99,58,58,99,58,99,58,99,58,99,99,58,218,58,99,58,99,
99,99,99,11,58,99,99,58,99,99,58,58,99,99,99,99,99,99,99,99,
99,58,218,99,218,99,99,99,218,99,99,218,99,11,218,99,218,218,99,99,
218,99,218,11,99,71,99,218,71,8,99,99,218,99,99,99,218,99,99,218,
218,99,11,99,99,218,99,218,99,218,218,99,58,99,99,99,58,11,99,99,
58,99,99,58,58,58,58,99,99,99,99,218,58,99,99,99,58,58,99,99,
58,58,99,58,99,58,99,99,58,58,99,218,71,71,218,218,218,58,58,58,
218,99,71,123,12,12,12,19,19,108,108,108,92,92,92,12,71,12,12,92,
19,53,53,53,101,53,53,19,53,101,53,20,53,79,79,0,34,79,20,63,
53,53,53,19,19,19,12,12,12,71,71,71,71,71,71,123,71,12,12,12,
12,12,71,71,218,58,99,58,218,58,218,99,58,99,58,99,99,218,58,58,
58,99,58,58,99,99,58,99,58,99,99,218,58,58,99,99,99,99,99,99,
58,11,99,99,218,218,218,99,218,99,99,218,218,99,218,99,99,218,218,99,
218,99,71,218,99,218,99,99,99,8,218,218,99,218,99,218,99,218,218,99,
11,218,218,218,218,99,71,99,218,99,99,99,218,58,99,99,99,99,218,30,
58,99,58,99,58,11,58,99,58,99,58,58,58,99,58,58,99,99,58,58,
58,99,58,99,58,58,99,58,218,99,99,218,58,99,58,58,58,58,58,218,
71,12,12,71,71,12,12,12,12,71,71,118,71,71,118,71,71,12,223,19,
19,53,53,53,53,63,229,20,79,20,34,0,20,101,101,63,20,101,101,53,
108,53,53,53,53,53,101,19,92,12,12,12,12,71,71,218,218,218,71,71,
118,12,71,71,218,218,58,58,58,58,58,58,218,58,58,58,99,99,218,99,
58,58,99,99,58,99,58,99,58,58,58,99,99,99,58,99,99,99,58,58,
99,58,58,99,99,99,99,99,99,99,218,99,99,218,99,218,218,99,99,218,
99,58,99,99,218,99,218,218,218,8,99,218,99,218,99,218,11,99,218,99,
99,99,99,99,218,99,58,99,99,99,58,99,218,99,99,99,99,99,58,99,
58,218,99,99,99,58,218,58,58,58,99,99,58,99,218,58,99,99,58,218,
58,99,58,99,99,99,58,99,58,58,58,58,99,58,58,58,58,218,218,12,
71,71,71,12,12,71,71,12,71,12,71,71,71,71,12,92,19,53,53,53,
101,63,79,34,251,0,0,63,20,53,19,53,53,53,53,19,19,53,19,19,
19,108,19,19,19,19,19,19,53,53,108,12,12,12,71,71,218,58,58,58,
99,218,71,71,71,12,218,99,99,58,58,58,58,218,58,58,58,58,58,99,
99,58,58,99,58,218,58,99,99,99,99,58,99,128,99,58,99,99,11,99,
99,58,11,58,99,99,99,218,58,11,99,58,99,218,99,99,218,99,99,99,
218,71,99,99,218,99,11,99,218,8,218,99,218,99,218,99,99,218,99,218,
58,218,58,218,99,99,218,99,58,99,99,99,99,78,11,58,99,58,99,99,
99,58,58,99,58,11,58,58,218,99,99,58,58,58,99,58,58,58,99,99,
58,58,58,58,58,58,99,58,99,99,99,58,58,58,58,58,218,71,118,12,
71,71,71,71,71,12,71,71,71,71,71,12,92,19,19,53,53,63,20,251,
0,79,79,0,79,34,34,79,0,63,229,20,63,101,53,101,19,53,19,92,
12,71,12,92,12,12,12,12,12,92,19,92,92,71,12,118,71,218,99,58,
58,58,58,58,218,123,71,218,58,58,58,99,58,58,58,218,58,218,58,58,
218,58,99,58,58,58,99,99,58,99,58,99,218,99,99,99,58,58,58,11,
58,58,99,58,99,99,30,99,99,99,58,218,218,30,99,218,99,99,99,218,
99,99,218,218,99,99,218,71,99,8,99,99,71,99,218,218,99,218,99,218,
99,218,99,58,11,58,99,99,11,58,99,58,99,99,99,99,58,58,99,99,
58,99,99,99,99,58,99,78,58,58,99,99,218,78,58,218,58,99,212,58,
99,58,58,58,218,58,58,58,58,58,58,58,58,58,218,71,12,12,71,71,
123,218,218,58,99,71,123,71,71,12,19,19,19,53,53,19,19,53,63,53,
101,101,101,63,101,101,20,20,79,0,0,79,79,34,251,79,79,251,101,53,
19,92,12,71,71,71,218,12,218,12,71,71,71,71,71,12,71,71,123,71,
58,58,58,58,58,58,58,99,99,58,58,58,99,58,58,58,99,58,99,58,
99,58,58,99,58,58,58,58,99,58,99,58,99,58,99,58,99,99,58,58,
99,99,99,58,99,58,58,58,99,99,99,30,128,58,99,99,99,99,99,58,
218,99,99,218,218,99,99,218,71,8,71,218,99,99,99,99,218,99,99,99,
99,30,58,11,58,58,99,58,58,58,58,30,58,58,99,99,99,58,99,58,
99,58,99,58,58,58,218,99,58,99,58,58,58,218,99,58,58,58,58,58,
58,99,99,99,58,99,99,58,58,212,99,58,58,218,71,71,218,218,99,58,
58,58,58,218,123,71,71,12,108,19,19,108,19,19,223,92,19,92,12,12,
19,19,19,19,53,53,63,63,229,0,34,34,79,0,79,0,75,34,0,34,
79,20,53,19,92,12,71,71,71,218,71,123,71,123,71,71,71,71,71,71,
71,218,58,58,58,58,58,58,58,99,58,58,58,58,58,58,58,58,99,58,
58,99,99,58,99,58,58,58,58,58,58,99,58,99,58,99,58,58,99,99,
58,58,99,99,58,58,218,58,58,99,58,99,11,58,58,99,58,218,99,99,
99,99,218,99,99,218,99,99,99,8,99,218,99,218,99,99,99,99,58,58,
11,58,99,58,58,30,58,11,58,11,58,99,99,58,99,58,58,58,99,58,
58,99,58,99,99,58,58,99,58,99,58,99,58,99,212,58,58,58,58,58,
58,58,58,58,58,58,58,58,58,58,212,58,218,218,218,99,58,58,58,58,
58,99,71,71,71,12,71,71,12,12,12,71,71,123,71,218,71,71,71,92,
19,108,63,79,229,126,0,79,0,0,34,34,34,126,34,251,79,0,126,34,
79,0,79,20,63,19,19,12,71,71,71,218,71,99,71,71,71,71,71,71,
71,71,218,58,58,58,212,58,58,58,58,58,58,58,58,58,58,58,58,58,
58,58,99,58,58,99,58,58,99,99,128,218,58,58,99,58,99,58,58,99,
218,58,58,218,99,99,99,99,99,99,58,99,99,58,30,218,99,99,99,99,
99,99,218,99,99,99,218,218,99,8,218,99,99,99,58,99,99,99,99,99,
58,58,218,99,99,99,58,99,58,58,58,99,58,99,58,99,99,99,58,58,
99,99,58,58,58,58,58,58,99,99,58,99,99,58,58,58,58,99,58,58,
99,58,99,58,78,212,99,212,99,58,58,99,58,58,78,78,246,99,212,58,
99,71,123,71,71,71,71,71,218,218,71,123,218,218,218,118,12,19,63,63,
0,0,0,34,34,0,34,79,79,79,0,34,79,79,20,101,53,101,53,19,
53,53,101,101,53,53,19,19,19,92,218,218,218,218,218,212,78,58,218,218,
71,71,71,11,58,246,58,78,246,58,58,58,99,99,58,58,99,58,212,58,
99,58,99,58,58,99,58,58,58,58,58,212,218,58,58,99,58,58,99,58,
99,99,99,58,58,99,99,99,58,99,58,58,99,99,99,58,58,99,99,99,
99,99,99,11,58,99,99,99,218,8,99,99,218,99,99,218,99,218,58,58,
11,78,58,99,58,99,58,99,58,11,58,99,58,99,58,58,58,99,99,58,
99,99,99,58,58,58,58,58,58,58,58,58,58,58,58,212,99,58,212,99,
58,58,78,58,78,58,58,58,58,58,58,58,58,58,246,58,246,58,58,71,
218,71,71,71,218,71,71,71,71,218,218,71,71,92,92,53,63,126,79,0,
0,79,0,79,34,79,0,126,79,79,79,79,79,229,229,101,53,108,92,71,
71,71,71,71,71,12,12,19,108,19,92,71,71,71,71,218,212,246,78,58,
58,218,218,71,71,58,58,212,212,78,212,78,78,58,58,58,58,58,99,58,
78,58,58,99,58,58,58,58,58,58,58,58,99,58,99,58,58,212,99,58,
58,99,58,99,58,99,99,58,58,99,99,58,58,58,58,11,78,99,99,99,
99,58,99,58,71,99,99,99,99,8,99,99,99,218,99,58,99,30,58,11,
58,11,58,58,99,58,58,99,58,99,58,99,99,58,99,58,99,58,58,99,
58,58,58,58,58,78,58,99,58,99,58,58,58,58,99,58,212,99,58,58,
58,78,78,78,58,58,58,58,58,212,58,78,58,78,78,78,58,99,218,218,
71,218,218,71,58,99,58,99,71,71,71,12,19,20,79,251,0,251,79,251,
79,63,126,79,79,79,79,229,79,79,79,126,126,79,79,63,20,53,53,92,
12,12,218,71,71,218,218,218,71,218,71,71,71,218,71,218,218,58,246,246,
78,212,78,58,218,218,58,58,58,246,78,212,78,212,58,58,58,58,58,212,
78,78,78,58,58,99,58,58,58,58,58,58,58,58,58,218,99,99,58,99,
58,58,218,99,58,58,99,58,99,99,58,99,99,99,58,99,99,58,58,58,
218,99,11,58,99,99,99,218,99,8,99,30,218,58,11,99,99,58,99,58,
99,58,58,99,218,99,218,58,99,99,58,58,58,58,99,58,99,99,58,99,
58,58,58,78,78,58,58,58,58,58,99,246,78,78,58,58,58,58,58,78,
78,212,78,246,246,58,58,58,212,58,212,246,78,246,58,212,218,218,218,218,
218,58,246,58,246,58,218,218,123,12,19,19,53,53,101,53,63,101,63,63,
63,63,63,63,63,101,63,53,63,53,53,53,53,108,19,19,19,19,108,19,
92,92,12,12,71,71,218,99,99,218,218,218,218,218,71,71,71,218,218,246,
78,78,246,78,78,78,58,58,58,78,78,78,78,246,58,58,58,58,58,78,
212,78,78,58,58,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,
58,99,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,99,99,99,
58,99,58,99,99,58,99,99,99,8,99,99,30,58,58,58,58,58,58,99,
58,11,99,58,99,58,58,58,58,58,58,99,58,58,58,58,58,58,99,58,
99,58,78,58,58,58,99,58,58,78,246,78,58,78,58,58,58,58,78,212,
246,78,246,78,78,99,212,246,78,246,58,246,246,78,246,218,218,218,58,58,
246,78,78,246,58,218,218,71,12,12,108,92,108,19,108,53,63,63,63,53,
53,53,19,223,92,92,49,118,118,118,118,118,118,118,71,118,118,12,12,12,
92,71,71,123,218,99,11,58,58,58,58,78,58,99,99,123,71,218,218,218,
246,246,78,212,78,212,78,246,78,78,58,78,246,78,246,78,58,58,58,58,
99,78,246,78,246,99,58,58,58,58,58,78,78,78,78,99,58,99,58,99,
78,58,58,99,58,218,218,58,58,99,58,58,58,218,99,58,58,58,58,11,
58,99,99,99,58,99,99,218,58,8,99,99,58,99,58,11,58,11,58,58,
99,58,99,58,99,58,99,58,58,218,58,58,58,99,58,99,58,58,58,99,
78,58,58,58,99,58,58,78,78,58,246,78,246,99,58,58,58,212,78,78,
246,58,246,58,78,78,78,58,246,78,78,58,246,58,58,58,212,58,246,78,
212,246,58,58,71,71,71,71,12,92,92,92,108,53,53,53,19,19,223,223,
49,223,92,49,49,223,92,49,118,118,118,71,118,112,118,11,11,112,71,112,
71,71,11,11,11,99,99,58,58,78,78,78,246,78,246,58,99,71,218,71,
218,78,78,246,78,246,58,246,78,246,212,58,246,58,246,78,212,78,246,58,
58,58,78,246,246,78,78,99,58,58,58,212,78,58,78,58,58,58,58,58,
78,58,78,99,58,58,99,58,58,58,58,99,58,58,99,218,58,99,58,58,
58,58,99,58,99,99,58,99,99,8,99,99,58,58,58,99,58,99,99,58,
99,58,58,58,58,58,58,218,99,58,99,58,58,58,58,58,99,58,58,78,
58,78,78,78,78,58,78,58,78,78,78,212,78,58,78,58,78,212,78,246,
78,246,78,78,212,246,246,78,246,212,246,246,78,246,58,246,78,246,58,246,
246,58,99,218,218,218,71,12,92,19,19,19,19,19,223,223,49,223,49,118,
49,112,30,30,237,103,208,208,245,208,245,208,245,245,245,103,208,103,22,237,
30,30,11,11,11,11,71,71,11,99,58,78,78,246,58,246,246,246,58,99,
99,218,212,78,246,78,246,78,246,58,78,58,246,78,58,246,78,212,78,246,
58,212,58,78,78,212,78,78,58,58,99,78,78,78,78,78,58,58,99,58,
58,78,78,78,58,58,99,58,99,58,58,99,58,218,58,58,99,58,58,218,
99,58,99,99,58,99,30,99,99,8,58,99,58,99,58,58,58,99,58,99,
58,218,218,58,99,58,99,58,58,58,78,99,78,58,99,58,58,78,58,78,
78,58,78,78,58,78,78,246,246,212,78,78,78,58,78,246,78,246,58,246,
212,78,58,78,78,58,246,78,78,78,58,246,78,246,78,58,246,78,78,78,
58,218,99,11,71,12,92,92,92,223,223,223,223,223,49,118,112,22,237,208,
72,245,55,243,245,72,72,72,65,208,236,208,208,245,72,55,243,55,55,243,
245,245,245,103,237,237,30,11,11,112,71,11,99,58,78,246,246,246,246,78,
58,218,58,58,246,78,212,78,246,78,246,78,212,78,78,212,78,246,78,78,
58,78,78,78,78,78,246,246,246,58,58,78,58,246,78,212,78,78,99,58,
58,78,58,58,58,58,58,99,58,58,58,58,78,58,58,99,99,58,58,58,
99,218,58,99,99,99,58,99,58,8,99,99,99,58,11,58,58,58,99,58,
58,58,58,58,58,58,58,99,99,78,78,58,58,78,58,58,99,78,78,78,
78,78,78,78,78,78,212,246,246,246,246,78,78,246,246,58,246,78,246,78,
78,78,212,246,246,246,78,78,212,246,246,246,58,246,246,78,246,246,78,58,
218,99,71,12,12,92,92,82,223,49,223,118,112,22,208,72,72,208,65,22,
22,112,11,112,112,112,112,112,118,118,118,112,112,112,30,244,244,30,237,65,
236,72,55,55,243,243,208,208,237,237,11,71,11,11,71,11,99,58,246,246,
246,78,78,246,58,246,78,246,58,246,58,246,58,246,246,78,78,78,212,78,
212,246,212,78,246,246,58,78,78,246,99,246,246,58,246,58,78,78,78,58,
78,78,78,78,78,78,58,58,58,99,58,58,78,99,58,58,58,218,99,99,
58,58,99,58,99,58,58,99,99,8,58,58,99,58,99,218,99,58,99,99,
99,58,99,58,99,58,58,58,58,78,58,58,58,58,58,58,58,78,212,78,
78,58,246,78,58,246,246,246,246,246,246,246,78,58,246,78,246,58,246,58,
246,78,78,78,58,246,212,78,78,78,58,246,78,212,246,58,78,212,58,99,
218,71,12,92,19,223,49,49,118,62,30,22,208,208,103,30,244,112,244,118,
112,23,49,49,49,49,49,49,49,49,82,82,223,82,49,118,23,118,118,112,
11,30,237,22,65,245,55,243,245,245,103,237,237,11,71,11,71,71,218,58,
246,246,78,246,78,212,78,246,246,78,246,246,78,78,212,78,212,78,246,78,
78,58,246,78,58,246,78,212,78,246,78,78,78,78,78,212,246,246,246,78,
58,78,78,78,58,78,78,58,58,58,58,58,99,58,58,58,58,58,99,58,
58,58,58,58,58,99,99,58,58,8,99,99,58,58,58,99,99,99,99,58,
58,99,78,58,78,99,58,58,99,78,78,78,58,78,58,58,78,246,78,212,
78,78,58,78,246,246,246,246,246,246,58,78,78,246,58,246,78,246,78,246,
78,212,78,212,212,246,78,78,246,246,78,212,58,99,212,246,246,58,99,218,
118,12,92,223,223,49,49,11,237,208,208,103,244,23,118,112,118,112,49,49,
19,82,82,82,223,49,66,49,49,82,223,223,101,19,223,82,223,82,223,82,
82,49,23,112,11,244,30,65,72,55,55,245,208,22,237,112,11,118,71,218,
218,58,58,78,246,78,212,78,78,212,99,78,212,246,78,246,78,246,78,212,
246,246,78,246,246,78,246,78,246,58,246,78,58,78,246,246,246,246,212,246,
78,78,78,78,78,58,78,78,99,58,78,78,78,99,58,58,99,58,99,99,
58,99,99,99,99,58,99,58,99,8,99,99,99,58,58,99,58,58,99,58,
58,58,78,78,58,58,58,58,58,58,78,78,78,78,78,58,246,246,246,246,
246,78,78,212,246,246,246,246,246,246,78,212,78,246,78,212,78,246,58,246,
78,246,78,58,58,212,246,58,78,246,246,58,58,58,58,246,58,218,71,12,
223,223,49,49,49,30,65,72,72,30,112,118,118,112,118,49,223,223,223,49,
244,244,244,244,23,23,23,23,70,66,49,70,49,70,70,118,23,23,23,23,
49,223,19,82,223,223,23,11,244,237,208,72,55,55,208,103,30,11,11,49,
71,71,99,58,246,78,246,246,58,246,58,58,246,212,78,246,58,246,78,58,
58,212,78,78,212,78,212,78,78,78,212,78,78,78,246,212,246,246,246,212,
246,58,78,78,78,78,58,78,78,99,58,58,78,58,58,58,99,58,58,58,
58,58,58,58,99,58,99,58,99,8,99,58,58,218,58,58,58,99,58,58,
58,99,58,58,99,58,78,78,78,78,78,78,78,58,246,246,246,212,246,246,
212,246,78,246,246,246,246,246,212,246,246,78,246,58,212,246,78,78,78,246,
58,246,212,99,58,246,78,246,246,58,58,58,58,78,246,58,99,118,12,92,
223,223,223,11,22,72,208,244,49,112,112,118,49,82,223,49,244,244,242,62,
23,62,23,23,244,244,244,244,244,244,62,30,244,244,244,244,23,112,210,23,
62,244,244,23,223,82,53,82,49,112,30,30,65,72,55,245,208,237,30,112,
71,49,118,71,99,78,78,78,246,246,58,99,58,246,212,78,246,58,246,212,
99,58,212,246,78,246,78,246,212,246,78,246,246,212,246,246,246,212,246,246,
246,246,78,78,246,246,78,78,78,78,58,58,78,58,58,58,58,58,99,99,
99,78,99,58,99,99,58,99,58,8,58,99,58,99,99,58,58,99,58,58,
58,58,58,58,78,58,78,78,58,78,58,246,78,78,78,212,246,246,212,246,
246,246,246,246,246,246,246,246,246,246,246,58,246,58,99,212,246,212,78,78,
78,99,58,58,78,246,58,78,246,58,58,58,58,212,58,218,71,12,49,49,
49,112,22,72,65,112,49,112,112,112,223,19,118,62,244,62,62,23,23,244,
244,244,244,112,23,49,49,223,19,223,82,223,223,49,223,23,118,112,244,30,
62,62,62,62,23,62,23,223,82,8,82,71,30,244,22,72,55,245,103,237,
11,71,12,12,71,99,78,78,78,58,212,58,58,58,58,212,78,58,246,78,
58,58,58,212,78,246,58,78,78,212,212,246,246,246,212,246,246,246,246,246,
246,246,58,78,78,58,246,212,78,78,58,78,58,78,78,78,58,78,58,58,
218,58,58,99,58,99,99,99,58,8,218,99,58,58,58,99,58,58,99,78,
78,58,99,58,58,78,58,78,246,78,78,58,78,212,246,246,246,246,246,246,
246,246,246,212,246,212,246,246,246,212,78,246,58,58,58,246,78,78,212,246,
58,58,58,58,212,78,246,212,58,58,58,58,58,58,71,12,49,223,223,49,
30,208,72,30,49,49,112,49,223,223,23,22,244,62,23,23,62,22,112,118,
49,49,223,118,23,244,30,242,22,242,242,62,242,244,244,112,23,49,49,223,
23,112,30,244,62,112,210,23,23,49,82,8,223,244,237,30,208,55,243,245,
22,30,71,118,12,71,99,78,78,246,212,58,58,58,58,246,246,246,78,246,
58,58,58,78,212,78,246,246,246,58,58,212,246,246,246,246,246,246,246,246,
246,78,246,58,246,246,246,78,212,78,78,78,58,78,58,78,58,58,99,58,
58,58,99,58,58,58,58,58,58,8,58,99,58,58,58,58,99,58,78,78,
58,58,78,58,58,78,78,58,78,78,78,78,78,246,212,246,246,246,246,246,
246,246,246,246,246,246,212,246,246,246,78,58,58,58,58,246,78,78,246,99,
212,58,212,58,212,78,78,58,58,218,58,212,58,99,71,49,223,49,49,30,
55,72,112,49,244,11,49,82,112,242,242,62,23,62,244,112,118,223,82,118,
30,236,29,225,231,33,248,42,42,42,219,2,42,219,110,107,231,29,65,244,
112,223,223,49,112,30,30,23,23,23,23,49,82,101,49,30,30,242,72,243,
208,103,30,71,118,12,71,99,78,78,78,58,58,58,58,58,78,58,246,78,
58,58,99,58,246,58,246,58,246,58,99,58,212,246,246,212,246,246,246,246,
246,246,246,246,212,246,246,246,246,78,58,78,78,78,78,78,58,78,78,78,
58,78,99,99,99,58,58,99,99,8,99,58,99,99,58,58,58,58,78,78,
78,78,58,58,58,78,78,78,78,78,246,246,58,246,246,246,246,246,246,246,
246,246,212,246,99,58,246,246,246,246,212,58,58,58,99,212,78,212,212,58,
78,58,58,58,246,246,78,58,71,218,58,58,11,71,118,223,49,23,103,243,
22,49,118,30,118,82,49,30,242,62,70,62,244,118,223,82,112,65,93,205,
217,42,80,147,98,4,26,8,8,8,8,121,8,8,26,4,98,210,111,219,
29,29,65,112,223,82,23,30,244,62,62,62,62,49,82,82,112,30,30,65,
243,245,103,30,71,118,12,71,218,212,246,58,58,212,212,58,58,246,212,78,
58,58,212,58,58,246,78,246,58,58,58,58,246,212,246,246,246,246,246,246,
246,212,246,246,246,246,212,246,246,212,78,246,212,78,58,78,78,78,58,78,
78,78,58,58,58,58,99,58,58,8,58,58,58,58,58,58,58,58,237,78,
58,78,78,58,78,78,212,78,246,78,78,246,246,246,246,246,246,246,246,246,
246,246,246,58,58,58,246,246,246,246,58,58,99,58,58,246,246,78,99,78,
246,78,58,58,58,58,58,218,12,99,58,99,71,92,49,223,118,22,41,65,
223,23,30,118,19,23,22,242,23,23,30,112,223,19,112,29,222,232,87,80,
98,26,121,8,20,253,20,20,20,20,101,20,20,20,253,253,20,8,121,26,
4,14,2,231,29,30,49,82,112,30,244,62,23,210,118,82,101,223,30,244,
65,55,243,103,237,71,118,71,71,99,58,58,58,58,218,58,58,58,246,212,
58,58,212,78,99,58,246,246,78,58,58,58,58,246,246,246,246,246,246,246,
246,246,246,212,246,246,246,246,246,246,246,78,78,78,78,78,58,78,58,78,
78,58,58,58,78,99,58,58,99,8,99,58,58,99,99,58,58,58,58,237,
78,78,58,78,78,246,78,246,78,246,78,246,246,246,246,246,246,246,246,246,
246,246,58,58,58,58,246,246,246,58,99,78,246,212,99,246,212,58,78,246,
58,246,58,58,58,212,218,12,118,58,58,71,12,49,19,49,237,41,65,49,
118,112,223,82,244,236,62,66,62,30,82,8,112,93,68,6,137,88,162,253,
253,20,253,19,223,23,244,244,54,242,54,242,244,62,112,49,223,20,20,20,
20,253,26,98,14,33,29,244,82,101,112,22,62,62,62,23,49,53,82,30,
112,22,243,243,208,11,71,118,12,218,99,58,58,58,12,71,58,58,58,58,
99,58,58,246,246,58,58,246,246,58,58,58,99,58,246,246,246,246,78,58,
246,212,246,246,246,246,246,212,246,246,78,78,78,78,58,78,78,78,78,58,
78,58,78,237,78,58,99,99,78,8,58,99,58,58,78,78,78,78,78,78,
58,78,78,58,78,246,78,212,246,246,246,246,246,246,246,246,246,103,246,246,
246,246,58,58,58,99,212,246,246,58,212,78,246,58,58,58,58,58,212,78,
78,78,58,58,58,58,123,49,218,99,11,118,223,223,82,237,41,208,23,118,
237,223,82,244,18,210,23,23,112,19,223,103,64,6,148,147,26,253,20,8,
66,23,54,111,219,219,137,24,76,24,163,25,137,42,204,42,151,109,244,223,
20,20,20,20,8,4,111,231,236,23,82,12,237,62,62,23,62,223,253,223,
237,244,22,41,245,103,11,112,118,71,218,58,58,99,92,92,128,58,58,58,
58,58,58,212,78,58,58,212,58,58,58,78,78,58,212,246,246,246,58,58,
212,246,212,246,246,246,246,246,246,212,246,78,246,246,78,78,78,78,78,58,
78,58,58,78,99,58,58,58,99,8,99,58,58,58,58,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,246,246,246,246,103,246,246,246,246,246,
246,78,58,58,58,58,58,212,58,58,78,212,78,78,99,58,58,212,78,246,
212,212,58,58,58,218,92,12,218,99,71,12,223,82,118,243,55,23,223,30,
223,19,244,93,54,49,23,112,82,82,245,153,138,234,162,8,253,101,49,30,
111,125,24,201,142,16,159,142,43,95,197,156,193,193,51,141,224,25,248,231,
65,118,20,20,20,20,121,210,231,55,244,82,49,30,244,62,62,244,223,20,
118,237,112,208,243,245,237,71,118,49,71,58,58,218,92,92,12,58,58,99,
58,58,212,78,212,212,58,58,58,58,58,212,78,58,58,246,246,246,99,58,
99,246,246,246,246,246,246,246,246,246,212,246,58,78,78,78,78,78,58,78,
78,58,78,78,58,78,58,99,58,8,99,99,58,58,58,78,78,58,78,58,
78,78,78,246,78,78,78,246,246,246,246,246,246,246,246,103,246,246,246,246,
246,58,58,58,58,58,58,58,58,58,78,78,246,78,58,58,58,212,78,58,
58,78,58,58,58,12,92,12,99,218,118,19,82,223,22,116,237,49,112,112,
101,112,93,109,70,112,118,82,223,55,136,185,44,26,253,253,82,62,107,163,
117,16,114,159,161,106,98,46,26,26,26,26,26,4,32,81,44,142,43,234,
10,56,236,23,20,20,20,8,4,219,225,237,19,82,11,244,62,54,62,223,
20,112,30,244,72,239,103,237,71,12,12,71,58,71,92,92,12,128,58,58,
58,58,246,78,246,58,58,58,99,58,58,246,78,78,58,246,246,58,58,58,
58,212,246,212,246,246,246,246,246,246,78,78,246,58,246,58,78,246,78,58,
78,58,78,78,58,58,58,58,58,8,58,58,58,58,78,237,58,78,78,78,
78,78,78,58,246,246,212,246,246,246,246,246,246,246,246,246,246,246,246,246,
78,58,58,58,58,58,99,58,58,246,246,246,58,246,58,58,58,78,246,218,
11,58,58,58,58,12,92,71,218,11,49,223,101,23,239,93,23,118,244,223,
223,65,29,70,70,112,82,82,72,233,135,152,121,253,20,49,242,179,176,39,
198,156,32,47,26,26,69,113,26,47,9,47,162,113,26,121,113,252,152,159,
43,234,217,238,30,253,20,251,8,4,107,17,30,82,223,22,62,62,54,244,
82,19,237,112,244,41,245,30,112,71,92,71,99,71,12,92,92,71,78,58,
58,246,246,58,78,212,58,58,58,58,58,78,246,58,99,58,212,58,58,58,
58,78,246,246,246,246,246,246,246,246,246,246,78,78,78,78,246,58,78,78,
58,58,58,99,58,99,58,58,58,8,58,99,99,58,58,78,78,58,78,58,
78,58,78,78,78,78,78,246,246,246,246,246,246,246,246,246,78,246,246,246,
58,58,78,58,78,58,58,99,58,78,58,246,246,58,58,58,212,58,58,12,
71,58,58,58,99,92,92,71,218,71,223,8,19,22,150,30,49,11,23,101,
30,93,54,49,112,49,20,30,254,181,95,26,253,253,49,65,163,166,206,202,
52,26,8,121,4,161,43,114,139,131,57,200,195,188,192,88,26,26,121,98,
197,67,234,145,230,22,82,20,20,8,98,107,100,112,253,112,103,244,54,62,
49,20,49,237,118,208,243,103,11,11,12,92,92,92,92,12,49,12,58,58,
78,58,246,78,246,78,212,99,58,58,78,246,58,78,58,58,58,99,58,58,
58,99,246,246,246,246,246,246,246,246,246,246,246,78,246,78,246,78,58,78,
78,58,78,78,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,78,78,78,78,246,246,246,246,246,246,246,246,246,246,246,58,212,58,246,
99,212,58,99,78,99,58,58,78,246,58,58,58,78,78,58,78,78,99,71,
12,71,58,58,12,12,12,71,11,12,223,101,49,243,100,118,223,112,82,19,
93,225,113,23,244,101,223,41,129,199,52,253,20,223,242,124,39,57,117,122,
121,121,47,44,195,35,94,196,165,189,189,189,27,84,200,139,67,186,26,121,
240,106,159,234,175,68,242,20,20,20,8,210,238,93,223,19,237,244,23,54,
62,19,101,244,112,30,243,208,237,11,12,92,49,223,12,12,92,12,58,78,
246,78,58,246,78,212,78,78,58,58,212,58,58,58,78,99,58,58,99,58,
58,58,246,246,246,246,246,246,246,246,246,246,78,246,58,78,58,78,78,78,
78,78,237,78,58,58,58,58,58,8,99,58,99,58,78,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,103,246,246,246,246,218,58,58,78,78,
58,99,71,12,58,78,58,78,58,78,123,12,78,78,58,212,78,78,123,92,
12,12,99,99,12,92,92,71,11,118,82,101,112,116,236,82,112,112,82,118,
100,110,66,23,49,101,244,215,73,43,69,253,101,23,219,59,97,202,52,8,
8,4,120,97,187,139,27,143,46,113,26,26,46,88,60,27,131,200,192,47,
82,66,81,159,234,170,68,118,20,251,20,26,2,64,244,101,118,22,23,62,
62,49,20,118,244,23,208,245,30,11,71,12,92,12,12,49,12,12,71,58,
246,246,78,246,78,246,58,78,58,78,212,218,12,246,78,99,58,78,78,11,
12,58,58,246,246,103,246,246,58,246,246,246,246,78,246,78,78,78,58,78,
78,58,58,58,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,212,78,246,246,78,99,58,246,246,246,246,246,246,71,12,99,58,58,99,
58,58,53,251,71,78,78,78,78,246,19,19,71,246,246,78,212,246,12,92,
12,12,12,12,92,12,12,71,218,118,19,101,244,239,65,223,244,11,53,112,
222,235,66,112,223,20,72,45,90,221,8,253,19,242,214,97,57,152,26,8,
26,188,57,187,139,186,8,8,8,8,121,121,8,8,26,4,44,131,94,67,
162,82,113,44,159,76,220,29,82,0,20,8,98,238,245,82,82,237,23,62,
54,112,20,223,237,49,22,245,237,11,71,49,12,92,12,12,12,12,71,78,
246,58,246,58,246,78,246,58,246,212,58,19,101,218,78,78,99,58,58,53,
101,71,58,246,246,246,78,71,92,58,246,246,212,246,78,58,58,78,78,58,
78,78,78,78,58,58,58,58,58,8,99,99,58,99,58,78,78,58,99,58,
78,78,58,246,78,58,71,92,218,246,246,246,103,246,12,92,92,58,58,58,
58,218,63,53,19,246,246,78,78,212,53,92,92,212,246,78,78,58,92,218,
12,12,92,92,92,12,12,71,11,118,101,101,22,116,242,223,237,11,8,30,
17,62,70,112,8,53,72,172,134,143,8,20,223,109,102,57,97,81,121,82,
252,114,35,157,165,26,253,8,8,46,182,4,26,26,8,8,113,160,190,35,
186,66,121,106,117,152,232,68,49,79,20,8,26,42,17,223,53,22,112,244,
54,244,8,82,30,118,30,245,30,11,99,12,12,92,123,12,12,12,71,78,
246,78,246,78,58,246,246,58,246,58,12,53,53,12,78,78,78,99,12,63,
63,92,78,78,246,246,78,229,229,12,246,246,246,212,78,71,71,58,78,78,
58,78,78,58,58,58,212,58,58,8,99,58,58,58,58,78,78,58,99,218,
99,58,246,78,78,58,12,92,12,78,246,246,246,218,92,92,19,71,58,58,
58,12,38,92,53,71,246,58,246,218,108,92,92,218,246,212,78,58,12,218,
12,12,12,92,12,92,12,71,71,118,82,8,103,116,242,82,244,11,82,30,
222,210,223,23,8,101,55,172,183,186,8,253,223,110,102,157,97,161,8,8,
127,67,190,140,189,26,8,8,69,127,120,5,52,26,26,8,121,9,84,187,
43,113,82,98,142,152,89,119,244,20,0,253,121,219,64,23,101,30,30,23,
54,244,82,101,30,112,112,72,237,71,30,12,12,92,118,12,12,12,71,58,
246,246,58,246,58,212,78,246,58,246,108,63,53,19,78,78,78,58,53,101,
53,108,78,246,246,246,108,79,20,53,246,246,246,78,99,92,92,12,99,78,
78,58,58,218,218,218,99,58,58,8,99,99,58,58,58,99,99,218,71,11,
99,99,78,246,212,71,218,71,92,71,246,246,246,71,92,92,19,19,58,58,
58,92,53,92,92,108,58,246,246,71,92,92,92,92,212,246,246,58,123,48,
12,12,12,92,92,12,12,12,99,118,19,101,237,116,65,49,30,112,82,244,
222,235,26,118,82,101,65,136,183,7,8,8,82,242,21,157,57,192,69,8,
26,7,191,157,190,60,9,8,26,52,84,131,60,4,121,8,26,113,67,94,
142,113,82,98,43,152,10,119,244,251,0,253,121,111,64,23,101,244,22,49,
62,62,82,101,112,23,112,103,30,71,11,12,12,118,12,12,118,12,71,78,
78,246,78,58,218,58,78,246,246,12,53,101,53,19,58,78,58,12,63,63,
53,63,218,246,246,71,79,20,63,101,218,246,246,218,12,19,108,12,99,58,
99,71,218,71,71,218,71,218,71,8,99,58,99,99,58,58,11,218,71,218,
71,71,218,58,58,99,218,99,71,92,218,78,246,92,92,12,223,53,71,58,
58,19,19,92,92,19,12,78,78,12,92,92,92,92,71,78,78,218,123,241,
48,12,12,92,49,12,118,12,71,49,223,101,11,116,65,66,112,11,82,112,
100,54,66,66,223,20,244,105,90,159,8,8,8,244,10,167,187,202,98,8,
121,47,192,169,190,35,195,188,188,195,57,84,106,47,8,8,8,122,195,140,
95,66,82,98,142,221,175,119,244,251,251,20,8,219,64,112,101,30,242,118,
23,62,19,20,11,118,112,22,11,11,99,12,12,12,12,71,12,118,71,58,
246,58,246,99,12,99,212,78,58,19,53,53,101,53,58,78,218,53,101,53,
53,63,218,246,246,63,0,101,19,53,12,78,58,12,108,92,19,108,92,71,
71,12,71,71,123,71,71,123,71,8,99,99,58,58,58,11,58,11,99,218,
99,11,99,99,218,99,218,99,71,12,12,99,99,92,92,92,12,19,53,71,
99,38,53,12,12,92,19,218,212,92,92,92,48,12,108,128,246,218,123,48,
128,123,12,12,12,12,12,118,71,71,223,8,112,41,55,49,49,244,223,49,
93,231,70,82,223,20,82,116,181,158,252,8,20,223,242,214,57,157,156,46,
8,66,26,147,44,198,86,196,86,198,44,52,4,8,8,8,46,60,97,194,
52,82,82,180,159,177,232,64,66,79,20,8,26,231,100,49,8,237,62,23,
62,244,82,82,30,223,11,237,112,11,11,12,12,71,12,12,118,12,71,218,
246,78,58,218,92,99,246,212,92,53,79,79,53,53,218,58,19,63,38,126,
53,101,92,58,19,251,63,223,19,19,92,71,12,223,92,223,223,92,19,92,
12,71,123,71,71,71,71,71,71,8,11,58,11,58,99,58,99,58,99,58,
58,218,218,218,99,218,11,99,99,71,92,92,12,49,92,71,99,12,53,53,
92,20,53,123,48,12,92,19,218,19,92,12,241,48,92,92,58,218,92,241,
128,212,71,12,118,12,12,71,71,112,223,19,82,55,116,112,49,244,223,19,
208,238,235,66,223,253,82,22,250,73,95,113,8,82,49,111,102,207,132,188,
252,69,8,121,162,4,47,52,127,4,4,26,26,8,8,46,186,86,169,95,
66,8,4,95,192,87,45,236,101,251,253,8,70,222,236,223,223,237,244,23,
54,244,82,82,237,118,11,244,71,11,99,71,118,12,12,12,12,12,12,58,
78,78,246,123,108,12,212,12,53,63,13,83,63,53,12,92,53,226,13,13,
53,53,53,226,75,63,12,71,92,19,19,92,92,92,19,12,12,12,92,12,
71,71,71,71,71,12,71,71,71,8,99,99,58,99,99,58,58,99,58,58,
11,218,71,71,11,218,99,99,58,218,12,19,92,92,92,99,78,58,92,101,
75,251,53,12,123,48,92,108,101,63,92,12,241,241,92,92,108,92,108,128,
212,246,58,12,12,12,49,12,12,118,12,49,19,237,116,22,49,118,244,82,
112,17,231,70,223,82,20,82,93,45,133,7,46,8,8,49,50,224,168,207,
142,60,127,46,8,26,8,8,8,8,8,8,121,26,47,192,166,169,7,113,
66,113,7,156,36,217,28,23,251,251,20,26,111,222,30,8,49,22,112,62,
242,112,101,112,30,49,244,11,112,11,99,71,12,12,118,12,12,12,71,246,
246,78,212,92,108,92,218,53,38,13,0,0,63,101,20,63,101,75,83,83,
63,101,229,79,126,92,58,78,12,19,92,92,19,92,12,71,71,118,71,71,
218,12,71,71,71,71,71,218,99,8,218,99,218,58,58,218,99,99,58,99,
58,58,99,99,218,99,218,99,58,58,99,92,92,92,19,58,78,78,99,108,
0,34,38,123,123,48,123,92,53,108,92,12,241,241,241,123,92,19,19,123,
241,212,246,99,12,71,12,71,12,71,118,223,82,118,245,100,112,49,30,118,
223,237,238,111,113,223,19,20,49,93,144,184,44,113,8,253,19,210,173,141,
168,57,196,142,60,52,122,182,113,113,122,3,60,159,130,86,43,122,26,223,
47,106,95,76,89,68,244,20,251,20,8,210,238,72,223,19,30,112,23,62,
244,223,20,118,112,112,244,118,11,99,99,218,71,218,71,12,12,71,58,58,
78,246,246,92,63,53,53,101,83,0,83,83,53,63,63,53,20,83,0,0,
53,53,79,0,226,78,58,78,12,108,92,19,92,71,58,58,99,71,71,123,
71,218,218,71,218,218,99,218,99,8,99,99,218,218,99,99,99,99,58,99,
99,58,99,11,71,99,99,58,58,58,58,71,92,92,19,78,78,58,78,218,
53,63,101,123,123,48,48,123,92,19,92,92,241,241,241,241,92,92,92,12,
241,212,78,78,123,118,12,12,12,12,112,92,49,223,30,247,65,49,23,112,
82,23,72,231,14,26,82,19,101,49,17,146,102,154,147,69,8,82,49,23,
249,104,158,39,206,169,86,130,202,142,202,114,39,117,76,88,4,66,66,113,
7,95,234,175,68,22,101,20,251,8,4,107,100,112,101,112,30,23,112,62,
49,101,49,244,118,112,112,118,11,78,99,99,99,58,71,12,92,99,246,78,
246,58,218,108,108,53,63,229,0,83,34,13,53,53,101,38,13,0,0,13,
53,101,63,101,99,78,58,78,71,19,19,92,71,58,99,58,11,218,218,71,
99,99,99,99,218,58,99,218,218,8,71,218,99,99,218,58,99,99,99,99,
99,58,99,58,99,218,11,58,58,99,58,58,71,92,92,58,78,78,78,78,
118,19,53,123,48,128,128,48,123,12,92,92,48,128,212,48,241,12,12,92,
241,128,246,246,246,71,12,12,12,71,71,118,49,223,49,208,116,22,49,23,
11,223,223,72,225,235,113,82,82,101,49,65,68,164,201,7,162,26,8,121,
66,223,23,216,14,36,177,152,154,152,80,255,98,66,66,223,66,4,32,152,
152,163,228,222,112,251,20,20,8,113,219,222,22,82,23,22,62,112,54,244,
101,82,112,112,23,118,112,11,11,78,58,58,246,99,71,71,99,58,246,212,
58,58,123,108,108,53,20,13,101,19,34,13,53,53,53,0,75,38,0,34,
63,53,53,71,58,78,58,78,11,92,92,71,58,58,58,58,99,218,11,99,
11,58,218,218,99,99,218,99,99,8,99,71,99,99,99,99,99,218,58,99,
218,58,99,99,99,58,58,78,58,99,58,58,58,71,12,78,78,78,78,78,
58,12,19,12,48,218,246,218,48,12,92,92,241,48,58,212,48,241,12,92,
48,241,212,58,212,212,123,118,12,71,118,118,12,223,49,118,55,239,244,223,
112,112,82,118,236,225,14,4,26,82,101,19,112,93,153,21,224,174,88,162,
26,26,121,82,66,66,66,66,66,66,26,82,66,26,113,127,32,44,51,87,
248,222,236,223,20,20,20,8,70,111,17,237,223,49,237,30,62,54,30,118,
253,49,112,118,23,118,118,11,99,58,58,58,212,99,71,218,246,78,78,58,
58,58,108,108,63,38,13,92,58,12,13,251,53,63,251,79,12,71,34,34,
251,53,19,58,78,78,78,58,58,71,71,58,99,99,58,99,58,11,58,99,
99,99,99,218,218,99,218,218,99,8,71,99,218,218,218,99,218,99,99,99,
99,71,58,99,99,99,99,58,58,99,58,58,78,58,99,78,58,78,58,78,
78,78,99,218,128,58,58,78,128,48,12,92,123,241,78,246,58,48,241,218,
12,128,212,212,58,58,212,218,71,12,71,12,118,12,223,49,11,243,55,244,
49,112,244,223,49,236,17,111,4,121,82,82,8,223,244,29,153,61,148,234,
152,32,147,52,4,4,113,26,113,26,98,98,147,255,7,193,24,163,217,238,
110,112,101,20,20,253,8,70,107,222,22,223,223,244,244,244,244,242,112,82,
223,118,23,23,49,118,71,11,58,58,58,246,246,58,99,78,58,212,212,78,
58,99,53,53,38,83,19,58,246,19,34,79,251,34,34,71,58,71,79,13,
83,63,218,58,58,99,58,78,58,99,78,58,99,99,99,58,58,99,99,58,
218,11,218,99,11,218,11,99,71,8,71,218,218,11,71,99,218,99,99,99,
99,218,11,99,58,58,58,58,11,58,99,218,58,58,78,78,78,78,58,58,
78,78,78,78,58,78,78,78,58,58,48,123,48,48,128,78,246,78,128,241,
241,241,128,212,58,58,58,58,218,12,118,71,71,112,118,223,49,11,245,55,
30,49,112,244,223,19,30,93,107,111,4,26,101,101,8,101,112,242,93,203,
6,170,21,74,51,51,104,24,234,76,24,104,76,124,232,56,225,18,30,223,
20,20,20,20,8,66,235,231,236,112,223,118,30,112,112,54,244,112,82,49,
112,23,118,118,12,11,99,99,246,58,58,58,78,58,246,246,78,78,212,78,
58,12,53,229,34,40,78,78,58,38,0,13,13,79,71,58,58,71,13,0,
38,71,58,99,58,99,58,99,78,58,58,99,99,99,71,99,58,99,218,99,
71,99,218,99,99,71,218,99,71,8,71,71,71,123,218,218,11,218,218,218,
218,99,218,218,99,99,99,99,58,99,99,99,99,99,58,78,78,58,58,99,
99,78,78,246,78,212,78,78,58,78,128,48,48,241,48,246,78,58,246,128,
128,128,128,128,212,78,212,78,58,218,71,71,12,12,118,118,49,49,112,208,
41,22,49,112,244,23,19,49,22,93,219,14,4,8,82,101,20,101,223,49,
30,65,18,29,17,203,228,230,56,96,91,225,225,236,242,112,49,82,20,20,
20,20,82,113,210,107,29,22,118,223,112,30,244,244,62,112,23,82,223,49,
118,118,49,49,118,71,99,246,58,58,212,246,246,78,212,58,246,246,78,58,
218,53,209,126,40,78,78,78,218,0,34,34,79,71,78,99,58,71,251,229,
12,58,99,99,99,58,58,58,58,99,99,99,99,218,99,58,99,99,99,218,
99,218,11,218,218,11,218,71,71,8,71,123,71,71,218,123,71,99,11,99,
218,11,99,71,218,99,58,99,99,58,218,218,99,99,58,58,58,58,99,58,
58,99,58,246,246,246,78,58,58,58,78,58,48,48,241,78,246,78,78,58,
58,241,241,241,212,58,246,78,246,58,218,71,71,71,118,118,118,49,49,112,
103,243,236,112,49,244,112,49,223,118,65,93,107,14,98,113,82,8,101,253,
101,20,101,82,82,223,118,118,49,49,49,82,82,101,101,20,20,253,253,121,
26,70,235,110,29,103,118,223,223,11,244,244,54,242,244,49,19,223,49,118,
118,49,12,71,11,99,212,246,78,78,78,78,212,246,78,58,78,212,78,58,
12,38,213,71,78,58,58,78,40,83,79,20,99,58,99,58,99,12,92,71,
78,58,99,99,99,99,99,99,99,99,218,218,99,218,218,99,218,218,11,218,
11,218,218,71,218,218,71,123,71,8,71,71,12,71,71,218,218,218,71,71,
218,218,218,218,71,218,218,99,99,218,99,99,99,99,99,99,58,99,58,99,
99,99,99,58,78,78,78,78,58,99,58,58,58,128,48,128,78,78,58,78,
212,212,212,241,128,58,246,246,58,246,58,218,218,118,71,71,118,12,118,49,
23,237,245,55,208,23,118,23,112,223,223,118,244,236,18,110,14,210,4,66,
121,8,82,20,82,101,101,251,20,20,20,101,8,20,8,8,26,26,210,235,
109,110,65,30,118,223,49,244,244,244,244,242,65,30,223,82,49,118,118,49,
92,49,118,71,11,78,246,78,58,246,212,246,78,78,246,78,246,78,212,218,
53,92,99,78,58,58,58,246,53,0,53,99,99,58,99,58,99,71,218,58,
99,58,99,218,58,99,58,78,99,99,11,99,71,99,99,218,99,99,218,71,
123,218,71,218,12,71,71,71,71,8,71,71,71,71,71,118,71,71,218,99,
71,71,71,123,71,71,218,99,99,218,218,71,11,218,99,99,58,99,58,99,
99,99,218,58,58,78,78,78,58,99,99,58,58,58,58,128,246,78,58,58,
58,58,246,128,128,58,212,246,78,78,78,58,58,218,71,71,11,118,118,49,
12,23,11,103,243,72,237,23,23,112,23,223,19,223,112,22,109,18,29,111,
111,210,210,70,4,26,26,26,26,26,26,4,4,70,98,235,2,18,29,65,
54,23,223,49,23,244,244,112,244,54,22,244,118,82,223,223,118,92,49,49,
223,71,11,99,99,78,246,58,246,78,58,212,78,78,58,58,246,78,58,218,
71,78,58,58,99,58,58,99,19,77,58,58,58,218,99,58,58,58,58,58,
218,99,11,218,58,99,218,58,218,218,71,218,218,71,99,71,218,71,71,218,
71,123,71,71,71,71,71,71,12,8,118,118,71,71,118,71,71,71,118,12,
71,123,71,71,71,71,71,71,218,99,99,99,218,218,71,218,99,99,58,99,
99,218,99,218,58,58,246,78,78,99,99,99,99,58,246,78,58,246,58,58,
58,58,58,78,78,58,58,58,246,212,99,58,58,58,218,99,71,118,11,118,
49,49,49,23,11,208,55,245,22,112,23,23,23,23,49,49,49,223,112,30,
22,236,18,18,18,29,18,18,18,18,107,236,29,236,236,22,30,23,223,223,
223,118,118,112,244,112,244,242,242,30,23,223,82,223,49,49,49,223,49,12,
71,71,99,58,246,212,58,58,58,78,78,78,58,58,58,58,78,212,246,78,
78,58,58,11,99,58,78,78,99,58,58,99,218,99,58,99,58,58,58,218,
99,71,218,99,218,58,99,218,218,71,218,123,71,99,71,218,71,71,71,12,
71,71,12,12,12,12,12,12,12,8,12,12,12,12,12,12,118,118,71,71,
71,218,71,123,71,71,71,71,123,71,218,11,218,71,218,123,218,99,218,58,
99,99,11,218,71,99,99,58,78,58,99,99,71,99,58,78,246,246,246,58,
58,218,58,99,78,78,246,78,78,246,58,58,58,212,58,58,99,71,71,118,
71,118,118,23,49,112,112,103,72,72,65,244,112,23,118,118,70,223,223,223,
223,49,118,23,118,112,112,244,112,112,23,23,23,49,49,223,223,49,23,118,
244,244,112,62,244,109,22,30,49,223,223,82,49,223,49,223,223,118,118,71,
99,99,99,78,78,246,58,58,78,78,58,58,58,99,78,246,78,78,78,78,
99,99,99,58,99,58,78,78,58,99,99,11,218,99,99,58,58,11,99,218,
218,218,71,99,218,218,11,218,123,71,218,71,71,218,71,71,123,71,118,12,
71,12,12,12,12,12,12,12,12,8,12,12,12,12,12,12,71,71,71,118,
71,118,71,71,118,12,71,71,71,71,99,218,123,71,218,71,218,71,99,99,
99,218,218,71,218,218,99,58,58,58,58,218,99,218,218,99,58,99,78,58,
58,99,99,99,58,58,78,246,246,78,78,78,58,99,58,58,99,58,99,71,
11,71,12,23,118,118,118,23,112,30,103,208,208,65,242,112,118,23,23,118,
118,118,49,112,23,112,11,112,112,112,118,49,49,49,49,112,23,23,112,244,
244,22,22,22,242,112,49,223,223,66,223,49,223,49,223,49,12,71,71,99,
99,58,212,212,246,58,78,78,58,58,99,99,99,58,78,78,78,78,58,58,
99,99,99,58,58,58,58,58,99,218,71,218,99,99,218,58,99,99,71,218,
71,71,218,99,71,99,123,71,118,118,123,71,71,123,71,71,12,12,118,12,
12,12,12,12,12,12,71,12,71,8,12,92,12,92,71,12,118,118,12,12,
118,71,71,12,71,71,118,12,12,71,118,218,71,71,71,12,71,12,218,218,
99,99,218,218,71,71,71,218,99,99,99,99,71,71,218,71,99,58,58,58,
58,58,99,11,99,99,99,58,246,78,246,78,58,99,99,99,58,58,99,99,
99,11,71,112,112,118,118,92,118,23,118,112,30,237,103,65,65,22,30,54,
244,244,23,112,244,112,244,112,244,23,244,23,112,62,244,244,30,242,22,242,
22,30,23,49,49,19,82,223,223,49,49,49,223,49,12,11,11,218,99,58,
58,78,78,78,246,78,78,99,99,58,99,58,58,78,78,78,58,99,218,218,
71,99,99,99,58,99,58,99,71,123,71,218,99,99,218,99,218,71,12,71,
71,218,71,71,218,71,71,71,71,71,12,71,71,71,118,12,12,12,71,71,
12,12,12,12,118,12,12,92,12,8,12,12,71,12,12,12,12,12,71,12,
118,12,12,12,118,12,71,12,12,71,71,71,71,123,71,12,12,71,71,218,
218,218,11,71,123,71,71,218,71,99,99,58,99,99,71,218,218,99,218,58,
58,58,58,99,218,71,99,218,58,58,58,246,212,58,58,99,99,58,99,58,
58,58,58,218,71,71,112,71,118,118,49,23,118,118,49,112,112,30,237,22,
22,22,103,22,22,22,22,22,30,242,22,22,22,103,22,22,30,112,112,23,
49,49,49,82,223,66,49,49,49,49,223,12,118,71,218,99,99,58,99,58,
78,246,78,246,58,58,99,99,218,218,99,99,99,58,58,58,99,218,71,218,
99,99,58,58,58,99,218,123,71,71,218,218,99,99,99,123,71,71,71,92,
71,71,218,218,71,12,12,12,118,71,12,118,71,71,71,12,12,12,12,12,
12,12,118,118,12,12,12,12,12,8,92,92,92,12,12,12,12,12,12,12,
92,12,12,12,71,12,118,12,12,12,12,12,71,71,71,12,12,71,118,71,
71,123,71,71,71,118,71,71,71,123,71,218,218,99,218,71,12,71,71,218,
218,58,58,99,58,71,71,218,218,218,99,58,58,58,58,58,99,99,99,218,
218,99,58,58,99,99,99,11,11,11,23,112,118,112,49,118,118,118,23,118,
49,118,23,112,112,112,112,244,112,112,118,112,118,49,49,223,49,223,223,49,
223,223,49,49,223,49,223,223,118,118,71,11,218,99,218,99,218,78,58,58,
58,58,58,218,218,218,218,218,58,99,58,58,58,58,218,99,71,71,123,71,
218,99,58,99,99,71,71,12,12,71,71,71,218,218,218,71,118,71,71,12,
123,71,12,71,71,12,12,12,118,71,12,12,12,118,118,12,71,118,12,118,
12,12,12,12,12,92,12,12,92,8,92,92,12,12,92,12,92,12,12,12,
12,12,118,12,12,12,12,12,12,12,118,12,12,71,118,71,12,12,71,118,
71,71,71,123,218,118,12,71,71,71,71,99,99,218,218,71,71,71,71,71,
99,218,99,58,99,218,218,71,71,71,218,71,58,99,58,58,99,58,218,99,
99,218,99,99,58,58,58,99,58,99,218,11,71,112,11,112,118,23,118,23,
49,118,118,92,49,92,49,92,49,92,49,223,223,49,223,49,49,49,49,82,
49,49,49,223,118,118,71,71,11,71,99,218,218,99,58,58,58,58,58,58,
58,218,218,218,71,218,218,99,99,99,99,58,218,218,71,123,71,71,218,11,
99,99,218,218,71,71,12,71,12,218,218,218,71,218,118,12,71,118,71,71,
71,71,71,71,118,71,12,12,12,71,12,12,12,12,12,12,12,49,12,12,
12,92,12,49,12,92,12,12,92,8,92,92,92,92,92,12,92,12,12,92,
12,92,12,92,12,71,71,12,12,12,12,71,12,118,71,118,71,118,12,12,
12,12,71,71,218,71,71,118,118,12,12,118,71,218,71,218,123,12,12,12,
12,71,71,99,99,99,218,71,71,71,71,123,71,218,218,58,99,99,58,218,
99,218,218,11,99,218,99,218,218,58,58,58,99,218,71,11,71,71,118,11,
112,71,112,118,112,12,118,118,118,118,118,118,118,118,118,118,223,223,49,49,
118,118,118,71,71,71,218,71,218,71,99,99,99,218,58,58,58,218,218,218,
218,71,71,218,123,71,218,99,58,218,218,99,71,118,12,71,71,71,218,218,
218,99,71,118,12,12,12,71,71,123,71,71,71,12,118,12,92,71,118,71,
12,12,71,12,12,92,12,12,12,118,12,12,12,12,12,92,12,12,12,92,
71,92,12,92,92,92,92,92,12,8,92,92,92,92,92,92,92,92,92,12,
92,12,92,12,92,92,12,118,92,12,12,92,92,12,12,12,12,12,12,12,
12,12,71,118,12,118,71,71,12,12,12,12,118,71,218,71,218,71,118,12,
12,71,12,71,218,71,99,218,123,71,71,12,71,118,71,71,99,218,218,99,
218,99,218,218,218,71,123,71,218,218,218,218,99,99,99,58,99,99,99,218,
99,71,71,71,11,71,11,11,11,11,11,11,11,11,71,118,12,118,218,218,
71,218,71,71,218,71,99,71,99,99,99,58,218,99,218,218,71,71,71,71,
71,71,123,71,11,99,99,99,218,218,71,71,12,12,12,71,123,218,71,218,
71,118,71,12,118,12,12,71,71,218,118,12,12,12,92,12,71,118,71,71,
12,71,92,12,92,12,12,12,118,12,12,92,92,12,92,12,92,92,92,92,
92,92,92,92,12,92,92,92,92,8,92,92,92,12,92,92,92,92,92,92,
92,92,92,12,92,92,12,12,92,92,92,12,92,92,12,12,118,12,12,92,
92,12,12,12,71,71,71,118,12,118,12,12,12,71,12,71,71,71,71,12,
12,12,118,12,12,118,218,71,71,71,12,71,71,71,12,12,71,71,71,11,
218,99,218,218,218,218,71,71,71,71,71,71,71,71,218,218,218,218,99,218,
218,218,99,218,99,218,218,218,218,218,218,218,218,99,218,11,218,71,71,71,
71,123,71,123,71,218,99,218,218,11,218,99,71,71,71,71,71,71,71,92,
71,71,71,123,71,218,71,71,71,118,12,12,12,12,71,71,71,218,71,71,
12,12,12,12,12,12,12,71,71,71,12,12,12,12,12,12,12,12,118,12,
12,92,92,92,12,92,12,71,12,92,92,12,92,92,92,92,92,12,92,92,
92,92,92,92,92,92,92,92,92,8,92,19,92,92,92,92,92,223,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,12,118,12,12,
12,92,92,12,92,12,12,12,71,12,49,12,92,92,12,12,71,12,12,12,
12,71,12,12,12,12,71,12,71,71,218,218,71,118,12,12,12,71,12,12,
71,123,71,71,99,71,71,123,71,123,71,123,71,71,71,71,71,71,71,71,
71,218,218,218,71,71,218,71,218,71,218,71,71,123,71,123,71,123,71,123,
218,71,218,218,218,218,71,71,71,71,71,12,12,12,12,12,12,12,71,71,
71,123,218,218,71,71,12,12,12,71,12,12,12,12,71,71,71,12,118,12,
12,92,12,12,12,12,12,12,71,12,92,12,92,12,12,118,12,12,12,92,
92,92,92,92,92,12,92,92,12,92,92,92,92,19,12,92,92,92,92,92,
12,92,92,92,92,92,92,92,92,8,19,108,19,108,12,19,92,92,92,92,
92,92,92,92,92,19,92,92,92,92,92,92,92,92,92,92,92,92,12,92,
92,92,92,92,92,92,12,12,12,12,71,12,92,92,92,92,12,92,118,12,
12,12,12,12,92,12,12,12,71,12,71,71,71,12,12,12,12,12,12,92,
112,118,71,12,71,71,71,218,71,71,71,71,71,71,12,12,12,12,12,12,
12,118,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
71,71,71,71,71,71,71,71,118,71,12,71,12,12,12,12,12,71,71,123,
71,71,71,92,12,12,12,12,92,92,71,12,12,12,12,71,12,12,92,12,
92,92,12,118,12,12,118,12,12,92,92,92,92,12,12,12,12,92,92,92,
92,12,92,12,92,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,19,19,108,92,8,92,92,19,92,108,92,19,92,92,92,
92,108,92,92,92,12,92,92,12,92,92,92,92,92,92,92,92,92,92,12,
12,92,92,92,92,223,12,92,12,12,12,12,12,92,92,12,92,12,12,12,
12,12,12,12,49,12,92,92,92,92,12,12,71,12,12,12,12,12,12,12,
92,92,118,92,12,12,118,12,12,12,12,12,12,71,12,12,12,12,12,12,
12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
12,12,118,118,12,118,12,12,12,12,12,12,12,12,12,12,12,12,71,12,
12,12,71,92,12,92,92,49,12,12,12,12,118,12,12,118,92,12,92,92,
12,12,12,12,123,12,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,92,92,19,92,92,108,
92,19,92,108,108,92,108,92,108,8,19,108,19,92,19,108,108,108,92,19,
92,92,19,92,108,108,92,108,108,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,12,12,12,12,12,12,92,92,92,92,92,92,12,12,12,12,12,118,12,
12,12,12,92,12,12,12,12,71,12,12,12,12,71,71,12,12,71,118,118,
12,12,12,12,12,118,12,12,12,92,12,12,12,12,12,71,12,12,118,12,
12,71,12,12,12,12,12,92,118,118,12,12,12,12,71,12,12,12,49,12,
92,12,92,92,92,12,92,12,12,12,12,12,92,92,92,92,92,92,92,92,
12,12,71,92,92,92,12,92,223,92,92,92,12,92,92,92,92,92,12,19,
92,92,92,92,92,92,108,92,108,19,92,108,108,108,92,92,19,108,92,108,
19,92,19,92,108,92,108,19,19,8,19,108,19,108,108,19,92,19,108,19,
19,108,108,19,19,92,108,92,92,108,19,12,108,108,92,19,108,108,92,19,
92,92,92,92,92,92,108,19,92,92,92,92,12,92,92,92,92,92,92,92,
92,92,92,12,12,118,123,92,12,12,92,92,92,92,92,92,12,12,12,12,
12,92,12,12,92,12,92,92,92,92,92,92,12,12,12,12,12,12,12,71,
71,12,12,12,12,12,12,12,71,12,12,12,12,12,12,92,12,12,92,12,
92,12,12,49,12,92,12,12,12,12,12,71,12,12,12,12,92,12,92,12,
92,92,92,92,92,12,12,12,12,92,12,12,92,92,92,92,92,92,12,12,
12,92,92,92,92,19,108,92,92,92,92,92,92,92,92,19,92,108,108,92,
92,92,92,19,108,92,19,108,92,108,108,92,19,92,108,19,108,92,108,92,
19,108,108,92,108,108,19,92,108,8,19,19,19,19,19,108,19,19,108,92,
19,19,108,92,19,19,108,19,108,92,108,19,92,19,92,92,92,19,92,92,
92,92,92,92,92,92,19,108,92,19,19,92,92,92,92,92,92,92,223,92,
223,92,92,92,92,92,92,92,92,92,92,92,92,223,92,92,92,12,92,12,
12,12,12,12,92,12,12,92,12,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,92,49,92,12,92,92,12,12,92,12,92,12,92,12,12,92,12,
12,12,12,12,12,12,12,92,92,92,12,92,92,92,92,92,92,92,92,92,
92,92,12,12,12,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,19,92,92,108,12,92,92,92,12,19,92,92,108,92,19,19,92,
92,92,92,92,108,19,92,19,19,92,92,108,108,92,108,92,19,19,19,108,
19,19,19,19,19,19,108,19,19,8,19,53,19,53,19,53,19,53,19,108,
19,108,19,108,108,108,19,108,19,108,19,108,108,108,108,19,108,19,108,19,
19,92,108,19,19,12,108,92,108,92,108,19,108,92,92,92,92,92,92,19,
92,19,108,92,19,92,92,92,92,92,92,92,92,92,92,92,108,108,19,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,92,92,92,12,92,19,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,108,19,92,92,223,92,92,92,92,92,92,
19,108,108,108,108,19,92,92,92,92,108,108,108,108,108,92,108,92,108,19,
92,19,108,108,19,108,108,108,108,108,19,19,19,19,19,19,108,108,53,19,
108,19,108,53,19,53,19,53,19,8,19,19,19,19,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,108,19,108,19,
19,19,19,19,108,19,108,19,108,19,108,19,19,19,19,108,19,92,92,92,
19,19,108,19,108,19,19,92,92,92,92,92,92,92,92,19,19,108,19,108,
19,92,19,92,92,92,92,92,92,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,19,19,19,92,19,19,92,19,19,108,92,92,92,19,92,92,92,
92,92,92,92,92,19,19,19,19,108,19,108,92,92,92,92,92,92,19,19,
92,19,223,19,108,19,108,92,19,19,19,19,19,19,108,19,108,19,108,19,
19,19,19,19,19,19,19,19,19,108,19,108,19,108,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,8};

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
DigitalSignature

File diff suppressed because it is too large Load Diff

View File

@ -1,70 +0,0 @@
-------------------------------------------
GIMP-Plug-In (Digital Signature)
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
If you find that the plug-in is too big,
you can compress the executables with the
gzexe program (if it is avaiable on your
system). To do so, change to the plug-in
directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,43 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = DigitalSignature
DigitalSignature_SOURCES = \
DigitalSignature.c logo.h
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
DigitalSignature_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,70 +0,0 @@
-------------------------------------------
GIMP-Plug-In (Digital Signature)
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
If you find that the plug-in is too big,
you can compress the executables with the
gzexe program (if it is avaiable on your
system). To do so, change to the plug-in
directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,788 +0,0 @@
/* GIMP header image file format (Indexed): //logo.h */
static unsigned int logo_width = 200;
static unsigned int logo_height = 72;
/* Call this macro repeatedly. After each use, the pixel data can be extracted */
#define HEADER_PIXEL(data,pixel) \
pixel[0] = palette_data[data[0]*3+2]; \
pixel[1] = palette_data[data[0]*3+1]; \
pixel[2] = palette_data[data[0]*3+0]; \
data--;
static unsigned char
palette_data[] = { 4,2,2,4,110,178,32,4,122,4,36,
86,15,3,66,4,58,127,36,8,186,4,34,122,17,2,
34,4,19,66,12,4,162,90,2,69,88,2,48,7,20,
2,25,2,103,8,14,48,4,58,186,90,3,154,82,2,
129,55,2,34,17,2,18,17,34,191,94,2,101,57,2,
70,7,32,154,12,22,157,17,3,50,4,88,150,96,3,
186,86,2,138,87,2,86,212,214,210,4,19,98,52,2,
154,15,11,2,4,132,216,7,18,125,12,6,82,37,12,
18,4,88,189,86,14,48,128,2,157,32,4,138,4,60,
155,4,48,126,60,2,218,7,10,52,13,12,66,129,2,
50,56,2,52,52,14,98,4,47,157,6,20,87,48,2,
24,58,2,101,120,2,141,52,5,170,4,113,215,127,2,
73,4,90,210,4,52,112,36,18,194,59,2,85,42,2,
10,107,2,173,95,2,114,31,3,52,4,79,160,84,3,
189,14,10,40,30,2,69,96,2,58,113,2,126,9,37,
231,17,33,170,28,14,2,4,30,146,68,10,37,132,2,
82,23,4,7,4,10,122,4,36,108,32,2,37,7,27,
2,4,98,175,84,10,146,4,101,191,4,14,146,8,29,
86,4,2,170,8,60,230,84,10,162,72,2,39,102,2,
142,4,142,221,4,49,143,68,12,170,4,124,213,15,4,
74,114,2,69,112,2,158,32,3,23,8,50,190,111,2,
104,6,40,154,96,2,210,6,28,104,60,2,138,61,2,
25,68,2,114,58,2,125,39,2,114,73,2,69,16,4,
58,4,88,177,56,14,26,138,2,173,4,68,176,71,2,
55,76,2,210,4,78,130,17,3,42,6,27,69,112,2,
49,12,26,178,47,13,159,18,11,10,13,11,74,141,2,
58,52,18,234,4,82,186,4,126,198,4,103,213,4,62,
206,4,72,226,12,46,210,72,12,222,12,26,146,20,34,
210,4,113,197,4,131,229,4,48,170,4,76,170,7,43,
95,52,30,218,15,11,170,52,14,202,12,14,86,4,40,
174,108,14,202,156,2,186,60,12,130,5,40,129,73,13,
189,12,42,138,44,14,202,4,59,143,4,124,229,4,69,
191,4,69,157,4,60,114,4,43,110,14,14,58,20,26,
157,28,26,210,4,87,162,4,91,202,4,110,226,4,98,
226,4,101,202,17,14,186,28,18,18,60,2,234,28,10,
114,4,30,114,8,10,162,12,54,186,20,26,130,100,10,
170,40,18,154,4,22,114,28,26,234,4,22,58,4,66,
226,4,54,202,12,42,202,4,38,98,4,145,234,4,76,
146,4,94,148,4,138,213,4,94,186,4,54,126,4,54,
154,4,118,211,4,106,178,4,106,188,4,54,142,4,94,
170,4,70,202,4,118,197,4,54,173,4,82,178,72,4,
172,36,10,138,76,14,162,4,98,210,4,118,226,112,2,
114,24,19,8,30,2,85,84,6,226,141,2,73,28,30,
10,28,46,186,112,4,206,36,10,90,36,2,174,108,2,
58,41,3,130,44,10,194,9,33,130,92,2,162,51,2,
42,12,32,162,81,3,146,44,11,26,28,6,146,44,2,
178,30,12,10,60,10,178,64,2,146,28,10,178,92,10,
210,5,41,146,40,2,102,96,2,125,100,2,88,74,2,
157,142,2,159,26,10,55,143,2,50,73,2,102,134,2,
142,73,2,84,127,2,126,142,2,82,156,2,178,28,10,
158,28,26,114,84,14,202,12,4,10,5,20,74,17,2,
26,92,2,194,7,19,106};
static unsigned char header_data[] = { 71,99,218,218,99,11,71,218,71,71,
218,99,99,99,71,99,218,99,99,99,99,218,71,218,99,218,218,99,99,218,
218,99,99,218,99,218,99,58,218,99,99,99,58,218,99,99,99,58,99,58,
99,58,11,58,99,58,58,11,99,58,99,58,99,99,99,218,99,218,99,58,
99,71,99,218,71,12,12,12,12,12,12,12,12,12,92,19,19,19,92,92,
92,92,19,108,19,19,19,19,19,19,53,53,53,53,101,19,19,53,53,19,
19,19,12,92,92,12,12,12,71,71,218,99,218,218,71,71,12,12,218,99,
58,58,58,99,99,99,58,99,99,99,11,58,11,58,58,99,58,99,99,99,
58,99,99,99,99,58,99,99,99,99,99,218,99,99,11,99,99,99,11,99,
99,218,218,218,99,218,99,99,218,218,99,99,218,99,218,218,99,99,218,11,
218,71,99,218,99,218,218,99,71,8,218,99,218,218,99,99,99,99,99,99,
218,218,99,99,218,99,218,99,218,71,99,99,99,218,99,99,218,99,99,99,
218,218,99,99,99,99,58,99,58,30,99,99,99,99,99,99,58,99,99,58,
99,58,99,58,99,99,58,58,58,99,58,58,99,218,218,71,99,99,71,71,
71,123,12,118,71,71,12,71,123,12,12,19,19,19,53,19,19,53,53,19,
19,53,101,63,20,63,20,63,53,53,53,101,53,53,53,19,53,53,53,19,
92,12,12,12,71,12,12,12,12,12,92,71,218,218,71,218,71,71,71,71,
99,218,58,58,58,99,99,99,99,58,58,58,99,58,99,58,58,99,58,58,
99,99,58,99,99,99,99,58,99,58,30,99,99,99,218,99,58,99,99,58,
11,99,99,218,99,218,218,99,99,218,71,99,218,99,99,218,99,99,218,99,
11,218,99,218,99,11,218,99,99,8,71,71,71,99,218,71,218,99,71,218,
11,99,218,218,99,218,99,218,99,99,99,99,218,99,99,99,99,99,218,99,
99,99,99,99,99,11,99,99,99,99,99,99,58,99,58,99,58,99,58,58,
99,11,58,58,99,58,99,99,58,58,218,99,123,71,71,71,123,71,71,218,
99,99,218,71,12,12,12,12,92,19,19,53,19,53,53,53,53,19,53,53,
53,53,19,53,19,53,53,53,53,53,63,63,101,63,63,20,53,19,53,53,
53,19,92,92,12,12,12,71,71,71,71,12,12,71,71,12,12,12,12,12,
12,218,218,99,58,58,99,58,99,58,99,58,99,99,58,218,58,99,58,99,
99,99,99,11,58,99,99,58,99,99,58,58,99,99,99,99,99,99,99,99,
99,58,218,99,218,99,99,99,218,99,99,218,99,11,218,99,218,218,99,99,
218,99,218,11,99,71,99,218,71,8,99,99,218,99,99,99,218,99,99,218,
218,99,11,99,99,218,99,218,99,218,218,99,58,99,99,99,58,11,99,99,
58,99,99,58,58,58,58,99,99,99,99,218,58,99,99,99,58,58,99,99,
58,58,99,58,99,58,99,99,58,58,99,218,71,71,218,218,218,58,58,58,
218,99,71,123,12,12,12,19,19,108,108,108,92,92,92,12,71,12,12,92,
19,53,53,53,101,53,53,19,53,101,53,20,53,79,79,0,34,79,20,63,
53,53,53,19,19,19,12,12,12,71,71,71,71,71,71,123,71,12,12,12,
12,12,71,71,218,58,99,58,218,58,218,99,58,99,58,99,99,218,58,58,
58,99,58,58,99,99,58,99,58,99,99,218,58,58,99,99,99,99,99,99,
58,11,99,99,218,218,218,99,218,99,99,218,218,99,218,99,99,218,218,99,
218,99,71,218,99,218,99,99,99,8,218,218,99,218,99,218,99,218,218,99,
11,218,218,218,218,99,71,99,218,99,99,99,218,58,99,99,99,99,218,30,
58,99,58,99,58,11,58,99,58,99,58,58,58,99,58,58,99,99,58,58,
58,99,58,99,58,58,99,58,218,99,99,218,58,99,58,58,58,58,58,218,
71,12,12,71,71,12,12,12,12,71,71,118,71,71,118,71,71,12,223,19,
19,53,53,53,53,63,229,20,79,20,34,0,20,101,101,63,20,101,101,53,
108,53,53,53,53,53,101,19,92,12,12,12,12,71,71,218,218,218,71,71,
118,12,71,71,218,218,58,58,58,58,58,58,218,58,58,58,99,99,218,99,
58,58,99,99,58,99,58,99,58,58,58,99,99,99,58,99,99,99,58,58,
99,58,58,99,99,99,99,99,99,99,218,99,99,218,99,218,218,99,99,218,
99,58,99,99,218,99,218,218,218,8,99,218,99,218,99,218,11,99,218,99,
99,99,99,99,218,99,58,99,99,99,58,99,218,99,99,99,99,99,58,99,
58,218,99,99,99,58,218,58,58,58,99,99,58,99,218,58,99,99,58,218,
58,99,58,99,99,99,58,99,58,58,58,58,99,58,58,58,58,218,218,12,
71,71,71,12,12,71,71,12,71,12,71,71,71,71,12,92,19,53,53,53,
101,63,79,34,251,0,0,63,20,53,19,53,53,53,53,19,19,53,19,19,
19,108,19,19,19,19,19,19,53,53,108,12,12,12,71,71,218,58,58,58,
99,218,71,71,71,12,218,99,99,58,58,58,58,218,58,58,58,58,58,99,
99,58,58,99,58,218,58,99,99,99,99,58,99,128,99,58,99,99,11,99,
99,58,11,58,99,99,99,218,58,11,99,58,99,218,99,99,218,99,99,99,
218,71,99,99,218,99,11,99,218,8,218,99,218,99,218,99,99,218,99,218,
58,218,58,218,99,99,218,99,58,99,99,99,99,78,11,58,99,58,99,99,
99,58,58,99,58,11,58,58,218,99,99,58,58,58,99,58,58,58,99,99,
58,58,58,58,58,58,99,58,99,99,99,58,58,58,58,58,218,71,118,12,
71,71,71,71,71,12,71,71,71,71,71,12,92,19,19,53,53,63,20,251,
0,79,79,0,79,34,34,79,0,63,229,20,63,101,53,101,19,53,19,92,
12,71,12,92,12,12,12,12,12,92,19,92,92,71,12,118,71,218,99,58,
58,58,58,58,218,123,71,218,58,58,58,99,58,58,58,218,58,218,58,58,
218,58,99,58,58,58,99,99,58,99,58,99,218,99,99,99,58,58,58,11,
58,58,99,58,99,99,30,99,99,99,58,218,218,30,99,218,99,99,99,218,
99,99,218,218,99,99,218,71,99,8,99,99,71,99,218,218,99,218,99,218,
99,218,99,58,11,58,99,99,11,58,99,58,99,99,99,99,58,58,99,99,
58,99,99,99,99,58,99,78,58,58,99,99,218,78,58,218,58,99,212,58,
99,58,58,58,218,58,58,58,58,58,58,58,58,58,218,71,12,12,71,71,
123,218,218,58,99,71,123,71,71,12,19,19,19,53,53,19,19,53,63,53,
101,101,101,63,101,101,20,20,79,0,0,79,79,34,251,79,79,251,101,53,
19,92,12,71,71,71,218,12,218,12,71,71,71,71,71,12,71,71,123,71,
58,58,58,58,58,58,58,99,99,58,58,58,99,58,58,58,99,58,99,58,
99,58,58,99,58,58,58,58,99,58,99,58,99,58,99,58,99,99,58,58,
99,99,99,58,99,58,58,58,99,99,99,30,128,58,99,99,99,99,99,58,
218,99,99,218,218,99,99,218,71,8,71,218,99,99,99,99,218,99,99,99,
99,30,58,11,58,58,99,58,58,58,58,30,58,58,99,99,99,58,99,58,
99,58,99,58,58,58,218,99,58,99,58,58,58,218,99,58,58,58,58,58,
58,99,99,99,58,99,99,58,58,212,99,58,58,218,71,71,218,218,99,58,
58,58,58,218,123,71,71,12,108,19,19,108,19,19,223,92,19,92,12,12,
19,19,19,19,53,53,63,63,229,0,34,34,79,0,79,0,75,34,0,34,
79,20,53,19,92,12,71,71,71,218,71,123,71,123,71,71,71,71,71,71,
71,218,58,58,58,58,58,58,58,99,58,58,58,58,58,58,58,58,99,58,
58,99,99,58,99,58,58,58,58,58,58,99,58,99,58,99,58,58,99,99,
58,58,99,99,58,58,218,58,58,99,58,99,11,58,58,99,58,218,99,99,
99,99,218,99,99,218,99,99,99,8,99,218,99,218,99,99,99,99,58,58,
11,58,99,58,58,30,58,11,58,11,58,99,99,58,99,58,58,58,99,58,
58,99,58,99,99,58,58,99,58,99,58,99,58,99,212,58,58,58,58,58,
58,58,58,58,58,58,58,58,58,58,212,58,218,218,218,99,58,58,58,58,
58,99,71,71,71,12,71,71,12,12,12,71,71,123,71,218,71,71,71,92,
19,108,63,79,229,126,0,79,0,0,34,34,34,126,34,251,79,0,126,34,
79,0,79,20,63,19,19,12,71,71,71,218,71,99,71,71,71,71,71,71,
71,71,218,58,58,58,212,58,58,58,58,58,58,58,58,58,58,58,58,58,
58,58,99,58,58,99,58,58,99,99,128,218,58,58,99,58,99,58,58,99,
218,58,58,218,99,99,99,99,99,99,58,99,99,58,30,218,99,99,99,99,
99,99,218,99,99,99,218,218,99,8,218,99,99,99,58,99,99,99,99,99,
58,58,218,99,99,99,58,99,58,58,58,99,58,99,58,99,99,99,58,58,
99,99,58,58,58,58,58,58,99,99,58,99,99,58,58,58,58,99,58,58,
99,58,99,58,78,212,99,212,99,58,58,99,58,58,78,78,246,99,212,58,
99,71,123,71,71,71,71,71,218,218,71,123,218,218,218,118,12,19,63,63,
0,0,0,34,34,0,34,79,79,79,0,34,79,79,20,101,53,101,53,19,
53,53,101,101,53,53,19,19,19,92,218,218,218,218,218,212,78,58,218,218,
71,71,71,11,58,246,58,78,246,58,58,58,99,99,58,58,99,58,212,58,
99,58,99,58,58,99,58,58,58,58,58,212,218,58,58,99,58,58,99,58,
99,99,99,58,58,99,99,99,58,99,58,58,99,99,99,58,58,99,99,99,
99,99,99,11,58,99,99,99,218,8,99,99,218,99,99,218,99,218,58,58,
11,78,58,99,58,99,58,99,58,11,58,99,58,99,58,58,58,99,99,58,
99,99,99,58,58,58,58,58,58,58,58,58,58,58,58,212,99,58,212,99,
58,58,78,58,78,58,58,58,58,58,58,58,58,58,246,58,246,58,58,71,
218,71,71,71,218,71,71,71,71,218,218,71,71,92,92,53,63,126,79,0,
0,79,0,79,34,79,0,126,79,79,79,79,79,229,229,101,53,108,92,71,
71,71,71,71,71,12,12,19,108,19,92,71,71,71,71,218,212,246,78,58,
58,218,218,71,71,58,58,212,212,78,212,78,78,58,58,58,58,58,99,58,
78,58,58,99,58,58,58,58,58,58,58,58,99,58,99,58,58,212,99,58,
58,99,58,99,58,99,99,58,58,99,99,58,58,58,58,11,78,99,99,99,
99,58,99,58,71,99,99,99,99,8,99,99,99,218,99,58,99,30,58,11,
58,11,58,58,99,58,58,99,58,99,58,99,99,58,99,58,99,58,58,99,
58,58,58,58,58,78,58,99,58,99,58,58,58,58,99,58,212,99,58,58,
58,78,78,78,58,58,58,58,58,212,58,78,58,78,78,78,58,99,218,218,
71,218,218,71,58,99,58,99,71,71,71,12,19,20,79,251,0,251,79,251,
79,63,126,79,79,79,79,229,79,79,79,126,126,79,79,63,20,53,53,92,
12,12,218,71,71,218,218,218,71,218,71,71,71,218,71,218,218,58,246,246,
78,212,78,58,218,218,58,58,58,246,78,212,78,212,58,58,58,58,58,212,
78,78,78,58,58,99,58,58,58,58,58,58,58,58,58,218,99,99,58,99,
58,58,218,99,58,58,99,58,99,99,58,99,99,99,58,99,99,58,58,58,
218,99,11,58,99,99,99,218,99,8,99,30,218,58,11,99,99,58,99,58,
99,58,58,99,218,99,218,58,99,99,58,58,58,58,99,58,99,99,58,99,
58,58,58,78,78,58,58,58,58,58,99,246,78,78,58,58,58,58,58,78,
78,212,78,246,246,58,58,58,212,58,212,246,78,246,58,212,218,218,218,218,
218,58,246,58,246,58,218,218,123,12,19,19,53,53,101,53,63,101,63,63,
63,63,63,63,63,101,63,53,63,53,53,53,53,108,19,19,19,19,108,19,
92,92,12,12,71,71,218,99,99,218,218,218,218,218,71,71,71,218,218,246,
78,78,246,78,78,78,58,58,58,78,78,78,78,246,58,58,58,58,58,78,
212,78,78,58,58,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,
58,99,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,99,99,99,
58,99,58,99,99,58,99,99,99,8,99,99,30,58,58,58,58,58,58,99,
58,11,99,58,99,58,58,58,58,58,58,99,58,58,58,58,58,58,99,58,
99,58,78,58,58,58,99,58,58,78,246,78,58,78,58,58,58,58,78,212,
246,78,246,78,78,99,212,246,78,246,58,246,246,78,246,218,218,218,58,58,
246,78,78,246,58,218,218,71,12,12,108,92,108,19,108,53,63,63,63,53,
53,53,19,223,92,92,49,118,118,118,118,118,118,118,71,118,118,12,12,12,
92,71,71,123,218,99,11,58,58,58,58,78,58,99,99,123,71,218,218,218,
246,246,78,212,78,212,78,246,78,78,58,78,246,78,246,78,58,58,58,58,
99,78,246,78,246,99,58,58,58,58,58,78,78,78,78,99,58,99,58,99,
78,58,58,99,58,218,218,58,58,99,58,58,58,218,99,58,58,58,58,11,
58,99,99,99,58,99,99,218,58,8,99,99,58,99,58,11,58,11,58,58,
99,58,99,58,99,58,99,58,58,218,58,58,58,99,58,99,58,58,58,99,
78,58,58,58,99,58,58,78,78,58,246,78,246,99,58,58,58,212,78,78,
246,58,246,58,78,78,78,58,246,78,78,58,246,58,58,58,212,58,246,78,
212,246,58,58,71,71,71,71,12,92,92,92,108,53,53,53,19,19,223,223,
49,223,92,49,49,223,92,49,118,118,118,71,118,112,118,11,11,112,71,112,
71,71,11,11,11,99,99,58,58,78,78,78,246,78,246,58,99,71,218,71,
218,78,78,246,78,246,58,246,78,246,212,58,246,58,246,78,212,78,246,58,
58,58,78,246,246,78,78,99,58,58,58,212,78,58,78,58,58,58,58,58,
78,58,78,99,58,58,99,58,58,58,58,99,58,58,99,218,58,99,58,58,
58,58,99,58,99,99,58,99,99,8,99,99,58,58,58,99,58,99,99,58,
99,58,58,58,58,58,58,218,99,58,99,58,58,58,58,58,99,58,58,78,
58,78,78,78,78,58,78,58,78,78,78,212,78,58,78,58,78,212,78,246,
78,246,78,78,212,246,246,78,246,212,246,246,78,246,58,246,78,246,58,246,
246,58,99,218,218,218,71,12,92,19,19,19,19,19,223,223,49,223,49,118,
49,112,30,30,237,103,208,208,245,208,245,208,245,245,245,103,208,103,22,237,
30,30,11,11,11,11,71,71,11,99,58,78,78,246,58,246,246,246,58,99,
99,218,212,78,246,78,246,78,246,58,78,58,246,78,58,246,78,212,78,246,
58,212,58,78,78,212,78,78,58,58,99,78,78,78,78,78,58,58,99,58,
58,78,78,78,58,58,99,58,99,58,58,99,58,218,58,58,99,58,58,218,
99,58,99,99,58,99,30,99,99,8,58,99,58,99,58,58,58,99,58,99,
58,218,218,58,99,58,99,58,58,58,78,99,78,58,99,58,58,78,58,78,
78,58,78,78,58,78,78,246,246,212,78,78,78,58,78,246,78,246,58,246,
212,78,58,78,78,58,246,78,78,78,58,246,78,246,78,58,246,78,78,78,
58,218,99,11,71,12,92,92,92,223,223,223,223,223,49,118,112,22,237,208,
72,245,55,243,245,72,72,72,65,208,236,208,208,245,72,55,243,55,55,243,
245,245,245,103,237,237,30,11,11,112,71,11,99,58,78,246,246,246,246,78,
58,218,58,58,246,78,212,78,246,78,246,78,212,78,78,212,78,246,78,78,
58,78,78,78,78,78,246,246,246,58,58,78,58,246,78,212,78,78,99,58,
58,78,58,58,58,58,58,99,58,58,58,58,78,58,58,99,99,58,58,58,
99,218,58,99,99,99,58,99,58,8,99,99,99,58,11,58,58,58,99,58,
58,58,58,58,58,58,58,99,99,78,78,58,58,78,58,58,99,78,78,78,
78,78,78,78,78,78,212,246,246,246,246,78,78,246,246,58,246,78,246,78,
78,78,212,246,246,246,78,78,212,246,246,246,58,246,246,78,246,246,78,58,
218,99,71,12,12,92,92,82,223,49,223,118,112,22,208,72,72,208,65,22,
22,112,11,112,112,112,112,112,118,118,118,112,112,112,30,244,244,30,237,65,
236,72,55,55,243,243,208,208,237,237,11,71,11,11,71,11,99,58,246,246,
246,78,78,246,58,246,78,246,58,246,58,246,58,246,246,78,78,78,212,78,
212,246,212,78,246,246,58,78,78,246,99,246,246,58,246,58,78,78,78,58,
78,78,78,78,78,78,58,58,58,99,58,58,78,99,58,58,58,218,99,99,
58,58,99,58,99,58,58,99,99,8,58,58,99,58,99,218,99,58,99,99,
99,58,99,58,99,58,58,58,58,78,58,58,58,58,58,58,58,78,212,78,
78,58,246,78,58,246,246,246,246,246,246,246,78,58,246,78,246,58,246,58,
246,78,78,78,58,246,212,78,78,78,58,246,78,212,246,58,78,212,58,99,
218,71,12,92,19,223,49,49,118,62,30,22,208,208,103,30,244,112,244,118,
112,23,49,49,49,49,49,49,49,49,82,82,223,82,49,118,23,118,118,112,
11,30,237,22,65,245,55,243,245,245,103,237,237,11,71,11,71,71,218,58,
246,246,78,246,78,212,78,246,246,78,246,246,78,78,212,78,212,78,246,78,
78,58,246,78,58,246,78,212,78,246,78,78,78,78,78,212,246,246,246,78,
58,78,78,78,58,78,78,58,58,58,58,58,99,58,58,58,58,58,99,58,
58,58,58,58,58,99,99,58,58,8,99,99,58,58,58,99,99,99,99,58,
58,99,78,58,78,99,58,58,99,78,78,78,58,78,58,58,78,246,78,212,
78,78,58,78,246,246,246,246,246,246,58,78,78,246,58,246,78,246,78,246,
78,212,78,212,212,246,78,78,246,246,78,212,58,99,212,246,246,58,99,218,
118,12,92,223,223,49,49,11,237,208,208,103,244,23,118,112,118,112,49,49,
19,82,82,82,223,49,66,49,49,82,223,223,101,19,223,82,223,82,223,82,
82,49,23,112,11,244,30,65,72,55,55,245,208,22,237,112,11,118,71,218,
218,58,58,78,246,78,212,78,78,212,99,78,212,246,78,246,78,246,78,212,
246,246,78,246,246,78,246,78,246,58,246,78,58,78,246,246,246,246,212,246,
78,78,78,78,78,58,78,78,99,58,78,78,78,99,58,58,99,58,99,99,
58,99,99,99,99,58,99,58,99,8,99,99,99,58,58,99,58,58,99,58,
58,58,78,78,58,58,58,58,58,58,78,78,78,78,78,58,246,246,246,246,
246,78,78,212,246,246,246,246,246,246,78,212,78,246,78,212,78,246,58,246,
78,246,78,58,58,212,246,58,78,246,246,58,58,58,58,246,58,218,71,12,
223,223,49,49,49,30,65,72,72,30,112,118,118,112,118,49,223,223,223,49,
244,244,244,244,23,23,23,23,70,66,49,70,49,70,70,118,23,23,23,23,
49,223,19,82,223,223,23,11,244,237,208,72,55,55,208,103,30,11,11,49,
71,71,99,58,246,78,246,246,58,246,58,58,246,212,78,246,58,246,78,58,
58,212,78,78,212,78,212,78,78,78,212,78,78,78,246,212,246,246,246,212,
246,58,78,78,78,78,58,78,78,99,58,58,78,58,58,58,99,58,58,58,
58,58,58,58,99,58,99,58,99,8,99,58,58,218,58,58,58,99,58,58,
58,99,58,58,99,58,78,78,78,78,78,78,78,58,246,246,246,212,246,246,
212,246,78,246,246,246,246,246,212,246,246,78,246,58,212,246,78,78,78,246,
58,246,212,99,58,246,78,246,246,58,58,58,58,78,246,58,99,118,12,92,
223,223,223,11,22,72,208,244,49,112,112,118,49,82,223,49,244,244,242,62,
23,62,23,23,244,244,244,244,244,244,62,30,244,244,244,244,23,112,210,23,
62,244,244,23,223,82,53,82,49,112,30,30,65,72,55,245,208,237,30,112,
71,49,118,71,99,78,78,78,246,246,58,99,58,246,212,78,246,58,246,212,
99,58,212,246,78,246,78,246,212,246,78,246,246,212,246,246,246,212,246,246,
246,246,78,78,246,246,78,78,78,78,58,58,78,58,58,58,58,58,99,99,
99,78,99,58,99,99,58,99,58,8,58,99,58,99,99,58,58,99,58,58,
58,58,58,58,78,58,78,78,58,78,58,246,78,78,78,212,246,246,212,246,
246,246,246,246,246,246,246,246,246,246,246,58,246,58,99,212,246,212,78,78,
78,99,58,58,78,246,58,78,246,58,58,58,58,212,58,218,71,12,49,49,
49,112,22,72,65,112,49,112,112,112,223,19,118,62,244,62,62,23,23,244,
244,244,244,112,23,49,49,223,19,223,82,223,223,49,223,23,118,112,244,30,
62,62,62,62,23,62,23,223,82,8,82,71,30,244,22,72,55,245,103,237,
11,71,12,12,71,99,78,78,78,58,212,58,58,58,58,212,78,58,246,78,
58,58,58,212,78,246,58,78,78,212,212,246,246,246,212,246,246,246,246,246,
246,246,58,78,78,58,246,212,78,78,58,78,58,78,78,78,58,78,58,58,
218,58,58,99,58,99,99,99,58,8,218,99,58,58,58,99,58,58,99,78,
78,58,99,58,58,78,58,78,246,78,78,58,78,212,246,246,246,246,246,246,
246,246,246,212,246,212,246,246,246,212,78,246,58,58,58,246,78,78,212,246,
58,58,58,58,212,78,246,212,58,58,58,58,58,58,71,12,49,223,223,49,
30,208,72,30,49,49,112,49,223,223,23,22,244,62,23,23,62,22,112,118,
49,49,223,118,23,244,30,242,22,242,242,62,242,244,244,112,23,49,49,223,
23,112,30,244,62,112,210,23,23,49,82,8,223,244,237,30,208,55,243,245,
22,30,71,118,12,71,99,78,78,246,212,58,58,58,58,246,246,246,78,246,
58,58,58,78,212,78,246,246,246,58,58,212,246,246,246,246,246,246,246,246,
246,78,246,58,246,246,246,78,212,78,78,78,58,78,58,78,58,58,99,58,
58,58,99,58,58,58,58,58,58,8,58,99,58,58,58,58,99,58,78,78,
58,58,78,58,58,78,78,58,78,78,78,78,78,246,212,246,246,246,246,246,
246,246,246,246,246,246,212,246,246,246,78,58,58,58,58,246,78,78,246,99,
212,58,212,58,212,78,78,58,58,218,58,212,58,99,71,49,223,49,49,30,
55,72,112,49,244,11,49,82,112,242,242,62,23,62,244,112,118,223,82,118,
30,236,29,225,231,33,248,42,42,42,219,2,42,219,110,107,231,29,65,244,
112,223,223,49,112,30,30,23,23,23,23,49,82,101,49,30,30,242,72,243,
208,103,30,71,118,12,71,99,78,78,78,58,58,58,58,58,78,58,246,78,
58,58,99,58,246,58,246,58,246,58,99,58,212,246,246,212,246,246,246,246,
246,246,246,246,212,246,246,246,246,78,58,78,78,78,78,78,58,78,78,78,
58,78,99,99,99,58,58,99,99,8,99,58,99,99,58,58,58,58,78,78,
78,78,58,58,58,78,78,78,78,78,246,246,58,246,246,246,246,246,246,246,
246,246,212,246,99,58,246,246,246,246,212,58,58,58,99,212,78,212,212,58,
78,58,58,58,246,246,78,58,71,218,58,58,11,71,118,223,49,23,103,243,
22,49,118,30,118,82,49,30,242,62,70,62,244,118,223,82,112,65,93,205,
217,42,80,147,98,4,26,8,8,8,8,121,8,8,26,4,98,210,111,219,
29,29,65,112,223,82,23,30,244,62,62,62,62,49,82,82,112,30,30,65,
243,245,103,30,71,118,12,71,218,212,246,58,58,212,212,58,58,246,212,78,
58,58,212,58,58,246,78,246,58,58,58,58,246,212,246,246,246,246,246,246,
246,212,246,246,246,246,212,246,246,212,78,246,212,78,58,78,78,78,58,78,
78,78,58,58,58,58,99,58,58,8,58,58,58,58,58,58,58,58,237,78,
58,78,78,58,78,78,212,78,246,78,78,246,246,246,246,246,246,246,246,246,
246,246,246,58,58,58,246,246,246,246,58,58,99,58,58,246,246,78,99,78,
246,78,58,58,58,58,58,218,12,99,58,99,71,92,49,223,118,22,41,65,
223,23,30,118,19,23,22,242,23,23,30,112,223,19,112,29,222,232,87,80,
98,26,121,8,20,253,20,20,20,20,101,20,20,20,253,253,20,8,121,26,
4,14,2,231,29,30,49,82,112,30,244,62,23,210,118,82,101,223,30,244,
65,55,243,103,237,71,118,71,71,99,58,58,58,58,218,58,58,58,246,212,
58,58,212,78,99,58,246,246,78,58,58,58,58,246,246,246,246,246,246,246,
246,246,246,212,246,246,246,246,246,246,246,78,78,78,78,78,58,78,58,78,
78,58,58,58,78,99,58,58,99,8,99,58,58,99,99,58,58,58,58,237,
78,78,58,78,78,246,78,246,78,246,78,246,246,246,246,246,246,246,246,246,
246,246,58,58,58,58,246,246,246,58,99,78,246,212,99,246,212,58,78,246,
58,246,58,58,58,212,218,12,118,58,58,71,12,49,19,49,237,41,65,49,
118,112,223,82,244,236,62,66,62,30,82,8,112,93,68,6,137,88,162,253,
253,20,253,19,223,23,244,244,54,242,54,242,244,62,112,49,223,20,20,20,
20,253,26,98,14,33,29,244,82,101,112,22,62,62,62,23,49,53,82,30,
112,22,243,243,208,11,71,118,12,218,99,58,58,58,12,71,58,58,58,58,
99,58,58,246,246,58,58,246,246,58,58,58,99,58,246,246,246,246,78,58,
246,212,246,246,246,246,246,212,246,246,78,78,78,78,58,78,78,78,78,58,
78,58,78,237,78,58,99,99,78,8,58,99,58,58,78,78,78,78,78,78,
58,78,78,58,78,246,78,212,246,246,246,246,246,246,246,246,246,103,246,246,
246,246,58,58,58,99,212,246,246,58,212,78,246,58,58,58,58,58,212,78,
78,78,58,58,58,58,123,49,218,99,11,118,223,223,82,237,41,208,23,118,
237,223,82,244,18,210,23,23,112,19,223,103,64,6,148,147,26,253,20,8,
66,23,54,111,219,219,137,24,76,24,163,25,137,42,204,42,151,109,244,223,
20,20,20,20,8,4,111,231,236,23,82,12,237,62,62,23,62,223,253,223,
237,244,22,41,245,103,11,112,118,71,218,58,58,99,92,92,128,58,58,58,
58,58,58,212,78,58,58,212,58,58,58,78,78,58,212,246,246,246,58,58,
212,246,212,246,246,246,246,246,246,212,246,78,246,246,78,78,78,78,78,58,
78,58,58,78,99,58,58,58,99,8,99,58,58,58,58,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,246,246,246,246,103,246,246,246,246,246,
246,78,58,58,58,58,58,212,58,58,78,212,78,78,99,58,58,212,78,246,
212,212,58,58,58,218,92,12,218,99,71,12,223,82,118,243,55,23,223,30,
223,19,244,93,54,49,23,112,82,82,245,153,138,234,162,8,253,101,49,30,
111,125,24,201,142,16,159,142,43,95,197,156,193,193,51,141,224,25,248,231,
65,118,20,20,20,20,121,210,231,55,244,82,49,30,244,62,62,244,223,20,
118,237,112,208,243,245,237,71,118,49,71,58,58,218,92,92,12,58,58,99,
58,58,212,78,212,212,58,58,58,58,58,212,78,58,58,246,246,246,99,58,
99,246,246,246,246,246,246,246,246,246,212,246,58,78,78,78,78,78,58,78,
78,58,78,78,58,78,58,99,58,8,99,99,58,58,58,78,78,58,78,58,
78,78,78,246,78,78,78,246,246,246,246,246,246,246,246,103,246,246,246,246,
246,58,58,58,58,58,58,58,58,58,78,78,246,78,58,58,58,212,78,58,
58,78,58,58,58,12,92,12,99,218,118,19,82,223,22,116,237,49,112,112,
101,112,93,109,70,112,118,82,223,55,136,185,44,26,253,253,82,62,107,163,
117,16,114,159,161,106,98,46,26,26,26,26,26,4,32,81,44,142,43,234,
10,56,236,23,20,20,20,8,4,219,225,237,19,82,11,244,62,54,62,223,
20,112,30,244,72,239,103,237,71,12,12,71,58,71,92,92,12,128,58,58,
58,58,246,78,246,58,58,58,99,58,58,246,78,78,58,246,246,58,58,58,
58,212,246,212,246,246,246,246,246,246,78,78,246,58,246,58,78,246,78,58,
78,58,78,78,58,58,58,58,58,8,58,58,58,58,78,237,58,78,78,78,
78,78,78,58,246,246,212,246,246,246,246,246,246,246,246,246,246,246,246,246,
78,58,58,58,58,58,99,58,58,246,246,246,58,246,58,58,58,78,246,218,
11,58,58,58,58,12,92,71,218,11,49,223,101,23,239,93,23,118,244,223,
223,65,29,70,70,112,82,82,72,233,135,152,121,253,20,49,242,179,176,39,
198,156,32,47,26,26,69,113,26,47,9,47,162,113,26,121,113,252,152,159,
43,234,217,238,30,253,20,251,8,4,107,17,30,82,223,22,62,62,54,244,
82,19,237,112,244,41,245,30,112,71,92,71,99,71,12,92,92,71,78,58,
58,246,246,58,78,212,58,58,58,58,58,78,246,58,99,58,212,58,58,58,
58,78,246,246,246,246,246,246,246,246,246,246,78,78,78,78,246,58,78,78,
58,58,58,99,58,99,58,58,58,8,58,99,99,58,58,78,78,58,78,58,
78,58,78,78,78,78,78,246,246,246,246,246,246,246,246,246,78,246,246,246,
58,58,78,58,78,58,58,99,58,78,58,246,246,58,58,58,212,58,58,12,
71,58,58,58,99,92,92,71,218,71,223,8,19,22,150,30,49,11,23,101,
30,93,54,49,112,49,20,30,254,181,95,26,253,253,49,65,163,166,206,202,
52,26,8,121,4,161,43,114,139,131,57,200,195,188,192,88,26,26,121,98,
197,67,234,145,230,22,82,20,20,8,98,107,100,112,253,112,103,244,54,62,
49,20,49,237,118,208,243,103,11,11,12,92,92,92,92,12,49,12,58,58,
78,58,246,78,246,78,212,99,58,58,78,246,58,78,58,58,58,99,58,58,
58,99,246,246,246,246,246,246,246,246,246,246,246,78,246,78,246,78,58,78,
78,58,78,78,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,78,78,78,78,246,246,246,246,246,246,246,246,246,246,246,58,212,58,246,
99,212,58,99,78,99,58,58,78,246,58,58,58,78,78,58,78,78,99,71,
12,71,58,58,12,12,12,71,11,12,223,101,49,243,100,118,223,112,82,19,
93,225,113,23,244,101,223,41,129,199,52,253,20,223,242,124,39,57,117,122,
121,121,47,44,195,35,94,196,165,189,189,189,27,84,200,139,67,186,26,121,
240,106,159,234,175,68,242,20,20,20,8,210,238,93,223,19,237,244,23,54,
62,19,101,244,112,30,243,208,237,11,12,92,49,223,12,12,92,12,58,78,
246,78,58,246,78,212,78,78,58,58,212,58,58,58,78,99,58,58,99,58,
58,58,246,246,246,246,246,246,246,246,246,246,78,246,58,78,58,78,78,78,
78,78,237,78,58,58,58,58,58,8,99,58,99,58,78,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,103,246,246,246,246,218,58,58,78,78,
58,99,71,12,58,78,58,78,58,78,123,12,78,78,58,212,78,78,123,92,
12,12,99,99,12,92,92,71,11,118,82,101,112,116,236,82,112,112,82,118,
100,110,66,23,49,101,244,215,73,43,69,253,101,23,219,59,97,202,52,8,
8,4,120,97,187,139,27,143,46,113,26,26,46,88,60,27,131,200,192,47,
82,66,81,159,234,170,68,118,20,251,20,26,2,64,244,101,118,22,23,62,
62,49,20,118,244,23,208,245,30,11,71,12,92,12,12,49,12,12,71,58,
246,246,78,246,78,246,58,78,58,78,212,218,12,246,78,99,58,78,78,11,
12,58,58,246,246,103,246,246,58,246,246,246,246,78,246,78,78,78,58,78,
78,58,58,58,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,212,78,246,246,78,99,58,246,246,246,246,246,246,71,12,99,58,58,99,
58,58,53,251,71,78,78,78,78,246,19,19,71,246,246,78,212,246,12,92,
12,12,12,12,92,12,12,71,218,118,19,101,244,239,65,223,244,11,53,112,
222,235,66,112,223,20,72,45,90,221,8,253,19,242,214,97,57,152,26,8,
26,188,57,187,139,186,8,8,8,8,121,121,8,8,26,4,44,131,94,67,
162,82,113,44,159,76,220,29,82,0,20,8,98,238,245,82,82,237,23,62,
54,112,20,223,237,49,22,245,237,11,71,49,12,92,12,12,12,12,71,78,
246,58,246,58,246,78,246,58,246,212,58,19,101,218,78,78,99,58,58,53,
101,71,58,246,246,246,78,71,92,58,246,246,212,246,78,58,58,78,78,58,
78,78,78,78,58,58,58,58,58,8,99,99,58,99,58,78,78,58,99,58,
78,78,58,246,78,58,71,92,218,246,246,246,103,246,12,92,92,58,58,58,
58,218,63,53,19,246,246,78,78,212,53,92,92,212,246,78,78,58,92,218,
12,12,92,92,92,12,12,71,11,118,101,101,22,116,242,223,237,11,8,30,
17,62,70,112,8,53,72,172,134,143,8,20,223,109,102,57,97,81,121,82,
252,114,35,157,165,26,253,8,8,46,182,4,26,26,8,8,113,160,190,35,
186,66,121,106,117,152,232,68,49,79,20,8,26,42,17,223,53,22,112,244,
54,244,8,82,30,118,30,245,30,11,99,12,12,92,123,12,12,12,71,78,
246,78,246,78,58,246,246,58,246,58,12,53,53,12,78,78,78,99,12,63,
63,92,78,78,246,246,78,229,229,12,246,246,246,212,78,71,71,58,78,78,
58,78,78,58,58,58,212,58,58,8,99,58,58,58,58,78,78,58,99,218,
99,58,246,78,78,58,12,92,12,78,246,246,246,218,92,92,19,71,58,58,
58,12,38,92,53,71,246,58,246,218,108,92,92,218,246,212,78,58,12,218,
12,12,12,92,12,92,12,71,71,118,82,8,103,116,242,82,244,11,82,30,
222,210,223,23,8,101,55,172,183,186,8,253,223,110,102,157,97,161,8,8,
127,67,190,140,189,26,8,8,69,127,120,5,52,26,26,8,121,9,84,187,
43,113,82,98,142,152,89,119,244,20,0,253,121,219,64,23,101,30,30,23,
54,244,82,101,30,112,112,72,237,71,30,12,12,92,118,12,12,12,71,58,
246,246,58,246,58,212,78,246,58,246,108,63,53,19,78,78,78,58,53,101,
53,108,78,246,246,246,108,79,20,53,246,246,246,78,99,92,92,12,99,78,
78,58,58,218,218,218,99,58,58,8,99,99,58,58,58,99,99,218,71,11,
99,99,78,246,212,71,218,71,92,71,246,246,246,71,92,92,19,19,58,58,
58,92,53,92,92,108,58,246,246,71,92,92,92,92,212,246,246,58,123,48,
12,12,12,92,92,12,12,12,99,118,19,101,237,116,65,49,30,112,82,244,
222,235,26,118,82,101,65,136,183,7,8,8,82,242,21,157,57,192,69,8,
26,7,191,157,190,60,9,8,26,52,84,131,60,4,121,8,26,113,67,94,
142,113,82,98,43,152,10,119,244,251,0,253,121,111,64,23,101,244,22,49,
62,62,82,101,112,23,112,103,30,71,11,12,12,118,12,12,118,12,71,78,
78,246,78,58,218,58,78,246,246,12,53,101,53,19,58,78,58,12,63,63,
53,63,218,246,246,71,79,20,63,101,218,246,246,218,12,19,108,12,99,58,
99,71,218,71,71,218,71,218,71,8,99,58,99,99,58,58,11,218,71,218,
71,71,218,58,58,99,218,99,71,92,218,78,246,92,92,12,223,53,71,58,
58,19,19,92,92,19,12,78,78,12,92,92,92,92,71,78,78,218,123,241,
48,12,12,92,49,12,118,12,71,49,223,101,11,116,65,66,112,11,82,112,
100,54,66,66,223,20,244,105,90,159,8,8,8,244,10,167,187,202,98,8,
121,47,192,169,190,35,195,188,188,195,57,84,106,47,8,8,8,122,195,140,
95,66,82,98,142,221,175,119,244,251,251,20,8,219,64,112,101,30,242,118,
23,62,19,20,11,118,112,22,11,11,99,12,12,12,12,71,12,118,71,58,
246,58,246,99,12,99,212,78,58,19,53,53,101,53,58,78,218,53,101,53,
53,63,218,246,246,63,0,101,19,53,12,78,58,12,108,92,19,108,92,71,
71,12,71,71,123,71,71,123,71,8,99,99,58,58,58,11,58,11,99,218,
99,11,99,99,218,99,218,99,71,12,12,99,99,92,92,92,12,19,53,71,
99,38,53,12,12,92,19,218,212,92,92,92,48,12,108,128,246,218,123,48,
128,123,12,12,12,12,12,118,71,71,223,8,112,41,55,49,49,244,223,49,
93,231,70,82,223,20,82,116,181,158,252,8,20,223,242,214,57,157,156,46,
8,66,26,147,44,198,86,196,86,198,44,52,4,8,8,8,46,60,97,194,
52,82,82,180,159,177,232,64,66,79,20,8,26,231,100,49,8,237,62,23,
62,244,82,82,30,223,11,237,112,11,11,12,12,71,12,12,118,12,71,218,
246,78,58,218,92,99,246,212,92,53,79,79,53,53,218,58,19,63,38,126,
53,101,92,58,19,251,63,223,19,19,92,71,12,223,92,223,223,92,19,92,
12,71,123,71,71,71,71,71,71,8,11,58,11,58,99,58,99,58,99,58,
58,218,218,218,99,218,11,99,99,71,92,92,12,49,92,71,99,12,53,53,
92,20,53,123,48,12,92,19,218,19,92,12,241,48,92,92,58,218,92,241,
128,212,71,12,118,12,12,71,71,112,223,19,82,55,116,112,49,244,223,19,
208,238,235,66,223,253,82,22,250,73,95,113,8,82,49,111,102,207,132,188,
252,69,8,121,162,4,47,52,127,4,4,26,26,8,8,46,186,86,169,95,
66,8,4,95,192,87,45,236,101,251,253,8,70,222,236,223,223,237,244,23,
54,244,82,82,237,118,11,244,71,11,99,71,118,12,12,12,12,12,12,58,
78,78,246,123,108,12,212,12,53,63,13,83,63,53,12,92,53,226,13,13,
53,53,53,226,75,63,12,71,92,19,19,92,92,92,19,12,12,12,92,12,
71,71,71,71,71,12,71,71,71,8,99,99,58,99,99,58,58,99,58,58,
11,218,71,71,11,218,99,99,58,218,12,19,92,92,92,99,78,58,92,101,
75,251,53,12,123,48,92,108,101,63,92,12,241,241,92,92,108,92,108,128,
212,246,58,12,12,12,49,12,12,118,12,49,19,237,116,22,49,118,244,82,
112,17,231,70,223,82,20,82,93,45,133,7,46,8,8,49,50,224,168,207,
142,60,127,46,8,26,8,8,8,8,8,8,121,26,47,192,166,169,7,113,
66,113,7,156,36,217,28,23,251,251,20,26,111,222,30,8,49,22,112,62,
242,112,101,112,30,49,244,11,112,11,99,71,12,12,118,12,12,12,71,246,
246,78,212,92,108,92,218,53,38,13,0,0,63,101,20,63,101,75,83,83,
63,101,229,79,126,92,58,78,12,19,92,92,19,92,12,71,71,118,71,71,
218,12,71,71,71,71,71,218,99,8,218,99,218,58,58,218,99,99,58,99,
58,58,99,99,218,99,218,99,58,58,99,92,92,92,19,58,78,78,99,108,
0,34,38,123,123,48,123,92,53,108,92,12,241,241,241,123,92,19,19,123,
241,212,246,99,12,71,12,71,12,71,118,223,82,118,245,100,112,49,30,118,
223,237,238,111,113,223,19,20,49,93,144,184,44,113,8,253,19,210,173,141,
168,57,196,142,60,52,122,182,113,113,122,3,60,159,130,86,43,122,26,223,
47,106,95,76,89,68,244,20,251,20,8,210,238,72,223,19,30,112,23,62,
244,223,20,118,112,112,244,118,11,99,99,218,71,218,71,12,12,71,58,58,
78,246,246,92,63,53,53,101,83,0,83,83,53,63,63,53,20,83,0,0,
53,53,79,0,226,78,58,78,12,108,92,19,92,71,58,58,99,71,71,123,
71,218,218,71,218,218,99,218,99,8,99,99,218,218,99,99,99,99,58,99,
99,58,99,11,71,99,99,58,58,58,58,71,92,92,19,78,78,58,78,218,
53,63,101,123,123,48,48,123,92,19,92,92,241,241,241,241,92,92,92,12,
241,212,78,78,123,118,12,12,12,12,112,92,49,223,30,247,65,49,23,112,
82,23,72,231,14,26,82,19,101,49,17,146,102,154,147,69,8,82,49,23,
249,104,158,39,206,169,86,130,202,142,202,114,39,117,76,88,4,66,66,113,
7,95,234,175,68,22,101,20,251,8,4,107,100,112,101,112,30,23,112,62,
49,101,49,244,118,112,112,118,11,78,99,99,99,58,71,12,92,99,246,78,
246,58,218,108,108,53,63,229,0,83,34,13,53,53,101,38,13,0,0,13,
53,101,63,101,99,78,58,78,71,19,19,92,71,58,99,58,11,218,218,71,
99,99,99,99,218,58,99,218,218,8,71,218,99,99,218,58,99,99,99,99,
99,58,99,58,99,218,11,58,58,99,58,58,71,92,92,58,78,78,78,78,
118,19,53,123,48,128,128,48,123,12,92,92,48,128,212,48,241,12,12,92,
241,128,246,246,246,71,12,12,12,71,71,118,49,223,49,208,116,22,49,23,
11,223,223,72,225,235,113,82,82,101,49,65,68,164,201,7,162,26,8,121,
66,223,23,216,14,36,177,152,154,152,80,255,98,66,66,223,66,4,32,152,
152,163,228,222,112,251,20,20,8,113,219,222,22,82,23,22,62,112,54,244,
101,82,112,112,23,118,112,11,11,78,58,58,246,99,71,71,99,58,246,212,
58,58,123,108,108,53,20,13,101,19,34,13,53,53,53,0,75,38,0,34,
63,53,53,71,58,78,58,78,11,92,92,71,58,58,58,58,99,218,11,99,
11,58,218,218,99,99,218,99,99,8,99,71,99,99,99,99,99,218,58,99,
218,58,99,99,99,58,58,78,58,99,58,58,58,71,12,78,78,78,78,78,
58,12,19,12,48,218,246,218,48,12,92,92,241,48,58,212,48,241,12,92,
48,241,212,58,212,212,123,118,12,71,118,118,12,223,49,118,55,239,244,223,
112,112,82,118,236,225,14,4,26,82,101,19,112,93,153,21,224,174,88,162,
26,26,121,82,66,66,66,66,66,66,26,82,66,26,113,127,32,44,51,87,
248,222,236,223,20,20,20,8,70,111,17,237,223,49,237,30,62,54,30,118,
253,49,112,118,23,118,118,11,99,58,58,58,212,99,71,218,246,78,78,58,
58,58,108,108,63,38,13,92,58,12,13,251,53,63,251,79,12,71,34,34,
251,53,19,58,78,78,78,58,58,71,71,58,99,99,58,99,58,11,58,99,
99,99,99,218,218,99,218,218,99,8,71,99,218,218,218,99,218,99,99,99,
99,71,58,99,99,99,99,58,58,99,58,58,78,58,99,78,58,78,58,78,
78,78,99,218,128,58,58,78,128,48,12,92,123,241,78,246,58,48,241,218,
12,128,212,212,58,58,212,218,71,12,71,12,118,12,223,49,11,243,55,244,
49,112,244,223,49,236,17,111,4,121,82,82,8,223,244,29,153,61,148,234,
152,32,147,52,4,4,113,26,113,26,98,98,147,255,7,193,24,163,217,238,
110,112,101,20,20,253,8,70,107,222,22,223,223,244,244,244,244,242,112,82,
223,118,23,23,49,118,71,11,58,58,58,246,246,58,99,78,58,212,212,78,
58,99,53,53,38,83,19,58,246,19,34,79,251,34,34,71,58,71,79,13,
83,63,218,58,58,99,58,78,58,99,78,58,99,99,99,58,58,99,99,58,
218,11,218,99,11,218,11,99,71,8,71,218,218,11,71,99,218,99,99,99,
99,218,11,99,58,58,58,58,11,58,99,218,58,58,78,78,78,78,58,58,
78,78,78,78,58,78,78,78,58,58,48,123,48,48,128,78,246,78,128,241,
241,241,128,212,58,58,58,58,218,12,118,71,71,112,118,223,49,11,245,55,
30,49,112,244,223,19,30,93,107,111,4,26,101,101,8,101,112,242,93,203,
6,170,21,74,51,51,104,24,234,76,24,104,76,124,232,56,225,18,30,223,
20,20,20,20,8,66,235,231,236,112,223,118,30,112,112,54,244,112,82,49,
112,23,118,118,12,11,99,99,246,58,58,58,78,58,246,246,78,78,212,78,
58,12,53,229,34,40,78,78,58,38,0,13,13,79,71,58,58,71,13,0,
38,71,58,99,58,99,58,99,78,58,58,99,99,99,71,99,58,99,218,99,
71,99,218,99,99,71,218,99,71,8,71,71,71,123,218,218,11,218,218,218,
218,99,218,218,99,99,99,99,58,99,99,99,99,99,58,78,78,58,58,99,
99,78,78,246,78,212,78,78,58,78,128,48,48,241,48,246,78,58,246,128,
128,128,128,128,212,78,212,78,58,218,71,71,12,12,118,118,49,49,112,208,
41,22,49,112,244,23,19,49,22,93,219,14,4,8,82,101,20,101,223,49,
30,65,18,29,17,203,228,230,56,96,91,225,225,236,242,112,49,82,20,20,
20,20,82,113,210,107,29,22,118,223,112,30,244,244,62,112,23,82,223,49,
118,118,49,49,118,71,99,246,58,58,212,246,246,78,212,58,246,246,78,58,
218,53,209,126,40,78,78,78,218,0,34,34,79,71,78,99,58,71,251,229,
12,58,99,99,99,58,58,58,58,99,99,99,99,218,99,58,99,99,99,218,
99,218,11,218,218,11,218,71,71,8,71,123,71,71,218,123,71,99,11,99,
218,11,99,71,218,99,58,99,99,58,218,218,99,99,58,58,58,58,99,58,
58,99,58,246,246,246,78,58,58,58,78,58,48,48,241,78,246,78,78,58,
58,241,241,241,212,58,246,78,246,58,218,71,71,71,118,118,118,49,49,112,
103,243,236,112,49,244,112,49,223,118,65,93,107,14,98,113,82,8,101,253,
101,20,101,82,82,223,118,118,49,49,49,82,82,101,101,20,20,253,253,121,
26,70,235,110,29,103,118,223,223,11,244,244,54,242,244,49,19,223,49,118,
118,49,12,71,11,99,212,246,78,78,78,78,212,246,78,58,78,212,78,58,
12,38,213,71,78,58,58,78,40,83,79,20,99,58,99,58,99,12,92,71,
78,58,99,99,99,99,99,99,99,99,218,218,99,218,218,99,218,218,11,218,
11,218,218,71,218,218,71,123,71,8,71,71,12,71,71,218,218,218,71,71,
218,218,218,218,71,218,218,99,99,218,99,99,99,99,99,99,58,99,58,99,
99,99,99,58,78,78,78,78,58,99,58,58,58,128,48,128,78,78,58,78,
212,212,212,241,128,58,246,246,58,246,58,218,218,118,71,71,118,12,118,49,
23,237,245,55,208,23,118,23,112,223,223,118,244,236,18,110,14,210,4,66,
121,8,82,20,82,101,101,251,20,20,20,101,8,20,8,8,26,26,210,235,
109,110,65,30,118,223,49,244,244,244,244,242,65,30,223,82,49,118,118,49,
92,49,118,71,11,78,246,78,58,246,212,246,78,78,246,78,246,78,212,218,
53,92,99,78,58,58,58,246,53,0,53,99,99,58,99,58,99,71,218,58,
99,58,99,218,58,99,58,78,99,99,11,99,71,99,99,218,99,99,218,71,
123,218,71,218,12,71,71,71,71,8,71,71,71,71,71,118,71,71,218,99,
71,71,71,123,71,71,218,99,99,218,218,71,11,218,99,99,58,99,58,99,
99,99,218,58,58,78,78,78,58,99,99,58,58,58,58,128,246,78,58,58,
58,58,246,128,128,58,212,246,78,78,78,58,58,218,71,71,11,118,118,49,
12,23,11,103,243,72,237,23,23,112,23,223,19,223,112,22,109,18,29,111,
111,210,210,70,4,26,26,26,26,26,26,4,4,70,98,235,2,18,29,65,
54,23,223,49,23,244,244,112,244,54,22,244,118,82,223,223,118,92,49,49,
223,71,11,99,99,78,246,58,246,78,58,212,78,78,58,58,246,78,58,218,
71,78,58,58,99,58,58,99,19,77,58,58,58,218,99,58,58,58,58,58,
218,99,11,218,58,99,218,58,218,218,71,218,218,71,99,71,218,71,71,218,
71,123,71,71,71,71,71,71,12,8,118,118,71,71,118,71,71,71,118,12,
71,123,71,71,71,71,71,71,218,99,99,99,218,218,71,218,99,99,58,99,
99,218,99,218,58,58,246,78,78,99,99,99,99,58,246,78,58,246,58,58,
58,58,58,78,78,58,58,58,246,212,99,58,58,58,218,99,71,118,11,118,
49,49,49,23,11,208,55,245,22,112,23,23,23,23,49,49,49,223,112,30,
22,236,18,18,18,29,18,18,18,18,107,236,29,236,236,22,30,23,223,223,
223,118,118,112,244,112,244,242,242,30,23,223,82,223,49,49,49,223,49,12,
71,71,99,58,246,212,58,58,58,78,78,78,58,58,58,58,78,212,246,78,
78,58,58,11,99,58,78,78,99,58,58,99,218,99,58,99,58,58,58,218,
99,71,218,99,218,58,99,218,218,71,218,123,71,99,71,218,71,71,71,12,
71,71,12,12,12,12,12,12,12,8,12,12,12,12,12,12,118,118,71,71,
71,218,71,123,71,71,71,71,123,71,218,11,218,71,218,123,218,99,218,58,
99,99,11,218,71,99,99,58,78,58,99,99,71,99,58,78,246,246,246,58,
58,218,58,99,78,78,246,78,78,246,58,58,58,212,58,58,99,71,71,118,
71,118,118,23,49,112,112,103,72,72,65,244,112,23,118,118,70,223,223,223,
223,49,118,23,118,112,112,244,112,112,23,23,23,49,49,223,223,49,23,118,
244,244,112,62,244,109,22,30,49,223,223,82,49,223,49,223,223,118,118,71,
99,99,99,78,78,246,58,58,78,78,58,58,58,99,78,246,78,78,78,78,
99,99,99,58,99,58,78,78,58,99,99,11,218,99,99,58,58,11,99,218,
218,218,71,99,218,218,11,218,123,71,218,71,71,218,71,71,123,71,118,12,
71,12,12,12,12,12,12,12,12,8,12,12,12,12,12,12,71,71,71,118,
71,118,71,71,118,12,71,71,71,71,99,218,123,71,218,71,218,71,99,99,
99,218,218,71,218,218,99,58,58,58,58,218,99,218,218,99,58,99,78,58,
58,99,99,99,58,58,78,246,246,78,78,78,58,99,58,58,99,58,99,71,
11,71,12,23,118,118,118,23,112,30,103,208,208,65,242,112,118,23,23,118,
118,118,49,112,23,112,11,112,112,112,118,49,49,49,49,112,23,23,112,244,
244,22,22,22,242,112,49,223,223,66,223,49,223,49,223,49,12,71,71,99,
99,58,212,212,246,58,78,78,58,58,99,99,99,58,78,78,78,78,58,58,
99,99,99,58,58,58,58,58,99,218,71,218,99,99,218,58,99,99,71,218,
71,71,218,99,71,99,123,71,118,118,123,71,71,123,71,71,12,12,118,12,
12,12,12,12,12,12,71,12,71,8,12,92,12,92,71,12,118,118,12,12,
118,71,71,12,71,71,118,12,12,71,118,218,71,71,71,12,71,12,218,218,
99,99,218,218,71,71,71,218,99,99,99,99,71,71,218,71,99,58,58,58,
58,58,99,11,99,99,99,58,246,78,246,78,58,99,99,99,58,58,99,99,
99,11,71,112,112,118,118,92,118,23,118,112,30,237,103,65,65,22,30,54,
244,244,23,112,244,112,244,112,244,23,244,23,112,62,244,244,30,242,22,242,
22,30,23,49,49,19,82,223,223,49,49,49,223,49,12,11,11,218,99,58,
58,78,78,78,246,78,78,99,99,58,99,58,58,78,78,78,58,99,218,218,
71,99,99,99,58,99,58,99,71,123,71,218,99,99,218,99,218,71,12,71,
71,218,71,71,218,71,71,71,71,71,12,71,71,71,118,12,12,12,71,71,
12,12,12,12,118,12,12,92,12,8,12,12,71,12,12,12,12,12,71,12,
118,12,12,12,118,12,71,12,12,71,71,71,71,123,71,12,12,71,71,218,
218,218,11,71,123,71,71,218,71,99,99,58,99,99,71,218,218,99,218,58,
58,58,58,99,218,71,99,218,58,58,58,246,212,58,58,99,99,58,99,58,
58,58,58,218,71,71,112,71,118,118,49,23,118,118,49,112,112,30,237,22,
22,22,103,22,22,22,22,22,30,242,22,22,22,103,22,22,30,112,112,23,
49,49,49,82,223,66,49,49,49,49,223,12,118,71,218,99,99,58,99,58,
78,246,78,246,58,58,99,99,218,218,99,99,99,58,58,58,99,218,71,218,
99,99,58,58,58,99,218,123,71,71,218,218,99,99,99,123,71,71,71,92,
71,71,218,218,71,12,12,12,118,71,12,118,71,71,71,12,12,12,12,12,
12,12,118,118,12,12,12,12,12,8,92,92,92,12,12,12,12,12,12,12,
92,12,12,12,71,12,118,12,12,12,12,12,71,71,71,12,12,71,118,71,
71,123,71,71,71,118,71,71,71,123,71,218,218,99,218,71,12,71,71,218,
218,58,58,99,58,71,71,218,218,218,99,58,58,58,58,58,99,99,99,218,
218,99,58,58,99,99,99,11,11,11,23,112,118,112,49,118,118,118,23,118,
49,118,23,112,112,112,112,244,112,112,118,112,118,49,49,223,49,223,223,49,
223,223,49,49,223,49,223,223,118,118,71,11,218,99,218,99,218,78,58,58,
58,58,58,218,218,218,218,218,58,99,58,58,58,58,218,99,71,71,123,71,
218,99,58,99,99,71,71,12,12,71,71,71,218,218,218,71,118,71,71,12,
123,71,12,71,71,12,12,12,118,71,12,12,12,118,118,12,71,118,12,118,
12,12,12,12,12,92,12,12,92,8,92,92,12,12,92,12,92,12,12,12,
12,12,118,12,12,12,12,12,12,12,118,12,12,71,118,71,12,12,71,118,
71,71,71,123,218,118,12,71,71,71,71,99,99,218,218,71,71,71,71,71,
99,218,99,58,99,218,218,71,71,71,218,71,58,99,58,58,99,58,218,99,
99,218,99,99,58,58,58,99,58,99,218,11,71,112,11,112,118,23,118,23,
49,118,118,92,49,92,49,92,49,92,49,223,223,49,223,49,49,49,49,82,
49,49,49,223,118,118,71,71,11,71,99,218,218,99,58,58,58,58,58,58,
58,218,218,218,71,218,218,99,99,99,99,58,218,218,71,123,71,71,218,11,
99,99,218,218,71,71,12,71,12,218,218,218,71,218,118,12,71,118,71,71,
71,71,71,71,118,71,12,12,12,71,12,12,12,12,12,12,12,49,12,12,
12,92,12,49,12,92,12,12,92,8,92,92,92,92,92,12,92,12,12,92,
12,92,12,92,12,71,71,12,12,12,12,71,12,118,71,118,71,118,12,12,
12,12,71,71,218,71,71,118,118,12,12,118,71,218,71,218,123,12,12,12,
12,71,71,99,99,99,218,71,71,71,71,123,71,218,218,58,99,99,58,218,
99,218,218,11,99,218,99,218,218,58,58,58,99,218,71,11,71,71,118,11,
112,71,112,118,112,12,118,118,118,118,118,118,118,118,118,118,223,223,49,49,
118,118,118,71,71,71,218,71,218,71,99,99,99,218,58,58,58,218,218,218,
218,71,71,218,123,71,218,99,58,218,218,99,71,118,12,71,71,71,218,218,
218,99,71,118,12,12,12,71,71,123,71,71,71,12,118,12,92,71,118,71,
12,12,71,12,12,92,12,12,12,118,12,12,12,12,12,92,12,12,12,92,
71,92,12,92,92,92,92,92,12,8,92,92,92,92,92,92,92,92,92,12,
92,12,92,12,92,92,12,118,92,12,12,92,92,12,12,12,12,12,12,12,
12,12,71,118,12,118,71,71,12,12,12,12,118,71,218,71,218,71,118,12,
12,71,12,71,218,71,99,218,123,71,71,12,71,118,71,71,99,218,218,99,
218,99,218,218,218,71,123,71,218,218,218,218,99,99,99,58,99,99,99,218,
99,71,71,71,11,71,11,11,11,11,11,11,11,11,71,118,12,118,218,218,
71,218,71,71,218,71,99,71,99,99,99,58,218,99,218,218,71,71,71,71,
71,71,123,71,11,99,99,99,218,218,71,71,12,12,12,71,123,218,71,218,
71,118,71,12,118,12,12,71,71,218,118,12,12,12,92,12,71,118,71,71,
12,71,92,12,92,12,12,12,118,12,12,92,92,12,92,12,92,92,92,92,
92,92,92,92,12,92,92,92,92,8,92,92,92,12,92,92,92,92,92,92,
92,92,92,12,92,92,12,12,92,92,92,12,92,92,12,12,118,12,12,92,
92,12,12,12,71,71,71,118,12,118,12,12,12,71,12,71,71,71,71,12,
12,12,118,12,12,118,218,71,71,71,12,71,71,71,12,12,71,71,71,11,
218,99,218,218,218,218,71,71,71,71,71,71,71,71,218,218,218,218,99,218,
218,218,99,218,99,218,218,218,218,218,218,218,218,99,218,11,218,71,71,71,
71,123,71,123,71,218,99,218,218,11,218,99,71,71,71,71,71,71,71,92,
71,71,71,123,71,218,71,71,71,118,12,12,12,12,71,71,71,218,71,71,
12,12,12,12,12,12,12,71,71,71,12,12,12,12,12,12,12,12,118,12,
12,92,92,92,12,92,12,71,12,92,92,12,92,92,92,92,92,12,92,92,
92,92,92,92,92,92,92,92,92,8,92,19,92,92,92,92,92,223,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,12,118,12,12,
12,92,92,12,92,12,12,12,71,12,49,12,92,92,12,12,71,12,12,12,
12,71,12,12,12,12,71,12,71,71,218,218,71,118,12,12,12,71,12,12,
71,123,71,71,99,71,71,123,71,123,71,123,71,71,71,71,71,71,71,71,
71,218,218,218,71,71,218,71,218,71,218,71,71,123,71,123,71,123,71,123,
218,71,218,218,218,218,71,71,71,71,71,12,12,12,12,12,12,12,71,71,
71,123,218,218,71,71,12,12,12,71,12,12,12,12,71,71,71,12,118,12,
12,92,12,12,12,12,12,12,71,12,92,12,92,12,12,118,12,12,12,92,
92,92,92,92,92,12,92,92,12,92,92,92,92,19,12,92,92,92,92,92,
12,92,92,92,92,92,92,92,92,8,19,108,19,108,12,19,92,92,92,92,
92,92,92,92,92,19,92,92,92,92,92,92,92,92,92,92,92,92,12,92,
92,92,92,92,92,92,12,12,12,12,71,12,92,92,92,92,12,92,118,12,
12,12,12,12,92,12,12,12,71,12,71,71,71,12,12,12,12,12,12,92,
112,118,71,12,71,71,71,218,71,71,71,71,71,71,12,12,12,12,12,12,
12,118,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
71,71,71,71,71,71,71,71,118,71,12,71,12,12,12,12,12,71,71,123,
71,71,71,92,12,12,12,12,92,92,71,12,12,12,12,71,12,12,92,12,
92,92,12,118,12,12,118,12,12,92,92,92,92,12,12,12,12,92,92,92,
92,12,92,12,92,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,19,19,108,92,8,92,92,19,92,108,92,19,92,92,92,
92,108,92,92,92,12,92,92,12,92,92,92,92,92,92,92,92,92,92,12,
12,92,92,92,92,223,12,92,12,12,12,12,12,92,92,12,92,12,12,12,
12,12,12,12,49,12,92,92,92,92,12,12,71,12,12,12,12,12,12,12,
92,92,118,92,12,12,118,12,12,12,12,12,12,71,12,12,12,12,12,12,
12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
12,12,118,118,12,118,12,12,12,12,12,12,12,12,12,12,12,12,71,12,
12,12,71,92,12,92,92,49,12,12,12,12,118,12,12,118,92,12,92,92,
12,12,12,12,123,12,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,92,92,19,92,92,108,
92,19,92,108,108,92,108,92,108,8,19,108,19,92,19,108,108,108,92,19,
92,92,19,92,108,108,92,108,108,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,12,12,12,12,12,12,92,92,92,92,92,92,12,12,12,12,12,118,12,
12,12,12,92,12,12,12,12,71,12,12,12,12,71,71,12,12,71,118,118,
12,12,12,12,12,118,12,12,12,92,12,12,12,12,12,71,12,12,118,12,
12,71,12,12,12,12,12,92,118,118,12,12,12,12,71,12,12,12,49,12,
92,12,92,92,92,12,92,12,12,12,12,12,92,92,92,92,92,92,92,92,
12,12,71,92,92,92,12,92,223,92,92,92,12,92,92,92,92,92,12,19,
92,92,92,92,92,92,108,92,108,19,92,108,108,108,92,92,19,108,92,108,
19,92,19,92,108,92,108,19,19,8,19,108,19,108,108,19,92,19,108,19,
19,108,108,19,19,92,108,92,92,108,19,12,108,108,92,19,108,108,92,19,
92,92,92,92,92,92,108,19,92,92,92,92,12,92,92,92,92,92,92,92,
92,92,92,12,12,118,123,92,12,12,92,92,92,92,92,92,12,12,12,12,
12,92,12,12,92,12,92,92,92,92,92,92,12,12,12,12,12,12,12,71,
71,12,12,12,12,12,12,12,71,12,12,12,12,12,12,92,12,12,92,12,
92,12,12,49,12,92,12,12,12,12,12,71,12,12,12,12,92,12,92,12,
92,92,92,92,92,12,12,12,12,92,12,12,92,92,92,92,92,92,12,12,
12,92,92,92,92,19,108,92,92,92,92,92,92,92,92,19,92,108,108,92,
92,92,92,19,108,92,19,108,92,108,108,92,19,92,108,19,108,92,108,92,
19,108,108,92,108,108,19,92,108,8,19,19,19,19,19,108,19,19,108,92,
19,19,108,92,19,19,108,19,108,92,108,19,92,19,92,92,92,19,92,92,
92,92,92,92,92,92,19,108,92,19,19,92,92,92,92,92,92,92,223,92,
223,92,92,92,92,92,92,92,92,92,92,92,92,223,92,92,92,12,92,12,
12,12,12,12,92,12,12,92,12,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,92,49,92,12,92,92,12,12,92,12,92,12,92,12,12,92,12,
12,12,12,12,12,12,12,92,92,92,12,92,92,92,92,92,92,92,92,92,
92,92,12,12,12,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,19,92,92,108,12,92,92,92,12,19,92,92,108,92,19,19,92,
92,92,92,92,108,19,92,19,19,92,92,108,108,92,108,92,19,19,19,108,
19,19,19,19,19,19,108,19,19,8,19,53,19,53,19,53,19,53,19,108,
19,108,19,108,108,108,19,108,19,108,19,108,108,108,108,19,108,19,108,19,
19,92,108,19,19,12,108,92,108,92,108,19,108,92,92,92,92,92,92,19,
92,19,108,92,19,92,92,92,92,92,92,92,92,92,92,92,108,108,19,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,92,92,92,12,92,19,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,108,19,92,92,223,92,92,92,92,92,92,
19,108,108,108,108,19,92,92,92,92,108,108,108,108,108,92,108,92,108,19,
92,19,108,108,19,108,108,108,108,108,19,19,19,19,19,19,108,108,53,19,
108,19,108,53,19,53,19,53,19,8,19,19,19,19,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,108,19,108,19,
19,19,19,19,108,19,108,19,108,19,108,19,19,19,19,108,19,92,92,92,
19,19,108,19,108,19,19,92,92,92,92,92,92,92,92,19,19,108,19,108,
19,92,19,92,92,92,92,92,92,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,19,19,19,92,19,19,92,19,19,108,92,92,92,19,92,92,92,
92,92,92,92,92,19,19,19,19,108,19,108,92,92,92,92,92,92,19,19,
92,19,223,19,108,19,108,92,19,19,19,19,19,19,108,19,108,19,108,19,
19,19,19,19,19,19,19,19,19,108,19,108,19,108,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,8};

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
Encrypt_Decrypt

View File

@ -1,986 +0,0 @@
/**********************************************************************
ATTENTION: Plug-In Arguments Have Been Changed!!!!!
This version will not be fully backwards compatible
with the version 1.0x. Nevertheless it can encrypt and
decrypt version 1.0x images.
**********************************************************************/
/**********************************************************************
* Encrypt_Decrypt Plug-In (Version 2.02)
* Daniel Cotting (cotting@mygale.org)
**********************************************************************
* Official homepages: http://www.mygale.org/~cotting
* http://cotting.citeweb.net
* http://village.cyberbrain.com/cotting
*********************************************************************/
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/**********************************************************************
* Include files
*********************************************************************/
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "libgimp/gimp.h"
#include "gtk/gtk.h"
#include "logo.h"
/**********************************************************************
* Define constants
*********************************************************************/
#define ENTRY_WIDTH 260
/* Large Prime */
#define MULT 1103515245l
/**********************************************************************
* Declare some of the local functions
*********************************************************************/
static void query(void);
static void run(char *name, int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
static void drawEncrypt(GDrawable *drawable);
static gint encrypt_dialog(void);
static gint encrypt_warning_dialog(void);
static gint encrypt_enter_dialog(void);
static gint encrypt_no_last_val_dialog(void);
GtkWidget * encrypt_logo_dialog(void);
/**********************************************************************
* Define types of structures
*********************************************************************/
typedef struct {
char password[128];
gint warningmessage;
gint compatibility;
gint remember;
} EncryptValues;
typedef struct {
gint run;
} EncryptInterface;
/**********************************************************************
* Define structure and set their values
*********************************************************************/
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
static EncryptValues wvals = {
"Enter password here.",1,0,0,
}; /* wvals */
static EncryptInterface bint =
{
FALSE /* run */
};
/**********************************************************************
* Declare global variables
*********************************************************************/
GtkWidget *maindlg;
GtkWidget *logodlg;
GtkTooltips *tips;
GdkColor tips_fg,tips_bg;
/* This is initialized with the password or a part of the password. It is
used as the seed value in StandardRandom */
long Seed;
/* Table for R250 number generator */
long Table[250];
/* Increment table - speeds R250 up, but not really needed in this case */
unsigned char IncrementTable[250];
/* Two Index values into R250 table */
unsigned char Index1, Index2;
/**********************************************************************
* call MAIN()
*********************************************************************/
MAIN()
/**********************************************************************
* FUNCTION query
*********************************************************************/
static void
query(void)
{
static GParamDef args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image (unused)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
{ PARAM_STRING, "password", "Password (used to encrypt and decrypt)" },
{ PARAM_INT8, "warning", "Disable warning message toggle (only in RUN_INTERACTIVE)" },
{ PARAM_INT8, "compatibility", "Use version 1.0x compatibility mode" },
{ PARAM_INT8, "remember", "Remember the password after execution" },
};
static GParamDef *return_vals = NULL;
static int nargs = sizeof(args)/ sizeof(args[0]);
static int nreturn_vals = 0;
gimp_install_procedure("plug_in_encrypt",
"Encrypt the image using a code, second call with same code decrypts image.",
"",
"Daniel Cotting (cotting@mygale.org, http://www.mygale.org/~cotting)",
"Daniel Cotting (cotting@mygale.org, http://www.mygale.org/~cotting)",
"October, 1997",
"<Image>/Filters/Crypt/Encrypt and Decrypt",
"RGB*, GRAY*, INDEXED*",
PROC_PLUG_IN,
nargs, nreturn_vals,
args, return_vals);
}
/**********************************************************************
* FUNCTION run
*********************************************************************/
static void
run(char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals)
{
static GParam values[1];
GDrawable *drawable;
int succeeded=1;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
gchar **argv;
gint argc;
int iaa, expression;
run_mode = param[0].data.d_int32;
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
*nreturn_vals = 1;
*return_vals = values;
drawable = gimp_drawable_get(param[2].data.d_drawable);
switch(run_mode) {
case RUN_INTERACTIVE:
/* Possibly retrieve data */
gimp_get_data("plug_in_encrypt", &wvals);
/* Get information from the dialog */
argc = 1;
argv = g_new(gchar *, 1);
argv[0] = g_strdup("apply_encrypt");
gtk_init(&argc, &argv);
gtk_rc_parse(gimp_gtkrc());
do {
if (!encrypt_dialog())
return;
expression=((!strcmp(wvals.password,"Enter password here.") ||
(wvals.compatibility&&(atoi(wvals.password)==0)))
&& (succeeded=encrypt_enter_dialog()));
} while (expression);
if (!succeeded)
return;
if (wvals.warningmessage)
if (!encrypt_warning_dialog())
return;
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are present */
if (nparams != 7)
status = STATUS_CALLING_ERROR;
if (status == STATUS_SUCCESS) {
strcpy(wvals.password,param[3].data.d_string);
wvals.warningmessage = param[4].data.d_int8;
wvals.compatibility = param[5].data.d_int8;
wvals.remember = param[6].data.d_int8;
}
break;
case RUN_WITH_LAST_VALS:
/* Possibly retrieve data */
gimp_get_data("plug_in_encrypt", &wvals);
argc = 1;
argv = g_new(gchar *, 1);
argv[0] = g_strdup("apply_encrypt");
gtk_init(&argc, &argv);
gtk_rc_parse(gimp_gtkrc());
if (!wvals.remember) {
encrypt_no_last_val_dialog();
return;
}
break;
default:
break;
}
if (status == STATUS_SUCCESS) {
gimp_tile_cache_ntiles(2 *(drawable->width / gimp_tile_width() + 1));
gimp_progress_init("Encrypting image. Please wait...");
drawEncrypt(drawable);
if (!wvals.remember){
/* Delete active Password */
for (iaa=0; iaa<128; iaa++) wvals.password[iaa] = 0;
}
if(run_mode != RUN_NONINTERACTIVE)
gimp_displays_flush();
if(run_mode == RUN_INTERACTIVE)
gimp_set_data("plug_in_encrypt", &wvals, sizeof(EncryptValues));
values[0].data.d_status = status;
gimp_drawable_detach(drawable);
}
}
/**********************************************************************
* FUNCTIONS for the random number generator
*********************************************************************/
/* Code provided by Pascal Schuppli, Worb (Switzerland)
Fast high security encryption based on two 'random' number generators
Sets up the increment table and the two index pointers */
void InitGenerator() {
int i;
for (i=0; i<249; i++) IncrementTable[i] = i+1;
IncrementTable[249] = 0;
Index1 = 0;
Index2 = 103;
}
/* StandardRandom is used to initialize the R250 random number table. It is
neither fast nor very good. */
long StandardRandom() {
unsigned long lo, hi, ll, lh, hh, hl;
lo = Seed & 0xFFFF;
hi = Seed >> 16;
Seed = Seed * MULT + 12345;
ll = lo*(MULT & 0xFFFF);
lh = lo*(MULT >> 16);
hl = hi*(MULT & 0xFFFF);
hh = hi*(MULT >> 16);
return ((ll + 12345) >> 16) + lh + hl + (hh << 16);
}
/* Fill R250 table. Use two seeds (64 bit encoding)
This is where most of the processing power goes when trying to break an
encrypted file. Because StandardRandom is not very fast, and because it is
called 500 times, this takes the CPU a couple thousand cycles. The table
needed to decrypt a file thus can't be constructed without serious delays,
which is the whole point of high security encryption. */
void FillTable(long FirstSeed, long SecondSeed) {
int i;
/* Construct table with first seed */
Seed = FirstSeed;
for (i=0; i<250; i++)
Table[i] = StandardRandom();
/* Xor second seed into table. Not sure whether this makes the random numbers
better or worse, but it takes time */
Seed = SecondSeed;
for (i=0; i<250; i++)
Table[i] ^= StandardRandom();
}
/* Returns a four-byte random number generated by 'xoring' two table entries */
unsigned long R250Random() {
unsigned long ret;
ret = (Table[Index1] ^= Table[Index2]);
Index1 = IncrementTable[Index1];
Index2 = IncrementTable[Index2];
return ret;
}
/**********************************************************************
* FUNCTION drawEncrypt
*********************************************************************/
static void
drawEncrypt(GDrawable *drawable)
{
char Password[128];
/* Take some primes to start with */
long s1 = 17, s2 = 23;
GPixelRgn srcPR, destPR;
gint width, height;
gint bytes;
gint row;
gint x1, y1, x2, y2, ix, iy;
guchar *src, *dest;
int password;
gint i, col;
gfloat regionwidth, regionheight, dx, dy;
gfloat a, b, x, y;
glong pixelpos, pos;
guchar bgr_red, bgr_blue, bgr_green;
if (!wvals.compatibility){
for (i=0; i<128; i++) Password[i] = 1;
strcpy(Password, wvals.password);
InitGenerator();
/* The hash algorithm should make sure that the hash codes it generates
differ so that code breakers cannot concentrate on a certain range of
seeds to speed up the process of breaking the code.
Hash up keyword, -> create two four-byte seeds */
for (i=0; i<strlen(Password); i++) {
s1 ^= *(long *)&Password[i];
s1 <<= 1;
}
for (i=strlen(Password)-1; i>=0; i--) {
s2 ^= *(long *)&Password[i];
s2 <<= 3;
}
/* Generate table with hash value */
FillTable(s1, s2);
}
gimp_palette_get_background(&bgr_red, &bgr_green, &bgr_blue);
gimp_drawable_mask_bounds(drawable->id, &x1, &y1, &x2, &y2);
regionwidth = x2-x1;
a = regionwidth/2;
regionheight = y2-y1;
b = regionheight/2;
width = drawable->width;
height = drawable->height;
bytes = drawable->bpp;
gimp_pixel_rgn_init(&srcPR, drawable, 0, 0, width, height, FALSE, FALSE);
gimp_pixel_rgn_init(&destPR, drawable, 0, 0, width, height, TRUE, TRUE);
src = g_malloc((x2-x1)*(y2-y1)*bytes);
dest = g_malloc((x2-x1)*(y2-y1)*bytes);
gimp_pixel_rgn_get_rect(&srcPR, src, x1, y1, regionwidth, regionheight);
if (wvals.compatibility) {
password=atoi(wvals.password);
srand(password);
}
for(col = 0; col < regionwidth; col++) {
dx = (gfloat)col - a;
for(row = 0; row < regionheight; row++) {
pixelpos = (col+row*regionwidth)*bytes;
dy = -((gfloat)row - b);
x = dx+a;
y = -dy+b;
ix=(int)x;
iy=(int)y;
pos = ((gint)(iy)*regionwidth + (gint)(ix)) * bytes;
for(i = 0; i < bytes; i++) {
if (!wvals.compatibility) {
dest[pixelpos+i] = src[pos+i]^R250Random();
} else {
dest[pixelpos+i] = src[pos+i] ^(int)(rand()*255)^(int)(rand()*255);
}
}
}
if(((gint)(regionwidth-col) % 5) == 0)
gimp_progress_update((gdouble)col/(gdouble)regionwidth);
}
gimp_pixel_rgn_set_rect(&destPR, dest, x1, y1, regionwidth, regionheight);
g_free(src);
g_free(dest);
gimp_drawable_flush(drawable);
gimp_drawable_merge_shadow(drawable->id, TRUE);
gimp_drawable_update(drawable->id, x1, y1,(x2 - x1),(y2 - y1));
}
/**********************************************************************
* FUNCTIONS: callbacks
*********************************************************************/
static void
encrypt_close_callback(GtkWidget *widget, gpointer data)
{
gtk_main_quit();
}
static void
encrypt_ok_callback(GtkWidget *widget, gpointer data)
{
bint.run = TRUE;
gtk_widget_destroy(GTK_WIDGET (data));
}
static void
encrypt_logo_ok_callback(GtkWidget *widget, gpointer data)
{
gtk_widget_set_sensitive (maindlg, TRUE);
gtk_widget_destroy(logodlg);
}
static void
encrypt_about_callback(GtkWidget *widget, gpointer data)
{
gtk_widget_set_sensitive (maindlg, FALSE);
encrypt_logo_dialog();
}
static void
encrypt_entry_callback(GtkWidget *widget, gpointer data)
{
strcpy(wvals.password,gtk_entry_get_text(GTK_ENTRY(widget)));
}
static void
toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
/**********************************************************************
* FUNCTION set_tooltip
*********************************************************************/
static void
set_tooltip (GtkTooltips *tooltips, GtkWidget *widget, const char *desc)
{
if (desc && desc[0])
gtk_tooltips_set_tips (tooltips, widget, (char *) desc);
}
/**********************************************************************
* FUNCTIONS: encrypt_dialog
*********************************************************************/
static gint
encrypt_dialog()
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *button;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
gchar buffer[128];
bint.run=FALSE;
dlg = maindlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dlg), "Encrypt & Decrypt <cotting@mygale.org>");
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc)encrypt_close_callback,
NULL);
frame = gtk_frame_new("Parameter Settings");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(vbox), 10);
gtk_container_add(GTK_CONTAINER(frame), vbox);
/* use black as foreground: */
tips = gtk_tooltips_new ();
tips_fg.red = 0;
tips_fg.green = 0;
tips_fg.blue = 0;
/* postit yellow (khaki) as background: */
gdk_color_alloc (gtk_widget_get_colormap (frame), &tips_fg);
tips_bg.red = 61669;
tips_bg.green = 59113;
tips_bg.blue = 35979;
gdk_color_alloc (gtk_widget_get_colormap (frame), &tips_bg);
gtk_tooltips_set_colors (tips,&tips_bg,&tips_fg);
hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
label = gtk_label_new("Password: ");
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0);
gtk_widget_show(label);
entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, FALSE, 0);
gtk_widget_set_usize(entry, ENTRY_WIDTH, 0);
sprintf(buffer, "%s", wvals.password);
gtk_entry_set_text(GTK_ENTRY(entry), buffer);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
(GtkSignalFunc)encrypt_entry_callback,
NULL);
gtk_widget_show(entry);
set_tooltip(tips,entry,"Here, you can specify your password. To decrypt your image, just enter the value you used for the encryption. Unless you use version 1.0x compatibility (numeric passwords), the password can contain any characters.");
gtk_widget_show(hbox);
toggle = gtk_check_button_new_with_label ("Show warning message");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&wvals.warningmessage);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), wvals.warningmessage);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"If this option is enabled, a warning message will be displayed every time you encrypt/decrypt an image. Make sure to read these warnings at least once.");
toggle = gtk_check_button_new_with_label ("Enable version 1.0x compatibility");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&wvals.compatibility);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), wvals.compatibility);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"If this option is enabled, the encryption/decryption will be compatible with the version 1.0x plug-in.");
toggle = gtk_check_button_new_with_label ("Remember password");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&wvals.remember);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), wvals.remember);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"If this option is enabled, the password will be remembered for a further encryption/decryption.");
gtk_widget_show(vbox);
gtk_widget_show(frame);
button = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)encrypt_ok_callback,
dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
set_tooltip(tips,button,"Close the dialog box and encrypt/decrypt your image with the specified password.");
button = gtk_button_new_with_label("Cancel");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)gtk_widget_destroy,
GTK_OBJECT(dlg));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Close the dialog box without altering your image.");
button = gtk_button_new_with_label("About...");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)encrypt_about_callback,button);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Show information about the author and the plug-in.");
gtk_widget_show(dlg);
gtk_main();
gdk_flush();
return bint.run;
}
/**********************************************************************
* FUNCTION encrypt_warning_dialog
*********************************************************************/
static gint
encrypt_warning_dialog()
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *button;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
bint.run=FALSE;
dlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dlg), "Warning");
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc)encrypt_close_callback,
NULL);
button = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)encrypt_ok_callback,
dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
set_tooltip(tips,button,"Proceed with the encryption/decryption.");
button = gtk_button_new_with_label("Cancel");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)gtk_widget_destroy,
GTK_OBJECT(dlg));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Cancel the encryption/decryption.");
frame = gtk_frame_new("Please note:");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(vbox), 10);
gtk_container_add(GTK_CONTAINER(frame), vbox);
hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
if (wvals.compatibility) {
label = gtk_label_new("Version 1.0x compatibility mode:\n\n"
"This plug-in uses a numeric password to encrypt your image.\n\n"
"Although it has been tested thoroughly, the author cannot be\n"
"sure that it will work properly in all circumstances. Therefore\n"
"the author doesn't want to take any responsibility in case of\n"
"data loss or any other damage this plug-in could cause.\n\n"
"*******USE IT AT YOUR OWN RISK (AND ENJOY IT)!*******\n\n"
"The plug-in could fail in the following situations, because of\n"
"a possibly different implementation of the random number\n"
"generator: - Encrypt a picture and decrypt it on a different\n"
"plattform. OR - Decrypt a picture that was encrypted on a\n"
"computer with a different OS-version or a different math-lib.\n\n"
"Remember to save your image in a non-destructive format!\n"
"For indexed images GIF could be a good choice, for RGB\n"
"use BMP/TIFF/TGA etc. Never use a JPEG-compression!\n");
} else {
label = gtk_label_new("This plug-in uses a password to encrypt your image.\n\n"
"Although it has been tested thoroughly, the author cannot be\n"
"sure that it will work properly in all circumstances. Therefore\n"
"the author doesn't want to take any responsibility in case of\n"
"data loss or any other damage this plug-in could cause.\n\n"
"*******USE IT AT YOUR OWN RISK (AND ENJOY IT)!*******\n\n"
"Remember to save your image in a non-destructive format!\n"
"For indexed images GIF could be a good choice, for RGB\n"
"use BMP/TIFF/TGA etc. Never use a JPEG-compression!\n");
}
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0);
gtk_widget_show(label);
toggle = gtk_check_button_new_with_label ("Show warning message every time");
gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) toggle_update,
&wvals.warningmessage);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), wvals.warningmessage);
gtk_widget_show (toggle);
set_tooltip(tips,toggle,"If you want this message to be displayed every time you encrypt/decrypt an image, then check this box.");
gtk_widget_show(hbox);
gtk_widget_show(vbox);
gtk_widget_show(frame);
gtk_widget_show(dlg);
gtk_main();
gdk_flush();
return bint.run;
}
/**********************************************************************
* FUNCTION encrypt_enter_dialog
*********************************************************************/
static gint
encrypt_enter_dialog()
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *button;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
bint.run=FALSE;
dlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dlg), "Warning");
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc)encrypt_close_callback,
NULL);
button = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)encrypt_ok_callback,
dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
set_tooltip(tips,button,"Repeat password selection.");
button = gtk_button_new_with_label("Cancel");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)gtk_widget_destroy,
GTK_OBJECT(dlg));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_show(button);
set_tooltip(tips,button,"Cancel process of encryption/decryption.");
frame = gtk_frame_new("Password needed:");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(vbox), 10);
gtk_container_add(GTK_CONTAINER(frame), vbox);
hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
label = gtk_label_new("You have not entered a valid, personalized password.\n"
"If you want to use the version 1.0x compatibility\n"
"mode, make sure that the password consists only of\n"
"numerical characters (0-9).\n\n"
"Choose OK to repeat your password selection.\n"
"Choose CANCEL to abort the encryption.\n");
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0);
gtk_widget_show(label);
gtk_widget_show(hbox);
gtk_widget_show(vbox);
gtk_widget_show(frame);
gtk_widget_show(dlg);
gtk_main();
gdk_flush();
return bint.run;
}
/**********************************************************************
* FUNCTION encrypt_no_last_val_dialog
*********************************************************************/
static gint
encrypt_no_last_val_dialog()
{
GtkWidget *dlg;
GtkWidget *label;
GtkWidget *button;
GtkWidget *frame;
GtkWidget *vbox;
GtkWidget *hbox;
bint.run=FALSE;
dlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dlg), "Error");
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc)encrypt_close_callback,
NULL);
button = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc)encrypt_ok_callback,
dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
button, TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
frame = gtk_frame_new("Run with last values:");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, TRUE, TRUE, 0);
vbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(vbox), 10);
gtk_container_add(GTK_CONTAINER(frame), vbox);
hbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
label = gtk_label_new("For security reasons, the last password has not\n"
"been saved for further use. Thus the plug-in cannot\n"
"be executed in non-interactive mode. If you want to\n"
"be able to do this, enable the option 'remember password'\n"
"in the dialog box of the plug-in.\n");
gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, FALSE, 0);
gtk_widget_show(label);
gtk_widget_show(hbox);
gtk_widget_show(vbox);
gtk_widget_show(frame);
gtk_widget_show(dlg);
gtk_main();
gdk_flush();
return bint.run;
}
/**********************************************************************
* FUNCTION encrypt_logo_dialog
*********************************************************************/
GtkWidget *
encrypt_logo_dialog()
{
GtkWidget *xdlg;
GtkWidget *xlabel;
GtkWidget *xbutton;
GtkWidget *xlogo_box;
GtkWidget *xpreview;
GtkWidget *xframe,*xframe2;
GtkWidget *xvbox;
GtkWidget *xhbox;
char *text;
guchar *temp,*temp2;
guchar *datapointer;
gint y,x;
xdlg = logodlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(xdlg), "About");
gtk_window_position(GTK_WINDOW(xdlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(xdlg), "destroy",
(GtkSignalFunc)encrypt_close_callback,
NULL);
xbutton = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(xbutton, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(xbutton), "clicked",
(GtkSignalFunc)encrypt_logo_ok_callback,
xdlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(xdlg)->action_area),
xbutton, TRUE, TRUE, 0);
gtk_widget_grab_default(xbutton);
gtk_widget_show(xbutton);
set_tooltip(tips,xbutton,"Click here to close the information box.");
xframe = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(xframe), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(xframe), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(xdlg)->vbox), xframe, TRUE, TRUE, 0);
xvbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(xvbox), 10);
gtk_container_add(GTK_CONTAINER(xframe), xvbox);
/* The logo frame & drawing area */
xhbox = gtk_hbox_new (FALSE, 5);
gtk_box_pack_start (GTK_BOX (xvbox), xhbox, FALSE, TRUE, 0);
xlogo_box = gtk_vbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX (xhbox), xlogo_box, FALSE, FALSE, 0);
xframe2 = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (xframe2), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (xlogo_box), xframe2, FALSE, FALSE, 0);
xpreview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (xpreview), logo_width, logo_height);
temp = g_malloc((logo_width+10)*3);
datapointer=header_data+logo_width*logo_height-1;
for (y = 0; y < logo_height; y++){
temp2=temp;
for (x = 0; x< logo_width; x++) {
HEADER_PIXEL(datapointer,temp2); temp2+=3;}
gtk_preview_draw_row (GTK_PREVIEW (xpreview),
temp,
0, y, logo_width);
}
g_free(temp);
gtk_container_add (GTK_CONTAINER (xframe2), xpreview);
gtk_widget_show (xpreview);
gtk_widget_show (xframe2);
gtk_widget_show (xlogo_box);
gtk_widget_show (xhbox);
xhbox = gtk_hbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(xvbox), xhbox, TRUE, TRUE, 0);
text = "\nCotting Software Productions\n"
"Bahnhofstrasse 31\n"
"CH-3066 Stettlen (Switzerland)\n\n"
"cotting@mygale.org\n"
"http://www.mygale.org/~cotting\n\n"
"Encrypt & Decrypt\n Plug-In for the GIMP\n"
"Version 2.02\n";
xlabel = gtk_label_new(text);
gtk_box_pack_start(GTK_BOX(xhbox), xlabel, TRUE, FALSE, 0);
gtk_widget_show(xlabel);
gtk_widget_show(xhbox);
gtk_widget_show(xvbox);
gtk_widget_show(xframe);
gtk_widget_show(xdlg);
gtk_main();
gdk_flush();
return xdlg;
}

View File

@ -1,73 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 2.02 the size of
the logo in the about box has been reduced
in order to make smaller binaries.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is available
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,43 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = Encrypt_Decrypt
Encrypt_Decrypt_SOURCES = \
Encrypt_Decrypt.c logo.h
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
Encrypt_Decrypt_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,73 +0,0 @@
-------------------------------------------
GIMP-Plug-In
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
With this new release 2.02 the size of
the logo in the about box has been reduced
in order to make smaller binaries.
If you find that the plug-in is still
too big, you can compress the executables
with the gzexe program (if it is available
on your system). To do so, change to the
plug-in directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,788 +0,0 @@
/* GIMP header image file format (Indexed): //logo.h */
static unsigned int logo_width = 200;
static unsigned int logo_height = 72;
/* Call this macro repeatedly. After each use, the pixel data can be extracted */
#define HEADER_PIXEL(data,pixel) \
pixel[0] = palette_data[data[0]*3+2]; \
pixel[1] = palette_data[data[0]*3+1]; \
pixel[2] = palette_data[data[0]*3+0]; \
data--;
static unsigned char
palette_data[] = { 4,2,2,4,110,178,32,4,122,4,36,
86,15,3,66,4,58,127,36,8,186,4,34,122,17,2,
34,4,19,66,12,4,162,90,2,69,88,2,48,7,20,
2,25,2,103,8,14,48,4,58,186,90,3,154,82,2,
129,55,2,34,17,2,18,17,34,191,94,2,101,57,2,
70,7,32,154,12,22,157,17,3,50,4,88,150,96,3,
186,86,2,138,87,2,86,212,214,210,4,19,98,52,2,
154,15,11,2,4,132,216,7,18,125,12,6,82,37,12,
18,4,88,189,86,14,48,128,2,157,32,4,138,4,60,
155,4,48,126,60,2,218,7,10,52,13,12,66,129,2,
50,56,2,52,52,14,98,4,47,157,6,20,87,48,2,
24,58,2,101,120,2,141,52,5,170,4,113,215,127,2,
73,4,90,210,4,52,112,36,18,194,59,2,85,42,2,
10,107,2,173,95,2,114,31,3,52,4,79,160,84,3,
189,14,10,40,30,2,69,96,2,58,113,2,126,9,37,
231,17,33,170,28,14,2,4,30,146,68,10,37,132,2,
82,23,4,7,4,10,122,4,36,108,32,2,37,7,27,
2,4,98,175,84,10,146,4,101,191,4,14,146,8,29,
86,4,2,170,8,60,230,84,10,162,72,2,39,102,2,
142,4,142,221,4,49,143,68,12,170,4,124,213,15,4,
74,114,2,69,112,2,158,32,3,23,8,50,190,111,2,
104,6,40,154,96,2,210,6,28,104,60,2,138,61,2,
25,68,2,114,58,2,125,39,2,114,73,2,69,16,4,
58,4,88,177,56,14,26,138,2,173,4,68,176,71,2,
55,76,2,210,4,78,130,17,3,42,6,27,69,112,2,
49,12,26,178,47,13,159,18,11,10,13,11,74,141,2,
58,52,18,234,4,82,186,4,126,198,4,103,213,4,62,
206,4,72,226,12,46,210,72,12,222,12,26,146,20,34,
210,4,113,197,4,131,229,4,48,170,4,76,170,7,43,
95,52,30,218,15,11,170,52,14,202,12,14,86,4,40,
174,108,14,202,156,2,186,60,12,130,5,40,129,73,13,
189,12,42,138,44,14,202,4,59,143,4,124,229,4,69,
191,4,69,157,4,60,114,4,43,110,14,14,58,20,26,
157,28,26,210,4,87,162,4,91,202,4,110,226,4,98,
226,4,101,202,17,14,186,28,18,18,60,2,234,28,10,
114,4,30,114,8,10,162,12,54,186,20,26,130,100,10,
170,40,18,154,4,22,114,28,26,234,4,22,58,4,66,
226,4,54,202,12,42,202,4,38,98,4,145,234,4,76,
146,4,94,148,4,138,213,4,94,186,4,54,126,4,54,
154,4,118,211,4,106,178,4,106,188,4,54,142,4,94,
170,4,70,202,4,118,197,4,54,173,4,82,178,72,4,
172,36,10,138,76,14,162,4,98,210,4,118,226,112,2,
114,24,19,8,30,2,85,84,6,226,141,2,73,28,30,
10,28,46,186,112,4,206,36,10,90,36,2,174,108,2,
58,41,3,130,44,10,194,9,33,130,92,2,162,51,2,
42,12,32,162,81,3,146,44,11,26,28,6,146,44,2,
178,30,12,10,60,10,178,64,2,146,28,10,178,92,10,
210,5,41,146,40,2,102,96,2,125,100,2,88,74,2,
157,142,2,159,26,10,55,143,2,50,73,2,102,134,2,
142,73,2,84,127,2,126,142,2,82,156,2,178,28,10,
158,28,26,114,84,14,202,12,4,10,5,20,74,17,2,
26,92,2,194,7,19,106};
static unsigned char header_data[] = { 71,99,218,218,99,11,71,218,71,71,
218,99,99,99,71,99,218,99,99,99,99,218,71,218,99,218,218,99,99,218,
218,99,99,218,99,218,99,58,218,99,99,99,58,218,99,99,99,58,99,58,
99,58,11,58,99,58,58,11,99,58,99,58,99,99,99,218,99,218,99,58,
99,71,99,218,71,12,12,12,12,12,12,12,12,12,92,19,19,19,92,92,
92,92,19,108,19,19,19,19,19,19,53,53,53,53,101,19,19,53,53,19,
19,19,12,92,92,12,12,12,71,71,218,99,218,218,71,71,12,12,218,99,
58,58,58,99,99,99,58,99,99,99,11,58,11,58,58,99,58,99,99,99,
58,99,99,99,99,58,99,99,99,99,99,218,99,99,11,99,99,99,11,99,
99,218,218,218,99,218,99,99,218,218,99,99,218,99,218,218,99,99,218,11,
218,71,99,218,99,218,218,99,71,8,218,99,218,218,99,99,99,99,99,99,
218,218,99,99,218,99,218,99,218,71,99,99,99,218,99,99,218,99,99,99,
218,218,99,99,99,99,58,99,58,30,99,99,99,99,99,99,58,99,99,58,
99,58,99,58,99,99,58,58,58,99,58,58,99,218,218,71,99,99,71,71,
71,123,12,118,71,71,12,71,123,12,12,19,19,19,53,19,19,53,53,19,
19,53,101,63,20,63,20,63,53,53,53,101,53,53,53,19,53,53,53,19,
92,12,12,12,71,12,12,12,12,12,92,71,218,218,71,218,71,71,71,71,
99,218,58,58,58,99,99,99,99,58,58,58,99,58,99,58,58,99,58,58,
99,99,58,99,99,99,99,58,99,58,30,99,99,99,218,99,58,99,99,58,
11,99,99,218,99,218,218,99,99,218,71,99,218,99,99,218,99,99,218,99,
11,218,99,218,99,11,218,99,99,8,71,71,71,99,218,71,218,99,71,218,
11,99,218,218,99,218,99,218,99,99,99,99,218,99,99,99,99,99,218,99,
99,99,99,99,99,11,99,99,99,99,99,99,58,99,58,99,58,99,58,58,
99,11,58,58,99,58,99,99,58,58,218,99,123,71,71,71,123,71,71,218,
99,99,218,71,12,12,12,12,92,19,19,53,19,53,53,53,53,19,53,53,
53,53,19,53,19,53,53,53,53,53,63,63,101,63,63,20,53,19,53,53,
53,19,92,92,12,12,12,71,71,71,71,12,12,71,71,12,12,12,12,12,
12,218,218,99,58,58,99,58,99,58,99,58,99,99,58,218,58,99,58,99,
99,99,99,11,58,99,99,58,99,99,58,58,99,99,99,99,99,99,99,99,
99,58,218,99,218,99,99,99,218,99,99,218,99,11,218,99,218,218,99,99,
218,99,218,11,99,71,99,218,71,8,99,99,218,99,99,99,218,99,99,218,
218,99,11,99,99,218,99,218,99,218,218,99,58,99,99,99,58,11,99,99,
58,99,99,58,58,58,58,99,99,99,99,218,58,99,99,99,58,58,99,99,
58,58,99,58,99,58,99,99,58,58,99,218,71,71,218,218,218,58,58,58,
218,99,71,123,12,12,12,19,19,108,108,108,92,92,92,12,71,12,12,92,
19,53,53,53,101,53,53,19,53,101,53,20,53,79,79,0,34,79,20,63,
53,53,53,19,19,19,12,12,12,71,71,71,71,71,71,123,71,12,12,12,
12,12,71,71,218,58,99,58,218,58,218,99,58,99,58,99,99,218,58,58,
58,99,58,58,99,99,58,99,58,99,99,218,58,58,99,99,99,99,99,99,
58,11,99,99,218,218,218,99,218,99,99,218,218,99,218,99,99,218,218,99,
218,99,71,218,99,218,99,99,99,8,218,218,99,218,99,218,99,218,218,99,
11,218,218,218,218,99,71,99,218,99,99,99,218,58,99,99,99,99,218,30,
58,99,58,99,58,11,58,99,58,99,58,58,58,99,58,58,99,99,58,58,
58,99,58,99,58,58,99,58,218,99,99,218,58,99,58,58,58,58,58,218,
71,12,12,71,71,12,12,12,12,71,71,118,71,71,118,71,71,12,223,19,
19,53,53,53,53,63,229,20,79,20,34,0,20,101,101,63,20,101,101,53,
108,53,53,53,53,53,101,19,92,12,12,12,12,71,71,218,218,218,71,71,
118,12,71,71,218,218,58,58,58,58,58,58,218,58,58,58,99,99,218,99,
58,58,99,99,58,99,58,99,58,58,58,99,99,99,58,99,99,99,58,58,
99,58,58,99,99,99,99,99,99,99,218,99,99,218,99,218,218,99,99,218,
99,58,99,99,218,99,218,218,218,8,99,218,99,218,99,218,11,99,218,99,
99,99,99,99,218,99,58,99,99,99,58,99,218,99,99,99,99,99,58,99,
58,218,99,99,99,58,218,58,58,58,99,99,58,99,218,58,99,99,58,218,
58,99,58,99,99,99,58,99,58,58,58,58,99,58,58,58,58,218,218,12,
71,71,71,12,12,71,71,12,71,12,71,71,71,71,12,92,19,53,53,53,
101,63,79,34,251,0,0,63,20,53,19,53,53,53,53,19,19,53,19,19,
19,108,19,19,19,19,19,19,53,53,108,12,12,12,71,71,218,58,58,58,
99,218,71,71,71,12,218,99,99,58,58,58,58,218,58,58,58,58,58,99,
99,58,58,99,58,218,58,99,99,99,99,58,99,128,99,58,99,99,11,99,
99,58,11,58,99,99,99,218,58,11,99,58,99,218,99,99,218,99,99,99,
218,71,99,99,218,99,11,99,218,8,218,99,218,99,218,99,99,218,99,218,
58,218,58,218,99,99,218,99,58,99,99,99,99,78,11,58,99,58,99,99,
99,58,58,99,58,11,58,58,218,99,99,58,58,58,99,58,58,58,99,99,
58,58,58,58,58,58,99,58,99,99,99,58,58,58,58,58,218,71,118,12,
71,71,71,71,71,12,71,71,71,71,71,12,92,19,19,53,53,63,20,251,
0,79,79,0,79,34,34,79,0,63,229,20,63,101,53,101,19,53,19,92,
12,71,12,92,12,12,12,12,12,92,19,92,92,71,12,118,71,218,99,58,
58,58,58,58,218,123,71,218,58,58,58,99,58,58,58,218,58,218,58,58,
218,58,99,58,58,58,99,99,58,99,58,99,218,99,99,99,58,58,58,11,
58,58,99,58,99,99,30,99,99,99,58,218,218,30,99,218,99,99,99,218,
99,99,218,218,99,99,218,71,99,8,99,99,71,99,218,218,99,218,99,218,
99,218,99,58,11,58,99,99,11,58,99,58,99,99,99,99,58,58,99,99,
58,99,99,99,99,58,99,78,58,58,99,99,218,78,58,218,58,99,212,58,
99,58,58,58,218,58,58,58,58,58,58,58,58,58,218,71,12,12,71,71,
123,218,218,58,99,71,123,71,71,12,19,19,19,53,53,19,19,53,63,53,
101,101,101,63,101,101,20,20,79,0,0,79,79,34,251,79,79,251,101,53,
19,92,12,71,71,71,218,12,218,12,71,71,71,71,71,12,71,71,123,71,
58,58,58,58,58,58,58,99,99,58,58,58,99,58,58,58,99,58,99,58,
99,58,58,99,58,58,58,58,99,58,99,58,99,58,99,58,99,99,58,58,
99,99,99,58,99,58,58,58,99,99,99,30,128,58,99,99,99,99,99,58,
218,99,99,218,218,99,99,218,71,8,71,218,99,99,99,99,218,99,99,99,
99,30,58,11,58,58,99,58,58,58,58,30,58,58,99,99,99,58,99,58,
99,58,99,58,58,58,218,99,58,99,58,58,58,218,99,58,58,58,58,58,
58,99,99,99,58,99,99,58,58,212,99,58,58,218,71,71,218,218,99,58,
58,58,58,218,123,71,71,12,108,19,19,108,19,19,223,92,19,92,12,12,
19,19,19,19,53,53,63,63,229,0,34,34,79,0,79,0,75,34,0,34,
79,20,53,19,92,12,71,71,71,218,71,123,71,123,71,71,71,71,71,71,
71,218,58,58,58,58,58,58,58,99,58,58,58,58,58,58,58,58,99,58,
58,99,99,58,99,58,58,58,58,58,58,99,58,99,58,99,58,58,99,99,
58,58,99,99,58,58,218,58,58,99,58,99,11,58,58,99,58,218,99,99,
99,99,218,99,99,218,99,99,99,8,99,218,99,218,99,99,99,99,58,58,
11,58,99,58,58,30,58,11,58,11,58,99,99,58,99,58,58,58,99,58,
58,99,58,99,99,58,58,99,58,99,58,99,58,99,212,58,58,58,58,58,
58,58,58,58,58,58,58,58,58,58,212,58,218,218,218,99,58,58,58,58,
58,99,71,71,71,12,71,71,12,12,12,71,71,123,71,218,71,71,71,92,
19,108,63,79,229,126,0,79,0,0,34,34,34,126,34,251,79,0,126,34,
79,0,79,20,63,19,19,12,71,71,71,218,71,99,71,71,71,71,71,71,
71,71,218,58,58,58,212,58,58,58,58,58,58,58,58,58,58,58,58,58,
58,58,99,58,58,99,58,58,99,99,128,218,58,58,99,58,99,58,58,99,
218,58,58,218,99,99,99,99,99,99,58,99,99,58,30,218,99,99,99,99,
99,99,218,99,99,99,218,218,99,8,218,99,99,99,58,99,99,99,99,99,
58,58,218,99,99,99,58,99,58,58,58,99,58,99,58,99,99,99,58,58,
99,99,58,58,58,58,58,58,99,99,58,99,99,58,58,58,58,99,58,58,
99,58,99,58,78,212,99,212,99,58,58,99,58,58,78,78,246,99,212,58,
99,71,123,71,71,71,71,71,218,218,71,123,218,218,218,118,12,19,63,63,
0,0,0,34,34,0,34,79,79,79,0,34,79,79,20,101,53,101,53,19,
53,53,101,101,53,53,19,19,19,92,218,218,218,218,218,212,78,58,218,218,
71,71,71,11,58,246,58,78,246,58,58,58,99,99,58,58,99,58,212,58,
99,58,99,58,58,99,58,58,58,58,58,212,218,58,58,99,58,58,99,58,
99,99,99,58,58,99,99,99,58,99,58,58,99,99,99,58,58,99,99,99,
99,99,99,11,58,99,99,99,218,8,99,99,218,99,99,218,99,218,58,58,
11,78,58,99,58,99,58,99,58,11,58,99,58,99,58,58,58,99,99,58,
99,99,99,58,58,58,58,58,58,58,58,58,58,58,58,212,99,58,212,99,
58,58,78,58,78,58,58,58,58,58,58,58,58,58,246,58,246,58,58,71,
218,71,71,71,218,71,71,71,71,218,218,71,71,92,92,53,63,126,79,0,
0,79,0,79,34,79,0,126,79,79,79,79,79,229,229,101,53,108,92,71,
71,71,71,71,71,12,12,19,108,19,92,71,71,71,71,218,212,246,78,58,
58,218,218,71,71,58,58,212,212,78,212,78,78,58,58,58,58,58,99,58,
78,58,58,99,58,58,58,58,58,58,58,58,99,58,99,58,58,212,99,58,
58,99,58,99,58,99,99,58,58,99,99,58,58,58,58,11,78,99,99,99,
99,58,99,58,71,99,99,99,99,8,99,99,99,218,99,58,99,30,58,11,
58,11,58,58,99,58,58,99,58,99,58,99,99,58,99,58,99,58,58,99,
58,58,58,58,58,78,58,99,58,99,58,58,58,58,99,58,212,99,58,58,
58,78,78,78,58,58,58,58,58,212,58,78,58,78,78,78,58,99,218,218,
71,218,218,71,58,99,58,99,71,71,71,12,19,20,79,251,0,251,79,251,
79,63,126,79,79,79,79,229,79,79,79,126,126,79,79,63,20,53,53,92,
12,12,218,71,71,218,218,218,71,218,71,71,71,218,71,218,218,58,246,246,
78,212,78,58,218,218,58,58,58,246,78,212,78,212,58,58,58,58,58,212,
78,78,78,58,58,99,58,58,58,58,58,58,58,58,58,218,99,99,58,99,
58,58,218,99,58,58,99,58,99,99,58,99,99,99,58,99,99,58,58,58,
218,99,11,58,99,99,99,218,99,8,99,30,218,58,11,99,99,58,99,58,
99,58,58,99,218,99,218,58,99,99,58,58,58,58,99,58,99,99,58,99,
58,58,58,78,78,58,58,58,58,58,99,246,78,78,58,58,58,58,58,78,
78,212,78,246,246,58,58,58,212,58,212,246,78,246,58,212,218,218,218,218,
218,58,246,58,246,58,218,218,123,12,19,19,53,53,101,53,63,101,63,63,
63,63,63,63,63,101,63,53,63,53,53,53,53,108,19,19,19,19,108,19,
92,92,12,12,71,71,218,99,99,218,218,218,218,218,71,71,71,218,218,246,
78,78,246,78,78,78,58,58,58,78,78,78,78,246,58,58,58,58,58,78,
212,78,78,58,58,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,
58,99,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,99,99,99,
58,99,58,99,99,58,99,99,99,8,99,99,30,58,58,58,58,58,58,99,
58,11,99,58,99,58,58,58,58,58,58,99,58,58,58,58,58,58,99,58,
99,58,78,58,58,58,99,58,58,78,246,78,58,78,58,58,58,58,78,212,
246,78,246,78,78,99,212,246,78,246,58,246,246,78,246,218,218,218,58,58,
246,78,78,246,58,218,218,71,12,12,108,92,108,19,108,53,63,63,63,53,
53,53,19,223,92,92,49,118,118,118,118,118,118,118,71,118,118,12,12,12,
92,71,71,123,218,99,11,58,58,58,58,78,58,99,99,123,71,218,218,218,
246,246,78,212,78,212,78,246,78,78,58,78,246,78,246,78,58,58,58,58,
99,78,246,78,246,99,58,58,58,58,58,78,78,78,78,99,58,99,58,99,
78,58,58,99,58,218,218,58,58,99,58,58,58,218,99,58,58,58,58,11,
58,99,99,99,58,99,99,218,58,8,99,99,58,99,58,11,58,11,58,58,
99,58,99,58,99,58,99,58,58,218,58,58,58,99,58,99,58,58,58,99,
78,58,58,58,99,58,58,78,78,58,246,78,246,99,58,58,58,212,78,78,
246,58,246,58,78,78,78,58,246,78,78,58,246,58,58,58,212,58,246,78,
212,246,58,58,71,71,71,71,12,92,92,92,108,53,53,53,19,19,223,223,
49,223,92,49,49,223,92,49,118,118,118,71,118,112,118,11,11,112,71,112,
71,71,11,11,11,99,99,58,58,78,78,78,246,78,246,58,99,71,218,71,
218,78,78,246,78,246,58,246,78,246,212,58,246,58,246,78,212,78,246,58,
58,58,78,246,246,78,78,99,58,58,58,212,78,58,78,58,58,58,58,58,
78,58,78,99,58,58,99,58,58,58,58,99,58,58,99,218,58,99,58,58,
58,58,99,58,99,99,58,99,99,8,99,99,58,58,58,99,58,99,99,58,
99,58,58,58,58,58,58,218,99,58,99,58,58,58,58,58,99,58,58,78,
58,78,78,78,78,58,78,58,78,78,78,212,78,58,78,58,78,212,78,246,
78,246,78,78,212,246,246,78,246,212,246,246,78,246,58,246,78,246,58,246,
246,58,99,218,218,218,71,12,92,19,19,19,19,19,223,223,49,223,49,118,
49,112,30,30,237,103,208,208,245,208,245,208,245,245,245,103,208,103,22,237,
30,30,11,11,11,11,71,71,11,99,58,78,78,246,58,246,246,246,58,99,
99,218,212,78,246,78,246,78,246,58,78,58,246,78,58,246,78,212,78,246,
58,212,58,78,78,212,78,78,58,58,99,78,78,78,78,78,58,58,99,58,
58,78,78,78,58,58,99,58,99,58,58,99,58,218,58,58,99,58,58,218,
99,58,99,99,58,99,30,99,99,8,58,99,58,99,58,58,58,99,58,99,
58,218,218,58,99,58,99,58,58,58,78,99,78,58,99,58,58,78,58,78,
78,58,78,78,58,78,78,246,246,212,78,78,78,58,78,246,78,246,58,246,
212,78,58,78,78,58,246,78,78,78,58,246,78,246,78,58,246,78,78,78,
58,218,99,11,71,12,92,92,92,223,223,223,223,223,49,118,112,22,237,208,
72,245,55,243,245,72,72,72,65,208,236,208,208,245,72,55,243,55,55,243,
245,245,245,103,237,237,30,11,11,112,71,11,99,58,78,246,246,246,246,78,
58,218,58,58,246,78,212,78,246,78,246,78,212,78,78,212,78,246,78,78,
58,78,78,78,78,78,246,246,246,58,58,78,58,246,78,212,78,78,99,58,
58,78,58,58,58,58,58,99,58,58,58,58,78,58,58,99,99,58,58,58,
99,218,58,99,99,99,58,99,58,8,99,99,99,58,11,58,58,58,99,58,
58,58,58,58,58,58,58,99,99,78,78,58,58,78,58,58,99,78,78,78,
78,78,78,78,78,78,212,246,246,246,246,78,78,246,246,58,246,78,246,78,
78,78,212,246,246,246,78,78,212,246,246,246,58,246,246,78,246,246,78,58,
218,99,71,12,12,92,92,82,223,49,223,118,112,22,208,72,72,208,65,22,
22,112,11,112,112,112,112,112,118,118,118,112,112,112,30,244,244,30,237,65,
236,72,55,55,243,243,208,208,237,237,11,71,11,11,71,11,99,58,246,246,
246,78,78,246,58,246,78,246,58,246,58,246,58,246,246,78,78,78,212,78,
212,246,212,78,246,246,58,78,78,246,99,246,246,58,246,58,78,78,78,58,
78,78,78,78,78,78,58,58,58,99,58,58,78,99,58,58,58,218,99,99,
58,58,99,58,99,58,58,99,99,8,58,58,99,58,99,218,99,58,99,99,
99,58,99,58,99,58,58,58,58,78,58,58,58,58,58,58,58,78,212,78,
78,58,246,78,58,246,246,246,246,246,246,246,78,58,246,78,246,58,246,58,
246,78,78,78,58,246,212,78,78,78,58,246,78,212,246,58,78,212,58,99,
218,71,12,92,19,223,49,49,118,62,30,22,208,208,103,30,244,112,244,118,
112,23,49,49,49,49,49,49,49,49,82,82,223,82,49,118,23,118,118,112,
11,30,237,22,65,245,55,243,245,245,103,237,237,11,71,11,71,71,218,58,
246,246,78,246,78,212,78,246,246,78,246,246,78,78,212,78,212,78,246,78,
78,58,246,78,58,246,78,212,78,246,78,78,78,78,78,212,246,246,246,78,
58,78,78,78,58,78,78,58,58,58,58,58,99,58,58,58,58,58,99,58,
58,58,58,58,58,99,99,58,58,8,99,99,58,58,58,99,99,99,99,58,
58,99,78,58,78,99,58,58,99,78,78,78,58,78,58,58,78,246,78,212,
78,78,58,78,246,246,246,246,246,246,58,78,78,246,58,246,78,246,78,246,
78,212,78,212,212,246,78,78,246,246,78,212,58,99,212,246,246,58,99,218,
118,12,92,223,223,49,49,11,237,208,208,103,244,23,118,112,118,112,49,49,
19,82,82,82,223,49,66,49,49,82,223,223,101,19,223,82,223,82,223,82,
82,49,23,112,11,244,30,65,72,55,55,245,208,22,237,112,11,118,71,218,
218,58,58,78,246,78,212,78,78,212,99,78,212,246,78,246,78,246,78,212,
246,246,78,246,246,78,246,78,246,58,246,78,58,78,246,246,246,246,212,246,
78,78,78,78,78,58,78,78,99,58,78,78,78,99,58,58,99,58,99,99,
58,99,99,99,99,58,99,58,99,8,99,99,99,58,58,99,58,58,99,58,
58,58,78,78,58,58,58,58,58,58,78,78,78,78,78,58,246,246,246,246,
246,78,78,212,246,246,246,246,246,246,78,212,78,246,78,212,78,246,58,246,
78,246,78,58,58,212,246,58,78,246,246,58,58,58,58,246,58,218,71,12,
223,223,49,49,49,30,65,72,72,30,112,118,118,112,118,49,223,223,223,49,
244,244,244,244,23,23,23,23,70,66,49,70,49,70,70,118,23,23,23,23,
49,223,19,82,223,223,23,11,244,237,208,72,55,55,208,103,30,11,11,49,
71,71,99,58,246,78,246,246,58,246,58,58,246,212,78,246,58,246,78,58,
58,212,78,78,212,78,212,78,78,78,212,78,78,78,246,212,246,246,246,212,
246,58,78,78,78,78,58,78,78,99,58,58,78,58,58,58,99,58,58,58,
58,58,58,58,99,58,99,58,99,8,99,58,58,218,58,58,58,99,58,58,
58,99,58,58,99,58,78,78,78,78,78,78,78,58,246,246,246,212,246,246,
212,246,78,246,246,246,246,246,212,246,246,78,246,58,212,246,78,78,78,246,
58,246,212,99,58,246,78,246,246,58,58,58,58,78,246,58,99,118,12,92,
223,223,223,11,22,72,208,244,49,112,112,118,49,82,223,49,244,244,242,62,
23,62,23,23,244,244,244,244,244,244,62,30,244,244,244,244,23,112,210,23,
62,244,244,23,223,82,53,82,49,112,30,30,65,72,55,245,208,237,30,112,
71,49,118,71,99,78,78,78,246,246,58,99,58,246,212,78,246,58,246,212,
99,58,212,246,78,246,78,246,212,246,78,246,246,212,246,246,246,212,246,246,
246,246,78,78,246,246,78,78,78,78,58,58,78,58,58,58,58,58,99,99,
99,78,99,58,99,99,58,99,58,8,58,99,58,99,99,58,58,99,58,58,
58,58,58,58,78,58,78,78,58,78,58,246,78,78,78,212,246,246,212,246,
246,246,246,246,246,246,246,246,246,246,246,58,246,58,99,212,246,212,78,78,
78,99,58,58,78,246,58,78,246,58,58,58,58,212,58,218,71,12,49,49,
49,112,22,72,65,112,49,112,112,112,223,19,118,62,244,62,62,23,23,244,
244,244,244,112,23,49,49,223,19,223,82,223,223,49,223,23,118,112,244,30,
62,62,62,62,23,62,23,223,82,8,82,71,30,244,22,72,55,245,103,237,
11,71,12,12,71,99,78,78,78,58,212,58,58,58,58,212,78,58,246,78,
58,58,58,212,78,246,58,78,78,212,212,246,246,246,212,246,246,246,246,246,
246,246,58,78,78,58,246,212,78,78,58,78,58,78,78,78,58,78,58,58,
218,58,58,99,58,99,99,99,58,8,218,99,58,58,58,99,58,58,99,78,
78,58,99,58,58,78,58,78,246,78,78,58,78,212,246,246,246,246,246,246,
246,246,246,212,246,212,246,246,246,212,78,246,58,58,58,246,78,78,212,246,
58,58,58,58,212,78,246,212,58,58,58,58,58,58,71,12,49,223,223,49,
30,208,72,30,49,49,112,49,223,223,23,22,244,62,23,23,62,22,112,118,
49,49,223,118,23,244,30,242,22,242,242,62,242,244,244,112,23,49,49,223,
23,112,30,244,62,112,210,23,23,49,82,8,223,244,237,30,208,55,243,245,
22,30,71,118,12,71,99,78,78,246,212,58,58,58,58,246,246,246,78,246,
58,58,58,78,212,78,246,246,246,58,58,212,246,246,246,246,246,246,246,246,
246,78,246,58,246,246,246,78,212,78,78,78,58,78,58,78,58,58,99,58,
58,58,99,58,58,58,58,58,58,8,58,99,58,58,58,58,99,58,78,78,
58,58,78,58,58,78,78,58,78,78,78,78,78,246,212,246,246,246,246,246,
246,246,246,246,246,246,212,246,246,246,78,58,58,58,58,246,78,78,246,99,
212,58,212,58,212,78,78,58,58,218,58,212,58,99,71,49,223,49,49,30,
55,72,112,49,244,11,49,82,112,242,242,62,23,62,244,112,118,223,82,118,
30,236,29,225,231,33,248,42,42,42,219,2,42,219,110,107,231,29,65,244,
112,223,223,49,112,30,30,23,23,23,23,49,82,101,49,30,30,242,72,243,
208,103,30,71,118,12,71,99,78,78,78,58,58,58,58,58,78,58,246,78,
58,58,99,58,246,58,246,58,246,58,99,58,212,246,246,212,246,246,246,246,
246,246,246,246,212,246,246,246,246,78,58,78,78,78,78,78,58,78,78,78,
58,78,99,99,99,58,58,99,99,8,99,58,99,99,58,58,58,58,78,78,
78,78,58,58,58,78,78,78,78,78,246,246,58,246,246,246,246,246,246,246,
246,246,212,246,99,58,246,246,246,246,212,58,58,58,99,212,78,212,212,58,
78,58,58,58,246,246,78,58,71,218,58,58,11,71,118,223,49,23,103,243,
22,49,118,30,118,82,49,30,242,62,70,62,244,118,223,82,112,65,93,205,
217,42,80,147,98,4,26,8,8,8,8,121,8,8,26,4,98,210,111,219,
29,29,65,112,223,82,23,30,244,62,62,62,62,49,82,82,112,30,30,65,
243,245,103,30,71,118,12,71,218,212,246,58,58,212,212,58,58,246,212,78,
58,58,212,58,58,246,78,246,58,58,58,58,246,212,246,246,246,246,246,246,
246,212,246,246,246,246,212,246,246,212,78,246,212,78,58,78,78,78,58,78,
78,78,58,58,58,58,99,58,58,8,58,58,58,58,58,58,58,58,237,78,
58,78,78,58,78,78,212,78,246,78,78,246,246,246,246,246,246,246,246,246,
246,246,246,58,58,58,246,246,246,246,58,58,99,58,58,246,246,78,99,78,
246,78,58,58,58,58,58,218,12,99,58,99,71,92,49,223,118,22,41,65,
223,23,30,118,19,23,22,242,23,23,30,112,223,19,112,29,222,232,87,80,
98,26,121,8,20,253,20,20,20,20,101,20,20,20,253,253,20,8,121,26,
4,14,2,231,29,30,49,82,112,30,244,62,23,210,118,82,101,223,30,244,
65,55,243,103,237,71,118,71,71,99,58,58,58,58,218,58,58,58,246,212,
58,58,212,78,99,58,246,246,78,58,58,58,58,246,246,246,246,246,246,246,
246,246,246,212,246,246,246,246,246,246,246,78,78,78,78,78,58,78,58,78,
78,58,58,58,78,99,58,58,99,8,99,58,58,99,99,58,58,58,58,237,
78,78,58,78,78,246,78,246,78,246,78,246,246,246,246,246,246,246,246,246,
246,246,58,58,58,58,246,246,246,58,99,78,246,212,99,246,212,58,78,246,
58,246,58,58,58,212,218,12,118,58,58,71,12,49,19,49,237,41,65,49,
118,112,223,82,244,236,62,66,62,30,82,8,112,93,68,6,137,88,162,253,
253,20,253,19,223,23,244,244,54,242,54,242,244,62,112,49,223,20,20,20,
20,253,26,98,14,33,29,244,82,101,112,22,62,62,62,23,49,53,82,30,
112,22,243,243,208,11,71,118,12,218,99,58,58,58,12,71,58,58,58,58,
99,58,58,246,246,58,58,246,246,58,58,58,99,58,246,246,246,246,78,58,
246,212,246,246,246,246,246,212,246,246,78,78,78,78,58,78,78,78,78,58,
78,58,78,237,78,58,99,99,78,8,58,99,58,58,78,78,78,78,78,78,
58,78,78,58,78,246,78,212,246,246,246,246,246,246,246,246,246,103,246,246,
246,246,58,58,58,99,212,246,246,58,212,78,246,58,58,58,58,58,212,78,
78,78,58,58,58,58,123,49,218,99,11,118,223,223,82,237,41,208,23,118,
237,223,82,244,18,210,23,23,112,19,223,103,64,6,148,147,26,253,20,8,
66,23,54,111,219,219,137,24,76,24,163,25,137,42,204,42,151,109,244,223,
20,20,20,20,8,4,111,231,236,23,82,12,237,62,62,23,62,223,253,223,
237,244,22,41,245,103,11,112,118,71,218,58,58,99,92,92,128,58,58,58,
58,58,58,212,78,58,58,212,58,58,58,78,78,58,212,246,246,246,58,58,
212,246,212,246,246,246,246,246,246,212,246,78,246,246,78,78,78,78,78,58,
78,58,58,78,99,58,58,58,99,8,99,58,58,58,58,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,246,246,246,246,103,246,246,246,246,246,
246,78,58,58,58,58,58,212,58,58,78,212,78,78,99,58,58,212,78,246,
212,212,58,58,58,218,92,12,218,99,71,12,223,82,118,243,55,23,223,30,
223,19,244,93,54,49,23,112,82,82,245,153,138,234,162,8,253,101,49,30,
111,125,24,201,142,16,159,142,43,95,197,156,193,193,51,141,224,25,248,231,
65,118,20,20,20,20,121,210,231,55,244,82,49,30,244,62,62,244,223,20,
118,237,112,208,243,245,237,71,118,49,71,58,58,218,92,92,12,58,58,99,
58,58,212,78,212,212,58,58,58,58,58,212,78,58,58,246,246,246,99,58,
99,246,246,246,246,246,246,246,246,246,212,246,58,78,78,78,78,78,58,78,
78,58,78,78,58,78,58,99,58,8,99,99,58,58,58,78,78,58,78,58,
78,78,78,246,78,78,78,246,246,246,246,246,246,246,246,103,246,246,246,246,
246,58,58,58,58,58,58,58,58,58,78,78,246,78,58,58,58,212,78,58,
58,78,58,58,58,12,92,12,99,218,118,19,82,223,22,116,237,49,112,112,
101,112,93,109,70,112,118,82,223,55,136,185,44,26,253,253,82,62,107,163,
117,16,114,159,161,106,98,46,26,26,26,26,26,4,32,81,44,142,43,234,
10,56,236,23,20,20,20,8,4,219,225,237,19,82,11,244,62,54,62,223,
20,112,30,244,72,239,103,237,71,12,12,71,58,71,92,92,12,128,58,58,
58,58,246,78,246,58,58,58,99,58,58,246,78,78,58,246,246,58,58,58,
58,212,246,212,246,246,246,246,246,246,78,78,246,58,246,58,78,246,78,58,
78,58,78,78,58,58,58,58,58,8,58,58,58,58,78,237,58,78,78,78,
78,78,78,58,246,246,212,246,246,246,246,246,246,246,246,246,246,246,246,246,
78,58,58,58,58,58,99,58,58,246,246,246,58,246,58,58,58,78,246,218,
11,58,58,58,58,12,92,71,218,11,49,223,101,23,239,93,23,118,244,223,
223,65,29,70,70,112,82,82,72,233,135,152,121,253,20,49,242,179,176,39,
198,156,32,47,26,26,69,113,26,47,9,47,162,113,26,121,113,252,152,159,
43,234,217,238,30,253,20,251,8,4,107,17,30,82,223,22,62,62,54,244,
82,19,237,112,244,41,245,30,112,71,92,71,99,71,12,92,92,71,78,58,
58,246,246,58,78,212,58,58,58,58,58,78,246,58,99,58,212,58,58,58,
58,78,246,246,246,246,246,246,246,246,246,246,78,78,78,78,246,58,78,78,
58,58,58,99,58,99,58,58,58,8,58,99,99,58,58,78,78,58,78,58,
78,58,78,78,78,78,78,246,246,246,246,246,246,246,246,246,78,246,246,246,
58,58,78,58,78,58,58,99,58,78,58,246,246,58,58,58,212,58,58,12,
71,58,58,58,99,92,92,71,218,71,223,8,19,22,150,30,49,11,23,101,
30,93,54,49,112,49,20,30,254,181,95,26,253,253,49,65,163,166,206,202,
52,26,8,121,4,161,43,114,139,131,57,200,195,188,192,88,26,26,121,98,
197,67,234,145,230,22,82,20,20,8,98,107,100,112,253,112,103,244,54,62,
49,20,49,237,118,208,243,103,11,11,12,92,92,92,92,12,49,12,58,58,
78,58,246,78,246,78,212,99,58,58,78,246,58,78,58,58,58,99,58,58,
58,99,246,246,246,246,246,246,246,246,246,246,246,78,246,78,246,78,58,78,
78,58,78,78,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,78,78,78,78,246,246,246,246,246,246,246,246,246,246,246,58,212,58,246,
99,212,58,99,78,99,58,58,78,246,58,58,58,78,78,58,78,78,99,71,
12,71,58,58,12,12,12,71,11,12,223,101,49,243,100,118,223,112,82,19,
93,225,113,23,244,101,223,41,129,199,52,253,20,223,242,124,39,57,117,122,
121,121,47,44,195,35,94,196,165,189,189,189,27,84,200,139,67,186,26,121,
240,106,159,234,175,68,242,20,20,20,8,210,238,93,223,19,237,244,23,54,
62,19,101,244,112,30,243,208,237,11,12,92,49,223,12,12,92,12,58,78,
246,78,58,246,78,212,78,78,58,58,212,58,58,58,78,99,58,58,99,58,
58,58,246,246,246,246,246,246,246,246,246,246,78,246,58,78,58,78,78,78,
78,78,237,78,58,58,58,58,58,8,99,58,99,58,78,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,103,246,246,246,246,218,58,58,78,78,
58,99,71,12,58,78,58,78,58,78,123,12,78,78,58,212,78,78,123,92,
12,12,99,99,12,92,92,71,11,118,82,101,112,116,236,82,112,112,82,118,
100,110,66,23,49,101,244,215,73,43,69,253,101,23,219,59,97,202,52,8,
8,4,120,97,187,139,27,143,46,113,26,26,46,88,60,27,131,200,192,47,
82,66,81,159,234,170,68,118,20,251,20,26,2,64,244,101,118,22,23,62,
62,49,20,118,244,23,208,245,30,11,71,12,92,12,12,49,12,12,71,58,
246,246,78,246,78,246,58,78,58,78,212,218,12,246,78,99,58,78,78,11,
12,58,58,246,246,103,246,246,58,246,246,246,246,78,246,78,78,78,58,78,
78,58,58,58,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,212,78,246,246,78,99,58,246,246,246,246,246,246,71,12,99,58,58,99,
58,58,53,251,71,78,78,78,78,246,19,19,71,246,246,78,212,246,12,92,
12,12,12,12,92,12,12,71,218,118,19,101,244,239,65,223,244,11,53,112,
222,235,66,112,223,20,72,45,90,221,8,253,19,242,214,97,57,152,26,8,
26,188,57,187,139,186,8,8,8,8,121,121,8,8,26,4,44,131,94,67,
162,82,113,44,159,76,220,29,82,0,20,8,98,238,245,82,82,237,23,62,
54,112,20,223,237,49,22,245,237,11,71,49,12,92,12,12,12,12,71,78,
246,58,246,58,246,78,246,58,246,212,58,19,101,218,78,78,99,58,58,53,
101,71,58,246,246,246,78,71,92,58,246,246,212,246,78,58,58,78,78,58,
78,78,78,78,58,58,58,58,58,8,99,99,58,99,58,78,78,58,99,58,
78,78,58,246,78,58,71,92,218,246,246,246,103,246,12,92,92,58,58,58,
58,218,63,53,19,246,246,78,78,212,53,92,92,212,246,78,78,58,92,218,
12,12,92,92,92,12,12,71,11,118,101,101,22,116,242,223,237,11,8,30,
17,62,70,112,8,53,72,172,134,143,8,20,223,109,102,57,97,81,121,82,
252,114,35,157,165,26,253,8,8,46,182,4,26,26,8,8,113,160,190,35,
186,66,121,106,117,152,232,68,49,79,20,8,26,42,17,223,53,22,112,244,
54,244,8,82,30,118,30,245,30,11,99,12,12,92,123,12,12,12,71,78,
246,78,246,78,58,246,246,58,246,58,12,53,53,12,78,78,78,99,12,63,
63,92,78,78,246,246,78,229,229,12,246,246,246,212,78,71,71,58,78,78,
58,78,78,58,58,58,212,58,58,8,99,58,58,58,58,78,78,58,99,218,
99,58,246,78,78,58,12,92,12,78,246,246,246,218,92,92,19,71,58,58,
58,12,38,92,53,71,246,58,246,218,108,92,92,218,246,212,78,58,12,218,
12,12,12,92,12,92,12,71,71,118,82,8,103,116,242,82,244,11,82,30,
222,210,223,23,8,101,55,172,183,186,8,253,223,110,102,157,97,161,8,8,
127,67,190,140,189,26,8,8,69,127,120,5,52,26,26,8,121,9,84,187,
43,113,82,98,142,152,89,119,244,20,0,253,121,219,64,23,101,30,30,23,
54,244,82,101,30,112,112,72,237,71,30,12,12,92,118,12,12,12,71,58,
246,246,58,246,58,212,78,246,58,246,108,63,53,19,78,78,78,58,53,101,
53,108,78,246,246,246,108,79,20,53,246,246,246,78,99,92,92,12,99,78,
78,58,58,218,218,218,99,58,58,8,99,99,58,58,58,99,99,218,71,11,
99,99,78,246,212,71,218,71,92,71,246,246,246,71,92,92,19,19,58,58,
58,92,53,92,92,108,58,246,246,71,92,92,92,92,212,246,246,58,123,48,
12,12,12,92,92,12,12,12,99,118,19,101,237,116,65,49,30,112,82,244,
222,235,26,118,82,101,65,136,183,7,8,8,82,242,21,157,57,192,69,8,
26,7,191,157,190,60,9,8,26,52,84,131,60,4,121,8,26,113,67,94,
142,113,82,98,43,152,10,119,244,251,0,253,121,111,64,23,101,244,22,49,
62,62,82,101,112,23,112,103,30,71,11,12,12,118,12,12,118,12,71,78,
78,246,78,58,218,58,78,246,246,12,53,101,53,19,58,78,58,12,63,63,
53,63,218,246,246,71,79,20,63,101,218,246,246,218,12,19,108,12,99,58,
99,71,218,71,71,218,71,218,71,8,99,58,99,99,58,58,11,218,71,218,
71,71,218,58,58,99,218,99,71,92,218,78,246,92,92,12,223,53,71,58,
58,19,19,92,92,19,12,78,78,12,92,92,92,92,71,78,78,218,123,241,
48,12,12,92,49,12,118,12,71,49,223,101,11,116,65,66,112,11,82,112,
100,54,66,66,223,20,244,105,90,159,8,8,8,244,10,167,187,202,98,8,
121,47,192,169,190,35,195,188,188,195,57,84,106,47,8,8,8,122,195,140,
95,66,82,98,142,221,175,119,244,251,251,20,8,219,64,112,101,30,242,118,
23,62,19,20,11,118,112,22,11,11,99,12,12,12,12,71,12,118,71,58,
246,58,246,99,12,99,212,78,58,19,53,53,101,53,58,78,218,53,101,53,
53,63,218,246,246,63,0,101,19,53,12,78,58,12,108,92,19,108,92,71,
71,12,71,71,123,71,71,123,71,8,99,99,58,58,58,11,58,11,99,218,
99,11,99,99,218,99,218,99,71,12,12,99,99,92,92,92,12,19,53,71,
99,38,53,12,12,92,19,218,212,92,92,92,48,12,108,128,246,218,123,48,
128,123,12,12,12,12,12,118,71,71,223,8,112,41,55,49,49,244,223,49,
93,231,70,82,223,20,82,116,181,158,252,8,20,223,242,214,57,157,156,46,
8,66,26,147,44,198,86,196,86,198,44,52,4,8,8,8,46,60,97,194,
52,82,82,180,159,177,232,64,66,79,20,8,26,231,100,49,8,237,62,23,
62,244,82,82,30,223,11,237,112,11,11,12,12,71,12,12,118,12,71,218,
246,78,58,218,92,99,246,212,92,53,79,79,53,53,218,58,19,63,38,126,
53,101,92,58,19,251,63,223,19,19,92,71,12,223,92,223,223,92,19,92,
12,71,123,71,71,71,71,71,71,8,11,58,11,58,99,58,99,58,99,58,
58,218,218,218,99,218,11,99,99,71,92,92,12,49,92,71,99,12,53,53,
92,20,53,123,48,12,92,19,218,19,92,12,241,48,92,92,58,218,92,241,
128,212,71,12,118,12,12,71,71,112,223,19,82,55,116,112,49,244,223,19,
208,238,235,66,223,253,82,22,250,73,95,113,8,82,49,111,102,207,132,188,
252,69,8,121,162,4,47,52,127,4,4,26,26,8,8,46,186,86,169,95,
66,8,4,95,192,87,45,236,101,251,253,8,70,222,236,223,223,237,244,23,
54,244,82,82,237,118,11,244,71,11,99,71,118,12,12,12,12,12,12,58,
78,78,246,123,108,12,212,12,53,63,13,83,63,53,12,92,53,226,13,13,
53,53,53,226,75,63,12,71,92,19,19,92,92,92,19,12,12,12,92,12,
71,71,71,71,71,12,71,71,71,8,99,99,58,99,99,58,58,99,58,58,
11,218,71,71,11,218,99,99,58,218,12,19,92,92,92,99,78,58,92,101,
75,251,53,12,123,48,92,108,101,63,92,12,241,241,92,92,108,92,108,128,
212,246,58,12,12,12,49,12,12,118,12,49,19,237,116,22,49,118,244,82,
112,17,231,70,223,82,20,82,93,45,133,7,46,8,8,49,50,224,168,207,
142,60,127,46,8,26,8,8,8,8,8,8,121,26,47,192,166,169,7,113,
66,113,7,156,36,217,28,23,251,251,20,26,111,222,30,8,49,22,112,62,
242,112,101,112,30,49,244,11,112,11,99,71,12,12,118,12,12,12,71,246,
246,78,212,92,108,92,218,53,38,13,0,0,63,101,20,63,101,75,83,83,
63,101,229,79,126,92,58,78,12,19,92,92,19,92,12,71,71,118,71,71,
218,12,71,71,71,71,71,218,99,8,218,99,218,58,58,218,99,99,58,99,
58,58,99,99,218,99,218,99,58,58,99,92,92,92,19,58,78,78,99,108,
0,34,38,123,123,48,123,92,53,108,92,12,241,241,241,123,92,19,19,123,
241,212,246,99,12,71,12,71,12,71,118,223,82,118,245,100,112,49,30,118,
223,237,238,111,113,223,19,20,49,93,144,184,44,113,8,253,19,210,173,141,
168,57,196,142,60,52,122,182,113,113,122,3,60,159,130,86,43,122,26,223,
47,106,95,76,89,68,244,20,251,20,8,210,238,72,223,19,30,112,23,62,
244,223,20,118,112,112,244,118,11,99,99,218,71,218,71,12,12,71,58,58,
78,246,246,92,63,53,53,101,83,0,83,83,53,63,63,53,20,83,0,0,
53,53,79,0,226,78,58,78,12,108,92,19,92,71,58,58,99,71,71,123,
71,218,218,71,218,218,99,218,99,8,99,99,218,218,99,99,99,99,58,99,
99,58,99,11,71,99,99,58,58,58,58,71,92,92,19,78,78,58,78,218,
53,63,101,123,123,48,48,123,92,19,92,92,241,241,241,241,92,92,92,12,
241,212,78,78,123,118,12,12,12,12,112,92,49,223,30,247,65,49,23,112,
82,23,72,231,14,26,82,19,101,49,17,146,102,154,147,69,8,82,49,23,
249,104,158,39,206,169,86,130,202,142,202,114,39,117,76,88,4,66,66,113,
7,95,234,175,68,22,101,20,251,8,4,107,100,112,101,112,30,23,112,62,
49,101,49,244,118,112,112,118,11,78,99,99,99,58,71,12,92,99,246,78,
246,58,218,108,108,53,63,229,0,83,34,13,53,53,101,38,13,0,0,13,
53,101,63,101,99,78,58,78,71,19,19,92,71,58,99,58,11,218,218,71,
99,99,99,99,218,58,99,218,218,8,71,218,99,99,218,58,99,99,99,99,
99,58,99,58,99,218,11,58,58,99,58,58,71,92,92,58,78,78,78,78,
118,19,53,123,48,128,128,48,123,12,92,92,48,128,212,48,241,12,12,92,
241,128,246,246,246,71,12,12,12,71,71,118,49,223,49,208,116,22,49,23,
11,223,223,72,225,235,113,82,82,101,49,65,68,164,201,7,162,26,8,121,
66,223,23,216,14,36,177,152,154,152,80,255,98,66,66,223,66,4,32,152,
152,163,228,222,112,251,20,20,8,113,219,222,22,82,23,22,62,112,54,244,
101,82,112,112,23,118,112,11,11,78,58,58,246,99,71,71,99,58,246,212,
58,58,123,108,108,53,20,13,101,19,34,13,53,53,53,0,75,38,0,34,
63,53,53,71,58,78,58,78,11,92,92,71,58,58,58,58,99,218,11,99,
11,58,218,218,99,99,218,99,99,8,99,71,99,99,99,99,99,218,58,99,
218,58,99,99,99,58,58,78,58,99,58,58,58,71,12,78,78,78,78,78,
58,12,19,12,48,218,246,218,48,12,92,92,241,48,58,212,48,241,12,92,
48,241,212,58,212,212,123,118,12,71,118,118,12,223,49,118,55,239,244,223,
112,112,82,118,236,225,14,4,26,82,101,19,112,93,153,21,224,174,88,162,
26,26,121,82,66,66,66,66,66,66,26,82,66,26,113,127,32,44,51,87,
248,222,236,223,20,20,20,8,70,111,17,237,223,49,237,30,62,54,30,118,
253,49,112,118,23,118,118,11,99,58,58,58,212,99,71,218,246,78,78,58,
58,58,108,108,63,38,13,92,58,12,13,251,53,63,251,79,12,71,34,34,
251,53,19,58,78,78,78,58,58,71,71,58,99,99,58,99,58,11,58,99,
99,99,99,218,218,99,218,218,99,8,71,99,218,218,218,99,218,99,99,99,
99,71,58,99,99,99,99,58,58,99,58,58,78,58,99,78,58,78,58,78,
78,78,99,218,128,58,58,78,128,48,12,92,123,241,78,246,58,48,241,218,
12,128,212,212,58,58,212,218,71,12,71,12,118,12,223,49,11,243,55,244,
49,112,244,223,49,236,17,111,4,121,82,82,8,223,244,29,153,61,148,234,
152,32,147,52,4,4,113,26,113,26,98,98,147,255,7,193,24,163,217,238,
110,112,101,20,20,253,8,70,107,222,22,223,223,244,244,244,244,242,112,82,
223,118,23,23,49,118,71,11,58,58,58,246,246,58,99,78,58,212,212,78,
58,99,53,53,38,83,19,58,246,19,34,79,251,34,34,71,58,71,79,13,
83,63,218,58,58,99,58,78,58,99,78,58,99,99,99,58,58,99,99,58,
218,11,218,99,11,218,11,99,71,8,71,218,218,11,71,99,218,99,99,99,
99,218,11,99,58,58,58,58,11,58,99,218,58,58,78,78,78,78,58,58,
78,78,78,78,58,78,78,78,58,58,48,123,48,48,128,78,246,78,128,241,
241,241,128,212,58,58,58,58,218,12,118,71,71,112,118,223,49,11,245,55,
30,49,112,244,223,19,30,93,107,111,4,26,101,101,8,101,112,242,93,203,
6,170,21,74,51,51,104,24,234,76,24,104,76,124,232,56,225,18,30,223,
20,20,20,20,8,66,235,231,236,112,223,118,30,112,112,54,244,112,82,49,
112,23,118,118,12,11,99,99,246,58,58,58,78,58,246,246,78,78,212,78,
58,12,53,229,34,40,78,78,58,38,0,13,13,79,71,58,58,71,13,0,
38,71,58,99,58,99,58,99,78,58,58,99,99,99,71,99,58,99,218,99,
71,99,218,99,99,71,218,99,71,8,71,71,71,123,218,218,11,218,218,218,
218,99,218,218,99,99,99,99,58,99,99,99,99,99,58,78,78,58,58,99,
99,78,78,246,78,212,78,78,58,78,128,48,48,241,48,246,78,58,246,128,
128,128,128,128,212,78,212,78,58,218,71,71,12,12,118,118,49,49,112,208,
41,22,49,112,244,23,19,49,22,93,219,14,4,8,82,101,20,101,223,49,
30,65,18,29,17,203,228,230,56,96,91,225,225,236,242,112,49,82,20,20,
20,20,82,113,210,107,29,22,118,223,112,30,244,244,62,112,23,82,223,49,
118,118,49,49,118,71,99,246,58,58,212,246,246,78,212,58,246,246,78,58,
218,53,209,126,40,78,78,78,218,0,34,34,79,71,78,99,58,71,251,229,
12,58,99,99,99,58,58,58,58,99,99,99,99,218,99,58,99,99,99,218,
99,218,11,218,218,11,218,71,71,8,71,123,71,71,218,123,71,99,11,99,
218,11,99,71,218,99,58,99,99,58,218,218,99,99,58,58,58,58,99,58,
58,99,58,246,246,246,78,58,58,58,78,58,48,48,241,78,246,78,78,58,
58,241,241,241,212,58,246,78,246,58,218,71,71,71,118,118,118,49,49,112,
103,243,236,112,49,244,112,49,223,118,65,93,107,14,98,113,82,8,101,253,
101,20,101,82,82,223,118,118,49,49,49,82,82,101,101,20,20,253,253,121,
26,70,235,110,29,103,118,223,223,11,244,244,54,242,244,49,19,223,49,118,
118,49,12,71,11,99,212,246,78,78,78,78,212,246,78,58,78,212,78,58,
12,38,213,71,78,58,58,78,40,83,79,20,99,58,99,58,99,12,92,71,
78,58,99,99,99,99,99,99,99,99,218,218,99,218,218,99,218,218,11,218,
11,218,218,71,218,218,71,123,71,8,71,71,12,71,71,218,218,218,71,71,
218,218,218,218,71,218,218,99,99,218,99,99,99,99,99,99,58,99,58,99,
99,99,99,58,78,78,78,78,58,99,58,58,58,128,48,128,78,78,58,78,
212,212,212,241,128,58,246,246,58,246,58,218,218,118,71,71,118,12,118,49,
23,237,245,55,208,23,118,23,112,223,223,118,244,236,18,110,14,210,4,66,
121,8,82,20,82,101,101,251,20,20,20,101,8,20,8,8,26,26,210,235,
109,110,65,30,118,223,49,244,244,244,244,242,65,30,223,82,49,118,118,49,
92,49,118,71,11,78,246,78,58,246,212,246,78,78,246,78,246,78,212,218,
53,92,99,78,58,58,58,246,53,0,53,99,99,58,99,58,99,71,218,58,
99,58,99,218,58,99,58,78,99,99,11,99,71,99,99,218,99,99,218,71,
123,218,71,218,12,71,71,71,71,8,71,71,71,71,71,118,71,71,218,99,
71,71,71,123,71,71,218,99,99,218,218,71,11,218,99,99,58,99,58,99,
99,99,218,58,58,78,78,78,58,99,99,58,58,58,58,128,246,78,58,58,
58,58,246,128,128,58,212,246,78,78,78,58,58,218,71,71,11,118,118,49,
12,23,11,103,243,72,237,23,23,112,23,223,19,223,112,22,109,18,29,111,
111,210,210,70,4,26,26,26,26,26,26,4,4,70,98,235,2,18,29,65,
54,23,223,49,23,244,244,112,244,54,22,244,118,82,223,223,118,92,49,49,
223,71,11,99,99,78,246,58,246,78,58,212,78,78,58,58,246,78,58,218,
71,78,58,58,99,58,58,99,19,77,58,58,58,218,99,58,58,58,58,58,
218,99,11,218,58,99,218,58,218,218,71,218,218,71,99,71,218,71,71,218,
71,123,71,71,71,71,71,71,12,8,118,118,71,71,118,71,71,71,118,12,
71,123,71,71,71,71,71,71,218,99,99,99,218,218,71,218,99,99,58,99,
99,218,99,218,58,58,246,78,78,99,99,99,99,58,246,78,58,246,58,58,
58,58,58,78,78,58,58,58,246,212,99,58,58,58,218,99,71,118,11,118,
49,49,49,23,11,208,55,245,22,112,23,23,23,23,49,49,49,223,112,30,
22,236,18,18,18,29,18,18,18,18,107,236,29,236,236,22,30,23,223,223,
223,118,118,112,244,112,244,242,242,30,23,223,82,223,49,49,49,223,49,12,
71,71,99,58,246,212,58,58,58,78,78,78,58,58,58,58,78,212,246,78,
78,58,58,11,99,58,78,78,99,58,58,99,218,99,58,99,58,58,58,218,
99,71,218,99,218,58,99,218,218,71,218,123,71,99,71,218,71,71,71,12,
71,71,12,12,12,12,12,12,12,8,12,12,12,12,12,12,118,118,71,71,
71,218,71,123,71,71,71,71,123,71,218,11,218,71,218,123,218,99,218,58,
99,99,11,218,71,99,99,58,78,58,99,99,71,99,58,78,246,246,246,58,
58,218,58,99,78,78,246,78,78,246,58,58,58,212,58,58,99,71,71,118,
71,118,118,23,49,112,112,103,72,72,65,244,112,23,118,118,70,223,223,223,
223,49,118,23,118,112,112,244,112,112,23,23,23,49,49,223,223,49,23,118,
244,244,112,62,244,109,22,30,49,223,223,82,49,223,49,223,223,118,118,71,
99,99,99,78,78,246,58,58,78,78,58,58,58,99,78,246,78,78,78,78,
99,99,99,58,99,58,78,78,58,99,99,11,218,99,99,58,58,11,99,218,
218,218,71,99,218,218,11,218,123,71,218,71,71,218,71,71,123,71,118,12,
71,12,12,12,12,12,12,12,12,8,12,12,12,12,12,12,71,71,71,118,
71,118,71,71,118,12,71,71,71,71,99,218,123,71,218,71,218,71,99,99,
99,218,218,71,218,218,99,58,58,58,58,218,99,218,218,99,58,99,78,58,
58,99,99,99,58,58,78,246,246,78,78,78,58,99,58,58,99,58,99,71,
11,71,12,23,118,118,118,23,112,30,103,208,208,65,242,112,118,23,23,118,
118,118,49,112,23,112,11,112,112,112,118,49,49,49,49,112,23,23,112,244,
244,22,22,22,242,112,49,223,223,66,223,49,223,49,223,49,12,71,71,99,
99,58,212,212,246,58,78,78,58,58,99,99,99,58,78,78,78,78,58,58,
99,99,99,58,58,58,58,58,99,218,71,218,99,99,218,58,99,99,71,218,
71,71,218,99,71,99,123,71,118,118,123,71,71,123,71,71,12,12,118,12,
12,12,12,12,12,12,71,12,71,8,12,92,12,92,71,12,118,118,12,12,
118,71,71,12,71,71,118,12,12,71,118,218,71,71,71,12,71,12,218,218,
99,99,218,218,71,71,71,218,99,99,99,99,71,71,218,71,99,58,58,58,
58,58,99,11,99,99,99,58,246,78,246,78,58,99,99,99,58,58,99,99,
99,11,71,112,112,118,118,92,118,23,118,112,30,237,103,65,65,22,30,54,
244,244,23,112,244,112,244,112,244,23,244,23,112,62,244,244,30,242,22,242,
22,30,23,49,49,19,82,223,223,49,49,49,223,49,12,11,11,218,99,58,
58,78,78,78,246,78,78,99,99,58,99,58,58,78,78,78,58,99,218,218,
71,99,99,99,58,99,58,99,71,123,71,218,99,99,218,99,218,71,12,71,
71,218,71,71,218,71,71,71,71,71,12,71,71,71,118,12,12,12,71,71,
12,12,12,12,118,12,12,92,12,8,12,12,71,12,12,12,12,12,71,12,
118,12,12,12,118,12,71,12,12,71,71,71,71,123,71,12,12,71,71,218,
218,218,11,71,123,71,71,218,71,99,99,58,99,99,71,218,218,99,218,58,
58,58,58,99,218,71,99,218,58,58,58,246,212,58,58,99,99,58,99,58,
58,58,58,218,71,71,112,71,118,118,49,23,118,118,49,112,112,30,237,22,
22,22,103,22,22,22,22,22,30,242,22,22,22,103,22,22,30,112,112,23,
49,49,49,82,223,66,49,49,49,49,223,12,118,71,218,99,99,58,99,58,
78,246,78,246,58,58,99,99,218,218,99,99,99,58,58,58,99,218,71,218,
99,99,58,58,58,99,218,123,71,71,218,218,99,99,99,123,71,71,71,92,
71,71,218,218,71,12,12,12,118,71,12,118,71,71,71,12,12,12,12,12,
12,12,118,118,12,12,12,12,12,8,92,92,92,12,12,12,12,12,12,12,
92,12,12,12,71,12,118,12,12,12,12,12,71,71,71,12,12,71,118,71,
71,123,71,71,71,118,71,71,71,123,71,218,218,99,218,71,12,71,71,218,
218,58,58,99,58,71,71,218,218,218,99,58,58,58,58,58,99,99,99,218,
218,99,58,58,99,99,99,11,11,11,23,112,118,112,49,118,118,118,23,118,
49,118,23,112,112,112,112,244,112,112,118,112,118,49,49,223,49,223,223,49,
223,223,49,49,223,49,223,223,118,118,71,11,218,99,218,99,218,78,58,58,
58,58,58,218,218,218,218,218,58,99,58,58,58,58,218,99,71,71,123,71,
218,99,58,99,99,71,71,12,12,71,71,71,218,218,218,71,118,71,71,12,
123,71,12,71,71,12,12,12,118,71,12,12,12,118,118,12,71,118,12,118,
12,12,12,12,12,92,12,12,92,8,92,92,12,12,92,12,92,12,12,12,
12,12,118,12,12,12,12,12,12,12,118,12,12,71,118,71,12,12,71,118,
71,71,71,123,218,118,12,71,71,71,71,99,99,218,218,71,71,71,71,71,
99,218,99,58,99,218,218,71,71,71,218,71,58,99,58,58,99,58,218,99,
99,218,99,99,58,58,58,99,58,99,218,11,71,112,11,112,118,23,118,23,
49,118,118,92,49,92,49,92,49,92,49,223,223,49,223,49,49,49,49,82,
49,49,49,223,118,118,71,71,11,71,99,218,218,99,58,58,58,58,58,58,
58,218,218,218,71,218,218,99,99,99,99,58,218,218,71,123,71,71,218,11,
99,99,218,218,71,71,12,71,12,218,218,218,71,218,118,12,71,118,71,71,
71,71,71,71,118,71,12,12,12,71,12,12,12,12,12,12,12,49,12,12,
12,92,12,49,12,92,12,12,92,8,92,92,92,92,92,12,92,12,12,92,
12,92,12,92,12,71,71,12,12,12,12,71,12,118,71,118,71,118,12,12,
12,12,71,71,218,71,71,118,118,12,12,118,71,218,71,218,123,12,12,12,
12,71,71,99,99,99,218,71,71,71,71,123,71,218,218,58,99,99,58,218,
99,218,218,11,99,218,99,218,218,58,58,58,99,218,71,11,71,71,118,11,
112,71,112,118,112,12,118,118,118,118,118,118,118,118,118,118,223,223,49,49,
118,118,118,71,71,71,218,71,218,71,99,99,99,218,58,58,58,218,218,218,
218,71,71,218,123,71,218,99,58,218,218,99,71,118,12,71,71,71,218,218,
218,99,71,118,12,12,12,71,71,123,71,71,71,12,118,12,92,71,118,71,
12,12,71,12,12,92,12,12,12,118,12,12,12,12,12,92,12,12,12,92,
71,92,12,92,92,92,92,92,12,8,92,92,92,92,92,92,92,92,92,12,
92,12,92,12,92,92,12,118,92,12,12,92,92,12,12,12,12,12,12,12,
12,12,71,118,12,118,71,71,12,12,12,12,118,71,218,71,218,71,118,12,
12,71,12,71,218,71,99,218,123,71,71,12,71,118,71,71,99,218,218,99,
218,99,218,218,218,71,123,71,218,218,218,218,99,99,99,58,99,99,99,218,
99,71,71,71,11,71,11,11,11,11,11,11,11,11,71,118,12,118,218,218,
71,218,71,71,218,71,99,71,99,99,99,58,218,99,218,218,71,71,71,71,
71,71,123,71,11,99,99,99,218,218,71,71,12,12,12,71,123,218,71,218,
71,118,71,12,118,12,12,71,71,218,118,12,12,12,92,12,71,118,71,71,
12,71,92,12,92,12,12,12,118,12,12,92,92,12,92,12,92,92,92,92,
92,92,92,92,12,92,92,92,92,8,92,92,92,12,92,92,92,92,92,92,
92,92,92,12,92,92,12,12,92,92,92,12,92,92,12,12,118,12,12,92,
92,12,12,12,71,71,71,118,12,118,12,12,12,71,12,71,71,71,71,12,
12,12,118,12,12,118,218,71,71,71,12,71,71,71,12,12,71,71,71,11,
218,99,218,218,218,218,71,71,71,71,71,71,71,71,218,218,218,218,99,218,
218,218,99,218,99,218,218,218,218,218,218,218,218,99,218,11,218,71,71,71,
71,123,71,123,71,218,99,218,218,11,218,99,71,71,71,71,71,71,71,92,
71,71,71,123,71,218,71,71,71,118,12,12,12,12,71,71,71,218,71,71,
12,12,12,12,12,12,12,71,71,71,12,12,12,12,12,12,12,12,118,12,
12,92,92,92,12,92,12,71,12,92,92,12,92,92,92,92,92,12,92,92,
92,92,92,92,92,92,92,92,92,8,92,19,92,92,92,92,92,223,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,12,118,12,12,
12,92,92,12,92,12,12,12,71,12,49,12,92,92,12,12,71,12,12,12,
12,71,12,12,12,12,71,12,71,71,218,218,71,118,12,12,12,71,12,12,
71,123,71,71,99,71,71,123,71,123,71,123,71,71,71,71,71,71,71,71,
71,218,218,218,71,71,218,71,218,71,218,71,71,123,71,123,71,123,71,123,
218,71,218,218,218,218,71,71,71,71,71,12,12,12,12,12,12,12,71,71,
71,123,218,218,71,71,12,12,12,71,12,12,12,12,71,71,71,12,118,12,
12,92,12,12,12,12,12,12,71,12,92,12,92,12,12,118,12,12,12,92,
92,92,92,92,92,12,92,92,12,92,92,92,92,19,12,92,92,92,92,92,
12,92,92,92,92,92,92,92,92,8,19,108,19,108,12,19,92,92,92,92,
92,92,92,92,92,19,92,92,92,92,92,92,92,92,92,92,92,92,12,92,
92,92,92,92,92,92,12,12,12,12,71,12,92,92,92,92,12,92,118,12,
12,12,12,12,92,12,12,12,71,12,71,71,71,12,12,12,12,12,12,92,
112,118,71,12,71,71,71,218,71,71,71,71,71,71,12,12,12,12,12,12,
12,118,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
71,71,71,71,71,71,71,71,118,71,12,71,12,12,12,12,12,71,71,123,
71,71,71,92,12,12,12,12,92,92,71,12,12,12,12,71,12,12,92,12,
92,92,12,118,12,12,118,12,12,92,92,92,92,12,12,12,12,92,92,92,
92,12,92,12,92,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,19,19,108,92,8,92,92,19,92,108,92,19,92,92,92,
92,108,92,92,92,12,92,92,12,92,92,92,92,92,92,92,92,92,92,12,
12,92,92,92,92,223,12,92,12,12,12,12,12,92,92,12,92,12,12,12,
12,12,12,12,49,12,92,92,92,92,12,12,71,12,12,12,12,12,12,12,
92,92,118,92,12,12,118,12,12,12,12,12,12,71,12,12,12,12,12,12,
12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
12,12,118,118,12,118,12,12,12,12,12,12,12,12,12,12,12,12,71,12,
12,12,71,92,12,92,92,49,12,12,12,12,118,12,12,118,92,12,92,92,
12,12,12,12,123,12,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,92,92,19,92,92,108,
92,19,92,108,108,92,108,92,108,8,19,108,19,92,19,108,108,108,92,19,
92,92,19,92,108,108,92,108,108,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,12,12,12,12,12,12,92,92,92,92,92,92,12,12,12,12,12,118,12,
12,12,12,92,12,12,12,12,71,12,12,12,12,71,71,12,12,71,118,118,
12,12,12,12,12,118,12,12,12,92,12,12,12,12,12,71,12,12,118,12,
12,71,12,12,12,12,12,92,118,118,12,12,12,12,71,12,12,12,49,12,
92,12,92,92,92,12,92,12,12,12,12,12,92,92,92,92,92,92,92,92,
12,12,71,92,92,92,12,92,223,92,92,92,12,92,92,92,92,92,12,19,
92,92,92,92,92,92,108,92,108,19,92,108,108,108,92,92,19,108,92,108,
19,92,19,92,108,92,108,19,19,8,19,108,19,108,108,19,92,19,108,19,
19,108,108,19,19,92,108,92,92,108,19,12,108,108,92,19,108,108,92,19,
92,92,92,92,92,92,108,19,92,92,92,92,12,92,92,92,92,92,92,92,
92,92,92,12,12,118,123,92,12,12,92,92,92,92,92,92,12,12,12,12,
12,92,12,12,92,12,92,92,92,92,92,92,12,12,12,12,12,12,12,71,
71,12,12,12,12,12,12,12,71,12,12,12,12,12,12,92,12,12,92,12,
92,12,12,49,12,92,12,12,12,12,12,71,12,12,12,12,92,12,92,12,
92,92,92,92,92,12,12,12,12,92,12,12,92,92,92,92,92,92,12,12,
12,92,92,92,92,19,108,92,92,92,92,92,92,92,92,19,92,108,108,92,
92,92,92,19,108,92,19,108,92,108,108,92,19,92,108,19,108,92,108,92,
19,108,108,92,108,108,19,92,108,8,19,19,19,19,19,108,19,19,108,92,
19,19,108,92,19,19,108,19,108,92,108,19,92,19,92,92,92,19,92,92,
92,92,92,92,92,92,19,108,92,19,19,92,92,92,92,92,92,92,223,92,
223,92,92,92,92,92,92,92,92,92,92,92,92,223,92,92,92,12,92,12,
12,12,12,12,92,12,12,92,12,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,92,49,92,12,92,92,12,12,92,12,92,12,92,12,12,92,12,
12,12,12,12,12,12,12,92,92,92,12,92,92,92,92,92,92,92,92,92,
92,92,12,12,12,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,19,92,92,108,12,92,92,92,12,19,92,92,108,92,19,19,92,
92,92,92,92,108,19,92,19,19,92,92,108,108,92,108,92,19,19,19,108,
19,19,19,19,19,19,108,19,19,8,19,53,19,53,19,53,19,53,19,108,
19,108,19,108,108,108,19,108,19,108,19,108,108,108,108,19,108,19,108,19,
19,92,108,19,19,12,108,92,108,92,108,19,108,92,92,92,92,92,92,19,
92,19,108,92,19,92,92,92,92,92,92,92,92,92,92,92,108,108,19,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,92,92,92,12,92,19,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,108,19,92,92,223,92,92,92,92,92,92,
19,108,108,108,108,19,92,92,92,92,108,108,108,108,108,92,108,92,108,19,
92,19,108,108,19,108,108,108,108,108,19,19,19,19,19,19,108,108,53,19,
108,19,108,53,19,53,19,53,19,8,19,19,19,19,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,108,19,108,19,
19,19,19,19,108,19,108,19,108,19,108,19,19,19,19,108,19,92,92,92,
19,19,108,19,108,19,19,92,92,92,92,92,92,92,92,19,19,108,19,108,
19,92,19,92,92,92,92,92,92,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,19,19,19,92,19,19,92,19,19,108,92,92,92,19,92,92,92,
92,92,92,92,92,19,19,19,19,108,19,108,92,92,92,92,92,92,19,19,
92,19,223,19,108,19,108,92,19,19,19,19,19,19,108,19,108,19,108,19,
19,19,19,19,19,19,19,19,19,108,19,108,19,108,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,8};

View File

@ -5,18 +5,12 @@ SUBDIRS = \
libgck \
MapObject \
AlienMap \
Anamorphose \
CentralReflection \
Curtain \
Encrypt_Decrypt \
DigitalSignature \
dbbrowser \
fuse \
gflare \
@GIMPTCL@ \
script-fu \
struc \
twist \
@TIFF@ \
@JPEG@ \
@PNG@ \
@ -72,7 +66,6 @@ SUBDIRS = \
grid \
gz \
header \
holes \
hot \
hrz \
ifscompose \
@ -116,7 +109,6 @@ SUBDIRS = \
sobel \
sparkle \
spread \
stegano \
stereogram \
sunras \
tga \

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
aa

View File

@ -1,38 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = aa
aa_SOURCES = aa.c
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
-laa \
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
#STD#_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,10 +0,0 @@
This plugin isnt compliled by default with GIMP at the moment due to
the moving target status of the lib it is based on. But we included it for
now since it is easier than removing it. If you want to compile it, you
probabaly need to get the latest version of aa-lib from:
So dont send us or Tim newsome bug reports about this yet.
ftp://ftp.ta.jcu.cz/pub/aa
NOTE: You need aalib version 1.1.6 for this plugin.

View File

@ -1,367 +0,0 @@
/**
* aa.c version 1.0
* A plugin that uses libaa (ftp://ftp.ta.jcu.cz/pub/aa) to * save images as
* ASCII.
* NOTE: This plugin *requires* aalib 1.1.5 or later. Earlier versions will
* not work.
* Code copied from all over the GIMP source.
* Tim Newsome <nuisance@cmu.edu>
*/
#include <aalib.h>
#include <string.h>
#include <libgimp/gimp.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
/*
* Declare some local functions.
*/
static void query(void);
static void run(char *name, int nparams, GParam * param, int *nreturn_vals,
GParam ** return_vals);
static gint aa_savable(gint32 drawable_ID);
static gint save_aa(int output_type, char *filename, gint32 image,
gint32 drawable);
static gint gimp2aa(gint32 image, gint32 drawable_ID, aa_context * context);
static gint type_dialog(int selected);
static void type_dialog_close_callback(GtkWidget *widget, gpointer data);
static void type_dialog_ok_callback (GtkWidget *widget, gpointer data);
static void type_dialog_toggle_update (GtkWidget *widget, gpointer data);
static void type_dialog_cancel_callback (GtkWidget *widget, gpointer data);
/*
* Some global variables.
*/
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
/**
* Type the user selected. (Global for easier UI coding.
*/
static int selected_type = 0;
MAIN()
/**
* Called by the GIMP to figure out what this plugin does.
*/
static void query()
{
static GParamDef save_args[] =
{
{PARAM_INT32, "run_mode", "Interactive, non-interactive"},
{PARAM_IMAGE, "image", "Input image"},
{PARAM_DRAWABLE, "drawable", "Drawable to save"},
{PARAM_STRING, "filename", "The name of the file to save the image in"},
{PARAM_STRING, "raw_filename", "The name entered"},
{PARAM_STRING, "file_type", "File type to use"}
};
static int nsave_args = sizeof(save_args) / sizeof(save_args[0]);
gimp_install_procedure("file_aa_save",
"Saves files in various text formats",
"Saves files in various text formats",
"Tim Newsome <nuisance@cmu.edu>",
"Tim Newsome <nuisance@cmu.edu>",
"1997",
"<Save>/AA",
"GRAY*", /* support grayscales */
PROC_PLUG_IN,
nsave_args, 0,
save_args, NULL);
gimp_register_save_handler("file_aa_save", "ansi,txt,text,html", "");
}
/**
* Searches aa_formats defined by aalib to find the index of the type
* specified by string.
* -1 means it wasn't found.
*/
static int get_type_from_string(char *string)
{
int type = 0;
aa_format **p = aa_formats;
while (*p && strcmp((*p)->formatname, string)) {
p++;
type++;
}
if (*p == NULL)
return -1;
return type;
}
/**
* Called by the GIMP to run the actual plugin.
*/
static void run(char *name, int nparams, GParam * param, int *nreturn_vals,
GParam ** return_vals)
{
static GParam values[2];
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
int output_type = 0;
static int last_type = 0;
/* Set us up to return a status. */
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
if (!aa_savable(param[2].data.d_int32)) {
values[0].data.d_status = STATUS_CALLING_ERROR;
return;
}
run_mode = param[0].data.d_int32;
switch (run_mode) {
case RUN_INTERACTIVE:
gimp_get_data("file_aa_save", &last_type);
output_type = type_dialog(last_type);
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 6)
status = STATUS_CALLING_ERROR;
else
output_type = get_type_from_string(param[5].data.d_string);
break;
case RUN_WITH_LAST_VALS:
gimp_get_data("file_aa_save", &last_type);
output_type = last_type;
break;
default:
break;
}
if (output_type < 0) {
status = STATUS_CALLING_ERROR;
return;
}
if (save_aa(output_type, param[3].data.d_string, param[1].data.d_int32,
param[2].data.d_int32))
values[0].data.d_status = STATUS_EXECUTION_ERROR;
else
values[0].data.d_status = STATUS_SUCCESS;
last_type = output_type;
gimp_set_data("file_aa_save", &last_type, sizeof(last_type));
}
/**
* The actual save function. What it's all about.
* The image type has to be GRAY.
*/
static gint save_aa(int output_type, char *filename, gint32 image,
gint32 drawable_ID)
{
aa_savedata savedata =
{NULL, NULL};
aa_context *context = NULL;
aa_format format;
GDrawable *drawable = NULL;
/*fprintf(stderr, "save %s\n", filename); */
drawable = gimp_drawable_get(drawable_ID);
memcpy(&format, aa_formats[output_type], sizeof(format));
format.width = drawable->width / 2;
format.height = drawable->height / 2;
/*fprintf(stderr, "save_aa %i x %i\n", format.width, format.height); */
/* Get a libaa context which will save its output to filename. */
savedata.name = filename;
savedata.format = &format;
context = aa_init(&save_d, &aa_defparams, &savedata);
if (context == NULL)
return 1;
gimp2aa(image, drawable_ID, context);
aa_flush(context);
aa_close(context);
/*fprintf(stderr, "Success!\n"); */
return 0;
}
static gint gimp2aa(gint32 image, gint32 drawable_ID, aa_context * context)
{
int width, height, x, y;
guchar *buffer;
GDrawable *drawable = NULL;
GPixelRgn pixel_rgn;
aa_renderparams *renderparams = NULL;
int bpp;
width = aa_imgwidth(context);
height = aa_imgheight(context);
/*fprintf(stderr, "gimp2aa %i x %i\n", width, height); */
drawable = gimp_drawable_get(drawable_ID);
bpp = drawable->bpp;
buffer = g_new(guchar, width * bpp);
if (buffer == NULL)
return 1;
gimp_pixel_rgn_init(&pixel_rgn, drawable, 0, 0, drawable->width,
drawable->height, FALSE, FALSE);
for (y = 0; y < height; y++) {
gimp_pixel_rgn_get_row(&pixel_rgn, buffer, 0, y, width);
for (x = 0; x < width; x++) {
/* Just copy one byte. If it's indexed that's all we need. Otherwise
* it'll be the most significant one. */
aa_putpixel(context, x, y, buffer[x * bpp]);
}
}
renderparams = aa_getrenderparams();
renderparams->dither = AA_FLOYD_S;
aa_render(context, renderparams, 0, 0, aa_scrwidth(context),
aa_scrheight(context));
return 0;
}
static gint aa_savable(gint32 drawable_ID)
{
GDrawableType drawable_type;
drawable_type = gimp_drawable_type(drawable_ID);
if (drawable_type != GRAY_IMAGE && drawable_type != GRAYA_IMAGE)
return 0;
return 1;
}
/*
* User Interface dialog thingie.
*/
static gint type_dialog(int selected) {
GtkWidget *dlg;
GtkWidget *button;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *toggle_vbox;
GSList *group;
gchar **argv;
gint argc;
argc = 1;
argv = g_new(gchar *, 1);
argv[0] = g_strdup("save");
gtk_init(&argc, &argv);
gtk_rc_parse(gimp_gtkrc());
/* Create the actual window. */
dlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dlg), "Save as text");
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc) type_dialog_close_callback, NULL);
/* Action area */
button = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc) type_dialog_ok_callback, dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area), button,
TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
button = gtk_button_new_with_label("Cancel");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc) type_dialog_cancel_callback,
GTK_OBJECT(dlg));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area), button,
TRUE, TRUE, 0);
gtk_widget_show(button);
/* file save type */
frame = gtk_frame_new("Data Formatting");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, FALSE, TRUE, 0);
toggle_vbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(toggle_vbox), 5);
gtk_container_add(GTK_CONTAINER(frame), toggle_vbox);
group = NULL;
{
aa_format **p = aa_formats;
int current = 0;
while (*p != NULL) {
toggle = gtk_radio_button_new_with_label(group, (*p)->formatname);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
(GtkSignalFunc) type_dialog_toggle_update,
(*p)->formatname);
if (current == selected)
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle), 1);
else
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle), 0);
gtk_widget_show(toggle);
p++;
current++;
}
}
gtk_widget_show(toggle_vbox);
gtk_widget_show(frame);
gtk_widget_show(dlg);
gtk_main();
gdk_flush();
return selected_type;
}
/*
* Callbacks for the dialog.
*/
static void type_dialog_close_callback(GtkWidget *widget, gpointer data) {
gtk_main_quit();
}
static void type_dialog_ok_callback (GtkWidget *widget, gpointer data) {
gtk_widget_destroy (GTK_WIDGET (data));
}
static void type_dialog_cancel_callback (GtkWidget *widget, gpointer data) {
selected_type = -1;
gtk_widget_destroy (GTK_WIDGET (data));
}
static void type_dialog_toggle_update (GtkWidget *widget, gpointer data) {
selected_type = get_type_from_string((char *)data);
}

View File

@ -1,11 +0,0 @@
This plugin isnt compliled by default with GIMP at the moment due to
the moving target status of the lib it is based on. But we included it for
now since it is easier than removing it. If you want to compile it, you
probabaly need to get the latest version of aa-lib from:
So dont send us or Tim newsome bug reports about this yet.
ftp://ftp.ta.jcu.cz/pub/aa

View File

@ -1,367 +0,0 @@
/**
* aa.c version 1.0
* A plugin that uses libaa (ftp://ftp.ta.jcu.cz/pub/aa) to * save images as
* ASCII.
* NOTE: This plugin *requires* aalib 1.1.5 or later. Earlier versions will
* not work.
* Code copied from all over the GIMP source.
* Tim Newsome <nuisance@cmu.edu>
*/
#include <aalib.h>
#include <string.h>
#include <libgimp/gimp.h>
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
/*
* Declare some local functions.
*/
static void query(void);
static void run(char *name, int nparams, GParam * param, int *nreturn_vals,
GParam ** return_vals);
static gint aa_savable(gint32 drawable_ID);
static gint save_aa(int output_type, char *filename, gint32 image,
gint32 drawable);
static gint gimp2aa(gint32 image, gint32 drawable_ID, aa_context * context);
static gint type_dialog(int selected);
static void type_dialog_close_callback(GtkWidget *widget, gpointer data);
static void type_dialog_ok_callback (GtkWidget *widget, gpointer data);
static void type_dialog_toggle_update (GtkWidget *widget, gpointer data);
static void type_dialog_cancel_callback (GtkWidget *widget, gpointer data);
/*
* Some global variables.
*/
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
/**
* Type the user selected. (Global for easier UI coding.
*/
static int selected_type = 0;
MAIN()
/**
* Called by the GIMP to figure out what this plugin does.
*/
static void query()
{
static GParamDef save_args[] =
{
{PARAM_INT32, "run_mode", "Interactive, non-interactive"},
{PARAM_IMAGE, "image", "Input image"},
{PARAM_DRAWABLE, "drawable", "Drawable to save"},
{PARAM_STRING, "filename", "The name of the file to save the image in"},
{PARAM_STRING, "raw_filename", "The name entered"},
{PARAM_STRING, "file_type", "File type to use"}
};
static int nsave_args = sizeof(save_args) / sizeof(save_args[0]);
gimp_install_procedure("file_aa_save",
"Saves files in various text formats",
"Saves files in various text formats",
"Tim Newsome <nuisance@cmu.edu>",
"Tim Newsome <nuisance@cmu.edu>",
"1997",
"<Save>/AA",
"GRAY*", /* support grayscales */
PROC_PLUG_IN,
nsave_args, 0,
save_args, NULL);
gimp_register_save_handler("file_aa_save", "ansi,txt,text,html", "");
}
/**
* Searches aa_formats defined by aalib to find the index of the type
* specified by string.
* -1 means it wasn't found.
*/
static int get_type_from_string(char *string)
{
int type = 0;
aa_format **p = aa_formats;
while (*p && strcmp((*p)->formatname, string)) {
p++;
type++;
}
if (*p == NULL)
return -1;
return type;
}
/**
* Called by the GIMP to run the actual plugin.
*/
static void run(char *name, int nparams, GParam * param, int *nreturn_vals,
GParam ** return_vals)
{
static GParam values[2];
GStatusType status = STATUS_SUCCESS;
GRunModeType run_mode;
int output_type = 0;
static int last_type = 0;
/* Set us up to return a status. */
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = STATUS_CALLING_ERROR;
if (!aa_savable(param[2].data.d_int32)) {
values[0].data.d_status = STATUS_CALLING_ERROR;
return;
}
run_mode = param[0].data.d_int32;
switch (run_mode) {
case RUN_INTERACTIVE:
gimp_get_data("file_aa_save", &last_type);
output_type = type_dialog(last_type);
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
if (nparams != 6)
status = STATUS_CALLING_ERROR;
else
output_type = get_type_from_string(param[5].data.d_string);
break;
case RUN_WITH_LAST_VALS:
gimp_get_data("file_aa_save", &last_type);
output_type = last_type;
break;
default:
break;
}
if (output_type < 0) {
status = STATUS_CALLING_ERROR;
return;
}
if (save_aa(output_type, param[3].data.d_string, param[1].data.d_int32,
param[2].data.d_int32))
values[0].data.d_status = STATUS_EXECUTION_ERROR;
else
values[0].data.d_status = STATUS_SUCCESS;
last_type = output_type;
gimp_set_data("file_aa_save", &last_type, sizeof(last_type));
}
/**
* The actual save function. What it's all about.
* The image type has to be GRAY.
*/
static gint save_aa(int output_type, char *filename, gint32 image,
gint32 drawable_ID)
{
aa_savedata savedata =
{NULL, NULL};
aa_context *context = NULL;
aa_format format;
GDrawable *drawable = NULL;
/*fprintf(stderr, "save %s\n", filename); */
drawable = gimp_drawable_get(drawable_ID);
memcpy(&format, aa_formats[output_type], sizeof(format));
format.width = drawable->width / 2;
format.height = drawable->height / 2;
/*fprintf(stderr, "save_aa %i x %i\n", format.width, format.height); */
/* Get a libaa context which will save its output to filename. */
savedata.name = filename;
savedata.format = &format;
context = aa_init(&save_d, &aa_defparams, &savedata);
if (context == NULL)
return 1;
gimp2aa(image, drawable_ID, context);
aa_flush(context);
aa_close(context);
/*fprintf(stderr, "Success!\n"); */
return 0;
}
static gint gimp2aa(gint32 image, gint32 drawable_ID, aa_context * context)
{
int width, height, x, y;
guchar *buffer;
GDrawable *drawable = NULL;
GPixelRgn pixel_rgn;
aa_renderparams *renderparams = NULL;
int bpp;
width = aa_imgwidth(context);
height = aa_imgheight(context);
/*fprintf(stderr, "gimp2aa %i x %i\n", width, height); */
drawable = gimp_drawable_get(drawable_ID);
bpp = drawable->bpp;
buffer = g_new(guchar, width * bpp);
if (buffer == NULL)
return 1;
gimp_pixel_rgn_init(&pixel_rgn, drawable, 0, 0, drawable->width,
drawable->height, FALSE, FALSE);
for (y = 0; y < height; y++) {
gimp_pixel_rgn_get_row(&pixel_rgn, buffer, 0, y, width);
for (x = 0; x < width; x++) {
/* Just copy one byte. If it's indexed that's all we need. Otherwise
* it'll be the most significant one. */
aa_putpixel(context, x, y, buffer[x * bpp]);
}
}
renderparams = aa_getrenderparams();
renderparams->dither = AA_FLOYD_S;
aa_render(context, renderparams, 0, 0, aa_scrwidth(context),
aa_scrheight(context));
return 0;
}
static gint aa_savable(gint32 drawable_ID)
{
GDrawableType drawable_type;
drawable_type = gimp_drawable_type(drawable_ID);
if (drawable_type != GRAY_IMAGE && drawable_type != GRAYA_IMAGE)
return 0;
return 1;
}
/*
* User Interface dialog thingie.
*/
static gint type_dialog(int selected) {
GtkWidget *dlg;
GtkWidget *button;
GtkWidget *toggle;
GtkWidget *frame;
GtkWidget *toggle_vbox;
GSList *group;
gchar **argv;
gint argc;
argc = 1;
argv = g_new(gchar *, 1);
argv[0] = g_strdup("save");
gtk_init(&argc, &argv);
gtk_rc_parse(gimp_gtkrc());
/* Create the actual window. */
dlg = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dlg), "Save as text");
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
(GtkSignalFunc) type_dialog_close_callback, NULL);
/* Action area */
button = gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT(button), "clicked",
(GtkSignalFunc) type_dialog_ok_callback, dlg);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area), button,
TRUE, TRUE, 0);
gtk_widget_grab_default(button);
gtk_widget_show(button);
button = gtk_button_new_with_label("Cancel");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc) type_dialog_cancel_callback,
GTK_OBJECT(dlg));
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area), button,
TRUE, TRUE, 0);
gtk_widget_show(button);
/* file save type */
frame = gtk_frame_new("Data Formatting");
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width(GTK_CONTAINER(frame), 10);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->vbox), frame, FALSE, TRUE, 0);
toggle_vbox = gtk_vbox_new(FALSE, 5);
gtk_container_border_width(GTK_CONTAINER(toggle_vbox), 5);
gtk_container_add(GTK_CONTAINER(frame), toggle_vbox);
group = NULL;
{
aa_format **p = aa_formats;
int current = 0;
while (*p != NULL) {
toggle = gtk_radio_button_new_with_label(group, (*p)->formatname);
group = gtk_radio_button_group(GTK_RADIO_BUTTON(toggle));
gtk_box_pack_start (GTK_BOX (toggle_vbox), toggle, FALSE, FALSE, 0);
gtk_signal_connect(GTK_OBJECT(toggle), "toggled",
(GtkSignalFunc) type_dialog_toggle_update,
(*p)->formatname);
if (current == selected)
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle), 1);
else
gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(toggle), 0);
gtk_widget_show(toggle);
p++;
current++;
}
}
gtk_widget_show(toggle_vbox);
gtk_widget_show(frame);
gtk_widget_show(dlg);
gtk_main();
gdk_flush();
return selected_type;
}
/*
* Callbacks for the dialog.
*/
static void type_dialog_close_callback(GtkWidget *widget, gpointer data) {
gtk_main_quit();
}
static void type_dialog_ok_callback (GtkWidget *widget, gpointer data) {
gtk_widget_destroy (GTK_WIDGET (data));
}
static void type_dialog_cancel_callback (GtkWidget *widget, gpointer data) {
selected_type = -1;
gtk_widget_destroy (GTK_WIDGET (data));
}
static void type_dialog_toggle_update (GtkWidget *widget, gpointer data) {
selected_type = get_type_from_string((char *)data);
}

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
gag-0.3

View File

@ -1,57 +0,0 @@
GAG 0.3 (Wed Aug 20 1997)
-=-=-=-=-=-=-=-=-=-=-=-=-=-
o new GAG library entries by Marcelo de Gomensoro Malheiros
o now you can load/save libraries from file
o several dialogs are now placed under mouse cursor (GTK_WIN_POS_MOUSE)
o I reorganized Library popup menu so now "Delete" is not the
first item
o All scales are now initialy set to 0.0 - also Reset scales set all
scales to 0.0
o GAG is now GiMP plug-in! GAG now renders pictures to current drawable
- now, there are two binaries: gag (stand-alone program) and gag-plugin
o gag-plugin requires one more entry in gimprc - gag-library - for example:
(gag-library "${gimp_dir}/gag-library")
o repaired "/" bug (unfortunately expressions with "/" operator looks
differently under gag-0.2 and gag-0.3)
GAG 0.2 (Thu Aug 14 1997)
-=-=-=-=-=-=-=-=-=-=-=-=-=-
o mosaic preview
o output of (bw|color)-noise is now independent on time or platform (ie with
one expression you obtain same picture any time you try do render it)
o library is loaded from "gag-library" file on start, on exit whole library
is saved to this file. Syntax of "gag-library" file is very similar to scheme
- but be aware that this is just similarity (it is not real scheme - for more
info see gag-lib.c :-)
GAG 0.2 pre1 (Tue Aug 12 1997)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
o Library is now working (save to/load from)
"left doubleckick" -=> preview
"right mouse button" -=> more actions
o small improvements in edit entry (it allows edit of current expression)
GAG 0.1 (Mon Aug 11 1997)
-=-=-=-=-=-=-=-=-=-=-=-=-=-
o Improvements & bugfixes in user interface by Robert Saunders
o I completly rewrote part of GAG which evaluates expressions
o you can now use (color) vectors in expressions (rgb or rgba vectors) but rgba
is not yet utilized
o noise* functions renamed to bw-noise*
o new functions color-noise, color-noise-xy
o I temporarily disabled *-noise-xy functions - for more explanation see
TODO list (if you want them back delete comments in expressions.tmpl
file). Other *-noise functions are enabled (so GAG use noise functions in
expressions but not enormously often)
GAG 0.0 (Fri Aug 8 1997)
-=-=-=-=-=-=-=-=-=-=-=-=-
o No changes (sorry :) - initial release..

View File

@ -1,38 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = #STD#
#STD#_SOURCES = \
#STD#.c
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
#STD#_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,107 +0,0 @@
I really have to write here something... later :-)
I am really sorry for my english... - anybody want to write tutorial and docs?
FAQs & FAAs:
Q) How to compile?
A) I expect that you know (or find) the answer to this question - well, it's
developers version.. Do not expect too much from me! For now you must have
sizeof(double)==8 (for xor, or and and) - I fix this later.
Q) How to install GAG-plug-in for one user?
A) Copy gag-plugin binary to your local plug-in directory (for example ~/.gimp/
plug-ins/), gag-library to ~/.gimp/gag-library and then set gag-library in
gimprc file (ie add following line
(gag-library "${gimp_dir}/gag-library"}
Q) How to install GAG-plug-in for all users?
A) It is similar to installing GAG-plug-in for one user - also do not forget to
change "user_install" script - so all users have own copy of gag-library
Q) Hey, I can not do anything in GAG!
A) Feel adventurous! Do experiments! Click with mouse on one of nine
pools. Right button of mouse!
Q) I expected much more from free software than "Feel adventurous"!
A) Ok, ok. Generate one or more random individual (or specify them by hand with
expression. Be careful, expressions have scheme-like syntax). Then set weight -
weight means how much you like such picture (set higher value of weight for
pictures which you prefere...) Finally press button `New generation'. That's
all.
Q) Supported functions?
A) See expressions.tmpl
Q) Why GAG?
A) I really do not know...
Q) Algorithms?
A) GAG uses genetic algorithms - for more info about them see
http://www.aracnet.com/~wwir/NovaGenetica/
Usage of genetic algorithms in task of generating nice pictures was firstly
described in:
Karl Sims: Artificial Evolution for Computer Graphics, SIGGRAPH 1991
(Computer Graphics, vol 25, num 4, pages 319-328)
Q) Some examples of evolved expressions?
A) [simple but nice]
(-
(cos
(x
)
)
(abs
(bw-noise-xy (x) (y)
)
)
)
[for more examples see GAG library]
Q) Is GAG free?
A) Of course - it is distributed under GNU General Public License (see
http://www.gnu.org). All users are encouraged to enhance current code and send
improvements to author. (Also please send me any your comment, nice picture,
bug, constructive critique,...)
Short list of authors, contributors or active betatesters:
Daniel Skarda (0rfelyus@atrey.karlin.mff.cuni.cz)
Robert Saunders (rob@arch.usyd.EDU.AU)
Marcelo de Gomensoro Malheiros (malheiro@dca.fee.unicamp.br)
Thanks to:
Karl Sims for his beautiful idea.
Linus Torwalds for Linux
Richard Stallman & many ohers for GNU, gcc, EMACS,...
The XFree86 Project Inc for their X11 server
Peter Mattis & Spencer Kimball for GIMP & GTK
Adverts:
Have a look at homepage of XaoS - portable realtime fractal zoomer by Honza
Hubicka!
http://www.paru.cas.cz/~hubicka/XaoS/
------------------------------------------------------------------------------
Daniel Skarda 0rfelyus@atrey.karlin.mff.cuni.cz
Vesinova 16
100 00 Prague 10
Czech Republic
ugly homepage:
http://atrey.karlin.mff.cuni.cz/~0rfelyus
ftp archive:
ftp://atrey.karlin.mff.cuni.cz/pub/local/0rfelyus

View File

@ -1,104 +0,0 @@
legend:
-------
* open bugs || requests - please contribute!
o I want to concern myself on that feature in the next version
. already smashed bugs || satisfied requests
I am sorry about my Czenglish (mixture of Czech and English) - but following lines
are intended mainly for me :-)
Possible bugs:
-=-=-=-=-=-=-=-
. progress bar does not work - I wonder why?
* it seems that pop-up menu does not work properly - sometimes it is realy
ignorant to all your efforts to activate entry. Maybe there are deep secrets
in gtk which I have mised....
. make sure that all functions do what I expect they do (min, max.... - they do
what they want,.. not what I want... :(
* make sure that random, mute or evolve does not return too big expressions...
* problem with converting gray-=> color -=> gray (because first is g->(g,g,g),
second is (r,g,b)->0.299*r + 0.587*g + b*0.114)
* ugly problem: sin(x)= <-1,1>, but with current wrap func 1 means same color
as 0 :-( - same for noise etc... - could be solved with pingpong wraper - but
this is not satisfactory solution)
. bug in "/" operator !!!
There are some random thoughts I had about GAG:
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
* another name for GAG? - GA Exploder? GA Dezorientator? GA Time waster? :-)
* nice logo for GAG (of course do it with GAG :-)
* GAG Homepage with nice pictures, screenshots and tutorials.... I hate homepages :( especialy those without any usefull
information but with <censored> frames,java and tons of graphics...) (anyone want to volunteer nice humble lynx-friendly
GAG homepage?)
. colored pictures :-)
* handle alpha channel
. warp function
. noise function (steal it from noise plug-in :-)
. mutate
. mate ...
. and, or xor
* better gas_random which could identify interesting patters (ie non zero etc,
non constant..)
. gimp version of GAG (ie gag should be real plug-in)
* possibility of interupt computation
* dialog for Render picture (current layer, create new layer, new image..)
* it seems that function for setting weights of operators is highly needed -
there are only few operators which could act as leaf (const, vector[34],
x,y,(bw|color)-noise-xy) - so there are too many noise functions in
expressions so it is hard to evolve picture without any noise-function
(and I know that there are alse non-noisy nice pictures:)
- another possibile solution - delete noisy-xy functions so there will be only
two noise functions instead of four
. noise functions must be independent on rand() (so anywhere & any time you can
obtain same pictures..)
* another mutate function - permutate vector?
* copy?
* arbitrary matrix of individuals in one generation (rather than 3x3 ??)
* library of nice epressions (please contribute! :-)
. load from/save to this library
. on start load random expressions from library...
. save library on exit
* temporary library or some other mechanism for pushing/poping expressions (or
all nine expressions) or some undo mechanism... (undo last mute&mate)
* config file?
* many many options for everything (and than another ga solver to find best values :)
* options (buttons, switches and other ...) for:
* to be or not to be
* mutating? mating?
* check for 'uninteresting' pictures when creating
* them with random?
* weights of operators
* choosing leaf prob. func
* mutating: function for choosing mutate function,.. weight of
* functions..
* type of mating ( 1:1 or according to the `beauty' of expression)
* switch for various types of wrapping... (when ! 0<x<1.0 ...)
. parser for expression & possibility of editing expression by hand
. beautify "edit by hand" dialog & add clear button & init value should be set to
current expression
* parser for INfix expressions (as oposit to prefix of `scheme' like syntax) -
cut'n'copy it from parser I wrote for my patch to pov-ray (implicit and
parametric functions for pov-ray 2.2
* history of typed expression...
* more types of rand function (ie not only <0,1>, but also <-1,1>, gauss, <-infity,+infity>...)
* mosaic preview for faster computation so users will not be bored :-)
* anyway, speed all things up... well, what about buing new Hyper Super Pentium 7x+ BPro MMX QTWYUIT @#$^%
. (maybe repleace this recursive eval_* calls by stack based computation
* and what about PVM and distribution of calculation over network??
* antialiasing for final rendering
* algorithm for find expression which is the best aproximation of given picture
* % operator
* color-map function (something like gradient-map plug-in)
* take some inspirations from SBART?
* (x,y,0), (x,0,y), (0,x,y), (y,x,0), (y,0,x), (0,y,x) functions?
* hypot func?
* nice tree editor for expressions?
* how to implement that ifs function from Karl Sims's article?
* function for simplify expressions (for speed things up, mostly for final
rendering - to eliminate abs(abs(..)), y+y+y,.... (btw it is not accident that
this entry is last in my todo list :)

View File

@ -1,107 +0,0 @@
I really have to write here something... later :-)
I am really sorry for my english... - anybody want to write tutorial and docs?
FAQs & FAAs:
Q) How to compile?
A) I expect that you know (or find) the answer to this question - well, it's
developers version.. Do not expect too much from me! For now you must have
sizeof(double)==8 (for xor, or and and) - I fix this later.
Q) How to install GAG-plug-in for one user?
A) Copy gag-plugin binary to your local plug-in directory (for example ~/.gimp/
plug-ins/), gag-library to ~/.gimp/gag-library and then set gag-library in
gimprc file (ie add following line
(gag-library "${gimp_dir}/gag-library"}
Q) How to install GAG-plug-in for all users?
A) It is similar to installing GAG-plug-in for one user - also do not forget to
change "user_install" script - so all users have own copy of gag-library
Q) Hey, I can not do anything in GAG!
A) Feel adventurous! Do experiments! Click with mouse on one of nine
pools. Right button of mouse!
Q) I expected much more from free software than "Feel adventurous"!
A) Ok, ok. Generate one or more random individual (or specify them by hand with
expression. Be careful, expressions have scheme-like syntax). Then set weight -
weight means how much you like such picture (set higher value of weight for
pictures which you prefere...) Finally press button `New generation'. That's
all.
Q) Supported functions?
A) See expressions.tmpl
Q) Why GAG?
A) I really do not know...
Q) Algorithms?
A) GAG uses genetic algorithms - for more info about them see
http://www.aracnet.com/~wwir/NovaGenetica/
Usage of genetic algorithms in task of generating nice pictures was firstly
described in:
Karl Sims: Artificial Evolution for Computer Graphics, SIGGRAPH 1991
(Computer Graphics, vol 25, num 4, pages 319-328)
Q) Some examples of evolved expressions?
A) [simple but nice]
(-
(cos
(x
)
)
(abs
(bw-noise-xy (x) (y)
)
)
)
[for more examples see GAG library]
Q) Is GAG free?
A) Of course - it is distributed under GNU General Public License (see
http://www.gnu.org). All users are encouraged to enhance current code and send
improvements to author. (Also please send me any your comment, nice picture,
bug, constructive critique,...)
Short list of authors, contributors or active betatesters:
Daniel Skarda (0rfelyus@atrey.karlin.mff.cuni.cz)
Robert Saunders (rob@arch.usyd.EDU.AU)
Marcelo de Gomensoro Malheiros (malheiro@dca.fee.unicamp.br)
Thanks to:
Karl Sims for his beautiful idea.
Linus Torwalds for Linux
Richard Stallman & many ohers for GNU, gcc, EMACS,...
The XFree86 Project Inc for their X11 server
Peter Mattis & Spencer Kimball for GIMP & GTK
Adverts:
Have a look at homepage of XaoS - portable realtime fractal zoomer by Honza
Hubicka!
http://www.paru.cas.cz/~hubicka/XaoS/
------------------------------------------------------------------------------
Daniel Skarda 0rfelyus@atrey.karlin.mff.cuni.cz
Vesinova 16
100 00 Prague 10
Czech Republic
ugly homepage:
http://atrey.karlin.mff.cuni.cz/~0rfelyus
ftp archive:
ftp://atrey.karlin.mff.cuni.cz/pub/local/0rfelyus

View File

@ -1,686 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <math.h>
#include "expressions.h"
DBL x_val, y_val;
static NODE *nodes[MAX_STACK_ENTRIES];
static int num_of_nodes;
static DBL r_values[MAX_STACK_ENTRIES],
g_values[MAX_STACK_ENTRIES],
b_values[MAX_STACK_ENTRIES],
alfa_values[MAX_STACK_ENTRIES],
data_values[MAX_STACK_ENTRIES];
static func_type *func_st[MAX_STACK_ENTRIES];
NODE **n_top;
DBL *r_top, *g_top, *b_top,* alfa_top;
DBL *data_top;
void conv_1_3(void);
void conv_1_4(void);
void conv_3_1(void);
void conv_3_4(void);
void conv_4_1(void);
void conv_4_3(void);
void insert_convert_func(int ifrom, int ito);
/**************************************************
EVALUATION & COMPILATION OF EXP
**************************************************/
void eval_xy( DBL *result,DBL x, DBL y)
{
func_type **func;
int i;
x_val= x;
y_val= y;
r_top= r_values - 1;
g_top= g_values - 1;
b_top= b_values - 1;
alfa_top= alfa_values - 1;
n_top= nodes;
data_top= data_values;
func= func_st;
for (i=num_of_nodes; i ; (*func)(), i--, n_top++, func++);
result[0]= *r_top;
result[1]= *g_top;
result[2]= *b_top;
result[3]= *alfa_top;
}
char find_tof( NODE *n)
{
int i;
char tmp,ret=1;
for (i=0; i < n->noo; i++)
{
tmp = find_tof( (n->offsprings)[i] );
if (tmp > ret) ret= tmp;
}
if (n->op->ret_type == -1)
n-> tof= ret;
else
n-> tof= n->op->ret_type;
return n->tof;
}
void st_insert( func_type *func, NODE *n )
{
nodes[num_of_nodes]=n;
func_st[num_of_nodes]= func;
num_of_nodes++;
}
void compile(NODE *n)
{
int i;
int ret, oret;
int cret;
ret= n->tof;
cret= ret-1;
if (cret > 0) cret--; /* 1,3,4 -=> 0,1,2 */
for (i=0; i < n -> noo; i++)
{
if ( n -> op-> funcs != NULL)
if ( ((n->op->funcs)[i][cret]) != NULL)
st_insert( ((n->op->funcs)[i][cret]), n );
compile( (n->offsprings)[i] );
oret= (n->offsprings)[i]->tof;
if (ret != oret)
insert_convert_func(oret, ret);
}
if ( n ->op-> funcs != NULL)
if ( ((n->op->funcs)[i][cret]) != NULL)
st_insert( ((n->op->funcs)[i][cret]), n );
if ( (n->op->last_func)[cret] != NULL)
st_insert( (n->op->last_func)[cret], n );
for (i=0; i < n->op->nofd; i++)
{
*data_top= n->data[i];
data_top++;
}
}
void prepare_node( NODE *n)
{
char lastret;
lastret= find_tof( n );
num_of_nodes=0;
data_top=data_values;
compile( n );
if (lastret==3) insert_convert_func(3,4);
if (lastret==1) insert_convert_func(1,4);
}
void conv_1_3(void)
{
g_top++; *g_top= *r_top;
b_top++; *b_top= *r_top;
}
void conv_1_4(void)
{
g_top++; *g_top= *r_top;
b_top++; *b_top= *r_top;
alfa_top++; *alfa_top= 1.0;
}
void conv_3_1(void)
{
*r_top= *r_top * 0.299 + *g_top * 0.587 + *b_top * 0.114;
g_top--;
b_top--;
}
void conv_3_4(void)
{
alfa_top++; *alfa_top= 1.0;
}
void conv_4_1(void)
{
*r_top= *r_top * 0.299 + *g_top * 0.587 + *b_top * 0.114;
g_top--;
b_top--;
alfa_top--;
}
void conv_4_3(void)
{
--alfa_top;
}
void insert_convert_func(int ifrom, int ito)
{
if (ifrom==ito) return;
if (ifrom == 1)
if (ito == 3)
st_insert( conv_1_3, NULL );
else
st_insert( conv_1_4, NULL );
else
if (ifrom==3)
if (ito==1)
st_insert( conv_3_1, NULL );
else
st_insert( conv_3_4, NULL );
else
if (ito==1)
st_insert( conv_4_1, NULL );
else
st_insert( conv_4_3, NULL );
}
/************************************************/
void destroy_node(NODE *n)
{
int i;
if (n==NULL) return;
for (i=0; i < n->noo; i++)
destroy_node( (n->offsprings)[i] );
free( n );
return;
}
DBL dblrand()
{
return ((DBL) rand()) / ((DBL) RAND_MAX);
}
void init_random()
{
srand( time(NULL) );
}
NODE *node_copy(NODE *n)
{
NODE *nn;
int i;
nn= (NODE *) malloc (sizeof(NODE));
*nn= *n;
for (i=0; i<n->noo; i++)
(nn->offsprings)[i]= node_copy( (n->offsprings)[i] );
return nn;
}
void expr_fprint(FILE *f, int i, NODE *n)
{
char tmp[100];
int j;
memset(tmp, ' ', 100);
tmp[i%100]=0;
if (n->op->nofd == 1)
{ /* float */
fprintf(f,"%s%.8f\n", tmp, n->data[0]);
return;
}
if (n->op->nofd >= 3)
{
fprintf(f, "%s#(", tmp);
for (j=0; j < n->op->nofd - 1; j++)
fprintf(f,"%.8f ",n->data[j]);
fprintf(f,"%.8f",n->data[j]);
fprintf(f, ")\n");
return;
}
fprintf (f, "%s(%s\n",tmp, n->op->name);
for (j=0; j<n->noo; j++)
expr_fprint(f, i+2, (n->offsprings)[j] );
fprintf (f, "%s)\n",tmp);
}
int expr_sprint(char *s, NODE *n)
{
int len=0,j,t;
if (n->op->nofd == 1)
{ /* float */
return sprintf(s,"%.8f\n", n->data[0]);
}
if (n->op->nofd >= 3)
{
len= sprintf(s,"#(");
s+=len;
for (j=0; j < n->op->nofd - 1; j++)
{
t= sprintf(s,"%.8f ",n->data[j]);
s+= t;
len+=t;
}
t= sprintf(s,"%.8f)",n->data[j]);
s+=t; len+=t;
return len;
}
len= sprintf (s,"(%s", n->op->name);
s+=len;
for (j=0; j<n->noo; j++)
{
*s=' ';
s++; len++;
t= expr_sprint(s, (n->offsprings)[j] );
s+= t; len+= t;
}
*s= ')';
s++; len++;
*s='\000';
return len;
}
/******************************
FUNCTIONS FOR PARSING EXPRESSIONS
******************************/
static int find_op(char *c)
{
int i;
for (i=0; i< Number_of_Functions; i++)
if (strcmp(c,FuncInfo[i].name)==0) return i;
return -1;
}
#define EAT_EMPTY_SPACE(PTR) \
while (isspace(*PTR)) (PTR)++;
#define PERROR(S) \
{ \
int j; \
if (S!=NULL) \
printf("Error: %s\n",S); \
for (j=0; j < params; j++) \
destroy_node(offs[j]); \
return NULL; \
}
NODE *parse_prefix_expression(char **c)
{
int p, params;
int i;
NODE *n;
DBL v;
NODE *(offs[MAX_NUMBER_OF_PARAMETERS]);
char buff[50];
EAT_EMPTY_SPACE(*c);
params=0;
if (**c=='(') /* operator */
{
char *tmp;
char vtmp;
(*c)++;
EAT_EMPTY_SPACE(*c);
tmp= *c;
while ((!isspace(**c))&&(**c!=')')) (*c)++;
vtmp= **c;
**c= 0;
if ((p= find_op(tmp))==-1)
{sprintf(buff,"unknown operator: %s",tmp); PERROR(buff) };
**c= vtmp;
for (i=0;i<=MAX_NUMBER_OF_PARAMETERS;i++, params++)
{
EAT_EMPTY_SPACE(*c);
if (**c == ')') break;
offs[i]= parse_prefix_expression(c);
if (offs[i]==NULL)
PERROR((char *)NULL);
}
if (**c != ')')
PERROR("')' expected");
(*c)++;
if (((FuncInfo[p].nofp == -1) && (i==0)) ||
((FuncInfo[p].nofp != -1) && (i!= FuncInfo[p].nofp)))
PERROR("wrong number of parameters");
n= (NODE *) malloc(sizeof(NODE));
n->op= &(FuncInfo[p]);
n->noo=i;
memcpy((n->offsprings), offs, i * sizeof(NODE *));
return n;
}
if ((**c=='.')||(**c=='+')||(**c=='-')|| isdigit(**c))
{
v= strtod(*c, c);
if ((p= find_op("const"))==-1)
PERROR("Warning: there is no const in expression.tmpl");
n= (NODE *) malloc(sizeof(NODE));
n->op= &(FuncInfo[p]);
n->noo=0;
(n->data)[0]= v;
return n;
}
if (**c=='#')
{
DBL tmp[10];
int i;
(*c)++;
EAT_EMPTY_SPACE(*c);
if (**c != '(')
PERROR("'(' expected");
(*c)++;
for ( i = 0; i < 5; i++)
{
tmp[i]= strtod(*c, c);
EAT_EMPTY_SPACE(*c);
if (**c==')') break;
}
if ((i != 2) && (i != 3)) PERROR("Wrong number of vector components");
(*c)++;
n= (NODE *) malloc(sizeof(NODE));
n->op= &(FuncInfo[ find_op( (i==2) ? "vector3" : "vector4" ) ]);
n->noo=0;
for (; i >=0; i--)
(n->data)[i]=tmp[i];
return n;
}
sprintf(buff,"Unexpected character: %c",**c);
PERROR(buff);
}
DBL double_xor (DBL p1, DBL p2)
{
#if DBL_SIZE==8
int *i1, *i2, *i3;
DBL ret;
i1= (int *) &p1;
i2= (int *) &p2;
i3= (int *) &ret;
*i3= (*i1) ^ (*i2);
i1++; i2++; i3++;
*i3= (*i1) ^ (*i2);
return ret;
#else
# error "Please rewrite this function for your architecture... :-)"
#endif
}
DBL double_or (DBL p1, DBL p2)
{
#if DBL_SIZE==8
int *i1, *i2, *i3;
DBL ret;
i1= (int *) &p1;
i2= (int *) &p2;
i3= (int *) &ret;
*i3= (*i1) | (*i2);
i1++; i2++; i3++;
*i3= (*i1) | (*i2);
return ret;
#else
# error "Please rewrite this function for your architecture... :-)"
#endif
}
DBL double_and (DBL p1, DBL p2)
{
#if DBL_SIZE==8
int *i1, *i2, *i3;
DBL ret;
i1= (int *) &p1;
i2= (int *) &p2;
i3= (int *) &ret;
*i3= (*i1) & (*i2);
i1++; i2++; i3++;
*i3= (*i1) * (*i2);
return ret;
#else
# error "Please rewrite this function for your architecture... :-)"
#endif
}
unsigned char (*wrap_func)(DBL)= wrap_func_rep;
unsigned char wrap_func_cut(DBL n)
{
if (n < 0.0) return 0;
if (n > 1.0) return 255;
return (unsigned char) (n*255.0);
}
unsigned char wrap_func_rep(DBL n)
{
return (unsigned char) (255.0 * (n - floor(n)));
}
unsigned char wrap_func_pingpong(DBL n)
{
if ( ((int ) (n - floor(n))) & 1 )
return (unsigned char) ((1.0 - n + floor(n)) * 255 );
else
return (unsigned char) (255.0 * (n - floor(n)));
}
/******************************
NOISE
I was in hurry so I borrowed code from snoise plug-in
by Marcelo de Gomensoro Malheiros
Thank you !
******************************/
#define TABLE_SIZE 256
#define WEIGHT(T) ((2.0*fabs(T) - 3.0)*(T)*(T)+1.0)
typedef struct {
DBL x, y;
} Vector2d;
static int perm_tab[TABLE_SIZE]= {
254, 20, 180, 81, 171, 17, 83, 7, 18, 72, 154, 11, 12, 134, 251, 15,
173, 33, 252, 109, 21, 2, 101, 124, 24, 149, 136, 181, 112, 22, 220, 68,
67, 164, 87, 125, 44, 244, 38, 55, 40, 248, 138, 226, 36, 139, 103, 88,
75, 49, 74, 43, 16, 216, 210, 90, 203, 150, 58, 59, 29, 26, 159, 63,
64, 167, 66, 253, 105, 69, 232, 250, 50, 147, 95, 225, 4, 175, 71, 132,
80, 162, 200, 118, 247, 185, 45, 5, 91, 104, 97, 186, 187, 128, 41, 99,
96, 39, 131, 196, 148, 184, 102, 78, 34, 77, 106, 133, 211, 212, 108, 143,
137, 240, 51, 60, 215, 224, 152, 119, 120, 183, 6, 130, 158, 114, 229, 110,
14, 61, 166, 156, 227, 84, 57, 231, 92, 31, 161, 1, 209, 178, 142, 73,
129, 145, 3, 201, 98, 23, 177, 56, 25, 188, 127, 30, 202, 9, 219, 169,
160, 28, 198, 163, 135, 165, 193, 197, 8, 123, 117, 207, 192, 93, 19, 82,
126, 46, 214, 53, 155, 189, 208, 235, 113, 213, 0, 13, 27, 153, 190, 52,
151, 100, 194, 86, 10, 206, 255, 245, 176, 35, 172, 146, 204, 205, 236, 111,
42, 140, 54, 122, 233, 70, 94, 141, 121, 195, 218, 37, 191, 221, 170, 157,
239, 241, 179, 182, 228, 249, 230, 168, 89, 174, 234, 79, 107, 237, 238, 65,
85, 223, 242, 243, 222, 48, 116, 47, 62, 246, 199, 76, 32, 115, 144, 217
};
static Vector2d grad_tab[TABLE_SIZE]= {
{ -0.340904, 0.940098}, { -0.933457, -0.358689}, { -0.776360, -0.630290},
{ 0.925639, -0.378408}, { 0.084779, -0.996400}, { 0.127247, -0.991871},
{ -0.527260, 0.849704}, { -0.468794, -0.883308}, { 0.454024, 0.890989},
{ 0.971369, 0.237577}, { -0.016268, 0.999868}, { 0.905447, 0.424459},
{ -0.083460, -0.996511}, { 0.333623, 0.942707}, { -0.378842, -0.925461},
{ -0.003822, 0.999993}, { -0.993272, -0.115804}, { 0.784827, -0.619715},
{ 0.999963, -0.008588}, { 0.067801, -0.997699}, { -0.431667, -0.902033},
{ 0.836585, -0.547838}, { 0.868525, -0.495645}, { -0.694388, 0.719601},
{ 0.955062, -0.296405}, { 0.966409, -0.257010}, { 0.785965, -0.618271},
{ 0.431877, -0.901932}, { 0.801459, -0.598050}, { -0.567396, -0.823445},
{ -0.401807, 0.915724}, { 0.150691, 0.988581}, { -0.284235, -0.958755},
{ -0.855926, 0.517098}, { -0.857330, -0.514767}, { 0.581591, 0.813482},
{ 0.026909, -0.999638}, { -0.997178, 0.075076}, { 0.168251, -0.985744},
{ -0.952632, 0.304125}, { 0.982900, -0.184139}, { 0.804087, -0.594511},
{ -0.774009, -0.633175}, { -0.869432, 0.494052}, { -0.568740, -0.822518},
{ -0.667502, 0.744608}, { -0.903558, -0.428467}, { 0.999705, -0.024288},
{ 0.857228, 0.514937}, { 0.779031, -0.626985}, { -0.254156, -0.967163},
{ 0.797137, 0.603798}, { 0.352136, 0.935949}, { 0.192778, -0.981242},
{ 0.908687, 0.417477}, { -0.976788, 0.214207}, { -0.947997, -0.318280},
{ 0.989617, -0.143730}, { -0.918658, -0.395053}, { 0.984556, -0.175068},
{ 0.828093, 0.560591}, { 0.796336, 0.604854}, { -0.402179, -0.915561},
{ -0.791991, 0.610532}, { -0.238364, 0.971176}, { 0.012233, 0.999925},
{ -0.992889, -0.119040}, { -0.391251, 0.920284}, { 0.500683, 0.865631},
{ -0.996647, -0.081818}, { 0.631211, 0.775611}, { 0.632632, 0.774453},
{ 0.994086, 0.108596}, { -0.349918, 0.936780}, { 0.528357, -0.849022},
{ 0.264896, -0.964277}, { 0.886484, 0.462760}, { -0.456045, 0.889957},
{ 0.948901, 0.315574}, { -0.762707, 0.646744}, { 0.975860, 0.218399},
{ 0.966273, 0.257521}, { -0.785780, -0.618506}, { -0.729822, 0.683638},
{ 0.409543, 0.912291}, { -0.815786, 0.578354}, { -0.754687, -0.656085},
{ -0.945713, 0.325003}, { -0.722036, -0.691855}, { 0.071182, -0.997463},
{ -0.622102, -0.782936}, { 0.126728, 0.991937}, { 0.841445, 0.540343},
{ -0.714751, 0.699379}, { 0.792850, -0.609417}, { 0.419202, -0.907893},
{ 0.975360, 0.220620}, { -0.924087, 0.382183}, { 0.605739, -0.795663},
{ -0.762163, 0.647385}, { -0.774114, 0.633046}, { 0.999734, 0.023045},
{ -0.921373, -0.388681}, { -0.665487, 0.746410}, { -0.589795, -0.807553},
{ -0.568207, 0.822886}, { 0.921615, 0.388105}, { -0.272729, -0.962091},
{ 0.675038, -0.737783}, { 0.313405, 0.949620}, { 0.741975, 0.670428},
{ -0.497474, -0.867479}, { -0.864656, 0.502364}, { 0.975093, 0.221797},
{ -0.989268, -0.146109}, { 0.980503, -0.196505}, { -0.798513, -0.601978},
{ 0.240607, -0.970623}, { -0.393014, 0.919533}, { 0.084637, -0.996412},
{ -0.467677, -0.883899}, { 0.062876, 0.998021}, { -0.903742, -0.428078},
{ 0.983263, -0.182191}, { 0.251135, 0.967952}, { -0.970324, 0.241807},
{ 0.126711, -0.991940}, { 0.274262, 0.961655}, { 0.997314, -0.073242},
{ -0.923689, 0.383144}, { 0.496499, -0.868037}, { -0.053434, -0.998571},
{ -0.933781, -0.357845}, { -0.851126, 0.524961}, { 0.853828, 0.520555},
{ 0.271485, -0.962443}, { 0.365644, -0.930755}, { 0.017294, -0.999850},
{ -0.850236, 0.526402}, { 0.679557, 0.733622}, { -0.245285, 0.969451},
{ 0.985317, -0.170734}, { 0.457752, -0.889080}, { 0.981181, 0.193092},
{ 0.298175, -0.954511}, { 0.824137, 0.566390}, { 0.218332, -0.975875},
{ -0.508714, -0.860935}, { 0.875234, -0.483699}, { 0.508538, -0.861039},
{ -0.207871, -0.978156}, { 0.424732, 0.905319}, { -0.383099, 0.923707},
{ 0.181913, -0.983315}, { 0.888078, 0.459693}, { -0.379999, -0.924987},
{ -0.028810, -0.999585}, { 0.196453, -0.980513}, { 0.029305, -0.999571},
{ 0.221861, -0.975078}, { 0.668131, -0.744044}, { 0.682511, -0.730875},
{ 0.058054, -0.998313}, { -0.085181, -0.996365}, { 0.225010, -0.974357},
{ 0.180953, -0.983492}, { -0.806028, -0.591877}, { 0.998739, 0.050204},
{ -0.989319, 0.145767}, { 0.172447, 0.985019}, { -0.935325, 0.353790},
{ -0.908229, 0.418473}, { 0.959731, 0.280919}, { 0.840561, 0.541718},
{ 0.991777, -0.127978}, { 0.682358, -0.731018}, { 0.574395, -0.818578},
{ -0.121657, -0.992572}, { -0.432900, -0.901442}, { -0.999856, 0.016945},
{ -0.550735, -0.834680}, { -0.978364, 0.206890}, { 0.943332, 0.331851},
{ 0.166796, 0.985991}, { 0.222451, 0.974944}, { 0.765695, 0.643204},
{ -0.449596, -0.893232}, { -0.984817, -0.173596}, { 0.290036, 0.957016},
{ -0.638124, 0.769934}, { 0.102617, 0.994721}, { -0.757623, -0.652692},
{ -0.983166, 0.182717}, { 0.977482, -0.211021}, { 0.739869, 0.672751},
{ -0.942317, 0.334721}, { -0.515641, 0.856805}, { 0.270002, 0.962860},
{ -0.598114, -0.801411}, { 0.313478, 0.949596}, { 0.229444, 0.973322},
{ -0.697821, -0.716272}, { 0.062743, -0.998030}, { -0.158614, 0.987341},
{ -0.529376, -0.848387}, { 0.191143, -0.981562}, { 0.601182, -0.799112},
{ 0.976461, 0.215694}, { -0.893194, -0.449672}, { -0.786058, 0.618153},
{ -0.999201, 0.039958}, { -0.991278, 0.131790}, { 0.475348, -0.879798},
{ 0.399412, -0.916772}, { 0.157454, -0.987526}, { 0.998391, 0.056713},
{ -0.942481, 0.334260}, { -0.041131, -0.999154}, { 0.501194, 0.865335},
{ -0.649762, -0.760137}, { 0.682994, 0.730424}, { 0.717300, 0.696765},
{ -0.362297, 0.932063}, { 0.980846, 0.194787}, { 0.037116, -0.999311},
{ -0.999897, -0.014356}, { -0.919892, -0.392171}, { -0.950399, 0.311032},
{ 0.683221, 0.730212}, { 0.702763, -0.711424}, { 0.945516, 0.325574},
{ -0.728458, -0.685091}, { -0.791297, 0.611433}, { -0.707706, 0.706507},
{ -0.342698, 0.939446}, { 0.585173, -0.810908}, { 0.637824, -0.770182},
{ 0.232521, 0.972591}, { 0.814065, 0.580774}, { -0.488897, -0.872342},
{ -0.486172, -0.873863}, { 0.219057, -0.975712}, { 0.876775, -0.480900},
{ 0.446701, -0.894683}, { 0.954116, 0.299437}, { -0.201992, 0.979387},
{ 0.613498, 0.789696}, { -0.062938, -0.998017}, { -0.711028, 0.703164},
{ -0.175823, 0.984422}, { 0.867027, 0.498261}, { 0.170418, -0.985372},
{ -0.993594, 0.113005}, { -0.999964, 0.008470}, { -0.236945, 0.971523},
{ 0.993534, 0.113539}
};
DBL
solid_noise (DBL x, DBL y)
{
Vector2d v;
int a, b, i, j, n;
int ha, hb;
DBL sum;
sum = 0.0;
x*= 5.; /* GAG operates on interval <0,1>,<0,1> so noise (x,y) would be */
y*= 5.; /* so uninteresting when unscaled :-) */
a = (int) floor (x);
b = (int) floor (y);
ha= (a % TABLE_SIZE) + TABLE_SIZE; /* to avoid negative values of a or b */
hb= (b % TABLE_SIZE) + TABLE_SIZE;
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++) {
n = perm_tab[(ha + i + perm_tab[(hb + j) % TABLE_SIZE]) % TABLE_SIZE];
v.x = x - a - i;
v.y = y - b - j;
sum += WEIGHT(v.x) * WEIGHT(v.y) * (grad_tab[n].x * v.x + grad_tab[n].y * v.y);
}
return sum;
}
/******************************
expression library initialisation
******************************/
void expr_init()
{
init_random();
}

View File

@ -1,100 +0,0 @@
#ifndef _EXPRESSIONS_H_
#define _EXPRESSIONS_H_
#ifdef DEBUG
# define DPRINT(S) { printf("Debug: %s\n",S); }
# define DMPRINT(S,I,J,K) { printf(S,I,J,K); }
#else
# define DPRINT(S)
# define DMPRINT(SI,J,K)
#endif
#define INFINITY 1e100
#define MAX_NUMBER_OF_PARAMETERS 10
#define MAX_TREE_DEPTH 20
#define MAX_STACK_ENTRIES 1000 /* max number of operators in one expression
I hope it is enough :-) */
typedef double DBL;
typedef struct expr_node_struct NODE;
typedef struct func_info_struct FUNC_INFO;
typedef void (func_type)(void);
typedef func_type (*expr_func[3]);
struct func_info_struct {
char *name;
char nofp; /* number of parameters, nofp < 0 -=> arbitrary number of parameters */
char nofd; /* number of data entries (doubles) - for vectors and doubles nofp==0 || nofd==0 */
char ret_type; /* type of return: 1,3,4, -1 (whatever) */
char *paramtypes;
expr_func *funcs;
expr_func last_func; /* this function is inserted to the stack as last... */
};
struct expr_node_struct {
FUNC_INFO *op;
DBL data[4]; /* float values - such as constants and vectors ((rgb) or (rgbt) vectors) */
NODE *offsprings[MAX_NUMBER_OF_PARAMETERS]; /* too lazy to mallocate.... */
int noo; /* number of offsprings in expression tree */
char tof; /* type of return,.. */
};
struct expr_compiled_struct {
func_type *funcs;
DBL *data;
NODE *nodes;
};
extern FUNC_INFO FuncInfo[];
extern int Number_of_Functions;
extern DBL x_val, y_val;
void eval_xy( DBL *, DBL, DBL);
void prepare_node( NODE *n);
NODE *node_copy(NODE *n);
void destroy_node( NODE *n);
void expr_fprint( FILE *, int, NODE *);
int expr_sprint(char *s, NODE *n);
/*
Some useful functions
*/
NODE *parse_prefix_expression(char **string);
DBL dblrand();
void init_random();
void expr_init();
DBL solid_noise (DBL, DBL);
DBL double_and (DBL p1, DBL p2);
DBL double_xor (DBL p1, DBL p2);
DBL double_or (DBL p1, DBL p2);
/* this pointers are necessary for computation */
extern NODE **n_top;
extern DBL *r_top, *g_top, *b_top,* alfa_top;
extern DBL *data_top;
/* wrapping functions - serve to project interval <-infty,infty> into <0..255> */
/* simple: real to color... */
extern unsigned char (*wrap_func)(DBL);
unsigned char wrap_func_cut(DBL);
unsigned char wrap_func_rep(DBL);
unsigned char wrap_func_pingpong(DBL);
#endif

View File

@ -1,150 +0,0 @@
PRINT < END
/*
WARNING: This file is generated automaticaly from expressions.tmpl
- all changes you made into this file will be distarded in next
recompilation!
*/
#include <stdio.h>
#include <math.h>
#include "expressions.h"
void ex_push_const(void);
void ex_push_vector3(void);
void ex_push_vector4(void);
void ex_push_color_noise(void);
void ex_push_color_noise_xy(void);
void warp_abs_push_xy();
void warp_rel_push_xy();
void pop_xy();
END
TABLE FuncInfo < END_TABLE
// N - arbitrary number of parameters, 1<= N <= MAX_NUMBER_OF_PARAMETERS
// or arbitrary (return|parameter) type
// R - return value, P?, P0...PN parameters, NOP - not yet implemented
// name nof[pd] altstring ret_types paramtypes func0 code
const 0 1 "" 1 - LAST( ex_push_const )
vector3 0 3 "" 3 - LAST( ex_push_vector3 )
vector4 0 4 "" 4 - LAST( ex_push_vector4 )
x 0 0 - 1 - RETURN{{ x_val }}
y 0 0 - 1 - RETURN{{ y_val }}
plus N 0 "+" N - INIT{{R=P0;}} BODY{{1..N-1, R+= P?; }}
minus 2 0 "-" N - RETURN{{ P0-P1 }}
mult N 0 "*" N - INIT{{R=P0;}} BODY{{1..N-1, R*= P?; }}
div 2 0 "/" N - RETURN{{ (P1!=0.0)?P0/P1:INFINITY }}
// mod 2 0 "%" N - RETURN{{ 0.0; /*HOW TO IMPLEMENT IT ?? */ }}
min N 0 - N - INIT{{R=P0;}} BODY{{1..N-1, if (R>P?) R=P?; }}
max N 0 - N - INIT{{R=P0;}} BODY{{1..N-1, if (R<P?) R=P?; }}
and N 0 "&" N - INIT{{R=P0;}} BODY{{1..N-1,R=double_and(R,P?);}}
or N 0 "|" N - INIT{{R=P0;}} BODY{{1..N-1,R=double_or (R,P?);}}
xor N 0 "^" N - INIT{{R=P0;}} BODY{{1..N-1,R=double_xor(R,P?);}}
// bw_noise_xy 0 0 "bw-noise-xy" 1 - RETURN{{ solid_noise(x_val,y_val) }}
bw_noise 2 0 "bw-noise" 1 11 RETURN{{ solid_noise( P0, P1) }}
// color_noise_xy 0 0 "color-noise-xy" 3 - LAST ( ex_push_color_noise_xy )
color_noise 2 0 "color-noise" 3 11 LAST ( ex_push_color_noise )
warp_abs 3 0 "warp-abs" N 11N PUSH2(warp_abs_push_xy) PUSH3(pop_xy)
warp_rel 3 0 "warp-rel" N 11N PUSH2(warp_rel_push_xy) PUSH3(pop_xy)
// boring functions :-)
floor 1 0 - N - RETURN{{ floor(P0) }}
abs 1 0 - N - RETURN{{ fabs(P0) }}
exp 1 0 - N - RETURN{{ exp(P0) }}
log 1 0 - N - RETURN{{ log(P0) }}
pow 2 0 - N - RETURN{{ pow(P0,P1) }}
sin 1 0 - N - RETURN{{ sin(P0) }}
cos 1 0 - N - RETURN{{ cos(P0) }}
atan 1 0 - N - RETURN{{ atan(P0) }}
END_TABLE
// flush all definition, tables etc to expr_pgen.c
FLUSH
// other functions...
PRINT < END
void ex_push_const(void)
{
r_top++; *r_top= *data_top; data_top++;
}
void ex_push_vector3(void)
{
r_top++; *r_top= *data_top; data_top++;
g_top++; *g_top= *data_top; data_top++;
b_top++; *b_top= *data_top; data_top++;
}
void ex_push_vector4(void)
{
r_top++; *r_top= *data_top; data_top++;
g_top++; *g_top= *data_top; data_top++;
b_top++; *b_top= *data_top; data_top++;
alfa_top++; *alfa_top= *data_top; data_top++;
}
void ex_push_color_noise(void)
{
r_top--; *r_top= solid_noise(r_top[0]+128.,r_top[1]+199.);
g_top--; *g_top= solid_noise(g_top[0]+232.,g_top[1]+ 74.);
b_top--; *b_top= solid_noise(b_top[0]+312.,b_top[1]+ 32.);
}
void ex_push_color_noise_xy(void)
{
r_top++; *r_top= solid_noise(x_val+128.,y_val+199.);
g_top++; *g_top= solid_noise(x_val+232.,y_val+ 74.);
b_top++; *b_top= solid_noise(x_val+312.,y_val+ 32.);
}
static DBL x_stack[MAX_TREE_DEPTH];
static DBL y_stack[MAX_TREE_DEPTH];
static DBL *xptr = x_stack,
*yptr = y_stack;
void warp_abs_push_xy()
{
*xptr= x_val; xptr++;
*yptr= y_val; yptr++;
x_val= *r_top; r_top--;
y_val= *r_top; r_top--;
}
void warp_rel_push_xy()
{
*xptr= x_val; xptr++;
*yptr= y_val; yptr++;
x_val+= *r_top; r_top--;
y_val+= *r_top; r_top--;
}
void pop_xy()
{
xptr--; yptr--;
x_val= *xptr; y_val= *yptr;
}
END
END_OF_FILE

View File

@ -1,728 +0,0 @@
#include <strings.h>
#include <stdio.h>
#include "gag.h"
#define LIB_DATA "lib_data"
typedef struct library_entry_struct LENTRY;
struct library_entry_struct {
NODE *expression;
GtkWidget *list_item;
GtkWidget *label;
char name [30];
LENTRY *Next;
};
static LENTRY *Library= NULL;
static LENTRY *CurrentLentry=NULL;
static ENTRY_DIALOG SaveWindow= {NULL, NULL, NULL};
static ENTRY_DIALOG RenameWindow= {NULL, NULL, NULL};
static int save_counter=1;
static struct {
GtkWidget *window;
GtkWidget *list;
GtkWidget *popup_menu;
GtkWidget *preview;
GtkWidget *progress;
INDIVIDUAL *ind;
} LibraryWin= {NULL, NULL, NULL, NULL, NULL, NULL};
void gag_destroy_window(GtkWidget *, gpointer);
void gag_cancel_button(GtkWidget *, gpointer);
void gag_hide_window(GtkWidget *widget, gpointer data);
void gag_add_lentry_2_list( LENTRY *n )
{
GtkWidget *label;
GtkWidget *list_item;
if (LibraryWin.window == NULL) return;
label= gtk_label_new(n->name);
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
list_item= gtk_list_item_new( );
gtk_container_add(GTK_CONTAINER(list_item),label);
gtk_container_add(GTK_CONTAINER(LibraryWin.list),
list_item);
gtk_object_set_data( GTK_OBJECT(list_item), LIB_DATA, n);
n->list_item= list_item;
n->label= label;
gtk_widget_show(label);
gtk_widget_show(list_item);
}
void SaveWindow_callback(GtkWidget *widget, gpointer data)
{
LENTRY **ptr= &Library, *n;
if (SaveWindow.ind->expression == NULL)
return;
if (GTK_WIDGET_VISIBLE( SaveWindow.dialog ))
gtk_widget_hide( SaveWindow.dialog);
n= (LENTRY *) malloc(sizeof(LENTRY));
n-> expression= node_copy( SaveWindow.ind->expression );
strncpy(n->name,GTK_ENTRY( SaveWindow.entry )->text, 29);
n-> Next= NULL;
while (*ptr != NULL) ptr= &( (*ptr)->Next );
*ptr= n;
gag_add_lentry_2_list( n );
}
void gag_show_save_dialog(GtkWidget *w, gpointer data)
{
if (SaveWindow.dialog == NULL)
gag_create_entry(&SaveWindow, "Enter name of expression",
GTK_SIGNAL_FUNC(SaveWindow_callback));
if (!(GTK_WIDGET_VISIBLE(SaveWindow.dialog)))
{
char buff[20];
sprintf(buff,"Noname%0d",save_counter++);
gtk_entry_set_text(GTK_ENTRY(SaveWindow.entry),buff);
SaveWindow.ind= ui.popup_individual;
gtk_widget_show(SaveWindow.dialog);
}
}
/******************************
Main Library window
******************************/
void gag_lib_Copy( GtkWidget *widget, gpointer data)
{
}
void gag_lib_Delete( GtkWidget *widget, gpointer data)
{
LENTRY **ptr= &Library, *n;
while (*ptr != NULL)
{
if (*ptr == CurrentLentry) break;
ptr= &( (*ptr)->Next );
}
if (ptr != NULL)
{
GList *tmp;
n= *ptr;
*ptr= n->Next;
tmp->data= n->list_item;
tmp->prev= tmp->next= NULL;
gtk_list_remove_items (GTK_LIST (LibraryWin.list),tmp);
gtk_widget_destroy(n->list_item);
free( n );
}
}
static void RenameWindow_callback( GtkWidget *widget, gpointer *data)
{
LENTRY *lptr;
if (GTK_WIDGET_VISIBLE( RenameWindow.dialog ))
gtk_widget_hide( RenameWindow.dialog);
lptr= (LENTRY *) (RenameWindow.ind);
strncpy(lptr->name, GTK_ENTRY( RenameWindow.entry )->text, 29);
gtk_label_set(GTK_LABEL(lptr->label), lptr->name);
gtk_widget_draw(lptr->label, NULL);
}
void gag_lib_Rename( GtkWidget *widget, gpointer data)
{
if (RenameWindow.dialog == NULL)
gag_create_entry(&RenameWindow, "Enter name of expression",
GTK_SIGNAL_FUNC(RenameWindow_callback));
if (!(GTK_WIDGET_VISIBLE(RenameWindow.dialog)))
{
gtk_entry_set_text(GTK_ENTRY(RenameWindow.entry),CurrentLentry->name);
RenameWindow.ind= (INDIVIDUAL *) CurrentLentry;
gtk_widget_show(RenameWindow.dialog);
}
}
void gag_lib_Evoke( GtkWidget *widget, gpointer data)
{
destroy_node(LibraryWin.ind->expression);
LibraryWin.ind->expression= node_copy( CurrentLentry->expression );
gag_repaint_ind( NULL, LibraryWin.ind, 0);
ui.repaint_preview = TRUE;
}
void gag_lib_render_pic( GtkWidget *widget, gpointer data)
{
INDIVIDUAL tmp, *tmpptr;
tmpptr= &tmp;
tmp.expression= CurrentLentry->expression;
gag_render_picture_ptr(NULL, &tmpptr);
}
static void gag_Create_FS(GtkWidget **window, char *label,
void *ok_cb)
{
*window = gtk_file_selection_new ("file selection dialog");
gtk_window_position (GTK_WINDOW (*window), GTK_WIN_POS_MOUSE);
gtk_signal_connect (GTK_OBJECT (*window), "destroy",
(GtkSignalFunc)gag_destroy_window,
window);
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (*window)->ok_button),
"clicked", (GtkSignalFunc ) ok_cb,
*window);
gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (*window)->ok_button),
"clicked", (GtkSignalFunc ) gag_hide_window,
*window);
gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (*window)->cancel_button),
"clicked", (GtkSignalFunc) gtk_widget_destroy,
GTK_OBJECT (*window));
}
static void gag_lib_load_cb(GtkWidget *widget, GtkWidget *fs)
{
DPRINT("Loading Library");
gag_load_library(
gtk_file_selection_get_filename(GTK_FILE_SELECTION (fs))
);
}
static void gag_lib_save_cb(GtkWidget *widget, GtkWidget *fs)
{
gag_save_library(
gtk_file_selection_get_filename(GTK_FILE_SELECTION (fs))
);
}
static void gag_lib_Load( GtkWidget *widget, gpointer data)
{
static GtkWidget *LoadWin= NULL;
if (LoadWin==NULL)
gag_Create_FS(&LoadWin, "Load Library", (void *)gag_lib_load_cb);
if (!(GTK_WIDGET_VISIBLE(LoadWin)))
gtk_widget_show(LoadWin);
}
void gag_lib_Save( GtkWidget *widget, gpointer data)
{
static GtkWidget *SaveWin= NULL;
if (SaveWin==NULL)
gag_Create_FS(&SaveWin, "Save Library as", (void *)gag_lib_save_cb);
if (!(GTK_WIDGET_VISIBLE(SaveWin)))
gtk_widget_show(SaveWin);
}
int gag_lib_popup (GtkWidget *widget, GdkEventButton *event,
gpointer user_data)
{
GtkWidget *event_widget;
GdkEventButton *bevent;
event_widget = gtk_get_event_widget ((GdkEvent*) event);
bevent= (GdkEventButton *)event;
switch (event->type)
{
case GDK_2BUTTON_PRESS:
switch (bevent->button)
{
case 1:
{
INDIVIDUAL i;
LENTRY *lptr;
lptr= gtk_object_get_data( GTK_OBJECT(event_widget),
LIB_DATA);
i.preview= LibraryWin.preview;
i.expression= lptr->expression;
gag_repaint_ind( LibraryWin.progress, &i,1);
break;
}
default:
break;
}
break;
case GDK_BUTTON_PRESS:
if (bevent->button==3)
{
CurrentLentry=
gtk_object_get_data( GTK_OBJECT(event_widget),
LIB_DATA);
gtk_menu_popup( GTK_MENU(LibraryWin.popup_menu),NULL, NULL,
NULL,NULL, 3, bevent->time);
}
break;
default:
break;
}
return FALSE;
}
void gag_library_show(GtkWidget *widget, gpointer data)
{
if (LibraryWin.popup_menu == NULL)
{
GtkMenu *menu;
GtkWidget *menuitem;
menu= GTK_MENU( gtk_menu_new () );
/* for now this seems needless
menuitem= gtk_menu_item_new_with_label("Copy");
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_lib_Copy, NULL);
gtk_menu_append(menu, menuitem);
gtk_widget_show( menuitem );
*/
menuitem= gtk_menu_item_new_with_label("Evoke");
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_lib_Evoke, NULL);
gtk_menu_append(menu, menuitem);
gtk_widget_show( menuitem );
if (gag_render_picture_ptr != NULL)
{
menuitem= gtk_menu_item_new_with_label("Render picture");
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_lib_render_pic,
NULL);
gtk_menu_append(menu, menuitem);
gtk_widget_show( menuitem );
}
menuitem= gtk_menu_item_new();
gtk_menu_append( menu, menuitem);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new_with_label("Rename");
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_lib_Rename, NULL);
gtk_menu_append(menu, menuitem);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new_with_label("Delete");
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_lib_Delete, NULL);
gtk_menu_append(menu, menuitem);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new();
gtk_menu_append( menu, menuitem);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new_with_label("Load from file");
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_lib_Load, NULL);
gtk_menu_append(menu, menuitem);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new_with_label("Save to file");
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_lib_Save, NULL);
gtk_menu_append(menu, menuitem);
gtk_widget_show( menuitem );
LibraryWin.popup_menu= GTK_WIDGET(menu);
}
if (LibraryWin.window == NULL)
{
GtkWidget *window;
GtkWidget *hbox, *vbox;
GtkWidget *list;
GtkWidget *preview;
GtkWidget *scwin;
GtkWidget *frame;
GtkWidget *button;
GtkWidget *progress;
LENTRY *lptr;
gtk_widget_push_visual( gtk_preview_get_visual ());
gtk_widget_push_colormap (gtk_preview_get_cmap());
window= gtk_window_new( GTK_WINDOW_TOPLEVEL );
gtk_signal_connect( GTK_OBJECT(window), "destroy",
(GtkSignalFunc) gag_destroy_window,
&(LibraryWin.window));
gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, TRUE);
gtk_window_set_title( GTK_WINDOW(window),"GAG Library");
LibraryWin.window= window;
hbox= gtk_hbox_new(FALSE, 10);
gtk_container_border_width( GTK_CONTAINER(hbox),10);
gtk_container_add(GTK_CONTAINER(window), hbox);
scwin= gtk_scrolled_window_new( NULL, NULL );
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scwin),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_widget_set_usize( scwin, 300, 150);
gtk_box_pack_start( GTK_BOX(hbox), scwin, TRUE, TRUE, TRUE);
LibraryWin.list= list= gtk_list_new();
gtk_list_set_selection_mode (GTK_LIST (list),
GTK_SELECTION_BROWSE);
gtk_container_add( GTK_CONTAINER(scwin), list);
gtk_signal_connect(GTK_OBJECT( list ), "button_press_event",
(GtkSignalFunc)gag_lib_popup, NULL);
gtk_widget_show( list );
gtk_widget_show(scwin);
vbox= gtk_vbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE,0);
frame= gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(frame),
GTK_SHADOW_IN);
gtk_box_pack_start( GTK_BOX(vbox), frame,
FALSE, FALSE, FALSE);
LibraryWin.preview= preview= gtk_preview_new( PREVIEW_MODE );
gtk_preview_size( GTK_PREVIEW(preview),
PREVIEW_WIDTH, PREVIEW_HEIGHT);
gtk_container_add( GTK_CONTAINER(frame), preview );
gtk_widget_show( preview );
gtk_widget_show( frame );
button= gtk_button_new_with_label("Close");
gtk_box_pack_end(GTK_BOX(vbox), button, FALSE, FALSE, 0);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc) gag_cancel_button,(gpointer)window);
gtk_widget_show(button);
progress= gtk_progress_bar_new();
gtk_widget_set_usize(progress, 80, 20);
gtk_box_pack_end(GTK_BOX(vbox), progress,
FALSE, FALSE, 0);
LibraryWin.progress=progress;
gtk_widget_show( progress );
gtk_widget_show( vbox );
for (lptr=Library; lptr != NULL; lptr= lptr->Next)
gag_add_lentry_2_list( lptr );
gtk_widget_show( hbox );
}
if (!(GTK_WIDGET_VISIBLE(LibraryWin.window)))
{
gtk_widget_show(LibraryWin.window);
}
LibraryWin.ind= ui.popup_individual;
}
/******************************
GAG LIB LOAD/SAVE functions
******************************/
void translate_name2esc(char *s, char *d)
{
while ( (*d=*s) != '\000')
{
if (*d == '\\'){ d++; *d='\\'; }
if (*d == '"') { *d='\\'; d++; *d='"'; }
d++;
s++;
}
}
void gag_save_library(char *file)
{
FILE *f;
LENTRY *lptr;
char buff[100];
lptr= Library;
f= fopen( file, "wt");
fprintf(f,";;; GAG Library file\n\n");
while (lptr != NULL)
{
translate_name2esc(lptr->name, buff);
fprintf(f, "(insert-to-library \"%s\" \n", buff);
expr_fprint(f, 2, lptr->expression);
fprintf(f, ") ;;; end of function\n\n");
lptr= lptr->Next;
}
fclose(f);
}
static void string_convert(char *line, char *pline, char *name)
{
int state=0; /* 0 - ok, 1 - inside string */
guchar prevchar=0;
while ((*pline= *line) != 0)
{
if ((state == 0)&&(*line==';'))
{ *pline = '\000'; return; }
pline++;
if ((state==0)&&(*line=='"'))
{ state=1; line++; continue; }
if ((state==1)&&(prevchar!='\\')&&(*line=='"'))
{ state=0; *name= '\000'; line++; continue; }
if (state==1)
{
switch (prevchar)
{
case '\\':
switch (*line)
{
case '"': case '\\':
*(name-1)= *line;
break;
default:
printf("Warning: Unknown prefix");
break;
}
prevchar='\000';
break;
default:
*name= *line; ++name; break;
}
}
prevchar= *line;
line++;
}
if (state!=0)
{
printf("Error: Unterminated string constant: %s\n",line);
}
}
static void readln(FILE *f, guchar *str, int max)
{
int z;
do {
if ((z= fgetc(f))==EOF) break;
if ((z == '\n') || (z=='\r') || (z=='\f') || (z=='\v'))
break;
else
*str= (guchar) z;
str++;
max--;
} while (max);
*str='\000';
}
void gag_load_library(char *file)
{
FILE *f;
char *buff, *s;
char line[500];
char smbuff[500];
char name[30], tmp[100];
int state=0; /* 0 - waiting, 1 - recieving */
int ll;
NODE *n;
LENTRY *v, **head;
DPRINT("Loading library...");
head= &Library;
while (*head != NULL) head= &((*head)->Next);
if ((f= fopen(file, "rt"))==NULL) return;
buff= malloc(200*1000); /* oh - we are lazy programmers !!!) */
while (! (feof(f)))
{
readln(f, (guchar *) line, 499);
string_convert(line, smbuff, tmp);
if (smbuff[0]=='\000') continue;
if (state == 0)
{
if (strncmp(smbuff,"(insert-to-library ",18 )==0)
{
strncpy(name, tmp, 30);
state=1;
s= buff;
memset(buff, ' ', 200*1000);
continue;
}
printf("Error: unexpected line %s\n", line);
continue;
}
else
{
if (strncmp(line, ") ;;; end of function",20)==0)
{
s= buff;
n= parse_prefix_expression(&s);
if (n==NULL) goto end_of_loading;
v= (LENTRY *) malloc(sizeof(LENTRY));
v->expression= n;
v->Next=NULL;
v->list_item=NULL;
strncpy(v->name, name, 30);
gag_add_lentry_2_list( v );
*head= v;
head= & (v->Next);
state=0;
continue;
}
*(s++)= ' ';
ll= strlen (smbuff);
strcpy(s, smbuff);
s+= ll;
}
} /* end of while */
if (state == 1)
{
printf("Error: corrupted library\n");
}
end_of_loading:
if (f!= NULL) fclose( f);
if (buff != NULL) free (buff);
}
/******************************
MISC FUNCTIONS
******************************/
void gag_hide_window(GtkWidget *widget, gpointer data)
{
GtkWidget *tmp;
tmp= (GtkWidget *) data;
if (GTK_WIDGET_VISIBLE(tmp))
gtk_widget_hide(tmp);
}
void gag_destroy_window(GtkWidget *widget, gpointer data)
{
GtkWidget **tmp;
tmp= (GtkWidget **) data;
*tmp= NULL;
}
void gag_cancel_button(GtkWidget *widget, gpointer data)
{
if (GTK_WIDGET_VISIBLE (GTK_WIDGET(data)))
gtk_widget_hide (GTK_WIDGET(data));
}
void gag_clear_entry(GtkWidget *widget, GtkEntry *entry)
{
gtk_entry_set_text(entry, "");
}
void gag_create_entry( ENTRY_DIALOG *ed, char *title, GtkSignalFunc OkFunc )
{
GtkWidget *dialog;
GtkWidget *button;
GtkWidget *entry;
GtkWidget *vb;
dialog= gtk_dialog_new();
ed->dialog= dialog;
gtk_signal_connect( GTK_OBJECT(dialog), "destroy",
(GtkSignalFunc)gag_destroy_window,
&(ed->dialog));
gtk_window_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
gtk_container_border_width (GTK_CONTAINER (dialog), 0);
gtk_window_set_title(GTK_WINDOW(dialog), title);
vb= gtk_vbox_new(TRUE, 0);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), vb,
TRUE, TRUE,0);
gtk_container_border_width( GTK_CONTAINER(vb), 10);
entry= gtk_entry_new();
gtk_widget_set_usize( entry, 400, 0);
gtk_box_pack_start( GTK_BOX(vb), entry, TRUE, TRUE,0);
ed->entry=entry;
gtk_widget_show(entry);
gtk_widget_show( vb );
button= gtk_button_new_with_label("OK");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->action_area),
button, TRUE, TRUE,0);
gtk_signal_connect( GTK_OBJECT(button), "clicked",
(GtkSignalFunc) OkFunc,
NULL);
gtk_widget_grab_default (button);
gtk_widget_show(button);
button= gtk_button_new_with_label("Clear");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->action_area),
button, TRUE, TRUE,0);
gtk_signal_connect( GTK_OBJECT(button), "clicked",
(GtkSignalFunc) gag_clear_entry,
entry);
gtk_widget_show(button);
button= gtk_button_new_with_label("Cancel");
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
gtk_signal_connect( GTK_OBJECT(button), "clicked",
(GtkSignalFunc) gag_cancel_button,
GTK_OBJECT(dialog));
gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->action_area),
button, TRUE, TRUE,0);
gtk_widget_show(button);
}

View File

@ -1,467 +0,0 @@
;;; GAG Library file
(insert-to-library "Flying Squares"
(warp-rel
(-
(x
)
#(0.44444681 0.97193527 0.42578522)
)
(*
(^
(min
(&
0.82485358
#(0.83224947 0.17422043 0.66233956)
)
(-
(x
)
0.25893793
)
0.12867575
)
(y
)
)
(y
)
(sin
(cos
#(0.90425647 0.96978710 0.21997462 0.07494104)
)
)
#(0.20500772 0.32187832 0.43460514)
)
(|
(min
(log
(exp
(pow
(y
)
0.35515568
)
)
)
0.58370369
(sin
(y
)
)
(warp-rel
(bw-noise
0.44122838
(max
#(0.89920081 0.49851355 0.78133999 0.95575322)
(pow
#(0.19685866 0.34161449 0.35425142 0.01396159)
(y
)
)
(&
#(0.04591276 0.32702764 0.15522286)
#(0.10592854 0.31207041 0.71185891 0.65909247)
)
(x
)
0.54248765
)
)
(warp-rel
#(0.06386282 0.31839952 0.90882038)
(y
)
(x
)
)
#(0.66559035 0.19648411 0.21890231)
)
(y
)
(x
)
#(0.84463173 0.83301204 0.64645189)
(/
(exp
#(0.31365789 0.05391180 0.84437414)
)
(y
)
)
)
(y
)
(*
(cos
(x
)
)
(x
)
)
(floor
#(0.59096615 0.75140411 0.21655562)
)
(floor
#(0.04418634 0.82761218 0.15276587)
)
(x
)
)
)
) ;;; end of function
(insert-to-library "Psychedelic 1"
(color-noise
(abs
(atan
(color-noise
(x
)
(y
)
)
)
)
(atan
(*
#(0.61295671 0.13271869 0.87335081)
(x
)
)
)
)
) ;;; end of function
(insert-to-library "Snakes"
(-
(cos
(x
)
)
(abs
(bw-noise
(x
)
(y
)
)
)
)
) ;;; end of function
(insert-to-library "Squares"
(bw-noise
(cos
(min
(y
)
(y
)
(*
(exp
#(0.05612199 0.24147436 0.50883352 0.75838913)
)
)
(*
(sin
(y
)
)
(^
(color-noise
0.50167595
(cos
#(0.81131558 0.37627794 0.60677281 0.77778070)
)
)
0.66017742
(warp-abs
(y
)
(|
(x
)
(x
)
)
(max
0.67116147
(*
#(0.48666294 0.00240638 0.61670145)
(y
)
)
)
)
(x
)
(x
)
)
)
0.54336364
(*
(max
(&
(y
)
0.48794530
(y
)
#(0.23774273 0.03705954 0.45263552)
(+
0.03986225
(x
)
)
(x
)
#(0.67116070 0.77291162 0.45693066 0.79867740)
)
(y
)
)
(pow
(y
)
(y
)
)
)
(abs
(^
(bw-noise
#(0.91504233 0.32937469 0.16329135)
(y
)
)
(y
)
)
)
)
)
(abs
0.26046528
)
)
) ;;; end of function
(insert-to-library "Surreal body"
(pow
(bw-noise
(sin
(x
)
)
(bw-noise
(max
(y
)
#(0.27959321 0.79388215 0.19771108 0.32369007)
(y
)
(x
)
(atan
(max
(y
)
(bw-noise
(x
)
(y
)
)
)
)
(^
(x
)
0.48846049
(sin
(y
)
)
)
(max
(atan
(x
)
)
0.08679507
(x
)
)
)
#(0.11996383 0.54226166 0.84077255)
)
)
(bw-noise
(y
)
0.86159264
)
)
) ;;; end of function
(insert-to-library "Tribute to Vladimir Boudnik"
(pow
(bw-noise
(sin
(exp
(*
(x
)
(y
)
#(0.32735516 0.55692500 0.08359696 0.29403341)
#(0.59566040 0.39755838 0.01307638 0.20336952)
#(0.48779099 0.42339531 0.76725483 0.80217598)
0.77643144
(x
)
0.99693062
(y
)
(y
)
)
)
)
(bw-noise
(max
(y
)
#(0.27959321 0.79388215 0.19771108 0.32369007)
(y
)
(x
)
(atan
(max
(y
)
(bw-noise
(x
)
(y
)
)
)
)
(^
(x
)
0.48846049
(sin
(y
)
)
)
(max
(atan
(x
)
)
0.08679507
(x
)
)
)
#(0.11996383 0.54226166 0.84077255)
)
)
(bw-noise
(y
)
0.86159264
)
)
) ;;; end of function
(insert-to-library "Red angel"
(exp
(abs
(-
(min
(y
)
(y
)
(sin
(exp
#(0.09342696 0.98347104 0.97030872)
)
)
(/
(^
(color-noise
0.90006986
#(0.16233873 0.15725501 0.42570787 0.19153153)
)
(warp-abs
(floor
(^
(y
)
0.92446975
)
)
(x
)
(x
)
)
(warp-abs
(y
)
0.50472484
(x
)
)
0.66017742
(x
)
)
(*
#(1.00000000 1000.00000000 1000.00000000)
(warp-abs
(floor
#(0.98139181 0.86394308 0.82495983 0.76227650)
)
(x
)
(x
)
)
)
)
(y
)
(y
)
(y
)
)
(color-noise
(color-noise
0.79742206
(bw-noise
(min
0.16741483
(x
)
)
#(0.32625521 0.38315917 0.12498968)
)
)
0.41713922
)
)
)
)
) ;;; end of function

View File

@ -1,346 +0,0 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gtk/gtk.h>
#include "libgimp/gimp.h"
#include <unistd.h>
#include "gag.h"
char *gag_library_file;
static GParam *gag_params;
static void query (void);
static void run (char *name, int nparams, GParam *param,
int *nreturn_vals, GParam **return_vals);
static void gag_job(void);
static void gag_render_picture(GtkWidget *, gpointer);
static void gag_render( GDrawable *drawable, char *expr);
void (*gag_render_picture_ptr)(GtkWidget *, gpointer)= gag_render_picture;
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN()
static void
query (void)
{
static GParamDef interface_args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" }
};
static GParamDef render_args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
{ PARAM_STRING, "expression", "Expression to render" },
};
static GParamDef *return_vals = NULL;
static gint i_nargs = sizeof (interface_args) / sizeof (interface_args[0]);
static gint r_nargs = sizeof (render_args) / sizeof (interface_args[0]);
static gint nreturn_vals = 0;
gimp_install_procedure ("plug_in_gag_interface",
"Creates nice patterns using genetic algorithm",
"Interactively evolve expressions using crossing and mutating of population of expressions."
"Then expressions are rendered into patterns.",
"Daniel Skarda",
"Daniel Skarda",
"1997",
"<Image>/Filters/Render/GAG",
"RGB*, GRAY*",
PROC_PLUG_IN,
i_nargs,
nreturn_vals,
interface_args,
return_vals);
gimp_install_procedure ("plug_in_gag_render",
"Renders GAG-expression",
"Renders GAG-expression",
"Daniel Skarda",
"Daniel Skarda",
"1997",
"<Image>/Filters/Render/GAG",
"RGB*, GRAY*",
PROC_PLUG_IN,
r_nargs,
nreturn_vals,
render_args,
return_vals);
}
static void
run (char *name, int nparams, GParam *param, int *nreturn_vals,
GParam **return_vals)
{
static GParam values[1];
GDrawable *drawable;
GRunModeType run_mode;
GStatusType status;
status = STATUS_SUCCESS;
run_mode = param[0].data.d_int32;
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
*nreturn_vals = 1;
*return_vals = values;
/* Get the specified drawable */
drawable = gimp_drawable_get (param[2].data.d_drawable);
gag_params= param;
/* See how we will run */
#ifdef GIMP_DEBUG
printf("GAG pid: attach %d\n", getpid());
getchar();
#endif
if (strcmp(name, "plug_in_gag_interface") == 0)
{
switch (run_mode) {
case RUN_INTERACTIVE:
/* Possibly retrieve data - for NOW NO DATA */
/* gimp_get_data("plug_in_gag", &snvals); */
/* Get information from the dialog */
gag_job ();
break;
case RUN_NONINTERACTIVE:
/* Make sure all the arguments are there! */
status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
/* Possibly retrieve data */
/* gimp_get_data("plug_in_solid_noise", &snvals); */
status = STATUS_CALLING_ERROR;
break;
default:
break;
}
}
else if (strcmp(name, "plug_in_gag_render")==0)
{
switch (run_mode) {
case RUN_INTERACTIVE:
status = STATUS_CALLING_ERROR;
break;
case RUN_NONINTERACTIVE:
if (nparams == 4)
{
gag_render(
gimp_drawable_get (param[2].data.d_drawable),
param[3].data.d_string
);
}
else status = STATUS_CALLING_ERROR;
break;
case RUN_WITH_LAST_VALS:
/* Possibly retrieve data */
/* gimp_get_data("plug_in_solid_noise", &snvals); */
status = STATUS_CALLING_ERROR;
break;
default:
break;
}
}
values[0].data.d_status = status;
gimp_drawable_detach(drawable);
}
static void gag_render_picture(GtkWidget *widget, gpointer data)
{
char temp[20000]="0.0";
gint nreturn_vals;
INDIVIDUAL *iptr;
iptr= *((INDIVIDUAL **) data);
if (iptr->expression != NULL)
expr_sprint(temp, iptr->expression);
DPRINT("Launching new gag-plugin");
gimp_run_procedure("plug_in_gag_render",
&nreturn_vals,
PARAM_INT32, RUN_NONINTERACTIVE,
PARAM_IMAGE, gag_params[1].data.d_image,
PARAM_DRAWABLE, gag_params[2].data.d_int32,
PARAM_STRING, temp,
PARAM_END);
DPRINT("Launching was successful");
gimp_displays_flush ();
}
static void gag_job(void)
{
GParam *return_vals;
gint nreturn_vals;
gchar **argv;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("gag");
return_vals = gimp_run_procedure ("gimp_gimprc_query",
&nreturn_vals,
PARAM_STRING, "gag-library",
PARAM_END);
if (return_vals[0].data.d_status != STATUS_SUCCESS ||
return_vals[1].data.d_string == NULL)
{
printf("No gag-library in gimprc: gag-library is set to /dev/null\n");
gag_library_file= "/dev/null";
}
else
gag_library_file = return_vals[1].data.d_string;
gag_load_library(gag_library_file);
expr_init();
gtk_init (&argc, &argv);
gag_create_ui();
gtk_main();
g_free( argv[0] );
g_free( argv );
gimp_destroy_params (return_vals, nreturn_vals);
}
static void gag_render( GDrawable *drawable, char *expr)
{
GPixelRgn dest_rgn;
guchar *dest_row;
guchar *dest;
gint row, col;
gint progress, max_progress;
gint x1, y1, x2, y2, x, y;
gpointer pr;
DBL result[4];
DBL fy, fdy, fx, fdx;
int imtype;
NODE *n;
n= parse_prefix_expression(&expr);
if (n == NULL) return;
prepare_node( n );
gimp_progress_init ("GAG Rendering...");
gimp_drawable_mask_bounds (drawable->id, &x1, &y1, &x2, &y2);
gimp_pixel_rgn_init (&dest_rgn, drawable, x1, y1, (x2 - x1), (y2 - y1), TRUE, TRUE);
progress = 0;
max_progress = (x2 - x1) * (y2 - y1);
/* Get the foreground and background colors */
fdy= 2.0 / ((DBL) drawable->height);
fdx= 2.0 / ((DBL) drawable->width);
imtype= gimp_drawable_type( drawable->id);
for (pr = gimp_pixel_rgns_register (1, &dest_rgn); pr != NULL; pr = gimp_pixel_rgns_process (pr))
{
y = dest_rgn.y;
dest_row = dest_rgn.data;
fy= drawable->height;
fy= (- 2.0 * (DBL)y + fy) / fy;
for ( row = 0; row < dest_rgn.h; row++, y++, fy-= fdy)
{
dest = dest_row;
x = dest_rgn.x;
fx= drawable->width;
fx= (2.0 * (DBL) x - fx) / fx;
for (col = 0; col < dest_rgn.w; col++, x++, fx+=fdx)
{
eval_xy(result,fx,fy);
if (imtype < GRAY_IMAGE)
{ /* RGB* images */
DBL *p= result;
*dest= wrap_func(*p); dest++; p++;
*dest= wrap_func(*p); dest++; p++;
*dest= wrap_func(*p); dest++;
if (imtype==RGBA_IMAGE)
{
p++;
*dest= 255; dest++;
}
}
else
{ /* GRAY* images */
*dest= wrap_func(result[0]) * 0.299 + wrap_func(result[1]) * 0.587 + wrap_func(result[2]) * 0.114;
dest++;
if (imtype==GRAYA_IMAGE)
{
*dest= 255; dest++;
}
}
}
dest_row += dest_rgn.rowstride;
}
progress += dest_rgn.w * dest_rgn.h;
gimp_progress_update ((double) progress / (double) max_progress);
}
destroy_node( n );
gimp_drawable_flush (drawable);
gimp_drawable_merge_shadow (drawable->id, TRUE);
gimp_drawable_update (drawable->id, x1, y1, (x2 - x1), (y2 - y1));
}

View File

@ -1,21 +0,0 @@
#include <gtk/gtk.h>
#include "gag.h"
char *gag_library_file= "./gag-library";
void (*gag_render_picture_ptr)(GtkWidget *, gpointer)= NULL;
int main (int argc, char *argv[])
{
gtk_init (&argc, &argv);
expr_init();
gag_load_library(gag_library_file);
gag_create_ui();
gtk_main ();
return 0;
}

View File

@ -1,703 +0,0 @@
#include <gtk/gtk.h>
#include <strings.h>
#include "gas.h"
#include "gag.h"
#define MAX_ROW 3
#define MAX_COL 3
#define MAX_I MAX_ROW*MAX_COL
/*
these are temporary constants - once it will be possible
to specify size of preview widget :-)
*/
#define CLOSEUP_WIDTH PREVIEW_WIDTH * MAX_COL
#define CLOSEUP_HEIGHT PREVIEW_HEIGHT * MAX_ROW
#define CLOSEUP_UPDATE (gint) (CLOSEUP_HEIGHT / 100)
#define REPAINT_PREVIEW 0
#define REPAINT_CLOSEUP 1
#define REPAINT_SCANLINE 0
#define REPAINT_MOSAIC 1
#define REPAINT_ADAPTIVE_MOSAIC 2
INDIVIDUAL population[MAX_I];
ENTRY_DIALOG entry_data = { NULL, NULL, NULL };
GAG_UI ui = { NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, REPAINT_PREVIEW, REPAINT_SCANLINE, FALSE };
int gag_mosaic_sequence[]= {16,8,4,1,0};
/* options */
int gag_mate_one_to_one=0;
int gag_do_mating=1;
int gag_do_mutating=1;
void gag_destroy(GtkWidget *, gpointer *);
void gag_mate(GtkWidget *widget, gpointer *data);
void gag_reset_scales(GtkWidget *widget, gpointer *data);
void gag_random(GtkWidget *widget, gpointer *data);
void gag_draw_picture(GtkWidget *widget, gpointer *data);
void gag_magnify_picture(GtkWidget *widget, gpointer *data);
void gag_print(GtkWidget *widget, gpointer *data);
void gag_mutate(GtkWidget *widget, gpointer *data);
void gag_previews(GtkWidget *widget, gpointer *data);
void gag_toggle_mosaic(GtkWidget *widget, gpointer *data);
void gag_edit_by_hand_button(GtkWidget *widget, gpointer data);
void gag_edit_by_hand(GtkWidget *widget, gpointer data);
/*
INITIALISATION
*/
void gag_create_menu (void)
{
GtkWidget *menu;
GtkWidget *menuitem;
menu = gtk_menu_new ();
menuitem= gtk_menu_item_new_with_label("Random");
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_random, NULL);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new_with_label("Mutate");
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_mutate, NULL);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new();
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new_with_label("Print to stdout");
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_print, NULL);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new_with_label("Edit by hand");
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_edit_by_hand, NULL);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new_with_label("Save to library");
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_show_save_dialog, NULL);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new_with_label("Load from library");
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_library_show, NULL);
gtk_widget_show( menuitem );
menuitem= gtk_menu_item_new();
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_widget_show( menuitem );
if (gag_render_picture_ptr != NULL)
{
menuitem= gtk_menu_item_new_with_label("Render picture");
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_render_picture_ptr,
&(ui.popup_individual));
gtk_widget_show( menuitem );
}
menuitem= gtk_menu_item_new_with_label("Magnify picture");
gtk_menu_append(GTK_MENU(menu), menuitem);
gtk_signal_connect( GTK_OBJECT(menuitem), "activate",
(GtkSignalFunc) gag_magnify_picture, NULL);
gtk_widget_show( menuitem );
ui.popup_menu= menu;
}
int gag_show_menu(GtkWidget *preview, GdkEvent *event)
{
switch (event->type)
{
case GDK_BUTTON_PRESS:
{
GdkEventButton *bevent;
bevent= (GdkEventButton *)event;
if (bevent->button==3)
{
ui.popup_individual= gtk_object_get_data(GTK_OBJECT(preview), "individual");
gtk_menu_popup( GTK_MENU(ui.popup_menu),NULL, NULL,
NULL,NULL, 3, bevent->time);
}
break;
}
default:
break;
}
return (FALSE);
}
void gag_create_ui(void)
{
GtkWidget *top_hbox;
GtkWidget *preview;
GtkObject *adjustment;
GtkWidget *scale;
GtkWidget *alignment;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *button;
GtkWidget *label;
GtkWidget *check;
int i,j;
gag_create_menu();
gtk_widget_push_visual( gtk_preview_get_visual ());
gtk_widget_push_colormap (gtk_preview_get_cmap());
ui.window= gtk_window_new( GTK_WINDOW_TOPLEVEL );
gtk_signal_connect (GTK_OBJECT (ui.window), "destroy",
GTK_SIGNAL_FUNC (gag_destroy), NULL);
gtk_window_set_policy(GTK_WINDOW(ui.window), FALSE, FALSE, TRUE);
gtk_window_set_title( GTK_WINDOW(ui.window), "GAG");
top_hbox = gtk_hbox_new(FALSE, 10);
gtk_container_add(GTK_CONTAINER (ui.window), top_hbox);
ui.notebook = gtk_notebook_new();
gtk_notebook_set_show_tabs( GTK_NOTEBOOK (ui.notebook), FALSE);
gtk_box_pack_start(GTK_BOX (top_hbox), ui.notebook, FALSE, FALSE, 0);
/* Previews page */
ui.previews_table = gtk_table_new( MAX_ROW*2, MAX_COL, FALSE );
label = gtk_label_new("Previews");
gtk_notebook_append_page(GTK_NOTEBOOK (ui.notebook), ui.previews_table, label);
gtk_container_border_width (GTK_CONTAINER (top_hbox), 10);
gtk_table_set_row_spacings (GTK_TABLE (ui.previews_table), 2);
gtk_table_set_col_spacings (GTK_TABLE (ui.previews_table), 2);
for (i=0; i < MAX_COL; i++)
for (j=0; j < MAX_ROW; j++)
{
frame= gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
gtk_table_attach( GTK_TABLE(ui.previews_table), frame,
j,j+1,
2*i, 2*i+1,
GTK_FILL, GTK_FILL,
0,0);
preview = gtk_preview_new( PREVIEW_MODE );
gtk_preview_size( GTK_PREVIEW(preview), PREVIEW_WIDTH, PREVIEW_HEIGHT );
gtk_widget_set_events( preview, GDK_BUTTON_PRESS_MASK);
gtk_signal_connect( GTK_OBJECT(preview), "event",
(GtkSignalFunc) gag_show_menu,NULL);
gtk_object_set_data( GTK_OBJECT(preview),"individual",
&(population[i*MAX_ROW+j]));
gtk_container_add(GTK_CONTAINER(frame),preview);
adjustment= gtk_adjustment_new(0.0, 0.0, 10.0,
0.1, 1.0, 1.0);
scale= gtk_hscale_new( GTK_ADJUSTMENT(adjustment));
gtk_scale_set_digits(GTK_SCALE(scale),2);
gtk_scale_set_draw_value(GTK_SCALE(scale), TRUE);
gtk_range_set_update_policy(GTK_RANGE(scale),
GTK_UPDATE_DELAYED);
gtk_table_attach( GTK_TABLE(ui.previews_table), scale,
j, j+1,
2*i+1, 2*i+2,
GTK_FILL, GTK_FILL,
0,0);
population[i*MAX_ROW+j].preview= preview;
population[i*MAX_ROW+j].adjustment= GTK_ADJUSTMENT(adjustment);
population[i*MAX_ROW+j].expression=NULL;
gtk_widget_show( preview );
gtk_widget_show( scale );
gtk_widget_show( frame );
}
/* Close Up Page */
alignment = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
gtk_widget_show( alignment );
label = gtk_label_new("Close Up");
gtk_notebook_append_page(GTK_NOTEBOOK (ui.notebook), alignment, label);
vbox = gtk_vbox_new(FALSE, 5);
gtk_widget_show( vbox );
gtk_container_add( GTK_CONTAINER (alignment), vbox);
alignment = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
gtk_widget_show( alignment );
gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
frame = gtk_frame_new(NULL);
gtk_frame_set_shadow_type(GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_widget_show( frame );
gtk_container_add( GTK_CONTAINER (alignment), frame);
ui.closeup_preview = gtk_preview_new( PREVIEW_MODE );
gtk_preview_size( GTK_PREVIEW (ui.closeup_preview),
CLOSEUP_WIDTH, CLOSEUP_HEIGHT);
gtk_widget_set_events( ui.closeup_preview, GDK_BUTTON_PRESS_MASK);
gtk_signal_connect( GTK_OBJECT(ui.closeup_preview), "event",
(GtkSignalFunc) gag_show_menu, NULL);
gtk_widget_show( ui.closeup_preview );
gtk_container_add( GTK_CONTAINER(frame), ui.closeup_preview);
alignment = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
gtk_widget_show( alignment );
gtk_box_pack_start(GTK_BOX(vbox), alignment, FALSE, FALSE, 0);
button = gtk_button_new_with_label("Finished");
gtk_signal_connect_object( GTK_OBJECT(button), "clicked",
(GtkSignalFunc) gag_previews, NULL);
gtk_widget_show( button );
gtk_container_add( GTK_CONTAINER(alignment), button);
/* Action buttons */
vbox= gtk_vbox_new(FALSE, 5);
gtk_box_pack_start(GTK_BOX(top_hbox), vbox, FALSE, FALSE, 0);
button= gtk_button_new_with_label("New generation");
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc) gag_mate,NULL);
gtk_widget_show(button);
button= gtk_button_new_with_label("Reset scales");
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc) gag_reset_scales,NULL);
gtk_widget_show(button);
button= gtk_button_new_with_label("Options");
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
gtk_widget_show(button);
button= gtk_button_new_with_label("Help");
gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
gtk_widget_show(button);
check = gtk_check_button_new_with_label("Mosaic");
gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
gtk_signal_connect_object(GTK_OBJECT(check), "toggled",
(GtkSignalFunc) gag_toggle_mosaic, NULL);
gtk_widget_show(check);
button= gtk_button_new_with_label("Close");
gtk_box_pack_end(GTK_BOX(vbox), button, FALSE, FALSE, 0);
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
(GtkSignalFunc) gag_destroy,NULL);
ui.progress_bar= gtk_progress_bar_new();
gtk_widget_set_usize(ui.progress_bar, 80, 20);
gtk_box_pack_end(GTK_BOX(vbox), ui.progress_bar,
FALSE, FALSE, 0);
gtk_widget_show( ui.progress_bar );
gtk_widget_show(button);
gtk_widget_show(vbox);
gtk_widget_show(ui.previews_table);
gtk_widget_show(ui.notebook);
gtk_widget_show(top_hbox);
gtk_widget_show(ui.window);
ui.preview_buffer = g_new(guchar, (CLOSEUP_WIDTH + 20)* PREVIEW_BPP);
/* I allocate space for another 20 pixels - because of mosaic preview...
(closeup width is not multiple of 16) */
}
/*
USEFULL Functions
*/
void gag_repaint_ind( GtkWidget *progress, INDIVIDUAL *i, int local)
{
NODE *n;
GtkWidget *preview;
guchar *buffer;
int xx,yy,pp;
DBL x,y,dx,dy;
int width, height, update;
DBL result[4];
int maxm, *mm;
guchar c[PREVIEW_BPP];
buffer = ui.preview_buffer;
width = PREVIEW_WIDTH;
height = PREVIEW_HEIGHT;
update = PREVIEW_UPDATE;
preview= i->preview;
if (!local)
if (ui.repaint_mode == REPAINT_CLOSEUP)
{
width = CLOSEUP_WIDTH;
height = CLOSEUP_HEIGHT;
update = CLOSEUP_UPDATE;
preview= ui.closeup_preview;
}
if (progress==NULL)
progress= ui.progress_bar;
if ((n= i->expression)== NULL)
{
memset(buffer,128,width*PREVIEW_BPP);
for (yy=0; yy < height; yy++)
gtk_preview_draw_row( GTK_PREVIEW(preview),
&(buffer[0 + 0]),0,yy,width);
return;
}
prepare_node( n );
if (ui.repaint_quality == 0) /* the best quality */
{
dx= 2.0 / (DBL) width;
dy= 2.0 / (DBL) height;
y= 1.0;
for ( yy=0; yy < height; yy++, y-=dy)
{
for (xx=0, x=-1.0; xx < width * PREVIEW_BPP; x+=dx)
{
eval_xy(result, x,y );
for (pp = 0; pp < PREVIEW_BPP; pp++)
{
buffer[xx++] = wrap_func(result[pp]);
}
}
gtk_preview_draw_row( GTK_PREVIEW(preview),
buffer, 0, yy, width);
if ((yy & update) == 0)
{
if ((yy & update * 10) == 0)
gtk_widget_draw( preview, NULL);
gtk_progress_bar_update(GTK_PROGRESS_BAR(progress),
(1.0-y)/2.0);
}
}
}
else if (ui.repaint_quality == 1)
{
/* mosaic preview */
gtk_progress_bar_update(GTK_PROGRESS_BAR(progress), 0.0);
maxm = MAX(width, height);
for ( mm = gag_mosaic_sequence; *mm > 0; mm++ )
{
dx = (DBL) (*mm) * (2.0 / (DBL) width);
dy = (DBL) (*mm) * (2.0 / (DBL) height);
y = 1.0;
for ( yy = 0; yy < height; y -= dy)
{
for (xx = 0, x = -1.0; xx < width * PREVIEW_BPP; x += dx)
{
eval_xy(result, x,y );
for (pp = 0; pp < PREVIEW_BPP; pp++)
c[pp] = wrap_func(result[pp]);
for (pp = 0; pp < PREVIEW_BPP * (*mm); pp++)
buffer[xx++] = c[pp % PREVIEW_BPP];
}
for (pp = 0; pp < (*mm); pp++)
gtk_preview_draw_row( GTK_PREVIEW(preview),
buffer, 0, yy++, width);
if ((yy & update) == 0)
{
if ((yy & update * 10) == 0)
gtk_widget_draw( preview, NULL);
gtk_progress_bar_update(GTK_PROGRESS_BAR(progress),
(1.0 - y) / 2.0);
}
}
}
gtk_widget_draw( preview, NULL);
}
else
{
printf("Error: not supported quality...\n");
}
gtk_widget_draw( preview, NULL);
gtk_progress_bar_update(GTK_PROGRESS_BAR(progress), 0.0);
}
/*
CALLBACKS
*/
void gag_destroy (GtkWidget *widget, gpointer *data)
{
DPRINT("Saving expression library...");
gag_save_library(gag_library_file);
gtk_main_quit ();
}
void gag_print(GtkWidget *widget, gpointer *data)
{
if (ui.popup_individual->expression != NULL)
expr_fprint( stdout, 0, ui.popup_individual->expression );
}
void gag_mutate(GtkWidget *widget, gpointer *data)
{
NODE *n;
if ((n= ui.popup_individual->expression)==NULL) return;
ui.popup_individual->expression= gas_mutate(n,n,1);
gag_repaint_ind( ui.progress_bar, ui.popup_individual, 0);
ui.repaint_preview = TRUE;
}
void gag_random(GtkWidget *widget, gpointer *data)
{
destroy_node( ui.popup_individual->expression );
init_random();
ui.popup_individual->expression= gas_random( 1, expression_max_depth );
/* expr_print( 0, ui.popup_individual->expression ); */
gag_repaint_ind( NULL, ui.popup_individual, 0);
ui.repaint_preview = TRUE;
}
int gag_choose_individual()
{
DBL m,p;
int i;
m= 0.0;
for (i=0; i < MAX_I; i++)
if (population[i].expression != NULL)
m+= population[i].adjustment->value;
if (m==0.0)
return -1;
p= m * dblrand();
m= 0.0;
for (i=0; i < MAX_I; i++)
{
if (population[i].expression != NULL)
m+= population[i].adjustment->value;
if (p < m)
break;
}
return i;
}
/******************************
M A T E
******************************/
void gag_mate(GtkWidget *widget, gpointer *data)
{
int i,j,k;
NODE *(n[MAX_I]), *tmp;
DBL w;
for (i=0; i < MAX_I; i++) n[i]=NULL;
if (gag_do_mating)
for (i=0; i < MAX_I; i++)
{
j= gag_choose_individual();
k= gag_choose_individual();
if (j < 0) break;
if (gag_mate_one_to_one)
w=0.5;
else
w= population[j].adjustment->value /
( population[j].adjustment->value +
population[k].adjustment->value);
DMPRINT("%d is child of daddy %d and mummy %d\n",i,j,k);
n[i]= gas_mate(w, population[j].expression,
population[k].expression);
}
for (i=0; i < MAX_I; i++)
{
if (n[i]!=NULL)
{
destroy_node( population[i].expression );
population[i].expression= n[i];
}
tmp= population[i].expression;
if ((tmp != NULL)&&(gag_do_mutating))
population[i].expression= gas_mutate( tmp,tmp,0);
}
for (i=0; i < MAX_I; i++)
gag_repaint_ind( NULL, &(population[i]), 0);
}
/******************************
Edit by hand
******************************/
void gag_edit_by_hand_button(GtkWidget *widget, gpointer data)
{
NODE *n;
char tmp[20000];
char *ptr;
if (GTK_WIDGET_VISIBLE (entry_data.dialog))
gtk_widget_hide (entry_data.dialog);
strcpy(tmp, GTK_ENTRY(entry_data.entry)->text);
ptr= tmp;
n= parse_prefix_expression(&ptr);
if (n!=NULL)
{
destroy_node(entry_data.ind->expression);
entry_data.ind->expression= n;
gag_repaint_ind(NULL, entry_data.ind, 0);
ui.repaint_preview = TRUE;
}
}
void gag_edit_by_hand(GtkWidget *widget, gpointer data)
{
if (entry_data.dialog==NULL)
gag_create_entry( &entry_data, "Enter expression",
GTK_SIGNAL_FUNC(gag_edit_by_hand_button));
if (!(GTK_WIDGET_VISIBLE(entry_data.dialog)))
{
char temp[20000]="(x)";
if (ui.popup_individual->expression != NULL)
expr_sprint(temp, ui.popup_individual->expression);
gtk_entry_set_text(GTK_ENTRY(entry_data.entry), temp);
entry_data.ind= ui.popup_individual;
gtk_widget_show(entry_data.dialog);
}
}
void gag_load_from_lib(GtkWidget *widget, gpointer *data)
{
printf("load: %d\n", ui.popup_individual - population);
}
void gag_magnify_picture(GtkWidget *widget, gpointer *data)
{
NODE *n;
printf("magnify: %d\n", ui.popup_individual - population);
if ((n = ui.popup_individual->expression) == NULL) return;
gtk_notebook_set_page( GTK_NOTEBOOK (ui.notebook), 1);
ui.repaint_mode = REPAINT_CLOSEUP;
ui.closeup_individual = ui.popup_individual;
gtk_object_set_data( GTK_OBJECT(ui.closeup_preview),
"individual", ui.closeup_individual);
gag_repaint_ind(ui.progress_bar, ui.closeup_individual, 0);
ui.repaint_preview = FALSE;
}
void gag_previews(GtkWidget *widget, gpointer *data)
{
gtk_notebook_set_page( GTK_NOTEBOOK (ui.notebook), 0);
ui.repaint_mode = REPAINT_PREVIEW;
if (ui.repaint_preview == TRUE)
{
gag_repaint_ind(NULL, ui.closeup_individual, 0);
ui.repaint_preview = FALSE;
}
}
void gag_reset_scales(GtkWidget *widget, gpointer *data)
{
int i;
for (i=0; i<MAX_I; i++)
{
population[i].adjustment->value= 0.0;
gtk_signal_emit_by_name(
GTK_OBJECT(population[i].adjustment), "value_changed");
}
}
void gag_toggle_mosaic(GtkWidget *widget, gpointer *data)
{
if (ui.repaint_quality == REPAINT_MOSAIC)
ui.repaint_quality = REPAINT_SCANLINE;
else ui.repaint_quality = REPAINT_MOSAIC;
}

View File

@ -1,78 +0,0 @@
#ifndef _GAG_H_
#define _GAG_H_
#include "expressions.h"
#include "gtk/gtk.h"
typedef struct individual_struct INDIVIDUAL;
#define PREVIEW_WIDTH 100
#define PREVIEW_HEIGHT 100
#define PREVIEW_UPDATE (gint) (PREVIEW_HEIGHT / 100)
/*
#define PREVIEW_BPP 1
#define PREVIEW_MODE GTK_PREVIEW_GRAYSCALE
*/
#define PREVIEW_BPP 3
#define PREVIEW_MODE GTK_PREVIEW_COLOR
struct individual_struct {
GtkAdjustment *adjustment;
GtkWidget *preview;
NODE *expression;
};
extern INDIVIDUAL *gag_popup_ind;
typedef struct entry_dialog_struct ENTRY_DIALOG;
struct entry_dialog_struct {
GtkWidget *dialog;
GtkWidget *entry;
INDIVIDUAL *ind;
};
typedef struct {
GtkWidget *window;
GtkWidget *notebook;
GtkWidget *previews_table;
GtkWidget *closeup_preview;
GtkWidget *popup_menu;
GtkWidget *progress_bar;
INDIVIDUAL *popup_individual;
INDIVIDUAL *closeup_individual;
guchar *preview_buffer;
gint repaint_mode;
gint repaint_quality;
gint repaint_preview;
} GAG_UI;
extern GAG_UI ui;
void gag_show_save_dialog(GtkWidget *, gpointer );
void gag_create_entry( ENTRY_DIALOG *, char *, GtkSignalFunc );
void gag_library_show(GtkWidget *, gpointer);
void gag_repaint_ind( GtkWidget *, INDIVIDUAL *, int);
void gag_load_library(char *);
void gag_save_library(char *);
/******************************
Common things for plug-in
and standalone program
******************************/
extern char *gag_library_file;
extern void (*gag_render_picture_ptr)(GtkWidget *, gpointer);
void gag_create_ui(void);
#endif

View File

@ -1,394 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "gas.h"
int expression_max_depth=10;
DBL gas_const_prob= 0.3;
DBL gas_mutate_prob= 0.2;
DBL (*gas_leaf_probability)(int depth)= gas_leaf_prob_desc;
DBL (*gas_operator_weights)(int index)= gas_operator_weight_const;
DBL (*random_number)()= dblrand;
DBL gas_operator_weight_const(int i)
{
return 1.0;
}
DBL gas_leaf_prob_const(int depth)
{
return (depth==expression_max_depth) ? 1.0 : gas_const_prob;
}
DBL gas_leaf_prob_desc(int depth)
{
return ((DBL) depth) / ((DBL) expression_max_depth);
}
NODE *gas_random( int depth, int maxdepth)
{
int i,j, leafonly=0;
DBL m,p;
NODE *node;
if ( dblrand() < gas_leaf_probability(depth)) leafonly=1;
if ( maxdepth <=0) leafonly= 1;
m=0.0;
for (i=0; i < Number_of_Functions; i++)
if ((leafonly != 1) || ( FuncInfo[i].nofp == 0))
m+= gas_operator_weights( i );
p= dblrand();
p*= m;
m= 0.0;
for (i=0; i < Number_of_Functions; i++)
{
if ((leafonly != 1) || (FuncInfo[i].nofp == 0))
m+= gas_operator_weights( i );
if (p < m)
break;
}
node= malloc( sizeof(NODE) );
node->op= &(FuncInfo[i]);
node->noo= FuncInfo[i].nofp;
if (node->noo == 0)
{
for (j=0; j<FuncInfo[i].nofd; j++)
node->data[j]= random_number();
}
else
{
if (node->noo == -1)
node->noo= 2 + (rand() % (MAX_NUMBER_OF_PARAMETERS - 1));
for (j=0; j < node->noo; j++)
(node->offsprings)[j]= gas_random( depth + 1, maxdepth - 1);
}
return node;
}
/*******************************
MUTATING
******************************/
NODE *gm_alter_vector (NODE *, NODE *, int);
NODE *gm_alter_op (NODE *, NODE *, int);
NODE *gm_alter_noo (NODE *, NODE *, int);
NODE *gm_random (NODE *, NODE *, int);
NODE *gm_insert (NODE *, NODE *, int);
NODE *gm_degenerate (NODE *, NODE *, int);
NODE *gm_copy (NODE *, NODE *, int);
NODE *gm_mix_params (NODE *, NODE *, int);
NODE *gm_no_mut (NODE *, NODE *, int);
int Number_of_MutFunc= 9;
gas_mutate_methods_struct MutFuncs[9] = {
{ gm_alter_vector, "Fixme: description", 3.0, -3},
{ gm_alter_op, "Fixme: description", 3.0, -1},
{ gm_alter_noo, "Fixme: description", 2.0, -4},
{ gm_mix_params, "Fixme: description", 1.0, -2},
{ gm_random, "Fixme: description", 0.4, -1},
{ gm_insert, "Fixme: description", 1.0, -1},
{ gm_degenerate, "Fixme: description", 1.0, -2},
{ gm_copy, "Fixme: description", /*0.5,*/ 0.0, -1},
{ gm_no_mut, "Fixme: description", 0.0, -1}
};
DBL gas_mfw_array( int i, NODE *n, int depth)
{
int t;
t= MutFuncs[i].noo;
if ((t==-3) && (n->op->nofd != 0)) return 0.0;
if ((t==-2) && (n->noo == 0)) return 0.0;
if ((t==-4) && (n->op->nofd!=-1)) return 0.0;
if ((t>= 0) && (n->noo != t)) return 0.0;
return MutFuncs[i].weight;
}
DBL gas_mfw_const( int i, NODE *n, int depth)
{
int t;
t= MutFuncs[i].noo;
if ((t==-3) && (n->op->nofd != 0)) return 0.0;
if ((t==-2) && (n->noo == 0)) return 0.0;
if ((t==-4) && (n->op->nofd!=-1)) return 0.0;
if ((t>= 0) && (n->noo != t)) return 0.0;
return 1.0;
}
DBL (*gas_get_mf_weight)( int, NODE *, int)= gas_mfw_array;
NODE *gas_mutate( NODE *root, NODE *n, int depth)
{
DBL m,p;
int i;
if (dblrand() < gas_mutate_prob)
{
m= 0.0;
for (i=0; i<Number_of_MutFunc; i++)
{
m+= gas_get_mf_weight( i, n, depth);
}
p= dblrand() * m;
m= 0.0;
for (i=0; i < Number_of_MutFunc; i++)
{
m+= gas_get_mf_weight( i,n,depth );
if (p < m) break;
}
return MutFuncs[i].func(root, n, depth);
}
else
return gm_no_mut(root, n, depth+1);
}
NODE *gm_alter_vector (NODE *root, NODE *n, int depth)
{
int i;
DPRINT("mutate - alter scalar or scalar");
for (i=0; i < n->op->nofd; i++)
n->data[i]= dblrand();
return n;
}
NODE *gm_alter_op (NODE *root, NODE *n, int depth)
{
FUNC_INFO *newfi, *oldfi;
int oo,nn,mm;
DPRINT("mutate - alter operator");
oldfi= n->op;
newfi= &(FuncInfo[ rand() % Number_of_Functions]);
n->op= newfi;
oo= n->noo;
nn= newfi->nofp;
if (nn==-1)
if (oo == 0)
nn= 2;
else
nn= oo;
n->noo=nn;
if (nn < oo)
{ /* destroy offsprings of no use */
mm= nn;
for ( ; nn < oo; nn++)
destroy_node( (n->offsprings)[nn]);
}
else
{ /* create new random ones... */
mm=oo;
for ( ; oo < nn; oo ++)
(n->offsprings)[oo]= gas_random(depth, 2);
}
/* and now mutate old ones ...*/
for( nn= 0; nn < mm; nn++)
(n->offsprings)[nn]= gas_mutate(root, (n->offsprings)[nn],
depth+1);
/* generate necessary random floats... */
oo= oldfi->nofd;
nn= newfi->nofd;
for ( ; oo < nn; oo++)
(n->data)[oo]= dblrand();
return n;
}
NODE *gm_alter_noo (NODE *root, NODE *n, int depth)
{
int oo,nn,mm;
DPRINT("mutate - alter number of parameters");
if (n->op->nofp != -1)
{
for( nn= 0; nn < n->noo; nn++)
(n->offsprings)[nn]= gas_mutate(root, (n->offsprings)[nn],
depth+1);
}
oo= n->noo;
nn= 2 + (rand() % (MAX_NUMBER_OF_PARAMETERS - 1));
n->noo=nn;
if (nn < oo)
{ /* destroy offsprings of no use */
mm= nn;
for ( ; nn < oo; nn++)
destroy_node( (n->offsprings)[nn]);
}
else
{ /* create new random ones... */
mm=oo;
for ( ; oo < nn; oo ++)
(n->offsprings)[oo]= gas_random(depth,2);
}
/* and now mutate old ones ...*/
for( nn= 0; nn < mm; nn++)
(n->offsprings)[nn]= gas_mutate(root, (n->offsprings)[nn],
depth+1);
return n;
}
NODE *gm_random (NODE *root, NODE *n, int depth)
{
DPRINT("mutate - random");
destroy_node( n );
return gas_random(depth,2);
}
NODE *gm_insert (NODE *root, NODE *n, int depth)
{
NODE *nnode;
int j;
DPRINT("mutate - insert");
nnode= gas_random(depth,2); /*generate random operand */
if (nnode->noo == 0)
{
destroy_node(nnode);
for (j=0; j < n->noo; j++)
(n->offsprings)[j]=gas_mutate(root,(n->offsprings)[j],depth+1);
return n;
}
j= rand() % (nnode->noo);
destroy_node((nnode->offsprings)[j]);
(nnode->offsprings)[j]= n;
for (j=0; j < n->noo; j++)
(n->offsprings)[j]= gas_mutate( root, (n->offsprings)[j], depth+2 );
return nnode;
}
NODE *gm_degenerate (NODE *root, NODE *n, int depth)
{
int i,j;
NODE *nn;
if (n->noo==0) return n;
DPRINT("mutate - degenerate");
j= rand() % (n->noo);
for (i=0; i < n->noo; i++)
if (i!=j)
destroy_node( (n-> offsprings)[i] );
else
nn= gas_mutate(root, (n->offsprings) [i], depth);
free( n );
return nn;
}
NODE *gm_mix_params (NODE *root, NODE *n, int depth)
{
NODE *tmp;
int k,i,j;
DPRINT("mutate - mix");
if (n->noo < 2)
{
for (k=0; k < n->noo; k++)
(n->offsprings)[k]= gas_mutate(root, n->offsprings[k], depth+1);
return n;
}
for( k= (rand() % (n->noo)); k; k--)
{
i= rand() % (n->noo);
j= rand() % (n->noo);
if (i==j) i= (i+1) % (n->noo);
tmp= (n->offsprings)[i];
(n->offsprings)[i]= (n->offsprings)[j];
(n->offsprings)[j]= tmp;
}
for (k=0; k < n->noo; k++)
(n->offsprings)[k]= gas_mutate(root, n->offsprings[k], depth+1);
return n;
}
NODE *gm_copy (NODE *root, NODE *n, int depth)
{
DPRINT("mutate - copy");
printf ("Attention - not yet implemented...\n");
return n;
}
NODE *gm_no_mut (NODE *root, NODE *n, int depth)
{
int i;
for (i=0; i < n->noo; i++)
(n->offsprings)[i]= gas_mutate(root, n->offsprings[i], depth+1);
return n;
}
/******************************
MATING
disclaimer: please read following lines of code only if you are over
18 years of age and you are not offensed by C source code
******************************/
NODE *gas_mate(DBL w, NODE *n1, NODE *n2)
{
NODE *nn;
int i,j;
nn= (NODE *) malloc(sizeof(NODE));
if (dblrand() < w)
*nn= *n1;
else
*nn= *n2;
for (i= 0; i < nn->noo; i++)
{
if ((i < n1->noo) && (i < n2->noo))
(nn->offsprings)[i]=
gas_mate(w, (n1->offsprings)[i],(n2->offsprings)[i]);
if ( i >= n1->noo)
(nn->offsprings)[i]= node_copy( (n2->offsprings)[i] );
if ( i >= n2->noo)
(nn->offsprings)[i]= node_copy( (n1->offsprings)[i] );
}
j= n1->op->nofd;
if (j > (n2->op->nofd)) j= n2->op->nofd;
for ( i=0; i<j; i++)
(nn->data)[i]=((n1->data)[i]+(n2->data)[i])/2.0;
return nn;
}

View File

@ -1,51 +0,0 @@
#ifndef _GAS_H_
#define _GAS_H_
#include "expressions.h"
extern int expression_max_depth;
extern DBL gas_const_prob;
extern DBL (*gas_leaf_probability)(int depth); /* determines if end expression now or not */
extern DBL (*gas_operator_weight)(int index); /* weight of operator */
extern DBL (*random_number)();
DBL gas_leaf_prob_const(int);
DBL gas_leaf_prob_desc(int);
DBL gas_operator_weight_const(int);
NODE *gas_random(int, int);
NODE *gas_mate(DBL, NODE *, NODE *);
/*
functions & variables for MUTATING
*/
extern DBL gas_mutate_prob;
typedef NODE *(*gas_mutate_func)(NODE *, NODE *, int );
typedef struct {
gas_mutate_func func;
char *desc;
DBL weight;
char noo; /* how many arguments must have such node to aply this mutate function ? */
} gas_mutate_methods_struct; /* -1 .. arbitrary,
-2 - greater than zero (ie non constant),
-3 nofd != 0
-4 op->nofp == -1
*/
NODE *gas_mutate( NODE *, NODE *, int );
extern int Number_of_MutFunc;
extern gas_mutate_methods_struct MutFuncs[];
DBL gas_mfw_array( int, NODE *, int );
DBL gas_mfw_const( int, NODE *, int );
extern DBL (*gas_get_mf_weight)( int, NODE *, int);
#endif

View File

@ -1,253 +0,0 @@
$prefix= "ex_";
sub flush
{
print "$def_str\n\n\n$arr_str\n\nint Number_of_Functions=$table_num;\n\
FUNC_INFO $table_name\[$table_num\] = {\n$table_str\n};\n\n\n$decl_str\n";
}
sub begin_table
{
$ft= 0;
$table_num=0;
$table_name= $2;
$table_str= "";
$def_str= "";
$decl_str= "";
$arr_str= "";
}
sub parse_ptypes
{
my ($s,$name)= @_;
my ($c)= 0;
my ($tmp);
$name= $prefix . $name . "_ptypes";
$tmp= "static char $name\[\]= {";
while ($s ne "")
{
if ($c == 0) { $c=1; }
else { $tmp .= ", "; }
$s =~ /([134N])(.*)/;
if ($1 eq "N") { $tmp .= "-1"; }
else { $tmp .= " $1"; }
$s= $2;
}
$arr_str.= $tmp."};\n";
return $name;
}
sub subst_var
{
my ($tmp, $var) = @_;
$tmp =~ s/P\?/*ptr/g;
$tmp =~ s/R/ret/g;
$tmp =~ s/P(\d+)/$var\[$1\]/g;
$tmp;
}
sub parse_pushes # (name, code)
{
my ($name,$s)= @_;
my $l=0;
my %policko;
my $i;
my $tmp= "static expr_func $prefix${name}_funcs\[\]={\n";
while ($s ne "")
{
if ( ! ($s =~ /\s*PUSH(\d)\s*\(\s*(\w+)\s*\)\s*(.*)/) )
{
print STDERR "Wrong push code! :", $_;
return "NULL";
}
$s= $3;
$l= $1 if ($1 >= $l);
$policko[$1]= $2;
}
for ($i=0; $i <= $l; $i++)
{
$tmp .= ",\n" if ($i != 0) ;
$policko[$i]= "NULL" if ( $policko[$i] eq "" );
$tmp.= " {" . $policko[$i] . ", " . $policko[$i] . ", " . $policko[$i] . "}";
}
$tmp .= "\n};\n\n";
$arr_str .= $tmp;
sprintf "$prefix%s_funcs", $name;
}
sub create_function # (name, nofp, init, body, return )
{
my $tmp= "";
my ($name, $nofp, $init, $body, $return)= @_;
my $c, $i;
@top_names= ("r_top", "g_top", "b_top", "alfa_top");
my $tn;
foreach $c (1,3,4)
{
$def_str .= "static void $prefix$name$c(void);\n";
$tmp .= "static void $prefix$name$c(void)\n{";
if (( $init ne "") || ($body ne ""))
{ $tmp .= "\n register DBL ret;"; }
if ( $body ne "")
{ $tmp .= "\n register int i;\n register DBL *ptr;"; }
if ( $nofp eq "-1")
{ $tmp .= "\n register int num;\n\n num=(*n_top)->noo - 1;"; }
$tmp .= "\n";
for ($i=0; $i < $c; $i++)
{
$tn= $top_names[$i];
$tmp .= "\n";
if ($nofp eq "-1") { $tmp .= " $tn -= num;\n"; }
elsif ($nofp ne "1") { $tmp .= " $tn -= $nofp - 1;\n"; }
if (($init eq "") && ($body eq ""))
{
$tmp .= " *$tn= ".subst_var($return,$tn).";\n";
next;
}
if ($init ne "")
{ $tmp .= " ".subst_var($init,$tn)."\n" }
if ($body ne "")
{ $tmp .= " for (i= num, ptr= ($tn+1); i; i--, ptr++)\n {\n ".subst_var($body,"")."\n }\n"; }
if ($return eq "") { $tmp .= " *$tn= ret;\n"; }
else { $tmp .= " *$tn= ".subst_var($return,$tn).";\n"; }
}
$tmp .= "}\n\n";
}
$decl_str .= $tmp;
return sprintf "{$prefix%s1, $prefix%s3, $prefix%s4}",$name, $name, $name;
}
$pt_w= "Warning, bad table line: ";
sub parse_table
{
# name nofp nofd altstr rettype paramtype code
if ( ! /^\s*(\w+)\s+(N|\d)\s+(\d)\s+(\S+)\s+([-134N])\s+(-|[134N]+)\s+(.*)$/ )
{ print STDERR $pt_w, $_; return; }
my ($name,$nofp,$nofd,$altstr,$rettype,$paramtype,$code)= ($1,$2,$3,$4,$5,$6,$7);
my $nstr= $name;
my $fptrs= "NULL";
my $lastfunc= "{NULL, NULL, NULL}";
my $funcs= "NULL";
my $c=0;
if ($altstr =~ /"(.+)"/) { $nstr=$1; }
if ($nofp eq "N") { $nofp= "-1"; }
if ($rettype eq "N") { $rettype= "-1" }
if ($paramtype eq "-") { $paramtype= "NULL"; }
else { $paramtype= parse_ptypes($paramtype, $name); }
if ($code =~ /(INIT|BODY|RETURN)/ )
{
$f2= $prefix.$name;
my ($init, $fc, $body, $final) = ("","","","");;
$c++;
if ( $code =~ /^\s*INIT\{\{\s*(.*?)\s*\}\}(.*)$/ )
{ $init= $1; $code= $2; }
if ( $code =~ /^\s*BODY\{\{\s*(.*?)\s*,\s*(.*?)\s*\}\}(.*)$/ )
{
$body= $2; $fc= $1; $code= $3;
if ( $fc ne "1..N-1") {
print STDERR "Function body: not yet implemented:",$_;
return;
}
}
if ( $code =~ /^\s*RETURN\{\{(.*?)\}\}\s*(.*)$/ )
{ $final= $1; $code= $2; }
if ($code ne "") { print "Warning: wrong code:",$_; return }
$lastfunc= create_function( $name,$nofp,$init, $body, $final );
}
elsif ($code =~ /\s*LAST\s*\(\s*(\w+)\s*\)\s*/ )
{
$lastfunc= "{$1,$1,$1}";
}
else
{
$funcs= parse_pushes($name, $code);
}
$f1= $name if ($c==0);
if ($c > 1)
{ print STDERR "Warning - you have to specify exacly one function: ", $_; return; }
$table_str .= ",\n" if ($ft != 0);
$ft=1;
$table_str .= sprintf(" {\%16s\,\t%2d,\t$nofd,\t$rettype,\t$paramtype,\t$funcs,$lastfunc}", "\"$nstr\"", $nofp);
$table_num++;
}
##############################
######
##
#
open IN, $ARGV[0];
$operation= 0; # 0 - nothing, 1 - print, 2 - generate table
$END="";
while (<IN>)
{
study;
if ($operation) {
if ($END ne "")
{ if (/^\s*$END\s*$/) { $operation=0; next; }}
}
if ($operation==1) {print; next; }
if (/^\s*$/) { next; } # empty lines
if (/^\s*\/\/.*$/) { next; } # c-- like comments
if ($operation == 0)
{
if ( ! /^\s*(\w+)\s*(\w*)\s*(<|)\s*(\w*)\s*$/ )
{
print STDERR "Wrong format of line: ", $_;
next;
}
$command= $1;
$comarg= $2;
if ($3 ne "") {$END=$4; }
if ($command eq "PRINT") { $operation=1;}
if ($command eq "TABLE") { begin_table; $operation=2; }
if ($command eq "FLUSH") { flush; }
if ($command eq "END_OF_FILE") { break; }
next;
}
if ($operation == 2) { parse_table; }
}
if ($operation != 0) { print STDERR "Warning: Unexpected end of file\n"; }

View File

@ -1,61 +0,0 @@
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DBL double
#define TABLE_SIZE 256
typedef struct {
DBL x, y;
} Vector2d;
static int perm_tab[TABLE_SIZE];
static Vector2d grad_tab[TABLE_SIZE];
void main(void)
{
int i, j, k, t;
DBL m;
srand( time(NULL) );
for (i = 0; i < TABLE_SIZE; i++)
perm_tab[i] = i;
for (i = 0; i < TABLE_SIZE; i++) {
j = rand () % TABLE_SIZE;
k = rand () % TABLE_SIZE;
t = perm_tab[j];
perm_tab[j] = perm_tab[k];
perm_tab[k] = t;
}
printf("static int perm_tab[TABLE_SIZE]= {\n ");
for (i=0; i < TABLE_SIZE; i++)
{
if (i != 0) printf(",");
if ((i!= 0) && ((i & 15) == 0)) printf("\n ");
printf(" %3d", perm_tab[i]);
}
printf("\n};\n\n");
/* Initialize the gradient table */
printf("static Vector2d grad_tab[TABLE_SIZE]= {\n ");
for (i = 0; i < TABLE_SIZE; i++) {
do {
grad_tab[i].x = (double)(rand () - (RAND_MAX >> 1)) / (RAND_MAX >> 1);
grad_tab[i].y = (double)(rand () - (RAND_MAX >> 1)) / (RAND_MAX >> 1);
m = grad_tab[i].x * grad_tab[i].x + grad_tab[i].y * grad_tab[i].y;
} while (m == 0.0 || m > 1.0);
m = 1.0 / sqrt(m);
grad_tab[i].x *= m;
grad_tab[i].y *= m;
if (i != 0) printf(",");
if (i!= 0 && (i % 3 ==0)) printf("\n ");
printf(" {%10f, %10f}", grad_tab[i].x, grad_tab[i].y);
}
printf("\n};\n");
}

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
holes

View File

@ -1,39 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = holes
holes_SOURCES = \
holes.c
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
\
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
holes_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,904 +0,0 @@
/* The GIMP -- an image manipulation program * Copyright (C) 1995 Spencer
* Kimball and Peter Mattis * * This program is free software; you can
* redistribute it and/or modify * it under the terms of the GNU General
* Public License as published by * the Free Software Foundation; either
* version 2 of the License, or * (at your option) any later version. * *
* This program is distributed in the hope that it will be useful, * but
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU
* General Public License for more details. * * You should have received a
* copy of the GNU General Public License * along with this program; if not,
* write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA
* 02139, USA. */
/* Holes 0.5 */
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "libgimp/gimp.h"
#include "gtk/gtk.h"
/* Declare local functions. */
static void query(void);
static void run(char *name,
int nparams,
GParam * param,
int *nreturn_vals,
GParam ** return_vals);
static void doit(GDrawable * drawable);
/* UI funcs */
#define ENTRY_WIDTH 50
#define SCALE_WIDTH 150
static void UI_int_entryscale_new ( GtkTable *table, gint x, gint y,
guchar *caption, gint *intvar,
gint min, gint max, gint constraint);
static void UI_paired_entry_destroy_callback (GtkWidget *widget,
gpointer data);
static void UI_paired_int_scale_update (GtkAdjustment *adjustment,
gpointer data);
static void UI_paired_int_entry_update (GtkWidget *widget,
gpointer data);
static void UI_float_entryscale_new ( GtkTable *table, gint x, gint y,
guchar *caption, gfloat *var,
gfloat min, gfloat max, gint constraint);
static void UI_paired_float_scale_update (GtkAdjustment *adjustment,
gpointer data);
static void UI_paired_float_entry_update (GtkWidget *widget,
gpointer data);
static void UI_close_callback (GtkWidget *widget,
gpointer data);
static void UI_ok_callback (GtkWidget *widget,
gpointer data);
static gint dialog();
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
gint bytes;
gint sx1, sy1, sx2, sy2;
guchar *shape_data= NULL, *tmp= NULL;
gint curve[256];
typedef struct {
gint run;
} HolesInterface;
typedef struct {
GtkObject *adjustment;
GtkWidget *entry;
gint constraint;
} EntryScaleData;
static HolesInterface pint =
{
FALSE /* run */
};
typedef struct {
float density;
gint shape, size, flag;
} holes_parameters;
/* possible shapes */
#define SQUARE_SHAPE 0
#define CIRCLE_SHAPE 1
#define DIAMOND_SHAPE 2
static holes_parameters params = { -3.1, CIRCLE_SHAPE, 8, TRUE };
MAIN()
static void query()
{
static GParamDef args[] =
{
{PARAM_INT32, "run_mode", "Interactive, non-interactive"},
{PARAM_IMAGE, "image", "Input image (unused)"},
{PARAM_DRAWABLE, "drawable", "Input drawable"},
{PARAM_FLOAT, "density", "Density (actually the log of the density)"},
{PARAM_INT32, "shape", "shape (0= square, 1= round, 2= diamond)"},
{PARAM_INT32, "size", "size (in pixels)"},
{PARAM_INT32, "flag", "Clear it if you want to make holes in your image, or set it if you want to keep the painted (I mean opaque) regions."},
};
static GParamDef *return_vals = NULL;
static int nargs = sizeof(args) / sizeof(args[0]);
static int nreturn_vals = 0;
gimp_install_procedure("plug_in_holes",
"make bucks on a image.",
"makes holes in the alpha channel of an image, with a density depending on the actual transparency of this image. (so the image must have an alpha channel...)",
"Xavier Bouchoux",
"Xavier Bouchoux",
"1997",
"<Image>/Image/Alpha/Holes",
"RGBA, GRAYA, INDEXEDA",
PROC_PLUG_IN,
nargs, nreturn_vals,
args, return_vals
);
}
static void run(char *name, int n_params, GParam * param, int *nreturn_vals,
GParam ** return_vals)
{
static GParam values[1];
GDrawable *drawable;
GRunModeType run_mode;
GStatusType status = STATUS_SUCCESS;
/* initialize */
drawable = NULL;
*nreturn_vals = 1;
*return_vals = values;
run_mode = param[0].data.d_int32;
if (run_mode == RUN_NONINTERACTIVE) {
if (n_params != 7) {
status = STATUS_CALLING_ERROR;
} else {
params.density = param[3].data.d_float;
params.shape = param[4].data.d_int32;
params.size = param[5].data.d_int32;
params.flag = param[6].data.d_int32;
}
} else {
/* Possibly retrieve data */
gimp_get_data("plug_in_holes", &params);
if ((run_mode == RUN_INTERACTIVE) ) {
/* Oh boy. We get to do a dialog box, because we can't really expect the
* user to set us up with the right values using gdb.
*/
if (!dialog()) {
/* The dialog was closed, or something similarly evil happened. */
status = STATUS_EXECUTION_ERROR;
}
}
}
if (status == STATUS_SUCCESS) {
/* Get the specified drawable */
drawable = gimp_drawable_get(param[2].data.d_drawable);
/* Make sure that the drawable is gray or RGB color */
if (gimp_drawable_has_alpha (drawable->id) && (gimp_drawable_color(drawable->id) || gimp_drawable_gray(drawable->id) ||gimp_drawable_indexed (drawable->id))) {
gimp_progress_init("holes");
gimp_tile_cache_ntiles(4);
srand(time(NULL));
doit(drawable);
if (run_mode != RUN_NONINTERACTIVE)
gimp_displays_flush();
if (run_mode == RUN_INTERACTIVE)
gimp_set_data("plug_in_holes", &params, sizeof(params));
} else {
status = STATUS_EXECUTION_ERROR;
}
}
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
gimp_drawable_detach(drawable);
}
static void make_curve (gdouble sigma)
{
gdouble sigma2;
gint i;
sigma2 = 2 * sigma * sigma;
if (params.flag)
for (i = 0; i < 256; i++)
{
curve[i] = (gint) (exp (- (i/22.0 * i/22.0) / sigma2) * RAND_MAX);
}
else
for (i = 0; i < 256; i++)
{
curve[255-i] = (gint) (exp (- (i/22.0 * i/22.0) / sigma2) * RAND_MAX);
}
}
/* Prepare the shape data: makes a buffer with the shape calculated with
* the goood size.
*/
static int prepare_shape()
{
int i,j, center;
shape_data = malloc(params.size*params.size);
if (shape_data == NULL)
return 0;
switch (params.shape) {
case SQUARE_SHAPE:
for (i=0;i<params.size; i++)
for (j=0; j<params.size; j++)
shape_data[i*params.size+j]=255;
break;
case CIRCLE_SHAPE:
center= params.size/2;
for (i=0;i<params.size; i++)
for (j=0; j<params.size; j++)
if (((i-center)*(i-center)+(j-center)*(j-center))<center*center)
shape_data[i*params.size+j]=255;
else
shape_data[i*params.size+j]=0;
break;
case DIAMOND_SHAPE:
center= params.size/2;
for (i=0; i<params.size; i++)
for (j=0; j<params.size; j++)
if ((abs(i-center)+abs(j-center))<center)
shape_data[i*params.size+j]=255;
else
shape_data[i*params.size+j]=0;
break;
default:
return 0;
}
return 1;
}
/*
* Puts the shape (=the buck) in the alpha layer of the destination image,
* at position x,y
*/
static void make_hole(GPixelRgn * region, int x, int y)
{
int j, k, startx=0, starty=0;
int rx1, rx2, ry1, ry2;
int new;
rx1 = x - params.size / 2;
rx2 = rx1 + params.size;
ry1 = y - params.size / 2;
ry2 = ry1 + params.size;
/* clipping */
if (rx1 < sx1) {
startx=sx1-rx1;
rx1= sx1;
}
if (ry1 < sy1) {
starty=sy1-ry1;
ry1= sy1;
}
rx2 = rx2 > sx2 ? sx2 : rx2;
ry2 = ry2 > sy2 ? sy2 : ry2;
gimp_pixel_rgn_get_rect(region, tmp, rx1, ry1, rx2 - rx1, ry2 - ry1);
for (k = 0; k < (ry2 - ry1); k++) {
for (j = 0; j < (rx2 - rx1); j++) {
new= tmp[((rx2-rx1)*k+j) * bytes + (bytes-1)]-
shape_data[params.size*(k+starty)+j+startx];
tmp[((rx2-rx1)*k+j) * bytes + (bytes-1)]= (new<=0? 0 : new);
}
}
gimp_pixel_rgn_set_rect(region, tmp, rx1, ry1, rx2 - rx1, ry2 - ry1);
}
static void make_hole_inv(GPixelRgn * region, int x, int y)
{
int j, k, startx=0, starty=0;
int rx1, rx2, ry1, ry2;
int new;
rx1 = x - params.size / 2;
rx2 = rx1 + params.size;
ry1 = y - params.size / 2;
ry2 = ry1 + params.size;
/* clipping */
if (rx1 < sx1) {
startx=sx1-rx1;
rx1= sx1;
}
if (ry1 < sy1) {
starty=sy1-ry1;
ry1= sy1;
}
rx2 = rx2 > sx2 ? sx2 : rx2;
ry2 = ry2 > sy2 ? sy2 : ry2;
gimp_pixel_rgn_get_rect(region, tmp, rx1, ry1, rx2 - rx1, ry2 - ry1);
for (k = 0; k < (ry2 - ry1); k++) {
for (j = 0; j < (rx2 - rx1); j++) {
new= tmp[((rx2-rx1)*k+j) * bytes + (bytes-1)]+
shape_data[params.size*(k+starty)+j+startx];
tmp[((rx2-rx1)*k+j) * bytes + (bytes-1)]= (new>255? 255 : new);
}
}
gimp_pixel_rgn_set_rect(region, tmp, rx1, ry1, rx2 - rx1, ry2 - ry1);
}
static void doit(GDrawable * drawable)
{
GPixelRgn srcPR, destPR;
gint width, height;
int x, y;
int col, row, b;
guchar *src_row, *dest_row;
guchar *src, *dest;
gint progress, max_progress;
gpointer pr;
guchar val_alpha;
/* Get the input area. This is the bounding box of the selection in
* the image (or the entire image if there is no selection). Only
* operating on the input area is simply an optimization. It doesn't
* need to be done for correct operation. (It simply makes it go
* faster, since fewer pixels need to be operated on).
*/
gimp_drawable_mask_bounds(drawable->id, &sx1, &sy1, &sx2, &sy2);
/* Get the size of the input image. (This will/must be the same
* as the size of the output image.
*/
width = drawable->width;
height = drawable->height;
bytes = drawable->bpp;
/* initialize buffers and data */
tmp = (guchar *) malloc(params.size * params.size * bytes);
if (tmp == NULL) {
return;
}
if (!prepare_shape())
return;
make_curve(exp(-params.density));
progress = 0;
max_progress = (sx2 - sx1) * (sy2 - sy1) * 2;
/* initialize the pixel regions */
gimp_pixel_rgn_init(&srcPR, drawable, sx1, sy1, sx2-sx1, sy2-sy1, FALSE, FALSE);
gimp_pixel_rgn_init(&destPR, drawable, sx1, sy1, sx2-sx1, sy2-sy1, TRUE, TRUE);
/* First off, copy the old one to the new one. */
if (params.flag)
val_alpha=0;
else
val_alpha=255;
for (pr = gimp_pixel_rgns_register (2, &srcPR, &destPR);
pr != NULL; pr = gimp_pixel_rgns_process (pr)) {
src_row = srcPR.data;
dest_row = destPR.data;
for ( row = 0; row < srcPR.h; row++) {
src = src_row;
dest = dest_row;
for ( col = 0; col < srcPR.w; col++) {
for (b=0; b< bytes-1; b++)
*dest++ = *src++;
src++; /* set alpha to opaque */
*dest++ = val_alpha;
}
src_row += srcPR.rowstride;
dest_row += destPR.rowstride;
}
progress += srcPR.w * srcPR.h;
gimp_progress_update ((double) progress / (double) max_progress);
}
/* Do the effect */
gimp_pixel_rgn_init(&srcPR, drawable, sx1, sy1, sx2-sx1, sy2-sy1, FALSE, FALSE);
if (params.flag) {
for (pr = gimp_pixel_rgns_register (1, &srcPR);
pr != NULL; pr = gimp_pixel_rgns_process (pr)) {
src_row = srcPR.data;
for ( row = 0, y = srcPR.y; row < srcPR.h; row++, y++) {
src = src_row;
for ( col = 0, x = srcPR.x; col < srcPR.w; col++, x++) {
if (curve[src[bytes-1]]<rand()) {
make_hole_inv(&destPR, x, y);
}
src+= bytes;
}
src_row += srcPR.rowstride;
}
progress += srcPR.w * srcPR.h;
gimp_progress_update ((double) progress / (double) max_progress);
}
} else {
for (pr = gimp_pixel_rgns_register (1, &srcPR);
pr != NULL; pr = gimp_pixel_rgns_process (pr)) {
src_row = srcPR.data;
for ( row = 0, y = srcPR.y; row < srcPR.h; row++, y++) {
src = src_row;
for ( col = 0, x = srcPR.x; col < srcPR.w; col++, x++) {
if (curve[src[bytes-1]]<rand()) {
make_hole(&destPR, x, y);
}
src+= bytes;
}
src_row += srcPR.rowstride;
}
progress += srcPR.w * srcPR.h;
gimp_progress_update ((double) progress / (double) max_progress);
}
}
/* free the mem */
free(tmp);
free(shape_data);
/* update the region */
gimp_drawable_flush(drawable);
gimp_drawable_merge_shadow(drawable->id, TRUE);
gimp_drawable_update(drawable->id, sx1, sy1, sx2 - sx1, sy2 - sy1);
}
/***************************************************
* GUI stuff
*/
/*===================================================================
Entry - Scale Pair
====================================================================*/
/***********************************************************************/
/* */
/* Create new entry-scale pair with label. (int) */
/* 1 row and 2 cols of table are needed. */
/* */
/* `x' and `y' means starting row and col in `table'. */
/* */
/* `caption' is label string. */
/* */
/* `min', `max' are boundary of scale. */
/* */
/* `constraint' means whether value of *intvar should be constraint */
/* by scale adjustment, e.g. between `min' and `max'. */
/* */
/***********************************************************************/
static void
UI_int_entryscale_new ( GtkTable *table, gint x, gint y,
guchar *caption, gint *intvar,
gint min, gint max, gint constraint)
{
GtkWidget *hbox;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *scale;
GtkObject *adjustment;
EntryScaleData *userdata;
guchar buffer[256];
label = gtk_label_new (caption);
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
adjustment = gtk_adjustment_new ( *intvar, min, max, 1.0, 1.0, 0.0);
scale = gtk_hscale_new ( GTK_ADJUSTMENT(adjustment) );
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
entry = gtk_entry_new ();
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
sprintf( buffer, "%d", *intvar );
gtk_entry_set_text( GTK_ENTRY (entry), buffer );
userdata = g_new ( EntryScaleData, 1 );
userdata->entry = entry;
userdata->adjustment = adjustment;
userdata->constraint = constraint;
gtk_object_set_user_data (GTK_OBJECT(entry), userdata);
gtk_object_set_user_data (GTK_OBJECT(adjustment), userdata);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) UI_paired_int_entry_update,
intvar);
gtk_signal_connect ( adjustment, "value_changed",
(GtkSignalFunc) UI_paired_int_scale_update,
intvar);
gtk_signal_connect ( GTK_OBJECT( entry ), "destroy",
(GtkSignalFunc) UI_paired_entry_destroy_callback,
userdata );
hbox = gtk_hbox_new ( FALSE, 5 );
gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
gtk_table_attach (GTK_TABLE (table), label, x, x+1, y, y+1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach (GTK_TABLE (table), hbox, x+1, x+2, y, y+1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (label);
gtk_widget_show (entry);
gtk_widget_show (scale);
gtk_widget_show (hbox);
}
/*
when destroyed, userdata is destroyed too
*/
static void
UI_paired_entry_destroy_callback (GtkWidget *widget,
gpointer data)
{
EntryScaleData *userdata;
userdata = data;
g_free ( userdata );
}
/* scale callback (int) */
/* ==================== */
static void
UI_paired_int_scale_update (GtkAdjustment *adjustment,
gpointer data)
{
EntryScaleData *userdata;
GtkEntry *entry;
gchar buffer[256];
gint *val, new_val;
val = data;
new_val = (gint) adjustment->value;
*val = new_val;
userdata = gtk_object_get_user_data (GTK_OBJECT (adjustment));
entry = GTK_ENTRY( userdata->entry );
sprintf (buffer, "%d", (int) new_val );
/* avoid infinite loop (scale, entry, scale, entry ...) */
gtk_signal_handler_block_by_data ( GTK_OBJECT(entry), data );
gtk_entry_set_text ( entry, buffer);
gtk_signal_handler_unblock_by_data ( GTK_OBJECT(entry), data );
}
/*
entry callback (int)
*/
static void
UI_paired_int_entry_update (GtkWidget *widget,
gpointer data)
{
EntryScaleData *userdata;
GtkAdjustment *adjustment;
int new_val, constraint_val;
int *val;
val = data;
new_val = atoi (gtk_entry_get_text (GTK_ENTRY (widget)));
*val = new_val;
userdata = gtk_object_get_user_data (GTK_OBJECT (widget));
adjustment = GTK_ADJUSTMENT( userdata->adjustment );
constraint_val = new_val;
if ( constraint_val < adjustment->lower )
constraint_val = adjustment->lower;
if ( constraint_val > adjustment->upper )
constraint_val = adjustment->upper;
if ( userdata->constraint )
*val = constraint_val;
else
*val = new_val;
adjustment->value = constraint_val;
gtk_signal_handler_block_by_data ( GTK_OBJECT(adjustment), data );
gtk_signal_emit_by_name ( GTK_OBJECT(adjustment), "value_changed");
gtk_signal_handler_unblock_by_data ( GTK_OBJECT(adjustment), data );
}
/* The same thing, but with floats... */
static void
UI_float_entryscale_new ( GtkTable *table, gint x, gint y,
guchar *caption, gfloat *var,
gfloat min, gfloat max, gint constraint)
{
GtkWidget *hbox;
GtkWidget *label;
GtkWidget *entry;
GtkWidget *scale;
GtkObject *adjustment;
EntryScaleData *userdata;
guchar buffer[256];
label = gtk_label_new (caption);
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
adjustment = gtk_adjustment_new ( *var, min, max, 1.0, 1.0, 0.0);
scale = gtk_hscale_new ( GTK_ADJUSTMENT(adjustment) );
gtk_widget_set_usize (scale, SCALE_WIDTH, 0);
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
entry = gtk_entry_new ();
gtk_widget_set_usize (entry, ENTRY_WIDTH, 0);
sprintf( buffer, "%1.2f", *var );
gtk_entry_set_text( GTK_ENTRY (entry), buffer );
userdata = g_new ( EntryScaleData, 1 );
userdata->entry = entry;
userdata->adjustment = adjustment;
userdata->constraint = constraint;
gtk_object_set_user_data (GTK_OBJECT(entry), userdata);
gtk_object_set_user_data (GTK_OBJECT(adjustment), userdata);
gtk_signal_connect (GTK_OBJECT (entry), "changed",
(GtkSignalFunc) UI_paired_float_entry_update,
var);
gtk_signal_connect ( adjustment, "value_changed",
(GtkSignalFunc) UI_paired_float_scale_update,
var);
gtk_signal_connect ( GTK_OBJECT( entry ), "destroy",
(GtkSignalFunc) UI_paired_entry_destroy_callback,
userdata );
hbox = gtk_hbox_new ( FALSE, 5 );
gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
gtk_table_attach (GTK_TABLE (table), label, x, x+1, y, y+1,
GTK_FILL, GTK_FILL, 0, 0);
gtk_table_attach (GTK_TABLE (table), hbox, x+1, x+2, y, y+1,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (label);
gtk_widget_show (entry);
gtk_widget_show (scale);
gtk_widget_show (hbox);
}
/* scale callback (float) */
/* ==================== */
static void
UI_paired_float_scale_update (GtkAdjustment *adjustment,
gpointer data)
{
EntryScaleData *userdata;
GtkEntry *entry;
gchar buffer[256];
gfloat *val, new_val;
val = data;
new_val = (gfloat) adjustment->value;
*val = new_val;
userdata = gtk_object_get_user_data (GTK_OBJECT (adjustment));
entry = GTK_ENTRY( userdata->entry );
sprintf (buffer, "%1.2f", (gfloat) new_val );
/* avoid infinite loop (scale, entry, scale, entry ...) */
gtk_signal_handler_block_by_data ( GTK_OBJECT(entry), data );
gtk_entry_set_text ( entry, buffer);
gtk_signal_handler_unblock_by_data ( GTK_OBJECT(entry), data );
}
/*
entry callback (float)
*/
static void
UI_paired_float_entry_update (GtkWidget *widget,
gpointer data)
{
EntryScaleData *userdata;
GtkAdjustment *adjustment;
gfloat new_val, constraint_val;
gfloat *val;
val = data;
new_val = atof (gtk_entry_get_text (GTK_ENTRY (widget)));
*val = new_val;
userdata = gtk_object_get_user_data (GTK_OBJECT (widget));
adjustment = GTK_ADJUSTMENT( userdata->adjustment );
constraint_val = new_val;
if ( constraint_val < adjustment->lower )
constraint_val = adjustment->lower;
if ( constraint_val > adjustment->upper )
constraint_val = adjustment->upper;
if ( userdata->constraint )
*val = constraint_val;
else
*val = new_val;
adjustment->value = constraint_val;
gtk_signal_handler_block_by_data ( GTK_OBJECT(adjustment), data );
gtk_signal_emit_by_name ( GTK_OBJECT(adjustment), "value_changed");
gtk_signal_handler_unblock_by_data ( GTK_OBJECT(adjustment), data );
}
static void
UI_toggle_update (GtkWidget *widget,
gpointer data)
{
int *toggle_val;
toggle_val = (int *) data;
if (GTK_TOGGLE_BUTTON (widget)->active)
*toggle_val = TRUE;
else
*toggle_val = FALSE;
}
void shape_radio_callback(GtkWidget *widget, GtkRadioButton *button)
{
gint id;
/* Get radio button ID */
id=(gint)gtk_object_get_data(GTK_OBJECT(button),"Radio_ID");
if (GTK_TOGGLE_BUTTON(button)->active==TRUE) {
params.shape= id;
}
}
/*** Dialog interface ***/
static void
UI_close_callback (GtkWidget *widget,
gpointer data)
{
gtk_main_quit ();
}
static void
UI_ok_callback (GtkWidget *widget,
gpointer data)
{
pint.run = TRUE;
gtk_widget_destroy (GTK_WIDGET (data));
}
static gint
dialog ()
{
GtkWidget *dlg;
GtkWidget *frame;
GtkWidget *table;
GtkWidget *button;
GtkWidget *toggle;
GSList *group = NULL;
gchar **argv;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("holes");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
dlg = gtk_dialog_new ();
gtk_window_set_title (GTK_WINDOW (dlg), "Holes");
gtk_window_position (GTK_WINDOW (dlg), GTK_WIN_POS_MOUSE);
gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
(GtkSignalFunc) UI_close_callback,
NULL);
/* Action area */
button = gtk_button_new_with_label ("OK");
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) UI_ok_callback,
dlg);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->action_area), button, TRUE, TRUE, 0);
gtk_widget_grab_default (button);
gtk_widget_show (button);
button = gtk_button_new_with_label ("Cancel");
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) gtk_widget_destroy,
GTK_OBJECT (dlg));
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->action_area), button, TRUE, TRUE, 0);
gtk_widget_show (button);
/* parameter settings */
frame = gtk_frame_new ("Parameter Settings");
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width (GTK_CONTAINER (frame), 10);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), frame, TRUE, TRUE, 0);
table = gtk_table_new (6, 2, FALSE);
gtk_container_border_width (GTK_CONTAINER (table), 10);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_table_set_row_spacings (GTK_TABLE (table), 3);
gtk_table_set_col_spacings (GTK_TABLE (table), 10);
UI_int_entryscale_new( GTK_TABLE (table), 0, 1,
"Size:", &params.size,
1, 100, TRUE );
UI_float_entryscale_new( GTK_TABLE (table), 0, 2,
"Density:", &params.density,
-5.0, 5.0, TRUE );
toggle = gtk_check_button_new_with_label ("Keep opaque");
gtk_table_attach (GTK_TABLE (table), toggle, 0, 1, 3, 4,
GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) UI_toggle_update,
&params.flag);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), params.flag);
gtk_widget_show(toggle);
toggle = gtk_radio_button_new_with_label (group,"square shaped holes");
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_table_attach (GTK_TABLE (table), toggle, 1, 2, 3, 4,
GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect_object (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) shape_radio_callback,
(gpointer)toggle);
gtk_object_set_data(GTK_OBJECT(toggle),"Radio_ID",(gpointer)SQUARE_SHAPE);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), (params.shape == SQUARE_SHAPE));
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group,"round shaped holes");
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_table_attach (GTK_TABLE (table), toggle, 1, 2, 4, 5,
GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect_object (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) shape_radio_callback,
(gpointer)toggle);
gtk_object_set_data(GTK_OBJECT(toggle),"Radio_ID",(gpointer)CIRCLE_SHAPE);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), (params.shape == CIRCLE_SHAPE));
gtk_widget_show (toggle);
toggle = gtk_radio_button_new_with_label (group,"diamond shaped holes");
group = gtk_radio_button_group (GTK_RADIO_BUTTON (toggle));
gtk_table_attach (GTK_TABLE (table), toggle, 1, 2, 5, 6,
GTK_FILL, GTK_FILL, 0, 0);
gtk_signal_connect_object (GTK_OBJECT (toggle), "toggled",
(GtkSignalFunc) shape_radio_callback,
(gpointer)toggle);
gtk_object_set_data(GTK_OBJECT(toggle),"Radio_ID",(gpointer)DIAMOND_SHAPE);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (toggle), (params.shape == DIAMOND_SHAPE));
gtk_widget_show (toggle);
gtk_widget_show (frame);
gtk_widget_show (table);
gtk_widget_show (dlg);
gtk_main ();
gdk_flush ();
return pint.run;
}

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
rcm

View File

@ -1,39 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = rcm
rcm_SOURCES = \
pmg_gtk_objects.c pmg_gtk_objects.h rcm.c rcm.h rcm_360.xpm rcm_a_b.xpm rcm_ccw.xpm rcm_cw.xpm rcm_gdk.c rcm_gtk.c rcm_hsv.c rcm_hsv.h rcm_misc.c
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
\
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
rcm_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,27 +0,0 @@
XPM_PATH = "/home/pavel/rcm/"
CC = gcc
LIBS = -lXext -lm
GIMPLIBS = -lgtk -lgdk -lglib -lgimp
CFLAGS = -Wall
HEADERS = rcm.h rcm_hsv.h \
pmg_gtk_objects.h
SOURCES = rcm.c rcm_hsv.c rcm_gtk.c rcm_gdk.c rcm_misc.c \
pmg_gtk_objects.c
OBJECTS = rcm.o rcm_hsv.o rcm_gtk.o rcm_gdk.o rcm_misc.o \
pmg_gtk_objects.o
rcm: $(OBJECTS) $(HEADERS)
$(CC) -o $@ $(OBJECTS) $(GIMPLIBS) $(LIBS)
clean:
rm *.o *~ -f
tar:
(cd ..; tar -cf - rcm | gzip -cv --best > rcm.tgz)

View File

@ -1,20 +0,0 @@
pavel@ml.com
Change rcm_change_me.h to the directory where you're gonna place the pixmaps!
Hi,
Thanks for using the Colormap Rotation Plug-In.
I have never written Makefiles before so the one I'm including is decidedly
horrible. But it does the job for me. It should work for you, too!
Enjoy!
Pavel
Please send questions, comments, and suggestions to pavel@ml.com

View File

@ -1,20 +0,0 @@
pavel@ml.com
Change rcm_change_me.h to the directory where you're gonna place the pixmaps!
Hi,
Thanks for using the Colormap Rotation Plug-In.
I have never written Makefiles before so the one I'm including is decidedly
horrible. But it does the job for me. It should work for you, too!
Enjoy!
Pavel
Please send questions, comments, and suggestions to pavel@ml.com

View File

@ -1,95 +0,0 @@
#include "pmg_gtk_objects.h"
PmgButtonLabel *pmg_button_with_label_new()
{
PmgButtonLabel *structure;
structure = g_new(PmgButtonLabel,1);
return structure;
}
PmgButtonLabelXpm *
pmg_button_label_xpm_new(GtkWidget *parent,
gchar *xpm_filename,
gchar *label_text,
gchar *additional_label_text,
gint v_or_h,
GtkSignalFunc *click_function,
gpointer *click_data)
{
PmgButtonLabelXpm *xpm_button;
GtkWidget *label_box;
xpm_button = g_new(PmgButtonLabelXpm, 1);
switch (v_or_h) {
case 'v':
xpm_button->box = gtk_vbox_new (FALSE, 0);
break;
case 'h':
xpm_button->box = gtk_hbox_new (FALSE, 0);
break;
}
gtk_container_border_width(GTK_CONTAINER(xpm_button->box), 2);
gtk_widget_show(xpm_button->box);
xpm_button->parent = parent;
{
label_box = gtk_vbox_new(FALSE,0);
gtk_widget_show(label_box);
xpm_button->label = gtk_label_new (label_text);
gtk_widget_show(xpm_button->label);
gtk_box_pack_start (GTK_BOX (label_box), xpm_button->label,
TRUE,FALSE,0);
if (strcmp("",additional_label_text)) {
xpm_button->additional_label = gtk_label_new (additional_label_text);
gtk_widget_show(xpm_button->additional_label);
gtk_box_pack_start (GTK_BOX (label_box), xpm_button->additional_label,
TRUE,FALSE,0);
}
}
xpm_button->pixmap_id = NULL;
pmg_set_xpm_in_button_label(xpm_button, xpm_filename);
gtk_widget_show(xpm_button->pixmap_id);
gtk_box_pack_start (GTK_BOX (xpm_button->box), xpm_button->pixmap_id,
FALSE, FALSE, 3);
gtk_box_pack_start (GTK_BOX (xpm_button->box), label_box,
FALSE, FALSE, 3);
xpm_button->button = gtk_button_new();
gtk_widget_show(xpm_button->button);
gtk_signal_connect (GTK_OBJECT (xpm_button->button), "clicked",
(GtkSignalFunc) click_function,
click_data);
gtk_container_add(GTK_CONTAINER(xpm_button->button),xpm_button->box);
return xpm_button;
}
void
pmg_set_xpm_in_button_label(PmgButtonLabelXpm *xpm_button,
gchar *xpm_filename)
{
GdkPixmap *pixmap;
GdkBitmap *mask;
GtkStyle *style;
style = gtk_widget_get_style(xpm_button->parent);
pixmap = gdk_pixmap_create_from_xpm (xpm_button->parent->window, &mask,
&style->bg[GTK_STATE_NORMAL],
xpm_filename);
if (!xpm_button->pixmap_id)
xpm_button->pixmap_id = gtk_pixmap_new (pixmap, mask);
else
gtk_pixmap_set(GTK_PIXMAP(xpm_button->pixmap_id), pixmap, mask);
}

View File

@ -1,42 +0,0 @@
#ifndef __PMG_GTK_OBJECTS__
#define __PMG_GTK_OBJECTS__
#include <stdio.h>
#include <stdlib.h>
#include "gtk/gtk.h"
#include "libgimp/gimp.h"
typedef struct _PmgButtonLabel PmgButtonLabel;
typedef struct _PmgButtonLabelXpm PmgButtonLabelXpm;
struct _PmgButtonLabel {
GtkWidget *button;
GtkWidget *label;
};
struct _PmgButtonLabelXpm {
GtkWidget *button;
GtkWidget *label;
GtkWidget *additional_label;
GtkWidget *box;
GtkWidget *parent;
GtkWidget *pixmap_id;
};
PmgButtonLabel *pmg_button_with_label_new();
PmgButtonLabelXpm *
pmg_button_label_xpm_new(GtkWidget *parent,
gchar *xpm_filename,
gchar *label_text,
gchar *additional_label_text,
gint v_or_h,
GtkSignalFunc *click_function,
gpointer *click_data);
void
pmg_set_xpm_in_button_label(PmgButtonLabelXpm *xpm_button,
gchar *xpm_filename);
#endif

View File

@ -1,250 +0,0 @@
#include "rcm.h"
#include "rcm_hsv.h"
RcmParams Current=
{
SELECTION, /* SELECTION ONLY */
TRUE, /* REAL TIME */
FALSE, /* SUCCESS */
RADIANS_OVER_PI, /* START IN RADIANS OVER PI */
GRAY_TO
};
void query (void);
void run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals);
GPlugInInfo PLUG_IN_INFO =
{
NULL, /* init_proc */
NULL, /* quit_proc */
query, /* query_proc */
run, /* run_proc */
};
MAIN();
void
query ()
{
GParamDef args[] =
{
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
{ PARAM_IMAGE, "image", "Input image (used for indexed images)" },
{ PARAM_DRAWABLE, "drawable", "Input drawable" },
};
GParamDef *return_vals = NULL;
int nargs = sizeof (args) / sizeof (args[0]);
int nreturn_vals = 0;
gimp_install_procedure ("plug_in_colormap_rotation",
"Does that xv rotation thingy",
"Then something else here",
"Pavel Grinfeld (pavel@ml.com)",
"Pavel Grinfeld (pavel@ml.com)",
"27th March 1997",
"<Image>/Filters/Colors/Colormap Rotation",
"RGB*,INDEXED*,GRAY",
PROC_PLUG_IN,
nargs, nreturn_vals,
args, return_vals);
}
/********************************STANDARD RUN*************************/
void
run (char *name,
int nparams,
GParam *param,
int *nreturn_vals,
GParam **return_vals)
{
GParam values[1];
GStatusType status = STATUS_SUCCESS;
*nreturn_vals = 1;
*return_vals = values;
values[0].type = PARAM_STATUS;
values[0].data.d_status = status;
Current.drawable = gimp_drawable_get (param[2].data.d_drawable);
Current.mask = gimp_drawable_get(gimp_image_get_selection(param[1].data.d_image));
if (gimp_drawable_indexed (Current.drawable->id) ||
gimp_drawable_gray (Current.drawable->id) ) {
ErrorMessage("Convert the image to RGB first!");
status = STATUS_EXECUTION_ERROR;
}
else if (gimp_drawable_color (Current.drawable->id) && rcm_dialog())
{
gimp_progress_init ("Rotating the Colormap...");
gimp_tile_cache_ntiles (2 * (Current.drawable->width /
gimp_tile_width () + 1));
rcm (Current.drawable);
gimp_displays_flush ();
}
else status = STATUS_EXECUTION_ERROR;
values[0].data.d_status = status;
if (status==STATUS_SUCCESS)
gimp_drawable_detach (Current.drawable);
}
void
rcm_row (const guchar *src_row,
guchar *dest_row,
gint row,
gint row_width,
gint bytes)
{
gint col, bytenum, skip;
hsv H,S,V,R,G,B;
for (col = 0; col < row_width ; col++)
{
skip=0;
R = (float)src_row[col*bytes + 0]/255.0;
G = (float)src_row[col*bytes + 1]/255.0;
B = (float)src_row[col*bytes + 2]/255.0;
rgb_to_hsv(R,G,B,&H,&S,&V);
if (rcm_is_gray(S))
if (Current.Gray_to_from==GRAY_FROM)
if (angle_inside_slice(Current.Gray->hue,Current.From->angle)<=1) {
H = Current.Gray->hue/TP;
S = Current.Gray->satur;
}
else
skip=1;
else {
skip=1;
hsv_to_rgb(Current.Gray->hue/TP,
Current.Gray->satur,
V,
&R,&G,&B);
}
if (!skip) {
H=rcm_linear(rcm_left_end(Current.From->angle),
rcm_right_end(Current.From->angle),
rcm_left_end(Current.To->angle),
rcm_right_end(Current.To->angle),
H*TP);
H=angle_mod_2PI(H)/TP;
hsv_to_rgb(H,S,V,&R,&G,&B);
}
dest_row[col*bytes +0] = R*255;
dest_row[col*bytes +1] = G*255;
dest_row[col*bytes +2] = B*255;
if (bytes>3)
for (bytenum = 3; bytenum<bytes; bytenum++)
dest_row[col*bytes+bytenum] = src_row[col*bytes+bytenum];
}
}
void rcm (GDrawable *drawable)
{
GPixelRgn srcPR, destPR;
gint width, height;
gint bytes;
guchar *src_row, *dest_row;
gint row;
gint x1, y1, x2, y2;
gimp_drawable_mask_bounds (drawable->id, &x1, &y1, &x2, &y2);
width = drawable->width;
height = drawable->height;
bytes = drawable->bpp;
src_row = (guchar *) malloc ((x2 - x1) * bytes);
dest_row = (guchar *) malloc ((x2 - x1) * bytes);
gimp_pixel_rgn_init (&srcPR, drawable, 0, 0, width, height, FALSE, FALSE);
gimp_pixel_rgn_init (&destPR, drawable, 0, 0, width, height, TRUE, TRUE);
for (row = y1; row < y2; row++)
{
gimp_pixel_rgn_get_row (&srcPR, src_row, x1, row, (x2 - x1));
rcm_row (src_row,
dest_row,
row,
(x2 - x1),
bytes
);
gimp_pixel_rgn_set_row (&destPR, dest_row, x1, row, (x2 - x1));
if ((row % 10) == 0)
gimp_progress_update ((double) row / (double) (y2 - y1));
}
/* update the processed region */
gimp_drawable_flush (drawable);
gimp_drawable_merge_shadow (drawable->id, TRUE);
gimp_drawable_update (drawable->id, x1, y1, (x2 - x1), (y2 - y1));
free (src_row);
free (dest_row);
}
void
ErrorMessage(guchar *message)
{
GtkWidget *window, *label, *button,*table;
gchar **argv=g_new (gchar *, 1);
gint argc=1;
argv[0] = g_strdup ("rcm");
gtk_init (&argc, &argv);
window=gtk_dialog_new();
gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_MOUSE);
gtk_window_set_title(GTK_WINDOW(window),"Filter Pack Simulation Message");
gtk_signal_connect (GTK_OBJECT (window), "destroy",
(GtkSignalFunc) rcm_close_callback,
NULL);
button = gtk_button_new_with_label ("Got It!");
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) rcm_ok_callback,
window);
gtk_widget_grab_default (button);
gtk_widget_show (button);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button, TRUE, TRUE, 0);
table=gtk_table_new(2,2,FALSE);
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->vbox),table,TRUE,TRUE,0);
gtk_widget_show(table);
label=gtk_label_new("");
gtk_label_set(GTK_LABEL(label),message);
gtk_widget_show(label);
gtk_table_attach(GTK_TABLE(table),label,0,1,0,1,
GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND,15,15);
gtk_widget_show(window);
gtk_main ();
}

View File

@ -1,330 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include "gtk/gtk.h"
#include "libgimp/gimp.h"
#include "rcm_hsv.h"
#include "pmg_gtk_objects.h"
#define RCM_XPM_DIR "./"
#define MAX_PREVIEW_SIZE 150
#define ALL 255
#define INITIAL_ALPHA 0
#define INITIAL_BETA (PI/2.0)
#define INITIAL_GRAY_SAT 0.0
#define RADIUS 60
#define MARGIN 4
#define SUM (2*RADIUS+2*MARGIN)
#define CENTER (SUM/2)
#define TP (2*PI)
#define GRAY_RADIUS 60
#define GRAY_MARGIN 3
#define GRAY_SUM (2*GRAY_RADIUS+2*GRAY_MARGIN)
#define GRAY_CENTER (GRAY_SUM/2)
#define LITTLE_RADIUS 3
#define EACH_OR_BOTH .3
#define sqr(X) ((X)*(X))
#define SWAP(X,Y) {float t=X; X=Y; Y=t;}
#define RANGE_ADJUST_MASK GDK_EXPOSURE_MASK | \
GDK_ENTER_NOTIFY_MASK | \
GDK_BUTTON_PRESS_MASK | \
GDK_BUTTON_RELEASE_MASK | \
GDK_BUTTON1_MOTION_MASK | \
GDK_POINTER_MOTION_HINT_MASK
typedef struct {
float alpha;
float beta;
int cw_ccw;
} RcmAngle;
typedef enum {
VIRGIN,
DRAG_START,
DRAGING,
DO_NOTHING
} RcmOp;
typedef struct {
GtkWidget *preview;
GtkWidget *frame;
GtkWidget *table;
PmgButtonLabelXpm *cw_ccw_xpm_button;
GtkWidget *alpha_entry;
GtkWidget *alpha_units_label;
GtkWidget *beta_entry;
GtkWidget *beta_units_label;
gfloat *target;
gint mode;
RcmAngle *angle;
RcmOp action_flag;
gfloat prev_clicked;
} RcmCircle;
typedef struct {
GtkWidget *dlg;
GtkWidget *bna_frame;
GtkWidget *before;
GtkWidget *after;
} RcmBna;
typedef struct {
GtkWidget *preview;
GtkWidget *frame;
float gray_sat;
float hue;
float satur;
GtkWidget *gray_sat_entry;
GtkWidget *hue_entry;
GtkWidget *hue_units_label;
GtkWidget *satur_entry;
RcmOp action_flag;
} RcmGray;
typedef struct {
gint width;
gint height;
guchar *rgb;
hsv *hsv;
guchar *mask;
} ReducedImage;
typedef struct {
gint Slctn;
gint RealTime;
gint Success;
gint Units;
gint Gray_to_from;
GDrawable *drawable;
GDrawable *mask;
ReducedImage *reduced;
RcmCircle *To;
RcmCircle *From;
RcmGray *Gray;
RcmBna *Bna;
} RcmParams;
enum {
ENTIRE_IMAGE,
SELECTION,
SELECTION_IN_CONTEXT,
PREVIEW_OPTIONS
};
enum {
EACH,
BOTH,
DEGREES,
RADIANS,
RADIANS_OVER_PI,
GRAY_FROM,
GRAY_TO,
CURRENT,
ORIGINAL
};
gint rcm_dialog();
GtkWidget *rcm_create_bna(void);
GtkWidget *rcm_create_from_to(void);
float arctg(float y, float x);
float min_prox(float alpha,
float beta,
float angle);
float *closest(float *alpha,
float *beta,
float angle);
float beta_from_alpha_and_delta(float alpha,
float delta);
float angle_mod_2PI(float angle);
float angle_inside_slice(float angle, RcmAngle *slice);
void rcm_draw_arrows(GdkWindow *window,
GdkGC *color,
RcmAngle *angle);
gint rcm_expose_event (GtkWidget *widget,
GdkEvent *event,
RcmCircle *circle);
gint rcm_button_press_event (GtkWidget *widget,
GdkEvent *event,
RcmCircle *circle);
gint rcm_release_event (GtkWidget *widget,
GdkEvent *event,
RcmCircle *circle);
gint rcm_motion_notify_event (GtkWidget *widget,
GdkEvent *event,
RcmCircle *circle);
/***************** GRAY ***********************/
void rcm_draw_little_circle(GdkWindow *window,
GdkGC *color,
float hue,
float satur);
void rcm_draw_large_circle(GdkWindow *window,
GdkGC *color,
float gray_sat);
gint rcm_gray_expose_event (GtkWidget *widget,
GdkEvent *event,
RcmGray *circle);
gint rcm_gray_button_press_event (GtkWidget *widget,
GdkEvent *event,
RcmGray *circle);
gint rcm_gray_release_event (GtkWidget *widget,
GdkEvent *event,
RcmGray *circle);
gint rcm_gray_motion_notify_event (GtkWidget *widget,
GdkEvent *event,
RcmGray *circle);
/***************** END GRAY ***********************/
float rcm_units_factor(gint units);
gchar *rcm_units_string(gint units);
void rcm_set_alpha(GtkWidget *entry,
gpointer data);
void rcm_set_beta(GtkWidget *entry,
gpointer data);
void rcm_set_hue(GtkWidget *entry,
gpointer data);
void rcm_set_satur(GtkWidget *entry,
gpointer data);
void rcm_set_gray_sat(GtkWidget *entry,
gpointer data);
void rcm_show_hide_frame(GtkWidget *button,
GtkWidget *frame);
RcmCircle *rcm_create_square_preview(gint, gchar *);
ReducedImage *Reduce_The_Image (GDrawable *,
GDrawable *,
gint,
gint);
GtkWidget *rcm_widget_in_a_table(GtkWidget *table,
guchar *string,
gint x_spot,
gint y_spot,
GtkSignalFunc *function,
gpointer *data);
GtkWidget *rcm_label_in_a_table(GtkWidget *table,
guchar *string,
int x_spot,
int y_spot);
GtkWidget *rcm_entry_in_a_table(GtkWidget *table,
float value,
gint x_spot,
gint y_spot,
GtkSignalFunc func,
gpointer data);
void rcm_render_preview (GtkWidget *,
gint);
void rcm_render_circle_preview (GtkWidget *preview,
int sum,
int margin);
void rcm_preview_what (GtkWidget *widget,
gpointer data);
void rcm_cw_ccw (GtkWidget *,
RcmCircle *);
void rcm_a_to_b (GtkWidget *,
RcmCircle *);
void rcm_360_degrees (GtkWidget *,
RcmCircle *);
void rcm_close_callback (GtkWidget *,
gpointer );
void rcm_ok_callback (GtkWidget *,
gpointer );
void Create_A_Preview (GtkWidget **,
GtkWidget **,
int,
int,
int);
void Create_A_Table_Entry (GtkWidget **,
GtkWidget *,
char *);
GSList* Button_In_A_Box (GtkWidget *,
GSList *,
guchar *,
GtkSignalFunc,
gpointer,
int );
void Check_Button_In_A_Box (GtkWidget *,
guchar *label,
GtkSignalFunc func,
gpointer data,
int clicked);
void rcm (GDrawable *drawable);
void rcm_row (const guchar *src_row,
guchar *dest_row,
gint row,
gint row_width,
gint bytes);
void As_You_Drag (GtkWidget *button);
void preview_size_scale_update (GtkAdjustment *adjustment,
float *scale_val);
void ErrorMessage (guchar *);
void rcm_advanced_ok();
gint rcm_fake_transparency(gint i, gint j);
void rcm_float_angle_in_an_entry(GtkWidget *entry,
float value,
gint units);
void rcm_float_in_an_entry(GtkWidget *entry,
float value);
void rcm_update_entries(gint units);
float rcm_unit_factor(gint units);
gint rcm_is_gray(float s);
float rcm_linear(float, float, float, float, float);
float rcm_left_end(RcmAngle *angle);
float rcm_right_end(RcmAngle *angle);
GtkWidget *rcm_xpm_label_box (GtkWidget *parent,
gchar *xpm_filename,
gchar *label_text);
gint rcm_fake_transparency(gint i, gint j);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,498 +0,0 @@
#include "rcm.h"
extern RcmParams Current;
GdkGC *xor_gc;
void
rcm_float_in_an_entry(GtkWidget *entry,
float value)
{
gchar buffer[10];
if (value<10)
sprintf(buffer,"%.4f",value);
else if (value<100)
sprintf(buffer,"%.3f",value);
else if (value<1000)
sprintf(buffer,"%.2f",value);
gtk_entry_set_text(GTK_ENTRY(entry),buffer);
}
gint
rcm_expose_event (GtkWidget *widget,
GdkEvent *event,
RcmCircle *circle)
{
switch (circle->action_flag) {
case DO_NOTHING: return 0;
case VIRGIN: rcm_draw_arrows(widget->window,
widget->style->black_gc,
circle->angle); break;
default: if (Current.RealTime)
rcm_render_preview(Current.Bna->after,CURRENT); break;
}
return 1;
}
gint
rcm_button_press_event (GtkWidget *widget,
GdkEvent *event,
RcmCircle *circle)
{
float clicked_angle;
float *alpha = &(circle->angle->alpha);
float *beta = &(circle->angle->beta);
GdkEventButton *bevent=(GdkEventButton *) event;
circle->action_flag=DRAG_START;
circle->prev_clicked=
clicked_angle=angle_mod_2PI(arctg(CENTER-bevent->y,bevent->x-CENTER));
if (sqrt(sqr(bevent->y-CENTER)+sqr(bevent->x-CENTER))>RADIUS*EACH_OR_BOTH
&& min_prox( *alpha, *beta, clicked_angle) <PI/12) {
circle->mode=EACH;
circle->target=closest(alpha,beta,clicked_angle);
if (*(circle->target) != clicked_angle) {
*(circle->target) = clicked_angle;
gtk_widget_draw(circle->preview,NULL);
rcm_draw_arrows(widget->window,
widget->style->black_gc,
circle->angle);
rcm_float_in_an_entry(circle->alpha_entry,
circle->angle->alpha*
rcm_units_factor(Current.Units));
rcm_float_in_an_entry(circle->beta_entry,
circle->angle->beta*
rcm_units_factor(Current.Units));
if (Current.RealTime)
rcm_render_preview(Current.Bna->after, CURRENT);
}
}
else
circle->mode = BOTH;
return 1;
}
gint
rcm_release_event (GtkWidget *widget,
GdkEvent *event,
RcmCircle *circle)
{
if (circle->action_flag==DRAGING)
rcm_draw_arrows(widget->window,
widget->style->black_gc,
circle->angle);
circle->action_flag = VIRGIN;
if (!(Current.RealTime))
rcm_render_preview(Current.Bna->after,CURRENT);
return 1;
}
gint
rcm_motion_notify_event (GtkWidget *widget,
GdkEvent *event,
RcmCircle *circle)
{
gint x, y;
float clicked_angle;
float *alpha = &(circle->angle->alpha);
float *beta = &(circle->angle->beta);
int cw_ccw = circle->angle->cw_ccw;
float delta=angle_mod_2PI(cw_ccw*(*beta-*alpha));
GdkGCValues values;
values.foreground = Current.From->preview->style->white;
values.function = GDK_XOR;
xor_gc = gdk_gc_new_with_values (Current.From->preview->window,
&values,
GDK_GC_FOREGROUND |
GDK_GC_FUNCTION);
gdk_window_get_pointer(widget->window, &x,&y, NULL);
clicked_angle=angle_mod_2PI(arctg(CENTER-y,x-CENTER));
delta=clicked_angle - circle->prev_clicked;
circle->prev_clicked=clicked_angle;
if (delta) {
if (circle->action_flag==DRAG_START) {
gtk_widget_draw(circle->preview,NULL);
circle->action_flag=DRAGING;
}
else
rcm_draw_arrows(widget->window,
xor_gc,
circle->angle); /* erase! */
if (circle->mode==EACH)
*(circle->target)=clicked_angle;
else {
circle->angle->alpha=angle_mod_2PI(circle->angle->alpha + delta);
circle->angle->beta =angle_mod_2PI(circle->angle->beta + delta);
}
rcm_draw_arrows(widget->window,
xor_gc,
circle->angle);
rcm_float_in_an_entry(circle->alpha_entry,
circle->angle->alpha*
rcm_units_factor(Current.Units));
rcm_float_in_an_entry(circle->beta_entry,
circle->angle->beta*
rcm_units_factor(Current.Units));
if (Current.RealTime)
rcm_render_preview(Current.Bna->after,CURRENT);
}
return 1;
}
/******************* GRAY *******************/
gint
rcm_gray_expose_event (GtkWidget *widget,
GdkEvent *event,
RcmGray *circle)
{
if (circle->action_flag==VIRGIN) {
rcm_draw_little_circle(widget->window,
widget->style->black_gc,
circle->hue,
circle->satur);
rcm_draw_large_circle(widget->window,
widget->style->black_gc,
circle->gray_sat);
}
else if (Current.RealTime)
rcm_render_preview(Current.Bna->after,CURRENT);
return 1;
}
gint
rcm_gray_button_press_event (GtkWidget *widget,
GdkEvent *event,
RcmGray *circle)
{
GdkEventButton *bevent=(GdkEventButton *) event;
int x = bevent->x-GRAY_CENTER-LITTLE_RADIUS;
int y = GRAY_CENTER-bevent->y+LITTLE_RADIUS;
circle->action_flag=DRAG_START;
circle->hue=angle_mod_2PI(arctg(y,x));
circle->satur=sqrt(sqr(x)+sqr(y))/GRAY_RADIUS;
if (circle->satur > 1.0) circle->satur=1;
gtk_widget_draw(circle->preview,NULL);
rcm_draw_little_circle(widget->window,
widget->style->black_gc,
circle->hue,
circle->satur);
rcm_draw_large_circle(circle->preview->window,
circle->preview->style->black_gc,
circle->gray_sat);
rcm_float_in_an_entry(circle->hue_entry,
circle->hue*
rcm_units_factor(Current.Units));
rcm_float_in_an_entry(circle->satur_entry,circle->satur);
if (Current.RealTime)
rcm_render_preview(Current.Bna->after,CURRENT);
return 1;
}
gint
rcm_gray_release_event (GtkWidget *widget,
GdkEvent *event,
RcmGray *circle)
{
if (circle->action_flag==DRAGING)
rcm_draw_little_circle(widget->window,
widget->style->black_gc,
circle->hue,
circle->satur);
circle->action_flag=VIRGIN;
if (!(Current.RealTime))
rcm_render_preview(Current.Bna->after,CURRENT);
return 1;
}
gint
rcm_gray_motion_notify_event (GtkWidget *widget,
GdkEvent *event,
RcmGray *circle)
{
gint x, y;
GdkGCValues values;
values.foreground = Current.From->preview->style->white;
values.function = GDK_XOR;
xor_gc = gdk_gc_new_with_values (Current.From->preview->window,
&values,
GDK_GC_FOREGROUND |
GDK_GC_FUNCTION);
if (circle->action_flag==DRAG_START) {
gtk_widget_draw(circle->preview,NULL);
rcm_draw_large_circle(circle->preview->window,
circle->preview->style->black_gc,
circle->gray_sat);
circle->action_flag=DRAGING;
}
else
rcm_draw_little_circle(widget->window,
xor_gc,
circle->hue,
circle->satur); /* erase */
gdk_window_get_pointer(widget->window, &x,&y, NULL);
x = x-GRAY_CENTER-LITTLE_RADIUS;
y = GRAY_CENTER-y+LITTLE_RADIUS;
circle->hue=angle_mod_2PI(arctg(y,x));
circle->satur=sqrt(sqr(x)+sqr(y))/GRAY_RADIUS;
if (circle->satur > 1.0) circle->satur=1;
rcm_draw_little_circle(widget->window,
xor_gc,
circle->hue,
circle->satur);
rcm_float_in_an_entry(circle->hue_entry,
circle->hue*
rcm_units_factor(Current.Units));
rcm_float_in_an_entry(circle->satur_entry,circle->satur);
if (Current.RealTime)
rcm_render_preview(Current.Bna->after,CURRENT);
return 1;
}
/* Entry Handlers */
void
rcm_set_alpha(GtkWidget *entry,
gpointer data)
{
RcmCircle *circle=(RcmCircle *) data;
if (circle->action_flag!=VIRGIN) return;
circle->angle->alpha=atof( gtk_entry_get_text(GTK_ENTRY(entry)))/
rcm_units_factor(Current.Units);
gtk_widget_draw(circle->preview,NULL);
rcm_draw_arrows(circle->preview->window,
circle->preview->style->black_gc,
circle->angle);
rcm_render_preview(Current.Bna->after,CURRENT);
}
void
rcm_set_beta(GtkWidget *entry,
gpointer data)
{
RcmCircle *circle=(RcmCircle *) data;
if (circle->action_flag!=VIRGIN) return;
circle->angle->beta= atof( gtk_entry_get_text( GTK_ENTRY(entry)))/
rcm_units_factor(Current.Units);
gtk_widget_draw(circle->preview,NULL);
rcm_draw_arrows(circle->preview->window,
circle->preview->style->black_gc,
circle->angle);
rcm_render_preview(Current.Bna->after,CURRENT);
}
void
rcm_set_hue(GtkWidget *entry,
gpointer data)
{
RcmGray *circle=(RcmGray *) data;
if (circle->action_flag!=VIRGIN) return;
circle->hue = atof( gtk_entry_get_text( GTK_ENTRY(entry)))/
rcm_units_factor(Current.Units);
gtk_widget_draw(circle->preview,NULL);
rcm_draw_little_circle(circle->preview->window,
circle->preview->style->black_gc,
circle->hue,
circle->satur);
rcm_draw_large_circle(circle->preview->window,
circle->preview->style->black_gc,
circle->gray_sat);
rcm_render_preview(Current.Bna->after,CURRENT);
}
void
rcm_set_satur(GtkWidget *entry,
gpointer data)
{
RcmGray *circle=(RcmGray *) data;
if (circle->action_flag!=VIRGIN) return;
circle->satur = atof( gtk_entry_get_text( GTK_ENTRY(entry)));
gtk_widget_draw(circle->preview,NULL);
rcm_draw_little_circle(circle->preview->window,
circle->preview->style->black_gc,
circle->hue,
circle->satur);
rcm_draw_large_circle(circle->preview->window,
circle->preview->style->black_gc,
circle->gray_sat);
rcm_render_preview(Current.Bna->after,CURRENT);
}
void
rcm_set_gray_sat(GtkWidget *entry,
gpointer data)
{
RcmGray *circle=(RcmGray *) data;
circle->gray_sat = atof( gtk_entry_get_text( GTK_ENTRY(entry)));
if (circle->gray_sat>1)
circle->gray_sat = 1.0;
gtk_widget_draw(circle->preview,NULL);
rcm_draw_large_circle(circle->preview->window,
circle->preview->style->black_gc,
circle->gray_sat);
rcm_render_preview(Current.Bna->after,CURRENT);
}
void
rcm_draw_little_circle(GdkWindow *window,
GdkGC *color,
float hue,
float satur)
{
int x=GRAY_CENTER+GRAY_RADIUS*satur*cos(hue);
int y=GRAY_CENTER-GRAY_RADIUS*satur*sin(hue);
gdk_draw_arc (window,
color,
0,
x-LITTLE_RADIUS,
y-LITTLE_RADIUS,
2*LITTLE_RADIUS,
2*LITTLE_RADIUS,
0,
360*64);
}
int
R(float X) {
return X+.5;
}
void
rcm_draw_large_circle(GdkWindow *window,
GdkGC *color,
float gray_sat)
{
int x=GRAY_CENTER;
int y=GRAY_CENTER;
gdk_draw_arc (window,
color,
0,
R(x-GRAY_RADIUS*gray_sat),
R(y-GRAY_RADIUS*gray_sat),
R(2*GRAY_RADIUS*gray_sat),
R(2*GRAY_RADIUS*gray_sat),
0,
360*64);
}
void
rcm_draw_arrows(GdkWindow *window,
GdkGC *color,
RcmAngle *angle)
{
#define REL .8
#define DEL .1
#define TICK 10
int dist;
float alpha=angle->alpha;
float beta=angle->beta;
float cw_ccw=angle->cw_ccw;
float delta=angle_mod_2PI(beta-alpha);
if (cw_ccw==-1) delta = delta-TP;
gdk_draw_line(window,color,
CENTER,
CENTER,
R(CENTER+RADIUS*cos(alpha)),
R(CENTER-RADIUS*sin(alpha)));
gdk_draw_line(window,color,
CENTER+RADIUS*cos(alpha),
CENTER-RADIUS*sin(alpha),
R(CENTER+RADIUS*REL*cos(alpha-DEL)),
R(CENTER-RADIUS*REL*sin(alpha-DEL)));
gdk_draw_line(window,color,
CENTER+RADIUS*cos(alpha),
CENTER-RADIUS*sin(alpha),
R(CENTER+RADIUS*REL*cos(alpha+DEL)),
R(CENTER-RADIUS*REL*sin(alpha+DEL)));
gdk_draw_line(window,color,
CENTER,
CENTER,
R(CENTER+RADIUS*cos(beta)),
R(CENTER-RADIUS*sin(beta)));
gdk_draw_line(window,color,
CENTER+RADIUS*cos(beta),
CENTER-RADIUS*sin(beta),
R(CENTER+RADIUS*REL*cos(beta-DEL)),
R(CENTER-RADIUS*REL*sin(beta-DEL)));
gdk_draw_line(window,color,
CENTER+RADIUS*cos(beta),
CENTER-RADIUS*sin(beta),
R(CENTER+RADIUS*REL*cos(beta+DEL)),
R(CENTER-RADIUS*REL*sin(beta+DEL)));
dist = RADIUS*EACH_OR_BOTH;
gdk_draw_line(window,color,
CENTER + dist*cos(beta),
CENTER - dist*sin(beta),
R(CENTER + dist*cos(beta)+cw_ccw*TICK*sin(beta)),
R(CENTER - dist*sin(beta)+cw_ccw*TICK*cos(beta)));
/* gdk_draw_line(window,color,
CENTER + dist*cos(beta),
CENTER - dist*sin(beta),
R(CENTER + dist*cos(beta)+cw_ccw*TICK*sin(beta))+TICK,
R(CENTER - dist*sin(beta)+cw_ccw*TICK*cos(beta))+TICK);
*/
alpha *= 180*64/PI;
delta *= 180*64/PI;
gdk_draw_arc (window,
color,
0,
CENTER-dist,
CENTER-dist,
2*dist,
2*dist,
alpha,
delta);
}

View File

@ -1,998 +0,0 @@
#include "rcm.h"
GtkWidget *gray_preview;
extern RcmParams Current;
/********************************************************/
/*********************** Callbacks **********************/
/********************************************************/
void
rcm_close_callback (GtkWidget *widget,
gpointer data)
{
gtk_main_quit ();
}
void
rcm_ok_callback (GtkWidget *widget,
gpointer data)
{
gtk_widget_destroy (GTK_WIDGET (data));
Current.Success = 1;
}
void
rcm_preview_what(GtkWidget *button,
gpointer data)
{
if (!GTK_TOGGLE_BUTTON(button)->active)
return;
if (!strcmp(data, "Entire Image"))
Current.Slctn = ENTIRE_IMAGE;
else if (!strcmp(data, "Selection Only"))
Current.Slctn = SELECTION;
else if (!strcmp(data, "Selection In Context"))
Current.Slctn = SELECTION_IN_CONTEXT;
}
void
rcm_360_degrees (GtkWidget *button,
RcmCircle *circle)
{
circle->action_flag = DO_NOTHING;
gtk_widget_draw(circle->preview,NULL);
circle->angle->beta=circle->angle->alpha-circle->angle->cw_ccw*0.001;
rcm_draw_arrows(circle->preview->window,
circle->preview->style->black_gc,
circle->angle);
circle->action_flag = VIRGIN;
rcm_render_preview(Current.Bna->after,CURRENT);
}
void
rcm_cw_ccw (GtkWidget *button,
RcmCircle *circle)
{
circle->angle->cw_ccw *= -1;
pmg_set_xpm_in_button_label(circle->cw_ccw_xpm_button,
(circle->angle->cw_ccw>0)?
"/home/pavel/rcm/rcm_cw.xpm":
"/home/pavel/rcm/rcm_ccw.xpm");
gtk_label_set(GTK_LABEL(circle->cw_ccw_xpm_button->additional_label),
(circle->angle->cw_ccw>0)?
"Clockwise":
"C/Clockwise");
rcm_a_to_b (button, circle);
}
void
rcm_a_to_b (GtkWidget *button,
RcmCircle *circle)
{
circle->action_flag = DO_NOTHING;
gtk_widget_draw(circle->preview,NULL);
SWAP(circle->angle->alpha, circle->angle->beta);
rcm_draw_arrows(circle->preview->window,
circle->preview->style->black_gc,
circle->angle);
circle->action_flag = VIRGIN;
rcm_render_preview(Current.Bna->after, CURRENT);
}
void
rcm_preview_as_you_drag (GtkWidget *button,
gpointer *value)
{
if (GTK_TOGGLE_BUTTON(button)->active)
Current.RealTime = TRUE;
else
Current.RealTime = FALSE;
}
void
rcm_switch_to_degrees (GtkWidget *button,
gpointer *value)
{
if (GTK_TOGGLE_BUTTON(button)->active)
rcm_update_entries(Current.Units = DEGREES);
}
void
rcm_switch_to_radians (GtkWidget *button,
gpointer *value)
{
if (GTK_TOGGLE_BUTTON(button)->active)
rcm_update_entries(Current.Units = RADIANS);
}
void
rcm_switch_to_radians_over_PI (GtkWidget *button,
gpointer *value)
{
if (GTK_TOGGLE_BUTTON(button)->active)
rcm_update_entries(Current.Units = RADIANS_OVER_PI);
}
void rcm_switch_to_gray_to (GtkWidget *button,
gpointer *value)
{
if (!GTK_TOGGLE_BUTTON(button)->active) return;
Current.Gray_to_from=GRAY_TO;
rcm_render_preview(Current.Bna->after,CURRENT);
}
void rcm_switch_to_gray_from (GtkWidget *button,
gpointer *value)
{
if (!(GTK_TOGGLE_BUTTON(button)->active)) return;
Current.Gray_to_from=GRAY_FROM;
rcm_render_preview(Current.Bna->after,CURRENT);
}
void
rcm_change_preview()
{
gtk_preview_size (GTK_PREVIEW (Current.Bna->before),
Current.reduced->width,
Current.reduced->height);
gtk_preview_size (GTK_PREVIEW (Current.Bna->after),
Current.reduced->width,
Current.reduced->height);
rcm_render_preview(Current.Bna->before, ORIGINAL);
rcm_render_preview(Current.Bna->after, CURRENT);
/*
gtk_container_check_resize(GTK_CONTAINER(Current.Bna->bna_frame), NULL);
*/
gtk_widget_draw(Current.Bna->before,NULL);
gtk_widget_draw(Current.Bna->after,NULL);
}
void rcm_selection_in_context (GtkWidget *button,
gpointer *value)
{
Current.reduced = Reduce_The_Image(Current.drawable,
Current.mask,
MAX_PREVIEW_SIZE,
SELECTION_IN_CONTEXT);
rcm_change_preview();
}
void rcm_selection (GtkWidget *button,
gpointer *value)
{
Current.reduced = Reduce_The_Image(Current.drawable,Current.mask,
MAX_PREVIEW_SIZE,
SELECTION);
rcm_change_preview();
}
void rcm_entire_image (GtkWidget *button,
gpointer *value)
{
Current.reduced = Reduce_The_Image(Current.drawable,Current.mask,
MAX_PREVIEW_SIZE,
ENTIRE_IMAGE);
rcm_change_preview();
}
/********************************************************/
/********************* Build Helpers ********************/
/********************************************************/
GtkWidget *
rcm_label_in_a_table(GtkWidget *table,
guchar *string,
gint x_spot,
gint y_spot)
{
GtkWidget *label = gtk_label_new (string);
gtk_widget_show(label);
gtk_table_attach(GTK_TABLE(table),label,x_spot,x_spot+1,y_spot,y_spot+1,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND,
0,0);
return label;
}
GtkWidget *
rcm_button_in_a_table(GtkWidget *table,
guchar *string,
int x_spot,
int y_spot,
GtkSignalFunc *function,
gpointer *data)
{
GtkWidget *button = gtk_button_new_with_label (string);
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc)function,
data);
gtk_widget_show (button);
gtk_table_attach(GTK_TABLE(table), button,
x_spot, x_spot+1, y_spot, y_spot+1,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND,
0,0);
return button;
}
GtkWidget *
rcm_entry_in_a_table(GtkWidget *table,
float value,
gint x_spot,
gint y_spot,
GtkSignalFunc func,
gpointer data)
{
GtkWidget *entry=gtk_entry_new();
gtk_widget_show(entry);
gtk_widget_set_usize(GTK_WIDGET(entry),42,20);
rcm_float_in_an_entry(entry,value);
gtk_table_attach(GTK_TABLE(table),entry,x_spot,x_spot+1,y_spot,y_spot+1,
0,0,0,0);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
func, data);
return entry;
}
void
Check_Button_In_A_Box (GtkWidget *vbox,
guchar *label,
GtkSignalFunc function,
gpointer data,
gint clicked)
{
GtkWidget *button;
button = gtk_check_button_new_with_label(label);
gtk_box_pack_start (GTK_BOX(vbox),button, TRUE, TRUE, 0);
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (button), clicked);
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) function,
data);
gtk_widget_show(button);
}
GSList *
Button_In_A_Box (GtkWidget *vbox,
GSList *group,
guchar *label,
GtkSignalFunc function,
gpointer data,
int clicked)
{
GtkWidget *button;
button=gtk_radio_button_new_with_label(group,label);
gtk_widget_show(button);
gtk_box_pack_start (GTK_BOX(vbox),button, TRUE, TRUE, 0);
if (clicked)
gtk_button_clicked(GTK_BUTTON(button));
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) function,
data);
return gtk_radio_button_group(GTK_RADIO_BUTTON(button));
}
/********************************************************/
/********************* The 3 Frames *********************/
/********************************************************/
GtkWidget *
rcm_create_bna()
{
GtkWidget *frame, *blabel, *alabel, *bframe, *aframe, *table;
Create_A_Preview(&Current.Bna->before,
&bframe,
Current.reduced->width,
Current.reduced->height,
1);
Create_A_Preview(&Current.Bna->after,
&aframe,
Current.reduced->width,
Current.reduced->height,
1);
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width (GTK_CONTAINER (frame), 5);
/* All the previews */
alabel = gtk_label_new("Rotated:");
gtk_widget_show(alabel);
blabel = gtk_label_new("Original:");
gtk_widget_show(blabel);
table = gtk_table_new(4,1,FALSE);
gtk_container_border_width(GTK_CONTAINER(table),10);
gtk_table_set_row_spacings(GTK_TABLE(table),0);
gtk_table_set_col_spacings(GTK_TABLE(table),20);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_table_attach(GTK_TABLE(table), blabel, 0, 1, 0, 1,
0,
GTK_EXPAND|GTK_FILL,
0,0);
gtk_table_attach(GTK_TABLE(table),bframe,0,1,1,2,
GTK_EXPAND,
GTK_EXPAND,
0,0);
gtk_table_attach(GTK_TABLE(table),alabel,0,1,2,3,
0,
GTK_EXPAND|GTK_FILL,
0,0);
gtk_table_attach(GTK_TABLE(table),aframe,0,1,3,4,
GTK_EXPAND,
GTK_EXPAND,
0,0);
gtk_widget_show(table);
gtk_widget_show (frame);
return frame;
}
RcmGray *
rcm_create_gray()
{
GtkWidget *frame, *preview, *as_or_to_frame;
GtkWidget *table, *previewframe, *legend_table;
GtkWidget *gray_sat_frame;
GSList *group = NULL;
RcmGray *st = g_new(RcmGray,1);
st->hue = 0;
st->satur = 0;
st->action_flag = VIRGIN;
st->frame = frame = gtk_frame_new("Gray");
gtk_widget_show(frame);
{
GtkWidget *label, *table, *entry;
gray_sat_frame = gtk_frame_new("What is Gray?");
gtk_container_border_width (GTK_CONTAINER (gray_sat_frame), 10);
gtk_widget_show(gray_sat_frame);
table = gtk_table_new(1, 3, FALSE);
gtk_widget_show(table);
label = gtk_label_new("Sat <=");
gtk_widget_show(label);
st->gray_sat_entry = entry = gtk_entry_new();
gtk_widget_show(entry);
gtk_widget_set_usize(GTK_WIDGET(entry),42,20);
rcm_float_in_an_entry(entry,st->gray_sat = INITIAL_GRAY_SAT);
gtk_signal_connect(GTK_OBJECT(entry), "changed",
(GtkSignalFunc)rcm_set_gray_sat,
st);
gtk_table_attach(GTK_TABLE(table), label,
0, 1, 0, 1,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND,
0,0);
gtk_table_attach(GTK_TABLE(table), entry,
1, 2, 0, 1,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND,
5,0);
gtk_container_add(GTK_CONTAINER(gray_sat_frame), table);
}
{
previewframe = gtk_frame_new(NULL);
gtk_container_border_width (GTK_CONTAINER(previewframe),5);
gtk_widget_show(previewframe);
st->preview = preview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (preview), GRAY_SUM, GRAY_SUM);
gtk_widget_show(preview);
gtk_container_add(GTK_CONTAINER(previewframe), preview);
gtk_widget_set_events(preview,RANGE_ADJUST_MASK);
gtk_signal_connect_after(GTK_OBJECT(preview),"expose_event",
(GtkSignalFunc) rcm_gray_expose_event ,
st);
gtk_signal_connect(GTK_OBJECT(preview),"button_press_event",
(GtkSignalFunc) rcm_gray_button_press_event,
st);
gtk_signal_connect(GTK_OBJECT(preview),"button_release_event",
(GtkSignalFunc) rcm_gray_release_event,
st);
gtk_signal_connect(GTK_OBJECT(preview),"motion_notify_event",
(GtkSignalFunc) rcm_gray_motion_notify_event,
st);
}
{
legend_table = gtk_table_new(1,5,FALSE);
gtk_widget_show(legend_table);
gtk_container_border_width (GTK_CONTAINER (legend_table), 5);
rcm_label_in_a_table(legend_table,"H:",0,0);
st->hue_entry = rcm_entry_in_a_table(legend_table,
st->hue,1,0,
(GtkSignalFunc) rcm_set_hue,
st);
st->hue_units_label=
rcm_label_in_a_table(legend_table,
rcm_units_string(Current.Units),2,0);
rcm_label_in_a_table(legend_table," S:",3,0);
st->satur_entry=rcm_entry_in_a_table(legend_table,
st->satur,4,0,
(GtkSignalFunc) rcm_set_satur,
st);
}
{
GtkWidget *box;
as_or_to_frame = gtk_frame_new(NULL);
gtk_container_border_width (GTK_CONTAINER (as_or_to_frame), 10);
gtk_widget_show(as_or_to_frame);
box = gtk_vbox_new(FALSE, 3);
gtk_container_add(GTK_CONTAINER(as_or_to_frame), box);
gtk_container_border_width(GTK_CONTAINER(box),5);
gtk_widget_show(box);
group = Button_In_A_Box (box, group,
"Treat As This",
(GtkSignalFunc) rcm_switch_to_gray_from,
&(Current.Gray_to_from),
Current.Gray_to_from == GRAY_FROM);
group = Button_In_A_Box (box, group,
"Change To This",
(GtkSignalFunc) rcm_switch_to_gray_to,
&(Current.Gray_to_from),
Current.Gray_to_from == GRAY_TO);
}
{
GtkWidget *mini_frame, *mini_table;
mini_frame = gtk_frame_new(NULL);
gtk_container_border_width (GTK_CONTAINER (mini_frame), 10);
gtk_widget_show(mini_frame);
mini_table = gtk_table_new(2,1,FALSE);
gtk_widget_show(mini_table);
gtk_container_add(GTK_CONTAINER(mini_frame), mini_table);
gtk_table_attach(GTK_TABLE(mini_table), previewframe, 0,1,0,1,
GTK_EXPAND,
GTK_EXPAND,
0,0);
gtk_table_attach(GTK_TABLE(mini_table), legend_table, 0,1,1,2,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND|GTK_FILL,
0,0);
table = gtk_table_new(2, 2, FALSE);
gtk_widget_show(table);
gtk_table_attach(GTK_TABLE(table), mini_frame,
0, 1, 0, 2,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND|GTK_FILL,
0,0);
gtk_table_attach(GTK_TABLE(table), as_or_to_frame,
1, 2, 0, 1,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND|GTK_FILL,
0,0);
gtk_table_attach(GTK_TABLE(table), gray_sat_frame,
1, 2, 1, 2,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND|GTK_FILL,
0, 0);
}
gtk_container_add(GTK_CONTAINER(frame), table);
rcm_render_circle_preview(preview, GRAY_SUM, GRAY_MARGIN);
return st;
}
GtkWidget *
rcm_create_misc()
{
GtkWidget *frame, *label,*table;
GtkWidget *units_frame, *units_vbox;
GtkWidget *misc_frame, *misc_vbox;
GSList *group = NULL;
Current.Gray = rcm_create_gray();
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width (GTK_CONTAINER (frame), 5);
/* All the previews */
units_frame = gtk_frame_new("Units");
gtk_widget_show(units_frame);
units_vbox=gtk_vbox_new(3, FALSE);
gtk_container_add(GTK_CONTAINER(units_frame), units_vbox);
gtk_container_border_width(GTK_CONTAINER(units_vbox), 5);
gtk_widget_show(units_vbox);
group = Button_In_A_Box (units_vbox,
group,
"Radians",
(GtkSignalFunc) rcm_switch_to_radians,
NULL,
Current.Units==RADIANS);
group = Button_In_A_Box (units_vbox,
group,
"Radiand/PI",
(GtkSignalFunc) rcm_switch_to_radians_over_PI,
NULL,
Current.Units==RADIANS_OVER_PI);
group = Button_In_A_Box (units_vbox,
group,
"Degrees",
(GtkSignalFunc) rcm_switch_to_degrees,
NULL,
Current.Units==DEGREES);
misc_frame = gtk_frame_new("Very Misc");
misc_vbox = gtk_vbox_new(FALSE, 5);
gtk_container_add(GTK_CONTAINER(misc_frame), misc_vbox);
gtk_widget_show(misc_frame);
gtk_widget_show(misc_vbox);
Check_Button_In_A_Box (misc_vbox, "Preview as you Drag",
(GtkSignalFunc) rcm_preview_as_you_drag,
&(Current.RealTime),
Current.RealTime);
{
GSList *group = NULL;
GtkWidget *item, *menu, *root, *hbox;
hbox = gtk_hbox_new(FALSE,3);
gtk_widget_show(hbox);
gtk_box_pack_start (GTK_BOX(misc_vbox),hbox, TRUE, TRUE, 5);
label = gtk_label_new("Preview");
gtk_widget_show(label);
gtk_box_pack_start (GTK_BOX(hbox),label, FALSE, FALSE, 3);
menu = gtk_menu_new();
item =gtk_radio_menu_item_new_with_label(group,"Entire Image");
group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
gtk_menu_append(GTK_MENU (menu), item);
gtk_widget_show(item);
gtk_signal_connect (GTK_OBJECT (item), "activate",
(GtkSignalFunc) rcm_entire_image,
NULL);
item = gtk_radio_menu_item_new_with_label(group,"Selection");
group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
gtk_menu_append(GTK_MENU (menu), item);
gtk_widget_show(item);
gtk_signal_connect (GTK_OBJECT (item), "activate",
(GtkSignalFunc) rcm_selection,
NULL);
item = gtk_radio_menu_item_new_with_label(group,"Context");
group = gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (item));
gtk_widget_show(item);
gtk_menu_append(GTK_MENU (menu), item);
gtk_signal_connect (GTK_OBJECT (item), "activate",
(GtkSignalFunc) rcm_selection_in_context,
NULL);
root = gtk_option_menu_new ();
gtk_option_menu_set_menu (GTK_OPTION_MENU (root), menu);
gtk_option_menu_set_history (GTK_OPTION_MENU (root), 4);
gtk_widget_show(root);
gtk_box_pack_start (GTK_BOX(hbox), root, FALSE, FALSE, 0);
}
table = gtk_table_new(2,2,FALSE);
gtk_widget_show(table);
gtk_container_border_width(GTK_CONTAINER(table),0);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_table_attach(GTK_TABLE(table), Current.Gray->frame,
0, 1, 0, 2,
GTK_EXPAND|GTK_FILL,
GTK_FILL,
5, 3);
gtk_table_attach(GTK_TABLE(table), misc_frame,
1, 2, 0, 1,
GTK_EXPAND|GTK_FILL,
GTK_FILL,
5, 3);
gtk_table_attach(GTK_TABLE(table), units_frame,
1, 2, 1, 2,
GTK_EXPAND|GTK_FILL,
GTK_FILL,
5, 3);
gtk_widget_show (frame);
return frame;
}
GtkWidget *
rcm_create_from_to()
{
GtkWidget *frame, *blabel, *alabel, *table;
Current.From = rcm_create_square_preview(SUM, "From:");
Current.To = rcm_create_square_preview(SUM, "To:");
frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
gtk_container_border_width (GTK_CONTAINER (frame), 5);
/* All the previews */
alabel = gtk_label_new("To:");
gtk_widget_show(alabel);
/* gtk_misc_set_alignment(GTK_MISC(alabel), 0.0, 0.5); */
blabel=gtk_label_new("From:");
gtk_widget_show(blabel);
/* gtk_misc_set_alignment(GTK_MISC(blabel), 0.0, 0.5); */
table = gtk_table_new(3,2,FALSE);
gtk_container_border_width(GTK_CONTAINER(table),10);
gtk_container_add (GTK_CONTAINER (frame), table);
gtk_table_attach(GTK_TABLE(table),Current.From->table,0,1,0,1,
GTK_EXPAND,
GTK_EXPAND,
0,0);
gtk_table_attach(GTK_TABLE(table),Current.To->table,0,1,1,2,
GTK_EXPAND,
GTK_EXPAND,
0,0);
gtk_widget_show(table);
gtk_widget_show (frame);
return frame;
}
void
Create_A_Preview (GtkWidget **preview,
GtkWidget **frame,
int previewWidth,
int previewHeight,
int colorfulness)
{
*frame = gtk_frame_new(NULL);
gtk_frame_set_shadow_type (GTK_FRAME (*frame), GTK_SHADOW_IN);
gtk_container_border_width (GTK_CONTAINER(*frame),0);
gtk_widget_show(*frame);
*preview = gtk_preview_new (colorfulness?GTK_PREVIEW_COLOR
:GTK_PREVIEW_GRAYSCALE);
gtk_preview_size (GTK_PREVIEW (*preview), previewWidth, previewHeight);
gtk_widget_show(*preview);
gtk_container_add(GTK_CONTAINER(*frame),*preview);
}
RcmCircle *
rcm_create_square_preview(gint height,
gchar *label_content)
{
GtkWidget *label, *frame, *button_table, *legend_table;
RcmCircle *st = g_new(RcmCircle, 1);
st->action_flag = VIRGIN;
st->angle = g_new(RcmAngle,1);
st->angle->alpha = INITIAL_ALPHA;
st->angle->beta = INITIAL_BETA;
st->angle->cw_ccw = 1;
frame = gtk_frame_new(NULL);
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
gtk_container_border_width (GTK_CONTAINER(frame),0);
gtk_widget_show(frame);
st->preview = gtk_preview_new (GTK_PREVIEW_COLOR);
gtk_preview_size (GTK_PREVIEW (st->preview),height,height);
gtk_widget_show(st->preview);
gtk_container_add(GTK_CONTAINER(frame),st->preview);
gtk_widget_set_events(st->preview,RANGE_ADJUST_MASK);
gtk_signal_connect_after(GTK_OBJECT(st->preview),"expose_event",
(GtkSignalFunc) rcm_expose_event ,
st);
gtk_signal_connect(GTK_OBJECT(st->preview),"button_press_event",
(GtkSignalFunc) rcm_button_press_event,
st);
gtk_signal_connect(GTK_OBJECT(st->preview),"button_release_event",
(GtkSignalFunc) rcm_release_event,
st);
gtk_signal_connect(GTK_OBJECT(st->preview),"motion_notify_event",
(GtkSignalFunc) rcm_motion_notify_event,
st);
rcm_render_circle_preview(st->preview,SUM,MARGIN);
label = gtk_label_new(label_content);
gtk_widget_show(label);
{
PmgButtonLabelXpm *xpm_button;
button_table = gtk_table_new(3,1,FALSE);
gtk_widget_show(button_table);
st->cw_ccw_xpm_button =
xpm_button = pmg_button_label_xpm_new(gtk_window_new(0),
(st->angle->cw_ccw > 0)?
RCM_XPM_DIR"rcm_cw.xpm":
RCM_XPM_DIR"rcm_ccw.xpm",
"Switch To",
(st->angle->cw_ccw>0)?
"Clockwise":
"C/Clockwise",
'h',
(GtkSignalFunc *) rcm_cw_ccw,
(gpointer) st);
gtk_table_attach(GTK_TABLE(button_table), xpm_button->button,
0,1,0,1,
GTK_EXPAND|GTK_FILL,
GTK_FILL,
5,2);
xpm_button = pmg_button_label_xpm_new(gtk_window_new(0),
RCM_XPM_DIR"rcm_a_b.xpm",
"Switch Order",
"Of Arrows",
'h',
(GtkSignalFunc *) rcm_a_to_b,
(gpointer) st);
gtk_table_attach(GTK_TABLE(button_table), xpm_button->button,
0,1,1,2,
GTK_EXPAND|GTK_FILL,
GTK_FILL,
5,2);
xpm_button = pmg_button_label_xpm_new(gtk_window_new(0),
RCM_XPM_DIR"rcm_360.xpm",
"Select The",
"Entire Range",
'h',
(GtkSignalFunc *) rcm_360_degrees,
(gpointer) st);
gtk_table_attach(GTK_TABLE(button_table), xpm_button->button,
0,1,2,3,
GTK_EXPAND|GTK_FILL,
GTK_FILL,
5,2);
}
legend_table = gtk_table_new(1, 6, FALSE);
gtk_widget_show(legend_table);
rcm_label_in_a_table(legend_table,"From ",0,0);
st->alpha_entry =
rcm_entry_in_a_table(legend_table,
st->angle->alpha*
rcm_units_factor(Current.Units),
1,0,
(GtkSignalFunc) rcm_set_alpha,
st)
;
st->alpha_units_label =
rcm_label_in_a_table(legend_table,
rcm_units_string(Current.Units),2,0);
rcm_label_in_a_table(legend_table," to ",3,0);
st->beta_entry =
rcm_entry_in_a_table(legend_table,
st->angle->beta*
rcm_units_factor(Current.Units),
4,0,
(GtkSignalFunc) rcm_set_beta,
st);
st->beta_units_label=
rcm_label_in_a_table(legend_table,
rcm_units_string(Current.Units),5,0);
st->table= gtk_table_new(3,2,FALSE);
gtk_widget_show(st->table);
gtk_table_attach(GTK_TABLE(st->table),label,0,1,0,1,
0,
GTK_EXPAND|GTK_FILL,
0,0);
gtk_table_attach(GTK_TABLE(st->table),frame,0,1,1,2,
0,
GTK_EXPAND,
0,0);
gtk_table_attach(GTK_TABLE(st->table),button_table,1,2,1,2,
0,
GTK_EXPAND,
0,0);
gtk_table_attach(GTK_TABLE(st->table),legend_table,0,1,2,3,
0,
GTK_EXPAND|GTK_FILL,
0,10);
return st;
}
/***********************************************************/
/******************** MAIN DIALOG ************************/
/***********************************************************/
gint
rcm_dialog()
{
GtkWidget *table, *dlg, *circles, *bna, *misc;
GtkWidget *OKbutton, *CANCELbutton;
GtkWidget *buttonTable;
guchar *color_cube;
gchar **argv;
gint argc;
argc = 1;
argv = g_new (gchar *, 1);
argv[0] = g_strdup ("rcm");
gtk_init (&argc, &argv);
gtk_rc_parse (gimp_gtkrc ());
Current.Bna = g_new(RcmBna, 1);
gtk_preview_set_gamma (gimp_gamma ());
gtk_preview_set_install_cmap (gimp_install_cmap ());
color_cube = gimp_color_cube ();
gtk_preview_set_color_cube (color_cube[0], color_cube[1],
color_cube[2], color_cube[3]);
gtk_widget_set_default_visual(gtk_preview_get_visual());
gtk_widget_set_default_colormap(gtk_preview_get_cmap());
Current.Bna->dlg = dlg = gtk_dialog_new ();
gtk_window_set_title (GTK_WINDOW (dlg), "Colormap Rotation");
gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
(GtkSignalFunc) rcm_close_callback,
NULL);
OKbutton = gtk_button_new_with_label ("OK");
GTK_WIDGET_SET_FLAGS (OKbutton, GTK_CAN_DEFAULT);
gtk_signal_connect(GTK_OBJECT (OKbutton), "clicked",
(GtkSignalFunc) rcm_ok_callback,
dlg);
gtk_widget_grab_default (OKbutton);
gtk_widget_show (OKbutton);
CANCELbutton = gtk_button_new_with_label ("Cancel");
GTK_WIDGET_SET_FLAGS (CANCELbutton, GTK_CAN_DEFAULT);
gtk_signal_connect_object (GTK_OBJECT (CANCELbutton), "clicked",
(GtkSignalFunc) gtk_widget_destroy,
GTK_OBJECT (dlg));
gtk_widget_show (CANCELbutton);
buttonTable = gtk_table_new(1,4,TRUE);
gtk_container_border_width(GTK_CONTAINER(buttonTable),0);
gtk_table_set_col_spacings(GTK_TABLE(buttonTable),3);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->action_area),
buttonTable,
TRUE, TRUE, 0);
gtk_table_attach( GTK_TABLE(buttonTable), OKbutton,1,2,0,1,
GTK_FILL|GTK_EXPAND, 0,
0, 0);
gtk_table_attach( GTK_TABLE(buttonTable), CANCELbutton,2,3,0,1,
GTK_FILL|GTK_EXPAND, 0,
0, 0);
gtk_widget_show (buttonTable);
/*************************************************************/
Current.reduced = Reduce_The_Image(Current.drawable,
Current.mask,
MAX_PREVIEW_SIZE,
ENTIRE_IMAGE);
circles = rcm_create_from_to();
Current.Bna->bna_frame = bna = rcm_create_bna();
misc = rcm_create_misc();
rcm_render_preview(Current.Bna->before, ORIGINAL);
rcm_render_preview(Current.Bna->after, CURRENT);
{
GtkWidget *notebook;
notebook = gtk_notebook_new();
gtk_container_border_width(GTK_CONTAINER(notebook), 10);
gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox),
notebook, TRUE, TRUE, 0);
gtk_widget_show (notebook);
table = gtk_table_new(1, 2, FALSE);
gtk_widget_show(table);
gtk_table_attach(GTK_TABLE(table),
bna, 0, 1, 0, 1,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND|GTK_FILL,
5, 0);
gtk_table_attach(GTK_TABLE(table),
circles, 1, 2, 0, 1,
GTK_EXPAND|GTK_FILL,
GTK_EXPAND|GTK_FILL,
5, 0);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), table,
gtk_label_new(" Main "));
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), misc,
gtk_label_new(" Misc "));
}
gtk_widget_show(dlg);
gdk_flush ();
gtk_main ();
return Current.Success;
}

View File

@ -1,93 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "libgimp/gimp.h"
#include "rcm_hsv.h"
void rgb_to_hsv (hsv r,
hsv g,
hsv b,
hsv *h,
hsv *s,
hsv *l)
{
hsv v;
hsv m;
hsv vm;
hsv r2, g2, b2;
v = MAX(r,g);
v = MAX(v,b);
m = MIN(r,g);
m = MIN(m,b);
if ((*l = (m + v) / 2.0) <= 0.0)
{
*s=*h=0;
return;
}
if ((*s = vm = v - m) > 0.0)
{
*s /= (*l <= 0.5) ? (v + m ) :
(2.0 - v - m) ;
}
else
{
*h=0;
return;
}
r2 = (v - r) / vm;
g2 = (v - g) / vm;
b2 = (v - b) / vm;
if (r == v)
*h = (g == m ? 5.0 + b2 : 1.0 - g2);
else if (g == v)
*h = (b == m ? 1.0 + r2 : 3.0 - b2);
else
*h = (r == m ? 3.0 + g2 : 5.0 - r2);
*h /= 6;
}
void hsv_to_rgb (hsv h,
hsv sl,
hsv l,
hsv *r,
hsv *g,
hsv *b)
{
hsv v;
v = (l <= 0.5) ? (l * (1.0 + sl)) : (l + sl - l * sl);
if (v <= 0)
{
*r = *g = *b = 0.0;
}
else
{
hsv m;
hsv sv;
gint sextant;
hsv fract, vsf, mid1, mid2;
m = l + l - v;
sv = (v - m ) / v;
h *= 6.0;
sextant = h;
fract = h - sextant;
vsf = v * sv * fract;
mid1 = m + vsf;
mid2 = v - vsf;
switch (sextant)
{
case 0: *r = v; *g = mid1; *b = m; break;
case 1: *r = mid2; *g = v; *b = m; break;
case 2: *r = m; *g = v; *b = mid1; break;
case 3: *r = m; *g = mid2; *b = v; break;
case 4: *r = mid1; *g = m; *b = v; break;
case 5: *r = v; *g = m; *b = mid2; break;
}
}
}

View File

@ -1,20 +0,0 @@
#ifndef __RCM_HSV__
#define __RCM_HSV__
typedef double hsv;
void rgb_to_hsv (hsv r,
hsv g,
hsv b,
hsv *h,
hsv *s,
hsv *l);
void hsv_to_rgb (hsv h,
hsv sl,
hsv l,
hsv *r,
hsv *g,
hsv *b);
#endif

View File

@ -1,439 +0,0 @@
#include "rcm.h"
extern RcmParams Current;
float arctg(float y, float x)
{
float temp=atan2(y,x);
return (temp<0)?(temp+TP):temp;
}
float sign(float x)
{
return (x<0)?(-1):(1);
}
float rcm_linear(float A,
float B,
float C,
float D,
float x)
{
if (B > A)
if (A<=x && x<=B)
return C+(D-C)/(B-A)*(x-A);
else if (A<=x+TP && x+TP<=B)
return C+(D-C)/(B-A)*(x+TP-A);
else
return x;
else
if (B<=x && x<=A)
return C+(D-C)/(B-A)*(x-A);
else if (B<=x+TP && x+TP<=A)
return C+(D-C)/(B-A)*(x+TP-A);
else
return x;
}
float rcm_left_end(RcmAngle *angle)
{
gfloat alpha = angle->alpha;
gfloat beta = angle->beta;
gint cw_ccw = angle->cw_ccw;
switch (cw_ccw) {
case (-1): if (alpha < beta) return alpha + TP;
case 1: default: return alpha;
}
}
float rcm_right_end(RcmAngle *angle)
{
gfloat alpha = angle->alpha;
gfloat beta = angle->beta;
gint cw_ccw = angle->cw_ccw;
switch (cw_ccw) {
case 1: if (beta < alpha) return beta + TP;
case (-1): default: return beta;
}
}
float min_prox(float alpha,
float beta,
float angle)
{
gfloat temp1 = MIN(angle_mod_2PI(alpha - angle),
TP-angle_mod_2PI(alpha - angle));
gfloat temp2 = MIN(angle_mod_2PI(beta - angle),
TP-angle_mod_2PI(beta - angle));
return MIN(temp1,temp2);
}
float *closest(float *alpha, float *beta, float angle)
{
float temp_alpha = MIN(angle_mod_2PI(*alpha-angle),
TP-angle_mod_2PI(*alpha-angle));
float temp_beta = MIN(angle_mod_2PI(*beta -angle),
TP-angle_mod_2PI(*beta -angle));
if (temp_alpha-temp_beta<0)
return alpha;
else
return beta;
}
float angle_mod_2PI(float angle)
{
if (angle < 0)
return angle + TP;
else if (angle > TP)
return angle - TP;
else
return angle;
}
float beta_from_0_to_2PI(float alpha, float delta)
{
float beta = alpha + delta;
if (delta > 0)
return (beta < 2*PI) ? beta : beta - 2*PI;
else
return (beta > 0) ? beta : beta + 2*PI;
}
float
angle_inside_slice(float angle,
RcmAngle *slice)
{
return angle_mod_2PI(slice->cw_ccw*(slice->beta-angle))/
angle_mod_2PI(slice->cw_ccw*(slice->beta-slice->alpha));
}
float
rcm_units_factor(gint units)
{
switch (units) {
case DEGREES: return 180.0/PI;
case RADIANS: return 1.0;
case RADIANS_OVER_PI: return 1.0/PI;
default: return -1;
}
}
gchar *
rcm_units_string(gint units)
{
switch (units) {
case DEGREES: return " °";
case RADIANS: return " Rad";
case RADIANS_OVER_PI: return " \227";
default: return "Error";
}
}
gint
rcm_is_gray(float s)
{
if (s <= Current.Gray->gray_sat)
return 1;
else
return 0;
}
void
rcm_update_entries(gint units)
{
Current.From->action_flag = DO_NOTHING;
Current.To->action_flag = DO_NOTHING;
Current.Gray->action_flag = DO_NOTHING;
rcm_float_in_an_entry(Current.From->alpha_entry,
Current.From->angle->alpha*
rcm_units_factor(Current.Units));
rcm_float_in_an_entry(Current.From->beta_entry,
Current.From->angle->beta*
rcm_units_factor(Current.Units));
rcm_float_in_an_entry(Current.To->alpha_entry,
Current.To->angle->alpha*
rcm_units_factor(Current.Units));
rcm_float_in_an_entry(Current.To->beta_entry,
Current.To->angle->beta*
rcm_units_factor(Current.Units));
rcm_float_in_an_entry(Current.Gray->hue_entry,
Current.Gray->hue*
rcm_units_factor(Current.Units));
gtk_label_set(GTK_LABEL(Current.From->alpha_units_label),
rcm_units_string(Current.Units));
gtk_label_set(GTK_LABEL(Current.From->beta_units_label),
rcm_units_string(Current.Units));
gtk_label_set(GTK_LABEL(Current.To->alpha_units_label),
rcm_units_string(Current.Units));
gtk_label_set(GTK_LABEL(Current.To->beta_units_label),
rcm_units_string(Current.Units));
gtk_label_set(GTK_LABEL(Current.Gray->hue_units_label),
rcm_units_string(Current.Units));
Current.From->action_flag = VIRGIN;
Current.To->action_flag = VIRGIN;
Current.Gray->action_flag = VIRGIN;
}
ReducedImage *
Reduce_The_Image(GDrawable *drawable,
GDrawable *mask,
gint LongerSize,
gint Slctn)
{
gint RH, RW, width, height, bytes=drawable->bpp;
ReducedImage *temp = g_new(ReducedImage, 1);
guchar *tempRGB, *src_row, *tempmask, *src_mask_row,R,G,B;
gint i, j, whichcol, whichrow, x1, x2, y1, y2;
GPixelRgn srcPR, srcMask;
gint NoSelectionMade=TRUE;
hsv *tempHSV, H, S, V;
gimp_drawable_mask_bounds (drawable->id, &x1, &y1, &x2, &y2);
width = x2-x1;
height = y2-y1;
if (width != drawable->width && height != drawable->height)
NoSelectionMade=FALSE;
if (Slctn==ENTIRE_IMAGE) {
x1=0;
x2=drawable->width;
y1=0;
y2=drawable->height;
}
if (Slctn==SELECTION_IN_CONTEXT) {
x1=MAX(0, x1-width/2.0);
x2=MIN(drawable->width, x2+width/2.0);
y1=MAX(0, y1-height/2.0);
y2=MIN(drawable->height, y2+height/2.0);
}
width = x2-x1;
height = y2-y1;
if (width>height) {
RW=LongerSize;
RH=(float) height * (float) LongerSize/ (float) width;
}
else {
RH=LongerSize;
RW=(float)width * (float) LongerSize/ (float) height;
}
tempRGB = (guchar *) malloc(RW*RH*bytes);
tempHSV = (hsv *) malloc(RW*RH*bytes*sizeof(hsv));
tempmask = (guchar *) malloc(RW*RH);
gimp_pixel_rgn_init (&srcPR, drawable, x1, y1, width, height, FALSE, FALSE);
gimp_pixel_rgn_init (&srcMask, mask, x1, y1, width, height, FALSE, FALSE);
src_row = (guchar *) malloc (width*bytes);
src_mask_row = (guchar *) malloc (width*bytes);
for (i=0; i<RH; i++) {
whichrow=(float)i*(float)height/(float)RH;
gimp_pixel_rgn_get_row (&srcPR, src_row, x1, y1+whichrow, width);
gimp_pixel_rgn_get_row (&srcMask, src_mask_row, x1, y1+whichrow, width);
for (j=0; j<RW; j++) {
whichcol=(float)j*(float)width/(float)RW;
if (NoSelectionMade)
tempmask[i*RW+j]=255;
else
tempmask[i*RW+j]=src_mask_row[whichcol];
R=src_row[whichcol*bytes+0];
G=src_row[whichcol*bytes+1];
B=src_row[whichcol*bytes+2];
rgb_to_hsv(R/255.0,G/255.0,B/255.0,&H,&S,&V);
tempRGB[i*RW*bytes+j*bytes+0]=R;
tempRGB[i*RW*bytes+j*bytes+1]=G;
tempRGB[i*RW*bytes+j*bytes+2]=B;
tempHSV[i*RW*bytes+j*bytes+0]=H;
tempHSV[i*RW*bytes+j*bytes+1]=S;
tempHSV[i*RW*bytes+j*bytes+2]=V;
if (bytes==4)
tempRGB[i*RW*bytes+j*bytes+3]=src_row[whichcol*bytes+3];
}
}
temp->width=RW;
temp->height=RH;
temp->rgb=tempRGB;
temp->hsv=tempHSV;
temp->mask=tempmask;
return temp;
}
void
rcm_render_circle_preview(GtkWidget *preview,
int sum,
int margin)
{
gint i, j;
hsv h, s, v, r, g, b;
guchar *a =(guchar *) malloc(3*sum);
if (preview==NULL) return;
for (j=0; j<sum; j++) {
for (i=0; i<sum; i++) {
if (( s=sqrt((sqr(i-sum/2.0) +
sqr(j-sum/2.0))/
(float)sqr(sum/2.0-margin)))>1) {
a[i*3+0] = 255;
a[i*3+1] = 255;
a[i*3+2] = 255;
}
else {
h=arctg(sum/2.0-j,i-sum/2.0)/(2*PI);
v=1-sqrt(s)/2;
hsv_to_rgb(h,s,v, &r, &g, &b);
a[i*3+0] = r*255;
a[i*3+1] = g*255;
a[i*3+2] = b*255;
}
}
gtk_preview_draw_row( GTK_PREVIEW(preview),a,0,j,sum);
}
free(a);
gtk_widget_draw(preview,NULL);
gdk_flush();
}
void
rcm_render_preview(GtkWidget *preview,
gint version)
{
guchar *a;
ReducedImage *reduced = Current.reduced;
gint RW = reduced->width;
gint RH = reduced->height;
gint bytes = Current.drawable->bpp;
gint i, j, k, unchanged, skip;
hsv H, S, V, R, G, B;
hsv *hsv_array = reduced->hsv;
guchar *rgb_array = reduced->rgb;
float degree;
a =(guchar *) malloc(bytes*RW);
if (preview==NULL) {
printf("Asked to preview a NULL! Shouldn't happen!\n");
return;
}
if (version==CURRENT)
for (i=0; i<RH; i++) {
for (j=0; j<RW; j++) {
unchanged = 1; skip = 0;
H = hsv_array[i*RW*bytes + j*bytes + 0];
S = hsv_array[i*RW*bytes + j*bytes + 1];
V = hsv_array[i*RW*bytes + j*bytes + 2];
if (rcm_is_gray(S)&&reduced->mask[i*RW+j]!=0)
switch (Current.Gray_to_from) {
case GRAY_FROM:
if (angle_inside_slice(Current.Gray->hue,
Current.From->angle)<=1)
{
H = Current.Gray->hue/TP;
S = Current.Gray->satur;
}
else
skip = 1;
break;
case GRAY_TO:
unchanged = 0; skip = 1;
hsv_to_rgb(Current.Gray->hue/TP,
Current.Gray->satur,
V,
&R,&G,&B);
break;
default: break;
}
if (!skip) {
unchanged = 0;
H = rcm_linear(rcm_left_end(Current.From->angle),
rcm_right_end(Current.From->angle),
rcm_left_end(Current.To->angle),
rcm_right_end(Current.To->angle),
H*TP);
H = angle_mod_2PI(H)/TP;
hsv_to_rgb(H,S,V,&R,&G,&B);
}
if (unchanged)
degree=0;
else
degree=reduced->mask[i*RW+j]/255.0;
a[j*3+0]=(1-degree)*rgb_array[i*RW*bytes+j*bytes+0]+degree*R*255;
a[j*3+1]=(1-degree)*rgb_array[i*RW*bytes+j*bytes+1]+degree*G*255;
a[j*3+2]=(1-degree)*rgb_array[i*RW*bytes+j*bytes+2]+degree*B*255;
if (bytes==4)
for (k=0; k<3; k++) {
float transp=reduced->mask[i*RW*bytes+j*bytes+3]/255.0;
a[3*j+k]=transp*a[3*j+k]+(1-transp)*rcm_fake_transparency(i,j);
}
}
gtk_preview_draw_row( GTK_PREVIEW(preview),a,0,i,RW);
}
else
for (i = 0; i < RH; i++) {
for (j = 0; j < RW; j++) {
a[j*3+0] = rgb_array[i*RW*bytes + j*bytes + 0];
a[j*3+1] = rgb_array[i*RW*bytes + j*bytes + 1];
a[j*3+2] = rgb_array[i*RW*bytes + j*bytes + 2];
if (bytes==4)
for (k=0; k<3; k++) {
float transp=rgb_array[i*RW*bytes+j*bytes+3]/255.0;
a[3*j+k]=transp*a[3*j+k]+(1-transp)*rcm_fake_transparency(i,j);
}
}
gtk_preview_draw_row( GTK_PREVIEW(preview),a,0,i,RW);
}
free(a);
gtk_widget_draw(preview,NULL);
gdk_flush();
}
gint rcm_fake_transparency(gint i, gint j)
{
if ( ((i%20)- 10) * ((j%20)- 10)>0 )
return 64;
else
return 196;
}

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
stegano

View File

@ -1,70 +0,0 @@
-------------------------------------------
GIMP-Plug-In (Stegano)
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
If you find that the plug-in is too big,
you can compress the executables with the
gzexe program (if it is avaiable on your
system). To do so, change to the plug-in
directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,43 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = stegano
stegano_SOURCES = \
stegano.c logo.h
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
stegano_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

View File

@ -1,70 +0,0 @@
-------------------------------------------
GIMP-Plug-In (Stegano)
-------------------------------------------
Written by Daniel Cotting
Bahnhofstrasse 31
CH-3066 Stettlen (Switzerland)
cotting@mygale.org
www.mygale.org/~cotting
-------------------------------------------
Some code is taken out of other plug-ins
written by other authors.
-------------------------------------------
-------------------------------------------
INSTALLATION
-------------------------------------------
To install it, you have to edit the
Makefile (change install-path).
Afterwards run make. This will compile
and install the plug-in in the right
directory. Once the new code is installed,
you can run the GIMP and enjoy the new
functions and effects it provides.
-------------------------------------------
-------------------------------------------
REDUCE CODE SIZE
-------------------------------------------
If you find that the plug-in is too big,
you can compress the executables with the
gzexe program (if it is avaiable on your
system). To do so, change to the plug-in
directory of the GIMP...
cd /usr/local/lib/gimp/VERSION/plug-ins
...and execute the command...
gzexe PLUGIN_NAME
...and remember to remove the uncompres-
sed binary, which has been renamed to
PLUGIN_NAME~, by running the command:
rm PLUGIN_NAME~
This will result in a code size of about
20 kB, which isn't too much IMHO.
------------------------------------------
------------------------------------------
FEEDBACK
------------------------------------------
I'm interested in any feedback, comments,
bug-reports, suggestions etc. If you
have anything you would like to tell
me, you can write to cotting@mygale.org.
Also have a look at the GIMP-section of
my homepage at www.mygale.org/~cotting.
------------------------------------------
Thank you and happy GIMPing!
Daniel Cotting
------------------------------------------

View File

@ -1,788 +0,0 @@
/* GIMP header image file format (Indexed): //logo.h */
static unsigned int logo_width = 200;
static unsigned int logo_height = 72;
/* Call this macro repeatedly. After each use, the pixel data can be extracted */
#define HEADER_PIXEL(data,pixel) \
pixel[0] = palette_data[data[0]*3+2]; \
pixel[1] = palette_data[data[0]*3+1]; \
pixel[2] = palette_data[data[0]*3+0]; \
data--;
static unsigned char
palette_data[] = { 4,2,2,4,110,178,32,4,122,4,36,
86,15,3,66,4,58,127,36,8,186,4,34,122,17,2,
34,4,19,66,12,4,162,90,2,69,88,2,48,7,20,
2,25,2,103,8,14,48,4,58,186,90,3,154,82,2,
129,55,2,34,17,2,18,17,34,191,94,2,101,57,2,
70,7,32,154,12,22,157,17,3,50,4,88,150,96,3,
186,86,2,138,87,2,86,212,214,210,4,19,98,52,2,
154,15,11,2,4,132,216,7,18,125,12,6,82,37,12,
18,4,88,189,86,14,48,128,2,157,32,4,138,4,60,
155,4,48,126,60,2,218,7,10,52,13,12,66,129,2,
50,56,2,52,52,14,98,4,47,157,6,20,87,48,2,
24,58,2,101,120,2,141,52,5,170,4,113,215,127,2,
73,4,90,210,4,52,112,36,18,194,59,2,85,42,2,
10,107,2,173,95,2,114,31,3,52,4,79,160,84,3,
189,14,10,40,30,2,69,96,2,58,113,2,126,9,37,
231,17,33,170,28,14,2,4,30,146,68,10,37,132,2,
82,23,4,7,4,10,122,4,36,108,32,2,37,7,27,
2,4,98,175,84,10,146,4,101,191,4,14,146,8,29,
86,4,2,170,8,60,230,84,10,162,72,2,39,102,2,
142,4,142,221,4,49,143,68,12,170,4,124,213,15,4,
74,114,2,69,112,2,158,32,3,23,8,50,190,111,2,
104,6,40,154,96,2,210,6,28,104,60,2,138,61,2,
25,68,2,114,58,2,125,39,2,114,73,2,69,16,4,
58,4,88,177,56,14,26,138,2,173,4,68,176,71,2,
55,76,2,210,4,78,130,17,3,42,6,27,69,112,2,
49,12,26,178,47,13,159,18,11,10,13,11,74,141,2,
58,52,18,234,4,82,186,4,126,198,4,103,213,4,62,
206,4,72,226,12,46,210,72,12,222,12,26,146,20,34,
210,4,113,197,4,131,229,4,48,170,4,76,170,7,43,
95,52,30,218,15,11,170,52,14,202,12,14,86,4,40,
174,108,14,202,156,2,186,60,12,130,5,40,129,73,13,
189,12,42,138,44,14,202,4,59,143,4,124,229,4,69,
191,4,69,157,4,60,114,4,43,110,14,14,58,20,26,
157,28,26,210,4,87,162,4,91,202,4,110,226,4,98,
226,4,101,202,17,14,186,28,18,18,60,2,234,28,10,
114,4,30,114,8,10,162,12,54,186,20,26,130,100,10,
170,40,18,154,4,22,114,28,26,234,4,22,58,4,66,
226,4,54,202,12,42,202,4,38,98,4,145,234,4,76,
146,4,94,148,4,138,213,4,94,186,4,54,126,4,54,
154,4,118,211,4,106,178,4,106,188,4,54,142,4,94,
170,4,70,202,4,118,197,4,54,173,4,82,178,72,4,
172,36,10,138,76,14,162,4,98,210,4,118,226,112,2,
114,24,19,8,30,2,85,84,6,226,141,2,73,28,30,
10,28,46,186,112,4,206,36,10,90,36,2,174,108,2,
58,41,3,130,44,10,194,9,33,130,92,2,162,51,2,
42,12,32,162,81,3,146,44,11,26,28,6,146,44,2,
178,30,12,10,60,10,178,64,2,146,28,10,178,92,10,
210,5,41,146,40,2,102,96,2,125,100,2,88,74,2,
157,142,2,159,26,10,55,143,2,50,73,2,102,134,2,
142,73,2,84,127,2,126,142,2,82,156,2,178,28,10,
158,28,26,114,84,14,202,12,4,10,5,20,74,17,2,
26,92,2,194,7,19,106};
static unsigned char header_data[] = { 71,99,218,218,99,11,71,218,71,71,
218,99,99,99,71,99,218,99,99,99,99,218,71,218,99,218,218,99,99,218,
218,99,99,218,99,218,99,58,218,99,99,99,58,218,99,99,99,58,99,58,
99,58,11,58,99,58,58,11,99,58,99,58,99,99,99,218,99,218,99,58,
99,71,99,218,71,12,12,12,12,12,12,12,12,12,92,19,19,19,92,92,
92,92,19,108,19,19,19,19,19,19,53,53,53,53,101,19,19,53,53,19,
19,19,12,92,92,12,12,12,71,71,218,99,218,218,71,71,12,12,218,99,
58,58,58,99,99,99,58,99,99,99,11,58,11,58,58,99,58,99,99,99,
58,99,99,99,99,58,99,99,99,99,99,218,99,99,11,99,99,99,11,99,
99,218,218,218,99,218,99,99,218,218,99,99,218,99,218,218,99,99,218,11,
218,71,99,218,99,218,218,99,71,8,218,99,218,218,99,99,99,99,99,99,
218,218,99,99,218,99,218,99,218,71,99,99,99,218,99,99,218,99,99,99,
218,218,99,99,99,99,58,99,58,30,99,99,99,99,99,99,58,99,99,58,
99,58,99,58,99,99,58,58,58,99,58,58,99,218,218,71,99,99,71,71,
71,123,12,118,71,71,12,71,123,12,12,19,19,19,53,19,19,53,53,19,
19,53,101,63,20,63,20,63,53,53,53,101,53,53,53,19,53,53,53,19,
92,12,12,12,71,12,12,12,12,12,92,71,218,218,71,218,71,71,71,71,
99,218,58,58,58,99,99,99,99,58,58,58,99,58,99,58,58,99,58,58,
99,99,58,99,99,99,99,58,99,58,30,99,99,99,218,99,58,99,99,58,
11,99,99,218,99,218,218,99,99,218,71,99,218,99,99,218,99,99,218,99,
11,218,99,218,99,11,218,99,99,8,71,71,71,99,218,71,218,99,71,218,
11,99,218,218,99,218,99,218,99,99,99,99,218,99,99,99,99,99,218,99,
99,99,99,99,99,11,99,99,99,99,99,99,58,99,58,99,58,99,58,58,
99,11,58,58,99,58,99,99,58,58,218,99,123,71,71,71,123,71,71,218,
99,99,218,71,12,12,12,12,92,19,19,53,19,53,53,53,53,19,53,53,
53,53,19,53,19,53,53,53,53,53,63,63,101,63,63,20,53,19,53,53,
53,19,92,92,12,12,12,71,71,71,71,12,12,71,71,12,12,12,12,12,
12,218,218,99,58,58,99,58,99,58,99,58,99,99,58,218,58,99,58,99,
99,99,99,11,58,99,99,58,99,99,58,58,99,99,99,99,99,99,99,99,
99,58,218,99,218,99,99,99,218,99,99,218,99,11,218,99,218,218,99,99,
218,99,218,11,99,71,99,218,71,8,99,99,218,99,99,99,218,99,99,218,
218,99,11,99,99,218,99,218,99,218,218,99,58,99,99,99,58,11,99,99,
58,99,99,58,58,58,58,99,99,99,99,218,58,99,99,99,58,58,99,99,
58,58,99,58,99,58,99,99,58,58,99,218,71,71,218,218,218,58,58,58,
218,99,71,123,12,12,12,19,19,108,108,108,92,92,92,12,71,12,12,92,
19,53,53,53,101,53,53,19,53,101,53,20,53,79,79,0,34,79,20,63,
53,53,53,19,19,19,12,12,12,71,71,71,71,71,71,123,71,12,12,12,
12,12,71,71,218,58,99,58,218,58,218,99,58,99,58,99,99,218,58,58,
58,99,58,58,99,99,58,99,58,99,99,218,58,58,99,99,99,99,99,99,
58,11,99,99,218,218,218,99,218,99,99,218,218,99,218,99,99,218,218,99,
218,99,71,218,99,218,99,99,99,8,218,218,99,218,99,218,99,218,218,99,
11,218,218,218,218,99,71,99,218,99,99,99,218,58,99,99,99,99,218,30,
58,99,58,99,58,11,58,99,58,99,58,58,58,99,58,58,99,99,58,58,
58,99,58,99,58,58,99,58,218,99,99,218,58,99,58,58,58,58,58,218,
71,12,12,71,71,12,12,12,12,71,71,118,71,71,118,71,71,12,223,19,
19,53,53,53,53,63,229,20,79,20,34,0,20,101,101,63,20,101,101,53,
108,53,53,53,53,53,101,19,92,12,12,12,12,71,71,218,218,218,71,71,
118,12,71,71,218,218,58,58,58,58,58,58,218,58,58,58,99,99,218,99,
58,58,99,99,58,99,58,99,58,58,58,99,99,99,58,99,99,99,58,58,
99,58,58,99,99,99,99,99,99,99,218,99,99,218,99,218,218,99,99,218,
99,58,99,99,218,99,218,218,218,8,99,218,99,218,99,218,11,99,218,99,
99,99,99,99,218,99,58,99,99,99,58,99,218,99,99,99,99,99,58,99,
58,218,99,99,99,58,218,58,58,58,99,99,58,99,218,58,99,99,58,218,
58,99,58,99,99,99,58,99,58,58,58,58,99,58,58,58,58,218,218,12,
71,71,71,12,12,71,71,12,71,12,71,71,71,71,12,92,19,53,53,53,
101,63,79,34,251,0,0,63,20,53,19,53,53,53,53,19,19,53,19,19,
19,108,19,19,19,19,19,19,53,53,108,12,12,12,71,71,218,58,58,58,
99,218,71,71,71,12,218,99,99,58,58,58,58,218,58,58,58,58,58,99,
99,58,58,99,58,218,58,99,99,99,99,58,99,128,99,58,99,99,11,99,
99,58,11,58,99,99,99,218,58,11,99,58,99,218,99,99,218,99,99,99,
218,71,99,99,218,99,11,99,218,8,218,99,218,99,218,99,99,218,99,218,
58,218,58,218,99,99,218,99,58,99,99,99,99,78,11,58,99,58,99,99,
99,58,58,99,58,11,58,58,218,99,99,58,58,58,99,58,58,58,99,99,
58,58,58,58,58,58,99,58,99,99,99,58,58,58,58,58,218,71,118,12,
71,71,71,71,71,12,71,71,71,71,71,12,92,19,19,53,53,63,20,251,
0,79,79,0,79,34,34,79,0,63,229,20,63,101,53,101,19,53,19,92,
12,71,12,92,12,12,12,12,12,92,19,92,92,71,12,118,71,218,99,58,
58,58,58,58,218,123,71,218,58,58,58,99,58,58,58,218,58,218,58,58,
218,58,99,58,58,58,99,99,58,99,58,99,218,99,99,99,58,58,58,11,
58,58,99,58,99,99,30,99,99,99,58,218,218,30,99,218,99,99,99,218,
99,99,218,218,99,99,218,71,99,8,99,99,71,99,218,218,99,218,99,218,
99,218,99,58,11,58,99,99,11,58,99,58,99,99,99,99,58,58,99,99,
58,99,99,99,99,58,99,78,58,58,99,99,218,78,58,218,58,99,212,58,
99,58,58,58,218,58,58,58,58,58,58,58,58,58,218,71,12,12,71,71,
123,218,218,58,99,71,123,71,71,12,19,19,19,53,53,19,19,53,63,53,
101,101,101,63,101,101,20,20,79,0,0,79,79,34,251,79,79,251,101,53,
19,92,12,71,71,71,218,12,218,12,71,71,71,71,71,12,71,71,123,71,
58,58,58,58,58,58,58,99,99,58,58,58,99,58,58,58,99,58,99,58,
99,58,58,99,58,58,58,58,99,58,99,58,99,58,99,58,99,99,58,58,
99,99,99,58,99,58,58,58,99,99,99,30,128,58,99,99,99,99,99,58,
218,99,99,218,218,99,99,218,71,8,71,218,99,99,99,99,218,99,99,99,
99,30,58,11,58,58,99,58,58,58,58,30,58,58,99,99,99,58,99,58,
99,58,99,58,58,58,218,99,58,99,58,58,58,218,99,58,58,58,58,58,
58,99,99,99,58,99,99,58,58,212,99,58,58,218,71,71,218,218,99,58,
58,58,58,218,123,71,71,12,108,19,19,108,19,19,223,92,19,92,12,12,
19,19,19,19,53,53,63,63,229,0,34,34,79,0,79,0,75,34,0,34,
79,20,53,19,92,12,71,71,71,218,71,123,71,123,71,71,71,71,71,71,
71,218,58,58,58,58,58,58,58,99,58,58,58,58,58,58,58,58,99,58,
58,99,99,58,99,58,58,58,58,58,58,99,58,99,58,99,58,58,99,99,
58,58,99,99,58,58,218,58,58,99,58,99,11,58,58,99,58,218,99,99,
99,99,218,99,99,218,99,99,99,8,99,218,99,218,99,99,99,99,58,58,
11,58,99,58,58,30,58,11,58,11,58,99,99,58,99,58,58,58,99,58,
58,99,58,99,99,58,58,99,58,99,58,99,58,99,212,58,58,58,58,58,
58,58,58,58,58,58,58,58,58,58,212,58,218,218,218,99,58,58,58,58,
58,99,71,71,71,12,71,71,12,12,12,71,71,123,71,218,71,71,71,92,
19,108,63,79,229,126,0,79,0,0,34,34,34,126,34,251,79,0,126,34,
79,0,79,20,63,19,19,12,71,71,71,218,71,99,71,71,71,71,71,71,
71,71,218,58,58,58,212,58,58,58,58,58,58,58,58,58,58,58,58,58,
58,58,99,58,58,99,58,58,99,99,128,218,58,58,99,58,99,58,58,99,
218,58,58,218,99,99,99,99,99,99,58,99,99,58,30,218,99,99,99,99,
99,99,218,99,99,99,218,218,99,8,218,99,99,99,58,99,99,99,99,99,
58,58,218,99,99,99,58,99,58,58,58,99,58,99,58,99,99,99,58,58,
99,99,58,58,58,58,58,58,99,99,58,99,99,58,58,58,58,99,58,58,
99,58,99,58,78,212,99,212,99,58,58,99,58,58,78,78,246,99,212,58,
99,71,123,71,71,71,71,71,218,218,71,123,218,218,218,118,12,19,63,63,
0,0,0,34,34,0,34,79,79,79,0,34,79,79,20,101,53,101,53,19,
53,53,101,101,53,53,19,19,19,92,218,218,218,218,218,212,78,58,218,218,
71,71,71,11,58,246,58,78,246,58,58,58,99,99,58,58,99,58,212,58,
99,58,99,58,58,99,58,58,58,58,58,212,218,58,58,99,58,58,99,58,
99,99,99,58,58,99,99,99,58,99,58,58,99,99,99,58,58,99,99,99,
99,99,99,11,58,99,99,99,218,8,99,99,218,99,99,218,99,218,58,58,
11,78,58,99,58,99,58,99,58,11,58,99,58,99,58,58,58,99,99,58,
99,99,99,58,58,58,58,58,58,58,58,58,58,58,58,212,99,58,212,99,
58,58,78,58,78,58,58,58,58,58,58,58,58,58,246,58,246,58,58,71,
218,71,71,71,218,71,71,71,71,218,218,71,71,92,92,53,63,126,79,0,
0,79,0,79,34,79,0,126,79,79,79,79,79,229,229,101,53,108,92,71,
71,71,71,71,71,12,12,19,108,19,92,71,71,71,71,218,212,246,78,58,
58,218,218,71,71,58,58,212,212,78,212,78,78,58,58,58,58,58,99,58,
78,58,58,99,58,58,58,58,58,58,58,58,99,58,99,58,58,212,99,58,
58,99,58,99,58,99,99,58,58,99,99,58,58,58,58,11,78,99,99,99,
99,58,99,58,71,99,99,99,99,8,99,99,99,218,99,58,99,30,58,11,
58,11,58,58,99,58,58,99,58,99,58,99,99,58,99,58,99,58,58,99,
58,58,58,58,58,78,58,99,58,99,58,58,58,58,99,58,212,99,58,58,
58,78,78,78,58,58,58,58,58,212,58,78,58,78,78,78,58,99,218,218,
71,218,218,71,58,99,58,99,71,71,71,12,19,20,79,251,0,251,79,251,
79,63,126,79,79,79,79,229,79,79,79,126,126,79,79,63,20,53,53,92,
12,12,218,71,71,218,218,218,71,218,71,71,71,218,71,218,218,58,246,246,
78,212,78,58,218,218,58,58,58,246,78,212,78,212,58,58,58,58,58,212,
78,78,78,58,58,99,58,58,58,58,58,58,58,58,58,218,99,99,58,99,
58,58,218,99,58,58,99,58,99,99,58,99,99,99,58,99,99,58,58,58,
218,99,11,58,99,99,99,218,99,8,99,30,218,58,11,99,99,58,99,58,
99,58,58,99,218,99,218,58,99,99,58,58,58,58,99,58,99,99,58,99,
58,58,58,78,78,58,58,58,58,58,99,246,78,78,58,58,58,58,58,78,
78,212,78,246,246,58,58,58,212,58,212,246,78,246,58,212,218,218,218,218,
218,58,246,58,246,58,218,218,123,12,19,19,53,53,101,53,63,101,63,63,
63,63,63,63,63,101,63,53,63,53,53,53,53,108,19,19,19,19,108,19,
92,92,12,12,71,71,218,99,99,218,218,218,218,218,71,71,71,218,218,246,
78,78,246,78,78,78,58,58,58,78,78,78,78,246,58,58,58,58,58,78,
212,78,78,58,58,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,
58,99,58,58,99,58,58,58,58,58,58,99,58,58,58,58,58,99,99,99,
58,99,58,99,99,58,99,99,99,8,99,99,30,58,58,58,58,58,58,99,
58,11,99,58,99,58,58,58,58,58,58,99,58,58,58,58,58,58,99,58,
99,58,78,58,58,58,99,58,58,78,246,78,58,78,58,58,58,58,78,212,
246,78,246,78,78,99,212,246,78,246,58,246,246,78,246,218,218,218,58,58,
246,78,78,246,58,218,218,71,12,12,108,92,108,19,108,53,63,63,63,53,
53,53,19,223,92,92,49,118,118,118,118,118,118,118,71,118,118,12,12,12,
92,71,71,123,218,99,11,58,58,58,58,78,58,99,99,123,71,218,218,218,
246,246,78,212,78,212,78,246,78,78,58,78,246,78,246,78,58,58,58,58,
99,78,246,78,246,99,58,58,58,58,58,78,78,78,78,99,58,99,58,99,
78,58,58,99,58,218,218,58,58,99,58,58,58,218,99,58,58,58,58,11,
58,99,99,99,58,99,99,218,58,8,99,99,58,99,58,11,58,11,58,58,
99,58,99,58,99,58,99,58,58,218,58,58,58,99,58,99,58,58,58,99,
78,58,58,58,99,58,58,78,78,58,246,78,246,99,58,58,58,212,78,78,
246,58,246,58,78,78,78,58,246,78,78,58,246,58,58,58,212,58,246,78,
212,246,58,58,71,71,71,71,12,92,92,92,108,53,53,53,19,19,223,223,
49,223,92,49,49,223,92,49,118,118,118,71,118,112,118,11,11,112,71,112,
71,71,11,11,11,99,99,58,58,78,78,78,246,78,246,58,99,71,218,71,
218,78,78,246,78,246,58,246,78,246,212,58,246,58,246,78,212,78,246,58,
58,58,78,246,246,78,78,99,58,58,58,212,78,58,78,58,58,58,58,58,
78,58,78,99,58,58,99,58,58,58,58,99,58,58,99,218,58,99,58,58,
58,58,99,58,99,99,58,99,99,8,99,99,58,58,58,99,58,99,99,58,
99,58,58,58,58,58,58,218,99,58,99,58,58,58,58,58,99,58,58,78,
58,78,78,78,78,58,78,58,78,78,78,212,78,58,78,58,78,212,78,246,
78,246,78,78,212,246,246,78,246,212,246,246,78,246,58,246,78,246,58,246,
246,58,99,218,218,218,71,12,92,19,19,19,19,19,223,223,49,223,49,118,
49,112,30,30,237,103,208,208,245,208,245,208,245,245,245,103,208,103,22,237,
30,30,11,11,11,11,71,71,11,99,58,78,78,246,58,246,246,246,58,99,
99,218,212,78,246,78,246,78,246,58,78,58,246,78,58,246,78,212,78,246,
58,212,58,78,78,212,78,78,58,58,99,78,78,78,78,78,58,58,99,58,
58,78,78,78,58,58,99,58,99,58,58,99,58,218,58,58,99,58,58,218,
99,58,99,99,58,99,30,99,99,8,58,99,58,99,58,58,58,99,58,99,
58,218,218,58,99,58,99,58,58,58,78,99,78,58,99,58,58,78,58,78,
78,58,78,78,58,78,78,246,246,212,78,78,78,58,78,246,78,246,58,246,
212,78,58,78,78,58,246,78,78,78,58,246,78,246,78,58,246,78,78,78,
58,218,99,11,71,12,92,92,92,223,223,223,223,223,49,118,112,22,237,208,
72,245,55,243,245,72,72,72,65,208,236,208,208,245,72,55,243,55,55,243,
245,245,245,103,237,237,30,11,11,112,71,11,99,58,78,246,246,246,246,78,
58,218,58,58,246,78,212,78,246,78,246,78,212,78,78,212,78,246,78,78,
58,78,78,78,78,78,246,246,246,58,58,78,58,246,78,212,78,78,99,58,
58,78,58,58,58,58,58,99,58,58,58,58,78,58,58,99,99,58,58,58,
99,218,58,99,99,99,58,99,58,8,99,99,99,58,11,58,58,58,99,58,
58,58,58,58,58,58,58,99,99,78,78,58,58,78,58,58,99,78,78,78,
78,78,78,78,78,78,212,246,246,246,246,78,78,246,246,58,246,78,246,78,
78,78,212,246,246,246,78,78,212,246,246,246,58,246,246,78,246,246,78,58,
218,99,71,12,12,92,92,82,223,49,223,118,112,22,208,72,72,208,65,22,
22,112,11,112,112,112,112,112,118,118,118,112,112,112,30,244,244,30,237,65,
236,72,55,55,243,243,208,208,237,237,11,71,11,11,71,11,99,58,246,246,
246,78,78,246,58,246,78,246,58,246,58,246,58,246,246,78,78,78,212,78,
212,246,212,78,246,246,58,78,78,246,99,246,246,58,246,58,78,78,78,58,
78,78,78,78,78,78,58,58,58,99,58,58,78,99,58,58,58,218,99,99,
58,58,99,58,99,58,58,99,99,8,58,58,99,58,99,218,99,58,99,99,
99,58,99,58,99,58,58,58,58,78,58,58,58,58,58,58,58,78,212,78,
78,58,246,78,58,246,246,246,246,246,246,246,78,58,246,78,246,58,246,58,
246,78,78,78,58,246,212,78,78,78,58,246,78,212,246,58,78,212,58,99,
218,71,12,92,19,223,49,49,118,62,30,22,208,208,103,30,244,112,244,118,
112,23,49,49,49,49,49,49,49,49,82,82,223,82,49,118,23,118,118,112,
11,30,237,22,65,245,55,243,245,245,103,237,237,11,71,11,71,71,218,58,
246,246,78,246,78,212,78,246,246,78,246,246,78,78,212,78,212,78,246,78,
78,58,246,78,58,246,78,212,78,246,78,78,78,78,78,212,246,246,246,78,
58,78,78,78,58,78,78,58,58,58,58,58,99,58,58,58,58,58,99,58,
58,58,58,58,58,99,99,58,58,8,99,99,58,58,58,99,99,99,99,58,
58,99,78,58,78,99,58,58,99,78,78,78,58,78,58,58,78,246,78,212,
78,78,58,78,246,246,246,246,246,246,58,78,78,246,58,246,78,246,78,246,
78,212,78,212,212,246,78,78,246,246,78,212,58,99,212,246,246,58,99,218,
118,12,92,223,223,49,49,11,237,208,208,103,244,23,118,112,118,112,49,49,
19,82,82,82,223,49,66,49,49,82,223,223,101,19,223,82,223,82,223,82,
82,49,23,112,11,244,30,65,72,55,55,245,208,22,237,112,11,118,71,218,
218,58,58,78,246,78,212,78,78,212,99,78,212,246,78,246,78,246,78,212,
246,246,78,246,246,78,246,78,246,58,246,78,58,78,246,246,246,246,212,246,
78,78,78,78,78,58,78,78,99,58,78,78,78,99,58,58,99,58,99,99,
58,99,99,99,99,58,99,58,99,8,99,99,99,58,58,99,58,58,99,58,
58,58,78,78,58,58,58,58,58,58,78,78,78,78,78,58,246,246,246,246,
246,78,78,212,246,246,246,246,246,246,78,212,78,246,78,212,78,246,58,246,
78,246,78,58,58,212,246,58,78,246,246,58,58,58,58,246,58,218,71,12,
223,223,49,49,49,30,65,72,72,30,112,118,118,112,118,49,223,223,223,49,
244,244,244,244,23,23,23,23,70,66,49,70,49,70,70,118,23,23,23,23,
49,223,19,82,223,223,23,11,244,237,208,72,55,55,208,103,30,11,11,49,
71,71,99,58,246,78,246,246,58,246,58,58,246,212,78,246,58,246,78,58,
58,212,78,78,212,78,212,78,78,78,212,78,78,78,246,212,246,246,246,212,
246,58,78,78,78,78,58,78,78,99,58,58,78,58,58,58,99,58,58,58,
58,58,58,58,99,58,99,58,99,8,99,58,58,218,58,58,58,99,58,58,
58,99,58,58,99,58,78,78,78,78,78,78,78,58,246,246,246,212,246,246,
212,246,78,246,246,246,246,246,212,246,246,78,246,58,212,246,78,78,78,246,
58,246,212,99,58,246,78,246,246,58,58,58,58,78,246,58,99,118,12,92,
223,223,223,11,22,72,208,244,49,112,112,118,49,82,223,49,244,244,242,62,
23,62,23,23,244,244,244,244,244,244,62,30,244,244,244,244,23,112,210,23,
62,244,244,23,223,82,53,82,49,112,30,30,65,72,55,245,208,237,30,112,
71,49,118,71,99,78,78,78,246,246,58,99,58,246,212,78,246,58,246,212,
99,58,212,246,78,246,78,246,212,246,78,246,246,212,246,246,246,212,246,246,
246,246,78,78,246,246,78,78,78,78,58,58,78,58,58,58,58,58,99,99,
99,78,99,58,99,99,58,99,58,8,58,99,58,99,99,58,58,99,58,58,
58,58,58,58,78,58,78,78,58,78,58,246,78,78,78,212,246,246,212,246,
246,246,246,246,246,246,246,246,246,246,246,58,246,58,99,212,246,212,78,78,
78,99,58,58,78,246,58,78,246,58,58,58,58,212,58,218,71,12,49,49,
49,112,22,72,65,112,49,112,112,112,223,19,118,62,244,62,62,23,23,244,
244,244,244,112,23,49,49,223,19,223,82,223,223,49,223,23,118,112,244,30,
62,62,62,62,23,62,23,223,82,8,82,71,30,244,22,72,55,245,103,237,
11,71,12,12,71,99,78,78,78,58,212,58,58,58,58,212,78,58,246,78,
58,58,58,212,78,246,58,78,78,212,212,246,246,246,212,246,246,246,246,246,
246,246,58,78,78,58,246,212,78,78,58,78,58,78,78,78,58,78,58,58,
218,58,58,99,58,99,99,99,58,8,218,99,58,58,58,99,58,58,99,78,
78,58,99,58,58,78,58,78,246,78,78,58,78,212,246,246,246,246,246,246,
246,246,246,212,246,212,246,246,246,212,78,246,58,58,58,246,78,78,212,246,
58,58,58,58,212,78,246,212,58,58,58,58,58,58,71,12,49,223,223,49,
30,208,72,30,49,49,112,49,223,223,23,22,244,62,23,23,62,22,112,118,
49,49,223,118,23,244,30,242,22,242,242,62,242,244,244,112,23,49,49,223,
23,112,30,244,62,112,210,23,23,49,82,8,223,244,237,30,208,55,243,245,
22,30,71,118,12,71,99,78,78,246,212,58,58,58,58,246,246,246,78,246,
58,58,58,78,212,78,246,246,246,58,58,212,246,246,246,246,246,246,246,246,
246,78,246,58,246,246,246,78,212,78,78,78,58,78,58,78,58,58,99,58,
58,58,99,58,58,58,58,58,58,8,58,99,58,58,58,58,99,58,78,78,
58,58,78,58,58,78,78,58,78,78,78,78,78,246,212,246,246,246,246,246,
246,246,246,246,246,246,212,246,246,246,78,58,58,58,58,246,78,78,246,99,
212,58,212,58,212,78,78,58,58,218,58,212,58,99,71,49,223,49,49,30,
55,72,112,49,244,11,49,82,112,242,242,62,23,62,244,112,118,223,82,118,
30,236,29,225,231,33,248,42,42,42,219,2,42,219,110,107,231,29,65,244,
112,223,223,49,112,30,30,23,23,23,23,49,82,101,49,30,30,242,72,243,
208,103,30,71,118,12,71,99,78,78,78,58,58,58,58,58,78,58,246,78,
58,58,99,58,246,58,246,58,246,58,99,58,212,246,246,212,246,246,246,246,
246,246,246,246,212,246,246,246,246,78,58,78,78,78,78,78,58,78,78,78,
58,78,99,99,99,58,58,99,99,8,99,58,99,99,58,58,58,58,78,78,
78,78,58,58,58,78,78,78,78,78,246,246,58,246,246,246,246,246,246,246,
246,246,212,246,99,58,246,246,246,246,212,58,58,58,99,212,78,212,212,58,
78,58,58,58,246,246,78,58,71,218,58,58,11,71,118,223,49,23,103,243,
22,49,118,30,118,82,49,30,242,62,70,62,244,118,223,82,112,65,93,205,
217,42,80,147,98,4,26,8,8,8,8,121,8,8,26,4,98,210,111,219,
29,29,65,112,223,82,23,30,244,62,62,62,62,49,82,82,112,30,30,65,
243,245,103,30,71,118,12,71,218,212,246,58,58,212,212,58,58,246,212,78,
58,58,212,58,58,246,78,246,58,58,58,58,246,212,246,246,246,246,246,246,
246,212,246,246,246,246,212,246,246,212,78,246,212,78,58,78,78,78,58,78,
78,78,58,58,58,58,99,58,58,8,58,58,58,58,58,58,58,58,237,78,
58,78,78,58,78,78,212,78,246,78,78,246,246,246,246,246,246,246,246,246,
246,246,246,58,58,58,246,246,246,246,58,58,99,58,58,246,246,78,99,78,
246,78,58,58,58,58,58,218,12,99,58,99,71,92,49,223,118,22,41,65,
223,23,30,118,19,23,22,242,23,23,30,112,223,19,112,29,222,232,87,80,
98,26,121,8,20,253,20,20,20,20,101,20,20,20,253,253,20,8,121,26,
4,14,2,231,29,30,49,82,112,30,244,62,23,210,118,82,101,223,30,244,
65,55,243,103,237,71,118,71,71,99,58,58,58,58,218,58,58,58,246,212,
58,58,212,78,99,58,246,246,78,58,58,58,58,246,246,246,246,246,246,246,
246,246,246,212,246,246,246,246,246,246,246,78,78,78,78,78,58,78,58,78,
78,58,58,58,78,99,58,58,99,8,99,58,58,99,99,58,58,58,58,237,
78,78,58,78,78,246,78,246,78,246,78,246,246,246,246,246,246,246,246,246,
246,246,58,58,58,58,246,246,246,58,99,78,246,212,99,246,212,58,78,246,
58,246,58,58,58,212,218,12,118,58,58,71,12,49,19,49,237,41,65,49,
118,112,223,82,244,236,62,66,62,30,82,8,112,93,68,6,137,88,162,253,
253,20,253,19,223,23,244,244,54,242,54,242,244,62,112,49,223,20,20,20,
20,253,26,98,14,33,29,244,82,101,112,22,62,62,62,23,49,53,82,30,
112,22,243,243,208,11,71,118,12,218,99,58,58,58,12,71,58,58,58,58,
99,58,58,246,246,58,58,246,246,58,58,58,99,58,246,246,246,246,78,58,
246,212,246,246,246,246,246,212,246,246,78,78,78,78,58,78,78,78,78,58,
78,58,78,237,78,58,99,99,78,8,58,99,58,58,78,78,78,78,78,78,
58,78,78,58,78,246,78,212,246,246,246,246,246,246,246,246,246,103,246,246,
246,246,58,58,58,99,212,246,246,58,212,78,246,58,58,58,58,58,212,78,
78,78,58,58,58,58,123,49,218,99,11,118,223,223,82,237,41,208,23,118,
237,223,82,244,18,210,23,23,112,19,223,103,64,6,148,147,26,253,20,8,
66,23,54,111,219,219,137,24,76,24,163,25,137,42,204,42,151,109,244,223,
20,20,20,20,8,4,111,231,236,23,82,12,237,62,62,23,62,223,253,223,
237,244,22,41,245,103,11,112,118,71,218,58,58,99,92,92,128,58,58,58,
58,58,58,212,78,58,58,212,58,58,58,78,78,58,212,246,246,246,58,58,
212,246,212,246,246,246,246,246,246,212,246,78,246,246,78,78,78,78,78,58,
78,58,58,78,99,58,58,58,99,8,99,58,58,58,58,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,246,246,246,246,103,246,246,246,246,246,
246,78,58,58,58,58,58,212,58,58,78,212,78,78,99,58,58,212,78,246,
212,212,58,58,58,218,92,12,218,99,71,12,223,82,118,243,55,23,223,30,
223,19,244,93,54,49,23,112,82,82,245,153,138,234,162,8,253,101,49,30,
111,125,24,201,142,16,159,142,43,95,197,156,193,193,51,141,224,25,248,231,
65,118,20,20,20,20,121,210,231,55,244,82,49,30,244,62,62,244,223,20,
118,237,112,208,243,245,237,71,118,49,71,58,58,218,92,92,12,58,58,99,
58,58,212,78,212,212,58,58,58,58,58,212,78,58,58,246,246,246,99,58,
99,246,246,246,246,246,246,246,246,246,212,246,58,78,78,78,78,78,58,78,
78,58,78,78,58,78,58,99,58,8,99,99,58,58,58,78,78,58,78,58,
78,78,78,246,78,78,78,246,246,246,246,246,246,246,246,103,246,246,246,246,
246,58,58,58,58,58,58,58,58,58,78,78,246,78,58,58,58,212,78,58,
58,78,58,58,58,12,92,12,99,218,118,19,82,223,22,116,237,49,112,112,
101,112,93,109,70,112,118,82,223,55,136,185,44,26,253,253,82,62,107,163,
117,16,114,159,161,106,98,46,26,26,26,26,26,4,32,81,44,142,43,234,
10,56,236,23,20,20,20,8,4,219,225,237,19,82,11,244,62,54,62,223,
20,112,30,244,72,239,103,237,71,12,12,71,58,71,92,92,12,128,58,58,
58,58,246,78,246,58,58,58,99,58,58,246,78,78,58,246,246,58,58,58,
58,212,246,212,246,246,246,246,246,246,78,78,246,58,246,58,78,246,78,58,
78,58,78,78,58,58,58,58,58,8,58,58,58,58,78,237,58,78,78,78,
78,78,78,58,246,246,212,246,246,246,246,246,246,246,246,246,246,246,246,246,
78,58,58,58,58,58,99,58,58,246,246,246,58,246,58,58,58,78,246,218,
11,58,58,58,58,12,92,71,218,11,49,223,101,23,239,93,23,118,244,223,
223,65,29,70,70,112,82,82,72,233,135,152,121,253,20,49,242,179,176,39,
198,156,32,47,26,26,69,113,26,47,9,47,162,113,26,121,113,252,152,159,
43,234,217,238,30,253,20,251,8,4,107,17,30,82,223,22,62,62,54,244,
82,19,237,112,244,41,245,30,112,71,92,71,99,71,12,92,92,71,78,58,
58,246,246,58,78,212,58,58,58,58,58,78,246,58,99,58,212,58,58,58,
58,78,246,246,246,246,246,246,246,246,246,246,78,78,78,78,246,58,78,78,
58,58,58,99,58,99,58,58,58,8,58,99,99,58,58,78,78,58,78,58,
78,58,78,78,78,78,78,246,246,246,246,246,246,246,246,246,78,246,246,246,
58,58,78,58,78,58,58,99,58,78,58,246,246,58,58,58,212,58,58,12,
71,58,58,58,99,92,92,71,218,71,223,8,19,22,150,30,49,11,23,101,
30,93,54,49,112,49,20,30,254,181,95,26,253,253,49,65,163,166,206,202,
52,26,8,121,4,161,43,114,139,131,57,200,195,188,192,88,26,26,121,98,
197,67,234,145,230,22,82,20,20,8,98,107,100,112,253,112,103,244,54,62,
49,20,49,237,118,208,243,103,11,11,12,92,92,92,92,12,49,12,58,58,
78,58,246,78,246,78,212,99,58,58,78,246,58,78,58,58,58,99,58,58,
58,99,246,246,246,246,246,246,246,246,246,246,246,78,246,78,246,78,58,78,
78,58,78,78,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,78,78,78,78,246,246,246,246,246,246,246,246,246,246,246,58,212,58,246,
99,212,58,99,78,99,58,58,78,246,58,58,58,78,78,58,78,78,99,71,
12,71,58,58,12,12,12,71,11,12,223,101,49,243,100,118,223,112,82,19,
93,225,113,23,244,101,223,41,129,199,52,253,20,223,242,124,39,57,117,122,
121,121,47,44,195,35,94,196,165,189,189,189,27,84,200,139,67,186,26,121,
240,106,159,234,175,68,242,20,20,20,8,210,238,93,223,19,237,244,23,54,
62,19,101,244,112,30,243,208,237,11,12,92,49,223,12,12,92,12,58,78,
246,78,58,246,78,212,78,78,58,58,212,58,58,58,78,99,58,58,99,58,
58,58,246,246,246,246,246,246,246,246,246,246,78,246,58,78,58,78,78,78,
78,78,237,78,58,58,58,58,58,8,99,58,99,58,78,78,78,58,78,78,
78,78,78,78,78,58,246,246,246,246,103,246,246,246,246,218,58,58,78,78,
58,99,71,12,58,78,58,78,58,78,123,12,78,78,58,212,78,78,123,92,
12,12,99,99,12,92,92,71,11,118,82,101,112,116,236,82,112,112,82,118,
100,110,66,23,49,101,244,215,73,43,69,253,101,23,219,59,97,202,52,8,
8,4,120,97,187,139,27,143,46,113,26,26,46,88,60,27,131,200,192,47,
82,66,81,159,234,170,68,118,20,251,20,26,2,64,244,101,118,22,23,62,
62,49,20,118,244,23,208,245,30,11,71,12,92,12,12,49,12,12,71,58,
246,246,78,246,78,246,58,78,58,78,212,218,12,246,78,99,58,78,78,11,
12,58,58,246,246,103,246,246,58,246,246,246,246,78,246,78,78,78,58,78,
78,58,58,58,78,58,58,99,58,8,99,58,58,58,99,78,58,78,78,78,
78,212,78,246,246,78,99,58,246,246,246,246,246,246,71,12,99,58,58,99,
58,58,53,251,71,78,78,78,78,246,19,19,71,246,246,78,212,246,12,92,
12,12,12,12,92,12,12,71,218,118,19,101,244,239,65,223,244,11,53,112,
222,235,66,112,223,20,72,45,90,221,8,253,19,242,214,97,57,152,26,8,
26,188,57,187,139,186,8,8,8,8,121,121,8,8,26,4,44,131,94,67,
162,82,113,44,159,76,220,29,82,0,20,8,98,238,245,82,82,237,23,62,
54,112,20,223,237,49,22,245,237,11,71,49,12,92,12,12,12,12,71,78,
246,58,246,58,246,78,246,58,246,212,58,19,101,218,78,78,99,58,58,53,
101,71,58,246,246,246,78,71,92,58,246,246,212,246,78,58,58,78,78,58,
78,78,78,78,58,58,58,58,58,8,99,99,58,99,58,78,78,58,99,58,
78,78,58,246,78,58,71,92,218,246,246,246,103,246,12,92,92,58,58,58,
58,218,63,53,19,246,246,78,78,212,53,92,92,212,246,78,78,58,92,218,
12,12,92,92,92,12,12,71,11,118,101,101,22,116,242,223,237,11,8,30,
17,62,70,112,8,53,72,172,134,143,8,20,223,109,102,57,97,81,121,82,
252,114,35,157,165,26,253,8,8,46,182,4,26,26,8,8,113,160,190,35,
186,66,121,106,117,152,232,68,49,79,20,8,26,42,17,223,53,22,112,244,
54,244,8,82,30,118,30,245,30,11,99,12,12,92,123,12,12,12,71,78,
246,78,246,78,58,246,246,58,246,58,12,53,53,12,78,78,78,99,12,63,
63,92,78,78,246,246,78,229,229,12,246,246,246,212,78,71,71,58,78,78,
58,78,78,58,58,58,212,58,58,8,99,58,58,58,58,78,78,58,99,218,
99,58,246,78,78,58,12,92,12,78,246,246,246,218,92,92,19,71,58,58,
58,12,38,92,53,71,246,58,246,218,108,92,92,218,246,212,78,58,12,218,
12,12,12,92,12,92,12,71,71,118,82,8,103,116,242,82,244,11,82,30,
222,210,223,23,8,101,55,172,183,186,8,253,223,110,102,157,97,161,8,8,
127,67,190,140,189,26,8,8,69,127,120,5,52,26,26,8,121,9,84,187,
43,113,82,98,142,152,89,119,244,20,0,253,121,219,64,23,101,30,30,23,
54,244,82,101,30,112,112,72,237,71,30,12,12,92,118,12,12,12,71,58,
246,246,58,246,58,212,78,246,58,246,108,63,53,19,78,78,78,58,53,101,
53,108,78,246,246,246,108,79,20,53,246,246,246,78,99,92,92,12,99,78,
78,58,58,218,218,218,99,58,58,8,99,99,58,58,58,99,99,218,71,11,
99,99,78,246,212,71,218,71,92,71,246,246,246,71,92,92,19,19,58,58,
58,92,53,92,92,108,58,246,246,71,92,92,92,92,212,246,246,58,123,48,
12,12,12,92,92,12,12,12,99,118,19,101,237,116,65,49,30,112,82,244,
222,235,26,118,82,101,65,136,183,7,8,8,82,242,21,157,57,192,69,8,
26,7,191,157,190,60,9,8,26,52,84,131,60,4,121,8,26,113,67,94,
142,113,82,98,43,152,10,119,244,251,0,253,121,111,64,23,101,244,22,49,
62,62,82,101,112,23,112,103,30,71,11,12,12,118,12,12,118,12,71,78,
78,246,78,58,218,58,78,246,246,12,53,101,53,19,58,78,58,12,63,63,
53,63,218,246,246,71,79,20,63,101,218,246,246,218,12,19,108,12,99,58,
99,71,218,71,71,218,71,218,71,8,99,58,99,99,58,58,11,218,71,218,
71,71,218,58,58,99,218,99,71,92,218,78,246,92,92,12,223,53,71,58,
58,19,19,92,92,19,12,78,78,12,92,92,92,92,71,78,78,218,123,241,
48,12,12,92,49,12,118,12,71,49,223,101,11,116,65,66,112,11,82,112,
100,54,66,66,223,20,244,105,90,159,8,8,8,244,10,167,187,202,98,8,
121,47,192,169,190,35,195,188,188,195,57,84,106,47,8,8,8,122,195,140,
95,66,82,98,142,221,175,119,244,251,251,20,8,219,64,112,101,30,242,118,
23,62,19,20,11,118,112,22,11,11,99,12,12,12,12,71,12,118,71,58,
246,58,246,99,12,99,212,78,58,19,53,53,101,53,58,78,218,53,101,53,
53,63,218,246,246,63,0,101,19,53,12,78,58,12,108,92,19,108,92,71,
71,12,71,71,123,71,71,123,71,8,99,99,58,58,58,11,58,11,99,218,
99,11,99,99,218,99,218,99,71,12,12,99,99,92,92,92,12,19,53,71,
99,38,53,12,12,92,19,218,212,92,92,92,48,12,108,128,246,218,123,48,
128,123,12,12,12,12,12,118,71,71,223,8,112,41,55,49,49,244,223,49,
93,231,70,82,223,20,82,116,181,158,252,8,20,223,242,214,57,157,156,46,
8,66,26,147,44,198,86,196,86,198,44,52,4,8,8,8,46,60,97,194,
52,82,82,180,159,177,232,64,66,79,20,8,26,231,100,49,8,237,62,23,
62,244,82,82,30,223,11,237,112,11,11,12,12,71,12,12,118,12,71,218,
246,78,58,218,92,99,246,212,92,53,79,79,53,53,218,58,19,63,38,126,
53,101,92,58,19,251,63,223,19,19,92,71,12,223,92,223,223,92,19,92,
12,71,123,71,71,71,71,71,71,8,11,58,11,58,99,58,99,58,99,58,
58,218,218,218,99,218,11,99,99,71,92,92,12,49,92,71,99,12,53,53,
92,20,53,123,48,12,92,19,218,19,92,12,241,48,92,92,58,218,92,241,
128,212,71,12,118,12,12,71,71,112,223,19,82,55,116,112,49,244,223,19,
208,238,235,66,223,253,82,22,250,73,95,113,8,82,49,111,102,207,132,188,
252,69,8,121,162,4,47,52,127,4,4,26,26,8,8,46,186,86,169,95,
66,8,4,95,192,87,45,236,101,251,253,8,70,222,236,223,223,237,244,23,
54,244,82,82,237,118,11,244,71,11,99,71,118,12,12,12,12,12,12,58,
78,78,246,123,108,12,212,12,53,63,13,83,63,53,12,92,53,226,13,13,
53,53,53,226,75,63,12,71,92,19,19,92,92,92,19,12,12,12,92,12,
71,71,71,71,71,12,71,71,71,8,99,99,58,99,99,58,58,99,58,58,
11,218,71,71,11,218,99,99,58,218,12,19,92,92,92,99,78,58,92,101,
75,251,53,12,123,48,92,108,101,63,92,12,241,241,92,92,108,92,108,128,
212,246,58,12,12,12,49,12,12,118,12,49,19,237,116,22,49,118,244,82,
112,17,231,70,223,82,20,82,93,45,133,7,46,8,8,49,50,224,168,207,
142,60,127,46,8,26,8,8,8,8,8,8,121,26,47,192,166,169,7,113,
66,113,7,156,36,217,28,23,251,251,20,26,111,222,30,8,49,22,112,62,
242,112,101,112,30,49,244,11,112,11,99,71,12,12,118,12,12,12,71,246,
246,78,212,92,108,92,218,53,38,13,0,0,63,101,20,63,101,75,83,83,
63,101,229,79,126,92,58,78,12,19,92,92,19,92,12,71,71,118,71,71,
218,12,71,71,71,71,71,218,99,8,218,99,218,58,58,218,99,99,58,99,
58,58,99,99,218,99,218,99,58,58,99,92,92,92,19,58,78,78,99,108,
0,34,38,123,123,48,123,92,53,108,92,12,241,241,241,123,92,19,19,123,
241,212,246,99,12,71,12,71,12,71,118,223,82,118,245,100,112,49,30,118,
223,237,238,111,113,223,19,20,49,93,144,184,44,113,8,253,19,210,173,141,
168,57,196,142,60,52,122,182,113,113,122,3,60,159,130,86,43,122,26,223,
47,106,95,76,89,68,244,20,251,20,8,210,238,72,223,19,30,112,23,62,
244,223,20,118,112,112,244,118,11,99,99,218,71,218,71,12,12,71,58,58,
78,246,246,92,63,53,53,101,83,0,83,83,53,63,63,53,20,83,0,0,
53,53,79,0,226,78,58,78,12,108,92,19,92,71,58,58,99,71,71,123,
71,218,218,71,218,218,99,218,99,8,99,99,218,218,99,99,99,99,58,99,
99,58,99,11,71,99,99,58,58,58,58,71,92,92,19,78,78,58,78,218,
53,63,101,123,123,48,48,123,92,19,92,92,241,241,241,241,92,92,92,12,
241,212,78,78,123,118,12,12,12,12,112,92,49,223,30,247,65,49,23,112,
82,23,72,231,14,26,82,19,101,49,17,146,102,154,147,69,8,82,49,23,
249,104,158,39,206,169,86,130,202,142,202,114,39,117,76,88,4,66,66,113,
7,95,234,175,68,22,101,20,251,8,4,107,100,112,101,112,30,23,112,62,
49,101,49,244,118,112,112,118,11,78,99,99,99,58,71,12,92,99,246,78,
246,58,218,108,108,53,63,229,0,83,34,13,53,53,101,38,13,0,0,13,
53,101,63,101,99,78,58,78,71,19,19,92,71,58,99,58,11,218,218,71,
99,99,99,99,218,58,99,218,218,8,71,218,99,99,218,58,99,99,99,99,
99,58,99,58,99,218,11,58,58,99,58,58,71,92,92,58,78,78,78,78,
118,19,53,123,48,128,128,48,123,12,92,92,48,128,212,48,241,12,12,92,
241,128,246,246,246,71,12,12,12,71,71,118,49,223,49,208,116,22,49,23,
11,223,223,72,225,235,113,82,82,101,49,65,68,164,201,7,162,26,8,121,
66,223,23,216,14,36,177,152,154,152,80,255,98,66,66,223,66,4,32,152,
152,163,228,222,112,251,20,20,8,113,219,222,22,82,23,22,62,112,54,244,
101,82,112,112,23,118,112,11,11,78,58,58,246,99,71,71,99,58,246,212,
58,58,123,108,108,53,20,13,101,19,34,13,53,53,53,0,75,38,0,34,
63,53,53,71,58,78,58,78,11,92,92,71,58,58,58,58,99,218,11,99,
11,58,218,218,99,99,218,99,99,8,99,71,99,99,99,99,99,218,58,99,
218,58,99,99,99,58,58,78,58,99,58,58,58,71,12,78,78,78,78,78,
58,12,19,12,48,218,246,218,48,12,92,92,241,48,58,212,48,241,12,92,
48,241,212,58,212,212,123,118,12,71,118,118,12,223,49,118,55,239,244,223,
112,112,82,118,236,225,14,4,26,82,101,19,112,93,153,21,224,174,88,162,
26,26,121,82,66,66,66,66,66,66,26,82,66,26,113,127,32,44,51,87,
248,222,236,223,20,20,20,8,70,111,17,237,223,49,237,30,62,54,30,118,
253,49,112,118,23,118,118,11,99,58,58,58,212,99,71,218,246,78,78,58,
58,58,108,108,63,38,13,92,58,12,13,251,53,63,251,79,12,71,34,34,
251,53,19,58,78,78,78,58,58,71,71,58,99,99,58,99,58,11,58,99,
99,99,99,218,218,99,218,218,99,8,71,99,218,218,218,99,218,99,99,99,
99,71,58,99,99,99,99,58,58,99,58,58,78,58,99,78,58,78,58,78,
78,78,99,218,128,58,58,78,128,48,12,92,123,241,78,246,58,48,241,218,
12,128,212,212,58,58,212,218,71,12,71,12,118,12,223,49,11,243,55,244,
49,112,244,223,49,236,17,111,4,121,82,82,8,223,244,29,153,61,148,234,
152,32,147,52,4,4,113,26,113,26,98,98,147,255,7,193,24,163,217,238,
110,112,101,20,20,253,8,70,107,222,22,223,223,244,244,244,244,242,112,82,
223,118,23,23,49,118,71,11,58,58,58,246,246,58,99,78,58,212,212,78,
58,99,53,53,38,83,19,58,246,19,34,79,251,34,34,71,58,71,79,13,
83,63,218,58,58,99,58,78,58,99,78,58,99,99,99,58,58,99,99,58,
218,11,218,99,11,218,11,99,71,8,71,218,218,11,71,99,218,99,99,99,
99,218,11,99,58,58,58,58,11,58,99,218,58,58,78,78,78,78,58,58,
78,78,78,78,58,78,78,78,58,58,48,123,48,48,128,78,246,78,128,241,
241,241,128,212,58,58,58,58,218,12,118,71,71,112,118,223,49,11,245,55,
30,49,112,244,223,19,30,93,107,111,4,26,101,101,8,101,112,242,93,203,
6,170,21,74,51,51,104,24,234,76,24,104,76,124,232,56,225,18,30,223,
20,20,20,20,8,66,235,231,236,112,223,118,30,112,112,54,244,112,82,49,
112,23,118,118,12,11,99,99,246,58,58,58,78,58,246,246,78,78,212,78,
58,12,53,229,34,40,78,78,58,38,0,13,13,79,71,58,58,71,13,0,
38,71,58,99,58,99,58,99,78,58,58,99,99,99,71,99,58,99,218,99,
71,99,218,99,99,71,218,99,71,8,71,71,71,123,218,218,11,218,218,218,
218,99,218,218,99,99,99,99,58,99,99,99,99,99,58,78,78,58,58,99,
99,78,78,246,78,212,78,78,58,78,128,48,48,241,48,246,78,58,246,128,
128,128,128,128,212,78,212,78,58,218,71,71,12,12,118,118,49,49,112,208,
41,22,49,112,244,23,19,49,22,93,219,14,4,8,82,101,20,101,223,49,
30,65,18,29,17,203,228,230,56,96,91,225,225,236,242,112,49,82,20,20,
20,20,82,113,210,107,29,22,118,223,112,30,244,244,62,112,23,82,223,49,
118,118,49,49,118,71,99,246,58,58,212,246,246,78,212,58,246,246,78,58,
218,53,209,126,40,78,78,78,218,0,34,34,79,71,78,99,58,71,251,229,
12,58,99,99,99,58,58,58,58,99,99,99,99,218,99,58,99,99,99,218,
99,218,11,218,218,11,218,71,71,8,71,123,71,71,218,123,71,99,11,99,
218,11,99,71,218,99,58,99,99,58,218,218,99,99,58,58,58,58,99,58,
58,99,58,246,246,246,78,58,58,58,78,58,48,48,241,78,246,78,78,58,
58,241,241,241,212,58,246,78,246,58,218,71,71,71,118,118,118,49,49,112,
103,243,236,112,49,244,112,49,223,118,65,93,107,14,98,113,82,8,101,253,
101,20,101,82,82,223,118,118,49,49,49,82,82,101,101,20,20,253,253,121,
26,70,235,110,29,103,118,223,223,11,244,244,54,242,244,49,19,223,49,118,
118,49,12,71,11,99,212,246,78,78,78,78,212,246,78,58,78,212,78,58,
12,38,213,71,78,58,58,78,40,83,79,20,99,58,99,58,99,12,92,71,
78,58,99,99,99,99,99,99,99,99,218,218,99,218,218,99,218,218,11,218,
11,218,218,71,218,218,71,123,71,8,71,71,12,71,71,218,218,218,71,71,
218,218,218,218,71,218,218,99,99,218,99,99,99,99,99,99,58,99,58,99,
99,99,99,58,78,78,78,78,58,99,58,58,58,128,48,128,78,78,58,78,
212,212,212,241,128,58,246,246,58,246,58,218,218,118,71,71,118,12,118,49,
23,237,245,55,208,23,118,23,112,223,223,118,244,236,18,110,14,210,4,66,
121,8,82,20,82,101,101,251,20,20,20,101,8,20,8,8,26,26,210,235,
109,110,65,30,118,223,49,244,244,244,244,242,65,30,223,82,49,118,118,49,
92,49,118,71,11,78,246,78,58,246,212,246,78,78,246,78,246,78,212,218,
53,92,99,78,58,58,58,246,53,0,53,99,99,58,99,58,99,71,218,58,
99,58,99,218,58,99,58,78,99,99,11,99,71,99,99,218,99,99,218,71,
123,218,71,218,12,71,71,71,71,8,71,71,71,71,71,118,71,71,218,99,
71,71,71,123,71,71,218,99,99,218,218,71,11,218,99,99,58,99,58,99,
99,99,218,58,58,78,78,78,58,99,99,58,58,58,58,128,246,78,58,58,
58,58,246,128,128,58,212,246,78,78,78,58,58,218,71,71,11,118,118,49,
12,23,11,103,243,72,237,23,23,112,23,223,19,223,112,22,109,18,29,111,
111,210,210,70,4,26,26,26,26,26,26,4,4,70,98,235,2,18,29,65,
54,23,223,49,23,244,244,112,244,54,22,244,118,82,223,223,118,92,49,49,
223,71,11,99,99,78,246,58,246,78,58,212,78,78,58,58,246,78,58,218,
71,78,58,58,99,58,58,99,19,77,58,58,58,218,99,58,58,58,58,58,
218,99,11,218,58,99,218,58,218,218,71,218,218,71,99,71,218,71,71,218,
71,123,71,71,71,71,71,71,12,8,118,118,71,71,118,71,71,71,118,12,
71,123,71,71,71,71,71,71,218,99,99,99,218,218,71,218,99,99,58,99,
99,218,99,218,58,58,246,78,78,99,99,99,99,58,246,78,58,246,58,58,
58,58,58,78,78,58,58,58,246,212,99,58,58,58,218,99,71,118,11,118,
49,49,49,23,11,208,55,245,22,112,23,23,23,23,49,49,49,223,112,30,
22,236,18,18,18,29,18,18,18,18,107,236,29,236,236,22,30,23,223,223,
223,118,118,112,244,112,244,242,242,30,23,223,82,223,49,49,49,223,49,12,
71,71,99,58,246,212,58,58,58,78,78,78,58,58,58,58,78,212,246,78,
78,58,58,11,99,58,78,78,99,58,58,99,218,99,58,99,58,58,58,218,
99,71,218,99,218,58,99,218,218,71,218,123,71,99,71,218,71,71,71,12,
71,71,12,12,12,12,12,12,12,8,12,12,12,12,12,12,118,118,71,71,
71,218,71,123,71,71,71,71,123,71,218,11,218,71,218,123,218,99,218,58,
99,99,11,218,71,99,99,58,78,58,99,99,71,99,58,78,246,246,246,58,
58,218,58,99,78,78,246,78,78,246,58,58,58,212,58,58,99,71,71,118,
71,118,118,23,49,112,112,103,72,72,65,244,112,23,118,118,70,223,223,223,
223,49,118,23,118,112,112,244,112,112,23,23,23,49,49,223,223,49,23,118,
244,244,112,62,244,109,22,30,49,223,223,82,49,223,49,223,223,118,118,71,
99,99,99,78,78,246,58,58,78,78,58,58,58,99,78,246,78,78,78,78,
99,99,99,58,99,58,78,78,58,99,99,11,218,99,99,58,58,11,99,218,
218,218,71,99,218,218,11,218,123,71,218,71,71,218,71,71,123,71,118,12,
71,12,12,12,12,12,12,12,12,8,12,12,12,12,12,12,71,71,71,118,
71,118,71,71,118,12,71,71,71,71,99,218,123,71,218,71,218,71,99,99,
99,218,218,71,218,218,99,58,58,58,58,218,99,218,218,99,58,99,78,58,
58,99,99,99,58,58,78,246,246,78,78,78,58,99,58,58,99,58,99,71,
11,71,12,23,118,118,118,23,112,30,103,208,208,65,242,112,118,23,23,118,
118,118,49,112,23,112,11,112,112,112,118,49,49,49,49,112,23,23,112,244,
244,22,22,22,242,112,49,223,223,66,223,49,223,49,223,49,12,71,71,99,
99,58,212,212,246,58,78,78,58,58,99,99,99,58,78,78,78,78,58,58,
99,99,99,58,58,58,58,58,99,218,71,218,99,99,218,58,99,99,71,218,
71,71,218,99,71,99,123,71,118,118,123,71,71,123,71,71,12,12,118,12,
12,12,12,12,12,12,71,12,71,8,12,92,12,92,71,12,118,118,12,12,
118,71,71,12,71,71,118,12,12,71,118,218,71,71,71,12,71,12,218,218,
99,99,218,218,71,71,71,218,99,99,99,99,71,71,218,71,99,58,58,58,
58,58,99,11,99,99,99,58,246,78,246,78,58,99,99,99,58,58,99,99,
99,11,71,112,112,118,118,92,118,23,118,112,30,237,103,65,65,22,30,54,
244,244,23,112,244,112,244,112,244,23,244,23,112,62,244,244,30,242,22,242,
22,30,23,49,49,19,82,223,223,49,49,49,223,49,12,11,11,218,99,58,
58,78,78,78,246,78,78,99,99,58,99,58,58,78,78,78,58,99,218,218,
71,99,99,99,58,99,58,99,71,123,71,218,99,99,218,99,218,71,12,71,
71,218,71,71,218,71,71,71,71,71,12,71,71,71,118,12,12,12,71,71,
12,12,12,12,118,12,12,92,12,8,12,12,71,12,12,12,12,12,71,12,
118,12,12,12,118,12,71,12,12,71,71,71,71,123,71,12,12,71,71,218,
218,218,11,71,123,71,71,218,71,99,99,58,99,99,71,218,218,99,218,58,
58,58,58,99,218,71,99,218,58,58,58,246,212,58,58,99,99,58,99,58,
58,58,58,218,71,71,112,71,118,118,49,23,118,118,49,112,112,30,237,22,
22,22,103,22,22,22,22,22,30,242,22,22,22,103,22,22,30,112,112,23,
49,49,49,82,223,66,49,49,49,49,223,12,118,71,218,99,99,58,99,58,
78,246,78,246,58,58,99,99,218,218,99,99,99,58,58,58,99,218,71,218,
99,99,58,58,58,99,218,123,71,71,218,218,99,99,99,123,71,71,71,92,
71,71,218,218,71,12,12,12,118,71,12,118,71,71,71,12,12,12,12,12,
12,12,118,118,12,12,12,12,12,8,92,92,92,12,12,12,12,12,12,12,
92,12,12,12,71,12,118,12,12,12,12,12,71,71,71,12,12,71,118,71,
71,123,71,71,71,118,71,71,71,123,71,218,218,99,218,71,12,71,71,218,
218,58,58,99,58,71,71,218,218,218,99,58,58,58,58,58,99,99,99,218,
218,99,58,58,99,99,99,11,11,11,23,112,118,112,49,118,118,118,23,118,
49,118,23,112,112,112,112,244,112,112,118,112,118,49,49,223,49,223,223,49,
223,223,49,49,223,49,223,223,118,118,71,11,218,99,218,99,218,78,58,58,
58,58,58,218,218,218,218,218,58,99,58,58,58,58,218,99,71,71,123,71,
218,99,58,99,99,71,71,12,12,71,71,71,218,218,218,71,118,71,71,12,
123,71,12,71,71,12,12,12,118,71,12,12,12,118,118,12,71,118,12,118,
12,12,12,12,12,92,12,12,92,8,92,92,12,12,92,12,92,12,12,12,
12,12,118,12,12,12,12,12,12,12,118,12,12,71,118,71,12,12,71,118,
71,71,71,123,218,118,12,71,71,71,71,99,99,218,218,71,71,71,71,71,
99,218,99,58,99,218,218,71,71,71,218,71,58,99,58,58,99,58,218,99,
99,218,99,99,58,58,58,99,58,99,218,11,71,112,11,112,118,23,118,23,
49,118,118,92,49,92,49,92,49,92,49,223,223,49,223,49,49,49,49,82,
49,49,49,223,118,118,71,71,11,71,99,218,218,99,58,58,58,58,58,58,
58,218,218,218,71,218,218,99,99,99,99,58,218,218,71,123,71,71,218,11,
99,99,218,218,71,71,12,71,12,218,218,218,71,218,118,12,71,118,71,71,
71,71,71,71,118,71,12,12,12,71,12,12,12,12,12,12,12,49,12,12,
12,92,12,49,12,92,12,12,92,8,92,92,92,92,92,12,92,12,12,92,
12,92,12,92,12,71,71,12,12,12,12,71,12,118,71,118,71,118,12,12,
12,12,71,71,218,71,71,118,118,12,12,118,71,218,71,218,123,12,12,12,
12,71,71,99,99,99,218,71,71,71,71,123,71,218,218,58,99,99,58,218,
99,218,218,11,99,218,99,218,218,58,58,58,99,218,71,11,71,71,118,11,
112,71,112,118,112,12,118,118,118,118,118,118,118,118,118,118,223,223,49,49,
118,118,118,71,71,71,218,71,218,71,99,99,99,218,58,58,58,218,218,218,
218,71,71,218,123,71,218,99,58,218,218,99,71,118,12,71,71,71,218,218,
218,99,71,118,12,12,12,71,71,123,71,71,71,12,118,12,92,71,118,71,
12,12,71,12,12,92,12,12,12,118,12,12,12,12,12,92,12,12,12,92,
71,92,12,92,92,92,92,92,12,8,92,92,92,92,92,92,92,92,92,12,
92,12,92,12,92,92,12,118,92,12,12,92,92,12,12,12,12,12,12,12,
12,12,71,118,12,118,71,71,12,12,12,12,118,71,218,71,218,71,118,12,
12,71,12,71,218,71,99,218,123,71,71,12,71,118,71,71,99,218,218,99,
218,99,218,218,218,71,123,71,218,218,218,218,99,99,99,58,99,99,99,218,
99,71,71,71,11,71,11,11,11,11,11,11,11,11,71,118,12,118,218,218,
71,218,71,71,218,71,99,71,99,99,99,58,218,99,218,218,71,71,71,71,
71,71,123,71,11,99,99,99,218,218,71,71,12,12,12,71,123,218,71,218,
71,118,71,12,118,12,12,71,71,218,118,12,12,12,92,12,71,118,71,71,
12,71,92,12,92,12,12,12,118,12,12,92,92,12,92,12,92,92,92,92,
92,92,92,92,12,92,92,92,92,8,92,92,92,12,92,92,92,92,92,92,
92,92,92,12,92,92,12,12,92,92,92,12,92,92,12,12,118,12,12,92,
92,12,12,12,71,71,71,118,12,118,12,12,12,71,12,71,71,71,71,12,
12,12,118,12,12,118,218,71,71,71,12,71,71,71,12,12,71,71,71,11,
218,99,218,218,218,218,71,71,71,71,71,71,71,71,218,218,218,218,99,218,
218,218,99,218,99,218,218,218,218,218,218,218,218,99,218,11,218,71,71,71,
71,123,71,123,71,218,99,218,218,11,218,99,71,71,71,71,71,71,71,92,
71,71,71,123,71,218,71,71,71,118,12,12,12,12,71,71,71,218,71,71,
12,12,12,12,12,12,12,71,71,71,12,12,12,12,12,12,12,12,118,12,
12,92,92,92,12,92,12,71,12,92,92,12,92,92,92,92,92,12,92,92,
92,92,92,92,92,92,92,92,92,8,92,19,92,92,92,92,92,223,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,12,118,12,12,
12,92,92,12,92,12,12,12,71,12,49,12,92,92,12,12,71,12,12,12,
12,71,12,12,12,12,71,12,71,71,218,218,71,118,12,12,12,71,12,12,
71,123,71,71,99,71,71,123,71,123,71,123,71,71,71,71,71,71,71,71,
71,218,218,218,71,71,218,71,218,71,218,71,71,123,71,123,71,123,71,123,
218,71,218,218,218,218,71,71,71,71,71,12,12,12,12,12,12,12,71,71,
71,123,218,218,71,71,12,12,12,71,12,12,12,12,71,71,71,12,118,12,
12,92,12,12,12,12,12,12,71,12,92,12,92,12,12,118,12,12,12,92,
92,92,92,92,92,12,92,92,12,92,92,92,92,19,12,92,92,92,92,92,
12,92,92,92,92,92,92,92,92,8,19,108,19,108,12,19,92,92,92,92,
92,92,92,92,92,19,92,92,92,92,92,92,92,92,92,92,92,92,12,92,
92,92,92,92,92,92,12,12,12,12,71,12,92,92,92,92,12,92,118,12,
12,12,12,12,92,12,12,12,71,12,71,71,71,12,12,12,12,12,12,92,
112,118,71,12,71,71,71,218,71,71,71,71,71,71,12,12,12,12,12,12,
12,118,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,71,
71,71,71,71,71,71,71,71,118,71,12,71,12,12,12,12,12,71,71,123,
71,71,71,92,12,12,12,12,92,92,71,12,12,12,12,71,12,12,92,12,
92,92,12,118,12,12,118,12,12,92,92,92,92,12,12,12,12,92,92,92,
92,12,92,12,92,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,19,19,108,92,8,92,92,19,92,108,92,19,92,92,92,
92,108,92,92,92,12,92,92,12,92,92,92,92,92,92,92,92,92,92,12,
12,92,92,92,92,223,12,92,12,12,12,12,12,92,92,12,92,12,12,12,
12,12,12,12,49,12,92,92,92,92,12,12,71,12,12,12,12,12,12,12,
92,92,118,92,12,12,118,12,12,12,12,12,12,71,12,12,12,12,12,12,
12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
12,12,118,118,12,118,12,12,12,12,12,12,12,12,12,12,12,12,71,12,
12,12,71,92,12,92,92,49,12,12,12,12,118,12,12,118,92,12,92,92,
12,12,12,12,123,12,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,92,92,19,92,92,108,
92,19,92,108,108,92,108,92,108,8,19,108,19,92,19,108,108,108,92,19,
92,92,19,92,108,108,92,108,108,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,12,92,12,92,92,92,92,92,
92,12,12,12,12,12,12,92,92,92,92,92,92,12,12,12,12,12,118,12,
12,12,12,92,12,12,12,12,71,12,12,12,12,71,71,12,12,71,118,118,
12,12,12,12,12,118,12,12,12,92,12,12,12,12,12,71,12,12,118,12,
12,71,12,12,12,12,12,92,118,118,12,12,12,12,71,12,12,12,49,12,
92,12,92,92,92,12,92,12,12,12,12,12,92,92,92,92,92,92,92,92,
12,12,71,92,92,92,12,92,223,92,92,92,12,92,92,92,92,92,12,19,
92,92,92,92,92,92,108,92,108,19,92,108,108,108,92,92,19,108,92,108,
19,92,19,92,108,92,108,19,19,8,19,108,19,108,108,19,92,19,108,19,
19,108,108,19,19,92,108,92,92,108,19,12,108,108,92,19,108,108,92,19,
92,92,92,92,92,92,108,19,92,92,92,92,12,92,92,92,92,92,92,92,
92,92,92,12,12,118,123,92,12,12,92,92,92,92,92,92,12,12,12,12,
12,92,12,12,92,12,92,92,92,92,92,92,12,12,12,12,12,12,12,71,
71,12,12,12,12,12,12,12,71,12,12,12,12,12,12,92,12,12,92,12,
92,12,12,49,12,92,12,12,12,12,12,71,12,12,12,12,92,12,92,12,
92,92,92,92,92,12,12,12,12,92,12,12,92,92,92,92,92,92,12,12,
12,92,92,92,92,19,108,92,92,92,92,92,92,92,92,19,92,108,108,92,
92,92,92,19,108,92,19,108,92,108,108,92,19,92,108,19,108,92,108,92,
19,108,108,92,108,108,19,92,108,8,19,19,19,19,19,108,19,19,108,92,
19,19,108,92,19,19,108,19,108,92,108,19,92,19,92,92,92,19,92,92,
92,92,92,92,92,92,19,108,92,19,19,92,92,92,92,92,92,92,223,92,
223,92,92,92,92,92,92,92,92,92,92,92,92,223,92,92,92,12,92,12,
12,12,12,12,92,12,12,92,12,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,92,49,92,12,92,92,12,12,92,12,92,12,92,12,12,92,12,
12,12,12,12,12,12,12,92,92,92,12,92,92,92,92,92,92,92,92,92,
92,92,12,12,12,12,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,12,19,92,92,108,12,92,92,92,12,19,92,92,108,92,19,19,92,
92,92,92,92,108,19,92,19,19,92,92,108,108,92,108,92,19,19,19,108,
19,19,19,19,19,19,108,19,19,8,19,53,19,53,19,53,19,53,19,108,
19,108,19,108,108,108,19,108,19,108,19,108,108,108,108,19,108,19,108,19,
19,92,108,19,19,12,108,92,108,92,108,19,108,92,92,92,92,92,92,19,
92,19,108,92,19,92,92,92,92,92,92,92,92,92,92,92,108,108,19,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,92,12,92,92,92,12,92,19,92,92,92,92,92,92,92,92,92,
92,92,92,92,92,92,92,92,92,108,19,92,92,223,92,92,92,92,92,92,
19,108,108,108,108,19,92,92,92,92,108,108,108,108,108,92,108,92,108,19,
92,19,108,108,19,108,108,108,108,108,19,19,19,19,19,19,108,108,53,19,
108,19,108,53,19,53,19,53,19,8,19,19,19,19,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,108,19,108,19,
19,19,19,19,108,19,108,19,108,19,108,19,19,19,19,108,19,92,92,92,
19,19,108,19,108,19,19,92,92,92,92,92,92,92,92,19,19,108,19,108,
19,92,19,92,92,92,92,92,92,92,92,92,92,92,92,19,92,92,92,92,
92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,92,
92,92,92,19,19,19,92,19,19,92,19,19,108,92,92,92,19,92,92,92,
92,92,92,92,92,19,19,19,19,108,19,108,92,92,92,92,92,92,19,19,
92,19,223,19,108,19,108,92,19,19,19,19,19,19,108,19,108,19,108,19,
19,19,19,19,19,19,19,19,19,108,19,108,19,108,19,19,19,19,19,19,
19,19,19,19,19,19,19,19,19,8};

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +0,0 @@
Makefile.in
Makefile
.deps
_libs
.libs
twist

View File

@ -1,43 +0,0 @@
## Process this file with automake to produce Makefile.in
pluginlibdir = $(gimpplugindir)/plug-ins
pluginlib_PROGRAMS = twist
twist_SOURCES = \
twist.c
INCLUDES = \
$(X_CFLAGS) \
-I$(top_srcdir) \
-I$(includedir)
LDADD = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la \
$(X_LIBS) \
-lc
DEPS = \
$(top_builddir)/libgimp/libgimpui.la \
$(top_builddir)/libgimp/libgimp.la
twist_DEPENDENCIES = $(DEPS)
.PHONY: files
files:
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
echo $$p; \
done
@for subdir in $(SUBDIRS); do \
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
for file in $$files; do \
echo $$subdir/$$file; \
done; \
done

File diff suppressed because it is too large Load Diff