fyre-1.0.1/0000777000175000001440000000000010512346420007454 500000000000000fyre-1.0.1/src/0000777000175000001440000000000010512346420010243 500000000000000fyre-1.0.1/src/avi-writer.c0000644000175000001440000003527210356610533012432 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * avi-writer.c - A simple interface for writing uncompressed RGB frames to * a Microsoft AVI video file. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "avi-writer.h" #include static void avi_writer_class_init (AviWriterClass *klass); static void avi_writer_init (AviWriter *self); static void avi_writer_write_header_list (AviWriter *self); static void avi_writer_write_main_header (AviWriter *self); static void avi_writer_write_stream_header (AviWriter *self); static void avi_writer_write_stream_format (AviWriter *self); static void avi_writer_write_index (AviWriter *self); static void write_fourcc (FILE *f, const char *fourcc); static void write_int32 (FILE *f, gint32 i); static void write_int16 (FILE *f, gint16 i); static void avi_writer_push_chunk (AviWriter *self, const char *fourcc); static void avi_writer_pop_chunk (AviWriter *self); static void avi_writer_push_header (AviWriter *self, const char *fileType); static void avi_writer_push_list (AviWriter *self, const char *listType); static void avi_writer_pop_chunk_with_index (AviWriter *self, int index_flags); typedef struct { char fourcc[5]; /* The chunk's FOURCC code */ long size_field; /* The file offset of the beginning of the chunk header's size field */ long data_start; /* The file offset where data starts, for measuring chunk size */ } ChunkStackEntry; typedef struct { char fourcc[5]; /* The chunk's FOURCC code */ int flags; /* AVIIF_* flags */ long offset; /* File offset- number of bytes between the end of "movi" and the end * of the chunk's FOURCC code. The documentation is fuzzy, but this * is how mencoder seems to treat the field. */ long size; /* Size of the indexed chunk- should match the size stored in the * chunk's header after it's fixed up. */ } IndexQueueEntry; /* Scale factor for video stream length and frame rate */ #define RATE_SCALE 1000 /* Header flags */ #define AVIF_HASINDEX 0x00000010 #define AVIF_MUSTUSEINDEX 0x00000020 #define AVIF_ISINTERLEAVED 0x00000100 #define AVIF_TRUSTCKTYPE 0x00000800 #define AVIF_WASCAPTUREFILE 0x00010000 #define AVIF_COPYRIGHTED 0x00020000 /* Index flags */ #define AVIIF_LIST 0x00000001 #define AVIIF_KEYFRAME 0x00000010 #define AVIIF_NOTIME 0x00000100 #define AVIIF_COMPUSE 0x0FFF0000 /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType avi_writer_get_type(void) { static GType dj_type = 0; if (!dj_type) { static const GTypeInfo dj_info = { sizeof(AviWriterClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) avi_writer_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AviWriter), 0, (GInstanceInitFunc) avi_writer_init, }; dj_type = g_type_register_static(G_TYPE_OBJECT, "AviWriter", &dj_info, 0); } return dj_type; } static void avi_writer_class_init(AviWriterClass *klass) { } static void avi_writer_init(AviWriter *self) { } AviWriter* avi_writer_new(FILE *file, guint width, guint height, float frame_rate) { AviWriter *self = AVI_WRITER(g_object_new(avi_writer_get_type(), NULL)); self->file = file; self->width = width; self->height = height; self->frame_rate = frame_rate; /* Write out everything we need to before the movie data can start... */ avi_writer_push_header(self, "AVI "); avi_writer_write_header_list(self); avi_writer_push_list(self, "movi"); /* Right here, at the beginning of the 'movi' list, is where index * offsets are measured from. */ self->index_queue = g_queue_new(); self->index_origin_offset = ftell(self->file); return self; } /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ void avi_writer_append_frame (AviWriter *self, const GdkPixbuf *frame) { int x, y; guchar bgr[3]; guchar *pixels = gdk_pixbuf_get_pixels(frame); guchar *row, *pixel; int width = gdk_pixbuf_get_width(frame); int height = gdk_pixbuf_get_height(frame); int rowstride = gdk_pixbuf_get_rowstride(frame); int n_channels = gdk_pixbuf_get_n_channels(frame); int padding = 0; g_assert(width == self->width); g_assert(height == self->height); /* Start an uncompressed video frame */ avi_writer_push_chunk(self, "00db"); /* Write out our image data bottom-up in BGR order. Yuck. * Each row is padded to the next 4-byte boundary. */ row = pixels + rowstride * (height-1); for (y=self->height-1; y>=0; y--) { pixel = row; padding = 0; for (x=0; xwidth; x++) { bgr[2] = pixel[0]; bgr[1] = pixel[1]; bgr[0] = pixel[2]; fwrite(bgr, 1, 3, self->file); pixel += n_channels; padding = (padding - 3) & 3; } if (padding) { bgr[0] = bgr[1] = bgr[2] = 0; fwrite(bgr, 1, padding, self->file); } row -= rowstride; } avi_writer_pop_chunk_with_index(self, AVIIF_KEYFRAME); self->frame_count++; } void avi_writer_close (AviWriter *self) { avi_writer_pop_chunk(self); /* Close the "movi" list */ avi_writer_write_index(self); avi_writer_pop_chunk(self); /* Close the "AVI" chunk */ /* At this point, there should be no more open chunks */ g_assert(self->chunk_stack == NULL); /* Fix up frame count and stream length */ fseek(self->file, self->frame_count_offset, SEEK_SET); write_int32(self->file, self->frame_count); fseek(self->file, self->length_offset, SEEK_SET); write_int32(self->file, self->frame_count * self->frame_rate * RATE_SCALE); fclose(self->file); g_queue_free(self->index_queue); } /************************************************************************************/ /********************************************************************** AVI Headers */ /************************************************************************************/ static void avi_writer_write_header_list(AviWriter *self) { avi_writer_push_list(self, "hdrl"); avi_writer_write_main_header(self); avi_writer_push_list(self, "strl"); avi_writer_write_stream_header(self); avi_writer_write_stream_format(self); avi_writer_pop_chunk(self); avi_writer_pop_chunk(self); } static void avi_writer_write_main_header(AviWriter *self) { avi_writer_push_chunk(self, "avih"); /* microseconds per frame */ write_int32(self->file, 1000000 / self->frame_rate); /* max bytes per second */ write_int32(self->file, 0); /* padding granularity */ write_int32(self->file, 0); /* flags (AVIF_* constants) */ write_int32(self->file, AVIF_HASINDEX); /* total frames (we fill this in later) */ self->frame_count_offset = ftell(self->file); write_int32(self->file, 0); /* inital frames */ write_int32(self->file, 0); /* number of streams */ write_int32(self->file, 1); /* suggested buffer size */ write_int32(self->file, self->width * self->height * 3 + 1024); /* width and height */ write_int32(self->file, self->width); write_int32(self->file, self->height); /* reserved (4) */ write_int32(self->file, 0); write_int32(self->file, 0); write_int32(self->file, 0); write_int32(self->file, 0); avi_writer_pop_chunk(self); } static void avi_writer_write_stream_header(AviWriter *self) { avi_writer_push_chunk(self, "strh"); /* data type: video stream */ write_fourcc(self->file, "vids"); /* data handler (video codec) */ write_fourcc(self->file, "DIB "); /* flags */ write_int32(self->file, 0); /* priority */ write_int16(self->file, 1); /* language */ write_int16(self->file, 0); /* initial frames */ write_int32(self->file, 0); /* scale followed by rate. For video streams, (rate/scale) is the frame rate. */ write_int32(self->file, RATE_SCALE); write_int32(self->file, self->frame_rate * RATE_SCALE); /* start */ write_int32(self->file, 0); /* length (we fill this in later) */ self->length_offset = ftell(self->file); write_int32(self->file, 0); /* suggested buffer size */ write_int32(self->file, self->width * self->height * 3 + 1024); /* quality */ write_int32(self->file, 10000); /* sample size */ write_int32(self->file, 0); /* frame position and size (left, top, right, bottom) */ write_int16(self->file, 0); write_int16(self->file, 0); write_int16(self->file, self->width - 1); write_int16(self->file, self->height - 1); avi_writer_pop_chunk(self); } static void avi_writer_write_stream_format(AviWriter *self) { avi_writer_push_chunk(self, "strf"); /* This is a BITMAPINFO structure for video streams */ /* BITMAPINFOHEADER size */ write_int32(self->file, 0x28); /* width and height */ write_int32(self->file, self->width); write_int32(self->file, self->height); /* Number of planes, "must be set to 1" */ write_int16(self->file, 1); /* bits per pixel */ write_int16(self->file, 24); /* compression */ write_int32(self->file, 0); /* size, in bytes, of the image */ write_int32(self->file, self->width * self->height * 3); /* horizontal/vertical pixels per meter (75 dpi) */ write_int32(self->file, 2952); write_int32(self->file, 2952); /* Color table size and number of important colors */ write_int32(self->file, 0); write_int32(self->file, 0); avi_writer_pop_chunk(self); } /************************************************************************************/ /********************************************************************** RIFF Chunks */ /************************************************************************************/ static void write_fourcc(FILE *f, const char *fourcc) { fwrite(fourcc, 1, 4, f); } static void write_int32(FILE *f, gint32 i) { i = GINT32_TO_LE(i); fwrite(&i, 1, 4, f); } static void write_int16(FILE *f, gint16 i) { i = GINT16_TO_LE(i); fwrite(&i, 1, 2, f); } static void avi_writer_push_chunk(AviWriter *self, const char *fourcc) { /* Write a chunk's RIFF header, with a dummy size, and add * it to the chunk_stack. The file pointer will be positioned * at the beginning of the chunk's data. */ ChunkStackEntry *new_chunk = g_new(ChunkStackEntry, 1); write_fourcc(self->file, fourcc); strncpy(new_chunk->fourcc, fourcc, 4); new_chunk->fourcc[4] = '\0'; /* Write a dummy size field, pointing to it for later updating */ new_chunk->size_field = ftell(self->file); write_int32(self->file, 0); /* Point to the beginning of the chunk's data */ new_chunk->data_start = ftell(self->file); self->chunk_stack = g_slist_prepend(self->chunk_stack, new_chunk); } static void avi_writer_pop_chunk(AviWriter *self) { /* Pop a chunk off of the chunk_stack, updating the chunk's size. * Assumes that the file pointer is placed just after the chunk data. */ long after_data = ftell(self->file); ChunkStackEntry *old_chunk; GSList *removed_link; /* Pop this chunk off our stack */ removed_link = self->chunk_stack; self->chunk_stack = self->chunk_stack->next; old_chunk = (ChunkStackEntry*) removed_link->data; g_slist_free_1(removed_link); /* Update its header's size */ fseek(self->file, old_chunk->size_field, SEEK_SET); write_int32(self->file, after_data - old_chunk->data_start); fseek(self->file, after_data, SEEK_SET); g_free(old_chunk); } static void avi_writer_push_header(AviWriter *self, const char *fileType) { avi_writer_push_chunk(self, "RIFF"); write_fourcc(self->file, fileType); } static void avi_writer_push_list(AviWriter *self, const char *listType) { avi_writer_push_chunk(self, "LIST"); write_fourcc(self->file, listType); } /************************************************************************************/ /************************************************************************ AVI Index */ /************************************************************************************/ /* Write the "idx1" list, using the queued chunk positions from our index FIFO */ static void avi_writer_write_index(AviWriter *self) { IndexQueueEntry *current_entry; avi_writer_push_chunk(self, "idx1"); /* Write all IndexQueueEntry nodes, freeing them as we go */ while ((current_entry = g_queue_pop_head(self->index_queue))) { write_fourcc(self->file, current_entry->fourcc); write_int32(self->file, current_entry->flags); write_int32(self->file, current_entry->offset); write_int32(self->file, current_entry->size); g_free(current_entry); } avi_writer_pop_chunk(self); } /* This is a version of avi_writer_pop_chunk() that adds the finished chunk * to this AVI file's index, using the provided flags. */ static void avi_writer_pop_chunk_with_index (AviWriter *self, int index_flags) { IndexQueueEntry *new_entry = g_new(IndexQueueEntry, 1); ChunkStackEntry *current_chunk = self->chunk_stack->data; long current_offset = ftell(self->file); memcpy(new_entry->fourcc, current_chunk->fourcc, 5); new_entry->flags = index_flags; new_entry->offset = current_chunk->data_start - self->index_origin_offset - 4; new_entry->size = current_offset - current_chunk->data_start; g_queue_push_tail(self->index_queue, new_entry); avi_writer_pop_chunk(self); } /* The End */ fyre-1.0.1/src/avi-writer.h0000644000175000001440000000532710356610254012435 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * avi-writer.h - A simple interface for writing uncompressed RGB frames to * a Microsoft AVI video file. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __AVI_WRITER_H__ #define __AVI_WRITER_H__ #include #include G_BEGIN_DECLS #define AVI_WRITER_TYPE (avi_writer_get_type ()) #define AVI_WRITER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), AVI_WRITER_TYPE, AviWriter)) #define AVI_WRITER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), AVI_WRITER_TYPE, AviWriterClass)) #define IS_AVI_WRITER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), AVI_WRITER_TYPE)) #define IS_AVI_WRITER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), AVI_WRITER_TYPE)) typedef struct _AviWriter AviWriter; typedef struct _AviWriterClass AviWriterClass; struct _AviWriter { GObject object; FILE *file; guint width, height; float frame_rate; guint32 frame_count; /* A stack of RIFF chunks that need their sizes fixed */ GSList *chunk_stack; /* A FIFO of index chunks to write later */ GQueue *index_queue; long index_origin_offset; /* Offsets of particular things we need to fix later */ long frame_count_offset; long length_offset; }; struct _AviWriterClass { GObjectClass parent_class; }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType avi_writer_get_type (); AviWriter* avi_writer_new (FILE *file, guint width, guint height, float frame_rate); void avi_writer_append_frame (AviWriter *self, const GdkPixbuf *frame); void avi_writer_close (AviWriter *self); G_END_DECLS #endif /* __AVI_WRITER_H__ */ /* The End */ fyre-1.0.1/src/histogram-view.c0000644000175000001440000002113410356611705013300 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * histogram-view.c - A DrawingArea subclass that displays the results of a HistogramImager * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "histogram-view.h" #include "image-fu.h" #include static void histogram_view_class_init(HistogramViewClass *klass); static void histogram_view_init(HistogramView *self); static void histogram_view_finalize(GObject *object); static gboolean on_expose(GtkWidget *widget, GdkEventExpose *event); static void on_resize_notify(HistogramImager *imager, GParamSpec *spec, HistogramView *self); static void histogram_view_draw_image_region(HistogramView *self, GdkRegion *region); static void histogram_view_draw_background_region(HistogramView *self, GdkRegion *region); static GdkRegion* histogram_view_get_full_image_region(HistogramView *self); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType histogram_view_get_type(void) { static GType hv_type = 0; if (!hv_type) { static const GTypeInfo hv_info = { sizeof(HistogramViewClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) histogram_view_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(HistogramView), 0, (GInstanceInitFunc) histogram_view_init, }; hv_type = g_type_register_static(GTK_TYPE_DRAWING_AREA, "HistogramView", &hv_info, 0); } return hv_type; } static void histogram_view_class_init(HistogramViewClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); gobject_class->finalize = histogram_view_finalize; widget_class->expose_event = on_expose; } static void histogram_view_init(HistogramView *self) { /* Double buffering will just slow us down. * Turing this off also gives us the chance to paint our own background * in the expose handler. Painting it only behind the areas we don't have an * image in will make resizing much more speedy and usable. */ gtk_widget_set_double_buffered(GTK_WIDGET(self), FALSE); } static void histogram_view_finalize(GObject *object) { HistogramView *self = HISTOGRAM_VIEW(object); if (self->imager) { g_object_unref(self->imager); self->imager = NULL; } } GtkWidget* histogram_view_new(HistogramImager *imager) { HistogramView *self = g_object_new(histogram_view_get_type(), NULL); histogram_view_set_imager(self, imager); return GTK_WIDGET(self); } void histogram_view_set_imager(HistogramView *self, HistogramImager *imager) { if (self->imager) { /* Remove the old imager */ g_signal_handlers_disconnect_by_func(self->imager, G_CALLBACK(on_resize_notify), self); g_object_unref(self->imager); } self->imager = g_object_ref(imager); /* Do the first resize, and connect to notify signals for future resizes */ gtk_widget_set_size_request(GTK_WIDGET(self), self->imager->width, self->imager->height); self->old_width = self->imager->width; self->old_height = self->imager->height; g_signal_connect(self->imager, "notify::width", G_CALLBACK(on_resize_notify), self); g_signal_connect(self->imager, "notify::height", G_CALLBACK(on_resize_notify), self); } /************************************************************************************/ /************************************************************************ Rendering */ /************************************************************************************/ static GdkRegion* histogram_view_get_full_image_region(HistogramView *self) { /* Create a GdkRegion for the entire image */ GdkRectangle image_rect; image_rect.x = 0; image_rect.y = 0; image_rect.width = self->imager->width; image_rect.height = self->imager->height; return gdk_region_rectangle(&image_rect); } static void on_resize_notify(HistogramImager *imager, GParamSpec *spec, HistogramView *self) { GdkRegion *old, *new; GdkRectangle rect; gtk_widget_set_size_request(GTK_WIDGET(self), imager->width, imager->height); /* Since we're not letting gtk clear our widget for us for speed and unflickeriness, * we need to clear any areas that the previous size covered but the new size doesn't. */ rect.x = rect.y = 0; rect.width = self->old_width; rect.height = self->old_height; old = gdk_region_rectangle(&rect); rect.width = self->imager->width; rect.height = self->imager->height; new = gdk_region_rectangle(&rect); gdk_region_subtract(old, new); if (!gdk_region_empty(old)) histogram_view_draw_background_region(self, old); gdk_region_destroy(old); gdk_region_destroy(new); self->old_width = self->imager->width; self->old_height = self->imager->height; } void histogram_view_update(HistogramView *self) { GdkRegion *update_region; histogram_imager_update_image(self->imager); /* Draw the whole thing */ update_region = histogram_view_get_full_image_region(self); histogram_view_draw_image_region(self, update_region); gdk_region_destroy(update_region); self->imager->render_dirty_flag = FALSE; } static void histogram_view_draw_image_region(HistogramView *self, GdkRegion *region) { GdkRectangle *rects; int n_rects, i; gdk_region_get_rectangles(region, &rects, &n_rects); if (self->imager->fgalpha < 0xFFFF || self->imager->bgalpha < 0xFFFF) { /* If we need to draw with alpha, composite our histogram imager's output * onto a checkerboard. It's a little messy writing directly to the imager's * pixbuf, but since we update the image before saving it anyway this shouldn't * cause any problems. This should give us a speed boost compared to doing * a separate compositing step like we used to. */ image_add_checkerboard(self->imager->image); } for (i=0; iwindow, GTK_WIDGET(self)->style->fg_gc[GTK_STATE_NORMAL], rects[i].x, rects[i].y, rects[i].width, rects[i].height, GDK_RGB_DITHER_NORMAL, gdk_pixbuf_get_pixels(self->imager->image) + rects[i].x * 4 + rects[i].y * self->imager->width * 4, self->imager->width * 4); } g_free(rects); } static void histogram_view_draw_background_region(HistogramView *self, GdkRegion *region) { GdkRectangle *rects; int n_rects, i; gdk_region_get_rectangles(region, &rects, &n_rects); for (i=0; iwindow, GTK_WIDGET(self)->style->bg_gc[GTK_STATE_NORMAL], TRUE, rects[i].x, rects[i].y, rects[i].width, rects[i].height); } g_free(rects); } static gboolean on_expose(GtkWidget *widget, GdkEventExpose *event) { HistogramView *self = HISTOGRAM_VIEW(widget); GdkRegion *image_rect_region, *outside_image; if (self->imager->image && !self->imager->size_dirty_flag) { /* Separate the expose region into a region inside our image and a region outside * our image. Draw the first with histogram_view_draw_image_region and the second * with histogram_view_draw_background_region. */ image_rect_region = histogram_view_get_full_image_region(self); outside_image = gdk_region_copy(event->region); gdk_region_subtract(outside_image, image_rect_region); gdk_region_intersect(image_rect_region, event->region); histogram_view_draw_image_region(self, image_rect_region); histogram_view_draw_background_region(self, outside_image); gdk_region_destroy(image_rect_region); gdk_region_destroy(outside_image); } return FALSE; } /* The End */ fyre-1.0.1/src/histogram-view.h0000644000175000001440000000504710356610415013307 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * histogram-view.h - A DrawingArea subclass that displays the results of a HistogramImager * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __HISTOGRAM_VIEW_H__ #define __HISTOGRAM_VIEW_H__ #include #include #include #include "histogram-imager.h" G_BEGIN_DECLS #define HISTOGRAM_VIEW_TYPE (histogram_view_get_type ()) #define HISTOGRAM_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), HISTOGRAM_VIEW_TYPE, HistogramView)) #define HISTOGRAM_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), HISTOGRAM_VIEW_TYPE, HistogramViewClass)) #define IS_HISTOGRAM_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HISTOGRAM_VIEW_TYPE)) #define IS_HISTOGRAM_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), HISTOGRAM_VIEW_TYPE)) typedef struct _HistogramView HistogramView; typedef struct _HistogramViewClass HistogramViewClass; struct _HistogramView { GtkDrawingArea parent; HistogramImager *imager; int old_width, old_height; }; struct _HistogramViewClass { GtkDrawingAreaClass parent_class; void (* histogram_view) (HistogramView *cb); }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType histogram_view_get_type (void); GtkWidget* histogram_view_new (HistogramImager *imager); void histogram_view_update (HistogramView *self); void histogram_view_set_imager (HistogramView *self, HistogramImager *imager); G_END_DECLS #endif /* __HISTOGRAM_VIEW_H__ */ /* The End */ fyre-1.0.1/src/bifurcation-diagram.c0000644000175000001440000002454310446431132014243 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * bifurcation-diagram.c - A HistogramImager that renders a bifurcation diagram * in which one axis interpolates across de Jong parameters * and the other axis shows a 1 dimensional projection of the * image at those parameters. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include #include "bifurcation-diagram.h" #include "math-util.h" static void bifurcation_diagram_class_init (BifurcationDiagramClass *klass); static void bifurcation_diagram_init (BifurcationDiagram *self); static void bifurcation_diagram_dispose (GObject *gobject); static void bifurcation_diagram_init_columns (BifurcationDiagram *self); static BifurcationColumn* bifurcation_diagram_next_column (BifurcationDiagram *self); static void bifurcation_diagram_get_column_params (BifurcationDiagram *self, BifurcationColumn *column, DeJongParams *param); static gpointer parent_class = NULL; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType bifurcation_diagram_get_type(void) { static GType dj_type = 0; if (!dj_type) { static const GTypeInfo dj_info = { sizeof(BifurcationDiagramClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) bifurcation_diagram_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(BifurcationDiagram), 0, (GInstanceInitFunc) bifurcation_diagram_init, }; dj_type = g_type_register_static(HISTOGRAM_IMAGER_TYPE, "BifurcationDiagram", &dj_info, 0); } return dj_type; } static void bifurcation_diagram_class_init(BifurcationDiagramClass *klass) { GObjectClass *object_class; parent_class = g_type_class_ref(G_TYPE_OBJECT); object_class = (GObjectClass*) klass; object_class->dispose = bifurcation_diagram_dispose; } static void bifurcation_diagram_init(BifurcationDiagram *self) { } static void bifurcation_diagram_dispose(GObject *gobject) { BifurcationDiagram *self = BIFURCATION_DIAGRAM(gobject); if (self->columns) { g_free(self->columns); self->columns = NULL; } if (self->interpolant) { g_object_unref(self->interpolant); self->interpolant = NULL; } if (self->interp_data && self->interp_data_free) self->interp_data_free(self->interp_data); self->interp_data = NULL; self->interp_data_free = NULL; G_OBJECT_CLASS(parent_class)->dispose(gobject); } BifurcationDiagram* bifurcation_diagram_new() { return BIFURCATION_DIAGRAM(g_object_new(bifurcation_diagram_get_type(), NULL)); } /************************************************************************************/ /************************************************************************* Settings */ /************************************************************************************/ void bifurcation_diagram_set_interpolator (BifurcationDiagram *self, ParameterInterpolator *interp, gpointer interp_data, GFreeFunc interp_data_free) { /* Free the old interpolator data */ if (self->interp_data && self->interp_data_free) self->interp_data_free(self->interp_data); self->interp = interp; self->interp_data = interp_data; self->interp_data_free = interp_data_free; self->calc_dirty_flag = TRUE; } void bifurcation_diagram_set_linear_endpoints (BifurcationDiagram *self, DeJong *first, DeJong *second) { ParameterHolderPair *pair, *oldpair; /* If the old interpolator was also linear, see if we can avoid this update... */ if (self->interp == PARAMETER_INTERPOLATOR(parameter_holder_interpolate_linear)) { oldpair = (ParameterHolderPair*) self->interp_data; if ((!memcmp(&DE_JONG(oldpair->a)->param, &first->param, sizeof(first->param))) && (!memcmp(&DE_JONG(oldpair->b)->param, &second->param, sizeof(second->param)))) return; } pair = g_new(ParameterHolderPair, 1); pair->a = g_object_ref(first); pair->b = g_object_ref(second); bifurcation_diagram_set_interpolator(self, PARAMETER_INTERPOLATOR(parameter_holder_interpolate_linear), pair, (GFreeFunc) parameter_holder_pair_free); } /************************************************************************************/ /************************************************************************** Columns */ /************************************************************************************/ static void bifurcation_diagram_init_columns (BifurcationDiagram *self) { int hist_width; int i, tmp, j; /* Do we need to resize the column array? */ histogram_imager_get_hist_size(HISTOGRAM_IMAGER(self), &hist_width, NULL); if (hist_width != self->num_columns) { if (self->columns) g_free(self->columns); /* Create columns and number them */ self->num_columns = hist_width; self->current_column = 0; self->columns = g_new0(BifurcationColumn, self->num_columns); for (i=0; inum_columns; i++) self->columns[i].ix = i; /* Shuffle them, so we render in a seemingly-random order */ for (i=self->num_columns-1; i>=0; i--) { j = int_variate(0, i+1); tmp = self->columns[i].ix; self->columns[i].ix = self->columns[j].ix; self->columns[j].ix = tmp; } self->calc_dirty_flag = TRUE; } /* Should we be resetting the columns, either due to * a change in interpolants or a column array resize? */ if (self->calc_dirty_flag || HISTOGRAM_IMAGER(self)->histogram_clear_flag) { /* Clear the histogram if it isn't already */ if (!HISTOGRAM_IMAGER(self)->histogram_clear_flag) histogram_imager_clear(HISTOGRAM_IMAGER(self)); for (i=0; inum_columns; i++) { /* Invalidate each column and each interpolated parameter set */ self->columns[i].point.valid = FALSE; for (j=0; j<(sizeof(self->columns[0].interpolated)/ sizeof(self->columns[0].interpolated[0])); j++) { self->columns[i].interpolated[j].valid = FALSE; } } HISTOGRAM_IMAGER(self)->histogram_clear_flag = FALSE; self->calc_dirty_flag = FALSE; } } static BifurcationColumn* bifurcation_diagram_next_column (BifurcationDiagram *self) { /* Get the next column, wrapping around when we hit the end */ BifurcationColumn *column = &self->columns[self->current_column]; if (++self->current_column >= self->num_columns) self->current_column = 0; /* Initialize this column's point if it isn't yet */ if (!column->point.valid) { column->point.x = uniform_variate(); column->point.y = uniform_variate(); column->point.valid = TRUE; } return column; } static void bifurcation_diagram_get_column_params (BifurcationDiagram *self, BifurcationColumn *column, DeJongParams *param) { /* Get a random parameter set from the given column, creating it if necessary */ int interpIndex = int_variate(0, sizeof(self->columns[0].interpolated)/ sizeof(self->columns[0].interpolated[0])); if (!column->interpolated[interpIndex].valid) { /* Create an interpolant if we don't have one yet */ if (!self->interpolant) self->interpolant = de_jong_new(); /* Pick a random place within the column to perform the interpolation */ self->interp(PARAMETER_HOLDER(self->interpolant), (column->ix + uniform_variate()) / (self->num_columns - 1), self->interp_data); column->interpolated[interpIndex].param = self->interpolant->param; column->interpolated[interpIndex].valid = TRUE; } *param = column->interpolated[interpIndex].param; } /************************************************************************************/ /********************************************************************** Calculation */ /************************************************************************************/ void bifurcation_diagram_calculate (BifurcationDiagram *self, guint iterations_total, guint iterations_per_column) { DeJongParams param; BifurcationColumn *column; HistogramPlot plot; int hist_width, hist_height; double x, y, point_x, point_y; int i, col_i, ix, iy; const float y_min = -3; const float y_max = 3; bifurcation_diagram_init_columns(self); histogram_imager_prepare_plots(HISTOGRAM_IMAGER(self), &plot); histogram_imager_get_hist_size(HISTOGRAM_IMAGER(self), &hist_width, &hist_height); for (i=iterations_total; i;) { column = bifurcation_diagram_next_column(self); bifurcation_diagram_get_column_params(self, column, ¶m); ix = column->ix; point_x = column->point.x; point_y = column->point.y; for(col_i=iterations_per_column; i && col_i; --i, --col_i) { /* These are the actual Peter de Jong map equations. The new point value * gets stored into 'point', then we go on and mess with x and y before plotting. */ x = sin(param.a * point_y) - cos(param.b * point_x); y = sin(param.c * point_x) - cos(param.d * point_y); point_x = x; point_y = y; if (y >= y_min && y < y_max) { iy = (int)( (y - y_min) / (y_max - y_min) * hist_height ); HISTOGRAM_IMAGER_PLOT(plot, ix, iy); } } column->point.x = point_x; column->point.y = point_y; } histogram_imager_finish_plots(HISTOGRAM_IMAGER(self), &plot); } /* The End */ fyre-1.0.1/src/bifurcation-diagram.h0000644000175000001440000001163110356610263014246 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * bifurcation-diagram.h - A HistogramImager that renders a bifurcation diagram * in which one axis interpolates across de Jong parameters * and the other axis shows a 1 dimensional projection of the * image at those parameters. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __BIFURCATION_DIAGRAM_H__ #define __BIFURCATION_DIAGRAM_H__ #include #include "histogram-imager.h" #include "de-jong.h" G_BEGIN_DECLS #define BIFURCATION_DIAGRAM_TYPE (bifurcation_diagram_get_type ()) #define BIFURCATION_DIAGRAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BIFURCATION_DIAGRAM_TYPE, BifurcationDiagram)) #define BIFURCATION_DIAGRAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BIFURCATION_DIAGRAM_TYPE, BifurcationDiagramClass)) #define IS_BIFURCATION_DIAGRAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BIFURCATION_DIAGRAM_TYPE)) #define IS_BIFURCATION_DIAGRAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BIFURCATION_DIAGRAM_TYPE)) typedef struct _BifurcationDiagram BifurcationDiagram; typedef struct _BifurcationDiagramClass BifurcationDiagramClass; typedef struct { /* Stores state information about one column of the bifurcation diagram rendering. * This includes the current point position, the column index, and several sets * of preinterpolated parameters. */ guint ix; struct { gboolean valid; gdouble x, y; } point; struct { gboolean valid; DeJongParams param; double a,b,c,d; } interpolated[8]; } BifurcationColumn; struct _BifurcationDiagram { HistogramImager parent; /* The interpolation function and data used to produce the bifurcation * diagram's X axis. The calculation dirty flag must be set when the * interpolation function changes in a meaningful way. */ ParameterInterpolator *interp; gpointer interp_data; GFreeFunc interp_data_free; gboolean calc_dirty_flag; /* Column cache. This starts out empty, (all initialized flags are FALSE) * but is gradually filled in with interpolated coordinates and current points. * Caching the interpolated params speeds up rendering greatly, and caching * the current point is necessary for transients to eventually fade. */ BifurcationColumn *columns; int current_column, num_columns; /* Temporary DeJong object used during interpolation, created as needed */ DeJong *interpolant; }; struct _BifurcationDiagramClass { HistogramImagerClass parent_class; }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType bifurcation_diagram_get_type(); BifurcationDiagram* bifurcation_diagram_new(); void bifurcation_diagram_calculate (BifurcationDiagram *self, guint iterations_total, guint iterations_per_column); /* The most flexible way to set the interpolation, by * providing a new function and opaque interpolation data. * A free function for the data can also optionally be * provided. This will always cause calculation to start over. */ void bifurcation_diagram_set_interpolator (BifurcationDiagram *self, ParameterInterpolator *interp, gpointer interp_data, GFreeFunc interp_data_free); /* An optimized way to set up linear interpolation between * endpoints from two DeJong objects. If the existing interpolation * was already linear, with the same parameters, the calculation * dirty flag will not be set. */ void bifurcation_diagram_set_linear_endpoints (BifurcationDiagram *self, DeJong *first, DeJong *second); G_END_DECLS #endif /* __BIFURCATION_DIAGRAM_H__ */ /* The End */ fyre-1.0.1/src/image-fu.c0000644000175000001440000001140410446431132012016 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * image-fu.c - Imaging utilities for manipulating GdkPixbufs * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "image-fu.h" void image_add_checkerboard(GdkPixbuf *img) { guchar *pixels = gdk_pixbuf_get_pixels(img); int width = gdk_pixbuf_get_width(img); int height = gdk_pixbuf_get_height(img); int rowstride = gdk_pixbuf_get_rowstride(img); guchar *row, *pixel; int x, y; guint r0, g0, b0, a0, z; g_assert(gdk_pixbuf_get_n_channels(img) == 4); row = pixels; for (y=0; y> 8; *(pixel++) = ((g0 * a0) + z) >> 8; *(pixel++) = ((b0 * a0) + z) >> 8; *(pixel++) = 0xFF; } } row += rowstride; } } void image_draw_hline(GdkPixbuf *img, int x, int y, int width, guint32 color) { guint32 *pixels = (guint32*) gdk_pixbuf_get_pixels(img); int rowstride = gdk_pixbuf_get_rowstride(img); int i; g_assert(gdk_pixbuf_get_n_channels(img) == 4); rowstride >>= 2; pixels += x + y * rowstride; for (i=width; i; i--) { *pixels = color; pixels++; } } void image_draw_vline(GdkPixbuf *img, int x, int y, int height, guint32 color) { guint32 *pixels = (guint32*) gdk_pixbuf_get_pixels(img); int rowstride = gdk_pixbuf_get_rowstride(img); int i; g_assert(gdk_pixbuf_get_n_channels(img) == 4); rowstride >>= 2; pixels += x + y * rowstride; for (i=height; i; i--) { *pixels = color; pixels += rowstride; } } void image_draw_rect_outline(GdkPixbuf *img, int x, int y, int w, int h, guint32 color) { image_draw_hline(img, x, y, w, color); image_draw_hline(img, x, y+h-1, w, color); image_draw_vline(img, x, y, h, color); image_draw_vline(img, x+w-1, y, h, color); } void image_add_thumbnail_frame(GdkPixbuf *img) { guint32 outline = IMAGEFU_COLOR(0xFF, 0x55, 0x55, 0x55); guint32 transparent = IMAGEFU_COLOR(0x00, 0xFF, 0xFF, 0xFF); guint32 shadow = IMAGEFU_COLOR(0x22, 0x00, 0x00, 0x00); int width = gdk_pixbuf_get_width(img); int height = gdk_pixbuf_get_height(img); if (width <= 2) return; if (height <= 2) return; image_draw_rect_outline(img, 0, 0, width, height, transparent); image_draw_rect_outline(img, 1, 1, width-2, height-2, outline); image_draw_hline(img, 2, height-1, width-2, shadow); image_draw_vline(img, width-1, 2, height-2, shadow); } void image_adjust_levels(GdkPixbuf *img) { guchar *pixels = gdk_pixbuf_get_pixels(img); int width = gdk_pixbuf_get_width(img); int height = gdk_pixbuf_get_height(img); int rowstride = gdk_pixbuf_get_rowstride(img); guchar *row, *pixel; int x, y; guchar r,g,b; guchar min, max; gint scale, bias; g_assert(gdk_pixbuf_get_n_channels(img) == 4); /* First pass through the image, take min/max */ min = 0xFF; max = 0x00; row = pixels; for (y=0; y> 16; pixel++; *pixel = (((*pixel) + bias) * scale) >> 16; pixel++; *pixel = (((*pixel) + bias) * scale) >> 16; pixel++; pixel++; } row += rowstride; } } /* The End */ fyre-1.0.1/src/image-fu.h0000644000175000001440000000406410356610436012035 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * image-fu.h - Imaging utilities for manipulating GdkPixbufs * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __IMAGE_FU_H__ #define __IMAGE_FU_H__ #include /* Convert an ARGB color to a packed guint32 */ #define IMAGEFU_COLOR(a,r,g,b) (GUINT32_TO_LE(((a)<<24) | ((b)<<16) | ((g)<<8) | (r))) /* This must be a power of two. It's hardcoded in image_add_checkerboard * for speed, but it might be needed for calculations elsewhere. */ #define CHECKERBOARD_TILE_SIZE 8 /* Do an in-place composite on a GdkPixbuf to render it in front of a checkerboard pattern */ void image_add_checkerboard(GdkPixbuf *img); /* Orthogonal line drawing */ void image_draw_hline(GdkPixbuf *img, int x, int y, int width, guint32 color); void image_draw_vline(GdkPixbuf *img, int x, int y, int height, guint32 color); void image_draw_rect_outline(GdkPixbuf *img, int x, int y, int w, int h, guint32 color); /* Modify an image in-place to include a thin frame */ void image_add_thumbnail_frame(GdkPixbuf *img); /* Adjust an image's levels automatically, to make faint images more visible. * This runs on RGBA images, but ignores the alpha channel. */ void image_adjust_levels(GdkPixbuf *img); #endif /* __IMAGE_FU_H__ */ /* The End */ fyre-1.0.1/src/explorer-animation.c0000644000175000001440000006256010446431132014152 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * explorer-animation.c - Implements the explorer GUI's animation editor * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "explorer.h" #include "curve-editor.h" #include "cell-renderer-transition.h" #include "cell-renderer-bifurcation.h" #include static void explorer_update_animation_length(Explorer *self); static void explorer_init_keyframe_view(Explorer *self); static void explorer_init_visible_animation(GtkWindow *main_window, Explorer *self); static void on_anim_play_toggled(GtkWidget *widget, gpointer user_data); static void on_close(GtkWidget *widget, gpointer user_data); static void on_keyframe_add(GtkWidget *widget, gpointer user_data); static void on_keyframe_replace(GtkWidget *widget, gpointer user_data); static void on_keyframe_delete(GtkWidget *widget, gpointer user_data); static void on_keyframe_view_cursor_changed(GtkWidget *widget, gpointer user_data); static gboolean on_anim_window_delete(GtkWidget *widget, GdkEvent *event, gpointer user_data); static void on_anim_new(GtkWidget *widget, gpointer user_data); static void on_anim_open(GtkWidget *widget, gpointer user_data); static void on_anim_save(GtkWidget *widget, gpointer user_data); static void on_anim_save_as(GtkWidget *widget, gpointer user_data); static void on_anim_scale_changed(GtkWidget *widget, gpointer user_data); static void on_anim_transition_scale_changed(GtkWidget *widget, gpointer user_data); static void on_anim_set_linear(GtkWidget *widget, gpointer user_data); static void on_anim_set_smooth(GtkWidget *widget, gpointer user_data); static void on_anim_curve_changed(GtkWidget *widget, gpointer user_data); static void on_anim_render(GtkWidget *widget, gpointer user_data); static void on_anim_render_closed(GtkWidget *widget, gpointer user_data); static void on_keyframe_duration_change(GtkWidget *widget, gpointer user_data); static char *current_filename = NULL; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ void explorer_init_animation(Explorer *self) { /* Connect signal handlers */ glade_xml_signal_connect_data(self->xml, "on_close", G_CALLBACK(on_close), self); glade_xml_signal_connect_data(self->xml, "on_anim_play_toggled", G_CALLBACK(on_anim_play_toggled), self); glade_xml_signal_connect_data(self->xml, "on_keyframe_add", G_CALLBACK(on_keyframe_add), self); glade_xml_signal_connect_data(self->xml, "on_keyframe_replace", G_CALLBACK(on_keyframe_replace), self); glade_xml_signal_connect_data(self->xml, "on_keyframe_delete", G_CALLBACK(on_keyframe_delete), self); glade_xml_signal_connect_data(self->xml, "on_keyframe_view_cursor_changed", G_CALLBACK(on_keyframe_view_cursor_changed), self); glade_xml_signal_connect_data(self->xml, "on_anim_window_delete", G_CALLBACK(on_anim_window_delete), self); glade_xml_signal_connect_data(self->xml, "on_anim_new", G_CALLBACK(on_anim_new), self); glade_xml_signal_connect_data(self->xml, "on_anim_open", G_CALLBACK(on_anim_open), self); glade_xml_signal_connect_data(self->xml, "on_anim_save", G_CALLBACK(on_anim_save), self); glade_xml_signal_connect_data(self->xml, "on_anim_save_as", G_CALLBACK(on_anim_save_as), self); glade_xml_signal_connect_data(self->xml, "on_anim_scale_changed", G_CALLBACK(on_anim_scale_changed), self); glade_xml_signal_connect_data(self->xml, "on_anim_transition_scale_changed", G_CALLBACK(on_anim_transition_scale_changed), self); glade_xml_signal_connect_data(self->xml, "on_anim_set_linear", G_CALLBACK(on_anim_set_linear), self); glade_xml_signal_connect_data(self->xml, "on_anim_set_smooth", G_CALLBACK(on_anim_set_smooth), self); glade_xml_signal_connect_data(self->xml, "on_keyframe_duration_change", G_CALLBACK(on_keyframe_duration_change), self); glade_xml_signal_connect_data(self->xml, "on_anim_render", G_CALLBACK(on_anim_render), self); /* Add our CurveEditor, a modified GtkCurve widget */ self->anim_curve = curve_editor_new(); gtk_container_add(GTK_CONTAINER(glade_xml_get_widget(self->xml, "anim_curve_box")), self->anim_curve); gtk_widget_set_size_request(GTK_WIDGET(self->anim_curve), 175, 175); g_signal_connect(self->anim_curve, "changed", G_CALLBACK(on_anim_curve_changed), self); gtk_widget_show_all(self->anim_curve); explorer_update_animation_length(self); explorer_init_keyframe_view(self); /* If we started out with an animation (e.g. from the command line) * go ahead and show the animation window after the main window * has been mapped. */ if (animation_get_length(self->animation) > 0) { g_signal_connect(G_OBJECT(self->window), "map", G_CALLBACK(explorer_init_visible_animation), self); } } static void explorer_init_visible_animation(GtkWindow *main_window, Explorer *self) { /* If our animation window needs to be initially visible, show it once * the main window is visible. This prevents it form showing up first and * hiding behind the main window- it's less intrusive than explicitly raising * the window later. */ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM( glade_xml_get_widget(self->xml, "toggle_animation_window")), TRUE); /* Remove the event handler, we only want to do this once */ g_signal_handlers_disconnect_by_func(main_window, explorer_init_visible_animation, self); } void explorer_dispose_animation(Explorer *self) { if (self->animation) { g_object_unref(self->animation); self->animation = NULL; } if (self->render_window) { g_object_unref(self->render_window); self->render_window = NULL; } } /************************************************************************************/ /****************************************************************** Keyframe Editor */ /************************************************************************************/ static void explorer_init_keyframe_view(Explorer *self) { GtkTreeView *tv = GTK_TREE_VIEW(glade_xml_get_widget(self->xml, "keyframe_view")); GtkTreeViewColumn *col; GtkCellRenderer *renderer; gtk_tree_view_set_model(tv, GTK_TREE_MODEL(self->animation->model)); /* The first column displays the keyframe, in the form of a thumbnail */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, "Keyframe"); renderer = gtk_cell_renderer_pixbuf_new(); g_object_set(renderer, "xpad", 0, "ypad", 0, NULL); gtk_tree_view_column_pack_start(col, renderer, FALSE); gtk_tree_view_column_set_attributes(col, renderer, "pixbuf", ANIMATION_MODEL_THUMBNAIL, NULL); gtk_tree_view_append_column(tv, col); /* The second column uses a custom cell renderer to show the curve and duration */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, "Transition"); renderer = cell_renderer_transition_new(); g_object_set(renderer, "xpad", 6, "ypad", 0, "spline-size", 96, NULL); gtk_tree_view_column_pack_start(col, renderer, FALSE); gtk_tree_view_column_set_attributes(col, renderer, "spline", ANIMATION_MODEL_SPLINE, "duration", ANIMATION_MODEL_DURATION, NULL); gtk_tree_view_append_column(tv, col); /* The third column uses another custom cell renderer to show a bifurcation * diagram of the transition between this keyframe and the next, given * the iterator and animation. */ col = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(col, "Bifurcation Diagram"); renderer = cell_renderer_bifurcation_new(); g_object_set(renderer, "xpad", 0, "ypad", 0, "animation", self->animation, NULL); CELL_RENDERER_BIFURCATION(renderer)->tree = tv; gtk_tree_view_column_pack_start(col, renderer, TRUE); gtk_tree_view_column_set_attributes(col, renderer, "row-id", ANIMATION_MODEL_ROW_ID, NULL); gtk_tree_view_append_column(tv, col); } static void explorer_get_current_keyframe(Explorer *self, GtkTreeIter *iter) { GtkTreePath *path; GtkTreeView *tv = GTK_TREE_VIEW(glade_xml_get_widget(self->xml, "keyframe_view")); gtk_tree_view_get_cursor(tv, &path, NULL); gtk_tree_model_get_iter(GTK_TREE_MODEL(self->animation->model), iter, path); gtk_tree_path_free(path); } static void on_keyframe_add(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); animation_keyframe_append(self->animation, PARAMETER_HOLDER(self->map)); explorer_update_animation_length(self); } static void on_keyframe_replace(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); GtkTreeIter iter; explorer_get_current_keyframe(self, &iter); animation_keyframe_store(self->animation, &iter, PARAMETER_HOLDER(self->map)); } static void on_keyframe_delete(GtkWidget *widget, gpointer user_data) { /* Determine which row the cursor is on, delete it, and make the delete * button insensitive again until another row is selected. */ Explorer *self = EXPLORER(user_data); GtkTreeIter iter; explorer_get_current_keyframe(self, &iter); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "keyframe_delete_button"), FALSE); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "keyframe_replace_button"), FALSE); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "anim_transition_box"), FALSE); gtk_list_store_remove(self->animation->model, &iter); explorer_update_animation_length(self); } static void on_keyframe_view_cursor_changed(GtkWidget *widget, gpointer user_data) { /* This is called when a new row in the keyframe view is selected. * enable the delete button, and load this row's parameters. */ Explorer *self = EXPLORER(user_data); GtkTreeIter iter; Spline *spline; gdouble keyframe_duration; explorer_get_current_keyframe(self, &iter); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "keyframe_delete_button"), TRUE); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "keyframe_replace_button"), TRUE); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "anim_transition_box"), TRUE); if (!self->seeking_animation) { /* Assuming the user clicked us rather than this being called as the result of * a seek, seek the animation to this keyframe's location. */ self->selecting_keyframe = TRUE; gtk_range_set_value(GTK_RANGE(glade_xml_get_widget(self->xml, "anim_scale")), animation_keyframe_get_time(self->animation, &iter)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(self->xml, "anim_play_button")), FALSE); self->selecting_keyframe = FALSE; /* Now load this keyframe's parameters. Usually seeking won't do this, * but we need to make sure because zero-duration keyframes can't be seeked to. */ animation_keyframe_load(self->animation, &iter, PARAMETER_HOLDER(self->map)); /* Set the transition scale to zero. Normally setting anim_scale would be * enough, but if the keyframe changes but the scale value doesn't (such * as when a keyframe is first selected) it might not. */ gtk_range_set_value(GTK_RANGE(glade_xml_get_widget(self->xml, "anim_transition_scale")), 0); } /* Load this keyframe's transition parameters into our GUI */ self->allow_transition_changes = FALSE; gtk_tree_model_get(GTK_TREE_MODEL(self->animation->model), &iter, ANIMATION_MODEL_DURATION, &keyframe_duration, ANIMATION_MODEL_SPLINE, &spline, -1); gtk_spin_button_set_value(GTK_SPIN_BUTTON(glade_xml_get_widget(self->xml, "keyframe_duration")), keyframe_duration); curve_editor_set_spline(CURVE_EDITOR(self->anim_curve), spline); spline_free(spline); self->allow_transition_changes = TRUE; } static void on_anim_set_linear(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); curve_editor_set_spline(CURVE_EDITOR(self->anim_curve), &spline_template_linear); } static void on_anim_set_smooth(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); curve_editor_set_spline(CURVE_EDITOR(self->anim_curve), &spline_template_smooth); } static void on_keyframe_duration_change(GtkWidget *widget, gpointer user_data) { /* The user just changed the current keyframe's duration. * Update the tree model, and recalculate the size of our animation. */ Explorer *self = EXPLORER(user_data); GtkTreeIter iter; if (!self->allow_transition_changes) return; explorer_get_current_keyframe(self, &iter); gtk_list_store_set(self->animation->model, &iter, ANIMATION_MODEL_DURATION, (gdouble) gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)), -1); explorer_update_animation_length(self); } static void on_anim_curve_changed(GtkWidget *widget, gpointer user_data) { /* The user just changed the current keyframe's spline, update the model */ Explorer *self = EXPLORER(user_data); GtkTreeIter iter; Spline *spline; if (!self->allow_transition_changes) return; explorer_get_current_keyframe(self, &iter); spline = curve_editor_get_spline(CURVE_EDITOR(self->anim_curve)); gtk_list_store_set(self->animation->model, &iter, ANIMATION_MODEL_SPLINE, spline, -1); spline_free(spline); } /************************************************************************************/ /****************************************************************** Playing/seeking */ /************************************************************************************/ void explorer_update_animation(Explorer *self) { /* Move on to the next frame if we're playing an animation */ GTimeVal now; double diff, new_value; GtkRange *range; GtkAdjustment *adj; GtkWidget *loop_widget; if (!self->playing_animation) return; g_get_current_time(&now); diff = ((now.tv_usec - self->last_anim_frame_time.tv_usec) / 1000000.0 + (now.tv_sec - self->last_anim_frame_time.tv_sec )); self->last_anim_frame_time = now; range = GTK_RANGE(glade_xml_get_widget(self->xml, "anim_scale")); adj = gtk_range_get_adjustment(range); new_value = adj->value + diff; if (new_value < adj->upper) { gtk_range_set_value(range, new_value); } else { /* We've reached the end... */ loop_widget = glade_xml_get_widget(self->xml, "loop_animation"); if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(loop_widget))) { /* Loop the animation */ gtk_range_set_value(range, adj->lower); } else { /* Stop at the end */ gtk_range_set_value(range, adj->upper); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(self->xml, "anim_play_button")), FALSE); } } } static void on_anim_play_toggled(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); GtkRange *range = GTK_RANGE(glade_xml_get_widget(self->xml, "anim_scale")); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { /* If our animation is already at its end, start it over */ if (gtk_range_get_value(range) >= gtk_range_get_adjustment(range)->upper - 0.1) gtk_range_set_value(range, 0); g_get_current_time(&self->last_anim_frame_time); self->playing_animation = TRUE; } else { self->playing_animation = FALSE; } /* It's a bad thing for the user to be playing with the curve while animation is playing. * More specifically, it's bad for us to change the contents of the curve while * the user is dragging a control point. */ gtk_widget_set_sensitive(GTK_WIDGET(self->anim_curve), !self->playing_animation); } static void explorer_update_animation_length(Explorer *self) { /* Recalculate the length of the animation and update the anim_scale accordingly */ GtkWidget *scale = glade_xml_get_widget(self->xml, "anim_scale"); GtkWidget *render_menu = glade_xml_get_widget(self->xml, "anim_render"); gdouble length = animation_get_length(self->animation); gboolean enable = length > 0.0001; /* To keep the GtkRange from complaining */ if (!enable) length = 1; gtk_range_set_adjustment(GTK_RANGE(scale), GTK_ADJUSTMENT(gtk_adjustment_new(gtk_range_get_value(GTK_RANGE(scale)), 0, length, 0.01, 1, 0))); gtk_widget_set_sensitive(scale, enable); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "anim_play_button"), enable); gtk_widget_set_sensitive(GTK_WIDGET(render_menu), enable); } static void on_anim_scale_changed(GtkWidget *widget, gpointer user_data) { /* The scale widget indicating our current position in the entire animation has changed */ double v = gtk_range_get_adjustment(GTK_RANGE(widget))->value; Explorer *self = EXPLORER(user_data); AnimationIter iter; GtkTreePath *path; GtkTreeView *tv = GTK_TREE_VIEW(glade_xml_get_widget(self->xml, "keyframe_view")); gdouble keyframe_duration; self->seeking_animation = TRUE; /* Seek to the right place in the animation and load an interpolated frame */ animation_iter_seek(self->animation, &iter, v); if (iter.valid) { /* This shoudln't be entered into our history list */ self->history_freeze = TRUE; animation_iter_load(self->animation, &iter, PARAMETER_HOLDER(self->map)); self->history_freeze = FALSE; /* Seek the transition_scale to our current position within the current keyframe */ if (!self->seeking_animation_transition) { gtk_tree_model_get(GTK_TREE_MODEL(self->animation->model), &iter.keyframe, ANIMATION_MODEL_DURATION, &keyframe_duration, -1); if (keyframe_duration > 0.00001) { gtk_range_set_value(GTK_RANGE(glade_xml_get_widget(self->xml, "anim_transition_scale")), iter.time_after_keyframe / keyframe_duration); } } if (!self->selecting_keyframe) { /* Put the tree view's cursor on the current keyframe */ path = gtk_tree_model_get_path(GTK_TREE_MODEL(self->animation->model), &iter.keyframe); gtk_tree_view_set_cursor(tv, path, NULL, FALSE); gtk_tree_path_free(path); } if (!self->playing_animation) { /* Just like the color picker, the hscale will probably try to suck up * all of the idle time we might have been spending rendering things. * Force at least a little rendering to happen right now. */ explorer_run_iterations(self); } } self->seeking_animation = FALSE; } static void on_anim_transition_scale_changed(GtkWidget *widget, gpointer user_data) { /* The scale widget indicating our current position in this keyframe has changed. * Update our position in the whole animation. */ double v; Explorer *self = EXPLORER(user_data); GtkTreeIter iter; gdouble keyframe_duration; self->seeking_animation_transition = TRUE; if (!self->seeking_animation) { v = gtk_range_get_adjustment(GTK_RANGE(widget))->value; explorer_get_current_keyframe(self, &iter); gtk_tree_model_get(GTK_TREE_MODEL(self->animation->model), &iter, ANIMATION_MODEL_DURATION, &keyframe_duration, -1); /* Calculate a new position for the main anim_scale to get the * requested value within this transition. Note the multiplication by 0.9999, * and adding 0.00001. This prevents this from actually ever touching either * keyframe, so we don't inadvertently go forward or backward by one keyframe. */ gtk_range_set_value(GTK_RANGE(glade_xml_get_widget(self->xml, "anim_scale")), animation_keyframe_get_time(self->animation, &iter) + v * keyframe_duration * 0.9999 + 0.00001); } self->seeking_animation_transition = FALSE; } /************************************************************************************/ /******************************************************************** Menu Commands */ /************************************************************************************/ static gboolean on_anim_window_delete(GtkWidget *widget, GdkEvent *event, gpointer user_data) { /* Just hide the window when the user tries to close it */ Explorer *self = EXPLORER(user_data); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(self->xml, "toggle_animation_window")), FALSE); return TRUE; } static void on_close(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(self->xml, "toggle_animation_window")), FALSE); } static void on_anim_new(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); animation_clear(self->animation); explorer_update_animation_length(self); if (current_filename) { g_free (current_filename); current_filename = NULL; } } static void on_anim_open (GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER (user_data); GtkWidget *dialog; #if (GTK_CHECK_VERSION(2, 4, 0)) dialog = gtk_file_chooser_dialog_new ("Open Animation Keyframes", GTK_WINDOW (glade_xml_get_widget (self->xml, "animation_window")), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { gchar *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); animation_load_file (self->animation, filename); explorer_update_animation_length (self); if (current_filename); g_free (current_filename); current_filename = filename; } #else dialog = gtk_file_selection_new ("Open Animation Keyframes"); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { const gchar *filename; filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION(dialog)); animation_load_file (self->animation, filename); explorer_update_animation_length (self); if (current_filename) g_free (current_filename); current_filename = g_strdup (filename); } #endif gtk_widget_destroy (dialog); } static void on_anim_save(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER (user_data); if (!current_filename) { on_anim_save_as(widget, user_data); return; } animation_save_file (self->animation, current_filename); } static void on_anim_save_as (GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER (user_data); GtkWidget *dialog; #if (GTK_CHECK_VERSION(2, 4, 0)) dialog = gtk_file_chooser_dialog_new ("Save Animation Keyframes", GTK_WINDOW (glade_xml_get_widget (self->xml, "animation_window")), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { gchar *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); animation_save_file (self->animation, filename); if (current_filename) g_free (current_filename); current_filename = filename; } #else dialog = gtk_file_selection_new ("Save Animation Keyframes"); gtk_file_selection_set_filename (GTK_FILE_SELECTION (dialog), "animation.fa"); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { const gchar *filename; filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (dialog)); animation_save_file (self->animation, filename); if (current_filename) g_free (current_filename); current_filename = g_strdup (filename); } #endif gtk_widget_destroy(dialog); } static void on_anim_render(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); /* The user probably wants the main window to pause, so it doesn't * suck up CPU they would rather be using for animation... */ explorer_force_pause(self); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "anim_render"), FALSE); self->render_window = animation_render_ui_new(self->animation); g_signal_connect(self->render_window, "closed", G_CALLBACK(on_anim_render_closed), self); } static void on_anim_render_closed(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); g_object_unref(self->render_window); self->render_window = NULL; gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "anim_render"), TRUE); } /* The End */ fyre-1.0.1/src/curve-editor.c0000644000175000001440000003060210263337623012744 00000000000000/* GTK - The GIMP Toolkit * Copyright (C) 1997 David Mosberger * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ /* This was originally the GtkCurve widget from the GTK+ 2.3.2 release. * It has been modified in many ways, see curve-editor.h for more information. */ #include #include #include #include "curve-editor.h" #define RADIUS 3 /* radius of the control points */ #define MIN_DISTANCE 8 /* min distance between control points */ #define GRAPH_MASK (GDK_EXPOSURE_MASK | \ GDK_POINTER_MOTION_MASK | \ GDK_POINTER_MOTION_HINT_MASK | \ GDK_ENTER_NOTIFY_MASK | \ GDK_BUTTON_PRESS_MASK | \ GDK_BUTTON_RELEASE_MASK | \ GDK_BUTTON1_MOTION_MASK) static GtkDrawingAreaClass *parent_class = NULL; /* forward declarations: */ static void curve_editor_class_init (CurveEditorClass *class); static void curve_editor_init (CurveEditor *curve); static void curve_editor_finalize (GObject *object); static gint curve_editor_graph_events (GtkWidget *widget, GdkEvent *event, CurveEditor *c); enum { CHANGED_SIGNAL, LAST_SIGNAL }; static guint curve_editor_signals[LAST_SIGNAL] = { 0 }; GType curve_editor_get_type (void) { static GType curve_type = 0; if (!curve_type) { static const GTypeInfo curve_info = { sizeof (CurveEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) curve_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (CurveEditor), 0, /* n_preallocs */ (GInstanceInitFunc) curve_editor_init, }; curve_type = g_type_register_static (GTK_TYPE_DRAWING_AREA, "CurveEditor", &curve_info, 0); } return curve_type; } static void curve_editor_class_init (CurveEditorClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS (class); parent_class = g_type_class_peek_parent (class); gobject_class->finalize = curve_editor_finalize; curve_editor_signals[CHANGED_SIGNAL] = g_signal_new("changed", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(CurveEditorClass, curve_editor), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void curve_editor_init (CurveEditor *curve) { gint old_mask; curve->cursor_type = GDK_TOP_LEFT_ARROW; curve->pixmap = NULL; curve->height = 0; curve->grab_point = -1; curve->num_points = 0; curve->point = 0; curve->spline.num_points = 0; curve->spline.points = NULL; old_mask = gtk_widget_get_events (GTK_WIDGET (curve)); gtk_widget_set_events (GTK_WIDGET (curve), old_mask | GRAPH_MASK); g_signal_connect (curve, "event", G_CALLBACK (curve_editor_graph_events), curve); } static int project (gfloat value, gfloat min, gfloat max, int norm) { return (norm - 1) * ((value - min) / (max - min)) + 0.5; } static gfloat unproject (gint value, gfloat min, gfloat max, int norm) { return value / (gfloat) (norm - 1) * (max - min) + min; } static void curve_editor_interpolate (CurveEditor *c, gint width, gint height) { gfloat *vector; int i; Spline *active = spline_find_active_points(&c->spline); vector = g_malloc (width * sizeof (vector[0])); spline_solve_and_eval_all(active, width, vector); g_free(active); c->height = height; if (c->num_points != width) { c->num_points = width; if (c->point) g_free (c->point); c->point = g_malloc (c->num_points * sizeof (c->point[0])); } for (i = 0; i < width; ++i) { c->point[i].x = RADIUS + i; c->point[i].y = RADIUS + height - project (vector[i], 0, 1, height); } g_free (vector); } static void curve_editor_draw (CurveEditor *c, gint width, gint height) { GtkStateType state; GtkStyle *style; gint i; if (!c->pixmap) return; if (c->height != height || c->num_points != width) curve_editor_interpolate (c, width, height); state = GTK_STATE_NORMAL; if (!GTK_WIDGET_IS_SENSITIVE (GTK_WIDGET (c))) { state = GTK_STATE_INSENSITIVE; /* Release any grabbed point if we're insensitive. * This is important if we become insensitive while the * user is dragging. */ c->grab_point = -1; } style = GTK_WIDGET (c)->style; /* clear the pixmap: */ gtk_paint_flat_box (style, c->pixmap, GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, GTK_WIDGET (c), "curve_bg", 0, 0, width + RADIUS * 2, height + RADIUS * 2); /* draw the grid lines: (XXX make more meaningful) */ for (i = 0; i < 5; i++) { gdk_draw_line (c->pixmap, style->dark_gc[state], RADIUS, i * (height / 4.0) + RADIUS, width + RADIUS, i * (height / 4.0) + RADIUS); gdk_draw_line (c->pixmap, style->dark_gc[state], i * (width / 4.0) + RADIUS, RADIUS, i * (width / 4.0) + RADIUS, height + RADIUS); } gdk_draw_lines (c->pixmap, style->fg_gc[state], c->point, c->num_points); for (i = 0; i < c->spline.num_points; ++i) { gint x, y; if (c->spline.points[i][0] < 0) continue; x = project (c->spline.points[i][0], 0, 1, width); y = height - project (c->spline.points[i][1], 0, 1, height); /* draw a bullet: */ gdk_draw_arc (c->pixmap, style->fg_gc[state], TRUE, x, y, RADIUS * 2, RADIUS*2, 0, 360*64); } gdk_draw_drawable (GTK_WIDGET (c)->window, style->fg_gc[state], c->pixmap, 0, 0, 0, 0, width + RADIUS * 2, height + RADIUS * 2); } static gint curve_editor_graph_events (GtkWidget *widget, GdkEvent *event, CurveEditor *c) { GdkCursorType new_type = c->cursor_type; gint i, src, dst, leftbound, rightbound; GdkEventButton *bevent; GdkEventMotion *mevent; GtkWidget *w; gint tx, ty; gint cx, x, y, width, height; gint closest_point = 0; gfloat rx, ry, min_x; guint distance; gint retval = FALSE; w = GTK_WIDGET (c); width = w->allocation.width - RADIUS * 2; height = w->allocation.height - RADIUS * 2; if ((width < 0) || (height < 0)) return FALSE; /* get the pointer position */ gdk_window_get_pointer (w->window, &tx, &ty, NULL); x = CLAMP ((tx - RADIUS), 0, width-1); y = CLAMP ((ty - RADIUS), 0, height-1); min_x = 0; distance = ~0U; for (i = 0; i < c->spline.num_points; ++i) { cx = project (c->spline.points[i][0], min_x, 1, width); if ((guint) abs (x - cx) < distance) { distance = abs (x - cx); closest_point = i; } } switch (event->type) { case GDK_CONFIGURE: if (c->pixmap) g_object_unref (c->pixmap); c->pixmap = NULL; /* fall through */ case GDK_EXPOSE: if (!c->pixmap) c->pixmap = gdk_pixmap_new (w->window, w->allocation.width, w->allocation.height, -1); curve_editor_draw (c, width, height); break; case GDK_BUTTON_PRESS: gtk_grab_add (widget); bevent = (GdkEventButton *) event; new_type = GDK_TCROSS; if (distance > MIN_DISTANCE) { /* insert a new control point */ if (c->spline.num_points > 0) { cx = project (c->spline.points[closest_point][0], min_x, 1, width); if (x > cx) ++closest_point; } ++c->spline.num_points; c->spline.points = g_realloc (c->spline.points, c->spline.num_points * sizeof (*c->spline.points)); for (i = c->spline.num_points - 1; i > closest_point; --i) memcpy (c->spline.points + i, c->spline.points + i - 1, sizeof (*c->spline.points)); } c->grab_point = closest_point; c->spline.points[c->grab_point][0] = unproject (x, min_x, 1, width); c->spline.points[c->grab_point][1] = unproject (height - y, 0, 1, height); curve_editor_interpolate (c, width, height); curve_editor_draw (c, width, height); g_signal_emit(G_OBJECT(c), curve_editor_signals[CHANGED_SIGNAL], 0); retval = TRUE; break; case GDK_BUTTON_RELEASE: gtk_grab_remove (widget); /* delete inactive points: */ for (src = dst = 0; src < c->spline.num_points; ++src) { if (c->spline.points[src][0] >= min_x) { memcpy (c->spline.points + dst, c->spline.points + src, sizeof (*c->spline.points)); ++dst; } } if (dst < src) { c->spline.num_points -= (src - dst); if (c->spline.num_points <= 0) { c->spline.num_points = 1; c->spline.points[0][0] = min_x; c->spline.points[0][1] = 0; curve_editor_interpolate (c, width, height); curve_editor_draw (c, width, height); } c->spline.points = g_realloc (c->spline.points, c->spline.num_points * sizeof (*c->spline.points)); } new_type = GDK_FLEUR; c->grab_point = -1; retval = TRUE; break; case GDK_MOTION_NOTIFY: mevent = (GdkEventMotion *) event; if (c->grab_point == -1) { /* if no point is grabbed... */ if (distance <= MIN_DISTANCE) new_type = GDK_FLEUR; else new_type = GDK_TCROSS; } else { /* drag the grabbed point */ new_type = GDK_TCROSS; leftbound = -MIN_DISTANCE; if (c->grab_point > 0) leftbound = project (c->spline.points[c->grab_point - 1][0], min_x, 1, width); rightbound = width + RADIUS * 2 + MIN_DISTANCE; if (c->grab_point + 1 < c->spline.num_points) rightbound = project (c->spline.points[c->grab_point + 1][0], min_x, 1, width); if (tx <= leftbound || tx >= rightbound || ty > height + RADIUS * 2 + MIN_DISTANCE || ty < -MIN_DISTANCE) c->spline.points[c->grab_point][0] = min_x - 1.0; else { rx = unproject (x, min_x, 1, width); ry = unproject (height - y, 0, 1, height); c->spline.points[c->grab_point][0] = rx; c->spline.points[c->grab_point][1] = ry; } curve_editor_interpolate (c, width, height); curve_editor_draw (c, width, height); g_signal_emit(G_OBJECT(c), curve_editor_signals[CHANGED_SIGNAL], 0); } if (new_type != (GdkCursorType) c->cursor_type) { GdkCursor *cursor; c->cursor_type = new_type; cursor = gdk_cursor_new_for_display (gtk_widget_get_display (w), c->cursor_type); gdk_window_set_cursor (w->window, cursor); gdk_cursor_unref (cursor); } retval = TRUE; break; default: break; } return retval; } void curve_editor_set_spline(CurveEditor* self, const Spline *spline) { if (self->spline.points) g_free (self->spline.points); self->spline.num_points = spline->num_points; self->spline.points = g_malloc (spline->num_points * sizeof (SplineControlPoint)); memcpy(self->spline.points, spline->points, spline->num_points * sizeof (SplineControlPoint)); if (self->pixmap) { gint width, height; width = GTK_WIDGET (self)->allocation.width - RADIUS * 2; height = GTK_WIDGET (self)->allocation.height - RADIUS * 2; curve_editor_interpolate (self, width, height); curve_editor_draw (self, width, height); } g_signal_emit(G_OBJECT(self), curve_editor_signals[CHANGED_SIGNAL], 0); } Spline* curve_editor_get_spline(CurveEditor* self) { return spline_find_active_points(&self->spline); } GtkWidget* curve_editor_new (void) { return g_object_new (TYPE_CURVE_EDITOR, NULL); } static void curve_editor_finalize (GObject *object) { CurveEditor *curve; g_return_if_fail (IS_CURVE_EDITOR (object)); curve = CURVE_EDITOR(object); if (curve->pixmap) g_object_unref (curve->pixmap); if (curve->point) g_free (curve->point); if (curve->spline.points) g_free (curve->spline.points); G_OBJECT_CLASS (parent_class)->finalize (object); } /* The End */ fyre-1.0.1/src/curve-editor.h0000644000175000001440000000627510263337623012762 00000000000000/* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ /* This was originally the GtkCurve widget from the GTK+ 2.3.2 release. * It has been modified in two major ways: * * - It has been simplified by removing support for linear and free-form curves, * and support for user-definable X and Y range. The range is always [0,1] now. * * - Functions allowing access to the spline itself have been added, replacing * the functions that only allowed access to interpolated points. * * - The spline functions were split into a separate boxed type and source file. * An easy evaluation function and serialization functions were added. * * -- Micah Dowty */ #ifndef __CURVE_EDITOR_H__ #define __CURVE_EDITOR_H__ #include #include #include "spline.h" G_BEGIN_DECLS #define TYPE_CURVE_EDITOR (curve_editor_get_type ()) #define CURVE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CURVE_EDITOR, CurveEditor)) #define CURVE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_CURVE_EDITOR, CurveEditorClass)) #define IS_CURVE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CURVE_EDITOR)) #define IS_CURVE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CURVE_EDITOR)) #define CURVE_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CURVE_EDITOR, CurveEditorClass)) typedef struct _CurveEditor CurveEditor; typedef struct _CurveEditorClass CurveEditorClass; struct _CurveEditor { GtkDrawingArea parent; gint cursor_type; GdkPixmap *pixmap; gint height; /* (cached) graph height in pixels */ gint grab_point; /* point currently grabbed */ gint last; /* (cached) curve points: */ gint num_points; GdkPoint *point; Spline spline; }; struct _CurveEditorClass { GtkDrawingAreaClass parent_class; void (* curve_editor) (CurveEditor *cb); }; GType curve_editor_get_type (void); GtkWidget* curve_editor_new (void); void curve_editor_set_spline(CurveEditor* self, const Spline *spline); Spline* curve_editor_get_spline(CurveEditor* self); G_END_DECLS #endif /* __CURVE_EDITOR_H__ */ /* The End */ fyre-1.0.1/src/discovery-client.c0000644000175000001440000001440110356610603013611 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * discovery-client.c - This is a client that looks for DiscoveryServer * objects on remote machines. Requests can be sent out, * and a callback will be invoked when any servers * reply. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "config.h" #include "platform.h" #include #include "discovery-server.h" #include "discovery-client.h" static void discovery_client_class_init (DiscoveryClientClass* klass); static void discovery_client_init (DiscoveryClient* self); static void discovery_client_dispose (GObject* gobject); static gboolean discovery_client_read (GIOChannel* source, GIOCondition condition, gpointer user_data); static gboolean discovery_client_broadcast (gpointer user_data); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType discovery_client_get_type(void) { static GType anim_type = 0; if (!anim_type) { static const GTypeInfo dj_info = { sizeof(DiscoveryClientClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) discovery_client_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(DiscoveryClient), 0, (GInstanceInitFunc) discovery_client_init, }; anim_type = g_type_register_static(G_TYPE_OBJECT, "DiscoveryClient", &dj_info, 0); } return anim_type; } static void discovery_client_class_init(DiscoveryClientClass *klass) { GObjectClass *object_class; object_class = (GObjectClass*) klass; object_class->dispose = discovery_client_dispose; } static void discovery_client_dispose(GObject *gobject) { DiscoveryClient *self = DISCOVERY_CLIENT(gobject); if (self->broadcast_timer) { g_source_remove(self->broadcast_timer); self->broadcast_timer = 0; } if (self->socket_reader) { g_source_remove(self->socket_reader); self->socket_reader = 0; } if (self->socket) { gnet_udp_socket_delete(self->socket); self->socket = NULL; } if (self->service_name) { g_free(self->service_name); self->service_name = NULL; } if (self->buffer) { g_free(self->buffer); self->buffer = NULL; } if (self->broadcast) { gnet_inetaddr_delete(self->broadcast); self->broadcast = NULL; } } static void discovery_client_init(DiscoveryClient *self) { self->socket = gnet_udp_socket_new(); self->broadcast = gnet_inetaddr_new("255.255.255.255", FYRE_DISCOVERY_PORT); } DiscoveryClient* discovery_client_new(const gchar* service_name, guint interval, DiscoveryCallback* callback, gpointer user_data) { DiscoveryClient *self = DISCOVERY_CLIENT(g_object_new(discovery_client_get_type(), NULL)); self->service_name = g_strdup(service_name); self->interval = interval; self->callback = callback; self->user_data = user_data; /* Create a buffer big enough to hold our incoming and outgoing packets */ self->buffer_size = sizeof(service_name) + 16; self->buffer = g_malloc(self->buffer_size); /* Sign up to get notified when new packets arrive */ self->socket_reader = g_io_add_watch(gnet_udp_socket_get_io_channel(self->socket), G_IO_IN, discovery_client_read, self); /* Send the first broadcast */ discovery_client_broadcast(self); /* Schedule regular retries */ self->broadcast_timer = g_timeout_add(self->interval * 1000, discovery_client_broadcast, self); return self; } /************************************************************************************/ /**************************************************************** Network Callbacks */ /************************************************************************************/ static gboolean discovery_client_read(GIOChannel* source, GIOCondition condition, gpointer user_data) { DiscoveryClient* self = DISCOVERY_CLIENT(user_data); gint length; GInetAddr *src; gint port; const gchar* host; /* Receive the packet waiting for us */ length = gnet_udp_socket_receive(self->socket, self->buffer, self->buffer_size, &src); self->buffer[self->buffer_size - 1] = '\0'; /* Ignore it if it doesn't exactly match our service. * It will have a 16-bit port number after the service name, * we ignore that at this point. */ if (length != strlen(self->service_name) + 3) return TRUE; if (strncmp(self->service_name, self->buffer, self->buffer_size)) return TRUE; /* Yay, a service responded. Extract the host and port, and * invoke our owner's callback function. */ port = self->buffer[length-1] | (self->buffer[length-2] << 8); host = gnet_inetaddr_get_canonical_name(src); self->callback(self, host, port, self->user_data); return TRUE; } static gboolean discovery_client_broadcast(gpointer user_data) { DiscoveryClient* self = DISCOVERY_CLIENT(user_data); /* Send a broadcast packet with our service name */ gnet_udp_socket_send(self->socket, self->service_name, strlen(self->service_name)+1, self->broadcast); return TRUE; } /* The End */ fyre-1.0.1/src/discovery-client.h0000644000175000001440000000631510356610364013627 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * discovery-client.h - This is a client that looks for DiscoveryServer * objects on remote machines. Requests can be sent out, * and a callback will be invoked when any servers * reply. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __DISCOVERY_CLIENT_H__ #define __DISCOVERY_CLIENT_H__ #include "platform.h" #include #include G_BEGIN_DECLS #define DISCOVERY_CLIENT_TYPE (discovery_client_get_type ()) #define DISCOVERY_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DISCOVERY_CLIENT_TYPE, DiscoveryClient)) #define DISCOVERY_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DISCOVERY_CLIENT_TYPE, DiscoveryClientClass)) #define IS_DISCOVERY_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DISCOVERY_CLIENT_TYPE)) #define IS_DISCOVERY_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DISCOVERY_CLIENT_TYPE)) typedef struct _DiscoveryClient DiscoveryClient; typedef struct _DiscoveryClientClass DiscoveryClientClass; typedef void (DiscoveryCallback)(DiscoveryClient* client, const gchar* host, int port, gpointer user_data); struct _DiscoveryClient { GObject object; gchar* service_name; DiscoveryCallback* callback; gpointer user_data; guint interval; guint broadcast_timer; GInetAddr* broadcast; GUdpSocket* socket; guint socket_reader; guchar* buffer; gsize buffer_size; }; struct _DiscoveryClientClass { GObjectClass parent_class; }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType discovery_client_get_type (); /* Automatically look for "service_name". Call the provided callback when the * service is found. Send broadcast packets every 'interval' seconds. */ DiscoveryClient* discovery_client_new (const gchar* service_name, guint interval, DiscoveryCallback* callback, gpointer user_data); G_END_DECLS #endif /* __DISCOVERY_CLIENT_H__ */ /* The End */ fyre-1.0.1/src/cell-renderer-bifurcation.c0000644000175000001440000002677610446431132015374 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * cell-renderer-bifurcation.h - A GtkCellRenderer for viewing a bifurcation * diagram over the range of a keyframe's transition. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "cell-renderer-bifurcation.h" #include "bifurcation-diagram.h" #include static void cell_renderer_bifurcation_class_init (CellRendererBifurcationClass *klass); static void cell_renderer_bifurcation_init (CellRendererBifurcation *self); static void cell_renderer_bifurcation_finalize (GObject *object); static void cell_renderer_bifurcation_get_property (GObject *object, guint param_id, GValue *value, GParamSpec *pspec); static void cell_renderer_bifurcation_set_property (GObject *object, guint param_id, const GValue *value, GParamSpec *pspec); static void cell_renderer_bifurcation_get_size (GtkCellRenderer *cell, GtkWidget *widget, GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height); static void cell_renderer_bifurcation_render (GtkCellRenderer *cell, GdkWindow *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags); static BifurcationDiagram* get_bifurcation_diagram (CellRendererBifurcation *self); enum { PROP_0, PROP_ROW_ID, PROP_ANIMATION, }; typedef struct { GtkTreeView *view; GdkRectangle rect; } RedrawInfo; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType cell_renderer_bifurcation_get_type(void) { static GType cr_type = 0; if (!cr_type) { static const GTypeInfo cr_info = { sizeof(CellRendererBifurcationClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) cell_renderer_bifurcation_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CellRendererBifurcation), 0, (GInstanceInitFunc) cell_renderer_bifurcation_init, }; cr_type = g_type_register_static(GTK_TYPE_CELL_RENDERER, "CellRendererBifurcation", &cr_info, 0); } return cr_type; } static void cell_renderer_bifurcation_class_init(CellRendererBifurcationClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (klass); object_class->finalize = cell_renderer_bifurcation_finalize; object_class->get_property = cell_renderer_bifurcation_get_property; object_class->set_property = cell_renderer_bifurcation_set_property; cell_class->get_size = cell_renderer_bifurcation_get_size; cell_class->render = cell_renderer_bifurcation_render; g_object_class_install_property(object_class, PROP_ROW_ID, g_param_spec_ulong("row-id", "Row Id", "A row ID pointing to the keyframe this diagram starts at", 0, (gulong)-1, 1, G_PARAM_READWRITE)); g_object_class_install_property(object_class, PROP_ANIMATION, g_param_spec_object("animation", "Animation", "The animation this bifurcation diagram gets its keyframes from", G_TYPE_OBJECT, G_PARAM_READWRITE)); } static void cell_renderer_bifurcation_init(CellRendererBifurcation *self) { } GtkCellRenderer* cell_renderer_bifurcation_new() { return GTK_CELL_RENDERER(g_object_new(cell_renderer_bifurcation_get_type(), NULL)); } static void cell_renderer_bifurcation_finalize(GObject *object) { CellRendererBifurcation *self = CELL_RENDERER_BIFURCATION(object); if (self->animation) { g_object_unref(self->animation); self->animation = NULL; } } /************************************************************************************/ /*********************************************************************** Properties */ /************************************************************************************/ static void cell_renderer_bifurcation_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { CellRendererBifurcation *self = CELL_RENDERER_BIFURCATION(object); switch (prop_id) { case PROP_ROW_ID: g_value_set_ulong(value, self->row_id); break; case PROP_ANIMATION: g_value_set_object(value, &self->animation); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void cell_renderer_bifurcation_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { CellRendererBifurcation *self = CELL_RENDERER_BIFURCATION(object); switch (prop_id) { case PROP_ROW_ID: self->row_id = g_value_get_ulong(value); break; case PROP_ANIMATION: if (self->animation) g_object_unref(self->animation); self->animation = ANIMATION(g_object_ref(g_value_get_object(value))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static BifurcationDiagram* get_bifurcation_diagram (CellRendererBifurcation *self) { /* Using the current iterator and animation, find the corresponding * bifurcation diagram object, creating and/or updating it if necessary. */ GObject *obj; BifurcationDiagram *bd; GtkTreeIter keyframe, next_keyframe; DeJong *a, *b; /* Look up the first keyframe from a row ID */ if (!animation_keyframe_find_by_id(self->animation, self->row_id, &keyframe)) return NULL; /* Iterate to the next keyframe */ next_keyframe = keyframe; if (!gtk_tree_model_iter_next(GTK_TREE_MODEL(self->animation->model), &next_keyframe)) { /* We're at the last keyframe, no bifurcation diagram for us */ return NULL; } /* Try to extract an existing bifurcation diagram */ gtk_tree_model_get(GTK_TREE_MODEL(self->animation->model), &keyframe, ANIMATION_MODEL_BIFURCATION, &obj, -1); if (obj) { /* We have an existing object, yay */ bd = BIFURCATION_DIAGRAM(obj); } else { /* Nope, create a new object and store it in the model */ bd = bifurcation_diagram_new(); gtk_list_store_set(self->animation->model, &keyframe, ANIMATION_MODEL_BIFURCATION, bd, -1); } /* Load parameters from both keyframes */ a = de_jong_new(); b = de_jong_new(); animation_keyframe_load(self->animation, &keyframe, PARAMETER_HOLDER(a)); animation_keyframe_load(self->animation, &next_keyframe, PARAMETER_HOLDER(b)); /* Set up this bifurcation diagram for linear interpolation between the two */ bifurcation_diagram_set_linear_endpoints(bd, a, b); g_object_unref(a); g_object_unref(b); return bd; } /************************************************************************************/ /********************************************************** GtkCellRenderer Methods */ /************************************************************************************/ static void cell_renderer_bifurcation_get_size(GtkCellRenderer *cell, GtkWidget *widget, GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height) { /* We don't bother suggesting a size yet, just use whatever's available */ } static gboolean cell_queue_redraw (RedrawInfo *info) { gtk_widget_queue_draw_area (GTK_WIDGET (info->view), info->rect.x, info->rect.y, info->rect.width, info->rect.height); return FALSE; } static void cell_renderer_bifurcation_render(GtkCellRenderer *cell, GdkWindow *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags) { CellRendererBifurcation *self = CELL_RENDERER_BIFURCATION(cell); BifurcationDiagram *bd = get_bifurcation_diagram(self); GtkStateType state; RedrawInfo *nr; if (!bd) return; /* Determine the correct state to render our text in, based on * the cell's selectedness and the widget's current state. * This was copied from GtkCellRendererText. */ if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED) { if (GTK_WIDGET_HAS_FOCUS (widget)) state = GTK_STATE_SELECTED; else state = GTK_STATE_ACTIVE; } else { if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE) state = GTK_STATE_INSENSITIVE; else state = GTK_STATE_NORMAL; } /* Set the bifurcation diagram renderer's parameters appropriately for this * cell renderer. It will automatically figure out what if anything it has * to change internally. We size it to fit this cell exactly, and set * the colors appropriately for our state and theme. */ g_object_set(bd, "width", cell_area->width, "height", cell_area->height, "fgcolor-gdk", >K_WIDGET(widget)->style->fg[state], "bgcolor-gdk", >K_WIDGET(widget)->style->base[state], NULL); /* Assume that 5*(cell area) is good enough) */ if(HISTOGRAM_IMAGER(bd)->total_points_plotted > 5 * cell_area->width * cell_area->height) { gdk_draw_pixbuf(window, GTK_WIDGET(widget)->style->fg_gc[state], HISTOGRAM_IMAGER(bd)->image, 0, 0, cell_area->x, cell_area->y, cell_area->width, cell_area->height, GDK_RGB_DITHER_NONE, 0, 0); return; } /* Render it a bit and update the image */ bifurcation_diagram_calculate(bd, 10000, 100); histogram_imager_update_image(HISTOGRAM_IMAGER(bd)); gdk_draw_pixbuf(window, GTK_WIDGET(widget)->style->fg_gc[state], HISTOGRAM_IMAGER(bd)->image, 0, 0, cell_area->x, cell_area->y, cell_area->width, cell_area->height, GDK_RGB_DITHER_NONE, 0, 0); nr = g_new (RedrawInfo, 1); nr->view = self->tree; nr->rect.x = cell_area->x; nr->rect.y = cell_area->y; nr->rect.width = cell_area->width; nr->rect.height = cell_area->height; g_timeout_add (20, (GSourceFunc) cell_queue_redraw, nr); } /* The End */ fyre-1.0.1/src/cell-renderer-bifurcation.h0000644000175000001440000000500210356610270015356 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * cell-renderer-bifurcation.h - A GtkCellRenderer for viewing a bifurcation * diagram over the range of a keyframe's transition. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __CELL_RENDERER_BIFURCATION_H__ #define __CELL_RENDERER_BIFURCATION_H__ #include #include #include #include "de-jong.h" #include "animation.h" G_BEGIN_DECLS #define CELL_RENDERER_BIFURCATION_TYPE (cell_renderer_bifurcation_get_type ()) #define CELL_RENDERER_BIFURCATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CELL_RENDERER_BIFURCATION_TYPE, CellRendererBifurcation)) #define CELL_RENDERER_BIFURCATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CELL_RENDERER_BIFURCATION_TYPE, CellRendererBifurcationClass)) #define IS_CELL_RENDERER_BIFURCATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CELL_RENDERER_BIFURCATION_TYPE)) #define IS_CELL_RENDERER_BIFURCATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CELL_RENDERER_BIFURCATION_TYPE)) typedef struct _CellRendererBifurcation CellRendererBifurcation; typedef struct _CellRendererBifurcationClass CellRendererBifurcationClass; struct _CellRendererBifurcation { GtkCellRenderer parent; Animation *animation; gulong row_id; /* Our parent - yes, I know this makes baby jesus cry. */ GtkTreeView *tree; }; struct _CellRendererBifurcationClass { GtkCellRendererClass parent_class; void (* cell_renderer_bifurcation) (CellRendererBifurcation *cb); }; GType cell_renderer_bifurcation_get_type(); GtkCellRenderer* cell_renderer_bifurcation_new(); G_END_DECLS #endif /* __CELL_RENDERER_BIFURCATION_H__ */ /* The End */ fyre-1.0.1/src/spline.c0000644000175000001440000001625110263337623011632 00000000000000/* GTK - The GIMP Toolkit * Copyright (C) 1997 David Mosberger * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ /* These spline solving and evaluation functions were separated from GtkCurve. * See the CurveEditor widget for more information. */ #include #include "spline.h" static SplineControlPoint template_linear_points[] = { {0, 0}, {1, 1}, }; static SplineControlPoint template_smooth_points[] = { {0, 0 }, {0.375, 0.25}, {0.625, 0.75}, {1, 1 }, }; const Spline spline_template_linear = {template_linear_points, sizeof(template_linear_points) / sizeof(SplineControlPoint)}; const Spline spline_template_smooth = {template_smooth_points, sizeof(template_smooth_points) / sizeof(SplineControlPoint)}; GType spline_get_type(void) { static GType spline_type = 0; if (!spline_type) spline_type = g_boxed_type_register_static("Spline", (GBoxedCopyFunc) spline_copy, (GBoxedFreeFunc) spline_free); return spline_type; } Spline* spline_copy(const Spline *spline) { Spline *n = g_malloc(sizeof(Spline)); n->num_points = spline->num_points; n->points = g_malloc(spline->num_points * sizeof(SplineControlPoint)); memcpy(n->points, spline->points, spline->num_points * sizeof(SplineControlPoint)); return n; } void spline_free(Spline *spline) { g_free(spline->points); g_free(spline); } guchar* spline_serialize(Spline *spline, gsize *size) { guchar *buffer; *size = spline->num_points * sizeof(SplineControlPoint); buffer = g_malloc(*size); memcpy(buffer, spline->points, *size); return buffer; } Spline* spline_unserialize(const guchar *data, gsize size) { Spline *n = g_malloc(sizeof(Spline)); n->num_points = size / sizeof(SplineControlPoint); n->points = g_malloc(n->num_points * sizeof(SplineControlPoint)); memcpy(n->points, (void *) data, n->num_points * sizeof(SplineControlPoint)); return n; } /* Solve the tridiagonal equation system that determines the second derivatives for the interpolation points. (Based on Numerical Recipies 2nd Edition.) */ void spline_solve(Spline *spline, gfloat y2[]) { gfloat p, sig, *u; gint i, k; u = g_malloc ((spline->num_points - 1) * sizeof (u[0])); y2[0] = u[0] = 0.0; /* set lower boundary condition to "natural" */ for (i = 1; i < spline->num_points - 1; ++i) { sig = ((spline->points[i][0] - spline->points[i - 1][0]) / (spline->points[i + 1][0] - spline->points[i - 1][0])); p = sig * y2[i - 1] + 2.0; y2[i] = (sig - 1.0) / p; u[i] = ((spline->points[i + 1][1] - spline->points[i][1]) / (spline->points[i + 1][0] - spline->points[i][0]) - (spline->points[i][1] - spline->points[i - 1][1]) / (spline->points[i][0] - spline->points[i - 1][0])); u[i] = (6.0 * u[i] / (spline->points[i + 1][0] - spline->points[i - 1][0]) - sig * u[i - 1]) / p; } y2[spline->num_points - 1] = 0.0; for (k = spline->num_points - 2; k >= 0; --k) y2[k] = y2[k] * y2[k + 1] + u[k]; g_free (u); } gfloat spline_eval(Spline *spline, gfloat y2[], gfloat val) { gint k_lo, k_hi, k; gfloat h, b, a; /* do a binary search for the right interval: */ k_lo = 0; k_hi = spline->num_points - 1; while (k_hi - k_lo > 1) { k = (k_hi + k_lo) / 2; if (spline->points[k][0] > val) k_hi = k; else k_lo = k; } h = spline->points[k_hi][0] - spline->points[k_lo][0]; g_assert (h > 0.0); a = (spline->points[k_hi][0] - val) / h; b = (val - spline->points[k_lo][0]) / h; return a*spline->points[k_lo][1] + b*spline->points[k_hi][1] + ((a*a*a - a)*y2[k_lo] + (b*b*b - b)*y2[k_hi]) * (h*h)/6.0; } gfloat spline_solve_and_eval(Spline *spline, gfloat val) { /* Solve a spline and evaluate one point from it. This is * the most convenient way to interpolate given a set of control * points saved from a CurveEditor widget. Note that this * assumes all control points are active. */ gfloat *y2v, result; y2v = g_malloc (spline->num_points * sizeof (gfloat)); spline_solve(spline, y2v); result = spline_eval(spline, y2v, val); if (result < 0) result = 0; if (result > 1) result = 1; g_free (y2v); return result; } Spline* spline_find_active_points(Spline *spline) { /* Return a new spline with only the active points from the first one */ gfloat prev, ry; gint dst, i, first_active = -1; Spline *active = g_malloc(sizeof(Spline)); /* count active points: */ prev = -1; for (i = active->num_points = 0; i < spline->num_points; ++i) if (spline->points[i][0] > prev) { if (first_active < 0) first_active = i; prev = spline->points[i][0]; ++active->num_points; } /* handle degenerate case. * If we have less than two points, create a second false * point with the same Y coordinate so we get a horizontal line. */ if (active->num_points < 2) { if (active->num_points > 0) ry = spline->points[first_active][1]; else ry = 0; if (ry < 0) ry = 0; if (ry > 1) ry = 1; active->num_points = 2; active->points = g_malloc(active->num_points * sizeof(SplineControlPoint)); active->points[0][0] = 0; active->points[0][1] = ry; active->points[1][0] = 1; active->points[1][1] = ry; } else { active->points = g_malloc(active->num_points * sizeof(SplineControlPoint)); prev = -1; for (i = dst = 0; i < spline->num_points; ++i) if (spline->points[i][0] > prev) { prev = spline->points[i][0]; active->points[dst][0] = spline->points[i][0]; active->points[dst][1] = spline->points[i][1]; ++dst; } } return active; } void spline_solve_and_eval_range(Spline *spline, int veclen, gfloat vector[], float lower, float upper) { gfloat *y2v, result; int i; float x, dx; y2v = g_malloc (spline->num_points * sizeof (gfloat)); spline_solve(spline, y2v); x = lower; dx = (upper - lower) / (veclen - 1); for (i=0,x=0; i 1) result = 1; vector[i] = result; } g_free (y2v); } void spline_solve_and_eval_all(Spline *spline, int veclen, gfloat vector[]) { spline_solve_and_eval_range(spline, veclen, vector, 0, 1); } /* The End */ fyre-1.0.1/src/spline.h0000644000175000001440000000466010263337623011640 00000000000000/* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ /* These spline solving and evaluation functions were separated from GtkCurve. * See the CurveEditor widget for more information. */ #ifndef __SPLINE_H__ #define __SPLINE_H__ #include G_BEGIN_DECLS #define SPLINE_TYPE (spline_get_type ()) typedef gfloat SplineControlPoint[2]; typedef struct { SplineControlPoint *points; gint num_points; } Spline; extern const Spline spline_template_linear; extern const Spline spline_template_smooth; GType spline_get_type(void); Spline* spline_copy(const Spline *spline); void spline_free(Spline *spline); guchar* spline_serialize(Spline *spline, gsize *size); Spline* spline_unserialize(const guchar *data, gsize size); Spline* spline_find_active_points(Spline *spline); /* Solve the spline and evaluate one point on it */ gfloat spline_solve_and_eval(Spline *spline, gfloat val); /* Solve the spline and fill a provided vector with * points evaluated from the given range. */ void spline_solve_and_eval_range(Spline *spline, int veclen, gfloat vector[], float lower, float upper); void spline_solve_and_eval_all(Spline *spline, int veclen, gfloat vector[]); void spline_solve(Spline *spline, gfloat y2[]); gfloat spline_eval(Spline *spline, gfloat y2[], gfloat val); G_END_DECLS #endif /* __CURVE_EDITOR_H__ */ /* The End */ fyre-1.0.1/src/animation.c0000644000175000001440000004373010356610527012321 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * animation.c - A simple keyframe animation system for ParameterHolder objects * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include #include "animation.h" #include "chunked-file.h" #include "spline.h" #include "histogram-imager.h" static void animation_class_init(AnimationClass *klass); static void animation_init(Animation *self); static void animation_dispose(GObject *gobject); static void animation_keyframe_append_default(Animation *self, GtkTreeIter *iter); /* Animations are serialized using chunked-file. * These are the chunk types and file signature */ #define FILE_SIGNATURE "Fyre Animation\n\r\xFF\n" #define CHUNK_KEYFRAME_START CHUNK_TYPE('K','f','r','S') /* Begin a new keyframe definition */ #define CHUNK_KEYFRAME_END CHUNK_TYPE('K','f','r','E') /* End a keyframe definition */ #define CHUNK_FYRE_PARAMS CHUNK_TYPE('f','y','P','R') /* Set fyre parameters, represented as a string */ #define CHUNK_THUMBNAIL CHUNK_TYPE('f','y','T','p') /* Set a thumbnail, represented as a serialized GdkPixdata */ #define CHUNK_SPLINE CHUNK_TYPE('s','p','l','C') /* Spline control points */ #define CHUNK_DURATION CHUNK_TYPE('d','u','r','a') /* Transition duration, as a double */ /* We never write this signature or these chunk types, * but they're supported for backward compatibility * with de Jong Explorer animation files. */ #define OLD_FILE_SIGNATURE "de Jong Explorer Animation\n\r\xFF\n" #define CHUNK_DE_JONG_PARAMS CHUNK_TYPE('d','j','P','R') /* Set de-jong parameters, represented as a string */ #define CHUNK_OLD_THUMBNAIL CHUNK_TYPE('d','j','T','p') /* Set a thumbnail, represented as a serialized GdkPixdata */ /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType animation_get_type(void) { static GType anim_type = 0; if (!anim_type) { static const GTypeInfo dj_info = { sizeof(AnimationClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) animation_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(Animation), 0, (GInstanceInitFunc) animation_init, }; anim_type = g_type_register_static(G_TYPE_OBJECT, "Animation", &dj_info, 0); } return anim_type; } static void animation_class_init(AnimationClass *klass) { GObjectClass *object_class; object_class = (GObjectClass*) klass; object_class->dispose = animation_dispose; } static void animation_init(Animation *self) { self->model = gtk_list_store_new(6, GDK_TYPE_PIXBUF, /* ANIMATION_MODEL_THUMBNAIL */ G_TYPE_STRING, /* ANIMATION_MODEL_PARAMS */ G_TYPE_DOUBLE, /* ANIMATION_MODEL_DURATION */ SPLINE_TYPE, /* ANIMATION_MODEL_SPLINE */ G_TYPE_ULONG, /* ANIMATION_MODEL_ROW_ID */ G_TYPE_OBJECT); /* ANIMATION_MODEL_BIFURCATION */ } static void animation_dispose(GObject *gobject) { Animation *self = ANIMATION(gobject); if (self->model) { g_object_unref(self->model); self->model = NULL; } } Animation* animation_new() { return ANIMATION(g_object_new(animation_get_type(), NULL)); } Animation* animation_copy(Animation *self) { Animation *copy = animation_new(); AnimChunkState state; /* Serialize this animation into chunks, loading them into the new animation */ state.self = copy; animation_generate_chunks(self, CHUNK_CALLBACK(animation_store_chunk), &state); return copy; } /************************************************************************************/ /************************************************************ Keyframe Manipulation */ /************************************************************************************/ void animation_keyframe_store (Animation *self, GtkTreeIter *iter, ParameterHolder *key) { /* Save de-jong parameters and a thumbnail to the keyframe at the given iterator */ GdkPixbuf *thumbnail; gchar *params; /* We can always save the parameters of a ParameterHolder */ params = parameter_holder_save_string(key); gtk_list_store_set(self->model, iter, ANIMATION_MODEL_PARAMS, params, -1); g_free(params); /* If this ParameterHolder is also a HistogramImager, we can get a thumbnail */ if (IS_HISTOGRAM_IMAGER(key)) { thumbnail = histogram_imager_make_thumbnail(HISTOGRAM_IMAGER(key), 128, 128); gtk_list_store_set(self->model, iter, ANIMATION_MODEL_THUMBNAIL, thumbnail, -1); gdk_pixbuf_unref(thumbnail); } } void animation_keyframe_load (Animation *self, GtkTreeIter *iter, ParameterHolder *key) { /* Load de-jong parameters from the keyframe at the given iterator */ gchar *params; gtk_tree_model_get(GTK_TREE_MODEL(self->model), iter, ANIMATION_MODEL_PARAMS, ¶ms, -1); parameter_holder_load_string(key, params); g_free(params); } void animation_keyframe_append (Animation *self, ParameterHolder *key) { GtkTreeIter iter; animation_keyframe_append_default(self, &iter); animation_keyframe_store(self, &iter, key); } static void animation_keyframe_append_default(Animation *self, GtkTreeIter *iter) { gtk_list_store_append(self->model, iter); gtk_list_store_set(self->model, iter, ANIMATION_MODEL_ROW_ID, self->next_row_id++, ANIMATION_MODEL_DURATION, (gdouble) 5.0, ANIMATION_MODEL_SPLINE, &spline_template_smooth, -1); } void animation_clear(Animation *self) { gtk_list_store_clear(self->model); } gdouble animation_keyframe_get_time(Animation *self, GtkTreeIter *iter) { /* Return the absolute time in seconds that the keyframe pointed to by 'iter' begins at. */ GtkTreeModel *model = GTK_TREE_MODEL(self->model); GtkTreeIter my_iter; gboolean valid; gdouble keyframe_duration; gdouble total = 0; valid = gtk_tree_model_get_iter_first(model, &my_iter); while (valid) { if (!memcmp(&my_iter, iter, sizeof(GtkTreeIter))) break; gtk_tree_model_get(model, &my_iter, ANIMATION_MODEL_DURATION, &keyframe_duration, -1); total += keyframe_duration; valid = gtk_tree_model_iter_next(model, &my_iter); } return total; } gulong animation_keyframe_get_id (Animation *self, GtkTreeIter *iter) { GtkTreeModel *model = GTK_TREE_MODEL(self->model); gulong id; gtk_tree_model_get(model, iter, ANIMATION_MODEL_ROW_ID, &id, -1); return id; } gboolean animation_keyframe_find_by_id (Animation *self, gulong id, GtkTreeIter *iter) { GtkTreeModel *model = GTK_TREE_MODEL(self->model); gboolean valid; valid = gtk_tree_model_get_iter_first(model, iter); while (valid) { if (animation_keyframe_get_id(self, iter) == id) break; valid = gtk_tree_model_iter_next(model, iter); } return valid; } /************************************************************************************/ /********************************************************************** Persistence */ /************************************************************************************/ void animation_generate_chunks(Animation *self, ChunkCallback callback, gpointer user_data) { /* Serialize our animation to a stream of chunks, directed to the given ChunkCallback. * This can be used to save our animation to disk using ChunkedFile, copy it into * another animation, or send it to any other destination that supports a ChunkCallback. */ GtkTreeModel *model = GTK_TREE_MODEL(self->model); GtkTreeIter iter; gboolean valid; gchar *params; GdkPixbuf *thumb_pixbuf; guchar *buffer; guint buffer_len; gdouble duration; Spline *spline; GdkPixdata pixdata; /* Iterate over each keyframe in our model */ valid = gtk_tree_model_get_iter_first(model, &iter); while (valid) { gtk_tree_model_get(model, &iter, ANIMATION_MODEL_PARAMS, ¶ms, ANIMATION_MODEL_THUMBNAIL, &thumb_pixbuf, ANIMATION_MODEL_DURATION, &duration, ANIMATION_MODEL_SPLINE, &spline, -1); callback(user_data, CHUNK_KEYFRAME_START, 0, NULL); if (params) { callback(user_data, CHUNK_FYRE_PARAMS, strlen((void *) params), (void *) params); g_free(params); } if (thumb_pixbuf) { gdk_pixdata_from_pixbuf(&pixdata, thumb_pixbuf, FALSE); buffer = gdk_pixdata_serialize(&pixdata, &buffer_len); callback(user_data, CHUNK_THUMBNAIL, buffer_len, buffer); g_free(buffer); } callback(user_data, CHUNK_DURATION, sizeof(duration), (guchar*) &duration); if (spline) { buffer = spline_serialize(spline, (gsize *) &buffer_len); callback(user_data, CHUNK_SPLINE, buffer_len, buffer); g_free(buffer); spline_free(spline); } callback(user_data, CHUNK_KEYFRAME_END, 0, NULL); valid = gtk_tree_model_iter_next(model, &iter); } } void animation_store_chunk(AnimChunkState *state, ChunkType type, gsize length, const guchar *data) { /* A ChunkCallback implementation that stores chunks into an animation. * This can be used to load serialized animations from disk, copy animations, * or load them from any source that can use a ChunkCallback. An AnimChunkState * structure must be passed in as user_data. */ gchar *tempstring; Spline *spline; GdkPixdata pixdata; switch (type) { case CHUNK_KEYFRAME_START: /* Append a new keyframe */ animation_keyframe_append_default(state->self, &state->iter); break; case CHUNK_KEYFRAME_END: /* Ending a keyframe. We don't yet need this for anything */ break; case CHUNK_DE_JONG_PARAMS: /* For compatibility */ case CHUNK_FYRE_PARAMS: /* Set the de Jong parameters for this keyframe. Note that the * data in the file is not null terminated, hence the need to * copy it into a string we can null-terminate. */ tempstring = g_malloc(length+1); tempstring[length] = '\0'; memcpy(tempstring, (void *) data, length); gtk_list_store_set(state->self->model, &state->iter, ANIMATION_MODEL_PARAMS, tempstring, -1); g_free(tempstring); break; case CHUNK_OLD_THUMBNAIL: /* For compatibility */ case CHUNK_THUMBNAIL: /* Set the thumbnail for this keyframe */ gdk_pixdata_deserialize(&pixdata, length, data, NULL); gtk_list_store_set(state->self->model, &state->iter, ANIMATION_MODEL_THUMBNAIL, gdk_pixbuf_from_pixdata(&pixdata, TRUE, NULL), -1); break; case CHUNK_DURATION: /* The transition duration, as a double */ if (length == sizeof(gdouble)) { gtk_list_store_set(state->self->model, &state->iter, ANIMATION_MODEL_DURATION, *(gdouble*)data, -1); } else { g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Duration chunk is incorrectly sized, %ld bytes instead of %ld", (long) length, (long) sizeof(gdouble)); } break; case CHUNK_SPLINE: /* Spline control points */ spline = spline_unserialize(data, length); gtk_list_store_set(state->self->model, &state->iter, ANIMATION_MODEL_SPLINE, spline, -1); spline_free(spline); break; default: chunked_file_warn_unknown_type(type); } } void animation_load_file(Animation *self, const gchar *filename) { FILE *f; AnimChunkState state; g_return_if_fail((f = fopen(filename, "rb"))); g_return_if_fail(chunked_file_read_signature(f, FILE_SIGNATURE) || chunked_file_read_signature(f, OLD_FILE_SIGNATURE)); animation_clear(self); state.self = self; chunked_file_read_all(f, CHUNK_CALLBACK(animation_store_chunk), &state); fclose(f); } void animation_save_file(Animation *self, const gchar *filename) { FILE *f; g_return_if_fail((f = fopen(filename, "wb"))); chunked_file_write_signature(f, FILE_SIGNATURE); animation_generate_chunks(self, CHUNK_CALLBACK(chunked_file_write_chunk), f); fclose(f); } /************************************************************************************/ /************************************************************** Animation Iterators */ /************************************************************************************/ gdouble animation_get_length(Animation *self) { /* Return the animation's total length in seconds. Currently this * requires iterating over the keyframes. */ GtkTreeModel *model = GTK_TREE_MODEL(self->model); GtkTreeIter iter; gboolean valid; gdouble keyframe_duration; gdouble total = 0; valid = gtk_tree_model_get_iter_first(model, &iter); while (valid) { gtk_tree_model_get(model, &iter, ANIMATION_MODEL_DURATION, &keyframe_duration, -1); total += keyframe_duration; valid = gtk_tree_model_iter_next(model, &iter); } return total; } void animation_iter_get_first(Animation *self, AnimationIter *iter) { /* Initialize an iterator to the beginning of the animation */ GtkTreeModel *model = GTK_TREE_MODEL(self->model); iter->valid = gtk_tree_model_get_iter_first(model, &iter->keyframe); iter->absolute_time = 0; iter->time_after_keyframe = 0; } void animation_iter_seek(Animation *self, AnimationIter *iter, gdouble absolute_time) { /* Initialize an iterator to an absolute time in seconds */ animation_iter_get_first(self, iter); animation_iter_seek_relative(self, iter, absolute_time); } void animation_iter_seek_relative(Animation *self, AnimationIter *iter, gdouble delta_time) { /* Seek an iterator forward or backwards by a given number of seconds. This works * by first adding the delta_time to the time_after_keyframe, then moving the * current keyframe until time_after_keyframe is in an acceptable range. */ GtkTreeModel *model = GTK_TREE_MODEL(self->model); gdouble keyframe_duration; iter->time_after_keyframe += delta_time; while (iter->valid) { gtk_tree_model_get(model, &iter->keyframe, ANIMATION_MODEL_DURATION, &keyframe_duration, -1); if (iter->time_after_keyframe >= keyframe_duration) { /* Skip to the next keyframe */ iter->valid = gtk_tree_model_iter_next(model, &iter->keyframe); iter->time_after_keyframe -= keyframe_duration; } else if (iter->time_after_keyframe < 0) { /* Skip to the previous keyframe. * Unfortunately, there's no gtk_tree_model_iter_prev, so * the best way we can do this from here is to seek back to the beginning. */ animation_iter_get_first(self, iter); } else break; } } void animation_iter_load (Animation *self, AnimationIter *iter, ParameterHolder *inbetween) { /* Load the parameters corresponding to the given iterator into a ParameterHolder object. * This finds the keyframes before and after the iterator and applies the proper type * of interpolation. */ GtkTreeModel *model = GTK_TREE_MODEL(self->model); GtkTreeIter next_keyframe = iter->keyframe; gdouble keyframe_duration; ParameterHolderPair pair; gdouble alpha; Spline *spline; g_return_if_fail(iter->valid); /* We should always be able to load the first keyframe */ pair.a = PARAMETER_HOLDER(g_object_new(G_TYPE_FROM_INSTANCE(inbetween), NULL)); animation_keyframe_load(self, &iter->keyframe, pair.a); if (gtk_tree_model_iter_next(model, &next_keyframe)) { /* We have a next keyframe, load it */ pair.b = PARAMETER_HOLDER(g_object_new(G_TYPE_FROM_INSTANCE(inbetween), NULL)); animation_keyframe_load(self, &next_keyframe, pair.b); } else { /* No next keyframe, use another copy of the first */ pair.b = g_object_ref(pair.a); } gtk_tree_model_get(model, &iter->keyframe, ANIMATION_MODEL_DURATION, &keyframe_duration, ANIMATION_MODEL_SPLINE, &spline, -1); /* Alpha is 0 at the first keyframe and 1 at the second keyframe, * increasing linearly. It could be used as-is for linear interpolation. */ alpha = iter->time_after_keyframe / keyframe_duration; /* We, however, will pass alpha through a spline to give the user * more control over the interpolation. */ alpha = spline_solve_and_eval(spline, alpha); spline_free(spline); /* Only do linear interpolation for now */ parameter_holder_interpolate_linear(PARAMETER_HOLDER(inbetween), alpha, &pair); g_object_unref(pair.a); g_object_unref(pair.b); } gboolean animation_iter_read_frame (Animation *self, AnimationIter *iter, ParameterHolderPair *frame, double frame_rate) { /* Retrieve and step over one frame of the animation. * Sets frame->a to the beginning of this frame and frame->b to the end. * Returns TRUE if a frame was retrieved successfully, FALSE on end-of-animation. */ if (!iter->valid) return FALSE; animation_iter_load(self, iter, frame->a); animation_iter_seek_relative(self, iter, 1/frame_rate); if (!iter->valid) return FALSE; animation_iter_load(self, iter, frame->b); return TRUE; } /* The End */ fyre-1.0.1/src/animation.h0000644000175000001440000001334510356610246012323 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * animation.h - A simple keyframe animation system for ParameterHolder objects * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __ANIMATION_H__ #define __ANIMATION_H__ #include "parameter-holder.h" #include "chunked-file.h" G_BEGIN_DECLS #define ANIMATION_TYPE (animation_get_type ()) #define ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ANIMATION_TYPE, Animation)) #define ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ANIMATION_TYPE, AnimationClass)) #define IS_ANIMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ANIMATION_TYPE)) #define IS_ANIMATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ANIMATION_TYPE)) typedef struct _Animation Animation; typedef struct _AnimationClass AnimationClass; struct _Animation { GObject object; GtkListStore *model; gulong next_row_id; }; struct _AnimationClass { GObjectClass parent_class; }; /* Items in the GdkListStore holding our keyframes */ enum { ANIMATION_MODEL_THUMBNAIL, /* The thumbnail, as a GdkPixbuf */ ANIMATION_MODEL_PARAMS, /* The parameters, serialized to a string */ ANIMATION_MODEL_DURATION, /* The duration of the following transition, in seconds */ ANIMATION_MODEL_SPLINE, /* The interpolation spline, a boxed Spline instance */ ANIMATION_MODEL_ROW_ID, /* A unique ID for this row */ ANIMATION_MODEL_BIFURCATION, /* Cached BifurcationDiagram instance for this keyframe */ }; typedef struct _AnimationIter { GtkTreeIter keyframe; gboolean valid; gdouble absolute_time; gdouble time_after_keyframe; } AnimationIter; typedef struct { Animation *self; GtkTreeIter iter; } AnimChunkState; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType animation_get_type (); Animation* animation_new (); Animation* animation_copy (Animation *self); void animation_clear (Animation *self); /* Persistence */ void animation_load_file (Animation *self, const gchar *filename); void animation_save_file (Animation *self, const gchar *filename); /* A chunk source and ChunkCallback that can be used to serialize or * copy an animation. These are used internally to implement animation_load_file, * animation_save_file, and animation_copy. */ void animation_generate_chunks (Animation *self, ChunkCallback callback, gpointer user_data); void animation_store_chunk (AnimChunkState *state, ChunkType type, gsize length, const guchar *data); /* Keyframe manipulation * Normal GtkTreeIters are used to refer to keyframes. */ void animation_keyframe_store (Animation *self, GtkTreeIter *iter, ParameterHolder *key); void animation_keyframe_load (Animation *self, GtkTreeIter *iter, ParameterHolder *key); void animation_keyframe_append (Animation *self, ParameterHolder *key); gdouble animation_keyframe_get_time (Animation *self, GtkTreeIter *iter); gulong animation_keyframe_get_id (Animation *self, GtkTreeIter *iter); gboolean animation_keyframe_find_by_id (Animation *self, gulong id, GtkTreeIter *iter); /* Animation iterators * Iterators can seek through an animation using wallclock-time, * and they are used to extract parameter sets for rendering. * Animation iters can be placed anywhere, not just at a keyframe. */ gdouble animation_get_length (Animation *self); void animation_iter_get_first (Animation *self, AnimationIter *iter); void animation_iter_seek (Animation *self, AnimationIter *iter, gdouble absolute_time); void animation_iter_seek_relative (Animation *self, AnimationIter *iter, gdouble delta_time); void animation_iter_load (Animation *self, AnimationIter *iter, ParameterHolder *inbetween); gboolean animation_iter_read_frame (Animation *self, AnimationIter *iter, ParameterHolderPair *frame, double frame_rate); G_END_DECLS #endif /* __ANIMATION_H__ */ /* The End */ fyre-1.0.1/src/platform.h0000644000175000001440000000251210356610463012163 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * platform.h - Platform-specific hacks, should be included * after config.h but before other headers in files * that need it. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __PLATFORM_H__ #define __PLATFORM_H__ #ifdef WIN32 /* This is necessary to compile at all, since ole2 defines * a DATADIR constant that conflicts with ours. */ #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #endif /* WIN32 */ #endif /* __PLATFORM_H__ */ /* The End */ fyre-1.0.1/src/explorer.c0000644000175000001440000007207410446431132012176 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * explorer.c - An interactive GUI for manipulating a DeJong object and viewing its output * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include #include #include #include "explorer.h" #include "parameter-editor.h" #include "math-util.h" #include "gui-util.h" #include "histogram-view.h" #include "de-jong.h" #include "prefix.h" static void explorer_class_init (ExplorerClass *klass); static void explorer_init (Explorer *self); static void explorer_dispose (GObject *gobject); static gboolean explorer_auto_limit_update_rate (Explorer *self); static gboolean limit_update_rate (GTimer* timer, float max_rate); static gdouble explorer_get_iter_speed (Explorer *self); static gchar* explorer_strdup_elapsed (Explorer *self); static gchar* explorer_strdup_status (Explorer *self); static gchar* explorer_strdup_speed (Explorer *self); static gchar* explorer_strdup_quality (Explorer *self); static void explorer_update_status_bar (Explorer *self); static gdouble generate_random_param(); static void on_randomize (GtkWidget *widget, Explorer* self); static void on_load_defaults (GtkWidget *widget, Explorer* self); static void on_save (GtkWidget *widget, Explorer* self); static void on_save_exr (GtkWidget *widget, Explorer* self); static void on_quit (GtkWidget *widget, Explorer* self); static void on_pause_rendering_toggle (GtkWidget *widget, Explorer* self); static void on_load_from_image (GtkWidget *widget, Explorer* self); static void on_widget_toggle (GtkWidget *widget, Explorer* self); static void on_zoom_reset (GtkWidget *widget, Explorer* self); static void on_zoom_in (GtkWidget *widget, Explorer* self); static void on_zoom_out (GtkWidget *widget, Explorer* self); static void on_render_time_changed (GtkWidget *widget, Explorer* self); static void on_calculation_finished (IterativeMap *map, Explorer* self); static gboolean on_interactive_prefs_delete (GtkWidget *widget, GdkEvent *event, Explorer* self); static gchar *file_location = NULL; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType explorer_get_type(void) { static GType exp_type = 0; if (!exp_type) { static const GTypeInfo exp_info = { sizeof(ExplorerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) explorer_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(Explorer), 0, (GInstanceInitFunc) explorer_init, }; exp_type = g_type_register_static(G_TYPE_OBJECT, "Explorer", &exp_info, 0); } return exp_type; } static void explorer_class_init(ExplorerClass *klass) { GObjectClass *object_class = (GObjectClass*) klass; object_class->dispose = explorer_dispose; glade_init(); } static void explorer_init(Explorer *self) { if (g_file_test (FYRE_DATADIR "/explorer.glade", G_FILE_TEST_EXISTS)) self->xml = glade_xml_new (FYRE_DATADIR "/explorer.glade", NULL, NULL); if (!self->xml) self->xml = glade_xml_new(BR_DATADIR("/fyre/explorer.glade"), NULL, NULL); if (!self->xml) { GtkWidget *dialog; dialog = gtk_message_dialog_new_with_markup(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Fyre can't find its data files.\n\n" "The main glade file could not be located.\n" "We tried looking for it in the following places:\n" "\n" " %s\n" " %s", FYRE_DATADIR "/explorer.glade", BR_DATADIR("/fyre/explorer.glade")); gtk_dialog_run(GTK_DIALOG(dialog)); exit(0); } self->window = glade_xml_get_widget(self->xml, "explorer_window"); fyre_set_icon_later(self->window); fyre_set_icon_later(glade_xml_get_widget(self->xml, "animation_window")); fyre_set_icon_later(glade_xml_get_widget(self->xml, "interactive_prefs")); fyre_set_icon_later(glade_xml_get_widget(self->xml, "cluster_window")); fyre_set_icon_later(glade_xml_get_widget(self->xml, "about_window")); fyre_set_icon_later(glade_xml_get_widget(self->xml, "error dialog")); /* Connect signal handlers */ glade_xml_signal_connect_data(self->xml, "on_randomize", G_CALLBACK(on_randomize), self); glade_xml_signal_connect_data(self->xml, "on_load_defaults", G_CALLBACK(on_load_defaults), self); glade_xml_signal_connect_data(self->xml, "on_save", G_CALLBACK(on_save), self); glade_xml_signal_connect_data(self->xml, "on_save_exr", G_CALLBACK(on_save_exr), self); glade_xml_signal_connect_data(self->xml, "on_quit", G_CALLBACK(on_quit), self); glade_xml_signal_connect_data(self->xml, "on_pause_rendering_toggle", G_CALLBACK(on_pause_rendering_toggle), self); glade_xml_signal_connect_data(self->xml, "on_load_from_image", G_CALLBACK(on_load_from_image), self); glade_xml_signal_connect_data(self->xml, "on_widget_toggle", G_CALLBACK(on_widget_toggle), self); glade_xml_signal_connect_data(self->xml, "on_zoom_reset", G_CALLBACK(on_zoom_reset), self); glade_xml_signal_connect_data(self->xml, "on_zoom_in", G_CALLBACK(on_zoom_in), self); glade_xml_signal_connect_data(self->xml, "on_zoom_out", G_CALLBACK(on_zoom_out), self); glade_xml_signal_connect_data(self->xml, "on_render_time_changed", G_CALLBACK(on_render_time_changed), self); glade_xml_signal_connect_data(self->xml, "on_interactive_prefs_delete", G_CALLBACK(on_interactive_prefs_delete), self); #ifndef HAVE_EXR /* If we don't have OpenEXR support, gray out the menu item * so it sits there taunting the user and not breaking HIG */ gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "save_image_as_exr"), FALSE); #endif /* Set up the statusbar */ self->statusbar = GTK_STATUSBAR(glade_xml_get_widget(self->xml, "statusbar")); self->render_status_context = gtk_statusbar_get_context_id(self->statusbar, "Rendering status"); self->speed_timer = g_timer_new(); self->auto_update_rate_timer = g_timer_new(); self->status_update_rate_timer = g_timer_new(); } static void explorer_dispose(GObject *gobject) { Explorer *self = EXPLORER(gobject); explorer_dispose_animation(self); explorer_dispose_cluster(self); explorer_dispose_history(self); if (self->speed_timer) { g_timer_destroy(self->speed_timer); self->speed_timer = NULL; } if (self->auto_update_rate_timer) { g_timer_destroy(self->auto_update_rate_timer); self->auto_update_rate_timer = NULL; } if (self->status_update_rate_timer) { g_timer_destroy(self->status_update_rate_timer); self->status_update_rate_timer = NULL; } if (self->map) { g_object_unref(self->map); self->map = NULL; } } Explorer* explorer_new(IterativeMap *map, Animation *animation) { Explorer *self = EXPLORER(g_object_new(explorer_get_type(), NULL)); GtkWidget *editor, *window, *scroll; GtkRequisition win_req; self->animation = ANIMATION(g_object_ref(animation)); self->map = ITERATIVE_MAP(g_object_ref(map)); /* Create the parameter editor */ editor = parameter_editor_new(PARAMETER_HOLDER(map)); gtk_box_pack_start(GTK_BOX(glade_xml_get_widget(self->xml, "parameter_editor_box")), editor, FALSE, FALSE, 0); gtk_widget_show_all(editor); /* Create the view */ self->view = histogram_view_new(HISTOGRAM_IMAGER(map)); gtk_container_add(GTK_CONTAINER(glade_xml_get_widget(self->xml, "drawing_area_viewport")), self->view); gtk_widget_show_all(self->view); /* Set the initial render time */ on_render_time_changed(glade_xml_get_widget(self->xml, "render_time"), self); explorer_init_history(self); explorer_init_animation(self); explorer_init_tools(self); explorer_init_cluster(self); explorer_init_about(self); /* Start the iterative map rendering in the background, and get a callback every time a block * of calculations finish so we can update the GUI. */ iterative_map_start_calculation(self->map); g_signal_connect(G_OBJECT(self->map), "calculation-finished", G_CALLBACK(on_calculation_finished), self); /* Set the window's default size to include our default image size. * The cleanest way I know of to do this is to set the scrolled window's scrollbar policies * to 'never' and get the window's size requests, set them back to automatic, then set the * default size to that size request. */ window = glade_xml_get_widget(self->xml, "explorer_window"); scroll = glade_xml_get_widget(self->xml, "main_scrolledwindow"); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER, GTK_POLICY_NEVER); gtk_widget_size_request(window, &win_req); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_window_set_default_size(GTK_WINDOW(window), win_req.width, win_req.height); gtk_widget_show(window); return self; } /************************************************************************************/ /*********************************************************************** Clustering */ /************************************************************************************/ #ifndef HAVE_GNET /* Fake cluster functions, if gnet support is not available */ void explorer_init_cluster (Explorer *self) { /* If we have no cluster support, disable that menu item */ gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "toggle_cluster_window"), FALSE); } void explorer_dispose_cluster (Explorer *self) {} #endif /* !HAVE_GNET */ /************************************************************************************/ /*********************************************************************** Parameters */ /************************************************************************************/ static gdouble generate_random_param() { return uniform_variate() * 12 - 6; } static void on_randomize(GtkWidget *widget, Explorer* self) { g_object_set(self->map, "a", generate_random_param(), "b", generate_random_param(), "c", generate_random_param(), "d", generate_random_param(), NULL); } static void on_load_defaults(GtkWidget *widget, Explorer* self) { parameter_holder_reset_to_defaults(PARAMETER_HOLDER(self->map)); } /************************************************************************************/ /******************************************************************** Misc GUI goop */ /************************************************************************************/ static void on_quit(GtkWidget *widget, Explorer* self) { gtk_main_quit(); } static void on_widget_toggle(GtkWidget *widget, Explorer* self) { /* Toggle visibility of another widget. This widget should be named * toggle_foo to control the visibility of a widget named foo. */ const gchar *name; GtkWidget *toggled; name = gtk_widget_get_name(widget); g_assert(!strncmp((void *) name, "toggle_", 7)); toggled = glade_xml_get_widget(self->xml, name+7); if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) gtk_widget_show(toggled); else gtk_widget_hide(toggled); } static void on_zoom_reset(GtkWidget *widget, Explorer* self) { g_object_set(self->map, "zoom", 1.0, NULL); } static void on_zoom_in(GtkWidget *widget, Explorer* self) { g_object_set(self->map, "zoom", DE_JONG(self->map)->zoom + 2.0, NULL); } static void on_zoom_out(GtkWidget *widget, Explorer* self) { g_object_set(self->map, "zoom", DE_JONG(self->map)->zoom - 2.0, NULL); } #if (GTK_CHECK_VERSION(2, 4, 0)) static void update_image_preview (GtkFileChooser *chooser, GtkImage *image) { GdkPixbuf *image_pixbuf, *temp; static GdkPixbuf *emblem_pixbuf = NULL; gchar *filename; GdkPixmap *pixmap; gint width, height; if (emblem_pixbuf == NULL) { emblem_pixbuf = gdk_pixbuf_new_from_file (FYRE_DATADIR "/metadata-emblem.png", NULL); if (!emblem_pixbuf) emblem_pixbuf = gdk_pixbuf_new_from_file (BR_DATADIR ("/fyre/metadata-emblem.png"), NULL); } filename = gtk_file_chooser_get_filename (chooser); if (filename == NULL) { gtk_file_chooser_set_preview_widget_active (chooser, FALSE); return; } image_pixbuf = gdk_pixbuf_new_from_file_at_size (filename, 112, 112, NULL); if (image_pixbuf == NULL) { gtk_file_chooser_set_preview_widget_active (chooser, FALSE); return; } width = gdk_pixbuf_get_width (image_pixbuf); height = gdk_pixbuf_get_height (image_pixbuf); pixmap = gdk_pixmap_new (GTK_WIDGET (image)->window, width + 16, height + 16, -1); gdk_draw_rectangle (pixmap, GTK_WIDGET (image)->style->bg_gc[GTK_STATE_NORMAL], TRUE, 0, 0, width + 16, height + 16); gdk_draw_pixbuf (pixmap, NULL, image_pixbuf, 0, 0, 0, 0, width - 1, height - 1, GDK_RGB_DITHER_NONE, 0, 0); temp = gdk_pixbuf_new_from_file (filename, NULL); if (temp) { if (gdk_pixbuf_get_option (temp, "tEXt::fyre_params")) gdk_draw_pixbuf (pixmap, NULL, emblem_pixbuf, 0, 0, width - 16, height - 16, 31, 31, GDK_RGB_DITHER_NONE, 0, 0); else if (gdk_pixbuf_get_option (temp, "tEXt::de_jong_params")) gdk_draw_pixbuf (pixmap, NULL, emblem_pixbuf, 0, 0, width - 16, height - 16, 31, 31, GDK_RGB_DITHER_NONE, 0, 0); gdk_pixbuf_unref (temp); } if (image_pixbuf) gdk_pixbuf_unref (image_pixbuf); gtk_image_set_from_pixmap (GTK_IMAGE (image), pixmap, NULL); gdk_pixmap_unref (pixmap); gtk_file_chooser_set_preview_widget_active (chooser, TRUE); } #endif static void on_load_from_image (GtkWidget *widget, Explorer* self) { GtkWidget *dialog, *image; GError *error = NULL; gchar *filename = NULL; #if (GTK_CHECK_VERSION(2, 4, 0)) dialog = gtk_file_chooser_dialog_new ("Open Image Parameters", GTK_WINDOW (glade_xml_get_widget (self->xml, "explorer_window")), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); image = gtk_image_new (); gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (dialog), image); g_signal_connect (G_OBJECT (dialog), "update-preview", G_CALLBACK (update_image_preview), image); if (file_location) gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), file_location); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); histogram_imager_load_image_file (HISTOGRAM_IMAGER (self->map), filename, &error); if (file_location) g_free (file_location); file_location = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)); } #else dialog = gtk_file_selection_new ("Open Image Parameters"); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (dialog)); histogram_imager_load_image_file (HISTOGRAM_IMAGER (self->map), filename, &error); } #endif gtk_widget_destroy (dialog); if (error) { GtkWidget *dialog, *label; gchar *text; dialog = glade_xml_get_widget (self->xml, "error dialog"); label = glade_xml_get_widget (self->xml, "error label"); text = g_strdup_printf ("Could not load \"%s\"\n\n%s", filename, error->message); gtk_label_set_markup (GTK_LABEL (label), text); g_free (text); g_error_free (error); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_hide (dialog); } g_free (filename); } static void on_save (GtkWidget *widget, Explorer* self) { GtkWidget *dialog; GError *error = NULL; gchar *filename = NULL; #if (GTK_CHECK_VERSION(2, 4, 0)) dialog = gtk_file_chooser_dialog_new ("Save Image", GTK_WINDOW (glade_xml_get_widget (self->xml, "explorer_window")), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); if (file_location != NULL) gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), file_location); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); histogram_imager_save_image_file (HISTOGRAM_IMAGER (self->map), filename, &error); if (file_location) g_free (file_location); file_location = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)); } #else dialog = gtk_file_selection_new ("Save Image"); gtk_file_selection_set_filename (GTK_FILE_SELECTION (dialog), "rendering.png"); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { filename = g_strdup (gtk_file_selection_get_filename (GTK_FILE_SELECTION (dialog))); histogram_imager_save_image_file (HISTOGRAM_IMAGER (self->map), filename, &error); } #endif gtk_widget_destroy (dialog); if (error) { GtkWidget *dialog, *label; gchar *text; dialog = glade_xml_get_widget (self->xml, "error dialog"); label = glade_xml_get_widget (self->xml, "error label"); text = g_strdup_printf ("Could not save \"%s\"\n\n%s", filename, error->message); gtk_label_set_markup (GTK_LABEL (label), text); g_free (text); g_error_free (error); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_hide (dialog); } if (filename) g_free (filename); } static void on_save_exr (GtkWidget *widget, Explorer* self) { #ifdef HAVE_EXR GtkWidget *dialog; GError *error = NULL; gchar *filename = NULL; #if (GTK_CHECK_VERSION(2, 4, 0)) dialog = gtk_file_chooser_dialog_new ("Save OpenEXR Image", GTK_WINDOW (glade_xml_get_widget (self->xml, "explorer_window")), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); if (file_location != NULL) gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), file_location); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); exr_save_image_file (HISTOGRAM_IMAGER (self->map), filename, &error); if (file_location) g_free (file_location); file_location = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog)); } #else dialog = gtk_file_selection_new ("Save OpenEXR Image"); gtk_file_selection_set_filename (GTK_FILE_SELECTION (dialog), "rendering.exr"); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { const gchar *filename; filename = g_strdup (gtk_file_selection_get_filename (GTK_FILE_SELECTION (dialog))); exr_save_image_file (HISTOGRAM_IMAGER (self->map), filename, &error); } #endif /* GTK_CHECK_VERSION */ gtk_widget_destroy (dialog); if (error) { GtkWidget *dialog, *label; gchar *text; dialog = glade_xml_get_widget (self->xml, "error dialog"); label = glade_xml_get_widget (self->xml, "error label"); text = g_strdup_printf ("Could not save \"%s\"\n\n%s", filename, error->message); gtk_label_set_markup (GTK_LABEL (label), text); g_free (text); g_error_free (error); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_hide (dialog); } if (filename) g_free (filename); #endif /* HAVE_EXR */ } static void on_render_time_changed(GtkWidget *widget, Explorer* self) { double v = gtk_range_get_adjustment(GTK_RANGE(widget))->value; self->map->render_time = v / 1000.0; /* Milliseconds to seconds */ } static gboolean on_interactive_prefs_delete(GtkWidget *widget, GdkEvent *event, Explorer* self) { /* Just hide the window when the user tries to close it */ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(self->xml, "toggle_interactive_prefs")), FALSE); return TRUE; } /************************************************************************************/ /************************************************************************ Rendering */ /************************************************************************************/ static void on_pause_rendering_toggle(GtkWidget *widget, Explorer* self) { if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) iterative_map_stop_calculation(self->map); else iterative_map_start_calculation(self->map); /* Since the user is changing the pause state, let's refrain from * messing with it on explorer_restore_pause(). */ self->unpause_on_restore = FALSE; /* Update the speed shown in the status bar */ self->status_dirty_flag = TRUE; explorer_update_gui(self); } void explorer_force_pause (Explorer *self) { /* Force rendering to pause now, but keep note of its original state * so that explorer_restore_pause() can undo this as necessary. */ GtkCheckMenuItem *paused = GTK_CHECK_MENU_ITEM(glade_xml_get_widget(self->xml, "pause_menu")); gboolean original_state = gtk_check_menu_item_get_active(paused); gtk_check_menu_item_set_active(paused, TRUE); /* Now, on_pause_rendering_toggle just disabled unpause_on_restore since * typically only a user changes the pause_menu state. We want to turn * that back on if we just paused it and originally it was unpaused, * so that explorer_restore_pause() does the Right Thing (tm). */ self->unpause_on_restore = !original_state; } void explorer_restore_pause (Explorer *self) { if (self->unpause_on_restore) { GtkCheckMenuItem *paused = GTK_CHECK_MENU_ITEM(glade_xml_get_widget(self->xml, "pause_menu")); self->unpause_on_restore = FALSE; gtk_check_menu_item_set_active(paused, FALSE); } } static void on_calculation_finished(IterativeMap *map, Explorer* self) { explorer_update_gui(self); explorer_update_animation(self); explorer_update_tools(self); } void explorer_run_iterations(Explorer *self) { iterative_map_calculate_timed(self->map, self->map->render_time); } static gboolean limit_update_rate(GTimer *timer, float max_rate) { /* Limit the frame rate to the given value. This should be called once per * frame, and will return FALSE if it's alright to render another frame, * or TRUE otherwise. */ if (g_timer_elapsed(timer, NULL) < (1.0 / max_rate)) return TRUE; g_timer_start(timer); return FALSE; } static gboolean explorer_auto_limit_update_rate(Explorer *self) { /* Automatically determine a good maximum frame rate based on the current * elapsed time, and use limit_update_rate() to limit us to that. * Returns 1 if a frame should not be rendered. * * 'gamma' determines the nonlinearity. At gamma=1 we ramp down the period * linearly. (not the rate) The other parameters determine the speed and the * maximum/minimum rates. Voodoo below! */ const double initial_rate = 60; const double final_rate = 0.1; const double ramp_down_seconds = 120; const double gamma = 0.9; /* Convert the user-friendly constants above into constants in nonlinear period space */ double rate, elapsed; static gboolean init = FALSE; static double pow_initial_period, pow_period_scale, one_over_gamma; if (!init) { pow_initial_period = pow(1.0 / initial_rate, gamma); pow_period_scale = (pow(1.0 / final_rate, gamma) - pow_initial_period) / ramp_down_seconds; one_over_gamma = 1.0 / gamma; init = TRUE; } /* Now it's just a simple linear function followed by a nonlinear * transformation back to rate space. */ elapsed = histogram_imager_get_elapsed_time(HISTOGRAM_IMAGER(self->map)); if (elapsed > ramp_down_seconds) rate = final_rate; else rate = 1.0 / pow(pow_initial_period + pow_period_scale * elapsed, one_over_gamma); return limit_update_rate(self->auto_update_rate_timer, rate); } void explorer_update_gui(Explorer *self) { /* If the GUI needs updating, update it. This includes limiting the maximum * update rate, updating the iteration count display, and actually rendering * frames to the drawing area. */ /* If we have rendering changes we're trying to push through as quickly * as possible, don't bother with the status bar or with frame rate limiting. */ if (HISTOGRAM_IMAGER(self->map)->render_dirty_flag) { histogram_view_update(HISTOGRAM_VIEW(self->view)); return; } /* If we have an important status change to report, update both * the status bar and the view without frame rate limiting. */ if (self->status_dirty_flag) { explorer_update_status_bar(self); histogram_view_update(HISTOGRAM_VIEW(self->view)); return; } /* Update the status bar at a fixed rate. This will give the user * the impression that things are moving along steadily even when * we're actually updating the view very slowly later in the render. */ if (!limit_update_rate(self->status_update_rate_timer, 2.0 )) { explorer_update_status_bar(self); } /* Use our funky automatic frame rate adjuster to time normal view updates. * This will slow down updates nonlinearly as rendering progresses, * to give good interactive response while making batch rendering * still fairly efficient. */ if (!explorer_auto_limit_update_rate(self)) { histogram_view_update(HISTOGRAM_VIEW(self->view)); } } static void explorer_update_status_bar(Explorer *self) { gchar *status = explorer_strdup_status(self); if (self->render_status_message_id) gtk_statusbar_remove(self->statusbar, self->render_status_context, self->render_status_message_id); self->render_status_message_id = gtk_statusbar_push(self->statusbar, self->render_status_context, status); g_free(status); self->status_dirty_flag = FALSE; } static gchar* explorer_strdup_status (Explorer *self) { gchar *status; gchar *elapsed = explorer_strdup_elapsed(self); gchar *speed = explorer_strdup_speed(self); gchar *quality = explorer_strdup_quality(self); status = g_strdup_printf("Elapsed time: %s\t\t" "Iterations: %.3e\t\t" "Speed: %s\t\t" "Quality: %s\t\t" "Current tool: %s", elapsed, self->map->iterations, speed, quality, self->current_tool); g_free(elapsed); g_free(speed); g_free(quality); return status; } static gchar* explorer_strdup_elapsed (Explorer *self) { gulong elapsed = (gulong) histogram_imager_get_elapsed_time(HISTOGRAM_IMAGER(self->map)); return g_strdup_printf("%02ld:%02ld:%02ld", elapsed / (60*60), (elapsed / 60) % 60, elapsed % 60); } static gchar* explorer_strdup_speed (Explorer *self) { if (iterative_map_is_calculation_running(self->map)) return g_strdup_printf("%.3e/sec", explorer_get_iter_speed(self)); else return g_strdup("Paused"); } static gchar* explorer_strdup_quality (Explorer *self) { gdouble q = histogram_imager_compute_quality(HISTOGRAM_IMAGER(self->map)); if (q > (G_MAXDOUBLE / 2)) return g_strdup("N/A"); else return g_strdup_printf("%.3f", q); } static gdouble explorer_get_iter_speed(Explorer *self) { double elapsed = g_timer_elapsed(self->speed_timer, NULL); double iter_diff = self->map->iterations - self->last_iterations; if (iter_diff < 0) { /* Calculation restarted */ g_timer_start(self->speed_timer); self->last_iterations = self->map->iterations; } else if (iter_diff > 0 && elapsed > 1.0) { g_timer_start(self->speed_timer); self->last_iterations = self->map->iterations; self->iter_speed = iter_diff / elapsed; } return self->iter_speed; } /* The End */ fyre-1.0.1/src/explorer.h0000644000175000001440000001160410356610376012204 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * explorer.h - An interactive GUI for manipulating an IterativeMap * object and viewing its output * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __EXPLORER_H__ #define __EXPLORER_H__ #include #include #include "animation.h" #include "animation-render-ui.h" #include "screensaver.h" #ifdef HAVE_GNET #include "cluster-model.h" #endif G_BEGIN_DECLS #define EXPLORER_TYPE (explorer_get_type ()) #define EXPLORER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EXPLORER_TYPE, Explorer)) #define EXPLORER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EXPLORER_TYPE, ExplorerClass)) #define IS_EXPLORER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EXPLORER_TYPE)) #define IS_EXPLORER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EXPLORER_TYPE)) typedef struct _Explorer Explorer; typedef struct _ExplorerClass ExplorerClass; struct _Explorer { GObject object; IterativeMap* map; Animation* animation; AnimationRenderUi* render_window; GladeXML* xml; GtkWidget* window; GtkWidget* view; GtkWidget* fgcolor_button; GtkWidget* bgcolor_button; ScreenSaver* about_image; GtkStatusbar* statusbar; guint render_status_message_id; guint render_status_context; gboolean status_dirty_flag; GTimer* auto_update_rate_timer; GTimer* status_update_rate_timer; GTimer* speed_timer; double last_iterations; double iter_speed; gchar* current_tool; gboolean tool_active; double last_mouse_x; double last_mouse_y; double last_click_x; double last_click_y; GTimeVal last_tool_idle_update; GtkWidget* anim_curve; gboolean allow_transition_changes; gboolean selecting_keyframe; gboolean seeking_animation; gboolean seeking_animation_transition; gboolean playing_animation; gboolean unpause_on_restore; GTimeVal last_anim_frame_time; GQueue* history_queue; guint history_timer; GList* history_current_link; gboolean history_freeze; #ifdef HAVE_GNET ClusterModel* cluster_model; #endif }; struct _ExplorerClass { GObjectClass parent_class; }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType explorer_get_type(); Explorer* explorer_new (IterativeMap *map, Animation *animation); /************************************************************************************/ /***************************************************************** Internal methods */ /************************************************************************************/ void explorer_init_tools (Explorer *self); gboolean explorer_update_tools (Explorer *self); void explorer_init_animation (Explorer *self); void explorer_dispose_animation (Explorer *self); void explorer_update_animation (Explorer *self); void explorer_init_cluster (Explorer *self); void explorer_dispose_cluster (Explorer *self); void explorer_init_about (Explorer *self); void explorer_init_history (Explorer *self); void explorer_dispose_history (Explorer *self); void explorer_run_iterations (Explorer *self); void explorer_update_gui (Explorer *self); void explorer_force_pause (Explorer *self); void explorer_restore_pause (Explorer *self); G_END_DECLS #endif /* __EXPLORER_H__ */ /* The End */ fyre-1.0.1/src/parameter-editor.c0000644000175000001440000005360010446431132013574 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * parameter-editor.c - Automatically constructs a GUI for editing the * parameters of a ParameterHolder instance. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "parameter-editor.h" #include "color-button.h" #include #include static void parameter_editor_class_init(ParameterEditorClass *klass); static void parameter_editor_init(ParameterEditor *self); static void parameter_editor_finalize(GObject *object); static void parameter_editor_attach(ParameterEditor *self, ParameterHolder *holder); static void parameter_editor_add_paramspec(ParameterEditor *self, GParamSpec *spec); static void parameter_editor_add_group_heading(ParameterEditor *self, const gchar *group); static void parameter_editor_add_row(ParameterEditor *self, GParamSpec *spec, GtkWidget *row); static void parameter_editor_add_dependency(ParameterEditor *self, GtkWidget *widget, const gchar *dependency_name); static void parameter_editor_add_labeled_row(ParameterEditor *self, GParamSpec *spec, GtkWidget *row); static void parameter_editor_connect_notify(ParameterEditor *self, GtkWidget *widget, const gchar *property_name, GCallback func); static void parameter_editor_add_numeric(ParameterEditor *self, GParamSpec *spec); static void parameter_editor_add_color(ParameterEditor *self, GParamSpec *spec); static void parameter_editor_add_boolean(ParameterEditor *self, GParamSpec *spec); static void parameter_editor_add_enum(ParameterEditor *self, GParamSpec *spec); static void on_changed_numeric(GtkWidget *widget, ParameterEditor *self); static void on_changed_color(GtkWidget *widget, ParameterEditor *self); static void on_changed_boolean(GtkWidget *widget, ParameterEditor *self); static void on_changed_enum(GtkWidget *widget, ParameterEditor *self); static void on_notify_numeric(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget); static void on_notify_color(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget); static void on_notify_opacity(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget); static void on_notify_boolean(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget); static void on_notify_dependency(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget); static void on_notify_enum(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType parameter_editor_get_type(void) { static GType pe_type = 0; if (!pe_type) { static const GTypeInfo pe_info = { sizeof(ParameterEditorClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) parameter_editor_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(ParameterEditor), 0, (GInstanceInitFunc) parameter_editor_init, }; pe_type = g_type_register_static(GTK_TYPE_VBOX, "ParameterEditor", &pe_info, 0); } return pe_type; } static void parameter_editor_class_init(ParameterEditorClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = parameter_editor_finalize; } static void parameter_editor_init(ParameterEditor *self) { self->label_sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); } static void parameter_editor_finalize(GObject *object) { ParameterEditor *self = PARAMETER_EDITOR(object); if (self->holder) { g_object_unref(self->holder); self->holder = NULL; } if (self->label_sizegroup) { g_object_unref(self->label_sizegroup); self->label_sizegroup = NULL; } if (self->previous_group) { g_free(self->previous_group); self->previous_group = NULL; } } GtkWidget* parameter_editor_new(ParameterHolder *holder) { ParameterEditor *self = g_object_new(parameter_editor_get_type(), NULL); parameter_editor_attach(self, holder); return GTK_WIDGET(self); } /************************************************************************************/ /********************************************************************* GUI Building */ /************************************************************************************/ static void parameter_editor_attach(ParameterEditor *self, ParameterHolder *holder) { /* Attach this parameter editor to a holder, adding widgets for * each paramspec in the holder with a PARAM_IN_GUI flag */ GParamSpec** properties; guint n_properties; int i; self->holder = g_object_ref(holder); properties = g_object_class_list_properties(G_OBJECT_GET_CLASS(holder), &n_properties); for (i=0; iflags & PARAM_IN_GUI) parameter_editor_add_paramspec(self, properties[i]); } g_free(properties); } static void parameter_editor_add_paramspec(ParameterEditor *self, GParamSpec *spec) { const gchar *group; /* Get this parameter's group name, adding a new group header if it's changed */ group = param_spec_get_group(spec); if (group) { if ((!self->previous_group) || strcmp((void *) group, self->previous_group)) parameter_editor_add_group_heading(self, group); if (self->previous_group) g_free(self->previous_group); self->previous_group = g_strdup(group); } /* Pick a type-dependent procedure for adding this parameter to the GUI */ if (spec->value_type == G_TYPE_DOUBLE) parameter_editor_add_numeric(self, spec); else if (spec->value_type == G_TYPE_UINT) parameter_editor_add_numeric(self, spec); else if (spec->value_type == GDK_TYPE_COLOR) parameter_editor_add_color(self, spec); else if (spec->value_type == G_TYPE_BOOLEAN) parameter_editor_add_boolean(self, spec); else if (g_type_is_a (spec->value_type, G_TYPE_ENUM)) parameter_editor_add_enum (self, spec); else g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Can't edit values of type %s", g_type_name(spec->value_type)); } static void parameter_editor_add_group_heading(ParameterEditor *self, const gchar *group) { GtkWidget *label; gchar *markup; /* Add a separator if this isn't the first group */ if (self->previous_group) gtk_box_pack_start(GTK_BOX(self), gtk_hseparator_new(), FALSE, FALSE, 4); /* Make a label with the group name bold and centered */ markup = g_strdup_printf("%s", group); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), markup); g_free(markup); gtk_box_pack_start(GTK_BOX(self), label, FALSE, FALSE, 4); } static void parameter_editor_add_row(ParameterEditor *self, GParamSpec *spec, GtkWidget *row) { const gchar *dep; gtk_box_pack_start(GTK_BOX(self), row, FALSE, FALSE, 2); dep = param_spec_get_dependency(spec); if (dep) parameter_editor_add_dependency(self, row, dep); } static void parameter_editor_add_labeled_row(ParameterEditor *self, GParamSpec *spec, GtkWidget *row) { GtkWidget *hbox, *label; gchar *text; hbox = gtk_hbox_new(FALSE, 0); text = g_strdup_printf("%s:", g_param_spec_get_nick(spec)); label = gtk_label_new(text); g_free(text); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_size_group_add_widget(self->label_sizegroup, label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 6); gtk_box_pack_start(GTK_BOX(hbox), row, TRUE, TRUE, 6); parameter_editor_add_row(self, spec, hbox); } static void parameter_editor_add_dependency(ParameterEditor *self, GtkWidget *widget, const gchar *dependency_name) { /* Add a notify callback to our dependency that enables or disables the given widget. * Call the notify callback once right away to set up our initial sensitivity. */ gchar *signal_name; GParamSpec *spec; signal_name = g_strdup_printf("notify::%s", dependency_name); g_signal_connect(self->holder, signal_name, G_CALLBACK(on_notify_dependency), widget); g_free(signal_name); spec = g_object_class_find_property(G_OBJECT_GET_CLASS(self->holder), dependency_name); on_notify_dependency(self->holder, spec, widget); } /************************************************************************************/ /********************************************************************* Type Editors */ /************************************************************************************/ static void parameter_editor_connect_notify(ParameterEditor *self, GtkWidget *widget, const gchar *property_name, GCallback func) { /* Connect to the notify:: signal so we can update the * GUI automatically when someone else changes the property. The * callback needs to know which widget is associated with this property, * and it needs a pointer to our ParameterEditor instance. We do this by * passing the widget as user_data but using g_object_set_data to * attach the ParameterEditor to the widget. */ gchar *signal_name; signal_name = g_strdup_printf("notify::%s", property_name); g_object_set_data(G_OBJECT(widget), "ParameterEditor", self); g_signal_connect(self->holder, signal_name, func, widget); g_free(signal_name); } static void parameter_editor_add_numeric(ParameterEditor *self, GParamSpec *spec) { GtkWidget *spinner; GtkObject *adjustment; gdouble climb_rate = 0.1; int digits = 1; gdouble value = 0; gdouble upper = 1; gdouble lower = 0; gdouble step_increment = 0.1; gdouble page_increment = 0.1; gdouble page_size = 0; const ParameterIncrements *increments; GValue gv, double_gv; /* Look for upper and lower bounds in the GParamSpec to override our defaults */ if (G_IS_PARAM_SPEC_DOUBLE(spec)) { GParamSpecDouble *s = G_PARAM_SPEC_DOUBLE(spec); upper = s->maximum; lower = s->minimum; } else if (G_IS_PARAM_SPEC_UINT(spec)) { GParamSpecUInt *s = G_PARAM_SPEC_UINT(spec); upper = s->maximum; lower = s->minimum; } /* Look for a ParameterIncrements structure attached to this parameter. * If we find one, set the increments and number of digits from it. */ increments = param_spec_get_increments(spec); if (increments) { digits = increments->digits; step_increment = increments->step; page_increment = increments->page; climb_rate = increments->step; } /* Get the parameter's current value */ memset(&gv, 0, sizeof(gv)); memset(&double_gv, 0, sizeof(double_gv)); g_value_init(&gv, spec->value_type); g_value_init(&double_gv, G_TYPE_DOUBLE); g_object_get_property(G_OBJECT(self->holder), spec->name, &gv); g_value_transform(&gv, &double_gv); value = g_value_get_double(&double_gv); g_value_unset(&gv); g_value_unset(&double_gv); adjustment = gtk_adjustment_new(value, lower, upper, step_increment, page_increment, page_size); spinner = gtk_spin_button_new(GTK_ADJUSTMENT(adjustment), climb_rate, digits); /* Set up our callback on change */ g_object_set_data(G_OBJECT(spinner), "ParamSpec", spec); g_signal_connect(spinner, "value-changed", G_CALLBACK(on_changed_numeric), self); parameter_editor_connect_notify(self, spinner, spec->name, G_CALLBACK(on_notify_numeric)); parameter_editor_add_labeled_row(self, spec, spinner); } static void parameter_editor_add_color(ParameterEditor *self, GParamSpec *spec) { GtkWidget *color_button; const gchar* opacity_property; guint16 opacity = 0xFFFF; GdkColor color = {0,0,0,0}; GValue gv; /* See if this color property has a matching opacity property */ opacity_property = g_param_spec_get_qdata(spec, g_quark_from_static_string("opacity-property")); if (opacity_property) { /* Get the current opacity */ memset(&gv, 0, sizeof(gv)); g_value_init(&gv, G_TYPE_UINT); g_object_get_property(G_OBJECT(self->holder), opacity_property, &gv); opacity = g_value_get_uint(&gv); g_value_unset(&gv); } /* Get the current color */ memset(&gv, 0, sizeof(gv)); g_value_init(&gv, GDK_TYPE_COLOR); g_object_get_property(G_OBJECT(self->holder), spec->name, &gv); color = *(GdkColor*)g_value_get_boxed(&gv); g_value_unset(&gv); color_button = color_button_new_with_defaults(g_param_spec_get_nick(spec), &color, opacity); /* Set up our callback on change */ g_object_set_data(G_OBJECT(color_button), "ParamSpec", spec); g_signal_connect(color_button, "changed", G_CALLBACK(on_changed_color), self); parameter_editor_connect_notify(self, color_button, spec->name, G_CALLBACK(on_notify_color)); if (opacity_property) parameter_editor_connect_notify(self, color_button, opacity_property, G_CALLBACK(on_notify_opacity)); parameter_editor_add_labeled_row(self, spec, color_button); } static void parameter_editor_add_boolean(ParameterEditor *self, GParamSpec *spec) { GtkWidget *check; GValue gv; check = gtk_check_button_new(); /* Get the parameter's current value */ memset(&gv, 0, sizeof(gv)); g_value_init(&gv, spec->value_type); g_object_get_property(G_OBJECT(self->holder), spec->name, &gv); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), g_value_get_boolean(&gv)); g_value_unset(&gv); /* Set up our callback on change */ g_object_set_data(G_OBJECT(check), "ParamSpec", spec); g_signal_connect(check, "toggled", G_CALLBACK(on_changed_boolean), self); parameter_editor_connect_notify(self, check, spec->name, G_CALLBACK(on_notify_boolean)); parameter_editor_add_labeled_row(self, spec, check); } static void parameter_editor_add_enum(ParameterEditor *self, GParamSpec *spec) { GtkWidget *combo; GValue gv; GEnumClass *klass; gint i; #if (GTK_MINOR_VERSION < 4) GtkWidget *menu; #endif klass = (GEnumClass*) g_type_class_ref (spec->value_type); #if (GTK_MINOR_VERSION >= 4) combo = gtk_combo_box_new_text (); for (i = 0; i < klass->n_values; i++) { GEnumValue *value; value = g_enum_get_value (klass, i); gtk_combo_box_append_text (GTK_COMBO_BOX (combo), value->value_nick); } #else combo = gtk_option_menu_new (); menu = gtk_menu_new (); for (i = 0; i < klass->n_values; i++) { GEnumValue *value; value = g_enum_get_value (klass, i); gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_menu_item_new_with_label (value->value_nick)); } gtk_option_menu_set_menu (GTK_OPTION_MENU (combo), menu); #endif /* Get the parameter's current value */ memset (&gv, 0, sizeof (gv)); g_value_init (&gv, spec->value_type); g_object_get_property (G_OBJECT (self->holder), spec->name, &gv); #if (GTK_MINOR_VERSION >= 4) gtk_combo_box_set_active (GTK_COMBO_BOX (combo), g_value_get_enum (&gv)); #else gtk_option_menu_set_history (GTK_OPTION_MENU (combo), g_value_get_enum (&gv)); #endif g_value_unset (&gv); /* Set up our callback on change */ g_object_set_data (G_OBJECT (combo), "ParamSpec", spec); g_signal_connect (combo, "changed", G_CALLBACK (on_changed_enum), self); parameter_editor_connect_notify (self, combo, spec->name, G_CALLBACK (on_notify_enum)); parameter_editor_add_labeled_row (self, spec, combo); } /************************************************************************************/ /***************************************************************** Widget callbacks */ /************************************************************************************/ static void on_changed_numeric(GtkWidget *widget, ParameterEditor *self) { GParamSpec *spec = g_object_get_data(G_OBJECT(widget), "ParamSpec"); GValue gv, double_gv; if (self->suppress_changed) return; /* Convert the current spinner value from a double to whatever type we need, * and set the property from that converted value. */ memset(&gv, 0, sizeof(gv)); memset(&double_gv, 0, sizeof(double_gv)); g_value_init(&gv, spec->value_type); g_value_init(&double_gv, G_TYPE_DOUBLE); g_value_set_double(&double_gv, gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget))); g_value_transform(&double_gv, &gv); self->suppress_notify = TRUE; g_object_set_property(G_OBJECT(self->holder), spec->name, &gv); self->suppress_notify = FALSE; g_value_unset(&gv); g_value_unset(&double_gv); } static void on_changed_color(GtkWidget *widget, ParameterEditor *self) { GParamSpec *spec = g_object_get_data(G_OBJECT(widget), "ParamSpec"); GdkColor c; const gchar* opacity_property; guint opacity; if (self->suppress_changed) return; opacity_property = g_param_spec_get_qdata(spec, g_quark_from_static_string("opacity-property")); color_button_get_color(COLOR_BUTTON(widget), &c); opacity = color_button_get_alpha(COLOR_BUTTON(widget)); /* Set both color and opacity if we have both. If we don't have * an opacity property, opacity_property will be NULL and the opacity * parameter will be ignored. */ self->suppress_notify = TRUE; g_object_set(self->holder, spec->name, &c, opacity_property, opacity, NULL); self->suppress_notify = FALSE; } static void on_changed_boolean(GtkWidget *widget, ParameterEditor *self) { GParamSpec *spec = g_object_get_data(G_OBJECT(widget), "ParamSpec"); gboolean active; if (self->suppress_changed) return; active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); self->suppress_notify = TRUE; g_object_set(self->holder, spec->name, active, NULL); self->suppress_notify = FALSE; } static void on_changed_enum(GtkWidget *widget, ParameterEditor *self) { GParamSpec *spec = g_object_get_data (G_OBJECT (widget), "ParamSpec"); gint active; if (self->suppress_changed) return; #if (GTK_MINOR_VERSION >= 4) active = gtk_combo_box_get_active (GTK_COMBO_BOX (widget)); #else active = gtk_option_menu_get_history (GTK_OPTION_MENU (widget)); #endif self->suppress_notify = TRUE; g_object_set (self->holder, spec->name, active, NULL); self->suppress_notify = FALSE; } /************************************************************************************/ /***************************************************************** Notify callbacks */ /************************************************************************************/ static void on_notify_numeric(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget) { ParameterEditor *self = g_object_get_data(G_OBJECT(widget), "ParameterEditor"); GValue gv, double_gv; if (self->suppress_notify) return; /* Conver the current property value to a double and set our spin button */ memset(&gv, 0, sizeof(gv)); memset(&double_gv, 0, sizeof(double_gv)); g_value_init(&gv, spec->value_type); g_value_init(&double_gv, G_TYPE_DOUBLE); g_object_get_property(G_OBJECT(holder), spec->name, &gv); g_value_transform(&gv, &double_gv); self->suppress_changed = TRUE; gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), g_value_get_double(&double_gv)); self->suppress_changed = FALSE; g_value_unset(&gv); g_value_unset(&double_gv); } static void on_notify_color(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget) { ParameterEditor *self = g_object_get_data(G_OBJECT(widget), "ParameterEditor"); GdkColor *c; if (self->suppress_notify) return; g_object_get(holder, spec->name, &c, NULL); self->suppress_changed = TRUE; color_button_set_color(COLOR_BUTTON(widget), c); self->suppress_changed = FALSE; } static void on_notify_opacity(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget) { ParameterEditor *self = g_object_get_data(G_OBJECT(widget), "ParameterEditor"); guint opacity; if (self->suppress_notify) return; g_object_get(holder, spec->name, &opacity, NULL); self->suppress_changed = TRUE; color_button_set_alpha(COLOR_BUTTON(widget), opacity); self->suppress_changed = FALSE; } static void on_notify_boolean(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget) { ParameterEditor *self = g_object_get_data(G_OBJECT(widget), "ParameterEditor"); gboolean active; if (self->suppress_notify) return; g_object_get(holder, spec->name, &active, NULL); self->suppress_changed = TRUE; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), active); self->suppress_changed = FALSE; } static void on_notify_dependency(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget) { gboolean active; g_object_get(holder, spec->name, &active, NULL); gtk_widget_set_sensitive(widget, active); } static void on_notify_enum(ParameterHolder *holder, GParamSpec *spec, GtkWidget *widget) { ParameterEditor *self = g_object_get_data (G_OBJECT (widget), "ParameterEditor"); GValue gv; if (self->suppress_notify) return; memset (&gv, 0, sizeof (gv)); g_value_init (&gv, spec->value_type); g_object_get_property (G_OBJECT (holder), spec->name, &gv); self->suppress_changed = TRUE; #if (GTK_MINOR_VERSION >= 4) gtk_combo_box_set_active (GTK_COMBO_BOX (widget), g_value_get_enum (&gv)); #else gtk_option_menu_set_history (GTK_OPTION_MENU (widget), g_value_get_enum (&gv)); #endif self->suppress_changed = FALSE; g_value_unset (&gv); } /* The End */ fyre-1.0.1/src/parameter-editor.h0000644000175000001440000000504410356610453013605 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * parameter-editor.h - Automatically constructs a GUI for editing the * parameters of a ParameterHolder instance. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __PARAMETER_EDITOR_H__ #define __PARAMETER_EDITOR_H__ #include #include #include #include "parameter-holder.h" G_BEGIN_DECLS #define PARAMETER_EDITOR_TYPE (parameter_editor_get_type ()) #define PARAMETER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PARAMETER_EDITOR_TYPE, ParameterEditor)) #define PARAMETER_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PARAMETER_EDITOR_TYPE, ParameterEditorClass)) #define IS_PARAMETER_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PARAMETER_EDITOR_TYPE)) #define IS_PARAMETER_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PARAMETER_EDITOR_TYPE)) typedef struct _ParameterEditor ParameterEditor; typedef struct _ParameterEditorClass ParameterEditorClass; struct _ParameterEditor { GtkVBox parent; ParameterHolder *holder; GtkSizeGroup *label_sizegroup; gchar *previous_group; gboolean suppress_notify; gboolean suppress_changed; }; struct _ParameterEditorClass { GtkVBoxClass parent_class; void (* parameter_editor) (ParameterEditor *cb); }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType parameter_editor_get_type(void); GtkWidget* parameter_editor_new(ParameterHolder *holder); G_END_DECLS #endif /* __PARAMETER_EDITOR_H__ */ /* The End */ fyre-1.0.1/src/de-jong.c0000644000175000001440000010621010446431132011647 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * de-jong.c - The DeJong object builds on the ParameterHolder and HistogramRender * objects to provide a rendering of the DeJong map into a histogram image. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "de-jong.h" #include "math-util.h" #include #include static void de_jong_class_init(DeJongClass *klass); static void de_jong_init(DeJong *self); static void de_jong_init_calc_params(GObjectClass *object_class); static void de_jong_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void de_jong_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void de_jong_reset_calc(DeJong *self); static void de_jong_calculate(IterativeMap *self, guint iterations); static void de_jong_calculate_motion(IterativeMap *self, guint iterations, gboolean continuation, ParameterInterpolator *interp, gpointer interp_data); static ToolInfoPH *de_jong_get_tools(); static void update_double_if_necessary(gdouble new_value, gboolean *dirty_flag, gdouble *param, gdouble epsilon); static void update_boolean_if_necessary(gboolean new_value, gboolean *dirty_flag, gboolean *param); enum { PROP_0, PROP_FUNCTION, PROP_A, PROP_B, PROP_C, PROP_D, PROP_ZOOM, PROP_ASPECT, PROP_XOFFSET, PROP_YOFFSET, PROP_ROTATION, PROP_BLUR_RADIUS, PROP_BLUR_RATIO, PROP_TILEABLE, PROP_EMPHASIZE_TRANSIENT, PROP_TRANSIENT_ITERATIONS, PROP_INITIAL_CONDITIONS, PROP_INITIAL_XSCALE, PROP_INITIAL_YSCALE, PROP_INITIAL_XOFFSET, PROP_INITIAL_YOFFSET, }; typedef void (*initial_conditions_t)(gdouble *x, gdouble *y); void initial_func_square_uniform (gdouble *x, gdouble *y); void initial_func_gaussian (gdouble *x, gdouble *y); void initial_func_circular_uniform (gdouble *x, gdouble *y); void initial_func_radial (gdouble *x, gdouble *y); void initial_func_sphere (gdouble *x, gdouble *y); static const GEnumValue initial_conditions_enum[] = { { 0, "circular_uniform", "Circular uniform" }, { 1, "square_uniform", "Square uniform" }, { 2, "gaussian", "Gaussian" }, { 3, "radial", "Radial" }, { 4, "sphere", "Sphere" }, { 0 }, }; static const initial_conditions_t initial_conditions_table[] = { initial_func_circular_uniform, initial_func_square_uniform, initial_func_gaussian, initial_func_radial, initial_func_sphere, }; static GType initial_conditions_enum_get_type(void); static void tool_grab(ParameterHolder *self, ToolInput *i); static void tool_blur(ParameterHolder *self, ToolInput *i); static void tool_zoom(ParameterHolder *self, ToolInput *i); static void tool_rotate(ParameterHolder *self, ToolInput *i); static void tool_exposure_gamma(ParameterHolder *self, ToolInput *i); static void tool_a_b(ParameterHolder *self, ToolInput *i); static void tool_a_c(ParameterHolder *self, ToolInput *i); static void tool_a_d(ParameterHolder *self, ToolInput *i); static void tool_b_c(ParameterHolder *self, ToolInput *i); static void tool_b_d(ParameterHolder *self, ToolInput *i); static void tool_c_d(ParameterHolder *self, ToolInput *i); static void tool_ab_cd(ParameterHolder *self, ToolInput *i); static void tool_ac_bd(ParameterHolder *self, ToolInput *i); static const ToolInfoPH tool_table[] = { {"Grab", tool_grab, TOOL_USE_MOTION_EVENTS}, {"Blur", tool_blur, TOOL_USE_MOTION_EVENTS}, {"Zoom", tool_zoom, TOOL_USE_IDLE}, {"Rotate", tool_rotate, TOOL_USE_MOTION_EVENTS}, {"Gamma", tool_exposure_gamma, TOOL_USE_MOTION_EVENTS}, {"",}, {"A / B", tool_a_b, TOOL_USE_MOTION_EVENTS}, {"A / C", tool_a_c, TOOL_USE_MOTION_EVENTS}, {"A / D", tool_a_d, TOOL_USE_MOTION_EVENTS}, {"B / C", tool_b_c, TOOL_USE_MOTION_EVENTS}, {"B / D", tool_b_d, TOOL_USE_MOTION_EVENTS}, {"C / D", tool_c_d, TOOL_USE_MOTION_EVENTS}, {"",}, {"AB / CD", tool_ab_cd, TOOL_USE_MOTION_EVENTS}, {"AC / BD", tool_ac_bd, TOOL_USE_MOTION_EVENTS}, {NULL,}, }; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType de_jong_get_type(void) { static GType dj_type = 0; if (!dj_type) { static const GTypeInfo dj_info = { sizeof(DeJongClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) de_jong_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(DeJong), 0, (GInstanceInitFunc) de_jong_init, }; dj_type = g_type_register_static(ITERATIVE_MAP_TYPE, "DeJong", &dj_info, 0); } return dj_type; } static GType initial_conditions_enum_get_type(void) { static GType t = 0; if (!t) t = g_enum_register_static ("InitialConditions", initial_conditions_enum); return t; } static void de_jong_class_init(DeJongClass *klass) { GObjectClass *object_class; IterativeMapClass *im_class; ParameterHolderClass *ph_class; object_class = (GObjectClass*) klass; im_class = (IterativeMapClass*) klass; ph_class = (ParameterHolderClass*) klass; object_class->set_property = de_jong_set_property; object_class->get_property = de_jong_get_property; im_class->calculate = de_jong_calculate; im_class->calculate_motion = de_jong_calculate_motion; ph_class->get_tools = de_jong_get_tools; de_jong_init_calc_params(object_class); } static void de_jong_init_calc_params(GObjectClass *object_class) { GParamSpec *spec; const gchar *current_group = "Computation"; spec = g_param_spec_string ("function", "Function", "Function Name", "Peter de Jong Map", G_PARAM_READABLE); g_object_class_install_property (object_class, PROP_FUNCTION, spec); spec = g_param_spec_double ("a", "A", "de Jong parameter A", -100, 100, 2.38767, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 5); g_object_class_install_property (object_class, PROP_A, spec); spec = g_param_spec_double ("b", "B", "de Jong parameter B", -100, 100, -1.22713, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 5); g_object_class_install_property (object_class, PROP_B, spec); spec = g_param_spec_double ("c", "C", "de Jong parameter C", -100, 100, -0.39595, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 5); g_object_class_install_property (object_class, PROP_C, spec); spec = g_param_spec_double ("d", "D", "de Jong parameter D", -100, 100, -4.67104, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 5); g_object_class_install_property (object_class, PROP_D, spec); spec = g_param_spec_double ("zoom", "Zoom", "Zoom factor", 0.01, 1000, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.01, 0.1, 3); g_object_class_install_property (object_class, PROP_ZOOM, spec); spec = g_param_spec_double ("aspect", "Aspect", "Aspect ratio", 0.01, 100, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.1, 3); g_object_class_install_property (object_class, PROP_ASPECT, spec); spec = g_param_spec_double ("xoffset", "X offset", "Horizontal image offset", -100, 100, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 3); g_object_class_install_property (object_class, PROP_XOFFSET, spec); spec = g_param_spec_double ("yoffset", "Y offset", "Vertical image offset", -100, 100, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 3); g_object_class_install_property (object_class, PROP_YOFFSET, spec); spec = g_param_spec_double ("rotation", "Rotation", "Rotation angle, in radians", -100, 100, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 3); g_object_class_install_property (object_class, PROP_ROTATION, spec); spec = g_param_spec_double ("blur_radius", "Blur radius", "Gaussian blur radius", 0, 100, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.0001, 0.001, 4); g_object_class_install_property (object_class, PROP_BLUR_RADIUS, spec); spec = g_param_spec_double ("blur_ratio", "Blur ratio", "Amount of blurred vs non-blurred rendering", 0, 1, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.01, 0.1, 4); g_object_class_install_property (object_class, PROP_BLUR_RATIO, spec); spec = g_param_spec_boolean ("tileable", "Tileable", "When set, the image is wrapped rather than clipped at the edges", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); g_object_class_install_property (object_class, PROP_TILEABLE, spec); spec = g_param_spec_boolean ("emphasize_transient", "Emphasize transient", "Re-randomize the point periodically to emphasize transients", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); g_object_class_install_property (object_class, PROP_EMPHASIZE_TRANSIENT, spec); spec = g_param_spec_uint ("transient_iterations", "Transient iterations", "Number of iterations between re-randomization, when 'Emphasize transient' is enabled", 1, 100000, 50, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 1, 10, 0); param_spec_set_dependency (spec, "emphasize-transient"); g_object_class_install_property (object_class, PROP_TRANSIENT_ITERATIONS, spec); spec = g_param_spec_enum ("initial_conditions", "Initial conditions", "Selects the function used to generate initial conditions, when 'Emphasize transient' is enabled", initial_conditions_enum_get_type(), 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_dependency (spec, "emphasize-transient"); g_object_class_install_property (object_class, PROP_INITIAL_CONDITIONS, spec); spec = g_param_spec_double ("initial_xscale", "Initial X scale", "Horizontal initial condition scale factor", 0, 1000, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 3); param_spec_set_dependency (spec, "emphasize-transient"); g_object_class_install_property (object_class, PROP_INITIAL_XSCALE, spec); spec = g_param_spec_double ("initial_yscale", "Initial Y scale", "Vertical initial condition scale factor", 0, 1000, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 3); param_spec_set_dependency (spec, "emphasize-transient"); g_object_class_install_property (object_class, PROP_INITIAL_YSCALE, spec); spec = g_param_spec_double ("initial_xoffset", "Initial X offset", "Horizontal initial condition offset", -100, 100, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 3); param_spec_set_dependency (spec, "emphasize-transient"); g_object_class_install_property (object_class, PROP_INITIAL_XOFFSET, spec); spec = g_param_spec_double ("initial_yoffset", "Initial Y offset", "Vertical initial condition offset", -100, 100, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 3); param_spec_set_dependency (spec, "emphasize-transient"); g_object_class_install_property (object_class, PROP_INITIAL_YOFFSET, spec); } static void de_jong_init(DeJong *self) { /* Nothing to do here yet, everything's set up by our G_PARAM_CONSTRUCT properties */ } DeJong* de_jong_new() { return DE_JONG(g_object_new(de_jong_get_type(), NULL)); } /************************************************************************************/ /*********************************************************************** Properties */ /************************************************************************************/ static void update_double_if_necessary(double new_value, gboolean *dirty_flag, double *param, double epsilon) { if (fabs(new_value - *param) > epsilon) { *param = new_value; *dirty_flag = TRUE; } } static void update_boolean_if_necessary(gboolean new_value, gboolean *dirty_flag, gboolean *param) { if (new_value != *param) { *param = new_value; *dirty_flag = TRUE; } } static void update_uint_if_necessary(guint new_value, gboolean *dirty_flag, guint *param) { if (new_value != *param) { *param = new_value; *dirty_flag = TRUE; } } static void update_enum_if_necessary(gint new_value, gboolean *dirty_flag, gint *param) { if (new_value != *param) { *param = new_value; *dirty_flag = TRUE; } } static void de_jong_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { DeJong *self = DE_JONG(object); switch (prop_id) { case PROP_A: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->param.a, 0.000009); break; case PROP_B: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->param.b, 0.000009); break; case PROP_C: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->param.c, 0.000009); break; case PROP_D: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->param.d, 0.000009); break; case PROP_ZOOM: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->zoom, 0.0009); break; case PROP_ASPECT: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->aspect, 0.0009); break; case PROP_XOFFSET: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->xoffset, 0.000001); break; case PROP_YOFFSET: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->yoffset, 0.000001); break; case PROP_ROTATION: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->rotation, 0.0009); break; case PROP_BLUR_RADIUS: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->blur_radius, 0.00009); break; case PROP_BLUR_RATIO: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->blur_ratio, 0.00009); break; case PROP_TILEABLE: update_boolean_if_necessary(g_value_get_boolean(value), &self->calc_dirty_flag, &self->tileable); break; case PROP_EMPHASIZE_TRANSIENT: update_boolean_if_necessary(g_value_get_boolean(value), &self->calc_dirty_flag, &self->emphasize_transient); break; case PROP_TRANSIENT_ITERATIONS: update_uint_if_necessary(g_value_get_uint(value), &self->calc_dirty_flag, &self->transient_iterations); break; case PROP_INITIAL_CONDITIONS: update_enum_if_necessary(g_value_get_enum(value), &self->calc_dirty_flag, &self->initial_conditions); break; case PROP_INITIAL_XOFFSET: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->initial_xoffset, 0.000001); break; case PROP_INITIAL_YOFFSET: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->initial_yoffset, 0.000001); break; case PROP_INITIAL_XSCALE: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->initial_xscale, 0.0009); break; case PROP_INITIAL_YSCALE: update_double_if_necessary(g_value_get_double(value), &self->calc_dirty_flag, &self->initial_yscale, 0.0009); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void de_jong_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { DeJong *self = DE_JONG(object); switch (prop_id) { case PROP_A: g_value_set_double(value, self->param.a); break; case PROP_B: g_value_set_double(value, self->param.b); break; case PROP_C: g_value_set_double(value, self->param.c); break; case PROP_D: g_value_set_double(value, self->param.d); break; case PROP_ZOOM: g_value_set_double(value, self->zoom); break; case PROP_ASPECT: g_value_set_double(value, self->aspect); break; case PROP_XOFFSET: g_value_set_double(value, self->xoffset); break; case PROP_YOFFSET: g_value_set_double(value, self->yoffset); break; case PROP_ROTATION: g_value_set_double(value, self->rotation); break; case PROP_BLUR_RADIUS: g_value_set_double(value, self->blur_radius); break; case PROP_BLUR_RATIO: g_value_set_double(value, self->blur_ratio); break; case PROP_TILEABLE: g_value_set_boolean(value, self->tileable); break; case PROP_EMPHASIZE_TRANSIENT: g_value_set_boolean(value, self->emphasize_transient); break; case PROP_TRANSIENT_ITERATIONS: g_value_set_uint(value, self->transient_iterations); break; case PROP_INITIAL_CONDITIONS: g_value_set_enum(value, self->initial_conditions); break; case PROP_INITIAL_XOFFSET: g_value_set_double(value, self->initial_xoffset); break; case PROP_INITIAL_YOFFSET: g_value_set_double(value, self->initial_yoffset); break; case PROP_INITIAL_XSCALE: g_value_set_double(value, self->initial_xscale); break; case PROP_INITIAL_YSCALE: g_value_set_double(value, self->initial_yscale); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /************************************************************************************/ /********************************************************************** Calculation */ /************************************************************************************/ void de_jong_calculate(IterativeMap *map, guint iterations) { /* Copy frequently used parameters to local variables */ DeJong *self = DE_JONG(map); HistogramImager *hi = HISTOGRAM_IMAGER(map); const gboolean tileable = self->tileable; const DeJongParams param = self->param; /* Histogram state */ HistogramPlot plot; int hist_width, hist_height; /* Toggles to disable features that aren't needed */ const gboolean rotation_enabled = self->rotation > 0.0001 || self->rotation < -0.0001; const gboolean blur_enabled = self->blur_ratio > 0.0001 && self->blur_radius > 0.00001; const gboolean aspect_enabled = self->aspect > 1.0001 || self->aspect < 0.9999; const gboolean matrix_enabled = aspect_enabled || rotation_enabled; const gboolean emphasize_transient = self->emphasize_transient; const gboolean oversample_enabled = hi->oversample > 1; /* Blurring variables */ int blur_table_size = 0; int blur_ratio_period = 0; int blur_index = 0, blur_ratio_index = 0, blur_ratio_threshold = 0; float *blur_table = NULL; /* Oversampling irregularity table. * Fixed size for now. Must be a power of two! */ const int oversample_table_size = 32; int oversample_index = 0; float oversample_table[oversample_table_size]; /* Rotation/aspect matrix variables */ double sine_rotation, cosine_rotation, mat_a = 0, mat_b = 0, mat_c = 0, mat_d = 0; /* Iteration and projection variables */ double x, y, point_x, point_y; double scale, xcenter, ycenter; int i, ix, iy; guint remaining_transient_iterations; initial_conditions_t initial_func; /* Reset calculation if we need to */ if (self->calc_dirty_flag || HISTOGRAM_IMAGER(self)->histogram_clear_flag) de_jong_reset_calc(self); /* Ask the histogram imager to prepare a group of plots */ histogram_imager_prepare_plots(HISTOGRAM_IMAGER(self), &plot); histogram_imager_get_hist_size(HISTOGRAM_IMAGER(self), &hist_width, &hist_height); /* Calculate the scale and offset in histogram coordinates */ scale = hist_width / 5.0 * self->zoom; xcenter = hist_width / 2.0 + self->xoffset * scale; ycenter = hist_height / 2.0 + self->yoffset * scale; /* Set up the matrix used for rotation and aspect ratio adjustment */ if (matrix_enabled) { if (rotation_enabled) { sine_rotation = sin(self->rotation); cosine_rotation = cos(self->rotation); mat_a = cosine_rotation * self->aspect; mat_b = sine_rotation / self->aspect; mat_c = -sine_rotation * self->aspect; mat_d = cosine_rotation / self->aspect; } else { mat_a = self->aspect; mat_b = 0; mat_c = 0; mat_d = 1/self->aspect; } } /* Initialize the blur table with a set of precalculated normally distributed * random numbers. Larger blur tables just increase the independence between * blocks of iterations. Since a new blur table is calculated at each run_iterations, * at infinity the image still has the same effect, but each iteration runs much faster. */ if (blur_enabled) { /* Find a good size for the blur table. Our current heuristic finds * the smallest power of two that's still larger than 1/50 our iteration count. */ blur_table_size = find_upper_pow2(iterations / 50); /* Allocate and fill the blur table */ blur_table = alloca(blur_table_size * sizeof(blur_table[0])); for (i=0; iblur_radius; blur_table[i+1] = b * self->blur_radius; } blur_index = 0; /* Initialize the blur ratio counter and threshold */ blur_ratio_index = 0; blur_ratio_period = 1024; blur_ratio_threshold = self->blur_ratio * blur_ratio_period; } /* Initialize the oversample irregularity table. When we're oversampling, we * add +/- 1 subpixel of noise to the image in order to achieve the same effect * as irregular-grid FSAA: avoiding unpleasant interference patterns by filtering * out very high-frequency details that will generate aliasing artifacts. */ if (oversample_enabled) { for (i=0; ipoint_x; point_y = self->point_y; remaining_transient_iterations = self->remaining_transient_iterations; initial_func = initial_conditions_table[self->initial_conditions]; for(i=iterations; i; --i) { /* If transient emphasis is enabled, we periodically re-randomize * the point. When remaining_transient_iterations hits zero, we * re-randomize and set it back to the transient iteration count * set by the user. */ if (emphasize_transient) { if (remaining_transient_iterations) { remaining_transient_iterations--; } else { remaining_transient_iterations = self->transient_iterations-1; initial_func(&point_x, &point_y); point_x = self->initial_xscale * point_x + self->initial_xoffset; point_y = self->initial_yscale * point_y + self->initial_yoffset; } } /* These are the actual Peter de Jong map equations. The new point value * gets stored into 'point', then we go on and mess with x and y before plotting. */ x = sin(param.a * point_y) - cos(param.b * point_x); y = sin(param.c * point_x) - cos(param.d * point_y); /* x = sin(param.a * point_y) + param.c * cos(param.a * point_x); y = sin(param.b * point_x) + param.d * cos(param.b * point_y); */ /* x = sin(param.a * point_y) - tanh(param.b * point_x); y = sin(param.c * point_x) - tanh(param.d * point_y); */ /* x = sin(point_y * param.b) + param.c * sin(point_x * param.b); y = sin(point_x * param.a) + param.d * sin(point_y * param.a); */ point_x = x; point_y = y; if (matrix_enabled) { x = point_x * mat_a + point_y * mat_b; y = point_x * mat_c + point_y * mat_d; } /* If blurring is enabled, use blur_ratio to decide how often to perturb * the apparent point position, and blur_radius to determine how much. * By perturbing the point using a normal variate, we create a true gaussian * blur as the number of iterations approaches infinity. */ if (blur_enabled) { if (blur_ratio_index < blur_ratio_threshold) { x += blur_table[blur_index]; blur_index = (blur_index+1) & (blur_table_size-1); y += blur_table[blur_index]; blur_index = (blur_index+1) & (blur_table_size-1); } blur_ratio_index = (blur_ratio_index+1) & (blur_ratio_period-1); } /* Scale and translate our (x,y) coordinates into pixel coordinates */ x = x * scale + xcenter; y = y * scale + ycenter; /* Apply the random oversampling jitter, if applicable */ if (oversample_enabled) { x += oversample_table[oversample_index]; oversample_index = (oversample_index+1) & (oversample_table_size-1); y += oversample_table[oversample_index]; oversample_index = (oversample_index+1) & (oversample_table_size-1); } /* Convert (x,y) to integers. * Note that just casting to int here is incorrect! We want the behaviour * of floor(), always rounding toward -inf rather than zero. This should * behave identically to floor(), but a little faster. */ if (x<0) ix = x-1; else ix = x; if (y<0) iy = y-1; else iy = y; if (tileable) { /* In tileable rendering, we wrap at the edges */ ix %= hist_width; iy %= hist_height; if (ix < 0) ix += hist_width; if (iy < 0) iy += hist_height; } else { /* Otherwise, clip off the edges. * Cast ix and iy to unsigned so our comparison against * the width/height also implicitly compares against zero. */ if (((unsigned int)ix) >= hist_width || ((unsigned int)iy) >= hist_height) continue; } HISTOGRAM_IMAGER_PLOT(plot, ix, iy); } histogram_imager_finish_plots(HISTOGRAM_IMAGER(self), &plot); ITERATIVE_MAP(self)->iterations += iterations; self->point_x = point_x; self->point_y = point_y; self->remaining_transient_iterations = remaining_transient_iterations; } void de_jong_calculate_motion(IterativeMap *self, guint iterations, gboolean continuation, ParameterInterpolator *interp, gpointer interp_data) { /* The equivalent of de_jong_calculate, but for an object moving according * to a given interpolation function. * * The given number of iterations are divided into smaller blocks, each of * which are run with different random coordinates between a and b. This gives * us accurate motion blur almost for free. Since the existing interpolated * parameters of this DeJong object are ignored, the 'continuation' flag must be * set on all but the first call for rendering to be reset properly. */ const guint blocksize = iterations / 10; guint count; for (count=0; countcalc_dirty_flag = !continuation; de_jong_calculate(self, blocksize); } } static void de_jong_reset_calc(DeJong *self) { /* Reset the histogram and calculation state */ histogram_imager_clear(HISTOGRAM_IMAGER(self)); ITERATIVE_MAP(self)->iterations = 0; self->remaining_transient_iterations = 0; /* Random starting point, use a simple uniform variate * for this. We have more complex initial condition controls * we use when emphasize_transient is on, but when it's off * the initial conditions have no effect on the image as iterations * approach infinity. */ self->point_x = uniform_variate(); self->point_y = uniform_variate(); HISTOGRAM_IMAGER(self)->histogram_clear_flag = FALSE; self->calc_dirty_flag = FALSE; } /************************************************************************************/ /*************************************************************** Initial Conditions */ /************************************************************************************/ void initial_func_square_uniform (gdouble *x, gdouble *y) { /* From -1 to +1. The default used to be 0 to 1, which produced * some neat effects, but made a silly default. This, by default, * looks a lot like circular_uniform but with corners. */ *x = uniform_variate()*2 - 1; *y = uniform_variate()*2 - 1; } void initial_func_gaussian (gdouble *x, gdouble *y) { /* Just a unit normal in each axis */ normal_variate_pair(x, y); } void initial_func_circular_uniform (gdouble *x, gdouble *y) { /* A uniform distribution in each axis, but discarding * all values that fall outside the unit circle. This * gives a similar look to square_uniform, but with smooth * edges rather than corners. */ gdouble i, j; do { i = uniform_variate()*2 - 1; j = uniform_variate()*2 - 1; } while ( (i*i + j*j) > 1 ); *x = i; *y = j; } void initial_func_radial (gdouble *x, gdouble *y) { /* Pick a radius and angle uniformly, then convert to cartesian * coordinates. This also produces a unit circle, but it isn't * uniform- it has a strong dense spot in the center that fades * off toward the edges. Unlike gaussian, this still has distinct * edges. */ gdouble theta = uniform_variate() * M_PI * 2; gdouble radius = uniform_variate(); *x = cos(theta) * radius; *y = sin(theta) * radius; } void initial_func_sphere (gdouble *x, gdouble *y) { /* The opposite of radial's effect- a circle that's dense at * the edges and light in the center. This creates a distribution * uniform along the surface of a sphere, then flattens it. * * We currently implement this by normalizing the vector produced * by three normal variates- this is really slow. */ gdouble vx, vy, vz, vq; normal_variate_pair(&vx, &vy); normal_variate_pair(&vz, &vq); gdouble mag = sqrt(vx*vx + vy*vy + vz*vz); *x = vx / mag; *y = vy / mag; } /************************************************************************************/ /**************************************************************************** Tools */ /************************************************************************************/ static ToolInfoPH *de_jong_get_tools() { return (ToolInfoPH*) tool_table; } static void tool_grab(ParameterHolder *self, ToolInput *i) {} static void tool_blur(ParameterHolder *self, ToolInput *i) {} static void tool_zoom(ParameterHolder *self, ToolInput *i) {} static void tool_rotate(ParameterHolder *self, ToolInput *i) {} static void tool_exposure_gamma(ParameterHolder *self, ToolInput *i) {} static void tool_a_b(ParameterHolder *self, ToolInput *i) {} static void tool_a_c(ParameterHolder *self, ToolInput *i) {} static void tool_a_d(ParameterHolder *self, ToolInput *i) {} static void tool_b_c(ParameterHolder *self, ToolInput *i) {} static void tool_b_d(ParameterHolder *self, ToolInput *i) {} static void tool_c_d(ParameterHolder *self, ToolInput *i) {} static void tool_ab_cd(ParameterHolder *self, ToolInput *i) {} static void tool_ac_bd(ParameterHolder *self, ToolInput *i) {} /* The End */ fyre-1.0.1/src/de-jong.h0000644000175000001440000000524710356610360011666 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * de-jong.h - The DeJong object builds on the ParameterHolder and HistogramRender * objects to provide a rendering of the DeJong map into a histogram image. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __DE_JONG_H__ #define __DE_JONG_H__ #include #include "iterative-map.h" G_BEGIN_DECLS #define DE_JONG_TYPE (de_jong_get_type ()) #define DE_JONG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DE_JONG_TYPE, DeJong)) #define DE_JONG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DE_JONG_TYPE, DeJongClass)) #define IS_DE_JONG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DE_JONG_TYPE)) #define IS_DE_JONG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DE_JONG_TYPE)) typedef struct _DeJong DeJong; typedef struct _DeJongClass DeJongClass; typedef struct { gdouble a, b, c, d; } DeJongParams; struct _DeJong { IterativeMap parent; /* Calculation Parameters */ DeJongParams param; gdouble zoom, aspect, xoffset, yoffset, rotation; gdouble blur_radius, blur_ratio; gboolean tileable; gboolean emphasize_transient; guint transient_iterations; gint initial_conditions; gdouble initial_xscale, initial_yscale; gdouble initial_xoffset, initial_yoffset; gboolean calc_dirty_flag; /* Current calculation state */ gdouble point_x, point_y; guint remaining_transient_iterations; }; struct _DeJongClass { IterativeMapClass parent_class; }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType de_jong_get_type (); DeJong* de_jong_new (); G_END_DECLS #endif /* __DE_JONG_H__ */ /* The End */ fyre-1.0.1/src/exr.cpp0000644000175000001440000001245410356611764011503 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * exr.cpp - Optional OpenEXR extensions to the HistogramImager, * for saving high dynamic range images from it. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ extern "C" { #include "histogram-imager.h" #include "config.h" } #include using namespace Imf; void exr_save_real (HistogramImager *hi, const gchar *filename); #define fyre_exr_error_quark() (g_quark_from_string("FYRE_EXR_ERROR")) enum { FYRE_EXR_SAVE_FAILURE, } FyreExrError; extern "C" void exr_save_image_file(HistogramImager *hi, const gchar* filename, GError **error) { try { exr_save_real (hi, filename); } catch (const std::exception &exc) { GError *nerror = g_error_new (fyre_exr_error_quark(), FYRE_EXR_SAVE_FAILURE, exc.what()); *error = nerror; } } void exr_save_real (HistogramImager *hi, const gchar *filename) { int width = hi->width; int height = hi->height; RgbaOutputFile file (filename, width, height); Rgba *pixels = new Rgba[width * height]; Rgba *cur_pixel = pixels; const guint oversample = hi->oversample; float fscale = histogram_imager_get_pixel_scale(hi); float one_over_gamma = 1.0 / hi->gamma; guint* cur_bucket = hi->histogram; struct { float r,g,b,a; } bg, fg, range, bucket, pixel; bg.r = hi->bgcolor.red / 65535.0; bg.g = hi->bgcolor.green / 65535.0; bg.b = hi->bgcolor.blue / 65535.0; bg.a = hi->bgalpha / 65535.0; fg.r = hi->fgcolor.red / 65535.0; fg.g = hi->fgcolor.green / 65535.0; fg.b = hi->fgcolor.blue / 65535.0; fg.a = hi->fgalpha / 65535.0; range.r = fg.r - bg.r; range.g = fg.g - bg.g; range.b = fg.b - bg.b; range.a = fg.a - bg.a; int histogram_stride = oversample * width; float oversample_squared = oversample * oversample; int histogram_block_stride = (oversample-1) * histogram_stride; /* This outer loop iterates over pixels in the resulting image */ for (int pix_y = height; pix_y; pix_y--) { for (int pix_x = width; pix_x; pix_x--) { /* Then for each pixel, loop over the corresponding histogram bins. * For oversample==1 this is only one bin, otherwise it's a square * block of oversample^2 bins. For each bin we compute the finished * color values and add them. We don't actually use fyre's oversampling * gamma here, since the OpenEXR pixel values should already be linear. */ pixel.r = pixel.g = pixel.b = pixel.a = 0; guint* cur_bucket_row = cur_bucket; for (int bucket_y = oversample; bucket_y; bucket_y--) { guint* cur_bucket_sample = cur_bucket_row; for (int bucket_x = oversample; bucket_x; bucket_x--) { /* Linear exposure plus gamma adjustment */ float luma = (*cur_bucket_sample) * fscale; luma = pow(luma, one_over_gamma); /* Optionally clamp before interpolating */ if (hi->clamped && luma > 1) luma = 1; /* Color interpolation, with no per-component clamping */ bucket.r = luma * range.r + bg.r; bucket.g = luma * range.g + bg.g; bucket.b = luma * range.b + bg.b; bucket.a = luma * range.a + bg.a; /* Fyre images are generally authored to look good in sRGB, * so they'll already be in the monitor's gamma. This should * perform the inverse of OpenEXR's default monitor gamma * correction. Alpha should always be linear, so leave * that alone. */ bucket.r = pow(bucket.r * 3.012, 2.2) / 5.55555; bucket.g = pow(bucket.g * 3.012, 2.2) / 5.55555; bucket.b = pow(bucket.b * 3.012, 2.2) / 5.55555; /* Accumulate this bucket into our current pixel */ pixel.r += bucket.r; pixel.g += bucket.g; pixel.b += bucket.b; pixel.a += bucket.a; /* Next sample in this oversampling square */ cur_bucket_sample++; } /* Next line in the oversampling square */ cur_bucket_row += histogram_stride; } /* Finish averaging over the oversampling square, and store this pixel */ cur_pixel->r = pixel.r / oversample_squared; cur_pixel->g = pixel.g / oversample_squared; cur_pixel->b = pixel.b / oversample_squared; cur_pixel->a = pixel.a / oversample_squared; /* Jump to the next pixel, and the beginning of the next block of buckets */ cur_pixel++; cur_bucket += oversample; } /* Skip over all the histogram lines still part of the same row of buckets */ cur_bucket += histogram_block_stride; } file.setFrameBuffer(pixels, 1, width); file.writePixels(height); delete[] pixels; } /* The End */ fyre-1.0.1/src/iterative-map.c0000644000175000001440000001543210356611715013107 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * iterative-map.h - The IterativeMap object builds on the ParameterHolder and * HistogramRender objects to provide a rendering of a chaotic * map into a histogram image. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "iterative-map.h" #include enum { CALCULATION_FINISHED_SIGNAL, CALCULATION_START_SIGNAL, CALCULATION_STOP_SIGNAL, LAST_SIGNAL, }; static void iterative_map_class_init(IterativeMapClass *klass); static void iterative_map_init(IterativeMap *self); static int iterative_map_idle_handler(gpointer user_data); static guint limit_iterations(guint iters); static guint iterative_map_signals[LAST_SIGNAL] = { 0 }; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType iterative_map_get_type(void) { static GType im_type = 0; if (!im_type) { static const GTypeInfo im_info = { sizeof(IterativeMapClass), NULL, /* base init */ NULL, /* base finalize */ (GClassInitFunc) iterative_map_class_init, NULL, /* class finalize */ NULL, /* class data */ sizeof(IterativeMap), 0, (GInstanceInitFunc) iterative_map_init, }; im_type = g_type_register_static(HISTOGRAM_IMAGER_TYPE, "IterativeMap", &im_info, 0); } return im_type; } static void iterative_map_class_init(IterativeMapClass *klass) { iterative_map_signals[CALCULATION_FINISHED_SIGNAL] = g_signal_new("calculation-finished", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(IterativeMapClass, iterative_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); iterative_map_signals[CALCULATION_START_SIGNAL] = g_signal_new("calculation-start", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(IterativeMapClass, iterative_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); iterative_map_signals[CALCULATION_STOP_SIGNAL] = g_signal_new("calculation-stop", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(IterativeMapClass, iterative_map), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void iterative_map_init(IterativeMap *self) { self->render_time = 0.015; } /************************************************************************************/ /********************************************************************** Calculation */ /************************************************************************************/ void iterative_map_calculate(IterativeMap *self, guint iterations) { IterativeMapClass *class = ITERATIVE_MAP_CLASS(G_OBJECT_GET_CLASS(self)); class->calculate(self, iterations); g_signal_emit(G_OBJECT(self), iterative_map_signals[CALCULATION_FINISHED_SIGNAL], 0); } void iterative_map_calculate_motion(IterativeMap *self, guint iterations, gboolean continuation, ParameterInterpolator *interp, gpointer interp_data) { IterativeMapClass *class = ITERATIVE_MAP_CLASS(G_OBJECT_GET_CLASS(self)); class->calculate_motion(self, iterations, continuation, interp, interp_data); g_signal_emit(G_OBJECT(self), iterative_map_signals[CALCULATION_FINISHED_SIGNAL], 0); } static guint limit_iterations(guint iters) { /* Put both upper and lower limits on the number of iters to run * at once- if the iteration count is too low, our next speed estimate * will be way off, and if it's too high we could have problems with * memory allocated per-iteration. */ return MAX(MIN(iters, 10000000), 1000); } void iterative_map_calculate_timed(IterativeMap *self, double seconds) { GTimer *timer; double elapsed; guint iterations; iterations = limit_iterations(self->iter_speed_estimate * seconds + 0.5); timer = g_timer_new(); g_timer_start(timer); iterative_map_calculate(self, iterations); elapsed = g_timer_elapsed(timer, NULL); g_timer_destroy(timer); self->iter_speed_estimate = iterations / elapsed; } void iterative_map_calculate_motion_timed(IterativeMap *self, double seconds, gboolean continuation, ParameterInterpolator *interp, gpointer interp_data) { GTimer *timer; double elapsed; guint iterations; iterations = limit_iterations(self->iter_speed_estimate * seconds + 0.5); timer = g_timer_new(); g_timer_start(timer); iterative_map_calculate_motion(self, iterations, continuation, interp, interp_data); elapsed = g_timer_elapsed(timer, NULL); g_timer_destroy(timer); self->iter_speed_estimate = iterations / elapsed; } static int iterative_map_idle_handler(gpointer user_data) { IterativeMap* self = ITERATIVE_MAP(user_data); iterative_map_calculate_timed(self, self->render_time); return 1; } void iterative_map_start_calculation (IterativeMap *self) { if (self->idle_handler) return; self->idle_handler = g_idle_add(iterative_map_idle_handler, self); g_signal_emit(G_OBJECT(self), iterative_map_signals[CALCULATION_START_SIGNAL], 0); } void iterative_map_stop_calculation (IterativeMap *self) { if (!self->idle_handler) return; g_source_remove(self->idle_handler); self->idle_handler = 0; g_signal_emit(G_OBJECT(self), iterative_map_signals[CALCULATION_STOP_SIGNAL], 0); } gboolean iterative_map_is_calculation_running (IterativeMap *self) { return (self->idle_handler != 0); } /* The End */ fyre-1.0.1/src/iterative-map.h0000644000175000001440000001115410356610442013105 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * iterative-map.h - The IterativeMap object builds on the ParameterHolder and * HistogramRender objects to provide a rendering of a chaotic * map into a histogram image. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __ITERATIVE_MAP_H__ #define __ITERATIVE_MAP_H__ #include #include "histogram-imager.h" G_BEGIN_DECLS #define ITERATIVE_MAP_TYPE (iterative_map_get_type ()) #define ITERATIVE_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ITERATIVE_MAP_TYPE, IterativeMap)) #define ITERATIVE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ITERATIVE_MAP_TYPE, IterativeMapClass)) #define IS_ITERATIVE_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ITERATIVE_MAP_TYPE)) #define IS_ITERATIVE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ITERATIVE_MAP_TYPE)) typedef struct _IterativeMap IterativeMap; typedef struct _IterativeMapClass IterativeMapClass; struct _IterativeMap { HistogramImager parent; /* Current calculation state */ gdouble iterations; /* Estimated iterations per second, for calculate_timed and friends */ gdouble iter_speed_estimate; /* For background rendering in the idle handler */ guint idle_handler; double render_time; }; struct _IterativeMapClass { HistogramImagerClass parent_class; void (*iterative_map) (IterativeMap *self); /* Overrideable methods */ void (*calculate) (IterativeMap *self, guint iterations); void (*calculate_motion) (IterativeMap *self, guint iterations, gboolean continuation, ParameterInterpolator *interp, gpointer interp_data); }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType iterative_map_get_type (); /* Simple calculation functions, implemented by subclasses. * They calculate a fixed number of iterations. */ void iterative_map_calculate (IterativeMap *self, guint iterations); void iterative_map_calculate_motion (IterativeMap *self, guint iterations, gboolean continuation, ParameterInterpolator *interp, gpointer interp_data); /* Calculation functions implemented by this base class, * that stop after an estimated amount of time rather * than a number of iterations. Each time this runs, * it uses the actual time elapsed to update an estimate * of the calculation speed used to come up with a * number of iterations to pass the actual rendering * functions. */ void iterative_map_calculate_timed (IterativeMap *self, double seconds); void iterative_map_calculate_motion_timed (IterativeMap *self, double seconds, gboolean continuation, ParameterInterpolator *interp, gpointer interp_data); /* Start or stop running calculation from a main loop * idle handler. The current 'render_time' is the number * of seconds that we nominally calculate for during * each main loop iteration. The default of 15ms is * fine for most interactive use. */ void iterative_map_start_calculation (IterativeMap *self); void iterative_map_stop_calculation (IterativeMap *self); gboolean iterative_map_is_calculation_running (IterativeMap *self); G_END_DECLS #endif /* __ITERATIVE_MAP_H__ */ /* The End */ fyre-1.0.1/src/getopt.c0000644000175000001440000010314110263337623011635 00000000000000/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO # define _NO_PROTO #endif #ifdef HAVE_CONFIG_H # include #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ # ifndef const # define const # endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 # include # if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION # define ELIDE_CODE # endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ # include # include #endif /* GNU C library. */ #ifdef VMS # include # if HAVE_STRING_H - 0 # include # endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. */ # if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC # include # ifndef _ # define _(msgid) gettext (msgid) # endif # else # define _(msgid) (msgid) # endif # if defined _LIBC && defined USE_IN_LIBIO # include # endif #endif #ifndef attribute_hidden # define attribute_hidden #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized attribute_hidden; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ # include # define my_index strchr #else # if HAVE_STRING_H # include # else # include # endif /* Avoid depending on library functions or files whose names are inconsistent. */ #ifndef getenv extern char *getenv (); #endif static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ # if (!defined __STDC__ || !__STDC__) && !defined strlen /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); # endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Stored original parameters. XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ extern int __libc_argc; extern char **__libc_argv; /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ # ifdef USE_NONOPTION_FLAGS /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; # endif # ifdef USE_NONOPTION_FLAGS # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } # else # define SWAP_FLAGS(ch1, ch2) # endif #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ #if defined __STDC__ && __STDC__ static void exchange (char **); #endif static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ #if defined __STDC__ && __STDC__ static const char *_getopt_initialize (int, char *const *, const char *); #endif static const char * _getopt_initialize (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #if defined _LIBC && defined USE_NONOPTION_FLAGS if (posixly_correct == NULL && argc == __libc_argc && argv == __libc_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { int print_errors = opterr; if (optstring[0] == ':') print_errors = 0; if (argc < 1) return -1; optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #if defined _LIBC && defined USE_NONOPTION_FLAGS # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); #endif } nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[optind - 1][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); #else fprintf (stderr, _("\ %s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("\ %s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); #else fprintf (stderr, _("\ %s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #endif } nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); #endif } nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (argv[optind][1] == '-') { /* --option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); #else fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); #endif } else { /* +option or -option */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); #else fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #endif } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; int n; #endif if (posixly_correct) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: illegal option -- %c\n"), argv[0], c); #else fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); #endif } else { #if defined _LIBC && defined USE_IN_LIBIO n = __asprintf (&buf, _("%s: invalid option -- %c\n"), argv[0], c); #else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); #endif } #if defined _LIBC && defined USE_IN_LIBIO if (n >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #endif } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option requires an argument -- %c\n"), argv[0], c) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); #endif } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); #endif } nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); #endif } nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (print_errors) { #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); #endif } nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (print_errors) { /* 1003.2 specifies the format of this message. */ #if defined _LIBC && defined USE_IN_LIBIO char *buf; if (__asprintf (&buf, _("\ %s: option requires an argument -- %c\n"), argv[0], c) >= 0) { if (_IO_fwide (stderr, 0) > 0) __fwprintf (stderr, L"%s", buf); else fputs (buf, stderr); free (buf); } #else fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); #endif } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ fyre-1.0.1/src/Makefile.am0000644000175000001440000000376710446431132012231 00000000000000bin_PROGRAMS = fyre INCLUDES = \ $(BINRELOC_CFLAGS) \ $(PACKAGE_CFLAGS) \ $(EXR_CFLAGS) \ $(GNET_CFLAGS) \ '-DFYRE_DATADIR="data"' \ '-DDATADIR="$(prefix)/share"' fyre_LDADD = \ $(BINRELOC_LIBS) \ $(PACKAGE_LIBS) \ $(EXR_LIBS) \ $(GNET_LIBS) \ $(WIN32_LIBS) fyre_DEPENDENCIES = \ $(WIN32_LIBS) fyre-win32-res.o: fyre.rc *.ico $(WINDRES) fyre.rc fyre-win32-res.o if HAVE_EXR EXR_SRC = \ exr.cpp else EXR_SRC = endif if HAVE_GNET GNET_SRC = \ remote-server.c \ remote-client.c \ discovery-server.c \ discovery-client.c \ explorer-cluster.c \ cluster-model.c else GNET_SRC = endif if HAVE_GETOPT GETOPT_SRC = else GETOPT_SRC = \ getopt.c \ getopt1.c endif fyre_SOURCES = \ main.c \ de-jong.c \ explorer.c \ color-button.c \ animation.c \ chunked-file.c \ curve-editor.c \ spline.c \ explorer-tools.c \ explorer-animation.c \ explorer-about.c \ explorer-history.c \ cell-renderer-transition.c \ cell-renderer-bifurcation.c \ histogram-imager.c \ iterative-map.c \ parameter-holder.c \ bifurcation-diagram.c \ math-util.c \ gui-util.c \ avi-writer.c \ parameter-editor.c \ histogram-view.c \ animation-render-ui.c \ screensaver.c \ batch-image-render.c \ probability-map.c \ prefix.c \ image-fu.c \ $(EXR_SRC) \ $(GETOPT_SRC) \ $(GNET_SRC) noinst_HEADERS = \ animation.h \ animation-render-ui.h \ avi-writer.h \ batch-image-render.h \ bifurcation-diagram.h \ cell-renderer-bifurcation.h \ cell-renderer-transition.h \ chunked-file.h \ cluster-model.h \ color-button.h \ curve-editor.h \ de-jong.h \ explorer.h \ gui-util.h \ histogram-imager.h \ histogram-view.h \ iterative-map.h \ math-util.h \ parameter-editor.h \ parameter-holder.h \ prefix.h \ screensaver.h \ spline.h \ var-int.h \ remote-server.h \ remote-client.h \ probability-map.h \ discovery-server.h \ discovery-client.h \ platform.h \ image-fu.h fyre-1.0.1/src/Makefile.in0000644000175000001440000005157010512344605012237 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = fyre$(EXEEXT) subdir = src DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am__fyre_SOURCES_DIST = main.c de-jong.c explorer.c color-button.c \ animation.c chunked-file.c curve-editor.c spline.c \ explorer-tools.c explorer-animation.c explorer-about.c \ explorer-history.c cell-renderer-transition.c \ cell-renderer-bifurcation.c histogram-imager.c iterative-map.c \ parameter-holder.c bifurcation-diagram.c math-util.c \ gui-util.c avi-writer.c parameter-editor.c histogram-view.c \ animation-render-ui.c screensaver.c batch-image-render.c \ probability-map.c prefix.c image-fu.c exr.cpp getopt.c \ getopt1.c remote-server.c remote-client.c discovery-server.c \ discovery-client.c explorer-cluster.c cluster-model.c @HAVE_EXR_TRUE@am__objects_1 = exr.$(OBJEXT) @HAVE_GETOPT_FALSE@am__objects_2 = getopt.$(OBJEXT) getopt1.$(OBJEXT) @HAVE_GNET_TRUE@am__objects_3 = remote-server.$(OBJEXT) \ @HAVE_GNET_TRUE@ remote-client.$(OBJEXT) \ @HAVE_GNET_TRUE@ discovery-server.$(OBJEXT) \ @HAVE_GNET_TRUE@ discovery-client.$(OBJEXT) \ @HAVE_GNET_TRUE@ explorer-cluster.$(OBJEXT) \ @HAVE_GNET_TRUE@ cluster-model.$(OBJEXT) am_fyre_OBJECTS = main.$(OBJEXT) de-jong.$(OBJEXT) explorer.$(OBJEXT) \ color-button.$(OBJEXT) animation.$(OBJEXT) \ chunked-file.$(OBJEXT) curve-editor.$(OBJEXT) spline.$(OBJEXT) \ explorer-tools.$(OBJEXT) explorer-animation.$(OBJEXT) \ explorer-about.$(OBJEXT) explorer-history.$(OBJEXT) \ cell-renderer-transition.$(OBJEXT) \ cell-renderer-bifurcation.$(OBJEXT) histogram-imager.$(OBJEXT) \ iterative-map.$(OBJEXT) parameter-holder.$(OBJEXT) \ bifurcation-diagram.$(OBJEXT) math-util.$(OBJEXT) \ gui-util.$(OBJEXT) avi-writer.$(OBJEXT) \ parameter-editor.$(OBJEXT) histogram-view.$(OBJEXT) \ animation-render-ui.$(OBJEXT) screensaver.$(OBJEXT) \ batch-image-render.$(OBJEXT) probability-map.$(OBJEXT) \ prefix.$(OBJEXT) image-fu.$(OBJEXT) $(am__objects_1) \ $(am__objects_2) $(am__objects_3) fyre_OBJECTS = $(am_fyre_OBJECTS) am__DEPENDENCIES_1 = DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ SOURCES = $(fyre_SOURCES) DIST_SOURCES = $(am__fyre_SOURCES_DIST) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ BINRELOC_LIBS = @BINRELOC_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_FDODESKTOP_FALSE = @ENABLE_FDODESKTOP_FALSE@ ENABLE_FDODESKTOP_TRUE = @ENABLE_FDODESKTOP_TRUE@ ENABLE_XDGMIME_FALSE = @ENABLE_XDGMIME_FALSE@ ENABLE_XDGMIME_TRUE = @ENABLE_XDGMIME_TRUE@ EXEEXT = @EXEEXT@ EXR_CFLAGS = @EXR_CFLAGS@ EXR_LIBS = @EXR_LIBS@ FDODESKTOP = @FDODESKTOP@ GNET_CFLAGS = @GNET_CFLAGS@ GNET_LIBS = @GNET_LIBS@ GREP = @GREP@ HAVE_BINRELOC_FALSE = @HAVE_BINRELOC_FALSE@ HAVE_BINRELOC_TRUE = @HAVE_BINRELOC_TRUE@ HAVE_EXR_FALSE = @HAVE_EXR_FALSE@ HAVE_EXR_TRUE = @HAVE_EXR_TRUE@ HAVE_GETOPT_FALSE = @HAVE_GETOPT_FALSE@ HAVE_GETOPT_TRUE = @HAVE_GETOPT_TRUE@ HAVE_GNET_FALSE = @HAVE_GNET_FALSE@ HAVE_GNET_TRUE = @HAVE_GNET_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIN32_LIBS = @WIN32_LIBS@ XDGMIME = @XDGMIME@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ $(BINRELOC_CFLAGS) \ $(PACKAGE_CFLAGS) \ $(EXR_CFLAGS) \ $(GNET_CFLAGS) \ '-DFYRE_DATADIR="data"' \ '-DDATADIR="$(prefix)/share"' fyre_LDADD = \ $(BINRELOC_LIBS) \ $(PACKAGE_LIBS) \ $(EXR_LIBS) \ $(GNET_LIBS) \ $(WIN32_LIBS) fyre_DEPENDENCIES = \ $(WIN32_LIBS) @HAVE_EXR_FALSE@EXR_SRC = @HAVE_EXR_TRUE@EXR_SRC = \ @HAVE_EXR_TRUE@ exr.cpp @HAVE_GNET_FALSE@GNET_SRC = @HAVE_GNET_TRUE@GNET_SRC = \ @HAVE_GNET_TRUE@ remote-server.c \ @HAVE_GNET_TRUE@ remote-client.c \ @HAVE_GNET_TRUE@ discovery-server.c \ @HAVE_GNET_TRUE@ discovery-client.c \ @HAVE_GNET_TRUE@ explorer-cluster.c \ @HAVE_GNET_TRUE@ cluster-model.c @HAVE_GETOPT_FALSE@GETOPT_SRC = \ @HAVE_GETOPT_FALSE@ getopt.c \ @HAVE_GETOPT_FALSE@ getopt1.c @HAVE_GETOPT_TRUE@GETOPT_SRC = fyre_SOURCES = \ main.c \ de-jong.c \ explorer.c \ color-button.c \ animation.c \ chunked-file.c \ curve-editor.c \ spline.c \ explorer-tools.c \ explorer-animation.c \ explorer-about.c \ explorer-history.c \ cell-renderer-transition.c \ cell-renderer-bifurcation.c \ histogram-imager.c \ iterative-map.c \ parameter-holder.c \ bifurcation-diagram.c \ math-util.c \ gui-util.c \ avi-writer.c \ parameter-editor.c \ histogram-view.c \ animation-render-ui.c \ screensaver.c \ batch-image-render.c \ probability-map.c \ prefix.c \ image-fu.c \ $(EXR_SRC) \ $(GETOPT_SRC) \ $(GNET_SRC) noinst_HEADERS = \ animation.h \ animation-render-ui.h \ avi-writer.h \ batch-image-render.h \ bifurcation-diagram.h \ cell-renderer-bifurcation.h \ cell-renderer-transition.h \ chunked-file.h \ cluster-model.h \ color-button.h \ curve-editor.h \ de-jong.h \ explorer.h \ gui-util.h \ histogram-imager.h \ histogram-view.h \ iterative-map.h \ math-util.h \ parameter-editor.h \ parameter-holder.h \ prefix.h \ screensaver.h \ spline.h \ var-int.h \ remote-server.h \ remote-client.h \ probability-map.h \ discovery-server.h \ discovery-client.h \ platform.h \ image-fu.h all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) fyre$(EXEEXT): $(fyre_OBJECTS) $(fyre_DEPENDENCIES) @rm -f fyre$(EXEEXT) $(CXXLINK) $(fyre_LDFLAGS) $(fyre_OBJECTS) $(fyre_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/animation-render-ui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/animation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avi-writer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/batch-image-render.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bifurcation-diagram.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cell-renderer-bifurcation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cell-renderer-transition.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chunked-file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cluster-model.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/color-button.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/curve-editor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/de-jong.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discovery-client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discovery-server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explorer-about.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explorer-animation.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explorer-cluster.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explorer-history.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explorer-tools.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/explorer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gui-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/histogram-imager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/histogram-view.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/image-fu.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterative-map.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/math-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parameter-editor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parameter-holder.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prefix.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/probability-map.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/screensaver.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spline.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .cpp.o: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-binPROGRAMS install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-info-am fyre-win32-res.o: fyre.rc *.ico $(WINDRES) fyre.rc fyre-win32-res.o # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fyre-1.0.1/src/getopt1.c0000644000175000001440000001110010263337623011707 00000000000000/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifdef HAVE_CONFIG_H #include #endif #ifdef _LIBC # include #else # include "getopt.h" #endif #if !defined __STDC__ || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } # ifdef _LIBC libc_hidden_def (getopt_long) libc_hidden_def (getopt_long_only) # endif #endif /* Not ELIDE_CODE. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ fyre-1.0.1/src/main.c0000644000175000001440000003552010446431132011255 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * main.c - Initialization and command line interface * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "config.h" #include "platform.h" #ifdef WIN32 #include #include #include #endif #ifdef HAVE_FORK #include #endif #include #include #include #include #include #include "de-jong.h" #include "animation.h" #include "explorer.h" #include "avi-writer.h" #include "screensaver.h" #include "remote-server.h" #include "batch-image-render.h" #include "gui-util.h" #ifdef HAVE_GNET #include "cluster-model.h" #include "discovery-server.h" #endif static void usage (char **argv); static void animation_render_main (IterativeMap *map, Animation *animation, const gchar *filename, double quality); static void acquire_console (void); #ifdef HAVE_GNET static void daemonize_to_pidfile (const char* filename); #endif int main(int argc, char ** argv) { IterativeMap* map; Animation* animation; gboolean animate = FALSE; gboolean have_gtk; gboolean verbose = FALSE; gboolean hidden = FALSE; enum {INTERACTIVE, RENDER, SCREENSAVER, REMOTE} mode = INTERACTIVE; const gchar *outputFile = NULL; const gchar *pidfile = NULL; int c, option_index=0; double quality = 1.0; #ifdef HAVE_GNET int port_number = FYRE_DEFAULT_PORT; #endif GError *error = NULL; math_init(); g_type_init(); have_gtk = gtk_init_check(&argc, &argv); #ifdef HAVE_GNET gnet_init(); # ifdef WIN32 gnet_ipv6_set_policy(GIPV6_POLICY_IPV4_ONLY); # endif #endif map = ITERATIVE_MAP(de_jong_new()); animation = animation_new(); while (1) { static struct option long_options[] = { {"help", 0, NULL, 'h'}, {"read", 1, NULL, 'i'}, {"animate", 1, NULL, 'n'}, {"output", 1, NULL, 'o'}, {"param", 1, NULL, 'p'}, {"size", 1, NULL, 's'}, {"oversample", 1, NULL, 'S'}, {"quality", 1, NULL, 'q'}, {"remote", 0, NULL, 'r'}, {"verbose", 0, NULL, 'v'}, {"port", 1, NULL, 'P'}, {"cluster", 1, NULL, 'c'}, {"auto-cluster", 0, NULL, 'C'}, {"screensaver", 0, NULL, 1000}, /* Undocumented, still experimental */ {"hidden", 0, NULL, 1001}, {"chdir", 1, NULL, 1002}, /* Undocumented, used by win32 file associations */ {"pidfile", 1, NULL, 1003}, {"version", 0, NULL, 1004}, {NULL}, }; c = getopt_long(argc, argv, "hi:n:o:p:s:S:q:rvP:c:C", long_options, &option_index); if (c == -1) break; switch (c) { case 'i': { histogram_imager_load_image_file(HISTOGRAM_IMAGER(map), optarg, &error); break; } case 'n': { GtkTreeIter iter; animation_load_file(animation, optarg); animate = TRUE; gtk_tree_model_get_iter_first(GTK_TREE_MODEL(animation->model), &iter); animation_keyframe_load(animation, &iter, PARAMETER_HOLDER(map)); break; } case 'o': mode = RENDER; outputFile = optarg; break; case 'p': parameter_holder_load_string(PARAMETER_HOLDER(map), optarg); break; case 's': parameter_holder_set(PARAMETER_HOLDER(map), "size" , optarg); break; case 'S': parameter_holder_set(PARAMETER_HOLDER(map), "oversample", optarg); break; case 'q': quality = atof(optarg); break; case 'v': verbose = TRUE; break; #ifdef HAVE_GNET case 'c': { ClusterModel *cluster = cluster_model_get(map, TRUE); cluster_model_add_nodes(cluster, optarg); } break; case 'C': { ClusterModel *cluster = cluster_model_get(map, TRUE); cluster_model_enable_discovery(cluster); } break; case 'r': mode = REMOTE; break; case 'P': port_number = atol(optarg); break; #else case 'c': case 'C': case 'P': fprintf(stderr, "This Fyre binary was compiled without gnet support.\n" "Cluster support is not available.\n"); break; case 'r': fprintf(stderr, "This Fyre binary was compiled without gnet support.\n" "Cluster support is not available.\n"); exit(1); break; #endif case 1000: /* --screensaver */ mode = SCREENSAVER; break; case 1001: /* --hidden */ hidden = TRUE; break; case 1002: /* --chdir */ chdir(optarg); break; case 1003: /* --pidfile */ pidfile = optarg; break; case 1004: /* --version */ printf("%s\n", VERSION); return 0; case 'h': default: usage(argv); return 1; } } if (optind + 1 < argc) { usage(argv); return 1; } if (optind != argc) { char *ext = strrchr (argv[optind], '.'); if (ext) { if (g_strcasecmp(ext, ".png") == 0) { histogram_imager_load_image_file(HISTOGRAM_IMAGER(map), argv[optind], &error); } else if (g_strcasecmp(ext, ".fa") == 0) { GtkTreeIter iter; animation_load_file(animation, argv[optind]); animate = TRUE; gtk_tree_model_get_iter_first(GTK_TREE_MODEL(animation->model), &iter); animation_keyframe_load(animation, &iter, PARAMETER_HOLDER(map)); } else { usage(argv); return 1; } } else { usage(argv); return 1; } } switch (mode) { case INTERACTIVE: { Explorer *explorer; if (!have_gtk) { fprintf(stderr, "GTK intiailization failed, can't start in interactive mode\n"); return 1; } explorer = explorer_new (map, animation); if (error) { GtkWidget *dialog, *label; gchar *text; dialog = glade_xml_get_widget (explorer->xml, "error dialog"); label = glade_xml_get_widget (explorer->xml, "error label"); text = g_strdup_printf ("Error!\n\n%s", error->message); gtk_label_set_markup (GTK_LABEL (label), text); g_free (text); g_error_free (error); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_hide (dialog); } gtk_main(); break; } case RENDER: { acquire_console(); if (error) { g_print ("Error: %s\n", error->message); g_error_free (error); } if (animate) animation_render_main (map, animation, outputFile, quality); else batch_image_render (map, outputFile, quality); break; } case REMOTE: { #ifdef HAVE_GNET if (verbose) { acquire_console(); } else { daemonize_to_pidfile(pidfile); } if (!hidden) discovery_server_new(FYRE_DEFAULT_SERVICE, port_number); remote_server_main_loop(port_number, have_gtk, verbose); #else fprintf(stderr, "This Fyre binary was compiled without gnet support.\n" "Remote control mode is not available.\n"); #endif break; } case SCREENSAVER: { ScreenSaver* screensaver; GtkWidget* window; if (!have_gtk) { fprintf(stderr, "GTK intiailization failed, can't start in screensaver mode\n"); return 1; } screensaver = screensaver_new(map, animation); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); fyre_set_icon_later(window); gtk_window_set_resizable(GTK_WINDOW(window), FALSE); gtk_window_set_title(GTK_WINDOW(window), "Fyre Screensaver"); gtk_container_add(GTK_CONTAINER(window), screensaver->view); gtk_widget_show_all(window); gtk_main(); break; } } return 0; } static void usage(char **argv) { acquire_console(); fprintf(stderr, "Usage: %s [options] [file]\n" "Interactive exploration and high quality rendering of chaotic maps\n" "\n" "Actions:\n" " -i, --read FILE Load all parameters from the tEXt chunk of any\n" " .png image file generated by this program.\n" " -n, --animate FILE Load an animation from FILE. If an output file is\n" " also specified, this renders the animation.\n" " -o, --output FILE Instead of presenting an interactive GUI, render\n" " an image or animation with the provided settings\n" " noninteractively, and store it in FILE.\n" " -h, --help Display this text.\n" " --version Show the version number and exit.\n" "\n" "Clustering:\n" " -c. --cluster LIST Use a rendering cluster, given as a comma-separated\n" " list of hosts, optionally of the form host:port.\n" " -C, --auto-cluster Automatically search for cluster nodes, adding them\n" " as they become available.\n" " -r, --remote Remote control mode. Fyre will listen by default on\n" " port 7931 for commands, and can act as a rendering\n" " server in a cluster.\n" " -P, --port N Set the TCP port number used for remote control mode.\n" " -v, --verbose In remote control mode, display status messages on the\n" " console and don't run as a daemon.\n" " --hidden In remote control mode, don't reply to broadcast\n" " requests for detecting available Fyre servers.\n" " --pidfile FILE When running in the background under a UNIX-like OS,\n" " save the new process ID to this file.\n" "\n" "Parameters:\n" " -p, --param KEY=VALUE Set a calculation or rendering parameter, using the\n" " same key/value format used to store parameters in\n" " image metadata.\n" "\n" "Quality:\n" " -s, --size X[xY] Set the image size in pixels. If only one value is\n" " given, a square image is produced\n" " -S, --oversample SCALE Calculate the image at some integer multiple of the\n" " output resolution, downsampling when generating the\n" " final image. This improves the quality of sharp\n" " edges on most images, but will increase memory usage\n" " quadratically. Recommended values are between 1\n" " (no oversampling) and 4 (heavy oversampling)\n" " -q, --quality QUALITY In noninteractive rendering, set the quality level at\n" " which we stop rendering. Larger numbers give\n" " smoother and more detailed results, but increase\n" " running time. The default of 1.0 gives roughly one\n" " histogram sample for every final image sample.\n", argv[0]); } static void animation_render_main (IterativeMap *map, Animation *animation, const gchar *filename, double quality) { const double frame_rate = 24; AnimationIter iter; ParameterHolderPair frame; guint frame_count = 0; gboolean continuation; double current_quality; AviWriter *avi = avi_writer_new(fopen(filename, "wb"), HISTOGRAM_IMAGER(map)->width, HISTOGRAM_IMAGER(map)->height, frame_rate); animation_iter_get_first(animation, &iter); frame.a = PARAMETER_HOLDER(de_jong_new()); frame.b = PARAMETER_HOLDER(de_jong_new()); while (animation_iter_read_frame(animation, &iter, &frame, frame_rate)) { continuation = FALSE; do { /* Calculate 0.5 seconds between quality updates. This is lower than the * batch image rendering default of 2.0 seconds, to better handle * lower-quality animations where the individual frames go quicker. */ iterative_map_calculate_motion_timed(map, 0.5, continuation, PARAMETER_INTERPOLATOR(parameter_holder_interpolate_linear), &frame); current_quality = histogram_imager_compute_quality(HISTOGRAM_IMAGER(map)); printf("\rFrame %d, %e iterations, %.04f quality", frame_count, map->iterations, current_quality); fflush(stdout); continuation = TRUE; } while (current_quality < quality); histogram_imager_update_image(HISTOGRAM_IMAGER(map)); avi_writer_append_frame(avi, HISTOGRAM_IMAGER(map)->image); /* Move to the next line for each frame. * Updates within a frame overwrite that line. */ printf("\n"); frame_count++; } avi_writer_close(avi); } /* Daemonize this process, saving the new PID to a file if a name * is specified. No pidfile is written if the filename is NULL. */ #ifdef HAVE_GNET #ifdef HAVE_FORK static void daemonize_to_pidfile(const char* filename) { FILE* f = NULL; if (filename) { /* Open the file before our current directory and console disappear */ f = fopen(filename, "w"); if (!f) printf("Can't open pidfile '%s'\n", filename); } if (daemon(0, 0) < 0) { perror("daemon"); exit(1); } if (f) { fprintf(f, "%d", getpid()); fclose(f); } } #else static void daemonize_to_pidfile(const char* filename) {} #endif /* HAVE_FORK */ #endif /* HAVE_GNET */ #ifdef WIN32 static int console_running = 1; void sleep_at_exit() { printf("\nFinished.\n"); while (console_running) { Sleep(100); fgetc(stdin); } } BOOL console_control_handler(DWORD control_type) { switch (control_type) { case CTRL_C_EVENT: case CTRL_CLOSE_EVENT: case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: console_running = 0; break; } return FALSE; } static void acquire_console() { /* This will give us a new console window- a little disconcerting * when running Fyre from the command line, but still usable. We * have to use a little bit of black magic to reattach that to stdout * and stderr. */ HANDLE hfile; int fd; FILE *file; AllocConsole(); hfile = GetStdHandle(STD_OUTPUT_HANDLE); fd = _open_osfhandle((LONG) hfile, O_WRONLY); file = fdopen(fd, "w"); *stdout = *file; *stderr = *file; SetConsoleCtrlHandler((PHANDLER_ROUTINE) console_control_handler, TRUE); atexit(sleep_at_exit); } #else static void acquire_console() {} #endif /* The End */ fyre-1.0.1/src/chunked-file.c0000644000175000001440000001572610356610560012701 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * chunked-file.c - A simple interface for reading and writing binary files * consisting of PNG-style chunks with 4-character identifiers. * * As with PNG images, the file consists of a fixed signature * followed by any number of chunks. Each chunk consists of * a 32-bit length, 4-byte chunk type, data, and a CRC. * The chunk format and CRC used here is compatible with PNG, but * this module does not specify the format of the chunk type * codes or of the file signature. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include "chunked-file.h" /************************************************************************************/ /*************************************************************** CRC Implementation */ /************************************************************************************/ /* This implementation is a modified version of the one included in * the PNG specification's appendix. It has been altered to use GLib data types. */ /* Table of CRCs of all 8-bit messages. */ static guint32 crc_table[256]; /* Flag: has the table been computed? Initially false. */ static gboolean crc_table_computed = 0; /* Make the table for a fast CRC. */ static void make_crc_table() { guint32 c; int n, k; for (n = 0; n < 256; n++) { c = (guint32) n; for (k = 0; k < 8; k++) { if (c & 1) c = 0xedb88320L ^ (c >> 1); else c = c >> 1; } crc_table[n] = c; } crc_table_computed = TRUE; } /* Update a running CRC with the bytes buf[0..len-1]--the CRC * should be initialized to all 1's, and the transmitted value * is the 1's complement of the final running CRC (see the * crc() routine below)). */ static guint32 update_crc(guint32 crc, const guchar *buf, guint len) { guint32 c = crc; guint n; if (!crc_table_computed) make_crc_table(); for (n = 0; n < len; n++) { c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); } return c; } /* Return the CRC of a data field and a type field */ static guint32 chunk_crc(ChunkType type, gsize length, const guchar* data) { guint32 c = 0xffffffffL; guint32 word; word = GUINT32_TO_BE(type); c = update_crc(c, (const guchar*) &word, sizeof(word)); c = update_crc(c, data, length); return c ^ 0xffffffffL; } /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ void chunked_file_write_signature(FILE* self, const gchar* signature) { fwrite((void *) signature, strlen((void *) signature), 1, self); } gboolean chunked_file_read_signature(FILE* self, const gchar* signature) { /* Read a signature from the file, returning TRUE on success and FALSE on failure */ int expected_size = strlen((void *) signature); gchar read_sig[expected_size]; fseek(self, 0, SEEK_SET); if (fread(read_sig, 1, expected_size, self) != expected_size) return FALSE; if (memcmp(read_sig, (void *) signature, expected_size)) return FALSE; return TRUE; } void chunked_file_write_chunk(FILE* self, ChunkType type, gsize length, const guchar* data) { guint32 word; word = GUINT32_TO_BE(length); fwrite(&word, sizeof(word), 1, self); word = GUINT32_TO_BE(type); fwrite(&word, sizeof(word), 1, self); fwrite(data, length, 1, self); word = GUINT32_TO_BE(chunk_crc(type, length, data)); fwrite(&word, sizeof(word), 1, self); } gboolean chunked_file_read_chunk(FILE* self, ChunkType *type, gsize *length, guchar** data) { /* Try to read the next chunk from the file. Returns FALSE on EOF or * unrecoverable error. Returns TRUE on success, and sets type, length, and data * to hold the chunk contents. If this returns TRUE, the caller must free the * data buffer. */ guint32 word; /* Loop until we get a valid chunk, we hit the end of file, or we hit an unrecoverable error */ while (1) { /* Read length */ if (fread(&word, 1, sizeof(word), self) != sizeof(word)) return FALSE; *length = GUINT32_FROM_BE(word); /* Read type */ if (fread(&word, 1, sizeof(word), self) != sizeof(word)) { g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Unexpected EOF trying to read chunk type"); return FALSE; } *type = GUINT32_FROM_BE(word); /* Read data, allocating a new buffer for it */ *data = g_malloc(*length); if (fread(*data, 1, *length, self) != *length) { gchar *type_string = chunk_type_to_string(*type); g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Unexpected EOF trying to read data for chunk of type %s", type_string); g_free(*data); g_free(type_string); return FALSE; } /* Read and validate the CRC. If it passes, * return successfully, otherwise issue a warning * and ignore the corrupted chunk. */ if (fread(&word, 1, sizeof(word), self) != sizeof(word)) { g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Unexpected EOF trying to read chunk CRC"); g_free(*data); return FALSE; } if (chunk_crc(*type, *length, *data) == GUINT32_FROM_BE(word)) { return TRUE; } else { gchar *type_string = chunk_type_to_string(*type); g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Ignoring corrupted chunk of type %s", type_string); g_free(*data); g_free(type_string); } } } void chunked_file_read_all(FILE* self, ChunkCallback callback, gpointer user_data) { ChunkType type; gsize length; guchar* data; while (chunked_file_read_chunk(self, &type, &length, &data)) { callback(user_data, type, length, data); g_free(data); } } void chunked_file_warn_unknown_type(ChunkType type) { gchar *type_string = chunk_type_to_string(type); g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Ignoring unrecognized chunk of type %s", type_string); g_free(type_string); } gchar* chunk_type_to_string(ChunkType type) { return g_strdup_printf("'%c%c%c%c'", (type >> 24) & 0xFF, (type >> 16) & 0xFF, (type >> 8) & 0xFF, type & 0xFF); } /* The End */ fyre-1.0.1/src/chunked-file.h0000644000175000001440000000514210356610315012673 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * chunked-file.h - A simple interface for reading and writing binary files * consisting of PNG-style chunks with 4-character identifiers. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __CHUNKED_FILE_H__ #define __CHUNKED_FILE_H__ #include #include #include G_BEGIN_DECLS /* Convert 4 characters representing the type code into a number which, in network * byte order, is represented by the same bytes. This makes chunk types * easier to work with. In particular, they can be used as switch statement cases. */ typedef guint32 ChunkType; #define CHUNK_TYPE(a,b,c,d) ((guint32)(((a) << 24) | ((b) << 16) | ((c) << 8) | (d))) /* A ChunkCallback is any function that can process chunks received from some data source. * chunked_file_write_chunk is compatible with ChunkCallback, and chunked_file_read_all * streams its results to a ChunkCallback. You can use this to copy chunks between two * files, but it's most useful when other objects implement their own ChunkCallbacks. */ typedef void (*ChunkCallback)(gpointer user_data, ChunkType type, gsize length, const guchar *data); #define CHUNK_CALLBACK(o) ((ChunkCallback)(o)) void chunked_file_write_signature(FILE* self, const gchar* signature); gboolean chunked_file_read_signature(FILE* self, const gchar* signature); void chunked_file_write_chunk(FILE* self, ChunkType type, gsize length, const guchar* data); gboolean chunked_file_read_chunk(FILE* self, ChunkType *type, gsize *length, guchar** data); void chunked_file_read_all(FILE* self, ChunkCallback callback, gpointer user_data); void chunked_file_warn_unknown_type(ChunkType type); gchar* chunk_type_to_string(ChunkType type); G_END_DECLS #endif /* __CHUNKED_FILE_H__ */ /* The End */ fyre-1.0.1/src/var-int.h0000644000175000001440000000537510356610517011731 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * var-int.h - Inlines for encoding and decoding integers into a * variable length format reminicent of UTF-8 or EBML. * In fact, this is a subset of EBML's size encoding, * limited to values expressable in a 32-bit unsigned long. * * For more information on this format, see: * http://ebml.sourceforge.net/specs/ * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __VAR_INT_H__ #define __VAR_INT_H__ /* The farthest past 'p' that our read/write functions will try to access */ #define VAR_INT_MAX_SIZE 5 /* Writes an integer at 'p', returns the number of bytes written */ static inline int var_int_write(unsigned char *p, unsigned int i) { if (i < (1<<7)) { *p = 0x80 | i; return 1; } else if (i < (1<<14)) { *(p++) = 0x40 | (i >> 8); *p = i & 0xFF; return 2; } else if (i < (1<<21)) { *(p++) = 0x20 | (i >> 16); *(p++) = 0xFF & (i >> 8); *p = i & 0xFF; return 3; } else if (i < (1<<28)) { *(p++) = 0x10 | (i >> 24); *(p++) = 0xFF & (i >> 16); *(p++) = 0xFF & (i >> 8); *p = i & 0xFF; return 4; } else { /* Assume the value fits in 32 bits */ *(p++) = 0x08; *(p++) = 0xFF & (i >> 24); *(p++) = 0xFF & (i >> 16); *(p++) = 0xFF & (i >> 8); *p = i & 0xFF; return 5; } } /* Reads an integer at 'p' into i, returns the number of bytes read */ static inline int var_int_read(const unsigned char *p, unsigned int *i) { if (0x80 & *p) { *i = p[0] & 0x7F; return 1; } else if (0x40 & *p) { *i = ((p[0] & 0x3F) << 8) | p[1]; return 2; } else if (0x20 & *p) { *i = ((p[0] & 0x1F) << 16) | (p[1] << 8) | p[2]; return 3; } else if (0x10 & *p) { *i = ((p[0] & 0x0F) << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; return 4; } else { /* Also assume it's 32-bit data (0x08 & *p) */ *i = (p[1] << 24) | (p[2] << 16) | (p[3] << 8) | p[4]; return 5; } } #endif /* __VAR_INT_H__ */ /* The End */ fyre-1.0.1/src/probability-map.c0000644000175000001440000002273410446431132013427 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * probability-map.c - A 2-D random variable with a probability * distribution function defined as an image. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include "probability-map.h" #include "math-util.h" static void probability_map_class_init(ProbabilityMapClass *klass); static void probability_map_dispose(GObject *gobject); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType probability_map_get_type(void) { static GType obj_type = 0; if (!obj_type) { static const GTypeInfo obj_info = { sizeof(ProbabilityMapClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) probability_map_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(ProbabilityMap), 0, NULL, /* instance init */ }; obj_type = g_type_register_static(G_TYPE_OBJECT, "ProbabilityMap", &obj_info, 0); } return obj_type; } static void probability_map_class_init(ProbabilityMapClass *klass) { GObjectClass *object_class = (GObjectClass*) klass; object_class->dispose = probability_map_dispose; } static void probability_map_dispose(GObject *gobject) { ProbabilityMap *self = PROBABILITY_MAP(gobject); if (self->cumulative) { g_free(self->cumulative); self->cumulative = NULL; } } /************************************************************************************/ /********************************************************************* Constructors */ /************************************************************************************/ ProbabilityMap* probability_map_new_file (const gchar* filename) { return probability_map_new_file_channel(filename, FYRE_CHANNEL_LUMA); } ProbabilityMap* probability_map_new_file_channel (const gchar* filename, FyreImageChannel channel) { GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename, NULL); ProbabilityMap *self; g_assert(pixbuf != NULL); self = probability_map_new_pixbuf_channel(pixbuf, channel); gdk_pixbuf_unref(pixbuf); return self; } ProbabilityMap* probability_map_new_pixbuf (GdkPixbuf* pixbuf) { return probability_map_new_pixbuf_channel(pixbuf, FYRE_CHANNEL_LUMA); } ProbabilityMap* probability_map_new_pixbuf_channel (GdkPixbuf* pixbuf, FyreImageChannel channel) { int offset; g_assert(gdk_pixbuf_get_colorspace(pixbuf) == GDK_COLORSPACE_RGB); g_assert(gdk_pixbuf_get_bits_per_sample(pixbuf) == 8); switch (channel) { case FYRE_CHANNEL_RED: offset = 0; break; case FYRE_CHANNEL_GREEN: offset = 1; break; case FYRE_CHANNEL_BLUE: offset = 2; break; case FYRE_CHANNEL_ALPHA: g_assert(gdk_pixbuf_get_has_alpha(pixbuf)); offset = 3; break; default: g_warning("Unsupported channel"); offset = 0; } return probability_map_new_raw(gdk_pixbuf_get_pixels(pixbuf) + offset, gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), gdk_pixbuf_get_rowstride(pixbuf), gdk_pixbuf_get_n_channels(pixbuf), G_TYPE_UCHAR); } ProbabilityMap* probability_map_new_raw (const guchar* data, gint width, gint height, gint row_stride, gint pixel_stride, gint pixel_type) { ProbabilityMap *self = PROBABILITY_MAP(g_object_new(probability_map_get_type(), NULL)); gdouble sum = 0; const guchar* row = data; const guchar* pixel; int x; int y = height; gfloat *output; self->width = width; self->height = height; self->image_scale_x = 1.0 / (width - 1); self->image_scale_y = 1.0 / (height - 1); self->cumulative_length = width * height; self->cumulative = g_new(gfloat, self->cumulative_length); output = self->cumulative; /* Caluclate a cumulative distribution. For each pixel, we save the * sum of it and all prior pixels. For speed, these inner loops are * implemented separately for each pixel type using a macro. */ #define CALCULATE_SUMS(type) do { \ while (y) { \ x = width; \ pixel = row; \ while (x) { \ sum += *(type*)pixel; \ *output = sum; \ output++; \ x--; \ pixel += pixel_stride; \ } \ y--; \ row += row_stride; \ }; \ } while (0) switch (pixel_type) { case G_TYPE_UCHAR: CALCULATE_SUMS(guchar); break; case G_TYPE_UINT: CALCULATE_SUMS(guint); break; case G_TYPE_ULONG: CALCULATE_SUMS(gulong); break; case G_TYPE_FLOAT: CALCULATE_SUMS(gfloat); break; case G_TYPE_DOUBLE: CALCULATE_SUMS(gdouble); break; default: g_warning("Unsupported pixel format"); } #undef CALCULATE_SUMS return self; } /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ void probability_map_ints (ProbabilityMap* self, guint* x, guint* y) { #if 1 gfloat key; gfloat* cumulative = self->cumulative; gsize length = self->cumulative_length; gsize width = self->width; struct { int index; int ge; } endpoints[2], midpoints[2]; /* Start with a uniform variate, scaled to cover the range of our CDF */ key = uniform_variate() * cumulative[length - 1]; /* Do a binary search for the first value in 'cumulative' that's greater than * or equal to 'key'. These semantics are necessary to ensure that in a run * of values with the same cumulative value, only the first one is ever chosen * since the other values have zero probability in the original image. */ endpoints[0].index = 0; endpoints[1].index = length - 1; endpoints[0].ge = cumulative[endpoints[0].index] >= key; endpoints[1].ge = cumulative[endpoints[1].index] >= key; while (endpoints[1].index > endpoints[0].index) { midpoints[0].index = (endpoints[0].index + endpoints[1].index) >> 1; midpoints[1].index = midpoints[0].index + 1; midpoints[0].ge = cumulative[midpoints[0].index] >= key; midpoints[1].ge = cumulative[midpoints[1].index] >= key; if ((!midpoints[0].ge) && midpoints[1].ge) { /* We're sitting right on the stopping condition */ break; } else if (!midpoints[1].ge) { /* The solution is above this */ endpoints[0] = midpoints[1]; } else if (midpoints[0].ge) { /* The solution is below this */ endpoints[1] = midpoints[0]; } else { /* This should only be possible if our CDF wasn't sorted */ g_assert(0); } } /* Convert an index within our cumulative array into (x,y) coords */ *x = midpoints[1].index % width; *y = midpoints[1].index / width; #else gfloat* cumulative = self->cumulative; gsize length = self->cumulative_length; gdouble energy; gint current = self->current; gsize width = self->width; energy = uniform_variate() * 1000; while (energy > 0) { energy -= cumulative[current+1] - cumulative[current]; current++; if (current == length-2) current = 0; } *x = current % width; *y = current / width; self->current = current; #endif } void probability_map_normalized (ProbabilityMap* self, gdouble* x, gdouble* y) { guint xi, yi; probability_map_ints(self, &xi, &yi); *x = xi * self->image_scale_x; *y = yi * self->image_scale_y; } void probability_map_uniform (ProbabilityMap* self, gdouble* x, gdouble* y) { probability_map_normalized(self, x, y); *x += uniform_variate() * self->image_scale_x; *y += uniform_variate() * self->image_scale_y; } void probability_map_gaussian (ProbabilityMap* self, gdouble* x, gdouble* y, double radius) { double a, b; probability_map_normalized(self, x, y); normal_variate_pair(&a, &b); *x += a * self->image_scale_x * radius; *y += b * self->image_scale_y * radius; } /* The End */ fyre-1.0.1/src/probability-map.h0000644000175000001440000001221610356610472013434 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * probability-map.h - A 2-D random variable with a probability * distribution function defined as an image. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __PROBABILITY_MAP_H__ #define __PROBABILITY_MAP_H__ #include G_BEGIN_DECLS #define PROBABILITY_MAP_TYPE (probability_map_get_type ()) #define PROBABILITY_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PROBABILITY_MAP_TYPE, ProbabilityMap)) #define PROBABILITY_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PROBABILITY_MAP_TYPE, ProbabilityMapClass)) #define IS_PROBABILITY_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PROBABILITY_MAP_TYPE)) #define IS_PROBABILITY_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PROBABILITY_MAP_TYPE)) typedef struct _ProbabilityMap ProbabilityMap; typedef struct _ProbabilityMapClass ProbabilityMapClass; struct _ProbabilityMap { GObject object; /* Public read-only */ int width; int height; /* Private */ gfloat* cumulative; /* 1D cumulative distribution function */ gsize cumulative_length; gdouble image_scale_x; gdouble image_scale_y; gdouble energy; int current; }; struct _ProbabilityMapClass { GObjectClass parent_class; }; typedef enum { FYRE_CHANNEL_RED, FYRE_CHANNEL_GREEN, FYRE_CHANNEL_BLUE, FYRE_CHANNEL_ALPHA, FYRE_CHANNEL_LUMA, } FyreImageChannel; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType probability_map_get_type (); /* Create a new probability map from a file, automatically identifying its type. */ ProbabilityMap* probability_map_new_file (const gchar* filename); /* Create a new probability map from a file, automatically identifying its type. * Uses data from the indicated channel. */ ProbabilityMap* probability_map_new_file_channel (const gchar* filename, FyreImageChannel channel); /* Create a new probability map from a GdkPixbuf. */ ProbabilityMap* probability_map_new_pixbuf (GdkPixbuf* pixbuf); /* Create a new probability map from a GdkPixbuf. Uses data from the indicated channel */ ProbabilityMap* probability_map_new_pixbuf_channel (GdkPixbuf* pixbuf, FyreImageChannel channel); /* Create a new probability map from a raw image, given its pixel and row strides, * and the GType used for each pixel sample. The data does not need to remain valid * after this call completes, the caller can free it immediately. * * Currently, pixel types of G_TYPE_UCHAR, G_TYPE_UINT, G_TYPE_ULONG, G_TYPE_FLOAT, * and G_TYPE_DOUBLE are valid. */ ProbabilityMap* probability_map_new_raw (const guchar* data, gint width, gint height, gint row_stride, gint pixel_stride, gint pixel_type); /* There are several functions for retrieving new random values from the * probability map: integer pixel coordinates, normalized (0 to 1) floating * point coordinates with no filtering, uniform filtering, or gaussian filtering. * * With no filtering, the results will always lie on pixel boundaries. With * uniform filtering, each pixel is treated as a square uniform distribution. * With gaussian filtering, each pixel is the center of a small gaussian distribution * with a given standard deviation. */ void probability_map_ints (ProbabilityMap* self, guint* x, guint* y); void probability_map_normalized (ProbabilityMap* self, gdouble* x, gdouble* y); void probability_map_uniform (ProbabilityMap* self, gdouble* x, gdouble* y); void probability_map_gaussian (ProbabilityMap* self, gdouble* x, gdouble* y, double radius); G_END_DECLS #endif /* __PROBABILITY_MAP_H__ */ /* The End */ fyre-1.0.1/src/prefix.c0000644000175000001440000002513710263337623011640 00000000000000/* * BinReloc - a library for creating relocatable executables * Written by: Mike Hearn * Hongli Lai * http://autopackage.org/ * * This source code is public domain. You can relicense this code * under whatever license you want. * * NOTE: if you're using C++ and are getting "undefined reference * to br_*", try renaming prefix.c to prefix.cpp */ /* WARNING, BEFORE YOU MODIFY PREFIX.C: * * If you make changes to any of the functions in prefix.c, you MUST * change the BR_NAMESPACE macro (in prefix.h). * This way you can avoid symbol table conflicts with other libraries * that also happen to use BinReloc. * * Example: * #define BR_NAMESPACE(funcName) foobar_ ## funcName * --> expands br_locate to foobar_br_locate */ #ifndef _PREFIX_C_ #define _PREFIX_C_ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef BR_PTHREADS /* Change 1 to 0 if you don't want pthread support */ #define BR_PTHREADS 1 #endif /* BR_PTHREADS */ #include #include #include #include #include "prefix.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #undef NULL #define NULL ((void *) 0) #ifdef __GNUC__ #define br_return_val_if_fail(expr,val) if (!(expr)) {fprintf (stderr, "** BinReloc (%s): assertion %s failed\n", __PRETTY_FUNCTION__, #expr); return val;} #else #define br_return_val_if_fail(expr,val) if (!(expr)) return val #endif /* __GNUC__ */ static br_locate_fallback_func fallback_func = NULL; static void *fallback_data = NULL; #ifdef ENABLE_BINRELOC #include #include #include #include /** * br_locate: * symbol: A symbol that belongs to the app/library you want to locate. * Returns: A newly allocated string containing the full path of the * app/library that func belongs to, or NULL on error. This * string should be freed when not when no longer needed. * * Finds out to which application or library symbol belongs, then locate * the full path of that application or library. * Note that symbol cannot be a pointer to a function. That will not work. * * Example: * --> main.c * #include "prefix.h" * #include "libfoo.h" * * int main (int argc, char *argv[]) { * printf ("Full path of this app: %s\n", br_locate (&argc)); * libfoo_start (); * return 0; * } * * --> libfoo.c starts here * #include "prefix.h" * * void libfoo_start () { * --> "" is a symbol that belongs to libfoo (because it's called * --> from libfoo_start()); that's why this works. * printf ("libfoo is located in: %s\n", br_locate ("")); * } */ char * br_locate (void *symbol) { char line[5000]; FILE *f; char *path; br_return_val_if_fail (symbol != NULL, NULL); f = fopen ("/proc/self/maps", "r"); if (!f) { if (fallback_func) return fallback_func(symbol, fallback_data); else return NULL; } while (!feof (f)) { unsigned long start, end; if (!fgets (line, sizeof (line), f)) continue; if (!strstr (line, " r-xp ") || !strchr (line, '/')) continue; sscanf (line, "%lx-%lx ", &start, &end); if (symbol >= (void *) start && symbol < (void *) end) { char *tmp; size_t len; /* Extract the filename; it is always an absolute path */ path = strchr (line, '/'); /* Get rid of the newline */ tmp = strrchr (path, '\n'); if (tmp) *tmp = 0; /* Get rid of "(deleted)" */ len = strlen (path); if (len > 10 && strcmp (path + len - 10, " (deleted)") == 0) { tmp = path + len - 10; *tmp = 0; } fclose(f); return strdup (path); } } fclose (f); return NULL; } /** * br_locate_prefix: * symbol: A symbol that belongs to the app/library you want to locate. * Returns: A prefix. This string should be freed when no longer needed. * * Locates the full path of the app/library that symbol belongs to, and return * the prefix of that path, or NULL on error. * Note that symbol cannot be a pointer to a function. That will not work. * * Example: * --> This application is located in /usr/bin/foo * br_locate_prefix (&argc); --> returns: "/usr" */ char * br_locate_prefix (void *symbol) { char *path, *prefix; br_return_val_if_fail (symbol != NULL, NULL); path = br_locate (symbol); if (!path) return NULL; prefix = br_extract_prefix (path); free (path); return prefix; } /** * br_prepend_prefix: * symbol: A symbol that belongs to the app/library you want to locate. * path: The path that you want to prepend the prefix to. * Returns: The new path, or NULL on error. This string should be freed when no * longer needed. * * Gets the prefix of the app/library that symbol belongs to. Prepend that prefix to path. * Note that symbol cannot be a pointer to a function. That will not work. * * Example: * --> The application is /usr/bin/foo * br_prepend_prefix (&argc, "/share/foo/data.png"); --> Returns "/usr/share/foo/data.png" */ char * br_prepend_prefix (void *symbol, char *path) { char *tmp, *newpath; br_return_val_if_fail (symbol != NULL, NULL); br_return_val_if_fail (path != NULL, NULL); tmp = br_locate_prefix (symbol); if (!tmp) return NULL; if (strcmp (tmp, "/") == 0) newpath = strdup (path); else newpath = br_strcat (tmp, path); /* Get rid of compiler warning ("br_prepend_prefix never used") */ if (0) br_prepend_prefix (NULL, NULL); free (tmp); return newpath; } #endif /* ENABLE_BINRELOC */ /* Pthread stuff for thread safetiness */ #if BR_PTHREADS && defined(ENABLE_BINRELOC) #include static pthread_key_t br_thread_key; static pthread_once_t br_thread_key_once = PTHREAD_ONCE_INIT; static void br_thread_local_store_fini () { char *specific; specific = (char *) pthread_getspecific (br_thread_key); if (specific) { free (specific); pthread_setspecific (br_thread_key, NULL); } pthread_key_delete (br_thread_key); br_thread_key = 0; } static void br_str_free (void *str) { if (str) free (str); } static void br_thread_local_store_init () { if (pthread_key_create (&br_thread_key, br_str_free) == 0) atexit (br_thread_local_store_fini); } #else /* BR_PTHREADS */ #ifdef ENABLE_BINRELOC static char *br_last_value = (char *) NULL; static void br_free_last_value () { if (br_last_value) free (br_last_value); } #endif /* ENABLE_BINRELOC */ #endif /* BR_PTHREADS */ #ifdef ENABLE_BINRELOC /** * br_thread_local_store: * str: A dynamically allocated string. * Returns: str. This return value must not be freed. * * Store str in a thread-local variable and return str. The next * you run this function, that variable is freed too. * This function is created so you don't have to worry about freeing * strings. Just be careful about doing this sort of thing: * * some_function( BR_DATADIR("/one.png"), BR_DATADIR("/two.png") ) * * Examples: * char *foo; * foo = br_thread_local_store (strdup ("hello")); --> foo == "hello" * foo = br_thread_local_store (strdup ("world")); --> foo == "world"; "hello" is now freed. */ const char * br_thread_local_store (char *str) { #if BR_PTHREADS char *specific; pthread_once (&br_thread_key_once, br_thread_local_store_init); specific = (char *) pthread_getspecific (br_thread_key); br_str_free (specific); pthread_setspecific (br_thread_key, str); #else /* BR_PTHREADS */ static int initialized = 0; if (!initialized) { atexit (br_free_last_value); initialized = 1; } if (br_last_value) free (br_last_value); br_last_value = str; #endif /* BR_PTHREADS */ return (const char *) str; } #endif /* ENABLE_BINRELOC */ /** * br_strcat: * str1: A string. * str2: Another string. * Returns: A newly-allocated string. This string should be freed when no longer needed. * * Concatenate str1 and str2 to a newly allocated string. */ char * br_strcat (const char *str1, const char *str2) { char *result; size_t len1, len2; if (!str1) str1 = ""; if (!str2) str2 = ""; len1 = strlen (str1); len2 = strlen (str2); result = (char *) malloc (len1 + len2 + 1); memcpy (result, str1, len1); memcpy (result + len1, str2, len2); result[len1 + len2] = '\0'; return result; } /* Emulates glibc's strndup() */ static char * br_strndup (char *str, size_t size) { char *result = (char *) NULL; size_t len; br_return_val_if_fail (str != (char *) NULL, (char *) NULL); len = strlen (str); if (!len) return strdup (""); if (size > len) size = len; result = (char *) calloc (sizeof (char), len + 1); memcpy (result, str, size); return result; } /** * br_extract_dir: * path: A path. * Returns: A directory name. This string should be freed when no longer needed. * * Extracts the directory component of path. Similar to g_dirname() or the dirname * commandline application. * * Example: * br_extract_dir ("/usr/local/foobar"); --> Returns: "/usr/local" */ char * br_extract_dir (const char *path) { char *end, *result; br_return_val_if_fail (path != (char *) NULL, (char *) NULL); end = strrchr (path, '/'); if (!end) return strdup ("."); while (end > path && *end == '/') end--; result = br_strndup ((char *) path, end - path + 1); if (!*result) { free (result); return strdup ("/"); } else return result; } /** * br_extract_prefix: * path: The full path of an executable or library. * Returns: The prefix, or NULL on error. This string should be freed when no longer needed. * * Extracts the prefix from path. This function assumes that your executable * or library is installed in an LSB-compatible directory structure. * * Example: * br_extract_prefix ("/usr/bin/gnome-panel"); --> Returns "/usr" * br_extract_prefix ("/usr/local/lib/libfoo.so"); --> Returns "/usr/local" * br_extract_prefix ("/usr/local/libfoo.so"); --> Returns "/usr" */ char * br_extract_prefix (const char *path) { char *end, *tmp, *result; br_return_val_if_fail (path != (char *) NULL, (char *) NULL); if (!*path) return strdup ("/"); end = strrchr (path, '/'); if (!end) return strdup (path); tmp = br_strndup ((char *) path, end - path); if (!*tmp) { free (tmp); return strdup ("/"); } end = strrchr (tmp, '/'); if (!end) return tmp; result = br_strndup (tmp, end - tmp); free (tmp); if (!*result) { free (result); result = strdup ("/"); } return result; } /** * br_set_fallback_function: * func: A function to call to find the binary. * data: User data to pass to func. * * Sets a function to call to find the path to the binary, in * case "/proc/self/maps" can't be opened. The function set should * return a string that is safe to free with free(). */ void br_set_locate_fallback_func (br_locate_fallback_func func, void *data) { fallback_func = func; fallback_data = data; } #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _PREFIX_C */ fyre-1.0.1/src/prefix.h0000644000175000001440000001224510263337623011641 00000000000000/* * BinReloc - a library for creating relocatable executables * Written by: Mike Hearn * Hongli Lai * http://autopackage.org/ * * This source code is public domain. You can relicense this code * under whatever license you want. * * See http://autopackage.org/docs/binreloc/ for * more information and how to use this. * * NOTE: if you're using C++ and are getting "undefined reference * to br_*", try renaming prefix.c to prefix.cpp */ #ifndef _PREFIX_H_ #define _PREFIX_H_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* WARNING, BEFORE YOU MODIFY PREFIX.C: * * If you make changes to any of the functions in prefix.c, you MUST * change the BR_NAMESPACE macro. * This way you can avoid symbol table conflicts with other libraries * that also happen to use BinReloc. * * Example: * #define BR_NAMESPACE(funcName) foobar_ ## funcName * --> expands br_locate to foobar_br_locate */ #undef BR_NAMESPACE #define BR_NAMESPACE(funcName) funcName #ifdef ENABLE_BINRELOC #define br_thread_local_store BR_NAMESPACE(br_thread_local_store) #define br_locate BR_NAMESPACE(br_locate) #define br_locate_prefix BR_NAMESPACE(br_locate_prefix) #define br_prepend_prefix BR_NAMESPACE(br_prepend_prefix) #ifndef BR_NO_MACROS /* These are convience macros that replace the ones usually used in Autoconf/Automake projects */ #undef SELFPATH #undef PREFIX #undef PREFIXDIR #undef BINDIR #undef SBINDIR #undef DATADIR #undef LIBDIR #undef LIBEXECDIR #undef ETCDIR #undef SYSCONFDIR #undef CONFDIR #undef LOCALEDIR #define SELFPATH (br_thread_local_store (br_locate ((void *) ""))) #define PREFIX (br_thread_local_store (br_locate_prefix ((void *) ""))) #define PREFIXDIR (br_thread_local_store (br_locate_prefix ((void *) ""))) #define BINDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/bin"))) #define SBINDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/sbin"))) #define DATADIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/share"))) #define LIBDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/lib"))) #define LIBEXECDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/libexec"))) #define ETCDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) #define SYSCONFDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) #define CONFDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/etc"))) #define LOCALEDIR (br_thread_local_store (br_prepend_prefix ((void *) "", "/share/locale"))) #endif /* BR_NO_MACROS */ /* The following functions are used internally by BinReloc and shouldn't be used directly in applications. */ char *br_locate (void *symbol); char *br_locate_prefix (void *symbol); char *br_prepend_prefix (void *symbol, char *path); #endif /* ENABLE_BINRELOC */ const char *br_thread_local_store (char *str); /* These macros and functions are not guarded by the ENABLE_BINRELOC * macro because they are portable. You can use these functions. */ #define br_strcat BR_NAMESPACE(br_strcat) #define br_extract_dir BR_NAMESPACE(br_extract_dir) #define br_extract_prefix BR_NAMESPACE(br_extract_prefix) #define br_set_locate_fallback_func BR_NAMESPACE(br_set_locate_fallback_func) #ifndef BR_NO_MACROS #ifndef ENABLE_BINRELOC #define BR_SELFPATH(suffix) SELFPATH suffix #define BR_PREFIX(suffix) PREFIX suffix #define BR_PREFIXDIR(suffix) BR_PREFIX suffix #define BR_BINDIR(suffix) BINDIR suffix #define BR_SBINDIR(suffix) SBINDIR suffix #define BR_DATADIR(suffix) DATADIR suffix #define BR_LIBDIR(suffix) LIBDIR suffix #define BR_LIBEXECDIR(suffix) LIBEXECDIR suffix #define BR_ETCDIR(suffix) ETCDIR suffix #define BR_SYSCONFDIR(suffix) SYSCONFDIR suffix #define BR_CONFDIR(suffix) CONFDIR suffix #define BR_LOCALEDIR(suffix) LOCALEDIR suffix #else #define BR_SELFPATH(suffix) (br_thread_local_store (br_strcat (SELFPATH, suffix))) #define BR_PREFIX(suffix) (br_thread_local_store (br_strcat (PREFIX, suffix))) #define BR_PREFIXDIR(suffix) (br_thread_local_store (br_strcat (BR_PREFIX, suffix))) #define BR_BINDIR(suffix) (br_thread_local_store (br_strcat (BINDIR, suffix))) #define BR_SBINDIR(suffix) (br_thread_local_store (br_strcat (SBINDIR, suffix))) #define BR_DATADIR(suffix) (br_thread_local_store (br_strcat (DATADIR, suffix))) #define BR_LIBDIR(suffix) (br_thread_local_store (br_strcat (LIBDIR, suffix))) #define BR_LIBEXECDIR(suffix) (br_thread_local_store (br_strcat (LIBEXECDIR, suffix))) #define BR_ETCDIR(suffix) (br_thread_local_store (br_strcat (ETCDIR, suffix))) #define BR_SYSCONFDIR(suffix) (br_thread_local_store (br_strcat (SYSCONFDIR, suffix))) #define BR_CONFDIR(suffix) (br_thread_local_store (br_strcat (CONFDIR, suffix))) #define BR_LOCALEDIR(suffix) (br_thread_local_store (br_strcat (LOCALEDIR, suffix))) #endif #endif char *br_strcat (const char *str1, const char *str2); char *br_extract_dir (const char *path); char *br_extract_prefix(const char *path); typedef char *(*br_locate_fallback_func) (void *symbol, void *data); void br_set_locate_fallback_func (br_locate_fallback_func func, void *data); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _PREFIX_H_ */ fyre-1.0.1/src/batch-image-render.c0000644000175000001440000001103510446431132013742 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * batch-image-render.c - Still image rendering with no GUI * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "config.h" #include #include #include "batch-image-render.h" #ifdef HAVE_GNET #include "cluster-model.h" #endif typedef struct { double quality; GMainLoop* main_loop; GTimer* status_timer; } BatchImageRender; static void on_calc_finished (IterativeMap* map, BatchImageRender* self); void batch_image_render(IterativeMap* map, const char* filename, double quality) { BatchImageRender self; #ifdef HAVE_GNET { ClusterModel *cluster = cluster_model_get(map, FALSE); if (cluster) { /* Stream in new results very infrequently, since this is batch rendering */ cluster_model_set_min_stream_interval(cluster, 10.0); g_object_unref(cluster); } } #endif self.quality = quality; self.main_loop = g_main_loop_new(NULL, FALSE); self.status_timer = g_timer_new(); /* Have the map let us know after each iteration block finishes */ g_signal_connect(map, "calculation-finished", G_CALLBACK(on_calc_finished), &self); /* Keep the rendering time low enough that gnet doesn't * get cranky, but high enough that it still gets most of our CPU time */ map->render_time = 0.1; iterative_map_start_calculation(map); g_main_loop_run(self.main_loop); iterative_map_stop_calculation(map); g_timer_destroy(self.status_timer); #ifdef HAVE_EXR /* Save as an OpenEXR file if it has a .exr extension, otherwise use PNG */ if (strlen(filename) > 4 && strcmp(".exr", filename + strlen(filename) - 4)==0) { GError *error = NULL; printf("Creating OpenEXR image...\n"); exr_save_image_file(HISTOGRAM_IMAGER(map), filename, &error); if (error) { g_print ("Error: %s\n", error->message); g_error_free (error); } } else #endif { GError *error = NULL; printf("Creating PNG image...\n"); histogram_imager_save_image_file(HISTOGRAM_IMAGER(map), filename, &error); if (error) { g_print ("Error: %s\n", error->message); g_error_free (error); } } } static void on_calc_finished (IterativeMap* map, BatchImageRender* self) { double elapsed, remaining; double current_quality = histogram_imager_compute_quality(HISTOGRAM_IMAGER(map)); if (current_quality >= self->quality) g_main_loop_quit(self->main_loop); /* Limit the update rate of this status message independently * from our actual calculation speed. */ if (g_timer_elapsed(self->status_timer, NULL) < 2.0) return; g_timer_start(self->status_timer); /* Compute a somewhat bogus time estimate using a linear approximation */ elapsed = histogram_imager_get_elapsed_time(HISTOGRAM_IMAGER(map)); remaining = elapsed * self->quality / current_quality - elapsed; /* After each batch of iterations, show the percent completion, number * of iterations (in scientific notation), iterations per second, * current quality / target quality, and elapsed time / remaining time. */ printf("%6.02f%% %.3e %.2e/sec %8.04f / %.01f %02d:%02d:%02d / %02d:%02d:%02d\n", 100.0 * current_quality / self->quality, map->iterations, map->iterations / elapsed, current_quality, self->quality, ((int)elapsed) / (60*60), (((int)elapsed) / 60) % 60, ((int)elapsed)%60, ((int)remaining) / (60*60), (((int)remaining) / 60) % 60, ((int)remaining)%60); #ifdef HAVE_GNET { ClusterModel *cluster = cluster_model_get(map, FALSE); if (cluster) { cluster_model_show_status(cluster); g_object_unref(cluster); printf("\n"); } } #endif } /* The End */ fyre-1.0.1/src/batch-image-render.h0000644000175000001440000000230010356610260013743 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * batch-image-render.h - Still image rendering with no GUI * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "iterative-map.h" #ifndef __BATCH_IMAGE_RENDER_H__ #define __BATCH_IMAGE_RENDER_H__ void batch_image_render(IterativeMap* map, const char* output_filename, double quality); #endif /* __BATCH_IMAGE_RENDER_H__ */ /* The End */ fyre-1.0.1/src/remote-server.c0000644000175000001440000004121610446431132013127 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * remote-server.c - Remote control mode, an interface for automating * Fyre rendering. Among other things, this is used * to implement slave nodes in a cluster. * * This communicates using a line oriented protocol * with SMTP-like numeric response codes. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "config.h" #include "platform.h" /* Extra unixy includes for dropping privileges */ #ifdef HAVE_FORK #include #include #include #endif #include #include #include #include #include "iterative-map.h" #include "gui-util.h" #include "histogram-view.h" #include "remote-server.h" #include "de-jong.h" typedef struct _RemoteServer RemoteServer; typedef struct _RemoteServerConn RemoteServerConn; struct _RemoteServer { GServer* gserver; GHashTable* command_hash; GHashTable* gui_hash; gboolean have_gtk; gboolean verbose; }; struct _RemoteServerConn { RemoteServer* server; GConn* gconn; /* State we maintain on behalf of the client */ IterativeMap* map; ParameterHolderPair frame; /* Temporary buffer for sending back histogram streams */ guchar* buffer; gsize buffer_size; /* Optional GUI, enabled with set_gui_style */ GtkWidget* gui; }; typedef void (*RemoteServerCallback) (RemoteServerConn* self, const char* command, const char* parameters); typedef void (*RemoteGUIInitializer) (RemoteServerConn* self); static void remote_server_connect (GServer* gserver, GConn* gconn, gpointer user_data); static void remote_server_callback (GConn* gconn, GConnEvent* event, gpointer user_data); static void remote_server_disconnect (RemoteServerConn* self); static void remote_server_dispatch_line (RemoteServerConn* self, char* line); static void remote_server_send_response (RemoteServerConn* self, int response_code, const char* response_message, ...); static void remote_server_send_binary (RemoteServerConn* self, unsigned char* data, unsigned long length); static void remote_server_add_command (RemoteServer* self, const char* command, RemoteServerCallback callback); static void remote_server_add_gui (RemoteServer* self, const char* name, RemoteGUIInitializer initializer); static void remote_server_init_commands (RemoteServer* self); static void gui_init_none (RemoteServerConn* self); static void release_privileges (RemoteServer* self); /************************************************************************************/ /***************************************************************** I/O Layer ********/ /************************************************************************************/ void remote_server_main_loop (int port_number, gboolean have_gtk, gboolean verbose) { RemoteServer self; self.have_gtk = have_gtk; self.verbose = verbose; self.gserver = gnet_server_new(NULL, port_number, remote_server_connect, &self); if (!self.gserver) { printf("Unable to listen on port %d!\n", port_number); exit(1); } self.command_hash = g_hash_table_new(g_str_hash, g_str_equal); self.gui_hash = g_hash_table_new(g_str_hash, g_str_equal); remote_server_init_commands(&self); if (self.verbose) printf("Fyre server listening on port %d\n", port_number); /* At this point, now that we've bound to the port and such, * make sure we aren't running as a privileged user. If so, * ditch all privileges permanently. */ release_privileges(&self); if (have_gtk) gtk_main(); else g_main_loop_run(g_main_loop_new(NULL, FALSE)); if (self.verbose) printf("Fyre server shutting down.\n"); gnet_server_delete(self.gserver); g_hash_table_destroy(self.command_hash); g_hash_table_destroy(self.gui_hash); } #ifdef HAVE_FORK /* Currently this is only valid on unixy OSes */ static void release_privileges(RemoteServer* self) { struct passwd* nobody; if (getuid() != 0) return; if (self->verbose) printf("Fyre is running as root, dropping all privileges\n"); nobody = getpwnam("nobody"); if (!nobody) { printf("Can't find the 'nobody' user, refusing to run as root.\n"); exit(1); } if (setuid(nobody->pw_uid) < 0) { perror("setuid"); exit(1); } } #else static void release_privileges(RemoteServer* self) {} #endif /* HAVE_FORK */ static void remote_server_connect (GServer* gserver, GConn* gconn, gpointer user_data) { RemoteServerConn* self = g_new0(RemoteServerConn, 1); self->server = (RemoteServer*) user_data; self->gconn = gconn; self->map = ITERATIVE_MAP(de_jong_new()); gnet_conn_set_callback(gconn, remote_server_callback, self); gnet_conn_set_watch_error(gconn, TRUE); gnet_conn_readline(gconn); remote_server_send_response(self, FYRE_RESPONSE_READY, "Fyre rendering server ready"); if (self->server->verbose) printf("[%s:%d] Connected\n", gconn->hostname, gconn->port); } static void remote_server_callback (GConn* gconn, GConnEvent* event, gpointer user_data) { RemoteServerConn* self = (RemoteServerConn*) user_data; switch (event->type) { case GNET_CONN_READ: remote_server_dispatch_line(self, event->buffer); gnet_conn_readline(gconn); break; case GNET_CONN_CLOSE: case GNET_CONN_TIMEOUT: case GNET_CONN_ERROR: remote_server_disconnect(self); break; default: break; } } static void remote_server_disconnect (RemoteServerConn* self) { if (self->server->verbose) printf("[%s:%d] Disconnected\n", self->gconn->hostname, self->gconn->port); gnet_conn_delete(self->gconn); iterative_map_stop_calculation(self->map); gui_init_none(self); g_object_unref(self->map); if (self->buffer) g_free(self->buffer); g_free(self); } static void remote_server_dispatch_line (RemoteServerConn* self, char* line) { char* args; RemoteServerCallback callback; args = strchr(line, ' '); if (args) { *args = '\0'; args++; } else args = ""; callback = (RemoteServerCallback) g_hash_table_lookup(self->server->command_hash, line); if (callback) callback(self, line, args); else remote_server_send_response(self, FYRE_RESPONSE_UNRECOGNIZED, "Command not recognized"); } static void remote_server_send_response (RemoteServerConn* self, int response_code, const char* response_message, ...) { gchar* full_message; gchar* line; va_list ap; va_start(ap, response_message); full_message = g_strdup_vprintf(response_message, ap); va_end(ap); line = g_strdup_printf("%d %s\n", response_code, full_message); gnet_conn_write(self->gconn, line, strlen(line)); g_free(full_message); g_free(line); } static void remote_server_send_binary (RemoteServerConn* self, unsigned char* data, unsigned long length) { int write_size; remote_server_send_response(self, FYRE_RESPONSE_BINARY, "%d byte binary response", length); while (length > 0) { write_size = MIN(length, 4096); gnet_conn_write(self->gconn, data, write_size); length -= write_size; data += write_size; } } static void remote_server_add_command (RemoteServer* self, const char* command, RemoteServerCallback callback) { g_hash_table_insert(self->command_hash, (void*) command, callback); } static void remote_server_add_gui (RemoteServer* self, const char* name, RemoteGUIInitializer initializer) { g_hash_table_insert(self->gui_hash, (void*) name, initializer); } /************************************************************************************/ /*************************************************** Shared convenience functions ***/ /************************************************************************************/ static void sig_histogram_view_update(IterativeMap *map, HistogramView *view) { histogram_view_update(view); } static void remove_deleted_object_signals(gpointer user_data, GObject* deleted_object) { GObject* object = G_OBJECT(user_data); g_signal_handlers_disconnect_matched(object, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, deleted_object); } static void connect_map_to_view(IterativeMap *map, HistogramView *view) { /* Set up a view to automatically update when an iterative map * completes a round of calculations. Automatically remove the * handler when the view is destroyed. */ g_signal_connect(G_OBJECT(map), "calculation-finished", G_CALLBACK(sig_histogram_view_update), view); g_object_weak_ref(G_OBJECT(view), remove_deleted_object_signals, map); } /************************************************************************************/ /******************************************************** Command Implementations ***/ /************************************************************************************/ static void cmd_set_param (RemoteServerConn* self, const char* command, const char* parameters) { parameter_holder_set_from_line(PARAMETER_HOLDER(self->map), parameters); remote_server_send_response(self, FYRE_RESPONSE_OK, "ok"); } static void cmd_set_render_time (RemoteServerConn* self, const char* command, const char* parameters) { self->map->render_time = atof(parameters); remote_server_send_response(self, FYRE_RESPONSE_OK, "ok"); } static void cmd_calc_start (RemoteServerConn* self, const char* command, const char* parameters) { if (self->server->verbose) printf("[%s:%d] Starting calculation\n", self->gconn->hostname, self->gconn->port); iterative_map_start_calculation(self->map); remote_server_send_response(self, FYRE_RESPONSE_OK, "ok"); } static void cmd_calc_stop (RemoteServerConn* self, const char* command, const char* parameters) { if (self->server->verbose) printf("[%s:%d] Pausing calculation\n", self->gconn->hostname, self->gconn->port); iterative_map_stop_calculation(self->map); remote_server_send_response(self, FYRE_RESPONSE_OK, "ok"); } static void cmd_calc_step (RemoteServerConn* self, const char* command, const char* parameters) { /* Instead of (or in addition to) running calculations in * the background when idle, the client can force us to * calculate right now. */ iterative_map_calculate_timed(self->map, self->map->render_time); remote_server_send_response(self, FYRE_RESPONSE_OK, "ok"); } static void cmd_calc_status (RemoteServerConn* self, const char* command, const char* parameters) { if (self->server->verbose) printf("[%s:%d] iterations: %.5e density: %ld\n", self->gconn->hostname, self->gconn->port, self->map->iterations, HISTOGRAM_IMAGER(self->map)->peak_density); remote_server_send_response(self, FYRE_RESPONSE_PROGRESS, "iterations=%.20e density=%ld", self->map->iterations, HISTOGRAM_IMAGER(self->map)->peak_density); } static void cmd_get_histogram_stream (RemoteServerConn* self, const char* command, const char* parameters) { gsize size; if (!self->buffer) { /* Allocate it with an initial size of 128kB */ self->buffer_size = 128 * 1024; self->buffer = g_malloc(self->buffer_size); } size = histogram_imager_export_stream(HISTOGRAM_IMAGER(self->map), self->buffer, self->buffer_size); remote_server_send_binary(self, self->buffer, size); /* If we used more than half the buffer, double its size. * This ensures that if we do run out of room, we'll have plenty * of space to send the remainder of the buffer next time. */ if (size > (self->buffer_size / 2)) { g_free(self->buffer); self->buffer_size *= 2; self->buffer = g_malloc(self->buffer_size); } } static void cmd_is_gui_available (RemoteServerConn* self, const char* command, const char* parameters) { if (self->server->have_gtk) remote_server_send_response(self, FYRE_RESPONSE_OK, "GTK GUI is available"); else remote_server_send_response(self, FYRE_RESPONSE_FALSE, "No GUI is available"); } static void cmd_set_gui_style (RemoteServerConn* self, const char* command, const char* parameters) { /* If GUI support is available at all, the client can choose * one of several possible frontends to use. This looks * up an initializer for that frontend and calls it. */ RemoteGUIInitializer callback; if (!self->server->have_gtk) { remote_server_send_response(self, FYRE_RESPONSE_UNSUPPORTED, "No GUI is available"); return; } callback = (RemoteGUIInitializer) g_hash_table_lookup(self->server->gui_hash, parameters); if (callback) { /* Remove the previous GUI */ gui_init_none(self); callback(self); if (self->server->verbose) printf("[%s:%d] GUI set to '%s'\n", self->gconn->hostname, self->gconn->port, parameters); remote_server_send_response(self, FYRE_RESPONSE_OK, "GUI style set to '%s'", parameters); } else { remote_server_send_response(self, FYRE_RESPONSE_BAD_VALUE, "Unrecognized GUI style"); } } static void gui_init_none (RemoteServerConn* self) { /* Null GUI- just disables any previous GUI that might have been running */ if (self->gui) gtk_widget_destroy(self->gui); self->gui = NULL; } static void gui_init_simple (RemoteServerConn* self) { /* Simple GUI, just a window holding our histogram view */ GtkWidget* view; GtkWidget* window; view = histogram_view_new(HISTOGRAM_IMAGER(self->map)); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); fyre_set_icon_later(window); gtk_window_set_resizable(GTK_WINDOW(window), FALSE); gtk_window_set_title(GTK_WINDOW(window), "Fyre Server"); gtk_container_add(GTK_CONTAINER(window), view); gtk_widget_show_all(window); connect_map_to_view(self->map, HISTOGRAM_VIEW(view)); self->gui = window; } static void remote_server_init_commands (RemoteServer* self) { remote_server_add_command(self, "set_param", cmd_set_param); remote_server_add_command(self, "set_gui_style", cmd_set_gui_style); remote_server_add_command(self, "set_render_time", cmd_set_render_time); remote_server_add_command(self, "is_gui_available", cmd_is_gui_available); remote_server_add_command(self, "calc_start", cmd_calc_start); remote_server_add_command(self, "calc_stop", cmd_calc_stop); remote_server_add_command(self, "calc_step", cmd_calc_step); remote_server_add_command(self, "calc_status", cmd_calc_status); remote_server_add_command(self, "get_histogram_stream", cmd_get_histogram_stream); remote_server_add_gui(self, "none", gui_init_none); remote_server_add_gui(self, "simple", gui_init_simple); } /* The End */ fyre-1.0.1/src/remote-server.h0000644000175000001440000000564210356610504013141 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * remote-server.h - Remote control mode, an interface for automating * Fyre rendering. Among other things, this is used * to implement slave nodes in a cluster. * * This communicates using a line oriented protocol * with SMTP-like numeric response codes. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __REMOTE_SERVER_H__ #define __REMOTE_SERVER_H__ #include "platform.h" #include #include "animation.h" #include "iterative-map.h" G_BEGIN_DECLS /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ void remote_server_main_loop (int port_number, gboolean have_gtk, gboolean verbose); /************************************************************************************/ /******************************************************************* Protocol *******/ /************************************************************************************/ #define FYRE_DEFAULT_PORT 7931 #define FYRE_DEFAULT_SERVICE "Fyre Server 1" #define FYRE_RESPONSE_READY 220 /* Server is ready for commands */ #define FYRE_RESPONSE_OK 250 /* Successfully executed the last command */ #define FYRE_RESPONSE_PROGRESS 251 /* Progress in calculation */ #define FYRE_RESPONSE_FALSE 252 /* Command succeeded, but the result was negative */ #define FYRE_RESPONSE_BINARY 380 /* Length, in bytes, is the first token of * the response message. Binary data follows * after the message's newline. */ #define FYRE_RESPONSE_UNRECOGNIZED 500 /* Command not recognized */ #define FYRE_RESPONSE_BAD_VALUE 501 /* Inappropriate parameter value */ #define FYRE_RESPONSE_UNSUPPORTED 502 /* Command was recognized, but is not currently supported */ G_END_DECLS #endif /* __REMOTE_SERVER_H__ */ /* The End */ fyre-1.0.1/src/math-util.c0000644000175000001440000000452510446431132012236 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * math-util.c - Small math utilities shared by other modules * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "math-util.h" #include #include /* It's much faster to use our own global g_rand, rather than * relying on the g_random_* family of functions. Those functions * are thread-safe, and the locking around that shared g_rand can * take a very significant amount of CPU. We don't need thread-safe * random variates yet. */ static GRand* global_random = NULL; void math_init() { global_random = g_rand_new_with_seed(time(NULL)); } double uniform_variate() { /* A uniform random variate between 0 and 1 */ return g_rand_double(global_random); } void normal_variate_pair(double *a, double *b) { /* Produce a pair of values with a standard normal distribution, * using the Polar Box-Mueller method. */ double x, y, r2, m; do { x = uniform_variate(); x += x - 1; y = uniform_variate(); y += y - 1; /* Squared radius. The vector must be nonzero, * and it must lie within the unit circle. */ r2 = x*x + y*y; } while (r2 > 1 || r2 == 0); /* Perform the Box-Mueller transform on each component */ m = sqrt(-2.0 * log(r2) / r2); *a = x * m; *b = y * m; } int int_variate(int minimum, int maximum) { return g_rand_int_range(global_random, minimum, maximum); } int find_upper_pow2(int x) { /* Find the smallest power of two greater than or equal to x */ int p = 1; while (p < x) p <<= 1; return p; } /* The End */ fyre-1.0.1/src/math-util.h0000644000175000001440000000230510446431132012235 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * math-util.h - Small math utilities shared by other modules * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __MATH_UTIL_H__ #define __MATH_UTIL_H__ void math_init(); int int_variate(int minimum, int maximum); double uniform_variate(); void normal_variate_pair(double *a, double *b); int find_upper_pow2(int x); #endif /* __MATH_UTIL_H__ */ /* The End */ fyre-1.0.1/src/histogram-imager.c0000644000175000001440000012652310446431132013574 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * histogram-imager.c - An object that stores a 2D histogram and generates * images from it. Supports oversampling, gamma correction, * color interpolation, and exposure adjustment. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "histogram-imager.h" #include "var-int.h" #include "image-fu.h" #include #include #include #include static void histogram_imager_class_init (HistogramImagerClass *klass); static void histogram_imager_init_size_params (GObjectClass *object_class); static void histogram_imager_init_render_params (GObjectClass *object_class); static void histogram_imager_dispose (GObject *gobject); static void histogram_imager_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void histogram_imager_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void histogram_imager_resize_from_string (HistogramImager *self, const gchar *s); static void histogram_imager_generate_color_table (HistogramImager *self, gboolean force); static void histogram_imager_check_dirty_flags (HistogramImager *self); static void histogram_imager_require_histogram (HistogramImager *self); static void histogram_imager_require_image (HistogramImager *self); static void histogram_imager_require_oversample_tables (HistogramImager *self); static gulong histogram_imager_get_max_usable_density (HistogramImager *self); static gboolean update_double_if_necessary (gdouble new_value, gboolean *dirty_flag, gdouble *param, gdouble epsilon); static gboolean update_uint_if_necessary (guint new_value, gboolean *dirty_flag, guint *param); static gboolean update_boolean_if_necessary (gboolean new_value, gboolean *dirty_flag, gboolean *param); static gboolean update_color_if_necessary (const GdkColor* new_value, gboolean *dirty_flag, GdkColor *param); static gchar* describe_color (GdkColor *c); enum { PROP_0, PROP_WIDTH, PROP_HEIGHT, PROP_OVERSAMPLE, PROP_OVERSAMPLE_ENABLED, PROP_SIZE, PROP_EXPOSURE, PROP_GAMMA, PROP_OVERSAMPLE_GAMMA, PROP_FGCOLOR, PROP_BGCOLOR, PROP_FGALPHA, PROP_BGALPHA, PROP_CLAMPED, PROP_FGCOLOR_GDK, PROP_BGCOLOR_GDK, }; static gpointer parent_class = NULL; #define fyre_histogram_imager_error_quark() (g_quark_from_string("FYRE_HISTOGRAM_IMAGER_ERROR")) typedef enum { FYRE_HISTOGRAM_IMAGER_ERROR_NO_METADATA, } FyreHistogramImagerError; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType histogram_imager_get_type (void) { static GType dj_type = 0; if (!dj_type) { static const GTypeInfo dj_info = { sizeof (HistogramImagerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) histogram_imager_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (HistogramImager), 0, NULL, /* instance init */ }; dj_type = g_type_register_static (PARAMETER_HOLDER_TYPE, "HistogramImager", &dj_info, 0); } return dj_type; } static void histogram_imager_class_init (HistogramImagerClass *klass) { GObjectClass *object_class; parent_class = g_type_class_ref (G_TYPE_OBJECT); object_class = (GObjectClass*) klass; object_class->set_property = histogram_imager_set_property; object_class->get_property = histogram_imager_get_property; object_class->dispose = histogram_imager_dispose; histogram_imager_init_size_params (object_class); histogram_imager_init_render_params (object_class); } static void histogram_imager_init_size_params (GObjectClass *object_class) { GParamSpec *spec; const gchar *current_group = "Image Size"; spec = g_param_spec_uint ("width", "Width", "Width of the rendered image, in pixels", 1, 32767, 600, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 1, 16, 0); g_object_class_install_property (object_class, PROP_WIDTH, spec); spec = g_param_spec_uint ("height", "Height", "Height of the rendered image, in pixels", 1, 32767, 600, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 1, 16, 0); g_object_class_install_property (object_class, PROP_HEIGHT, spec); spec = g_param_spec_uint ("oversample", "Oversampling", "Oversampling factor, 1 for no oversampling to 4 for heavy oversampling", 1, 4, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 1, 1, 0); g_object_class_install_property (object_class, PROP_OVERSAMPLE, spec); spec = g_param_spec_boolean ("oversample_enabled", "Oversampling Enabled", "Indicates when oversampling has been enabled with the 'oversample' property", FALSE, G_PARAM_READABLE); g_object_class_install_property (object_class, PROP_OVERSAMPLE_ENABLED, spec); spec = g_param_spec_string ("size", "Size", "Image size as a WIDTH or WIDTHxHEIGHT string", NULL, G_PARAM_READWRITE); g_object_class_install_property (object_class, PROP_SIZE, spec); } static void histogram_imager_init_render_params (GObjectClass *object_class) { GParamSpec *spec; const gchar *current_group = "Rendering"; spec = g_param_spec_double ("exposure", "Exposure", "The relative strength, darkness, or brightness of the image", 0, 100, 0.05, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.001, 0.01, 3); g_object_class_install_property (object_class, PROP_EXPOSURE, spec); spec = g_param_spec_double ("gamma", "Gamma", "A gamma correction applied while rendering the image", 0, 10, 1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.01, 0.1, 3); g_object_class_install_property (object_class, PROP_GAMMA, spec); spec = g_param_spec_double ("oversample_gamma", "Oversampling gamma", "Gamma correction used when downconverting oversampled histograms", 0, 10, 1.66, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | G_PARAM_LAX_VALIDATION | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); param_spec_set_increments (spec, 0.01, 0.1, 3); param_spec_set_dependency (spec, "oversample-enabled"); g_object_class_install_property (object_class, PROP_OVERSAMPLE_GAMMA, spec); spec = g_param_spec_string ("fgcolor", "Foreground", "The foreground color, as a color name or #RRGGBB hex triple", "#000000", G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED); g_object_class_install_property (object_class, PROP_FGCOLOR, spec); spec = g_param_spec_string ("bgcolor", "Background", "The background color, as a color name or #RRGGBB hex triple", "#FFFFFF", G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED); g_object_class_install_property (object_class, PROP_BGCOLOR, spec); spec = g_param_spec_boxed ("fgcolor_gdk", "Foreground", "The foreground color, as a GdkColor", GDK_TYPE_COLOR, G_PARAM_READWRITE | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); g_param_spec_set_qdata (spec, g_quark_from_static_string("opacity-property"), "fgalpha"); g_object_class_install_property (object_class, PROP_FGCOLOR_GDK, spec); spec = g_param_spec_boxed ("bgcolor_gdk", "Background", "The background color, as a GdkColor", GDK_TYPE_COLOR, G_PARAM_READWRITE | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); g_param_spec_set_qdata (spec, g_quark_from_static_string("opacity-property"), "bgalpha"); g_object_class_install_property (object_class, PROP_BGCOLOR_GDK, spec); spec = g_param_spec_uint ("fgalpha", "Foreground alpha", "The foreground color's opacity", 0, 65535, 65535, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_INTERPOLATE); g_object_class_install_property (object_class, PROP_FGALPHA, spec); spec = g_param_spec_uint ("bgalpha", "Background alpha", "The background color's opacity", 0, 65535, 65535, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_INTERPOLATE); g_object_class_install_property (object_class, PROP_BGALPHA, spec); spec = g_param_spec_boolean ("clamped", "Clamped", "When set, luminances are clamped to [0,1] before linear interpolation", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | PARAM_SERIALIZED | PARAM_INTERPOLATE | PARAM_IN_GUI); param_spec_set_group (spec, current_group); g_object_class_install_property (object_class, PROP_CLAMPED, spec); } static void histogram_imager_dispose (GObject *gobject) { HistogramImager *self = HISTOGRAM_IMAGER (gobject); if (self->histogram) { g_free (self->histogram); self->histogram = NULL; } if (self->image) { gdk_pixbuf_unref (self->image); self->image = NULL; } if (self->color_table.table) { g_free (self->color_table.table); self->color_table.table = NULL; } if (self->color_table.quality) { g_free (self->color_table.quality); self->color_table.quality = NULL; } if (self->oversample_tables.linearize) { g_free (self->oversample_tables.linearize); self->oversample_tables.linearize = NULL; } if (self->oversample_tables.nonlinearize) { g_free (self->oversample_tables.nonlinearize); self->oversample_tables.nonlinearize = NULL; } G_OBJECT_CLASS (parent_class)->dispose (gobject); } HistogramImager* histogram_imager_new () { return HISTOGRAM_IMAGER (g_object_new (histogram_imager_get_type (), NULL)); } /************************************************************************************/ /*********************************************************************** Properties */ /************************************************************************************/ static gchar* describe_color (GdkColor *c) { /* Convert a GdkColor back to a gdk_color_parse compatible hex value. * Returns a freshly allocated buffer that should be freed. */ return g_strdup_printf ("#%02X%02X%02X", c->red >> 8, c->green >> 8, c->blue >> 8); } static void histogram_imager_resize_from_string (HistogramImager *self, const gchar *s) { /* Set the current width and height from a WIDTH or WIDTHxHEIGHT in the given string */ char *cptr; guint width, height; width = strtol (s, &cptr, 10); if (*cptr == 'x') height = atoi (cptr+1); else height = width; g_object_set (self, "width", width, "height", height, NULL); } static gboolean update_double_if_necessary (double new_value, gboolean *dirty_flag, double *param, double epsilon) { if (fabs (new_value - *param) > epsilon) { *param = new_value; *dirty_flag = TRUE; return TRUE; } return FALSE; } static gboolean update_uint_if_necessary (guint new_value, gboolean *dirty_flag, guint *param) { if (new_value != *param) { *param = new_value; *dirty_flag = TRUE; return TRUE; } return FALSE; } static gboolean update_boolean_if_necessary (gboolean new_value, gboolean *dirty_flag, gboolean *param) { if (new_value != *param) { *param = new_value; *dirty_flag = TRUE; return TRUE; } return FALSE; } static gboolean update_color_if_necessary (const GdkColor* new_value, gboolean *dirty_flag, GdkColor *param) { if (new_value->red != param->red || new_value->green != param->green || new_value->blue != param->blue) { *param = *new_value; *dirty_flag = TRUE; return TRUE; } return FALSE; } static void histogram_imager_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { HistogramImager *self = HISTOGRAM_IMAGER(object); GdkColor gdkc; switch (prop_id) { case PROP_WIDTH: update_uint_if_necessary (g_value_get_uint (value), &self->size_dirty_flag, &self->width); break; case PROP_HEIGHT: update_uint_if_necessary (g_value_get_uint (value), &self->size_dirty_flag, &self->height); break; case PROP_OVERSAMPLE: if (update_uint_if_necessary (g_value_get_uint (value), &self->size_dirty_flag, &self->oversample)) g_object_notify (object, "oversample-enabled"); break; case PROP_SIZE: histogram_imager_resize_from_string (self, g_value_get_string (value)); break; case PROP_EXPOSURE: update_double_if_necessary (g_value_get_double (value), &self->render_dirty_flag, &self->exposure, 0.00009); break; case PROP_GAMMA: update_double_if_necessary (g_value_get_double (value), &self->render_dirty_flag, &self->gamma, 0.00009); break; case PROP_OVERSAMPLE_GAMMA: update_double_if_necessary (g_value_get_double (value), &self->render_dirty_flag, &self->oversample_gamma, 0.00009); break; case PROP_FGCOLOR: /* Convert to a GdkColor and set the fgcolor-gdk property. This is necessary * so that notify signals attached to fgcolor-gdk are sent properly, and in * general makes it cleaner. */ gdk_color_parse (g_value_get_string (value), &gdkc); g_object_set (self, "fgcolor-gdk", &gdkc, NULL); break; case PROP_BGCOLOR: /* And the same goes for background... */ gdk_color_parse (g_value_get_string (value), &gdkc); g_object_set (self, "bgcolor-gdk", &gdkc, NULL); break; case PROP_FGCOLOR_GDK: update_color_if_necessary ((GdkColor*) g_value_get_boxed (value), &self->render_dirty_flag, &self->fgcolor); break; case PROP_BGCOLOR_GDK: update_color_if_necessary ((GdkColor*) g_value_get_boxed (value), &self->render_dirty_flag, &self->bgcolor); break; case PROP_FGALPHA: update_uint_if_necessary (g_value_get_uint (value), &self->render_dirty_flag, &self->fgalpha); break; case PROP_BGALPHA: update_uint_if_necessary (g_value_get_uint (value), &self->render_dirty_flag, &self->bgalpha); break; case PROP_CLAMPED: update_boolean_if_necessary (g_value_get_boolean (value), &self->render_dirty_flag, &self->clamped); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void histogram_imager_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { HistogramImager *self = HISTOGRAM_IMAGER (object); switch (prop_id) { case PROP_WIDTH: g_value_set_uint (value, self->width); break; case PROP_HEIGHT: g_value_set_uint (value, self->height); break; case PROP_OVERSAMPLE: g_value_set_uint (value, self->oversample); break; case PROP_OVERSAMPLE_ENABLED: g_value_set_boolean (value, self->oversample > 1); break; case PROP_CLAMPED: g_value_set_boolean (value, self->clamped); break; case PROP_EXPOSURE: g_value_set_double (value, self->exposure); break; case PROP_GAMMA: g_value_set_double (value, self->gamma); break; case PROP_OVERSAMPLE_GAMMA: g_value_set_double (value, self->oversample_gamma); break; case PROP_FGALPHA: g_value_set_uint (value, self->fgalpha); break; case PROP_BGALPHA: g_value_set_uint (value, self->bgalpha); break; case PROP_SIZE: g_value_set_string_take_ownership (value, g_strdup_printf ("%dx%d", self->width, self->height)); break; case PROP_FGCOLOR: g_value_set_string_take_ownership (value, describe_color (&self->fgcolor)); break; case PROP_BGCOLOR: g_value_set_string_take_ownership (value, describe_color (&self->bgcolor)); break; case PROP_FGCOLOR_GDK: g_value_set_boxed (value, &self->fgcolor); break; case PROP_BGCOLOR_GDK: g_value_set_boxed (value, &self->bgcolor); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /************************************************************************************/ /************************************************************************ Image I/O */ /************************************************************************************/ void histogram_imager_load_image_file (HistogramImager *self, const gchar *filename, GError **error) { /* Try to open the given PNG file and load parameters from it */ const gchar *params; GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file (filename, error); if (!pixbuf) return; params = gdk_pixbuf_get_option (pixbuf, "tEXt::fyre_params"); /* For backward compatibility with de Jong Explorer and early versions of Fyre */ if (!params) params = gdk_pixbuf_get_option (pixbuf, "tEXt::de_jong_params"); if (params) { parameter_holder_load_string (PARAMETER_HOLDER (self), params); } else { if (error != NULL) { GError *nerror = g_error_new (fyre_histogram_imager_error_quark(), FYRE_HISTOGRAM_IMAGER_ERROR_NO_METADATA, "The image does not contain Fyre metadata"); *error = nerror; } } gdk_pixbuf_unref (pixbuf); } void histogram_imager_save_image_file (HistogramImager *self, const gchar *filename, GError **error) { /* Save our current image to a .PNG file */ gchar *params; histogram_imager_update_image (self); /* Save our current parameters in a tEXt chunk, using a format that * is both human-readable and easy to load parameters from automatically. */ params = parameter_holder_save_string (PARAMETER_HOLDER(self)); gdk_pixbuf_save (self->image, filename, "png", error, "tEXt::fyre_params", params, NULL); g_free (params); } GdkPixbuf* histogram_imager_make_thumbnail (HistogramImager *self, guint max_width, guint max_height) { float aspect = ((float)self->width) / ((float)self->height); guint width, height; GdkPixbuf *thumb; /* Make sure the histogram is up to date */ histogram_imager_update_image (self); /* Scale it down aspect-correctly */ if (aspect > 1) { width = max_width; height = width / aspect; } else { height = max_height; width = height * aspect; } width = MAX(width, 5); height = MAX(height, 5); thumb = gdk_pixbuf_scale_simple (self->image, width, height, GDK_INTERP_BILINEAR); /* Do an in-place composite of a checkerboard behind this image, to make alpha visible */ image_add_checkerboard(thumb); /* If the image is particularly small, enhance its visibility */ if (width < 128 || height < 128) image_adjust_levels(thumb); /* Put a standard frame around it */ image_add_thumbnail_frame(thumb); return thumb; } /************************************************************************************/ /************************************************************************* Plotting */ /************************************************************************************/ void histogram_imager_get_hist_size (HistogramImager *self, int *hist_width, int *hist_height) { if (hist_width) *hist_width = self->width * self->oversample; if (hist_height) *hist_height = self->height * self->oversample; } void histogram_imager_prepare_plots (HistogramImager *self, HistogramPlot *plot) { histogram_imager_check_dirty_flags(self); histogram_imager_require_histogram(self); plot->histogram = self->histogram; plot->hist_width = self->width * self->oversample; plot->density = 0; plot->plot_count = 0; } void histogram_imager_finish_plots (HistogramImager *self, HistogramPlot *plot) { self->total_points_plotted += plot->plot_count; if (plot->density > self->peak_density) self->peak_density = plot->density; } /************************************************************************************/ /************************************************************************ Rendering */ /************************************************************************************/ void histogram_imager_update_image (HistogramImager *self) { /* Convert our histogram counts to an 8-bit ARGB image data using our color lookup table, * downsampling by combining all count buckets that represent each of our output pixels. */ histogram_imager_check_dirty_flags (self); histogram_imager_require_histogram (self); histogram_imager_require_image (self); histogram_imager_generate_color_table (self, TRUE); { guint32 *pixel_p; guint32* const color_table = self->color_table.table; guint *hist_p, *sample_p; guint count, hist_clamp; const guint oversample = self->oversample; int x, y; pixel_p = (guint32*) gdk_pixbuf_get_pixels (self->image); hist_p = self->histogram; /* Clamp count values to the size of our color table. * Assuming the color table generator did it's job * correctly, any count values higher than the maximum * one in the table would generate the same color as * the highest one. */ hist_clamp = self->color_table.filled_size - 1; if (oversample > 1) { /* Nice ugly loop that downsamples multiple (oversample^2) * histogram buckets to each pixel */ const int sample_stride = (self->width * oversample) - oversample; const int sample_y_stride = (self->width * oversample) * (oversample - 1); guint* linearize_table; guint8* nonlinearize_table; int sample_x, sample_y; int ch0, ch1, ch2, ch3; union { guint32 word; struct { guchar ch0, ch1, ch2, ch3; } channels; } sample_pixel; histogram_imager_require_oversample_tables (self); linearize_table = self->oversample_tables.linearize; nonlinearize_table = self->oversample_tables.nonlinearize; for (y=self->height; y; y--) { for (x=self->width; x; x--) { /* Convert each oversampled input point to a color separately, then * average the resulting colors using the ch0 through ch3 channel * accumulators. Note that which channel is which depends on the * machine's endianness, so we can't name them red, green, blue, * and alpha here. This can be though of as dividing each pixel into * and oversample-by-oversample grid of squares and plotting one * histogram bucket in each, with antialiasing. */ ch0 = ch1 = ch2 = ch3 = 0; sample_p = hist_p; for (sample_y=oversample; sample_y; sample_y--) { for (sample_x=oversample; sample_x; sample_x--) { count = *(sample_p++); if (count > hist_clamp) sample_pixel.word = color_table[hist_clamp]; else sample_pixel.word = color_table[count]; ch0 += linearize_table[sample_pixel.channels.ch0]; ch1 += linearize_table[sample_pixel.channels.ch1]; ch2 += linearize_table[sample_pixel.channels.ch2]; ch3 += linearize_table[sample_pixel.channels.ch3]; } sample_p += sample_stride; } hist_p += oversample; sample_pixel.channels.ch0 = nonlinearize_table[ch0]; sample_pixel.channels.ch1 = nonlinearize_table[ch1]; sample_pixel.channels.ch2 = nonlinearize_table[ch2]; sample_pixel.channels.ch3 = nonlinearize_table[ch3]; *(pixel_p++) = sample_pixel.word; } hist_p += sample_y_stride; } } else { /* A much simpler and faster loop to use when oversampling is disabled */ for (y=self->height; y; y--) { for (x=self->width; x; x--) { count = *(hist_p++); if (count > hist_clamp) *(pixel_p++) = color_table[hist_clamp]; else *(pixel_p++) = color_table[count]; } } } } } static void histogram_imager_resize_color_table (HistogramImager *self, gulong size) { /* Resize the color table to exactly 'size' entries. Upon completion, * self->color_table.filled_size will equal 'size', and * self->color_table.allocated_size will be at least 'size'. * If the current table is too small, this reallocates one twice as * large as necessary, since the required size usually grows. However, * if the required size is less than 1/10 the current size, the table will * shrink to twice the current minimum size. */ self->color_table.filled_size = size; /* Just to reduce allocation overhead during those crucial first few frames, * put a lower limit on the amount of memory we're going to allocate. */ if (size < 1024) size = 1024; if ((self->color_table.allocated_size < size) || (self->color_table.allocated_size > 10 * size)) { if (self->color_table.table) g_free (self->color_table.table); if (self->color_table.quality) g_free (self->color_table.quality); /* Allocate it to double the size we need now, as we expect our needs to grow. */ self->color_table.allocated_size = size * 2; self->color_table.table = g_malloc (self->color_table.allocated_size * sizeof(self->color_table.table[0])); self->color_table.quality = g_malloc (self->color_table.allocated_size * sizeof(self->color_table.quality[0])); } } float histogram_imager_get_pixel_scale (HistogramImager *self) { /* Calculate the scale factor for converting histogram counts to * luminance values between 0 and 1. */ float density, fscale; /* Avoid dividing by zero if we've plotted nothing */ if (!self->total_points_plotted) return 0; /* Calculate the average histogram density */ density = self->total_points_plotted / (self->width * self->height * self->oversample * self->oversample); /* fscale is a floating point number that, when multiplied by a raw * counts[] value, gives values between 0 and 1 corresponding to full * white and full black. */ fscale = self->exposure / density; /* The very first frame we render will often be very underexposed. * If fscale > 0.5, this makes countsclamp negative and we get incorrect * results. The lowest usable value of countsclamp is 1. */ if (fscale > 0.5) fscale = 0.5; return fscale; } static void histogram_imager_generate_color_table (HistogramImager *self, gboolean force) { /* Regenerate the contents of the color mapping table, a mapping from all * possible histogram values to the corresponding ARGB color, in the current image. */ guint count; float pixel_scale = histogram_imager_get_pixel_scale (self); gulong usable_density = histogram_imager_get_max_usable_density (self); float luma; double one_over_gamma = 1/self->gamma; float distance = 0; gulong color_table_size; struct { int r, g, b, a; } current, previous; /* Our actual color table size should be either the maximum * usable density, or our histogram's current peak density, * whichever is smaller. */ if (usable_density > self->peak_density) usable_density = self->peak_density; /* If the table is already the right size and we aren't being * forced to regenerate it, stop now. */ color_table_size = usable_density + 1; if ((!force) && self->color_table.filled_size == color_table_size) return; /* Make sure our table is appropriately sized */ histogram_imager_resize_color_table (self, color_table_size); /* Generate one color for every currently-possible count value that * doesn't fully saturate our image, as determined by histogram_imager_get_max_usable_density */ for (count=0; count < self->color_table.filled_size; count++) { /* Scale and gamma-correct */ luma = count * pixel_scale; luma = pow(luma, one_over_gamma); /* Optionally clamp before interpolating */ if (self->clamped && luma > 1) luma = 1; /* Linearly interpolate between fgcolor and bgcolor */ current.r = ((int)(self->bgcolor.red * (1-luma) + self->fgcolor.red * luma)) >> 8; current.g = ((int)(self->bgcolor.green * (1-luma) + self->fgcolor.green * luma)) >> 8; current.b = ((int)(self->bgcolor.blue * (1-luma) + self->fgcolor.blue * luma)) >> 8; current.a = ((int)(self->bgalpha * (1-luma) + self->fgalpha * luma)) >> 8; /* Always clamp color components */ if (current.r<0) current.r = 0; if (current.r>255) current.r = 255; if (current.g<0) current.g = 0; if (current.g>255) current.g = 255; if (current.b<0) current.b = 0; if (current.b>255) current.b = 255; if (current.a<0) current.a = 0; if (current.a>255) current.a = 255; /* Colors are always ARGB order in little endian */ self->color_table.table[count] = IMAGEFU_COLOR(current.a, current.r, current.g, current.b); /* Update our elapsed distance */ if (count > 0) { distance += sqrt( (current.r - previous.r) * (current.r - previous.r) + (current.g - previous.g) * (current.g - previous.g) + (current.b - previous.b) * (current.b - previous.b) + (current.a - previous.a) * (current.a - previous.a) ); } previous = current; /* "distance" is the distance we've traveled from the background to this * point in the color hypercube. Our quality metric is based on the number * of histogram samples per color cube samples: our 'quality' table stores * the current count divided by its corresponding distance. */ if (distance > 0) { self->color_table.quality[count] = count / distance; } else { /* We shouldn't ever use quality entries where the distance * is zero- this value is pretty arbitrary. */ self->color_table.quality[count] = 0; } } } static gulong histogram_imager_get_max_usable_density (HistogramImager *self) { /* This determines the highest histogram count value that will * produce any change in the color value of a pixel. This can be * used as an upper limit on the size of the color table. Note that * its value will change as the image is calculated, because it * depends on the pixel_scale. * * This function is basically the inverse of our color table's * function, mapping the most exposed color possible back to * a count value. */ double max_luma, max_usable; if (self->clamped) { /* If clamping is on, the maximum useful luminance will always be 1. easy! */ max_luma = 1; } else { /* But without clamping, it's possible for larger luminances to push * our color 'past' the foreground color. Envision a vector in 4 dimensional * RGBA space, pointing from background color to foreground color. * * This vector is represented by v_r, v_g, v_b, and v_a. We want to see how * far we can extend this vector until the resulting color is fully saturated. * * The value of each component in the fully saturated color depends on the sign * of the corresponding component in the vector. If it is zero, the resulting * color will always equal the background color, If it's negative, it will * eventually fall to 0, If it's positive, it will eventually reach 65535. * * Once we know what the fully saturated color is, we can easily use the * per-channel deltas to find out how much luminance it would take to * saturate each channel. The final max_luma is just the highest channel * saturation luminance. */ int delta_r, delta_g, delta_b, delta_a; int clamped_r, clamped_g, clamped_b, clamped_a; double max_luma_r, max_luma_g, max_luma_b, max_luma_a; delta_r = self->fgcolor.red - self->bgcolor.red; delta_g = self->fgcolor.green - self->bgcolor.green; delta_b = self->fgcolor.blue - self->bgcolor.blue; delta_a = self->fgalpha - self->bgalpha; if (delta_r > 0) clamped_r = 65535; else if (delta_r < 0) clamped_r = 0; else clamped_r = self->bgcolor.red; if (delta_g > 0) clamped_g = 65535; else if (delta_g < 0) clamped_g = 0; else clamped_g = self->bgcolor.green; if (delta_b > 0) clamped_b = 65535; else if (delta_b < 0) clamped_b = 0; else clamped_b = self->bgcolor.blue; if (delta_a > 0) clamped_a = 65535; else if (delta_a < 0) clamped_a = 0; else clamped_a = self->bgalpha; if (delta_r == 0) max_luma_r = 0; else max_luma_r = (((double)clamped_r) - self->bgcolor.red) / delta_r; if (delta_g == 0) max_luma_g = 0; else max_luma_g = (((double)clamped_g) - self->bgcolor.green) / delta_g; if (delta_b == 0) max_luma_b = 0; else max_luma_b = (((double)clamped_b) - self->bgcolor.blue) / delta_b; if (delta_a == 0) max_luma_a = 0; else max_luma_a = (((double)clamped_a) - self->bgalpha) / delta_a; max_luma = 0; if (max_luma_r > max_luma) max_luma = max_luma_r; if (max_luma_g > max_luma) max_luma = max_luma_g; if (max_luma_b > max_luma) max_luma = max_luma_b; if (max_luma_a > max_luma) max_luma = max_luma_a; } /* Put max_luma through the inverse of our color table's gamma operation */ max_luma = pow(max_luma, self->gamma); /* And now we can finally get the count value by dividing out our pixel scale */ max_usable = max_luma / histogram_imager_get_pixel_scale(self) + 1; /* For some input values, it's possible for this to generate really * truly gigantic numbers. We clamp these to something a bit more * reasonable, to avoid arithmetic overflow later on. */ if (max_usable > G_MAXINT/2) max_usable = G_MAXINT/2; return (gulong) max_usable; } gdouble histogram_imager_compute_quality (HistogramImager *self) { /* Compute a quality metric for the current histogram. * The algorithm is described in more detail in histogram-imager.h */ histogram_imager_check_dirty_flags (self); histogram_imager_require_histogram (self); histogram_imager_generate_color_table (self, FALSE); { guint *row = self->histogram; guint *hist_p; float *qual_p = self->color_table.quality; guint count; guint hist_clamp = self->color_table.filled_size - 1; int width = self->width * self->oversample; int height = self->height * self->oversample; int x, y, x_scale, y_scale; guint stride; gulong denominator = 0; gulong num_saturated = 0; double numerator = 0; if (self->color_table.filled_size < 1) return G_MAXDOUBLE; /* Sample the histogram at a reduced resolution, calculated * such that we get about a 256x256 grid. */ x_scale = MAX(1, width >> 8); y_scale = MAX(1, height >> 8); y = height; stride = y_scale * width; while (y > 0) { hist_p = row; x = width; while (x > 0) { count = *hist_p; /* We average only those buckets that fall within the output device's dynamic range */ if (count > hist_clamp) { num_saturated++; } else if (count > 0) { numerator += qual_p[count]; denominator++; } x -= x_scale; hist_p += x_scale; } y -= y_scale; row += stride; } if (!denominator) return G_MAXDOUBLE; /* If the number of samples we have is less than 1% of the saturated * samples, this is probably a very highly saturated image like a silhouette * and it's done rendering. */ if (denominator < num_saturated/100) return G_MAXDOUBLE; return numerator / denominator; } } /************************************************************************************/ /***************************************************************** Stream Buffering */ /************************************************************************************/ gsize histogram_imager_export_stream (HistogramImager *self, guchar *buffer, gsize buffer_size) { /* This encodes the contents of our histogram buffer * in a platform-independent and compact format suitable * for loading later with histogram_imager_merge_stream(). * * This format is a form of run-length encoding, using var-int * to store our integers compactly. All numbers are left-shifted * one bit, and the least significant bit indicates meaning. * Values with an LSB of 0 indicate a number of buckets to skip, * and an LSB of 1 indicates a number of times to increment * the current bucket before skipping it. */ guchar *output_p; int output_remaining; gint *hist_p; int hist_remaining; guint skipped = 0; int bucket; int i; histogram_imager_check_dirty_flags(self); histogram_imager_require_histogram(self); hist_p = self->histogram; hist_remaining = self->width * self->height * self->oversample * self->oversample; output_p = buffer; output_remaining = buffer_size - VAR_INT_MAX_SIZE; while (hist_remaining > 0 && output_remaining > 0) { bucket = *hist_p; if (bucket) { /* We found a non-zero bucket */ if (skipped) { /* Output a skip value, if we skipped any * buckets prior to the current one. */ i = var_int_write (output_p, skipped << 1); output_p += i; output_remaining -= i; if (output_remaining < 0) break; skipped = 0; } /* Output this bucket's value, then clear it */ i = var_int_write (output_p, (bucket << 1) | 1); output_p += i; output_remaining -= i; *hist_p = 0; } else { skipped++; } hist_p++; hist_remaining--; } return output_p - buffer; } void histogram_imager_merge_stream (HistogramImager *self, const guchar *buffer, gsize buffer_size) { /* The inverse of histogram_imager_export_stream(). This follows * the skip/plot instructions in the given buffer, merging the * results with whatever happens to be in the histogram buffer. */ const guchar *input_p; gsize input_remaining; gint *hist_p; gsize hist_remaining; guint token, bucket; HistogramPlot plot; int i; histogram_imager_prepare_plots (self, &plot); hist_p = self->histogram; hist_remaining = self->width * self->height * self->oversample * self->oversample; input_p = buffer; input_remaining = buffer_size; while (hist_remaining > 0 && input_remaining > 0) { i = var_int_read (input_p, &token); input_p += i; input_remaining -= i; if (token & 1) { /* Plot into the current bucket */ token >>= 1; plot.plot_count += token; bucket = *hist_p; bucket += token; *hist_p = bucket; if (bucket > plot.density) plot.density = bucket; hist_p++; } else { /* Skip buckets */ token >>= 1; hist_p += token; } } histogram_imager_finish_plots (self, &plot); } /************************************************************************************/ /************************************************************************ Utilities */ /************************************************************************************/ static void histogram_imager_check_dirty_flags (HistogramImager *self) { /* Check dirty flags, invalidating stale data */ if (self->size_dirty_flag) { /* We've resized. Deallocate the histogram and image * if they've been allocated, and set the render and * calc dirty flags. */ if (self->histogram) { g_free (self->histogram); self->histogram = NULL; } if (self->image) { gdk_pixbuf_unref (self->image); self->image = NULL; } self->render_dirty_flag = TRUE; self->size_dirty_flag = FALSE; } } static void histogram_imager_require_histogram (HistogramImager *self) { /* Allocate a histogram if we don't have one already */ if (!self->histogram) { self->histogram = g_malloc (sizeof (self->histogram[0]) * self->width * self->height * self->oversample * self->oversample); histogram_imager_clear (self); } } void histogram_imager_clear (HistogramImager *self) { histogram_imager_check_dirty_flags (self); if (self->histogram) { memset (self->histogram, 0, sizeof (self->histogram[0]) * self->width * self->height * self->oversample * self->oversample); } self->histogram_clear_flag = TRUE; self->render_dirty_flag = TRUE; self->total_points_plotted = 0; self->peak_density = 0; g_get_current_time (&self->render_start_time); } gdouble histogram_imager_get_elapsed_time (HistogramImager *self) { GTimeVal now; g_get_current_time (&now); return ((now.tv_usec - self->render_start_time.tv_usec) / 1000000.0 + (now.tv_sec - self->render_start_time.tv_sec )); } static void histogram_imager_require_image (HistogramImager *self) { /* Allocate an image pixbuf if we don't have one already */ if (!self->image) { self->image = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, self->width, self->height); self->render_dirty_flag = TRUE; } } static void histogram_imager_require_oversample_tables (HistogramImager *self) { /* Allocate or regenerate the oversample tables as necessary. */ gboolean need_realloc = FALSE; gboolean need_regenerate = FALSE; /* Bits of precision to use in the intermediate linear values. * Increasing this increases the accuracy of the oversampled image, * to some extent, but exponentially increases memory usage for * the nonlinearize table. */ const guint32 linear_bits = 12; const guint32 nonlinearize_table_size = (1<oversample * self->oversample; if (self->oversample_tables.oversample != self->oversample) need_realloc = TRUE; if (self->oversample_tables.gamma != self->oversample_gamma) need_regenerate = TRUE; if (!self->oversample_tables.linearize || !self->oversample_tables.nonlinearize) need_realloc = TRUE; if (need_realloc) { if (self->oversample_tables.linearize) g_free (self->oversample_tables.linearize); self->oversample_tables.linearize = g_new(guint, 256); if (self->oversample_tables.nonlinearize) g_free (self->oversample_tables.nonlinearize); self->oversample_tables.nonlinearize = g_new(guint8, nonlinearize_table_size); self->oversample_tables.oversample = self->oversample; need_regenerate = TRUE; } if (need_regenerate) { int i; guint* ip; guint8* bp; gdouble gamma = self->oversample_gamma; gdouble inv_gamma = 1/gamma; /* Generate the first mapping, from 8-bit nonlinear to linear_bits linear */ ip = self->oversample_tables.linearize; for (i=0; i<256; i++) *(ip++) = (int) (pow(i / 255.0, gamma) * ((1<oversample_tables.nonlinearize; for (i=0; i #include "parameter-holder.h" G_BEGIN_DECLS #define HISTOGRAM_IMAGER_TYPE (histogram_imager_get_type ()) #define HISTOGRAM_IMAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), HISTOGRAM_IMAGER_TYPE, HistogramImager)) #define HISTOGRAM_IMAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), HISTOGRAM_IMAGER_TYPE, HistogramImagerClass)) #define IS_HISTOGRAM_IMAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), HISTOGRAM_IMAGER_TYPE)) #define IS_HISTOGRAM_IMAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), HISTOGRAM_IMAGER_TYPE)) typedef struct _HistogramImager HistogramImager; typedef struct _HistogramImagerClass HistogramImagerClass; struct _HistogramImager { ParameterHolder parent; /* Current image size */ guint width, height; guint oversample; gboolean size_dirty_flag; /* Rendering Parameters * * Changing these parameters will not affect the * histogram, only the image generated from it. */ gdouble exposure, gamma; gdouble oversample_gamma; GdkColor fgcolor, bgcolor; guint fgalpha, bgalpha; gboolean clamped; gboolean render_dirty_flag; /* Current rendering state */ gdouble total_points_plotted; gulong peak_density; GTimeVal render_start_time; guint *histogram; gboolean histogram_clear_flag; GdkPixbuf *image; /* Color table, converts from histogram samples to RGB colors */ struct { guint allocated_size; guint filled_size; guint32 *table; /* RGBA colors */ float *quality; /* Current quality parameters for every color entry */ } color_table; /* Oversampling gamma tables. For particular values of 'oversample', * and 'oversample_gamma', these tables convert from 8-bit nonlinear * channel value to higher precision linear values that are then * summed and put through a second table for conversion back to * nonlinear 8-bit. */ struct { gdouble gamma; guint oversample; guint* linearize; guint8* nonlinearize; } oversample_tables; }; struct _HistogramImagerClass { ParameterHolderClass parent_class; }; typedef struct { guint *histogram; guint hist_width; guint density; gulong plot_count; } HistogramPlot; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType histogram_imager_get_type (); HistogramImager* histogram_imager_new (); void histogram_imager_update_image (HistogramImager *self); GdkPixbuf* histogram_imager_make_thumbnail (HistogramImager *self, guint max_width, guint max_height); void histogram_imager_load_image_file (HistogramImager *self, const gchar *filename, GError **error); void histogram_imager_save_image_file (HistogramImager *self, const gchar *filename, GError **error); void exr_save_image_file (HistogramImager *hi, const gchar *filename, GError **error); void histogram_imager_get_hist_size (HistogramImager *self, int *hist_width, int *hist_height); void histogram_imager_clear (HistogramImager *self); gdouble histogram_imager_get_elapsed_time (HistogramImager *self); /* Calculate a quantitative measure of the image's current rendering * quality. The result is a nonzero floating point number. Higher numbers * indicate better images, with 1.0 indicating a reasonable default quality. * In case the image quality can't be calculated (all buckets are empty or * saturated, or the color path is zero-length) this returns G_MAXDOUBLE. * * This is calculated by measuring the average number of histogram samples * per image sample, using euclidean distances in the RGBA hypercube. * This ignores buckets that are completely empty or are full enough to * completely saturate the image. A value of 1.0 therefore indicates that * the average number of histogram samples exactly matches the number of * samples we map to on the RGBA hypercube. * * Efficiency: O(width * height), plus the time required to * update the color table. */ gdouble histogram_imager_compute_quality (HistogramImager *self); /* The imager's histogram buffer can be exported to a compact * stream format that can later be merged into an existing histogram * buffer. This is useful for merging rendering results computed * across several different machines. The buffer's format should be * architecture-independent. * * histogram_imager_export_stream() returns the number of bytes saved * in the provided buffer. If it runs out of buffer space, it will leave * the remaining samples in HistogramImager's internal buffer. All * buckets successfully exported will be emptied. */ gsize histogram_imager_export_stream (HistogramImager *self, guchar *buffer, gsize buffer_size); void histogram_imager_merge_stream (HistogramImager *self, const guchar *buffer, gsize buffer_size); /* These must be called before and after making plots, * to initialize and save the HistogramPlot structure. */ void histogram_imager_prepare_plots (HistogramImager *self, HistogramPlot *plot); void histogram_imager_finish_plots (HistogramImager *self, HistogramPlot *plot); /* A macro to quickly plot a point on the histogram. * Must be called between histogram_imager_prepare_plots * and histogram_imager_finish_plots. 'plot' is a * HistogramPlot, *not* a pointer to a HistogramPlot. * The provided X and Y must be less than the dimensions * returned by histogram_imager_get_hist_size. */ #define HISTOGRAM_IMAGER_PLOT(plot, x, y) do { \ guint bucket; \ (plot).plot_count++; \ bucket = ++(plot).histogram[(x) + (plot).hist_width * (y)]; \ if (bucket > (plot).density) { \ (plot).density = bucket; \ } \ } while (0) /************************************************************************************/ /****************************************************************** Private Methods */ /************************************************************************************/ float histogram_imager_get_pixel_scale(HistogramImager *self); G_END_DECLS #endif /* __HISTOGRAM_IMAGER_H__ */ /* The End */ fyre-1.0.1/src/explorer-history.c0000644000175000001440000003364410446431132013675 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * explorer-history.c - Implements a simple non-persistent history * tracker. History items can be recorded immediately * or on a timer. Each history item stores a timestamp, * parameters, and a small thumbnail. They are made * available to the user through a web-browser-like "Go" menu. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include "explorer.h" #include "histogram-imager.h" /* These are stored in the history_queue. The parameter string and * thumbnail are both owned by the history node. */ typedef struct { GTimeVal timestamp; /* The time at which this node was created */ GdkPixbuf* thumbnail; /* Scaled-down version of the current histogram */ gchar* params; /* Serialized image parameters */ Explorer* explorer; /* For convenience in callbacks */ } HistoryNode; struct delete_after_data { GtkWidget *menu; GtkWidget *separator; gboolean triggered; }; static void delete_after (GtkWidget *item, gpointer user_data); static HistoryNode* history_node_new (HistogramImager* map); static void history_node_apply (HistoryNode* self, HistogramImager* map); static void history_node_free (HistoryNode* self); static void on_go_back (GtkWidget *widget, Explorer *self); static void on_go_forward (GtkWidget *widget, Explorer *self); static void on_go_menu_show (GtkWidget *menu, Explorer *self); static void on_go_menu_hide (GtkWidget *menu, Explorer *self); static void on_go_menu_item (GtkWidget *menu, gpointer user_data); static void on_change_notify (ParameterHolder *holder, GParamSpec* spec, Explorer *self); static gboolean on_record_change (gpointer user_data); static void explorer_append_history (Explorer* self, HistoryNode *node); static void explorer_prune_history (Explorer* self, int max_nodes); static void explorer_update_history_sensitivity (Explorer* self); static gdouble timeval_subtract (GTimeVal *a, GTimeVal *b); static gchar* explorer_strdup_time (GTimeVal *tv); static void explorer_add_go_item (Explorer *self, GList *node_link); static void explorer_cleanup_go_items (Explorer *self); /************************************************************************************/ /***************************************************************** Public Methods ***/ /************************************************************************************/ void explorer_init_history(Explorer *self) { GtkWidget *menu = glade_xml_get_widget(self->xml, "go_menu_menu"); self->history_queue = g_queue_new(); /* Connect signal handlers */ glade_xml_signal_connect_data(self->xml, "on_go_back", G_CALLBACK(on_go_back), self); glade_xml_signal_connect_data(self->xml, "on_go_forward", G_CALLBACK(on_go_forward), self); g_signal_connect (self->map, "notify", G_CALLBACK(on_change_notify), self); g_signal_connect (menu, "show", G_CALLBACK(on_go_menu_show), self); g_signal_connect (menu, "hide", G_CALLBACK(on_go_menu_hide), self); } void explorer_dispose_history(Explorer *self) { if (self->history_timer) { g_source_remove(self->history_timer); self->history_timer = 0; } if (self->history_queue) { explorer_prune_history(self, 0); g_queue_free(self->history_queue); self->history_queue = NULL; } } /************************************************************************************/ /****************************************************************** History Nodes ***/ /************************************************************************************/ static HistoryNode* history_node_new (HistogramImager* map) { HistoryNode* self = g_new0(HistoryNode, 1); gint width, height; g_get_current_time(&self->timestamp); self->params = parameter_holder_save_string(PARAMETER_HOLDER(map)); /* Use the normal icon size plus a little extra */ gtk_icon_size_lookup(GTK_ICON_SIZE_MENU, &width, &height); width *= 1.75; height *= 1.75; self->thumbnail = histogram_imager_make_thumbnail(map, width, height); return self; } static void history_node_apply (HistoryNode* self, HistogramImager* map) { parameter_holder_load_string(PARAMETER_HOLDER(map), self->params); } static void history_node_free (HistoryNode* self) { if (self->thumbnail) { gdk_pixbuf_unref(self->thumbnail); self->thumbnail = NULL; } if (self->params) { g_free(self->params); self->params = NULL; } g_free(self); } /************************************************************************************/ /******************************************************************** History Queue */ /************************************************************************************/ static void explorer_append_history (Explorer* self, HistoryNode *node) { node->explorer = self; g_queue_push_tail(self->history_queue, node); /* Seems like a reasonable length... */ explorer_prune_history(self, 128); /* Our new node is now the current one for back/forward navigation */ self->history_current_link = g_queue_peek_tail_link(self->history_queue); explorer_update_history_sensitivity(self); } static void explorer_prune_history (Explorer* self, int max_nodes) { while (self->history_queue->length > max_nodes) { GList* link = g_queue_pop_head_link(self->history_queue); if (!link) break; if (link == self->history_current_link) self->history_current_link = NULL; history_node_free(link->data); g_list_free_1(link); } } static void explorer_update_history_sensitivity (Explorer* self) { gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "go_forward"), self->history_current_link && self->history_current_link->next); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "go_back"), self->history_current_link && self->history_current_link->prev); } /************************************************************************************/ /******************************************************************* Time Utilities */ /************************************************************************************/ static gdouble timeval_subtract(GTimeVal *a, GTimeVal *b) { return (a->tv_sec - b->tv_sec) + (a->tv_usec - b->tv_usec) / 1000000.0; } static gchar* explorer_strdup_time (GTimeVal *tv) { double units; GTimeVal now; g_get_current_time(&now); units = timeval_subtract(&now, tv); if (units < 120.0) return g_strdup_printf("%.01f seconds ago", units); units /= 60.0; if (units < 120.0) return g_strdup_printf("%.01f minutes ago", units); units /= 60.0; if (units < 120.0) return g_strdup_printf("%.02f hours ago", units); units /= 24.0; return g_strdup_printf("%.02f days ago", units); } /************************************************************************************/ /***************************************************************** Menu Maintenance */ /************************************************************************************/ static void explorer_add_go_item (Explorer *self, GList *node_link) { GtkWidget *menu = glade_xml_get_widget(self->xml, "go_menu_menu"); HistoryNode *node = node_link->data; GtkWidget *item, *image; gchar* label; /* Add the timestamp */ label = explorer_strdup_time(&node->timestamp); item = gtk_image_menu_item_new_with_label(label); g_free(label); /* Add the thumbnail */ image = gtk_image_new_from_pixbuf(node->thumbnail); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); /* Set up a callback to activate this node. * Note that its data is our node_link, not the Explorer. */ g_signal_connect(item, "activate", G_CALLBACK(on_go_menu_item), node_link); /* Add it to the menu */ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); gtk_widget_show(item); } static void delete_after (GtkWidget *item, gpointer user_data) { struct delete_after_data *data = (struct delete_after_data*) user_data; if (item == data->separator) data->triggered = TRUE; else if (data->triggered) gtk_container_remove(GTK_CONTAINER(data->menu), item); } static void explorer_cleanup_go_items (Explorer *self) { /* Remove all items in the 'go' menu after our marked separator */ GtkWidget *menu = glade_xml_get_widget(self->xml, "go_menu_menu"); struct delete_after_data data; data.menu = menu; data.separator = glade_xml_get_widget(self->xml, "history_separator"); data.triggered = FALSE; gtk_container_foreach(GTK_CONTAINER(menu), delete_after, &data); } /************************************************************************************/ /******************************************************************** GUI Callbacks */ /************************************************************************************/ static void on_go_back (GtkWidget *widget, Explorer *self) { self->history_current_link = self->history_current_link->prev; explorer_update_history_sensitivity(self); self->history_freeze = TRUE; history_node_apply(self->history_current_link->data, HISTOGRAM_IMAGER(self->map)); self->history_freeze = FALSE; } static void on_go_forward (GtkWidget *widget, Explorer *self) { self->history_current_link = self->history_current_link->next; explorer_update_history_sensitivity(self); self->history_freeze = TRUE; history_node_apply(self->history_current_link->data, HISTOGRAM_IMAGER(self->map)); self->history_freeze = FALSE; } static void on_go_menu_show (GtkWidget *menu, Explorer *self) { const int max_linear_items = 4; const int max_scaled_items = 10; int i, num_scaled_items; GList *current; gdouble t_total, t; GTimeVal *scaled_reference; HistoryNode* node; explorer_cleanup_go_items(self); /* If our queue is empty, add a new record immediately. This * will prevent us from getting an empty 'go' menu right after * startup- instead it will have a thumbnail of our defaults * or whatever image the user happened to load. This can't * go in our initialization above since that happens before * we've actually rendered anything. Putting it here is more * reliable than using a timer. */ if (self->history_queue->length < 1) explorer_append_history(self, history_node_new(HISTOGRAM_IMAGER(self->map))); /* The first few items are straight from the most recent list */ current = g_queue_peek_tail_link(self->history_queue); for (i=0; iprev; } /* The rest of the list is spread evenly over time, from the end * of the above section back to the oldest history we have. */ if (!current) return; node = current->data; scaled_reference = &node->timestamp; t_total = timeval_subtract(scaled_reference, &((HistoryNode*)g_queue_peek_head(self->history_queue))->timestamp); num_scaled_items = MIN(self->history_queue->length - max_linear_items, max_scaled_items); if (num_scaled_items <= 0) return; for (i=0; idata; t = timeval_subtract(scaled_reference, &node->timestamp); if (t > (i*t_total/num_scaled_items)) break; current = current->prev; } explorer_add_go_item(self, current); } } static void on_go_menu_hide (GtkWidget *menu, Explorer *self) { explorer_cleanup_go_items(self); } static void on_go_menu_item (GtkWidget *menu, gpointer user_data) { GList *link = user_data; HistoryNode *node = link->data; Explorer *self = node->explorer; self->history_current_link = link; explorer_update_history_sensitivity(self); self->history_freeze = TRUE; history_node_apply(self->history_current_link->data, HISTOGRAM_IMAGER(self->map)); self->history_freeze = FALSE; } static void on_change_notify (ParameterHolder *holder, GParamSpec* spec, Explorer *self) { /* In a history_freeze, we don't record changes automatically */ if (self->history_freeze) return; /* Set a timer to record this change if no others occur * immediately afterwards. This consolidates periods of * very rapid movement. */ if (self->history_timer) { g_source_remove(self->history_timer); self->history_timer = 0; } self->history_timer = g_timeout_add(150, on_record_change, self); } static gboolean on_record_change (gpointer user_data) { Explorer* self = EXPLORER(user_data); explorer_append_history(self, history_node_new(HISTOGRAM_IMAGER(self->map))); self->history_timer = 0; return FALSE; } /* The End */ fyre-1.0.1/src/color-button.c0000644000175000001440000001760210356610570012766 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * color-button.c - Interactive color selection button. This is a composite * widget that shows a color sample inside a button. When * the button is clicked, a color picker with auto-apply * modifies the color sample and sends the 'changed' signal. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "color-button.h" #include "image-fu.h" #include enum { CHANGED_SIGNAL, LAST_SIGNAL }; static void color_button_class_init(ColorButtonClass *klass); static void color_button_init(ColorButton *self); static void color_button_activate(GtkWidget *widget, ColorButton *self); static void color_changed(GtkWidget *widget, ColorButton *self); static void color_response(GtkWidget *widget, gint response, ColorButton *self); static void on_realize(GtkWidget *widget, ColorButton *self); static void update_color_sample(ColorButton *self); static guint color_button_signals[LAST_SIGNAL] = { 0 }; GType color_button_get_type(void) { static GType cb_type = 0; if (!cb_type) { static const GTypeInfo cb_info = { sizeof(ColorButtonClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) color_button_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(ColorButton), 0, (GInstanceInitFunc) color_button_init, }; cb_type = g_type_register_static(GTK_TYPE_BUTTON, "ColorButton", &cb_info, 0); } return cb_type; } static void color_button_class_init(ColorButtonClass *klass) { color_button_signals[CHANGED_SIGNAL] = g_signal_new("changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(ColorButtonClass, color_button), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void color_button_init(ColorButton *self) { self->ignore_changes = FALSE; g_signal_connect(G_OBJECT(self), "clicked", G_CALLBACK(color_button_activate), (gpointer) self); self->frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(self->frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(self), GTK_WIDGET(self->frame)); self->drawing_area = gtk_drawing_area_new(); gtk_drawing_area_size(GTK_DRAWING_AREA(self->drawing_area), 16, 16); gtk_container_add(GTK_CONTAINER(self->frame), GTK_WIDGET(self->drawing_area)); g_signal_connect(self->drawing_area, "realize", G_CALLBACK(on_realize), self); } static void on_realize(GtkWidget *widget, ColorButton *self) { update_color_sample(self); } static void update_color_sample(ColorButton *self) { /* Composite together a pixbuf showing a sample of this color, with alpha, * and set it as the drawing area's background pixmap. */ GdkPixbuf *color; GdkPixmap *pixmap; const int width = CHECKERBOARD_TILE_SIZE * 2; const int height = CHECKERBOARD_TILE_SIZE * 2; /* First make a 1x1 pixbuf of our color */ color = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height); gdk_pixbuf_fill(color, ((self->color.red >> 8) << 24) | ((self->color.green >> 8) << 16) | ((self->color.blue >> 8) << 8) | ((self->alpha >> 8) )); /* Blend this on top of a checkerboard pattern */ image_add_checkerboard(color); /* Make a pixbuf out of it */ pixmap = gdk_pixmap_new(self->drawing_area->window, width, height, -1); gdk_pixbuf_render_to_drawable(color, pixmap, self->drawing_area->style->fg_gc[GTK_STATE_NORMAL], 0, 0, 0, 0, width, height, GDK_RGB_DITHER_NORMAL, 0, 0); /* Set it as a backing pixmap */ gdk_window_set_back_pixmap(self->drawing_area->window, pixmap, FALSE); gdk_window_clear(self->drawing_area->window); gdk_pixbuf_unref(color); gdk_pixmap_unref(pixmap); } GtkWidget* color_button_new_with_defaults(const char *title, GdkColor *default_color, guint16 default_alpha) { ColorButton *self = g_object_new(color_button_get_type(), NULL); self->title = g_strdup(title); self->color = *default_color; self->alpha = default_alpha; return GTK_WIDGET(self); } GtkWidget* color_button_new(const char *title) { GdkColor black = {0,0,0,0}; return color_button_new_with_defaults(title, &black, 0xFFFF); } static void color_button_activate(GtkWidget *widget, ColorButton *self) { GtkWidget *colorsel; /* Only allow one dialog open at a time */ if (self->dialog) return; self->dialog = gtk_color_selection_dialog_new(self->title); colorsel = GTK_COLOR_SELECTION_DIALOG(self->dialog)->colorsel; gtk_color_selection_set_has_opacity_control(GTK_COLOR_SELECTION(colorsel), TRUE); g_signal_connect(G_OBJECT(self->dialog), "response", G_CALLBACK(color_response), (gpointer) self); gtk_color_selection_set_update_policy(GTK_COLOR_SELECTION(colorsel), GTK_UPDATE_CONTINUOUS); g_signal_connect(G_OBJECT(colorsel), "color-changed", G_CALLBACK(color_changed), (gpointer) self); /* Set the current and previous colors in the dialog */ self->previous_color = self->color; self->previous_alpha = self->alpha; self->ignore_changes = TRUE; gtk_color_selection_set_current_alpha(GTK_COLOR_SELECTION(colorsel), self->alpha); gtk_color_selection_set_previous_alpha(GTK_COLOR_SELECTION(colorsel), self->previous_alpha); gtk_color_selection_set_current_color(GTK_COLOR_SELECTION(colorsel), &self->color); gtk_color_selection_set_previous_color(GTK_COLOR_SELECTION(colorsel), &self->previous_color); self->ignore_changes = FALSE; /* Is there a better way to hide the help button? */ gtk_widget_show_all(self->dialog); gtk_widget_hide(GTK_COLOR_SELECTION_DIALOG(self->dialog)->help_button); } static void color_response(GtkWidget *widget, gint response, ColorButton *self) { if (response == GTK_RESPONSE_CANCEL) { color_button_set_color(self, &self->previous_color); color_button_set_alpha(self, self->previous_alpha); } gtk_widget_destroy(self->dialog); self->dialog = NULL; } static void color_changed(GtkWidget *widget, ColorButton *self) { GdkColor gcolor; if (!self->ignore_changes) { gtk_color_selection_get_current_color(GTK_COLOR_SELECTION(widget), &gcolor); self->alpha = gtk_color_selection_get_current_alpha(GTK_COLOR_SELECTION(widget)); color_button_set_color(self, &gcolor); } } void color_button_get_color(ColorButton *self, GdkColor *c) { *c = self->color; } guint16 color_button_get_alpha(ColorButton *self) { return self->alpha; } void color_button_set_color(ColorButton *self, GdkColor *c) { self->color = *c; update_color_sample(self); g_signal_emit(G_OBJECT(self), color_button_signals[CHANGED_SIGNAL], 0); } void color_button_set_alpha(ColorButton *self, guint16 alpha) { self->alpha = alpha; update_color_sample(self); g_signal_emit(G_OBJECT(self), color_button_signals[CHANGED_SIGNAL], 0); } void color_button_set_color_and_alpha(ColorButton *self, GdkColor *c, guint16 alpha) { self->alpha = alpha; self->color = *c; update_color_sample(self); g_signal_emit(G_OBJECT(self), color_button_signals[CHANGED_SIGNAL], 0); } /* The End */ fyre-1.0.1/src/color-button.h0000644000175000001440000000550510356610325012770 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * color-button.h - Interactive color selection button. This is a composite * widget that shows a color sample inside a button. When * the button is clicked, a color picker with auto-apply * modifies the color sample and sends the 'changed' signal. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __COLOR_BUTTON_H__ #define __COLOR_BUTTON_H__ #include #include #include G_BEGIN_DECLS #define COLOR_BUTTON_TYPE (color_button_get_type ()) #define COLOR_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COLOR_BUTTON_TYPE, ColorButton)) #define COLOR_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), COLOR_BUTTON_TYPE, ColorButtonClass)) #define IS_COLOR_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), COLOR_BUTTON_TYPE)) #define IS_COLOR_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), COLOR_BUTTON_TYPE)) typedef struct _ColorButton ColorButton; typedef struct _ColorButtonClass ColorButtonClass; struct _ColorButton { GtkButton button; GtkWidget *frame; GtkWidget *drawing_area; GtkWidget *dialog; gchar *title; GdkColor previous_color; GdkColor color; guint16 previous_alpha; guint16 alpha; gboolean ignore_changes; }; struct _ColorButtonClass { GtkButtonClass parent_class; void (* color_button) (ColorButton *cb); }; GType color_button_get_type(void); GtkWidget* color_button_new_with_defaults(const char *title, GdkColor *default_color, guint16 default_alpha); GtkWidget* color_button_new(const char *title); void color_button_set_color(ColorButton *cb, GdkColor *c); void color_button_get_color(ColorButton *cb, GdkColor *c); void color_button_set_alpha(ColorButton *cb, guint16 alpha); guint16 color_button_get_alpha(ColorButton *cb); void color_button_set_color_and_alpha(ColorButton *cb, GdkColor *c, guint16 alpha); G_END_DECLS #endif /* __COLOR_BUTTON_H__ */ /* The End */ fyre-1.0.1/src/gui-util.c0000644000175000001440000000373610356611656012107 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * gui-util.c - Small generic GUI utilities used by other modules * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include "gui-util.h" #include "prefix.h" /* Create a list of all icons we have, in several different sizes, * and let GDK pick the best one(s) to use for this window. */ void fyre_set_icon(GtkWidget* window) { static GList *icons = NULL; GdkPixbuf *pixbuf; #define LOAD_ICON(name) \ pixbuf = gdk_pixbuf_new_from_file(name, NULL); \ if (pixbuf) \ icons = g_list_append(icons, pixbuf); /* Only load the icons once */ if (!icons) { LOAD_ICON(FYRE_DATADIR "/fyre-48x48.png"); LOAD_ICON(FYRE_DATADIR "/fyre-32x32.png"); LOAD_ICON(FYRE_DATADIR "/fyre-16x16.png"); } if (!icons) { LOAD_ICON(BR_DATADIR( "/fyre-48x48.png" )); LOAD_ICON(BR_DATADIR( "/fyre-32x32.png" )); LOAD_ICON(BR_DATADIR( "/fyre-16x16.png" )); } #undef LOAD_ICON gdk_window_set_icon_list(window->window, icons); } /* Set the icon once the window has been mapped */ void fyre_set_icon_later(GtkWidget* window) { g_signal_connect(G_OBJECT(window), "map", G_CALLBACK(fyre_set_icon), NULL); } /* The End */ fyre-1.0.1/src/gui-util.h0000644000175000001440000000222310356610404012070 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * gui-util.h - Small generic GUI utilities used by other modules * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __GUI_UTIL_H__ #define __GUI_UTIL_H__ #include void fyre_set_icon (GtkWidget* window); void fyre_set_icon_later (GtkWidget* window); #endif /* __GUI_UTIL_H__ */ /* The End */ fyre-1.0.1/src/parameter-holder.c0000644000175000001440000003763210356611735013603 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * parameter-holder.c - A base class for GObjects whose properties include * algorithm parameters that can be serialized to key/value * pairs and interpolated between. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "parameter-holder.h" #include #include #include #include static void parameter_holder_class_init(ParameterHolderClass *klass); static void value_transform_string_uint (const GValue *src_value, GValue *dest_value); static void value_transform_string_double (const GValue *src_value, GValue *dest_value); static void value_transform_string_boolean (const GValue *src_value, GValue *dest_value); static void value_transform_string_ulong (const GValue *src_value, GValue *dest_value); static void value_transform_string_enum (const GValue *src_value, GValue *dest_value); static gchar** parameter_line_parse (const gchar* line); static GHashTable* parameter_hash_from_string (const gchar* params); static void parameter_holder_set_with_spec (ParameterHolder *self, GParamSpec *spec, const gchar* value); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType parameter_holder_get_type(void) { static GType dj_type = 0; if (!dj_type) { static const GTypeInfo dj_info = { sizeof(ParameterHolderClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) parameter_holder_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(ParameterHolder), 0, NULL, /* instance init */ }; dj_type = g_type_register_static(G_TYPE_OBJECT, "ParameterHolder", &dj_info, 0); } return dj_type; } static void parameter_holder_class_init(ParameterHolderClass *klass) { GObjectClass *object_class; object_class = (GObjectClass*) klass; /* Register a few custom GValueTransforms, since glib doesn't have * built-in transforms from strings to other types. */ g_value_register_transform_func(G_TYPE_STRING, G_TYPE_UINT, value_transform_string_uint); g_value_register_transform_func(G_TYPE_STRING, G_TYPE_DOUBLE, value_transform_string_double); g_value_register_transform_func(G_TYPE_STRING, G_TYPE_BOOLEAN, value_transform_string_boolean); g_value_register_transform_func(G_TYPE_STRING, G_TYPE_ULONG, value_transform_string_ulong); g_value_register_transform_func(G_TYPE_STRING, G_TYPE_ENUM, value_transform_string_enum); } ParameterHolder* parameter_holder_new() { return PARAMETER_HOLDER(g_object_new(parameter_holder_get_type(), NULL)); } void parameter_holder_pair_free(ParameterHolderPair *self) { if (self->a) g_object_unref(self->a); if (self->b) g_object_unref(self->b); g_free(self); } /************************************************************************************/ /************************************************************** Transform Functions */ /************************************************************************************/ static void value_transform_string_uint(const GValue *src_value, GValue *dest_value) { dest_value->data[0].v_uint = strtoul(src_value->data[0].v_pointer, NULL, 10); } static void value_transform_string_double(const GValue *src_value, GValue *dest_value) { dest_value->data[0].v_double = strtod(src_value->data[0].v_pointer, NULL); } static void value_transform_string_boolean(const GValue *src_value, GValue *dest_value) { if (!g_strcasecmp(src_value->data[0].v_pointer, "true")) { dest_value->data[0].v_int = TRUE; } else if (!g_strcasecmp(src_value->data[0].v_pointer, "false")) { dest_value->data[0].v_int = FALSE; } else { dest_value->data[0].v_int = strtoul(src_value->data[0].v_pointer, NULL, 10) != 0; } } static void value_transform_string_ulong(const GValue *src_value, GValue *dest_value) { dest_value->data[0].v_ulong = strtoul(src_value->data[0].v_pointer, NULL, 10); } static void value_transform_string_enum(const GValue *src_value, GValue *dest_value) { GEnumClass *klass = g_type_class_ref(G_VALUE_TYPE(dest_value)); GEnumValue *enum_value = g_enum_get_value_by_name(klass, src_value->data[0].v_pointer); if (enum_value) dest_value->data[0].v_int = enum_value->value; else dest_value->data[0].v_int = 0; g_type_class_unref(klass); } /************************************************************************************/ /*********************************************************************** Properties */ /************************************************************************************/ void parameter_holder_set(ParameterHolder *self, const gchar* property, const gchar* value) { /* Set a property, casting a string value to whatever type the property expects */ GParamSpec *spec; /* Look up the GParamSpec for this property */ spec = g_object_class_find_property(G_OBJECT_GET_CLASS(self), property); if (!spec) { g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Ignoring attempt to set undefined property '%s' to '%s'", property, value); return; } parameter_holder_set_with_spec(self, spec, value); } static void parameter_holder_set_with_spec (ParameterHolder *self, GParamSpec *spec, const gchar* value) { GValue strval, converted; memset(&strval, 0, sizeof(GValue)); memset(&converted, 0, sizeof(GValue)); g_value_init(&strval, G_TYPE_STRING); g_value_init(&converted, spec->value_type); g_value_set_string(&strval, value); if (g_value_transform(&strval, &converted)) { g_object_set_property(G_OBJECT(self), spec->name, &converted); } else { g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Couldn't convert value '%s' for property '%s'", value, spec->name); } g_value_unset(&strval); g_value_unset(&converted); } static gchar** parameter_line_parse(const gchar* line) { /* Split a line into key and value, returning a string vector */ gchar** tokens = g_strsplit(line, "=", 2); if (!(tokens[0] && tokens[1])) { /* Need at least two tokens, ignore this invalid line */ g_strfreev(tokens); return NULL; } g_strstrip(tokens[0]); g_strstrip(tokens[1]); return tokens; } static GHashTable* parameter_hash_from_string (const gchar* params) { /* Parse a multiline parameter string into a key, value hash */ gchar** lines = g_strsplit(params, "\n", 0); gchar** line; GHashTable* hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); for (line=lines; *line; line++) { gchar** tokens = parameter_line_parse(*line); if (tokens) g_hash_table_insert(hash, tokens[0], tokens[1]); /* Free the vector, but keep the strings themselves */ g_free(tokens); } g_strfreev(lines); return hash; } void parameter_holder_set_from_line(ParameterHolder *self, const gchar *line) { gchar** tokens = parameter_line_parse(line); if (tokens) { parameter_holder_set(self, tokens[0], tokens[1]); g_strfreev(tokens); } } void parameter_holder_reset_to_defaults(ParameterHolder *self) { /* Reset all G_PARAM_CONSTRUCT properties to their default values */ GParamSpec** properties; guint n_properties; int i; GValue val; properties = g_object_class_list_properties(G_OBJECT_GET_CLASS(self), &n_properties); for (i=0; iflags & G_PARAM_CONSTRUCT) { /* Make a GValue with the default in it */ memset(&val, 0, sizeof(val)); g_value_init(&val, properties[i]->value_type); g_param_value_set_default(properties[i], &val); g_object_set_property(G_OBJECT(self), properties[i]->name, &val); g_value_unset(&val); } } g_free(properties); } void parameter_holder_interpolate_linear(ParameterHolder *self, double alpha, ParameterHolderPair *p) { /* A ParameterInterpolator function that takes a ParameterHolderPair as its parameter. * Linearly interpolates between the points 'a' and 'b' in the pair. */ GParamSpec** properties; guint n_properties; int i; GValue a_val, b_val, self_val; properties = g_object_class_list_properties(G_OBJECT_GET_CLASS(self), &n_properties); for (i=0; iflags & PARAM_INTERPOLATE) { /* Initialize a place to put our source and destination values */ memset(&a_val, 0, sizeof(a_val)); g_value_init(&a_val, properties[i]->value_type); memset(&b_val, 0, sizeof(b_val)); g_value_init(&b_val, properties[i]->value_type); memset(&self_val, 0, sizeof(self_val)); g_value_init(&self_val, properties[i]->value_type); /* Get a and b's current values for this parameter */ g_object_get_property(G_OBJECT(p->a), properties[i]->name, &a_val); g_object_get_property(G_OBJECT(p->b), properties[i]->name, &b_val); /* Now pick a type-dependent interpolation procedure... */ if (properties[i]->value_type == G_TYPE_DOUBLE) { g_value_set_double(&self_val, g_value_get_double(&a_val) * (1-alpha) + g_value_get_double(&b_val) * (alpha)); } else if (properties[i]->value_type == G_TYPE_BOOLEAN) { if (alpha < 0.5) g_value_set_boolean(&self_val, g_value_get_boolean(&a_val)); else g_value_set_boolean(&self_val, g_value_get_boolean(&b_val)); } else if (properties[i]->value_type == GDK_TYPE_COLOR) { GdkColor *color_a = g_value_get_boxed(&a_val); GdkColor *color_b = g_value_get_boxed(&b_val); GdkColor interp; interp.red = color_a->red * (1-alpha) + color_b->red * alpha; interp.green = color_a->green * (1-alpha) + color_b->green * alpha; interp.blue = color_a->blue * (1-alpha) + color_b->blue * alpha; g_value_set_boxed(&self_val, &interp); } else if (properties[i]->value_type == G_TYPE_UINT) { g_value_set_uint(&self_val, (guint) (g_value_get_uint(&a_val) * (1-alpha) + g_value_get_uint(&b_val) * (alpha) + 0.5)); } else if (G_TYPE_IS_ENUM(properties[i]->value_type)) { /* We can't interpolate between enums but, like bools, they can * be changed during the animation. */ if (alpha < 0.5) g_value_set_enum(&self_val, g_value_get_enum(&a_val)); else g_value_set_enum(&self_val, g_value_get_enum(&b_val)); } else { g_log(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, "Can't interpolate values of type %s", g_type_name(properties[i]->value_type)); g_value_unset(&a_val); g_value_unset(&b_val); continue; } /* Save the interpolated value */ g_object_set_property(G_OBJECT(self), properties[i]->name, &self_val); g_value_unset(&a_val); g_value_unset(&b_val); g_value_unset(&self_val); } } g_free(properties); } gchar* parameter_holder_save_string(ParameterHolder *self) { /* Create a new string consisting of key-value pairs, one per line, * listing the value of all parameters that are no longer set to * their default value. This string can be loaded back into * parameter_holder_load_string to recreate the same property values. */ gchar* joined; gchar** lines; guint n_properties; GParamSpec** properties; int i, n_lines; GValue val, strval; /* Get a list of all properties, and use that to allocate an array of lines * large enough to handle the worst case, where each property has a non-default value */ properties = g_object_class_list_properties(G_OBJECT_GET_CLASS(self), &n_properties); lines = g_malloc0(sizeof(lines[0]) * (n_properties+1)); /* Search for non-default properties, creating lines for each */ n_lines = 0; for (i=0; iflags & PARAM_SERIALIZED) { memset(&val, 0, sizeof(val)); g_value_init(&val, properties[i]->value_type); g_object_get_property(G_OBJECT(self), properties[i]->name, &val); if (!g_param_value_defaults(properties[i], &val)) { /* Yay, we have a readable and writeable non-default value. Convert it to a string */ memset(&strval, 0, sizeof(strval)); g_value_init(&strval, G_TYPE_STRING); g_value_transform(&val, &strval); lines[n_lines++] = g_strdup_printf("%s = %s", properties[i]->name, g_value_get_string(&strval)); g_value_unset(&strval); } g_value_unset(&val); } } lines[n_lines] = NULL; joined = g_strjoinv("\n", lines); g_free(properties); g_strfreev(lines); return joined; } void parameter_holder_load_string(ParameterHolder *self, const gchar *params) { /* Load all recognized parameters from a string given in the same * format as the one produced by save_parameters(). All parameters * not mentioned will be reset to their defaults. */ GHashTable* hash; GParamSpec** properties; gchar* hash_value; guint n_properties; int i; GValue val; hash = parameter_hash_from_string(params); properties = g_object_class_list_properties(G_OBJECT_GET_CLASS(self), &n_properties); for (i=0; iname); if (hash_value) { /* Yep. Load it from the string */ parameter_holder_set_with_spec(self, properties[i], hash_value); } else if (properties[i]->flags & G_PARAM_CONSTRUCT) { /* Set it from the default */ memset(&val, 0, sizeof(val)); g_value_init(&val, properties[i]->value_type); g_param_value_set_default(properties[i], &val); g_object_set_property(G_OBJECT(self), properties[i]->name, &val); g_value_unset(&val); } } g_free(properties); g_hash_table_destroy(hash); } ToolInfoPH* parameter_holder_get_tools(ParameterHolder *self) { ParameterHolderClass *class = PARAMETER_HOLDER_CLASS(G_OBJECT_GET_CLASS(self)); return class->get_tools(); } void param_spec_set_group (GParamSpec *pspec, const gchar *group_name) { g_param_spec_set_qdata(pspec, g_quark_from_static_string("group-name"), (gpointer) group_name); } void param_spec_set_increments (GParamSpec *pspec, gdouble step, gdouble page, int digits) { ParameterIncrements *pi = g_new(ParameterIncrements, 1); pi->step = step; pi->page = page; pi->digits = digits; g_param_spec_set_qdata_full(pspec, g_quark_from_static_string("increments"), pi, g_free); } void param_spec_set_dependency (GParamSpec *pspec, const gchar *dependency_name) { g_param_spec_set_qdata(pspec, g_quark_from_static_string("dependency"), (gpointer) dependency_name); } const gchar* param_spec_get_group (GParamSpec *pspec) { return g_param_spec_get_qdata(pspec, g_quark_from_static_string("group-name")); } const ParameterIncrements* param_spec_get_increments (GParamSpec *pspec) { return g_param_spec_get_qdata(pspec, g_quark_from_static_string("increments")); } const gchar* param_spec_get_dependency (GParamSpec *pspec) { return g_param_spec_get_qdata(pspec, g_quark_from_static_string("dependency")); } /* The End */ fyre-1.0.1/src/parameter-holder.h0000644000175000001440000001235010356610457013576 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * parameter-holder.h - A base class for GObjects whose properties include * algorithm parameters that can be serialized to key/value * pairs and interpolated between. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __PARAMETER_HOLDER_H__ #define __PARAMETER_HOLDER_H__ #include G_BEGIN_DECLS #define PARAMETER_HOLDER_TYPE (parameter_holder_get_type ()) #define PARAMETER_HOLDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PARAMETER_HOLDER_TYPE, ParameterHolder)) #define PARAMETER_HOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PARAMETER_HOLDER_TYPE, ParameterHolderClass)) #define IS_PARAMETER_HOLDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PARAMETER_HOLDER_TYPE)) #define IS_PARAMETER_HOLDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PARAMETER_HOLDER_TYPE)) typedef struct _ParameterHolder ParameterHolder; typedef struct _ParameterHolderClass ParameterHolderClass; typedef struct _ToolInput { double delta_x, delta_y; double absolute_x, absolute_y; double click_relative_x, click_relative_y; double delta_time; GdkModifierType state; } ToolInput; struct _ParameterHolder { GObject object; }; typedef void (ToolHandlerPH)(ParameterHolder *self, ToolInput *i); typedef enum { TOOL_USE_MOTION_EVENTS = 1 << 0, TOOL_USE_IDLE = 1 << 1, } ToolFlags; typedef struct _ToolInfoPH { gchar *menu_label; ToolHandlerPH *handler; ToolFlags flags; } ToolInfoPH; struct _ParameterHolderClass { GObjectClass parent_class; /* Overrideable methods */ ToolInfoPH* (*get_tools) (); }; typedef void (ParameterInterpolator)(ParameterHolder *self, double alpha, gpointer user_data); #define PARAMETER_INTERPOLATOR(x) ((ParameterInterpolator*)(x)) typedef struct { ParameterHolder *a, *b; } ParameterHolderPair; /* Custom G_PARAM flags */ #define PARAM_SERIALIZED (1 << (G_PARAM_USER_SHIFT + 0)) /* Parameters we're interested in serializing */ #define PARAM_INTERPOLATE (1 << (G_PARAM_USER_SHIFT + 1)) /* Parameters we're interested in interpolating */ #define PARAM_IN_GUI (1 << (G_PARAM_USER_SHIFT + 2)) /* Parameters that should be visible in the GUI */ /* This is attached to the "increments" quark using param_spec_set_increments */ typedef struct { gdouble step, page; int digits; } ParameterIncrements; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType parameter_holder_get_type (); ParameterHolder* parameter_holder_new (); void parameter_holder_pair_free (ParameterHolderPair *self); void parameter_holder_reset_to_defaults (ParameterHolder *self); void parameter_holder_set (ParameterHolder *self, const gchar *property, const gchar *value); void parameter_holder_set_from_line (ParameterHolder *self, const gchar *line); void parameter_holder_load_string (ParameterHolder *self, const gchar *params); gchar* parameter_holder_save_string (ParameterHolder *self); void parameter_holder_interpolate_linear (ParameterHolder *self, gdouble alpha, ParameterHolderPair *p); ToolInfoPH* parameter_holder_get_tools (ParameterHolder *self); /* * These functions make it easy to assign extra metadata to GParamSpecs * that can be used when automatically building GUIs for ParameterHolder instances. */ void param_spec_set_group (GParamSpec *pspec, const gchar *group_name); void param_spec_set_increments (GParamSpec *pspec, gdouble step, gdouble page, int digits); void param_spec_set_dependency (GParamSpec *pspec, const gchar *dependency_name); const gchar* param_spec_get_group (GParamSpec *pspec); const ParameterIncrements* param_spec_get_increments (GParamSpec *pspec); const gchar* param_spec_get_dependency (GParamSpec *pspec); G_END_DECLS #endif /* __PARAMETER_HOLDER_H__ */ /* The End */ fyre-1.0.1/src/cell-renderer-transition.c0000644000175000001440000002724210446431132015246 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * cell-renderer-transition.c - A GtkCellRenderer for viewing a keyframe's transition, * including the transition curve and duration. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "cell-renderer-transition.h" #include static void cell_renderer_transition_class_init(CellRendererTransitionClass *klass); static void cell_renderer_transition_init(CellRendererTransition *self); static void cell_renderer_transition_finalize (GObject *object); static void cell_renderer_transition_get_property (GObject *object, guint param_id, GValue *value, GParamSpec *pspec); static void cell_renderer_transition_set_property (GObject *object, guint param_id, const GValue *value, GParamSpec *pspec); static void cell_renderer_transition_get_size (GtkCellRenderer *cell, GtkWidget *widget, GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height); static void cell_renderer_transition_render (GtkCellRenderer *cell, GdkWindow *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags); static PangoLayout* cell_renderer_transition_get_text_layout (CellRendererTransition *self, GtkWidget *widget); static void cell_renderer_transition_render_spline (CellRendererTransition *self, GdkWindow *window, GtkWidget *widget, GtkStateType state, GdkRectangle *area); enum { PROP_0, PROP_SPLINE, PROP_DURATION, PROP_SPLINE_SIZE, }; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType cell_renderer_transition_get_type(void) { static GType cr_type = 0; if (!cr_type) { static const GTypeInfo cr_info = { sizeof(CellRendererTransitionClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) cell_renderer_transition_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(CellRendererTransition), 0, (GInstanceInitFunc) cell_renderer_transition_init, }; cr_type = g_type_register_static(GTK_TYPE_CELL_RENDERER, "CellRendererTransition", &cr_info, 0); } return cr_type; } static void cell_renderer_transition_class_init(CellRendererTransitionClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (klass); object_class->finalize = cell_renderer_transition_finalize; object_class->get_property = cell_renderer_transition_get_property; object_class->set_property = cell_renderer_transition_set_property; cell_class->get_size = cell_renderer_transition_get_size; cell_class->render = cell_renderer_transition_render; g_object_class_install_property(object_class, PROP_DURATION, g_param_spec_double("duration", "Duration", "Duration of this keyframe's transition", 0, G_MAXDOUBLE, 0, G_PARAM_READWRITE)); g_object_class_install_property(object_class, PROP_SPLINE, g_param_spec_boxed("spline", "Spline", "The spline object to draw this transition's curve with", SPLINE_TYPE, G_PARAM_READWRITE)); g_object_class_install_property(object_class, PROP_SPLINE_SIZE, g_param_spec_uint("spline-size", "Spline size", "The width and height to draw splines at", 0, 1000, 96, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); } static void cell_renderer_transition_init(CellRendererTransition *self) { /* Set a default spline */ self->spline = spline_copy(&spline_template_linear); } GtkCellRenderer* cell_renderer_transition_new() { return GTK_CELL_RENDERER(g_object_new(cell_renderer_transition_get_type(), NULL)); } static void cell_renderer_transition_finalize(GObject *object) { CellRendererTransition *self = CELL_RENDERER_TRANSITION(object); if (self->spline) { spline_free(self->spline); self->spline = NULL; } } /************************************************************************************/ /*********************************************************************** Properties */ /************************************************************************************/ static void cell_renderer_transition_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { CellRendererTransition *self = CELL_RENDERER_TRANSITION(object); switch (prop_id) { case PROP_SPLINE: g_value_set_boxed(value, self->spline); break; case PROP_DURATION: g_value_set_double(value, self->duration); break; case PROP_SPLINE_SIZE: g_value_set_uint(value, self->spline_size); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void cell_renderer_transition_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { CellRendererTransition *self = CELL_RENDERER_TRANSITION(object); switch (prop_id) { case PROP_SPLINE: if (self->spline) spline_free(self->spline); self->spline = spline_copy(g_value_get_boxed(value)); break; case PROP_DURATION: self->duration = g_value_get_double(value); break; case PROP_SPLINE_SIZE: self->spline_size = g_value_get_uint(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /************************************************************************************/ /********************************************************** GtkCellRenderer Methods */ /************************************************************************************/ static void cell_renderer_transition_get_size(GtkCellRenderer *cell, GtkWidget *widget, GdkRectangle *cell_area, gint *x_offset, gint *y_offset, gint *width, gint *height) { CellRendererTransition *self = CELL_RENDERER_TRANSITION(cell); PangoLayout *layout = cell_renderer_transition_get_text_layout(self, widget); PangoRectangle text_rect; pango_layout_get_pixel_extents(layout, NULL, &text_rect); if (width) *width = GTK_CELL_RENDERER(self)->xpad * 2 + MAX(text_rect.width, self->spline_size); if (height) *height = GTK_CELL_RENDERER(self)->ypad * 2 + text_rect.height + self->spline_size; g_object_unref(layout); } static void cell_renderer_transition_render(GtkCellRenderer *cell, GdkWindow *window, GtkWidget *widget, GdkRectangle *background_area, GdkRectangle *cell_area, GdkRectangle *expose_area, GtkCellRendererState flags) { CellRendererTransition *self = CELL_RENDERER_TRANSITION(cell); PangoLayout *layout = cell_renderer_transition_get_text_layout(self, widget); GtkStateType state; PangoRectangle text_rect; GdkRectangle spline_rect; /* Determine the correct state to render our text in, based on * the cell's selectedness and the widget's current state. * This was copied from GtkCellRendererText. */ if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED) { if (GTK_WIDGET_HAS_FOCUS (widget)) state = GTK_STATE_SELECTED; else state = GTK_STATE_ACTIVE; } else { if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE) state = GTK_STATE_INSENSITIVE; else state = GTK_STATE_NORMAL; } /* Calculate width and height for the spline and text */ pango_layout_get_pixel_extents(layout, NULL, &text_rect); spline_rect.width = self->spline_size; spline_rect.height = self->spline_size; /* Center the spline and text, with the text just above the spline */ text_rect.x = spline_rect.x = cell_area->x + (cell_area->width - spline_rect.width)/2; text_rect.y = cell_area->y + (cell_area->height - spline_rect.height - text_rect.height)/2; spline_rect.y = text_rect.y + text_rect.height; gtk_paint_layout(widget->style, window, state, TRUE, cell_area, widget, "cellrenderertransition", text_rect.x, text_rect.y, layout); gdk_draw_rectangle(window, GTK_WIDGET(widget)->style->dark_gc[state], FALSE, spline_rect.x, spline_rect.y, spline_rect.width, spline_rect.height); cell_renderer_transition_render_spline(self, window, widget, state, &spline_rect); g_object_unref(layout); } /************************************************************************************/ /***************************************************************** Internal Methods */ /************************************************************************************/ static PangoLayout* cell_renderer_transition_get_text_layout (CellRendererTransition *self, GtkWidget *widget) { /* Create and return a PangoLayout with the cell's text */ PangoLayout *layout; gchar *text; text = g_strdup_printf("%.02f s", (gfloat) self->duration); layout = gtk_widget_create_pango_layout(widget, text); g_free(text); pango_layout_set_width (layout, -1); return layout; } static void cell_renderer_transition_render_spline (CellRendererTransition *self, GdkWindow *window, GtkWidget *widget, GtkStateType state, GdkRectangle *area) { GtkStyle *style = GTK_WIDGET(widget)->style; gfloat *interpolated; GdkPoint *points; int i; /* Get enough points to have one per column of pixels */ interpolated = g_malloc(sizeof(gfloat) * area->width); spline_solve_and_eval_all(self->spline, area->width, interpolated); /* Map those into our area rectangle */ points = g_malloc(sizeof(GdkPoint) * area->width); for (i=0; iwidth; i++) { points[i].x = area->x + area->width * i / area->width; points[i].y = area->y + area->height * (1 - interpolated[i]); } gdk_draw_lines(window, style->fg_gc[state], points, area->width); g_free(interpolated); g_free(points); } /* The End */ fyre-1.0.1/src/cell-renderer-transition.h0000644000175000001440000000463510356610311015252 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * cell-renderer-transition.h - A GtkCellRenderer for viewing a keyframe's transition, * including the transition curve and duration. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __CELL_RENDERER_TRANSITION_H__ #define __CELL_RENDERER_TRANSITION_H__ #include #include #include #include "spline.h" G_BEGIN_DECLS #define CELL_RENDERER_TRANSITION_TYPE (cell_renderer_transition_get_type ()) #define CELL_RENDERER_TRANSITION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CELL_RENDERER_TRANSITION_TYPE, CellRendererTransition)) #define CELL_RENDERER_TRANSITION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CELL_RENDERER_TRANSITION_TYPE, CellRendererTransitionClass)) #define IS_CELL_RENDERER_TRANSITION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CELL_RENDERER_TRANSITION_TYPE)) #define IS_CELL_RENDERER_TRANSITION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CELL_RENDERER_TRANSITION_TYPE)) typedef struct _CellRendererTransition CellRendererTransition; typedef struct _CellRendererTransitionClass CellRendererTransitionClass; struct _CellRendererTransition { GtkCellRenderer parent; double duration; Spline *spline; guint spline_size; }; struct _CellRendererTransitionClass { GtkCellRendererClass parent_class; void (* cell_renderer_transition) (CellRendererTransition *cb); }; GType cell_renderer_transition_get_type(); GtkCellRenderer* cell_renderer_transition_new(); G_END_DECLS #endif /* __CELL_RENDERER_TRANSITION_H__ */ /* The End */ fyre-1.0.1/src/explorer-tools.c0000644000175000001440000003245410356611641013337 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * explorer-tools.c - Implementation for the GUI 'tools' that allow * direct interaction with the mouse. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "explorer.h" #include "de-jong.h" #include #include #include typedef void (ToolHandler)(Explorer *self, ToolInput *i); typedef struct _ToolInfo { gchar *menu_name; ToolHandler *handler; ToolFlags flags; } ToolInfo; static const ToolInfo* explorer_get_current_tool(Explorer *self); static void explorer_fill_toolinput_relative_positions(Explorer *self, ToolInput *ti); static gboolean on_motion_notify(GtkWidget *widget, GdkEvent *event, gpointer user_data); static gboolean on_button_press(GtkWidget *widget, GdkEvent *event, gpointer user_data); static gboolean on_button_release(GtkWidget *widget, GdkEvent *event, gpointer user_data); static void on_tool_activate(GtkWidget *widget, gpointer user_data); static void tool_grab(Explorer *self, ToolInput *i); static void tool_blur(Explorer *self, ToolInput *i); static void tool_zoom(Explorer *self, ToolInput *i); static void tool_rotate(Explorer *self, ToolInput *i); static void tool_exposure_gamma(Explorer *self, ToolInput *i); static void tool_a_b(Explorer *self, ToolInput *i); static void tool_a_c(Explorer *self, ToolInput *i); static void tool_a_d(Explorer *self, ToolInput *i); static void tool_b_c(Explorer *self, ToolInput *i); static void tool_b_d(Explorer *self, ToolInput *i); static void tool_c_d(Explorer *self, ToolInput *i); static void tool_ab_cd(Explorer *self, ToolInput *i); static void tool_ac_bd(Explorer *self, ToolInput *i); static void tool_initial_offset(Explorer *self, ToolInput *i); static void tool_initial_scale(Explorer *self, ToolInput *i); /* A table of tool handlers and menu item names */ static const ToolInfo tool_table[] = { {"tool_grab", tool_grab, TOOL_USE_MOTION_EVENTS}, {"tool_blur", tool_blur, TOOL_USE_MOTION_EVENTS}, {"tool_zoom", tool_zoom, TOOL_USE_IDLE}, {"tool_rotate", tool_rotate, TOOL_USE_MOTION_EVENTS}, {"tool_exposure_gamma", tool_exposure_gamma, TOOL_USE_MOTION_EVENTS}, {"tool_a_b", tool_a_b, TOOL_USE_MOTION_EVENTS}, {"tool_a_c", tool_a_c, TOOL_USE_MOTION_EVENTS}, {"tool_a_d", tool_a_d, TOOL_USE_MOTION_EVENTS}, {"tool_b_c", tool_b_c, TOOL_USE_MOTION_EVENTS}, {"tool_b_d", tool_b_d, TOOL_USE_MOTION_EVENTS}, {"tool_c_d", tool_c_d, TOOL_USE_MOTION_EVENTS}, {"tool_ab_cd", tool_ab_cd, TOOL_USE_MOTION_EVENTS}, {"tool_ac_bd", tool_ac_bd, TOOL_USE_MOTION_EVENTS}, {"tool_initial_offset", tool_initial_offset, TOOL_USE_MOTION_EVENTS}, {"tool_initial_scale", tool_initial_scale, TOOL_USE_MOTION_EVENTS}, {NULL,}, }; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ void explorer_init_tools(Explorer *self) { gtk_widget_add_events(self->view, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); glade_xml_signal_connect_data(self->xml, "on_tool_activate", G_CALLBACK(on_tool_activate), self); g_signal_connect(self->view, "motion_notify_event", G_CALLBACK(on_motion_notify), self); g_signal_connect(self->view, "button_press_event", G_CALLBACK(on_button_press), self); g_signal_connect(self->view, "button_release_event", G_CALLBACK(on_button_release), self); self->current_tool = "None"; } /************************************************************************************/ /****************************************************************** Tool Invocation */ /************************************************************************************/ static const ToolInfo* explorer_get_current_tool(Explorer *self) { /* Return the current tool, or NULL if no tool is active */ const ToolInfo *current = tool_table; for (current=tool_table; current->menu_name; current++) { GtkWidget *w = glade_xml_get_widget(self->xml, current->menu_name); if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w))) return current; } return NULL; } static void explorer_fill_toolinput_relative_positions(Explorer *self, ToolInput *ti) { /* Fill in the delta and click-relative positions in a given toolinfo */ /* Compute delta position */ ti->delta_x = ti->absolute_x - self->last_mouse_x; ti->delta_y = ti->absolute_y - self->last_mouse_y; /* Compute click-relative position */ ti->click_relative_x = ti->absolute_x - self->last_click_x; ti->click_relative_y = ti->absolute_y - self->last_click_y; } static gboolean on_motion_notify(GtkWidget *widget, GdkEvent *event, gpointer user_data) { Explorer *self = EXPLORER(user_data); const ToolInfo *tool = explorer_get_current_tool(self); ToolInput ti; memset(&ti, 0, sizeof(ti)); /* Fill in the absolute position and state for the ToolInput */ if (event->motion.is_hint) { gint ix, iy; gdk_window_get_pointer(event->motion.window, &ix, &iy, &ti.state); ti.absolute_x = ix; ti.absolute_y = iy; } else { ti.absolute_x = event->motion.x; ti.absolute_y = event->motion.y; ti.state = event->motion.state; } explorer_fill_toolinput_relative_positions(self, &ti); self->last_mouse_x = ti.absolute_x; self->last_mouse_y = ti.absolute_y; if (tool && (tool->flags & TOOL_USE_MOTION_EVENTS)) { tool->handler(self, &ti); /* Always push through one frame of updates manually * before going on. This serves multiple purposes- * if we're paused, we need this to get any response * at all. This also forces an update to happen even * if the idle handler won't be run for a while, making * the GUI more responsive. This is especially important * under Windows, where the idle handler seems to have * a lower priority. */ explorer_run_iterations(self); } return FALSE; } static void on_tool_activate(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) gtk_label_get(GTK_LABEL(gtk_bin_get_child(GTK_BIN(widget))), &self->current_tool); self->status_dirty_flag = TRUE; } static gboolean on_button_press(GtkWidget *widget, GdkEvent *event, gpointer user_data) { Explorer *self = EXPLORER(user_data); self->tool_active = TRUE; self->last_mouse_x = event->button.x; self->last_mouse_y = event->button.y; self->last_click_x = event->button.x; self->last_click_y = event->button.y; return FALSE; } static gboolean on_button_release(GtkWidget *widget, GdkEvent *event, gpointer user_data) { Explorer *self = EXPLORER(user_data); self->tool_active = FALSE; return FALSE; } gboolean explorer_update_tools(Explorer *self) { /* If we're using a tool that needs to be updated when idle, do it. * Returns a boolean indicating whether a tool is active or not. */ const ToolInfo *tool = explorer_get_current_tool(self); ToolInput ti; gint ix, iy; GTimeVal now; memset(&ti, 0, sizeof(ti)); gdk_window_get_pointer(self->view->window, &ix, &iy, &ti.state); ti.absolute_x = ix; ti.absolute_y = iy; explorer_fill_toolinput_relative_positions(self, &ti); /* Compute the delta time */ g_get_current_time(&now); ti.delta_time = ((now.tv_usec - self->last_tool_idle_update.tv_usec) / 1000000.0 + (now.tv_sec - self->last_tool_idle_update.tv_sec )); self->last_tool_idle_update = now; if (tool && self->tool_active && (tool->flags & TOOL_USE_IDLE)) { tool->handler(self, &ti); return TRUE; } else { return FALSE; } } /************************************************************************************/ /******************************************************************** Tool handlers */ /************************************************************************************/ static void tool_grab(Explorer *self, ToolInput *i) { double scale = 5.0 / DE_JONG(self->map)->zoom / HISTOGRAM_IMAGER(self->map)->width; g_object_set(self->map, "xoffset", DE_JONG(self->map)->xoffset + i->delta_x * scale, "yoffset", DE_JONG(self->map)->yoffset + i->delta_y * scale, NULL); } static void tool_blur(Explorer *self, ToolInput *i) { g_object_set(self->map, "blur_ratio", DE_JONG(self->map)->blur_ratio + i->delta_x * 0.002, "blur_radius", DE_JONG(self->map)->blur_radius - i->delta_y * 0.001, NULL); } static void tool_zoom(Explorer *self, ToolInput *i) { double p, scaled_p; const double exponent = 1.4; /* Scale the zooming speed nonlinearly with the distance from click location */ p = i->click_relative_y * 0.01; if (p < 0) { scaled_p = -pow(-p, exponent); } else { scaled_p = pow(p, exponent); } g_object_set(self->map, "zoom", DE_JONG(self->map)->zoom - scaled_p * i->delta_time, NULL); } static void tool_rotate(Explorer *self, ToolInput *i) { /* We're a bit tricky here and also rotate the X and Y offset such that we're * rotating around the center of the view, rather than rotating around the * center of rendering coordinates. */ double delta_r = -i->delta_x * 0.0089; double sin_d_r = sin(delta_r); double cos_d_r = cos(delta_r); g_object_set(self->map, "rotation", (gdouble) (DE_JONG(self->map)->rotation + delta_r), "xoffset", (gdouble) ( cos_d_r * DE_JONG(self->map)->xoffset + sin_d_r * DE_JONG(self->map)->yoffset), "yoffset", (gdouble) (-sin_d_r * DE_JONG(self->map)->xoffset + cos_d_r * DE_JONG(self->map)->yoffset), NULL); } static void tool_exposure_gamma(Explorer *self, ToolInput *i) { g_object_set(self->map, "exposure", HISTOGRAM_IMAGER(self->map)->exposure - i->delta_y * 0.001, "gamma", HISTOGRAM_IMAGER(self->map)->gamma + i->delta_x * 0.001, NULL); } static void tool_a_b(Explorer *self, ToolInput *i) { g_object_set(self->map, "a", DE_JONG(self->map)->param.a + i->delta_x * 0.001, "b", DE_JONG(self->map)->param.b + i->delta_y * 0.001, NULL); } static void tool_a_c(Explorer *self, ToolInput *i) { g_object_set(self->map, "a", DE_JONG(self->map)->param.a + i->delta_x * 0.001, "c", DE_JONG(self->map)->param.c + i->delta_y * 0.001, NULL); } static void tool_a_d(Explorer *self, ToolInput *i) { g_object_set(self->map, "a", DE_JONG(self->map)->param.a + i->delta_x * 0.001, "d", DE_JONG(self->map)->param.d + i->delta_y * 0.001, NULL); } static void tool_b_c(Explorer *self, ToolInput *i) { g_object_set(self->map, "b", DE_JONG(self->map)->param.b + i->delta_x * 0.001, "c", DE_JONG(self->map)->param.c + i->delta_y * 0.001, NULL); } static void tool_b_d(Explorer *self, ToolInput *i) { g_object_set(self->map, "b", DE_JONG(self->map)->param.b + i->delta_x * 0.001, "d", DE_JONG(self->map)->param.d + i->delta_y * 0.001, NULL); } static void tool_c_d(Explorer *self, ToolInput *i) { g_object_set(self->map, "c", DE_JONG(self->map)->param.c + i->delta_x * 0.001, "d", DE_JONG(self->map)->param.d + i->delta_y * 0.001, NULL); } static void tool_ab_cd(Explorer *self, ToolInput *i) { g_object_set(self->map, "a", DE_JONG(self->map)->param.a + i->delta_x * 0.001, "b", DE_JONG(self->map)->param.b + i->delta_x * 0.001, "c", DE_JONG(self->map)->param.c + i->delta_y * 0.001, "d", DE_JONG(self->map)->param.d + i->delta_y * 0.001, NULL); } static void tool_ac_bd(Explorer *self, ToolInput *i) { g_object_set(self->map, "a", DE_JONG(self->map)->param.a + i->delta_x * 0.001, "b", DE_JONG(self->map)->param.b + i->delta_y * 0.001, "c", DE_JONG(self->map)->param.c + i->delta_x * 0.001, "d", DE_JONG(self->map)->param.d + i->delta_y * 0.001, NULL); } static void tool_initial_offset(Explorer *self, ToolInput *i) { g_object_set(self->map, "initial_xoffset", DE_JONG(self->map)->initial_xoffset + i->delta_x * 0.001, "initial_yoffset", DE_JONG(self->map)->initial_yoffset + i->delta_y * 0.001, NULL); } static void tool_initial_scale(Explorer *self, ToolInput *i) { g_object_set(self->map, "initial_xscale", DE_JONG(self->map)->initial_xscale + i->delta_x * 0.001, "initial_yscale", DE_JONG(self->map)->initial_yscale - i->delta_y * 0.001, NULL); } /* The End */ fyre-1.0.1/src/remote-client.c0000644000175000001440000004172610446431132013105 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * remote-client.c - A client for communicating with remote Fyre * servers. The remote Fyre servers may actually * be on the local machine, or they may be connected * via ssh or sockets. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "config.h" #include "platform.h" #include #include #include #include #include "remote-client.h" static void remote_client_class_init (RemoteClientClass* klass); static void remote_client_init (RemoteClient* self); static void remote_client_dispose (GObject* gobject); static void remote_client_callback (GConn* gconn, GConnEvent* event, gpointer user_data); static void remote_client_recv_binary (RemoteClient* self, GConnEvent* event); static void remote_client_recv_line (RemoteClient* self, GConnEvent* event); static void remote_client_update_status (RemoteClient* self, const gchar* fmt, ...); static void histogram_merge_callback (RemoteClient* self, RemoteResponse* response, gpointer user_data); static void remote_client_start_retry (RemoteClient* self); static void remote_client_stop_retry (RemoteClient* self); static gboolean remote_client_retry_callback(gpointer user_data); static void remote_client_empty_queue (RemoteClient* self); /* Smallest time interval, in seconds, to allow in speed calculations */ #define MINIMUM_SPEED_WINDOW 1.0 /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType remote_client_get_type(void) { static GType anim_type = 0; if (!anim_type) { static const GTypeInfo dj_info = { sizeof(RemoteClientClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) remote_client_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(RemoteClient), 0, (GInstanceInitFunc) remote_client_init, }; anim_type = g_type_register_static(G_TYPE_OBJECT, "RemoteClient", &dj_info, 0); } return anim_type; } static void remote_client_class_init(RemoteClientClass *klass) { GObjectClass *object_class; object_class = (GObjectClass*) klass; object_class->dispose = remote_client_dispose; } static void remote_client_dispose(GObject *gobject) { RemoteClient *self = REMOTE_CLIENT(gobject); remote_client_stop_retry(self); if (self->gconn) { gnet_conn_delete(self->gconn); self->gconn = NULL; } if (self->response_queue) { remote_client_empty_queue(self); g_queue_free(self->response_queue); self->response_queue = NULL; } if (self->status_speed_timer) { g_timer_destroy(self->status_speed_timer); self->status_speed_timer = NULL; } if (self->stream_speed_timer) { g_timer_destroy(self->stream_speed_timer); self->stream_speed_timer = NULL; } if (self->stream_request_timer) { g_timer_destroy(self->stream_request_timer); self->stream_request_timer = NULL; } } static void remote_client_empty_queue (RemoteClient* self) { /* Empty the queue of any outstanding requests */ RemoteClosure *closure; while ((closure = g_queue_pop_tail(self->response_queue))) g_free(closure); } static void remote_client_init(RemoteClient *self) { self->response_queue = g_queue_new(); self->status_speed_timer = g_timer_new(); self->stream_speed_timer = g_timer_new(); self->stream_request_timer = g_timer_new(); /* Default stream interval: every second */ self->min_stream_interval = 1.0; /* By default, retry connections every minute */ self->retry_timeout = 60.0; self->is_retry_enabled = TRUE; } RemoteClient* remote_client_new (const gchar* hostname, gint port) { RemoteClient *self = REMOTE_CLIENT(g_object_new(remote_client_get_type(), NULL)); self->host = hostname; self->port = port; return self; } void remote_client_set_status_cb (RemoteClient* self, RemoteStatusCallback status_cb, gpointer user_data) { self->status_callback = status_cb; self->status_callback_user_data = user_data; } void remote_client_set_speed_cb (RemoteClient* self, RemoteSpeedCallback speed_cb, gpointer user_data) { self->speed_callback = speed_cb; self->speed_callback_user_data = user_data; } void remote_client_connect (RemoteClient* self) { /* Clean up after the previous connection, if we need to */ if (self->gconn) { gnet_conn_delete(self->gconn); self->gconn = NULL; } remote_client_empty_queue(self); /* Reset our speed counters and rate limiting timers */ self->iter_accumulator = 0; self->byte_accumulator = 0; self->iters_per_sec = 0; self->bytes_per_sec = 0; g_timer_start(self->stream_request_timer); g_timer_start(self->status_speed_timer); g_timer_start(self->stream_speed_timer); /* Create the new connection object */ self->gconn = gnet_conn_new(self->host, self->port, remote_client_callback, self); gnet_conn_set_watch_error(self->gconn, TRUE); gnet_conn_connect(self->gconn); gnet_conn_readline(self->gconn); remote_client_update_status(self, "Connecting..."); } static void remote_client_start_retry (RemoteClient* self) { remote_client_stop_retry(self); if (self->is_retry_enabled) self->retry_timer = g_timeout_add(self->retry_timeout * 1000, remote_client_retry_callback, self); } static void remote_client_stop_retry (RemoteClient* self) { if (self->retry_timer) { g_source_remove(self->retry_timer); self->retry_timer = 0; } } static gboolean remote_client_retry_callback(gpointer user_data) { RemoteClient* self = REMOTE_CLIENT(user_data); self->retry_timer = 0; remote_client_connect(self); return FALSE; } gboolean remote_client_is_ready (RemoteClient* self) { return self->is_ready; } /************************************************************************************/ /************************************************************** Low-level Interface */ /************************************************************************************/ static void remote_client_update_status (RemoteClient* self, const gchar* fmt, ...) { gchar *msg; va_list ap; if (!self->status_callback) return; va_start(ap, fmt); msg = g_strdup_vprintf(fmt, ap); va_end(ap); self->status_callback(self, msg, self->status_callback_user_data); g_free(msg); } void remote_client_command (RemoteClient* self, RemoteCallback callback, gpointer user_data, const gchar* format, ...) { RemoteClosure *closure = g_new0(RemoteClosure, 1); gchar* full_message; gchar* line; va_list ap; /* Add the response callback to our queue */ closure->callback = callback; closure->user_data = user_data; g_queue_push_head(self->response_queue, closure); /* Assemble the caller's formatted string */ va_start(ap, format); full_message = g_strdup_vprintf(format, ap); va_end(ap); /* Send a one-line command */ line = g_strdup_printf("%s\n", full_message); gnet_conn_write(self->gconn, line, strlen(line)); g_free(full_message); g_free(line); } static void remote_client_callback (GConn* gconn, GConnEvent* event, gpointer user_data) { RemoteClient* self = (RemoteClient*) user_data; switch (event->type) { case GNET_CONN_READ: if (self->current_binary_response) remote_client_recv_binary(self, event); else remote_client_recv_line(self, event); break; case GNET_CONN_CONNECT: remote_client_update_status(self, "Connected"); break; case GNET_CONN_CLOSE: self->is_ready = FALSE; remote_client_update_status(self, "Connection closed"); remote_client_start_retry(self); break; case GNET_CONN_TIMEOUT: self->is_ready = FALSE; remote_client_update_status(self, "Timed out"); remote_client_start_retry(self); break; case GNET_CONN_ERROR: self->is_ready = FALSE; remote_client_update_status(self, "Connection error"); remote_client_start_retry(self); break; default: break; } } static void remote_client_recv_binary (RemoteClient* self, GConnEvent* event) { RemoteClosure* closure = g_queue_pop_tail(self->response_queue); RemoteResponse* response = self->current_binary_response; self->current_binary_response = NULL; g_assert(closure != NULL); response->data = event->buffer; if (closure->callback) closure->callback(self, response, closure->user_data); g_free(closure); g_free(response->message); g_free(response); gnet_conn_readline(self->gconn); } static void remote_client_recv_line (RemoteClient* self, GConnEvent* event) { RemoteResponse *response = g_new0(RemoteResponse, 1); RemoteClosure *closure; response->code = strtol(event->buffer, &response->message, 10); if (*response->message) response->message++; response->message = g_strdup(response->message); if (response->code == FYRE_RESPONSE_BINARY) { /* Extract the length of the binary response, then start * reading the binary data itself. Note that if we * have a zero-length binary message, skip the next * stage and fall through to processing a normal message. */ response->data_length = strtol(response->message, NULL, 10); if (response->data_length > 0) { self->current_binary_response = response; gnet_conn_readn(self->gconn, response->data_length); return; } } /* We're done, signal the callback and start waiting * for another normal response line. */ closure = g_queue_pop_tail(self->response_queue); if (closure) { /* This was an answer to some request. Invoke the callback * if one was specified. */ if (closure->callback) closure->callback(self, response, closure->user_data); g_free(closure); } else { /* This was unsolicited- should only occur for the server ready message */ if (response->code == FYRE_RESPONSE_READY) { self->is_ready = TRUE; remote_client_update_status(self, "Ready"); } else { remote_client_update_status(self, "Protocol error"); } } g_free(response->message); g_free(response); gnet_conn_readline(self->gconn); } /************************************************************************************/ /************************************************************* High-level Interface */ /************************************************************************************/ static void set_param_callback (RemoteClient* self, RemoteResponse* response, gpointer user_data) { self->pending_param_changes--; } void remote_client_send_param (RemoteClient* self, ParameterHolder* ph, const gchar* name) { /* Serialize one parameter value, and send it to the server */ GValue val, strval; const gchar* string; GParamSpec *spec = g_object_class_find_property(G_OBJECT_GET_CLASS(ph), name); g_assert(spec != NULL); memset(&val, 0, sizeof(val)); g_value_init(&val, spec->value_type); g_object_get_property(G_OBJECT(ph), name, &val); memset(&strval, 0, sizeof(strval)); g_value_init(&strval, G_TYPE_STRING); g_value_transform(&val, &strval); string = g_value_get_string(&strval); /* 'string' will be NULL if the value couldn't be serialized- currently * this happens for colors, since we get the GdkColor property rather than * the corresponding string property. Currently this isn't a problem since * render nodes don't deal with colors, but it's something to be aware of. */ if (string) { self->pending_param_changes++; remote_client_command(self, set_param_callback, NULL, "set_param %s = %s", name, string); } g_value_unset(&strval); g_value_unset(&val); } void remote_client_send_all_params (RemoteClient* self, ParameterHolder* ph) { /* Find all serializable parameters, and send them */ guint n_properties; GParamSpec** properties; int i; properties = g_object_class_list_properties(G_OBJECT_GET_CLASS(ph), &n_properties); for (i=0; iflags & PARAM_SERIALIZED) remote_client_send_param(self, ph, properties[i]->name); g_free(properties); } static void histogram_merge_callback (RemoteClient* self, RemoteResponse* response, gpointer user_data) { HistogramImager *dest = HISTOGRAM_IMAGER(user_data); double elapsed; self->pending_stream_requests--; if (self->pending_param_changes) { /* This data is for an old parameter set, ignore it. * FIXME: This doesn't distinguish between parameters that * actaully affect calculation and those that don't. */ return; } if (!response->data_length) return; histogram_imager_merge_stream(dest, response->data, response->data_length); /* Update our download speed */ self->byte_accumulator += response->data_length; elapsed = g_timer_elapsed(self->stream_speed_timer, NULL); if (elapsed > MINIMUM_SPEED_WINDOW) { g_timer_start(self->stream_speed_timer); self->bytes_per_sec = self->byte_accumulator / elapsed; self->byte_accumulator = 0; } } static void status_merge_callback (RemoteClient* self, RemoteResponse* response, gpointer user_data) { IterativeMap *dest = ITERATIVE_MAP(user_data); double iters, iter_delta; long density; double elapsed; sscanf(response->message, "iterations=%lf density=%ld", &iters, &density); /* FIXME: Since we don't know which parameters affect calculation, we don't * know when the node's iteration counter gets reset. We currently * assume that if it's value decreases, it's been reset. */ if (iters >= self->prev_iterations) { iter_delta = iters - self->prev_iterations; } else { /* Assume it started at zero */ iter_delta = iters; } self->prev_iterations = iters; if (self->pending_param_changes) return; if (!iter_delta) return; /* Merge this iteration count in */ dest->iterations += iter_delta; /* Update our iteration speed */ self->iter_accumulator += iter_delta; elapsed = g_timer_elapsed(self->status_speed_timer, NULL); if (elapsed > MINIMUM_SPEED_WINDOW) { g_timer_start(self->status_speed_timer); self->iters_per_sec = self->iter_accumulator / elapsed; self->iter_accumulator = 0; if (self->speed_callback) self->speed_callback(self, self->iters_per_sec, self->bytes_per_sec, self->speed_callback_user_data); } } void remote_client_merge_results (RemoteClient* self, IterativeMap* dest) { double elapsed; /* Don't let our stream requests get too backed up */ if (self->pending_stream_requests >= 4) return; /* Always keep the status updated */ remote_client_command(self, status_merge_callback, dest, "calc_status"); /* Have we waited long enough since the last request? */ elapsed = g_timer_elapsed(self->stream_request_timer, NULL); if (elapsed < self->min_stream_interval) return; g_timer_start(self->stream_request_timer); self->pending_stream_requests++; remote_client_command(self, histogram_merge_callback, dest, "get_histogram_stream"); } /* The End */ fyre-1.0.1/src/remote-client.h0000644000175000001440000001313610356610476013116 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * remote-client.h - A client for communicating with remote Fyre * rendering servers. * * The lowest-level interface allows sending * commands, with responses triggering callback * functions. A higher level interface can attach * a remote rendering server to a local ParameterHolder * and HistogramImager. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __REMOTE_CLIENT_H__ #define __REMOTE_CLIENT_H__ #include "platform.h" #include #include #include "animation.h" #include "iterative-map.h" #include "remote-server.h" G_BEGIN_DECLS #define REMOTE_CLIENT_TYPE (remote_client_get_type ()) #define REMOTE_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMOTE_CLIENT_TYPE, RemoteClient)) #define REMOTE_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMOTE_CLIENT_TYPE, RemoteClientClass)) #define IS_REMOTE_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMOTE_CLIENT_TYPE)) #define IS_REMOTE_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMOTE_CLIENT_TYPE)) typedef struct _RemoteClient RemoteClient; typedef struct _RemoteClientClass RemoteClientClass; typedef struct _RemoteResponse RemoteResponse; typedef struct _RemoteClosure RemoteClosure; typedef void (*RemoteCallback) (RemoteClient* self, RemoteResponse* response, gpointer user_data); typedef void (*RemoteStatusCallback) (RemoteClient* self, const gchar* status, gpointer user_data); typedef void (*RemoteSpeedCallback) (RemoteClient* self, double iters_per_sec, double bytes_per_sec, gpointer user_data); struct _RemoteClosure { RemoteCallback callback; gpointer user_data; }; struct _RemoteClient { GObject object; double min_stream_interval; double retry_timeout; gboolean is_retry_enabled; /* Private */ const gchar* host; gint port; GConn* gconn; RemoteStatusCallback status_callback; gpointer status_callback_user_data; RemoteSpeedCallback speed_callback; gpointer speed_callback_user_data; gboolean is_ready; guint retry_timer; int pending_param_changes; int pending_stream_requests; GTimer* stream_request_timer; double prev_iterations; GTimer* status_speed_timer; GTimer* stream_speed_timer; double iter_accumulator; double byte_accumulator; double iters_per_sec; double bytes_per_sec; GQueue* response_queue; RemoteResponse* current_binary_response; }; struct _RemoteClientClass { GObjectClass parent_class; }; struct _RemoteResponse { int code; gchar* message; guchar* data; gsize data_length; }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType remote_client_get_type (); RemoteClient* remote_client_new (const gchar* hostname, gint port); void remote_client_set_status_cb (RemoteClient* self, RemoteStatusCallback status_cb, gpointer user_data); void remote_client_set_speed_cb (RemoteClient* self, RemoteSpeedCallback speed_cb, gpointer user_data); void remote_client_connect (RemoteClient* self); gboolean remote_client_is_ready (RemoteClient* self); /* Low-level interface */ void remote_client_command (RemoteClient* self, RemoteCallback callback, gpointer user_data, const gchar* format, ...); /* High-level interface */ void remote_client_send_param (RemoteClient* self, ParameterHolder* ph, const gchar* name); void remote_client_send_all_params (RemoteClient* self, ParameterHolder* ph); void remote_client_merge_results (RemoteClient* self, IterativeMap* dest); G_END_DECLS #endif /* __REMOTE_CLIENT_H__ */ /* The End */ fyre-1.0.1/src/explorer-about.c0000644000175000001440000001121210356611622013275 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * explorer-about.c - Implements our pretty and horribly overengineered * about box, using our ScreenSaver widget to * progressively render a tiny animation. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include "explorer.h" #include "de-jong.h" #include "animation.h" #include "prefix.h" static void on_about_activate (GtkWidget *widget, Explorer *self); static void on_about_close (GtkWidget *widget, Explorer *self); static gboolean on_about_close_window (GtkWidget *window, GdkEvent *event, Explorer *self); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ void explorer_init_about(Explorer *self) { gchar* text; GtkWidget *dialog = glade_xml_get_widget (self->xml, "about_window"); /* Connect signal handlers */ glade_xml_signal_connect_data(self->xml, "on_about_activate", G_CALLBACK(on_about_activate), self); glade_xml_signal_connect_data(self->xml, "on_about_close", G_CALLBACK(on_about_close), self); g_signal_connect (G_OBJECT (dialog), "delete_event", G_CALLBACK(on_about_close_window), self); /* Poke our current version number into the about box */ text = g_strdup_printf("Fyre %s", VERSION); gtk_label_set_markup(GTK_LABEL(glade_xml_get_widget(self->xml, "about_version")), text); g_free(text); } /************************************************************************************/ /******************************************************************** GUI Callbacks */ /************************************************************************************/ static void on_about_close(GtkWidget *widget, Explorer *self) { GtkWidget *dialog = glade_xml_get_widget(self->xml, "about_window"); GtkWidget* image_container = glade_xml_get_widget(self->xml, "about_image"); gtk_widget_hide(dialog); /* Make sure to delete our incredibly memory and CPU hungry about image */ if (self->about_image) { /* We need to stop the screensaver before invalidating its window reference */ screensaver_stop(self->about_image); gtk_container_remove(GTK_CONTAINER(image_container), self->about_image->view); g_object_unref(self->about_image); self->about_image = NULL; } /* Restart the main animation if appropriate */ explorer_restore_pause(self); } static gboolean on_about_close_window(GtkWidget *window, GdkEvent *event, Explorer *self) { on_about_close(window, self); return TRUE; } static void on_about_activate(GtkWidget *widget, Explorer *self) { GtkWidget* dialog = glade_xml_get_widget (self->xml, "about_window"); GtkWidget* image_container = glade_xml_get_widget(self->xml, "about_image"); /* Pause calculation so the CPU can go toward our wonderful about image :) */ explorer_force_pause(self); if (!self->about_image) { IterativeMap* map; Animation* animation; map = ITERATIVE_MAP(de_jong_new()); animation = animation_new(); parameter_holder_set(PARAMETER_HOLDER(map), "size", "300x150"); /* Load the animation from our datadir, possibly using binreloc */ animation_load_file(animation, FYRE_DATADIR "/about-box.fa"); if (!animation_get_length(animation)) animation_load_file(animation, BR_DATADIR("/fyre/about-box.fa")); if (animation_get_length(animation)) { self->about_image = screensaver_new(map, animation); gtk_container_add(GTK_CONTAINER(image_container), self->about_image->view); } g_object_unref(map); g_object_unref(animation); } /* Hmm, didn't this about box involve a dialog somewhere? */ gtk_widget_show_all(dialog); } /* The End */ fyre-1.0.1/src/discovery-server.c0000644000175000001440000001261710446431132013646 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * discovery-server.c - This is a server that listens for UDP broadcast * packets searching for a particular service, then * responds if we provide that service. * * Services are identified by simple null-terminated * strings. Broadcasts come in on FYRE_DISCOVERY_PORT * as UDP packets containing this string. If it matches * our provided service, we send a UDP packet back with * the service name again and the port we run it on. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "config.h" #include "platform.h" #include "discovery-server.h" #include static void discovery_server_class_init (DiscoveryServerClass* klass); static void discovery_server_init (DiscoveryServer* self); static void discovery_server_dispose (GObject* gobject); static gboolean discovery_server_read (GIOChannel* source, GIOCondition condition, gpointer user_data); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType discovery_server_get_type(void) { static GType anim_type = 0; if (!anim_type) { static const GTypeInfo dj_info = { sizeof(DiscoveryServerClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) discovery_server_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(DiscoveryServer), 0, (GInstanceInitFunc) discovery_server_init, }; anim_type = g_type_register_static(G_TYPE_OBJECT, "DiscoveryServer", &dj_info, 0); } return anim_type; } static void discovery_server_class_init(DiscoveryServerClass *klass) { GObjectClass *object_class; object_class = (GObjectClass*) klass; object_class->dispose = discovery_server_dispose; } static void discovery_server_dispose(GObject *gobject) { DiscoveryServer *self = DISCOVERY_SERVER(gobject); if (self->service_name) { g_free(self->service_name); self->service_name = NULL; } if (self->socket) { gnet_udp_socket_delete(self->socket); self->socket = NULL; } if (self->buffer) { g_free(self->buffer); self->buffer = NULL; } } static void discovery_server_init(DiscoveryServer *self) { self->socket = gnet_udp_socket_new_with_port(FYRE_DISCOVERY_PORT); } DiscoveryServer* discovery_server_new(const gchar* service_name, int service_port) { DiscoveryServer *self = DISCOVERY_SERVER(g_object_new(discovery_server_get_type(), NULL)); self->service_name = g_strdup(service_name); self->service_port = service_port; if (self->socket) { /* Create a buffer big enough to hold our incoming and outgoing packets */ self->buffer_size = sizeof(service_name) + 16; self->buffer = g_malloc(self->buffer_size); /* Sign up to get notified when new packets arrive */ g_io_add_watch(gnet_udp_socket_get_io_channel(self->socket), G_IO_IN, discovery_server_read, self); } else { printf("Warning, can't listen for UDP discovery packets on port %d\n", FYRE_DISCOVERY_PORT); } return self; } /************************************************************************************/ /**************************************************************** Network Callbacks */ /************************************************************************************/ static gboolean discovery_server_read(GIOChannel* source, GIOCondition condition, gpointer user_data) { DiscoveryServer* self = DISCOVERY_SERVER(user_data); gint length; GInetAddr *src; /* Receive the packet waiting for us */ length = gnet_udp_socket_receive(self->socket, self->buffer, self->buffer_size, &src); self->buffer[self->buffer_size - 1] = '\0'; /* Ignore it if it doesn't exactly match our service */ if (length != strlen(self->service_name) + 1) return TRUE; if (strncmp(self->service_name, self->buffer, self->buffer_size)) return TRUE; /* Yay, someone cares about us. Tack our port number * onto the end and send a reply. */ self->buffer[length++] = self->service_port >> 8; self->buffer[length++] = self->service_port & 0xFF; gnet_udp_socket_send(self->socket, self->buffer, length, src); return TRUE; } /* The End */ fyre-1.0.1/src/discovery-server.h0000644000175000001440000000577510356610370013665 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * discovery-server.h - This is a server that listens for UDP broadcast * packets searching for a particular service, then * responds if we provide that service. * * Services are identified by simple null-terminated * strings. Broadcasts come in on FYRE_DISCOVERY_PORT * as UDP packets containing this string. If it matches * our provided service, we send a UDP packet back with * the service name again and the port we run it on. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __DISCOVERY_SERVER_H__ #define __DISCOVERY_SERVER_H__ #include "platform.h" #include #include G_BEGIN_DECLS #define FYRE_DISCOVERY_PORT 7932 #define DISCOVERY_SERVER_TYPE (discovery_server_get_type ()) #define DISCOVERY_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DISCOVERY_SERVER_TYPE, DiscoveryServer)) #define DISCOVERY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DISCOVERY_SERVER_TYPE, DiscoveryServerClass)) #define IS_DISCOVERY_SERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DISCOVERY_SERVER_TYPE)) #define IS_DISCOVERY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DISCOVERY_SERVER_TYPE)) typedef struct _DiscoveryServer DiscoveryServer; typedef struct _DiscoveryServerClass DiscoveryServerClass; struct _DiscoveryServer { GObject object; gchar* service_name; int service_port; GUdpSocket* socket; guchar* buffer; gsize buffer_size; }; struct _DiscoveryServerClass { GObjectClass parent_class; }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType discovery_server_get_type (); DiscoveryServer* discovery_server_new (const gchar* service_name, int service_port); G_END_DECLS #endif /* __DISCOVERY_SERVER_H__ */ /* The End */ fyre-1.0.1/src/explorer-cluster.c0000644000175000001440000002336110446431132013650 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * explorer-cluster.c - Implements the explorer GUI's clustering support. * This is only compiled when we have Gnet support. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "config.h" #include "explorer.h" #include "cluster-model.h" #include #include static void explorer_init_cluster_view (Explorer *self); static gboolean explorer_validate_host_and_port (Explorer *self); static void explorer_set_port (Explorer *self, int port); static void on_cluster_list_cursor_changed (GtkWidget *widget, gpointer user_data); static void on_cluster_add_host (GtkWidget *widget, gpointer user_data); static void on_cluster_remove_host (GtkWidget *widget, gpointer user_data); static void on_cluster_host_or_port_changed (GtkWidget *widget, gpointer user_data); static void on_cluster_merge_time_changed (GtkWidget *widget, gpointer user_data); static void on_cluster_discovery_toggled (GtkWidget *widget, gpointer user_data); static void on_node_enabled_toggled (GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data); static gboolean on_cluster_window_delete (GtkWidget *widget, GdkEvent *event, gpointer user_data); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ void explorer_init_cluster(Explorer *self) { /* Connect signal handlers */ glade_xml_signal_connect_data(self->xml, "on_cluster_list_cursor_changed", G_CALLBACK(on_cluster_list_cursor_changed), self); glade_xml_signal_connect_data(self->xml, "on_cluster_add_host", G_CALLBACK(on_cluster_add_host), self); glade_xml_signal_connect_data(self->xml, "on_cluster_remove_host", G_CALLBACK(on_cluster_remove_host), self); glade_xml_signal_connect_data(self->xml, "on_cluster_host_or_port_changed", G_CALLBACK(on_cluster_host_or_port_changed), self); glade_xml_signal_connect_data(self->xml, "on_cluster_host_or_port_changed", G_CALLBACK(on_cluster_host_or_port_changed), self); glade_xml_signal_connect_data(self->xml, "on_cluster_merge_time_changed", G_CALLBACK(on_cluster_merge_time_changed), self); glade_xml_signal_connect_data(self->xml, "on_cluster_window_delete", G_CALLBACK(on_cluster_window_delete), self); glade_xml_signal_connect_data(self->xml, "on_cluster_discovery_toggled", G_CALLBACK(on_cluster_discovery_toggled), self); self->cluster_model = cluster_model_get(self->map, TRUE); explorer_init_cluster_view(self); /* Set the initial merge time */ on_cluster_merge_time_changed(glade_xml_get_widget(self->xml, "cluster_merge_time"), self); /* Set the initial status of node autodiscovery */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(glade_xml_get_widget(self->xml, "cluster_discovery")), self->cluster_model->discovery != NULL ? TRUE : FALSE); explorer_set_port(self, FYRE_DEFAULT_PORT); } void explorer_dispose_cluster(Explorer *self) { if (self->cluster_model) { g_object_unref(self->cluster_model); self->cluster_model = NULL; } } static void explorer_init_cluster_view(Explorer *self) { GtkTreeView *tv = GTK_TREE_VIEW(glade_xml_get_widget(self->xml, "cluster_list")); GtkCellRenderer *renderer; gtk_tree_view_set_model(tv, GTK_TREE_MODEL(self->cluster_model)); renderer = gtk_cell_renderer_toggle_new(); g_signal_connect(renderer, "toggled", G_CALLBACK(on_node_enabled_toggled), self); gtk_tree_view_insert_column_with_attributes(tv, -1, "Enabled", renderer, "active", CLUSTER_MODEL_ENABLED, NULL); gtk_tree_view_insert_column_with_attributes(tv, -1, "Hostname", gtk_cell_renderer_text_new(), "text", CLUSTER_MODEL_HOSTNAME, NULL); gtk_tree_view_insert_column_with_attributes(tv, -1, "Port", gtk_cell_renderer_text_new(), "text", CLUSTER_MODEL_PORT, NULL); gtk_tree_view_insert_column_with_attributes(tv, -1, "Status", gtk_cell_renderer_text_new(), "text", CLUSTER_MODEL_STATUS, NULL); gtk_tree_view_insert_column_with_attributes(tv, -1, "Speed", gtk_cell_renderer_text_new(), "text", CLUSTER_MODEL_SPEED, NULL); gtk_tree_view_insert_column_with_attributes(tv, -1, "Bandwidth", gtk_cell_renderer_text_new(), "text", CLUSTER_MODEL_BANDWIDTH, NULL); } /************************************************************************************/ /******************************************************************** GUI Callbacks */ /************************************************************************************/ static gboolean on_cluster_window_delete(GtkWidget *widget, GdkEvent *event, gpointer user_data) { /* Just hide the window when the user tries to close it */ Explorer *self = EXPLORER(user_data); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(glade_xml_get_widget(self->xml, "toggle_cluster_window")), FALSE); return TRUE; } static void on_cluster_list_cursor_changed(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "cluster_remove_host"), TRUE); } static void on_node_enabled_toggled(GtkCellRendererToggle *cell_renderer, gchar *path, gpointer user_data) { GtkTreePath *path_obj; GtkTreeIter iter; Explorer *self = EXPLORER(user_data); gboolean enabled; path_obj = gtk_tree_path_new_from_string(path); gtk_tree_model_get_iter(GTK_TREE_MODEL(self->cluster_model), &iter, path_obj); gtk_tree_path_free(path_obj); gtk_tree_model_get(GTK_TREE_MODEL(self->cluster_model), &iter, CLUSTER_MODEL_ENABLED, &enabled, -1); if (enabled) cluster_model_disable_node(self->cluster_model, &iter); else cluster_model_enable_node(self->cluster_model, &iter); } static void on_cluster_add_host(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); const gchar* host = gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(self->xml, "cluster_hostname"))); int port = atoi(gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(self->xml, "cluster_port")))); cluster_model_add_node(self->cluster_model, host, port); gtk_entry_set_text(GTK_ENTRY(glade_xml_get_widget(self->xml, "cluster_hostname")), ""); explorer_set_port(self, FYRE_DEFAULT_PORT); gtk_widget_grab_focus(glade_xml_get_widget(self->xml, "cluster_hostname")); } static void on_cluster_remove_host(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); GtkTreeView *tv = GTK_TREE_VIEW(glade_xml_get_widget(self->xml, "cluster_list")); GtkTreeIter iter; GtkTreePath *path; /* Get an iter to the selected row */ gtk_tree_view_get_cursor(tv, &path, NULL); gtk_tree_model_get_iter(GTK_TREE_MODEL(self->cluster_model), &iter, path); gtk_tree_path_free(path); cluster_model_remove_node(self->cluster_model, &iter); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "cluster_remove_host"), FALSE); } static void on_cluster_host_or_port_changed(GtkWidget *widget, gpointer user_data) { /* Validate the host and port, enabling the 'add' button only if * they seem to be at least superficially valid. */ Explorer *self = EXPLORER(user_data); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "cluster_add_host"), explorer_validate_host_and_port(self)); } static gboolean explorer_validate_host_and_port(Explorer *self) { const gchar* host = gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(self->xml, "cluster_hostname"))); const gchar* port = gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(self->xml, "cluster_port"))); gchar* first_invalid; int port_n; if (!*host) return FALSE; if (!*port) return FALSE; port_n = strtol(port, &first_invalid, 10); if (first_invalid[0] != '\0') return FALSE; if (port_n < 0 || port_n > 65535) return FALSE; return TRUE; } static void explorer_set_port(Explorer *self, int port) { gchar* text = g_strdup_printf("%d", port); gtk_entry_set_text(GTK_ENTRY(glade_xml_get_widget(self->xml, "cluster_port")), text); g_free(text); } static void on_cluster_merge_time_changed(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); cluster_model_set_min_stream_interval(self->cluster_model, gtk_range_get_adjustment(GTK_RANGE(widget))->value); } static void on_cluster_discovery_toggled(GtkWidget *widget, gpointer user_data) { Explorer *self = EXPLORER(user_data); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) cluster_model_enable_discovery(self->cluster_model); else cluster_model_disable_discovery(self->cluster_model); } /* The End */ fyre-1.0.1/src/screensaver.c0000644000175000001440000001361310356611756012664 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * screensaver.c - A self-running Fyre "screen saver" that progressively * renders a looping animation. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "screensaver.h" #include "histogram-view.h" #include "de-jong.h" static void screensaver_class_init(ScreenSaverClass *klass); static void screensaver_init(ScreenSaver *self); static void screensaver_dispose(GObject *gobject); static int screensaver_idle_handler(gpointer user_data); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType screensaver_get_type(void) { static GType exp_type = 0; if (!exp_type) { static const GTypeInfo dj_info = { sizeof(ScreenSaverClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) screensaver_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(ScreenSaver), 0, (GInstanceInitFunc) screensaver_init, }; exp_type = g_type_register_static(G_TYPE_OBJECT, "ScreenSaver", &dj_info, 0); } return exp_type; } static void screensaver_class_init(ScreenSaverClass *klass) { GObjectClass *object_class = (GObjectClass*) klass; object_class->dispose = screensaver_dispose; } static void screensaver_init(ScreenSaver *self) { } static void screensaver_dispose(GObject *gobject) { ScreenSaver *self = SCREENSAVER(gobject); screensaver_stop(self); if (self->frame_renders) { int i; for (i=0; inum_frames; i++) g_object_unref(self->frame_renders[i]); g_free(self->frame_renders); self->frame_renders = NULL; } if (self->frame_parameters) { int i; for (i=0; inum_frames; i++) g_object_unref(self->frame_parameters[i].a); g_free(self->frame_parameters); self->frame_parameters = NULL; } if (self->view) { g_object_unref(self->view); self->view = NULL; } if (self->map) { g_object_unref(self->map); self->map = NULL; } if (self->animation) { g_object_unref(self->animation); self->animation = NULL; } } ScreenSaver* screensaver_new(IterativeMap *map, Animation *animation) { ScreenSaver *self = SCREENSAVER(g_object_new(screensaver_get_type(), NULL)); int i; AnimationIter iter; gchar* common_parameters; self->animation = ANIMATION(g_object_ref(animation)); self->map = ITERATIVE_MAP(g_object_ref(map)); self->view = g_object_ref(histogram_view_new(HISTOGRAM_IMAGER(self->map))); /* Allocate and interpolate all frames */ self->framerate = 10; self->num_frames = animation_get_length(self->animation) * self->framerate; self->frame_renders = g_new0(IterativeMap*, self->num_frames); self->frame_parameters = g_new0(ParameterHolderPair, self->num_frames); self->current_frame = 0; common_parameters = parameter_holder_save_string(PARAMETER_HOLDER(map)); animation_iter_seek(animation, &iter, 0); for (i=0; inum_frames; i++) { self->frame_renders[i] = ITERATIVE_MAP(de_jong_new()); parameter_holder_load_string(PARAMETER_HOLDER(self->frame_renders[i]), common_parameters); self->frame_parameters[i].a = PARAMETER_HOLDER(de_jong_new()); animation_iter_load(animation, &iter, self->frame_parameters[i].a); animation_iter_seek_relative(animation, &iter, 1/self->framerate); } for (i=0; inum_frames-1; i++) self->frame_parameters[i].b = self->frame_parameters[i+1].a; self->frame_parameters[self->num_frames-1].b = self->frame_parameters[self->num_frames-1].a; g_free(common_parameters); self->direction = 1; screensaver_start(self); return self; } /************************************************************************************/ /************************************************************************ Rendering */ /************************************************************************************/ void screensaver_start (ScreenSaver *self) { if (!self->idler) self->idler = g_idle_add(screensaver_idle_handler, self); } void screensaver_stop (ScreenSaver *self) { if (self->idler) { g_source_remove(self->idler); self->idler = 0; } } static int screensaver_idle_handler(gpointer user_data) { ScreenSaver *self = SCREENSAVER(user_data); iterative_map_calculate_motion(ITERATIVE_MAP(self->frame_renders[self->current_frame]), 100000, TRUE, PARAMETER_INTERPOLATOR(parameter_holder_interpolate_linear), &self->frame_parameters[self->current_frame]); if (GTK_WIDGET_DRAWABLE(self->view)) { histogram_view_set_imager(HISTOGRAM_VIEW(self->view), HISTOGRAM_IMAGER(self->frame_renders[self->current_frame])); histogram_view_update(HISTOGRAM_VIEW(self->view)); self->current_frame += self->direction; if (self->current_frame >= self->num_frames) { self->current_frame = self->num_frames-2; self->direction = -1; } if (self->current_frame < 0) { self->current_frame = 1; self->direction = 1; } } return 1; } /* The End */ fyre-1.0.1/src/screensaver.h0000644000175000001440000000476710356610510012666 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * screensaver.h - A self-running Fyre screen saver * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __SCREENSAVER_H__ #define __SCREENSAVER_H__ #include #include "animation.h" #include "iterative-map.h" G_BEGIN_DECLS #define SCREENSAVER_TYPE (screensaver_get_type ()) #define SCREENSAVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SCREENSAVER_TYPE, ScreenSaver)) #define SCREENSAVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SCREENSAVER_TYPE, ScreenSaverClass)) #define IS_SCREENSAVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SCREENSAVER_TYPE)) #define IS_SCREENSAVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SCREENSAVER_TYPE)) typedef struct _ScreenSaver ScreenSaver; typedef struct _ScreenSaverClass ScreenSaverClass; struct _ScreenSaver { GObject object; IterativeMap *map; Animation *animation; gdouble framerate; IterativeMap **frame_renders; ParameterHolderPair *frame_parameters; int num_frames, current_frame; int direction; GtkWidget *view; guint idler; }; struct _ScreenSaverClass { GObjectClass parent_class; }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType screensaver_get_type (); ScreenSaver* screensaver_new (IterativeMap *map, Animation *animation); void screensaver_start (ScreenSaver *self); void screensaver_stop (ScreenSaver *self); G_END_DECLS #endif /* __SCREENSAVER_H__ */ /* The End */ fyre-1.0.1/src/animation-render-ui.c0000644000175000001440000003176410446431132014206 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * animation-render-ui.c - A user interface for preparing an animation * rendering and viewing its progress. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include #include "animation-render-ui.h" #include "gui-util.h" #include "prefix.h" static void animation_render_ui_class_init(AnimationRenderUiClass *klass); static void animation_render_ui_init(AnimationRenderUi *self); static void animation_render_ui_dispose(GObject *gobject); static void on_ok_clicked(GtkWidget *widget, AnimationRenderUi *self); static void on_cancel_clicked(GtkWidget *widget, AnimationRenderUi *self); static void on_select_output_file_clicked(GtkWidget *widget, AnimationRenderUi *self); static gboolean on_delete_event(GtkWidget *widget, GdkEvent *event, AnimationRenderUi *self); static void animation_render_ui_start(AnimationRenderUi *self); static void animation_render_ui_stop(AnimationRenderUi *self); static int animation_render_ui_idle_handler(gpointer user_data); static void animation_render_ui_run_timed_calculation(AnimationRenderUi *self); enum { CLOSED_SIGNAL, LAST_SIGNAL, }; static guint animation_render_ui_signals[LAST_SIGNAL] = { 0 }; /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType animation_render_ui_get_type(void) { static GType exp_type = 0; if (!exp_type) { static const GTypeInfo dj_info = { sizeof(AnimationRenderUiClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) animation_render_ui_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(AnimationRenderUi), 0, (GInstanceInitFunc) animation_render_ui_init, }; exp_type = g_type_register_static(G_TYPE_OBJECT, "AnimationRenderUi", &dj_info, 0); } return exp_type; } static void animation_render_ui_class_init(AnimationRenderUiClass *klass) { GObjectClass *object_class = (GObjectClass*) klass; object_class->dispose = animation_render_ui_dispose; animation_render_ui_signals[CLOSED_SIGNAL] = g_signal_new("closed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(AnimationRenderUiClass, animation_render_ui), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); glade_init(); } static void animation_render_ui_init(AnimationRenderUi *self) { if (g_file_test (FYRE_DATADIR "/animation-render.glade", G_FILE_TEST_EXISTS)) self->xml = glade_xml_new(FYRE_DATADIR "/animation-render.glade", NULL, NULL); if (!self->xml) self->xml = glade_xml_new(BR_DATADIR("/fyre/animation-render.glade"), NULL, NULL); fyre_set_icon_later(glade_xml_get_widget(self->xml, "window")); glade_xml_signal_connect_data(self->xml, "on_ok_clicked", G_CALLBACK(on_ok_clicked), self); glade_xml_signal_connect_data(self->xml, "on_cancel_clicked", G_CALLBACK(on_cancel_clicked), self); glade_xml_signal_connect_data(self->xml, "on_select_output_file_clicked", G_CALLBACK(on_select_output_file_clicked), self); glade_xml_signal_connect_data(self->xml, "on_delete_event", G_CALLBACK(on_delete_event), self); self->map = ITERATIVE_MAP(de_jong_new()); self->frame.a = PARAMETER_HOLDER(de_jong_new()); self->frame.b = PARAMETER_HOLDER(de_jong_new()); } static void animation_render_ui_dispose(GObject *gobject) { AnimationRenderUi *self = ANIMATION_RENDER_UI(gobject); if (self->animation) { g_object_unref(self->animation); self->animation = NULL; } if (self->frame.a) { g_object_unref(self->frame.a); self->frame.a = NULL; } if (self->frame.b) { g_object_unref(self->frame.b); self->frame.b = NULL; } if (self->avi) { avi_writer_close(self->avi); g_object_unref(self->avi); self->avi = NULL; } if (self->idler) { g_source_remove(self->idler); self->idler = 0; } } AnimationRenderUi* animation_render_ui_new(Animation *animation) { AnimationRenderUi *self = ANIMATION_RENDER_UI(g_object_new(animation_render_ui_get_type(), NULL)); self->animation = animation_copy(animation); return self; } /************************************************************************************/ /************************************************************************ Callbacks */ /************************************************************************************/ static void on_ok_clicked(GtkWidget *widget, AnimationRenderUi *self) { /* Make settings insensitive and progress sensitive now that we're starting */ gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "ok"), FALSE); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "settings_box"), FALSE); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "progress_box"), TRUE); self->filename = gtk_entry_get_text(GTK_ENTRY(glade_xml_get_widget(self->xml, "output_file"))); self->width = gtk_spin_button_get_value(GTK_SPIN_BUTTON(glade_xml_get_widget(self->xml, "width"))); self->height = gtk_spin_button_get_value(GTK_SPIN_BUTTON(glade_xml_get_widget(self->xml, "height"))); self->oversample = gtk_spin_button_get_value(GTK_SPIN_BUTTON(glade_xml_get_widget(self->xml, "oversample"))); self->quality = gtk_spin_button_get_value(GTK_SPIN_BUTTON(glade_xml_get_widget(self->xml, "quality"))); self->frame_rate = gtk_spin_button_get_value(GTK_SPIN_BUTTON(glade_xml_get_widget(self->xml, "frame_rate"))); animation_render_ui_start(self); } static void on_cancel_clicked(GtkWidget *widget, AnimationRenderUi *self) { if(self->render_in_progress) { if(self->confirm_on) { gint result; GtkWidget *dialog; dialog = glade_xml_get_widget(self->xml, "confirm_cancel"); result = gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_hide (dialog); if(result == GTK_RESPONSE_REJECT) return; } animation_render_ui_stop(self); } else { gtk_widget_destroy(glade_xml_get_widget(self->xml, "window")); g_signal_emit(G_OBJECT(self), animation_render_ui_signals[CLOSED_SIGNAL], 0); } } static void on_select_output_file_clicked(GtkWidget *widget, AnimationRenderUi *self) { GtkWidget *dialog; #if (GTK_CHECK_VERSION(2, 4, 0)) dialog = gtk_file_chooser_dialog_new ("Select Output File", GTK_WINDOW (glade_xml_get_widget (self->xml, "window")), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { gchar *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); gtk_entry_set_text (GTK_ENTRY (glade_xml_get_widget (self->xml, "output_file")), filename); g_free (filename); } #else dialog = gtk_file_selection_new ("Select Output File"); gtk_file_selection_set_filename (GTK_FILE_SELECTION (dialog), gtk_entry_get_text (GTK_ENTRY (glade_xml_get_widget (self->xml, "output_file")))); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { gtk_entry_set_text (GTK_ENTRY (glade_xml_get_widget (self->xml, "output_file")), gtk_file_selection_get_filename (GTK_FILE_SELECTION (dialog))); } #endif gtk_widget_destroy (dialog); } static gboolean on_delete_event(GtkWidget *widget, GdkEvent *event, AnimationRenderUi *self) { if (self->render_in_progress) animation_render_ui_stop(self); g_signal_emit(G_OBJECT(self), animation_render_ui_signals[CLOSED_SIGNAL], 0); return FALSE; } /************************************************************************************/ /************************************************************************ Rendering */ /************************************************************************************/ static gboolean set_confirm_on(AnimationRenderUi *self) { self->confirm_on = TRUE; return FALSE; } static void animation_render_ui_start(AnimationRenderUi *self) { GtkWidget *close; g_object_set(self->map, "width", self->width, "height", self->height, "oversample", self->oversample, NULL); self->avi = avi_writer_new(fopen(self->filename, "wb"), self->width, self->height, self->frame_rate); close = glade_xml_get_widget(self->xml, "cancel"); gtk_button_set_label(GTK_BUTTON(close), GTK_STOCK_CANCEL); /* Get the first frame ready for rendering */ animation_iter_get_first(self->animation, &self->iter); animation_iter_read_frame(self->animation, &self->iter, &self->frame, self->frame_rate); self->continuation = FALSE; self->elapsed_anim_time = 0; self->anim_length = animation_get_length(self->animation); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(glade_xml_get_widget(self->xml, "animation_progress")), 0); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(glade_xml_get_widget(self->xml, "frame_progress")), 0); /* Set up an idle handler where we'll do the rendering in small chunks */ self->idler = g_idle_add(animation_render_ui_idle_handler, self); /* Set up a timeout so we only ask for confirmation on cancel after 15s */ self->confirm_on = FALSE; g_timeout_add(15000, (GSourceFunc) set_confirm_on, self); self->render_in_progress = TRUE; } static void animation_render_ui_stop(AnimationRenderUi *self) { GtkWidget *close; self->render_in_progress = FALSE; self->confirm_on = FALSE; close = glade_xml_get_widget(self->xml, "cancel"); gtk_button_set_label(GTK_BUTTON(close), GTK_STOCK_CLOSE); avi_writer_close(self->avi); g_object_unref(self->avi); self->avi = NULL; g_source_remove(self->idler); self->idler = 0; gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(glade_xml_get_widget(self->xml, "animation_progress")), 0); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(glade_xml_get_widget(self->xml, "frame_progress")), 0); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "ok"), TRUE); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "settings_box"), TRUE); gtk_widget_set_sensitive(glade_xml_get_widget(self->xml, "progress_box"), FALSE); } static int animation_render_ui_idle_handler(gpointer user_data) { AnimationRenderUi *self = (AnimationRenderUi*) user_data; gdouble frame_completion, anim_completion; animation_render_ui_run_timed_calculation(self); /* Figure out how complete this frame is */ frame_completion = histogram_imager_compute_quality(HISTOGRAM_IMAGER(self->map)) / self->quality; if (frame_completion >= 1) { frame_completion = 1; /* Write out this frame */ histogram_imager_update_image(HISTOGRAM_IMAGER(self->map)); avi_writer_append_frame(self->avi, HISTOGRAM_IMAGER(self->map)->image); /* Show the completed frame in our GUI's preview area */ gtk_image_set_from_pixbuf(GTK_IMAGE(glade_xml_get_widget(self->xml, "preview")), HISTOGRAM_IMAGER(self->map)->image); gtk_widget_show(glade_xml_get_widget(self->xml, "preview_frame")); /* Move to the next frame */ if (animation_iter_read_frame(self->animation, &self->iter, &self->frame, self->frame_rate)) { /* We still have more to render, calculate how much we've done so far */ self->continuation = FALSE; self->elapsed_anim_time += 1/self->frame_rate; anim_completion = self->elapsed_anim_time / self->anim_length; } else { /* We're done, yay. Clean up. */ anim_completion = 1; animation_render_ui_stop(self); } gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(glade_xml_get_widget(self->xml, "animation_progress")), anim_completion); } else { /* Continue this frame later */ self->continuation = TRUE; } gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(glade_xml_get_widget(self->xml, "frame_progress")), frame_completion); return 1; } static void animation_render_ui_run_timed_calculation(AnimationRenderUi *self) { iterative_map_calculate_motion_timed(ITERATIVE_MAP(self->map), 0.025, self->continuation, PARAMETER_INTERPOLATOR(parameter_holder_interpolate_linear), &self->frame); } /* The End */ fyre-1.0.1/src/animation-render-ui.h0000644000175000001440000000564110356610242014207 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * animation-render-ui.h - A user interface for preparing an animation * rendering and viewing its progress. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __ANIMATION_RENDER_UI_H__ #define __ANIMATION_RENDER_UI_H__ #include #include #include "iterative-map.h" #include "de-jong.h" #include "animation.h" #include "avi-writer.h" G_BEGIN_DECLS #define ANIMATION_RENDER_UI_TYPE (animation_render_ui_get_type ()) #define ANIMATION_RENDER_UI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ANIMATION_RENDER_UI_TYPE, AnimationRenderUi)) #define ANIMATION_RENDER_UI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ANIMATION_RENDER_UI_TYPE, AnimationRenderUiClass)) #define IS_ANIMATION_RENDER_UI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ANIMATION_RENDER_UI_TYPE)) #define IS_ANIMATION_RENDER_UI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ANIMATION_RENDER_UI_TYPE)) typedef struct _AnimationRenderUi AnimationRenderUi; typedef struct _AnimationRenderUiClass AnimationRenderUiClass; struct _AnimationRenderUi { GObject object; GladeXML *xml; Animation *animation; const gchar *filename; gdouble frame_rate; guint width, height, oversample; double quality; IterativeMap *map; AviWriter *avi; AnimationIter iter; ParameterHolderPair frame; gboolean continuation; guint idler; gdouble elapsed_anim_time; gdouble anim_length; gboolean render_in_progress; gboolean confirm_on; }; struct _AnimationRenderUiClass { GObjectClass parent_class; void (* animation_render_ui) (AnimationRenderUi *self); }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType animation_render_ui_get_type(); AnimationRenderUi* animation_render_ui_new(Animation *animation); G_END_DECLS #endif /* __ANIMATION_RENDER_UI_H__ */ /* The End */ fyre-1.0.1/src/cluster-model.c0000644000175000001440000004335010446431132013110 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * cluster-model.c - A cluster manager, based on GtkListStore. This can be * used on its own, or it can be attached to a suitable * GUI view and controller. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include "config.h" #include "cluster-model.h" #include #include typedef void (*ClusterForeachCallback) (ClusterModel* self, RemoteClient* client, gpointer user_data); static void cluster_model_class_init (ClusterModelClass* klass); static void cluster_model_init (ClusterModel* self); static void cluster_model_dispose (GObject* gobject); static void client_speed_callback (RemoteClient* client, double iters_per_sec, double bytes_per_sec, gpointer user_data); static void client_status_callback (RemoteClient* client, const gchar* status, gpointer user_data); static void on_param_notify (ParameterHolder* holder, GParamSpec* spec, ClusterModel* self); static void on_calc_finished (IterativeMap* map, ClusterModel* self); static void on_calc_start (IterativeMap* map, ClusterModel* self); static void on_calc_stop (IterativeMap* map, ClusterModel* self); static void cluster_foreach_node (ClusterModel* self, ClusterForeachCallback callback, gpointer user_data, gboolean only_ready_nodes); static void cluster_node_update_param (ClusterModel *self, RemoteClient *client, gpointer user_data); static void cluster_node_start (ClusterModel *self, RemoteClient *client, gpointer user_data); static void cluster_node_stop (ClusterModel *self, RemoteClient *client, gpointer user_data); static void cluster_node_merge_results (ClusterModel *self, RemoteClient *client, gpointer user_data); static void cluster_node_set_min_stream_interval (ClusterModel *self, RemoteClient *client, gpointer user_data); static void cluster_model_discovery_callback (DiscoveryClient* self, const gchar* host, int port, gpointer user_data); /************************************************************************************/ /**************************************************** Initialization / Finalization */ /************************************************************************************/ GType cluster_model_get_type(void) { static GType anim_type = 0; if (!anim_type) { static const GTypeInfo dj_info = { sizeof(ClusterModelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) cluster_model_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(ClusterModel), 0, (GInstanceInitFunc) cluster_model_init, }; anim_type = g_type_register_static(GTK_TYPE_LIST_STORE, "ClusterModel", &dj_info, 0); } return anim_type; } static void cluster_model_class_init(ClusterModelClass *klass) { GObjectClass *object_class; object_class = (GObjectClass*) klass; object_class->dispose = cluster_model_dispose; } static void cluster_model_dispose(GObject *gobject) { ClusterModel *self = CLUSTER_MODEL(gobject); cluster_model_disable_discovery(self); if (self->master_map) { g_object_set_data(G_OBJECT(self->master_map), "ClusterModel", NULL); g_signal_handlers_disconnect_matched(self->master_map, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); g_object_unref(self->master_map); self->master_map = NULL; } } static void cluster_model_init(ClusterModel *self) { } ClusterModel* cluster_model_new (IterativeMap* master_map) { ClusterModel *self = CLUSTER_MODEL(g_object_new(cluster_model_get_type(), NULL)); GType types[] = { /* CLUSTER_MODEL_ENABLED */ G_TYPE_BOOLEAN, /* CLUSTER_MODEL_HOSTNAME */ G_TYPE_STRING, /* CLUSTER_MODEL_PORT */ G_TYPE_INT, /* CLUSTER_MODEL_STATUS */ G_TYPE_STRING, /* CLUSTER_MODEL_CLIENT */ G_TYPE_OBJECT, /* CLUSTER_MODEL_SPEED */ G_TYPE_STRING, /* CLUSTER_MODEL_BANDWIDTH */ G_TYPE_STRING, }; gtk_list_store_set_column_types(GTK_LIST_STORE(self), 7, types); self->master_map = g_object_ref(master_map); g_signal_connect(self->master_map, "notify", G_CALLBACK(on_param_notify), self); g_signal_connect(self->master_map, "calculation-finished", G_CALLBACK(on_calc_finished), self); g_signal_connect(self->master_map, "calculation-start", G_CALLBACK(on_calc_start), self); g_signal_connect(self->master_map, "calculation-stop", G_CALLBACK(on_calc_stop), self); g_object_set_data(G_OBJECT(self->master_map), "ClusterModel", self); return self; } ClusterModel* cluster_model_get (IterativeMap* master_map, gboolean allocate_if_necessary) { ClusterModel *self = g_object_get_data(G_OBJECT(master_map), "ClusterModel"); if (self) { return g_object_ref(self); } else { if (allocate_if_necessary) return cluster_model_new(master_map); else return NULL; } } /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ RemoteClient* cluster_model_add_node (ClusterModel* self, const gchar* hostname, gint port) { GtkTreeIter iter; gtk_list_store_append(GTK_LIST_STORE(self), &iter); gtk_list_store_set(GTK_LIST_STORE(self), &iter, CLUSTER_MODEL_HOSTNAME, hostname, CLUSTER_MODEL_PORT, port, -1); return cluster_model_enable_node(self, &iter); } void cluster_model_add_nodes (ClusterModel* self, const gchar* hosts) { gchar **tokens = g_strsplit(hosts, ",", 0); gchar **token; for (token=tokens; *token; token++) { gchar **parts; gchar *host; int port; gchar *first_invalid; g_strstrip(*token); /* See if we can split it into host:port */ parts = g_strsplit(*token, ":", 2); host = parts[0]; if (parts[1]) { /* We have host and port */ port = strtol(parts[1], &first_invalid, 10); if (*first_invalid) { g_warning("Port number '%s' is invalid", parts[1]); } } else { port = FYRE_DEFAULT_PORT; } cluster_model_add_node(self, host, port); g_strfreev(parts); } g_strfreev(tokens); } gboolean cluster_model_find_client (ClusterModel* self, RemoteClient* client, GtkTreeIter* iter) { RemoteClient* iter_client; if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(self), iter)) { do { gtk_tree_model_get(GTK_TREE_MODEL(self), iter, CLUSTER_MODEL_CLIENT, &iter_client, -1); if (iter_client) g_object_unref(iter_client); if (iter_client == client) return TRUE; } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(self), iter)); } return FALSE; } gboolean cluster_model_find_address (ClusterModel* self, const gchar* hostname, gint port, GtkTreeIter* iter) { const gchar* iter_host; gint iter_port; if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(self), iter)) { do { gtk_tree_model_get(GTK_TREE_MODEL(self), iter, CLUSTER_MODEL_HOSTNAME, &iter_host, CLUSTER_MODEL_PORT, &iter_port, -1); /* FIXME: strcmp isn't good enough, we should really be checking * whether the hostnames refer to the same internet * address. */ if (port == iter_port && !strcmp(iter_host, hostname)) return TRUE; } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(self), iter)); } return FALSE; } void cluster_model_remove_node (ClusterModel* self, GtkTreeIter* iter) { cluster_model_disable_node(self, iter); gtk_list_store_remove(GTK_LIST_STORE(self), iter); } RemoteClient* cluster_model_enable_node (ClusterModel* self, GtkTreeIter* iter) { RemoteClient *client; gchar *host; int port; gtk_tree_model_get(GTK_TREE_MODEL(self), iter, CLUSTER_MODEL_HOSTNAME, &host, CLUSTER_MODEL_PORT, &port, -1); client = remote_client_new(host, port); remote_client_set_status_cb(client, client_status_callback, self); remote_client_set_speed_cb(client, client_speed_callback, self); if (self->set_min_stream_interval) client->min_stream_interval = self->min_stream_interval; gtk_list_store_set(GTK_LIST_STORE(self), iter, CLUSTER_MODEL_CLIENT, client, CLUSTER_MODEL_ENABLED, TRUE, -1); /* The liststore will keep a reference, ditch ours. * When the client is removed from the liststore, it * should be disposed of. */ g_object_unref(client); /* Tell the client to connect only after our callbacks are in place */ remote_client_connect(client); /* Return a borrowed reference, just in case the caller needs it */ return client; } void cluster_model_disable_node (ClusterModel* self, GtkTreeIter* iter) { gtk_list_store_set(GTK_LIST_STORE(self), iter, CLUSTER_MODEL_CLIENT, NULL, CLUSTER_MODEL_ENABLED, FALSE, CLUSTER_MODEL_STATUS, "", CLUSTER_MODEL_SPEED, "", CLUSTER_MODEL_BANDWIDTH, "", -1); } void cluster_model_show_status (ClusterModel* self) { GtkTreeIter iter; gchar* host; gboolean enabled; int port; gchar* status; gchar* speed; gchar* bandwidth; gchar* host_and_port; /* Iterate over all cluster nodes that are ready */ if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(self), &iter)) { do { gtk_tree_model_get(GTK_TREE_MODEL(self), &iter, CLUSTER_MODEL_ENABLED, &enabled, CLUSTER_MODEL_HOSTNAME, &host, CLUSTER_MODEL_PORT, &port, CLUSTER_MODEL_STATUS, &status, CLUSTER_MODEL_SPEED, &speed, CLUSTER_MODEL_BANDWIDTH, &bandwidth, -1); if (enabled) { if (port == FYRE_DEFAULT_PORT) host_and_port = g_strdup(host); else host_and_port = g_strdup_printf("%s:%d", host, port); /* These widths were chosen to line up somewhat with batch-rendering results */ printf(" %-19s %-17s %16s [%s]\n", host_and_port, speed ? speed : "", bandwidth ? bandwidth : "", status); g_free(host_and_port); } } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(self), &iter)); } } void cluster_model_set_min_stream_interval (ClusterModel* self, gdouble seconds) { self->min_stream_interval = seconds; self->set_min_stream_interval = TRUE; cluster_foreach_node(self, cluster_node_set_min_stream_interval, NULL, FALSE); } void cluster_model_enable_discovery (ClusterModel* self) { /* Currently, our scanning interval is hardcoded at 5 minutes */ if (!self->discovery) self->discovery = discovery_client_new(FYRE_DEFAULT_SERVICE, 5*60, cluster_model_discovery_callback, self); } void cluster_model_disable_discovery(ClusterModel* self) { if (self->discovery) { g_object_unref(self->discovery); self->discovery = NULL; } } /************************************************************************************/ /************************************************************************ Callbacks */ /************************************************************************************/ static void client_status_callback (RemoteClient* client, const gchar* status, gpointer user_data) { ClusterModel*self = CLUSTER_MODEL(user_data); GtkTreeIter iter; /* This node might have just become ready. If our cluster is supposed to * be running, make sure this node is running too. */ if (self->is_running && remote_client_is_ready(client)) { remote_client_send_all_params(client, PARAMETER_HOLDER(self->master_map)); cluster_node_start(self, client, NULL); } cluster_model_find_client(self, client, &iter); gtk_list_store_set(GTK_LIST_STORE(self), &iter, CLUSTER_MODEL_STATUS, status, -1); } static void client_speed_callback (RemoteClient* client, double iters_per_sec, double bytes_per_sec, gpointer user_data) { ClusterModel*self = CLUSTER_MODEL(user_data); GtkTreeIter iter; gchar* speed_str; gchar* bandwidth_str; cluster_model_find_client(self, client, &iter); speed_str = g_strdup_printf("%.3e iter/s", iters_per_sec); bandwidth_str = g_strdup_printf("%.2f KB/s", bytes_per_sec / 1000); gtk_list_store_set(GTK_LIST_STORE(self), &iter, CLUSTER_MODEL_SPEED, speed_str, CLUSTER_MODEL_BANDWIDTH, bandwidth_str, -1); g_free(speed_str); g_free(bandwidth_str); } static void on_param_notify (ParameterHolder* holder, GParamSpec* spec, ClusterModel* self) { cluster_foreach_node(self, cluster_node_update_param, spec, TRUE); } static void on_calc_finished (IterativeMap* map, ClusterModel* self) { cluster_foreach_node(self, cluster_node_merge_results, NULL, TRUE); } static void on_calc_start (IterativeMap* map, ClusterModel* self) { self->is_running = TRUE; cluster_foreach_node(self, cluster_node_start, NULL, TRUE); } static void on_calc_stop (IterativeMap* map, ClusterModel* self) { self->is_running = FALSE; cluster_foreach_node(self, cluster_node_stop, NULL, TRUE); } static void cluster_model_discovery_callback (DiscoveryClient* client, const gchar* host, int port, gpointer user_data) { /* This is called by our DiscoveryClient when it's found a cluster * node. We may or may not already have this node- if we don't, * it gets added. */ GtkTreeIter iter; ClusterModel* self = CLUSTER_MODEL(user_data); g_return_if_fail(client == self->discovery); if (cluster_model_find_address(self, host, port, &iter)) { /* Already found this host */ return; } /* Yay, a new node */ cluster_model_add_node(self, host, port); } /************************************************************************************/ /****************************************************************** Cluster Control */ /************************************************************************************/ static void cluster_foreach_node (ClusterModel* self, ClusterForeachCallback callback, gpointer user_data, gboolean only_ready_nodes) { GtkTreeIter iter; RemoteClient* client; /* Iterate over all cluster nodes that are ready */ if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(self), &iter)) { do { gtk_tree_model_get(GTK_TREE_MODEL(self), &iter, CLUSTER_MODEL_CLIENT, &client, -1); if (client) { if ((!only_ready_nodes) || remote_client_is_ready(client)) callback(self, client, user_data); g_object_unref(client); } } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(self), &iter)); } } static void cluster_node_update_param (ClusterModel *self, RemoteClient *client, gpointer user_data) { GParamSpec* spec = (GParamSpec*) user_data; remote_client_send_param(client, PARAMETER_HOLDER(self->master_map), spec->name); } static void cluster_node_start (ClusterModel *self, RemoteClient *client, gpointer user_data) { remote_client_command(client, NULL, NULL, "calc_start"); } static void cluster_node_stop (ClusterModel *self, RemoteClient *client, gpointer user_data) { remote_client_command(client, NULL, NULL, "calc_stop"); } static void cluster_node_merge_results (ClusterModel *self, RemoteClient *client, gpointer user_data) { remote_client_merge_results(client, self->master_map); } static void cluster_node_set_min_stream_interval (ClusterModel *self, RemoteClient *client, gpointer user_data) { client->min_stream_interval = self->min_stream_interval; } /* The End */ fyre-1.0.1/src/cluster-model.h0000644000175000001440000001106310356610321013110 00000000000000/* -*- mode: c; c-basic-offset: 4; -*- * * cluster-model.h - A cluster manager, based on GtkListStore. This can be * used on its own, or it can be attached to a suitable * GUI view and controller. * * Fyre - rendering and interactive exploration of chaotic functions * Copyright (C) 2004-2006 David Trowbridge and Micah Dowty * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #ifndef __CLUSTER_MODEL_H__ #define __CLUSTER_MODEL_H__ #include #include "remote-client.h" #include "discovery-client.h" #include "iterative-map.h" G_BEGIN_DECLS #define CLUSTER_MODEL_TYPE (cluster_model_get_type ()) #define CLUSTER_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUSTER_MODEL_TYPE, ClusterModel)) #define CLUSTER_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUSTER_MODEL_TYPE, ClusterModelClass)) #define IS_CLUSTER_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUSTER_MODEL_TYPE)) #define IS_CLUSTER_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUSTER_MODEL_TYPE)) typedef struct _ClusterModel ClusterModel; typedef struct _ClusterModelClass ClusterModelClass; struct _ClusterModel { GtkListStore parent; IterativeMap* master_map; gboolean is_running; gdouble min_stream_interval; /* Default for new clients */ gboolean set_min_stream_interval; DiscoveryClient* discovery; }; struct _ClusterModelClass { GtkListStoreClass parent_class; }; enum { CLUSTER_MODEL_ENABLED, CLUSTER_MODEL_HOSTNAME, CLUSTER_MODEL_PORT, CLUSTER_MODEL_STATUS, CLUSTER_MODEL_CLIENT, CLUSTER_MODEL_SPEED, CLUSTER_MODEL_BANDWIDTH, }; /************************************************************************************/ /******************************************************************* Public Methods */ /************************************************************************************/ GType cluster_model_get_type (); ClusterModel* cluster_model_new (IterativeMap* master_map); /* Return a new reference to the ClusterModel associated with a particular * IterativeMap, optionally allocating a new one if necessary. */ ClusterModel* cluster_model_get (IterativeMap* master_map, gboolean allocate_if_necessary); RemoteClient* cluster_model_add_node (ClusterModel* self, const gchar* hostname, gint port); void cluster_model_set_min_stream_interval (ClusterModel* self, gdouble seconds); /* Show the cluster status on stdout. Good for debugging, and batch-mode rendering */ void cluster_model_show_status (ClusterModel* self); /* Add a comma-separated list of host[:port] specifiers */ void cluster_model_add_nodes (ClusterModel* self, const gchar* hosts); /* Enable/disable automatic autodiscovery of cluster nodes */ void cluster_model_enable_discovery (ClusterModel* self); void cluster_model_disable_discovery(ClusterModel* self); gboolean cluster_model_find_client (ClusterModel* self, RemoteClient* client, GtkTreeIter* iter); gboolean cluster_model_find_address (ClusterModel* self, const gchar* hostname, gint port, GtkTreeIter* iter); void cluster_model_remove_node (ClusterModel* self, GtkTreeIter* iter); RemoteClient* cluster_model_enable_node (ClusterModel* self, GtkTreeIter* iter); void cluster_model_disable_node (ClusterModel* self, GtkTreeIter* iter); G_END_DECLS #endif /* __CLUSTER_MODEL_H__ */ /* The End */ fyre-1.0.1/NEWS0000644000175000001440000000000010263337643010067 00000000000000fyre-1.0.1/TODO0000644000175000001440000000077310450744232010073 00000000000000- It would be nice to have support for minimizing to the windows systray when in console mode. This combined with a way to run a rendering server on startup would make it easier to keep windows machines permanently in a cluster. - Extend the 'interactivity preferences' dialog into a more generic preferences thingydoo. It would be good to change, for example, the number of history items we record. - Display information on current frame progress (done/total) in the animation render window. fyre-1.0.1/data/0000777000175000001440000000000010512346412010366 500000000000000fyre-1.0.1/data/fyre.desktop0000644000175000001440000000034310463155243012647 00000000000000[Desktop Entry] Version=1.0 Encoding=UTF-8 Name=Fyre Exec=fyre Comment=Create computational artwork Terminal=false Type=Application Categories=GTK;Graphics;2DGraphics; Icon=fyre MimeType=application/x-fyre-animation;image/png; fyre-1.0.1/data/fyre-win32-icons.xcf.gz0000644000175000001440000001327210263337643014457 00000000000000‹Řy\×ÚÇOP¡.ÕºUÚRë½V@[½.UQ°VeW‹Ú"âJQ$®lU¬¸\—ÖŠ€"²ˆ²ˆ ($!ìP–B ˆ!„`È:ÉyÏI‚".ŸûÞîäsÂ<ÏïwΜ<3ß™9øùï 0'{ûšûúïöh³Õ7¼}Œ‰„¾Æ£6bÅpCÛ'¨¢6µ ¨ÍAm”j–÷¾={|öÀ&Üq¢] ×ŸíæÁþv˜»íð1wX½Ö «õCtC\ÿÿCŒÕÚý÷xùùÌò ôß®ïAñõþ‡vû˜ûï=à¸ßÇû€ÿ¾½ûgš|íëç½o÷¾@ó¯µfúmó2·žm­ÝÞ±c£ß™‰ºn{GW›¡Æ·wpWòþ/oÿ½~æ6#£ä¡w%õ¹YA{ý É{ïðÁ³&ïóõÝïsÀ|pï·SºÌ›]Áë¤@g³€/þ5(i­o¸Ê»€üís·À s;ü±ÁXŽ >ýƒÎ×Hý>ÞLí›ÚÿhÐþ¨Aûcôc lÃi—•ÑkÙàÎÉ"Ý çÍœA(à:PGV@—¾‰'ù[€P þúV_BǽrS-˜ú3XÉÀD*áì-ÔFµ7æ {žþG¥‘7kÛÊ bŽ¡Hù[ôÓê¢Rq+¼| ä^+žT0ËKp&“\¾"ÆJ?Zu}mUÉÃÛùûàsÐ;eÞÕuMìfÞÙàÓOmG#溺ƒa€ðpwA?_è¸^ÚÙÑÑÂ~š´3(îæÚTÕww;ìqõpŸEühÞ˜ðË®Ã7où ó¡šäîñªaëáŽFíõp{º¹ÏK“.†ýûaì²ô­õp®îKÜÝ?õð@&á¥Ý=B~Cò­ìœG%Ù» PûÜ>«6'2£<ôB!r‘<$#ÜÜÑXÆè¸ŽèŠè=ÊíVô×ß){–w“^ûËŸº¡¦¹¹NwuwYîáfŠMþ¾Z^—PÓV\Tÿ41$™w5¨ªïÜÜæ¢«©÷pO#­N©+ˆ§±šîŸ;-ÎnÚBº;}†ß\¸Ç…²šôÂøÄʶg¥‡qùC‹ç@óAvvMggÛ³U8yü×V¼:ãAcoO§Å|„ßÅïð}®U<Èå÷‹ºk6˜àä¯1Ó7²^JKÒ+ŠþŽG&ž(Ù}xÐýõYçp<5L‚%€­7;¥R¾Ħ“¿‚µ(-;•48^}ÞIP¦–F€ß£?òÁù[è \Ìà¼4}Ø–}É®àS X–|ØZo©í„hÿ„̈º„ìÝgî-'…ÚL{5Â(Gp–t$ÁÙ»ÿˆ&!À+¡Fw];.}u$r#˜øö÷ÏÑ~`ëíUã´¬kàúêÙ;@D¤`úeˆmFÞ»nlsQ^eø×áH9hÁ»†¿¯FÇ%FlEõ•œûuÚŒhðçƒy¿,_é…{`óQðï>&õù»¨œFÆÁí$ø¦×‰8Xyh»6ø aH:I:8÷xa8OÅp†´} ç±ó>ƒà³^WÝ¡âÉxðݸï1ËÝKÖ~F²e—‡à|áü%X®7Âp®ü.óâª4ÐÃq1X5váê™Ns§åÀØXý‰žœ“68ÇiWXc8í\,1œ "8]VƒÕ–`2†ÓÀaÝ0 çÂMÎïI˧a8¿µÂp®XõåŒ5ÀÁmò·Ÿb8íœÅB°ÒÕSgç„\àºkµµëbü  ÌÌÖ«1œK1œ;Ú`<°„ÙñôGeV/7èo´A/ㄽµ9*žÄ,†°é_›ƒ‡£ƒJÌâÔõS\x11Ï\ÞíƒäE9í/ÖâÐ*¹‡h/c+ (áb@šV•r9A «å Šo*©Æè\ùeO£†ÃÐyÊ$!~dæÂ‹ÌÆ1Æ$´:T[ñïJ54†êšH’&ÂÅ' ‰„Ê@"JÏôš2ªÛ¾Â•™ LkòqH‘šº²§íg#Fó«Äær8ªûðõ)ð„¦˜Nc5-45$R,eˆMÃN« áH¨þ÷ÕðÑT{Eã*åóÆim“¡hÂX|+ØÙW¡ÆcD¶n£Zè9u7Œt¯¿fJFÃ(¨²þ¹»Ö2‰x”Te£ÛÄQ†$’Ñpcí©1022 ¡kCiU’™#Fg°_â2iÌ„ñ£Ð‰G’!ÐЭHaºJtW„ R¶ë,ãÃÑɘdf' þàA54„JI×üoÒ ³ú›fvì9T ËIÅË?£;„Ìž0ÝT¥Ð*ä×ý”Q¦ˆ%©ÙiÍ`m át™×·¹Ÿã´³Ú ,¢B|úåš³ úaä7Àp3ðÕ#ˆÞ¡•ðÄÇ`úË[fm³spŸß†-PÕŽÀÃî9ZýÌ ³Ó°öü#°îCB×fxÍL+<—ìƒIhLÇ*30 u¹·"Ÿ>¿¸k¶´ I¦KñíàmݳQQúÍ~ƒñ¾FfM/g¡ß¥²þ3ÁF› ƒ;&³¸=óÔÓÍPNbNà£GB?S-žçe(4= ÏhC«ˆ>î„÷ÑoB'ürº 7Ðô@]|ј‚¢à/Tt;°šnc†äax%l®ox©>ö›¹äoæšÏ7–÷ÿzY?ìµ<î˜~g`®HwñÍܸ›8!É¢eÑžÆV'&>¯LLŒ¥%Vó³Ûï&.çç$Þà?LüuVŽêƒzs¾Hó]ÅbÖi4BÖÁ÷èÖSFÿ Vg±êÝ:d2ó¨uV¦묇ÍCû—§¦5—2x¾¦ÙsÎ9źFC‹fÇÅÑ3›5¸×«½“Õ†¦SÔ¥×UQULÆ¡ƒ™÷Ñ,›—QÛéPÅšsF¡ÓûXÍÍY‡¦gÓ5p9Xœ0'–^×üÌÓS Ót~gU|ü½búc• zbõ»âíóêL<'ÛºœV]•ùÃqNWÐnõÑSè,ú™„9Õòâu AúC^çfd?ê-Î(i&5‡Äµó–ÅòTª—²AUcZUZ7ýQ§LÒÌFëu%ÒÁ ½–&¸ÝYT¬’)Ú›kª!º¦+«PÕÚŽ†CÕPÖ¤±DÉ z݈«Ñ¼¥«h½‚œ F#¯+¿¥÷f<‚ÂÛ/4°¹¾èa×P]ÃJ«Ôð ãžižgËD‰íCuía§F}»LK…û–Þ—“,Ôt1¢èU·*Õ;tÕ 9ä¥ÑŸ=Ê–½G×tÒ*iv†à}z[~„—¿Wg?,Òh>¤·¿ø/õƒQ)é)é—™q1­Eq¿_¦Å19ÙqÍq q+8ÑqÑœ+qÿ¡^}IýA½ì÷nø]]}¡ˆM~«#£z»j9êwëD鵈,–˜*Ã:;«ehÚ¯gr[Ê “ø9–To覟N+ˆŠ¢¦¶@Hlnæ°ÑâTDïÖëꦫÅuOvù§¦² ä,gþD%Ôµ–gU:½7©º¥%e—J+HK’,ã¨,N“‡‡X§«¨NEll\5W-¾9¹æà²-ëzuz_*KHÉ‹£QS ‚lÉYæSuí7ó—í×õ‡]—Ÿö–<¬‰¥U¦ŠUË6ˆûlØléuU¢ÓKN— ©ÔŠ5¹„Câ »@¥Íâ¸.µº_1È¢n:SÓù$…#rZiâ^é¤Aº$ý’ø'‡¡VH:[êUê!:ìþã‘(¢© +Î-@â(9Ãî»V$A/Ä’Óð-]~Ž/ŽN£7‘ªÓÙÊ·tþ¹BœÙ NUî…î¡:¬=Sù —›`eš¢û÷gCuqòG^«PœÊ"Þ[º$úšvG]¥ÖPî«ÕïÐÕ]J¢÷Z µér¤ø=:äD¦©å‘çÞ«wÄæD1í½zë…\?¤wvý—z©¬$¦$¦þX£è•x¬ŒQÕ”Éàå^fØ6]dD63þC½4XùAº­‹ø€®, H!ˆž† ÷èDéþSB.“[ª|Oÿü€m©lIÃã—XoÈ`íŸá²#“]’ÿ‚h":Ü-"äoè³çNif&ã1› ”{F7é ¾‹–‘C>5Ë0ϰÀ°ãagÃ4åš°’°†°Ö0^˜¶þdqD1à= 4n… B‘¦ öö vX6ßx ÔÀ뇚h¶3µ¡…F¶‹UòOꓟ•¥ì«ŒÚq7¸pÃcÖ¿}÷,…ÃþåjÕ+ w¯žÐ“ÑG‚±ÿk9éŠøü¡¬’ŠûñÁ½öÍ–HËŽKäÑUBEåšK|!y©j…TÚW\Ì“…ô±u ý%ô¡ ½šZÊ m冊Be¡­´HDKé!ˆš%e%r„NÑV€RByJi¥ð(ú xO¼ª@%¾ªûz:ªÀµƒl]¨ÇÿÂxº!_Wû»+#·'î/pË\ðcœ¦½—Ÿän¡ë*@9qƒ|à0û E_ˆƒ™ÅÉqú ”)D¸QùV(Ú hgfAq£ì¥  Pþ¢$Sè”b “ÒLáRDEóê—j+ÈC?5Kòzr 9ˆ|‚¬­¹„\Gn%óÈ"]¼GõèÕTÀ¡J_Ö•{¨—ö²ô8x…#RÉëÖSuHò®¸ê·‹þ} ã œjcùžÏÎq¥ê*@>úgÀîýMçÉl]NîM/,MˆÙCÓW (ˆ!‘wüQñVÈÚ hgfAv#û’QÈWÈ d*¹Ì$7“¹ä^²Œ¬yõK' D‘ÀµáøŽbIèn0¸¡¤ök†NF_à)º;˜ÿG(U#fyre-1.0.1/data/icons/0000777000175000001440000000000010512346414011503 500000000000000fyre-1.0.1/data/icons/16x16/0000777000175000001440000000000010512346413012267 500000000000000fyre-1.0.1/data/icons/16x16/Makefile.am0000644000175000001440000000013610450724636014247 00000000000000icondir = $(datadir)/icons/hicolor/16x16/apps icon_DATA = fyre.png EXTRA_DIST = $(icon_DATA) fyre-1.0.1/data/icons/16x16/Makefile.in0000644000175000001440000002334310512344604014255 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = data/icons/16x16 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(icondir)" iconDATA_INSTALL = $(INSTALL_DATA) DATA = $(icon_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ BINRELOC_LIBS = @BINRELOC_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_FDODESKTOP_FALSE = @ENABLE_FDODESKTOP_FALSE@ ENABLE_FDODESKTOP_TRUE = @ENABLE_FDODESKTOP_TRUE@ ENABLE_XDGMIME_FALSE = @ENABLE_XDGMIME_FALSE@ ENABLE_XDGMIME_TRUE = @ENABLE_XDGMIME_TRUE@ EXEEXT = @EXEEXT@ EXR_CFLAGS = @EXR_CFLAGS@ EXR_LIBS = @EXR_LIBS@ FDODESKTOP = @FDODESKTOP@ GNET_CFLAGS = @GNET_CFLAGS@ GNET_LIBS = @GNET_LIBS@ GREP = @GREP@ HAVE_BINRELOC_FALSE = @HAVE_BINRELOC_FALSE@ HAVE_BINRELOC_TRUE = @HAVE_BINRELOC_TRUE@ HAVE_EXR_FALSE = @HAVE_EXR_FALSE@ HAVE_EXR_TRUE = @HAVE_EXR_TRUE@ HAVE_GETOPT_FALSE = @HAVE_GETOPT_FALSE@ HAVE_GETOPT_TRUE = @HAVE_GETOPT_TRUE@ HAVE_GNET_FALSE = @HAVE_GNET_FALSE@ HAVE_GNET_TRUE = @HAVE_GNET_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIN32_LIBS = @WIN32_LIBS@ XDGMIME = @XDGMIME@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ icondir = $(datadir)/icons/hicolor/16x16/apps icon_DATA = fyre.png EXTRA_DIST = $(icon_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/icons/16x16/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu data/icons/16x16/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) test -z "$(icondir)" || $(mkdir_p) "$(DESTDIR)$(icondir)" @list='$(icon_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(iconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(icondir)/$$f'"; \ $(iconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(icondir)/$$f"; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(icondir)/$$f'"; \ rm -f "$(DESTDIR)$(icondir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-iconDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iconDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-iconDATA install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-iconDATA uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fyre-1.0.1/data/icons/16x16/fyre.png0000644000175000001440000000127010450610775013664 00000000000000‰PNG  IHDRóÿasBIT|dˆtEXtSoftwarewww.inkscape.org›î<JIDAT8¥“ÍNSQ…¿}ν·±J)`[)‚’ˆ‰Ñ`ĉyÂ80¾Ǿƒ¯@œ¢DIø•Z±¥´¥¿÷œíà^-:pâNNVrrÎÚ{í¬%ªÊÿ”ï>MÄ ’ " þë>xþâ%ªõàÔãœâU‰’ -´»#œ*Å|–ÓVŸÕů^¿qÎ9¶>âUñêQUðªTò€pPo£Àã{Uj?Úî71Æþ6T b0Å áÎr‘‡kev›„«Õ"[Û_Ù9Çr¥Àt6dq~ŠòÜUvOÎX®°oßíszÞÇÚ¤3€W&n-X¿]b&Ñî8ªw(LeÙÞk°{Ü«&Y¸TÞ+"©‘î¯.…†£z‡½“s¾·hu‡8¯Tær‰CUSdb6äÚ£gúGÒÄ\Jæ_iäÒ@ø z¹!¦*D,IEND®B`‚fyre-1.0.1/data/icons/22x22/0000777000175000001440000000000010512346414012262 500000000000000fyre-1.0.1/data/icons/22x22/Makefile.am0000644000175000001440000000013610450724671014240 00000000000000icondir = $(datadir)/icons/hicolor/22x22/apps icon_DATA = fyre.png EXTRA_DIST = $(icon_DATA) fyre-1.0.1/data/icons/22x22/Makefile.in0000644000175000001440000002334310512344605014250 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = data/icons/22x22 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(icondir)" iconDATA_INSTALL = $(INSTALL_DATA) DATA = $(icon_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ BINRELOC_LIBS = @BINRELOC_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_FDODESKTOP_FALSE = @ENABLE_FDODESKTOP_FALSE@ ENABLE_FDODESKTOP_TRUE = @ENABLE_FDODESKTOP_TRUE@ ENABLE_XDGMIME_FALSE = @ENABLE_XDGMIME_FALSE@ ENABLE_XDGMIME_TRUE = @ENABLE_XDGMIME_TRUE@ EXEEXT = @EXEEXT@ EXR_CFLAGS = @EXR_CFLAGS@ EXR_LIBS = @EXR_LIBS@ FDODESKTOP = @FDODESKTOP@ GNET_CFLAGS = @GNET_CFLAGS@ GNET_LIBS = @GNET_LIBS@ GREP = @GREP@ HAVE_BINRELOC_FALSE = @HAVE_BINRELOC_FALSE@ HAVE_BINRELOC_TRUE = @HAVE_BINRELOC_TRUE@ HAVE_EXR_FALSE = @HAVE_EXR_FALSE@ HAVE_EXR_TRUE = @HAVE_EXR_TRUE@ HAVE_GETOPT_FALSE = @HAVE_GETOPT_FALSE@ HAVE_GETOPT_TRUE = @HAVE_GETOPT_TRUE@ HAVE_GNET_FALSE = @HAVE_GNET_FALSE@ HAVE_GNET_TRUE = @HAVE_GNET_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIN32_LIBS = @WIN32_LIBS@ XDGMIME = @XDGMIME@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ icondir = $(datadir)/icons/hicolor/22x22/apps icon_DATA = fyre.png EXTRA_DIST = $(icon_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/icons/22x22/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu data/icons/22x22/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) test -z "$(icondir)" || $(mkdir_p) "$(DESTDIR)$(icondir)" @list='$(icon_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(iconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(icondir)/$$f'"; \ $(iconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(icondir)/$$f"; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(icondir)/$$f'"; \ rm -f "$(DESTDIR)$(icondir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-iconDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iconDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-iconDATA install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-iconDATA uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fyre-1.0.1/data/icons/22x22/fyre.png0000644000175000001440000000207110450611403013643 00000000000000‰PNG  IHDRÄ´l;sBIT|dˆtEXtSoftwarewww.inkscape.org›î<ËIDAT8­•½oUÅ÷½Ù™õzíµgƒC 1RHH¤ „!Z”š Q£”©âo á€… AJ@ØA¶×²×vvföcfî¥x³Î:T\i¤÷¥3ç{ß¹bf¬^{Ï Ä‚ˆ€ ¡ž‹ÔcwºκrïÇ/KpþÆ#’¤ˆOÁ¥".E\Ö\*HŠHš$q=v)"©÷>‘TœOE|¶~ó£ÏÄÌX½þþɇ·n-6›-ÌT 5CU©*…È /­-ñÛ_T¦Æ‹ëzG9"ÂÆêÿ¦Ü½ûE#‹ãFƒïÞFUÁ@Í0 à(°ÔN8IGüòÇ> (àœp뀋ݯ¼°HM5­TѪBUÓÐÌP5L„FäȇªJ á…Ѩ 3s<Õù™#˜*eY>2Eš­BÒp¤ùÕ œŒ‹2Ü&…$N©+jŠV†¡¨ˆP“'‰<‡Çà B3‰Ž Z1Þ ÓI¨ 'RÈ ¨Ö <Y ÀqD>c fŠóÂxR²¹±ÂÁINQZ]~u¹…DÈt8S«a®jÄQ„w /(ÊŠÊ ÓNHâ¨Î…p’=­±80›9•VŒ‹ÀÜ,üäòÅ۽ǘHxÏw;ÌÏ5ØÚ0®”ÑD©éÆR3V†ãŠQ¡‚8óžf³Áùå6;)ââ+‹s¼óæe<:¦»ÜâïýAîŒN¨ÔÈ'Šà¼Çù¨þ<—Ö–ÙëgaÏ9Zs1ᄉɷ?òLŠŠûÛ}¶{)+{m–±ÙY)ŽÒñ…•V2׌Ù;̈;‡' Ƭ¯¶ksšµTêµà†Å¤q¥ˆ$À0ÜùäöWŸ>Ú=Œ²á$´¡Ó–4}ÞÏ´¡Óý™³U™÷¿æ¥Ö%–E ÿÏûþ{´ Ð7³L›éÿÿ‚ÃëÎ’NÉ­IEND®B`‚fyre-1.0.1/data/icons/24x24/0000777000175000001440000000000010512346414012266 500000000000000fyre-1.0.1/data/icons/24x24/Makefile.am0000644000175000001440000000013610450724703014240 00000000000000icondir = $(datadir)/icons/hicolor/24x24/apps icon_DATA = fyre.png EXTRA_DIST = $(icon_DATA) fyre-1.0.1/data/icons/24x24/Makefile.in0000644000175000001440000002334310512344605014254 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = data/icons/24x24 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(icondir)" iconDATA_INSTALL = $(INSTALL_DATA) DATA = $(icon_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ BINRELOC_LIBS = @BINRELOC_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_FDODESKTOP_FALSE = @ENABLE_FDODESKTOP_FALSE@ ENABLE_FDODESKTOP_TRUE = @ENABLE_FDODESKTOP_TRUE@ ENABLE_XDGMIME_FALSE = @ENABLE_XDGMIME_FALSE@ ENABLE_XDGMIME_TRUE = @ENABLE_XDGMIME_TRUE@ EXEEXT = @EXEEXT@ EXR_CFLAGS = @EXR_CFLAGS@ EXR_LIBS = @EXR_LIBS@ FDODESKTOP = @FDODESKTOP@ GNET_CFLAGS = @GNET_CFLAGS@ GNET_LIBS = @GNET_LIBS@ GREP = @GREP@ HAVE_BINRELOC_FALSE = @HAVE_BINRELOC_FALSE@ HAVE_BINRELOC_TRUE = @HAVE_BINRELOC_TRUE@ HAVE_EXR_FALSE = @HAVE_EXR_FALSE@ HAVE_EXR_TRUE = @HAVE_EXR_TRUE@ HAVE_GETOPT_FALSE = @HAVE_GETOPT_FALSE@ HAVE_GETOPT_TRUE = @HAVE_GETOPT_TRUE@ HAVE_GNET_FALSE = @HAVE_GNET_FALSE@ HAVE_GNET_TRUE = @HAVE_GNET_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIN32_LIBS = @WIN32_LIBS@ XDGMIME = @XDGMIME@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ icondir = $(datadir)/icons/hicolor/24x24/apps icon_DATA = fyre.png EXTRA_DIST = $(icon_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/icons/24x24/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu data/icons/24x24/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) test -z "$(icondir)" || $(mkdir_p) "$(DESTDIR)$(icondir)" @list='$(icon_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(iconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(icondir)/$$f'"; \ $(iconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(icondir)/$$f"; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(icondir)/$$f'"; \ rm -f "$(DESTDIR)$(icondir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-iconDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iconDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-iconDATA install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-iconDATA uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fyre-1.0.1/data/icons/24x24/fyre.png0000644000175000001440000000211110450612315013645 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ.â'ÖIDATHÇÝ•ËnU†¿:§/ãñØã[&88#!å,@ –°Fˆ5Ê–@B¬ˬX !„x6<V€RÂr<–=¶3Ý=—î®bÑ=öÄvX ±áH-ÓuTÕ_uþ‚ÿxÉôaùÚ[+‹‘êª8„ú,RïÝ‘½ºëŠîŸŸn²Y¹ñÎûˆ¤ âp‰ˆK—Tÿ\"H‚HÇQ½w "‰÷>‘DœOD|ºzó½Ne°|ýíÃwoÝšo4š˜)¨j†ªR*” ž[]à×?w) Lg/´éîgˆk+³ÜþäËbûûOC€à˜ ‹¢0䛟6QU0P3Ì* XhÅ&C~þ}pN¸»±ËÅN›žYäÈï1€8JU´,QÕ*òÚ±™¡j˜aàÈcÊR«°€Ð ÃaN{6â ?¬ëwÁT)ŠâØ¡)jÔÑ Ä¡#ÉF¨–€àD@`”Uvé°*öIAê 5EKÃPT D¨“!<{ƒŠF„F1æÌ5#¼%ãÇšsŠ"™r®ua«¸«à¥ˆ²áS0SœFã‚õµ%v3òÂê¶=ѦUÁ丷Žz½:«QàÐÏrò¢¤4h·bâ(¨k%¦Oª80›<J-åU&fØå‹m6»0‘êa=Ýi3;²±ÝgT*ñ"œ‘Ô¨ ƒQÉ0W AœÇyO£rn±ÅÖn‚8‡8ÇÒü o¼z™{è,6ùk§_Qz&EN(ÕÈÆ%Šà¼Çù þ<—VÙÍ9š3oÞ\ç«oï³ÐjÐíeôù)€ÇŠ<+"çí1Á ½cuež;wâœcueŽkW:dÂRÁyÇF·«µJxB›*à¼Ç8¼ãÅõ[{)apõÊÍ8Â9Ç0WòÒ¸÷ WÑ&ñ{B‘ï ‚­µ( *ç‡é˜FñÊÕEvöSÖ׿0àÇߺl÷Rœ÷UÇ ØDyÏ¢ha~†sK-FyNž+/?ç`&ŽH‡cJ…×_ºÄøî—- ­2ž^“‡y¦T,Ì5Xë̳8óÚÕ Üß:`§—"–ÛM øúÎÝý¬ÖÿÓÆ&­~`í©e¹q¹Ãõ+Ž0º½Œt0Æžq^rw³Çf÷Eiÿ8ÁÔìlŠv÷“Ñù¥f<ÓˆØÞKˆÂ€­½Cöû#.¬´jœ–rê•úæãÄ@ ŒŽYÿöþჇ{A:WãñhTNdãÔx<²OÝ-‹¬÷0 Œ¦Y €E`ÈþåŒoc ôù_¬¿šbÞ›,œIEND®B`‚fyre-1.0.1/data/icons/scalable/0000777000175000001440000000000010512346414013251 500000000000000fyre-1.0.1/data/icons/scalable/Makefile.am0000644000175000001440000000014110450724720015216 00000000000000icondir = $(datadir)/icons/hicolor/scalable/apps icon_DATA = fyre.svg EXTRA_DIST = $(icon_DATA) fyre-1.0.1/data/icons/scalable/Makefile.in0000644000175000001440000002335710512344605015244 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = data/icons/scalable DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(icondir)" iconDATA_INSTALL = $(INSTALL_DATA) DATA = $(icon_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ BINRELOC_LIBS = @BINRELOC_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_FDODESKTOP_FALSE = @ENABLE_FDODESKTOP_FALSE@ ENABLE_FDODESKTOP_TRUE = @ENABLE_FDODESKTOP_TRUE@ ENABLE_XDGMIME_FALSE = @ENABLE_XDGMIME_FALSE@ ENABLE_XDGMIME_TRUE = @ENABLE_XDGMIME_TRUE@ EXEEXT = @EXEEXT@ EXR_CFLAGS = @EXR_CFLAGS@ EXR_LIBS = @EXR_LIBS@ FDODESKTOP = @FDODESKTOP@ GNET_CFLAGS = @GNET_CFLAGS@ GNET_LIBS = @GNET_LIBS@ GREP = @GREP@ HAVE_BINRELOC_FALSE = @HAVE_BINRELOC_FALSE@ HAVE_BINRELOC_TRUE = @HAVE_BINRELOC_TRUE@ HAVE_EXR_FALSE = @HAVE_EXR_FALSE@ HAVE_EXR_TRUE = @HAVE_EXR_TRUE@ HAVE_GETOPT_FALSE = @HAVE_GETOPT_FALSE@ HAVE_GETOPT_TRUE = @HAVE_GETOPT_TRUE@ HAVE_GNET_FALSE = @HAVE_GNET_FALSE@ HAVE_GNET_TRUE = @HAVE_GNET_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIN32_LIBS = @WIN32_LIBS@ XDGMIME = @XDGMIME@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ icondir = $(datadir)/icons/hicolor/scalable/apps icon_DATA = fyre.svg EXTRA_DIST = $(icon_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/icons/scalable/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu data/icons/scalable/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) test -z "$(icondir)" || $(mkdir_p) "$(DESTDIR)$(icondir)" @list='$(icon_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(iconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(icondir)/$$f'"; \ $(iconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(icondir)/$$f"; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(icondir)/$$f'"; \ rm -f "$(DESTDIR)$(icondir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-iconDATA install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-iconDATA uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-iconDATA install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-iconDATA uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fyre-1.0.1/data/icons/scalable/fyre.svg0000644000175000001440000004057310450610035014656 00000000000000 image/svg+xml Fyre application icon June 2006 Andreas Nilsson fyre http://fyre.navi.cx fyre-1.0.1/data/icons/Makefile.am0000644000175000001440000000054610450724450013461 00000000000000SUBDIRS = 16x16 22x22 24x24 scalable gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor install-data-hook: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi fyre-1.0.1/data/icons/Makefile.in0000644000175000001440000003443410512344605013474 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = data/icons DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ BINRELOC_LIBS = @BINRELOC_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_FDODESKTOP_FALSE = @ENABLE_FDODESKTOP_FALSE@ ENABLE_FDODESKTOP_TRUE = @ENABLE_FDODESKTOP_TRUE@ ENABLE_XDGMIME_FALSE = @ENABLE_XDGMIME_FALSE@ ENABLE_XDGMIME_TRUE = @ENABLE_XDGMIME_TRUE@ EXEEXT = @EXEEXT@ EXR_CFLAGS = @EXR_CFLAGS@ EXR_LIBS = @EXR_LIBS@ FDODESKTOP = @FDODESKTOP@ GNET_CFLAGS = @GNET_CFLAGS@ GNET_LIBS = @GNET_LIBS@ GREP = @GREP@ HAVE_BINRELOC_FALSE = @HAVE_BINRELOC_FALSE@ HAVE_BINRELOC_TRUE = @HAVE_BINRELOC_TRUE@ HAVE_EXR_FALSE = @HAVE_EXR_FALSE@ HAVE_EXR_TRUE = @HAVE_EXR_TRUE@ HAVE_GETOPT_FALSE = @HAVE_GETOPT_FALSE@ HAVE_GETOPT_TRUE = @HAVE_GETOPT_TRUE@ HAVE_GNET_FALSE = @HAVE_GNET_FALSE@ HAVE_GNET_TRUE = @HAVE_GNET_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIN32_LIBS = @WIN32_LIBS@ XDGMIME = @XDGMIME@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = 16x16 22x22 24x24 scalable gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/icons/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu data/icons/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-recursive ctags ctags-recursive \ distclean distclean-generic distclean-recursive distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-hook \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-info-am install-data-hook: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fyre-1.0.1/data/metadata-emblem.png0000644000175000001440000000114110263337643014035 00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“IDATxÚí—ÏŠÚP‡¿§ÐÖâ*ݹ(¸òt#¥›¾@·YÔYù¾BWºrá+¸sãÆu$TQ"Z«D:ˆôvC&ñß´t\’üî ÷ËïrÏ…—xæg ÑÏ¿?»â¥ÛWà ~¹j·Ûê’Q«Õ¶\¹q4€T*…išˆ"‚¦iÞý¾vè¸d2¹ýà÷Àøµ"€RJ)Ó4 ,Ëòlk·Û PÝn×Óz½žT¿ßW€²mÛëFÞýd2Q€šN§ªÓélõ@ˆh²RäÁõ)MÓ´}Áw}º—è'ìë ‚úuük €€»öYz€C‚îðû7–à’añ9p2À6¡þzv†Üì°mÛ{q<#"L&O›ÍfˆŽã ", ï·Z­Lz@¹\¦Ùlr{{K¥RÁ0 ŠÅ"ñxœL&Ã`0@×ub±…BF£A.—Ã0 òù<Õj•R©tÚÌçs,Ëb½^cY–7y: ›ÍÒï÷r¹"‚®ë´Z-¢Ñ蓈o;Þ(¥‡Gíõ‡Œu‡D"ð øü uà˜v(èÞ°m›årùh =W«×ëÛ©T°(_®T”~2nY_.¼ânÇ› •æ ¸fÀàN.¼v'µãÜp€[ŒÞ›°ƒ‰v…QèÁä%ž%þ Fyre GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False fyre True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 0 True GTK_PACK_DIRECTION_LTR GTK_PACK_DIRECTION_LTR True _File True True _Open image... True True gtk-open 1 0.5 0.5 0 0 True _Save image as PNG... True True gtk-save-as 1 0.5 0.5 0 0 True Save image as Open_EXR... True True gtk-save-as 1 0.5 0.5 0 0 True True _Quit True True gtk-quit 1 0.5 0.5 0 0 True _View True True _Parameters panel True True True _Interactivity preferences True False True _Cluster nodes True False True _Animation window True False True _Status bar True True True True Pause _rendering True False True True Zoom to _1.0 True True gtk-zoom-100 1 0.5 0.5 0 0 True _Zoom In True True gtk-zoom-in 1 0.5 0.5 0 0 True Zoom _Out True True gtk-zoom-out 1 0.5 0.5 0 0 True _Go True True _Back True True gtk-go-back 1 0.5 0.5 0 0 True _Forward True True gtk-go-forward 1 0.5 0.5 0 0 True True _Defaults True True gtk-clear 1 0.5 0.5 0 0 True _Random Parameters True True gtk-refresh 1 0.5 0.5 0 0 True True _Tools True True None True True True Grab True False tool_none True Blur True False tool_none True Zoom True False tool_none True Rotate True False tool_none True Exposure / Gamma True False tool_none True True A / B True False tool_none True A / C True False tool_none True A / D True False tool_none True B / C True False tool_none True B / D True False tool_none True C / D True False tool_none True True AB / CD True False tool_none True AC / BD True False tool_none True True Initial Offset True False tool_none True Initial Scale True False tool_none True _Help True True _About True True gtk-help 1 0.5 0.5 0 0 0 False False True False 0 True True GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC GTK_SHADOW_NONE GTK_CORNER_TOP_LEFT True GTK_SHADOW_NONE True False 0 0 False False True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_NONE GTK_CORNER_TOP_LEFT True GTK_SHADOW_ETCHED_IN 0 True True 0 True True True False 0 False False Animation - Fyre GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False 500 True False True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 0 True GTK_PACK_DIRECTION_LTR GTK_PACK_DIRECTION_LTR True File True True New True True gtk-new 1 0.5 0.5 0 0 True _Open... True True gtk-open 1 0.5 0.5 0 0 True True _Save True True gtk-save 1 0.5 0.5 0 0 True Save _as... True True gtk-save-as 1 0.5 0.5 0 0 True _Render... True True gtk-save-as 1 0.5 0.5 0 0 True True _Close True True gtk-close 1 0.5 0.5 0 0 True View True True Loop animation True False 0 False False 6 True False 6 True True True GTK_POS_TOP 2 GTK_UPDATE_CONTINUOUS False 0 0 1 0.01 1 1 0 True True True GTK_BUTTONBOX_DEFAULT_STYLE 8 True True GTK_RELIEF_NORMAL True False False True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-go-forward 4 0.5 0.5 0 0 0 False False True _Play True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True True gtk-add True GTK_RELIEF_NORMAL True True False True True GTK_RELIEF_NORMAL True True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-redo 4 0.5 0.5 0 0 0 False False True _Replace True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True False True gtk-delete True GTK_RELIEF_NORMAL True 0 True True 0 False False True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True True False True True False False False 0 True True 6 True False 6 True False False 8 True False 8 True <b>Transition from selected keyframe:</b> False True GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True False 0 True False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True 3 3 False 8 6 True Duration: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 1 0 1 fill True True 0.00999999977648 2 True GTK_UPDATE_ALWAYS False False 0 0 1000 0.01 1 0 1 2 0 1 True seconds False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 2 3 0 1 fill True True Linear True GTK_RELIEF_NORMAL True 1 3 1 2 fill True True Smooth True GTK_RELIEF_NORMAL True 1 3 2 3 fill True Presets: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 1 1 2 fill fill True False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 1 2 3 fill 0 True True 0 True True 0 False False True False 2 160 True 0 0.5 GTK_SHADOW_NONE 0.5 0.5 1 True 0 True True True True False GTK_POS_TOP 1 GTK_UPDATE_CONTINUOUS False 1 0 1 0.001 0.1 0 0 True True 0 False False GTK_PACK_END 0 True True 0 False False Interactivity Preferences GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False 12 True False 12 True Adjust the amount of render time per frame, in milliseconds, to balance interactive response with image quality. False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True False 5 True True True GTK_POS_TOP 1 GTK_UPDATE_CONTINUOUS False 25 1 250 1 10 0 0 True True True False 0 True Most responsive False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 True True True Highest quality False False GTK_JUSTIFY_LEFT False False 1 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 True True 0 True True 0 False True Cluster Nodes GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False 550 400 True False True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 0 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True True False False True False False False 0 True True 10 True False 12 True 2 2 False 8 8 True False True gtk-remove True GTK_RELIEF_NORMAL True 1 2 1 2 fill True False True True True gtk-add True GTK_RELIEF_NORMAL True 1 2 0 1 fill True False 8 True Hostname: False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True True True True True 0 True * True 0 True True True Port: False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True True True True 0 True * True 6 0 False True 0 1 0 1 True True Automatically discover nodes on the local network True GTK_RELIEF_NORMAL True False False True 0 1 1 2 fill 0 True True True False 10 True Adjust the minimum interval between histogram merges, in seconds: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True False 5 True True True GTK_POS_TOP 1 GTK_UPDATE_CONTINUOUS False 0.1 0.01 10 0.01 0.1 0 0 True True True False 0 True Most responsive False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 True True True Lowest bandwidth False False GTK_JUSTIFY_LEFT False False 1 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 True True 0 True True 0 False True 0 True True 0 False False 12 About Fyre GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False False True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 6 True 0.5 0.5 1 1 0 0 0 0 0 True True True False True GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True <span size="large">Lemon curry?</span> False True GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True <span size="x-small">Copyright 2004-2005 David Trowbridge Micah Dowty</span> False True GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True GTK_BUTTONBOX_DEFAULT_STYLE 0 True True True gtk-close True GTK_RELIEF_NORMAL True 0 False True 6 GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE True True False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False False True False 12 True GTK_BUTTONBOX_END True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END 6 True False 12 True gtk-dialog-warning 6 0.5 0 0 0 0 True True True True <span weight="bold" size="larger">Histogram on Fire!</span> Histogram has entered an nth complexity binary loop. Flux cascade scenario imminent. I hope you have a recent backup. False True GTK_JUSTIFY_LEFT True True 0.5 0 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False 0 True True fyre-1.0.1/data/about-box.fa0000644000175000001440000022632110263337643012531 00000000000000Fyre Animation ÿ KfrSÎ`¬ˆÄfyPRheight = 350 exposure = 0.348000 gamma = 3.482000 oversample-gamma = 1.780000 fgcolor = #928CCC bgcolor = #000000 a = 0.139471 b = 1.238058 c = -0.430232 d = 1.361748 zoom = 50.540699 xoffset = 0.861079 yoffset = 0.005447 rotation = 0.596300 blur-ratio = 0.998000 emphasize-transient = TRUE transient-iterations = 90 initial-conditions = gaussian initial-xscale = 0.361000 initial-yscale = 0.009000 initial-xoffset = 1.674000 initial-yoffset = 0.861000ã Û”fyTpGdkP”€Jÿÿÿÿÿ$ÿ ÿÿÿÿÿÿ!ÿ ÿÿÿÿ)ÿ)ÿ" /ÿ*(:ÿ20Fÿ/-Bÿ52Iÿ,*>ÿ%#4ÿ#ÿ"ÿ ÿ ÿ -ÿ+)<ÿ%$4ÿ#!0ÿ+)<ÿ(&8ÿ20Fÿ75Mÿ74Mÿ41Hÿ>;Vÿ31Gÿ1/Dÿ)(:ÿ -ÿ#"1ÿ'ÿ,ÿ%$4ÿ&$5ÿ-+?ÿ*(:ÿ)'9ÿ#!0ÿ#!0ÿ#!1ÿ41Hÿ31Hÿ<9TÿDA_ÿA>ZÿGCcÿFCbÿ;9Sÿ0.Dÿ! .ÿ(ÿÿÿ ÿÿ ÿ ÿ ÿ!ÿ'%7ÿ.,?ÿ96OÿA>[ÿDA_ÿ>;Vÿ:7Qÿ(&7ÿ&ÿÿ ÿ%#4ÿÿ ÿ ÿ ÿÿÿÿÿ ÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ ÿ ÿ ÿÿÿ ÿÿÿ ÿÿ*ÿÿÿÿ$ÿ ÿÿÿÿÿÿ ÿÿ ÿÿÿ*ÿ!ÿ%#3ÿ$"1ÿ('8ÿ31Gÿ0.Cÿ.,@ÿ(&7ÿ+ÿ! .ÿ$ÿÿ(ÿ -ÿ -ÿ#ÿ*(;ÿ#!0ÿ+)<ÿ)'9ÿ97Pÿ42Iÿ>;Vÿ85Nÿ;9Sÿ20Fÿ+)<ÿ+)<ÿ'%6ÿ -ÿ%#4ÿ&$5ÿ! /ÿ)'9ÿ#!0ÿ)'9ÿ$#3ÿ$#2ÿ0.Cÿ20Fÿ31Hÿ:7Qÿ@=YÿB?]ÿ@=Yÿ?;WÿA>ZÿA>[ÿ1/Eÿ(&7ÿÿÿÿ -ÿ(&7ÿÿÿÿÿ ÿ ÿÿ ÿÿÿÿ ÿ ÿ ÿÿ ÿ  ÿ ÿ ÿ ÿÿÿ ÿ  ÿÿÿÿÿ  ÿÿ ÿÿÿÿÿ ÿ ÿ ÿÿ ÿ ÿÿ#ÿ!-ÿÿÿ(ÿ ÿ ÿÿ ÿÿ(ÿÿ&ÿ(ÿ#ÿÿ ÿ%#4ÿ.,@ÿ'%6ÿ41Hÿ&$5ÿ/-Bÿ(&7ÿ(&8ÿ!-ÿ(&8ÿ#ÿÿ!ÿ -ÿ*ÿ -ÿ,ÿ+)<ÿ,*=ÿ63Kÿ86Oÿ97Pÿ86Oÿ:8Rÿ+)<ÿ-+?ÿ"!0ÿ$#2ÿ&$5ÿ'&7ÿ+);ÿ%#3ÿ-+>ÿ+ÿ! /ÿ#"1ÿ30Fÿ1/Dÿ:7Qÿ@=Yÿ75Nÿ?[ÿ=:Uÿ<:Tÿ0-Cÿ(&8ÿ -ÿ&ÿ ÿ ÿ ÿÿ ÿÿÿ! .ÿ#!1ÿ1/Dÿ>[ÿA>Zÿ:7Qÿ,*>ÿÿ#ÿ ÿÿ%ÿ%ÿ)ÿÿ!ÿÿ ÿÿ ÿÿÿÿ ÿÿ ÿ ÿÿ ÿ ÿÿÿÿÿ ÿ ÿ ÿÿÿÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿÿÿ ÿ#!0ÿ#!0ÿ -ÿ$ÿ!.ÿ*ÿÿ'ÿÿÿ"!0ÿ ÿ$#3ÿÿÿ ÿ#ÿ+ÿÿ$ÿ#"1ÿ30Gÿ85Nÿ20Fÿ31Gÿ%$4ÿ(&7ÿ*ÿ&$5ÿ)ÿ(ÿ#!0ÿ$ÿ! /ÿ%#4ÿ -ÿ(&7ÿ,*=ÿ:8Qÿ96Oÿ96Pÿ42Iÿ64Kÿ31Gÿ,*>ÿ)'9ÿ*(;ÿ$"2ÿ+ÿ!-ÿ,*=ÿ/-Aÿ20Fÿ1/Eÿ-+?ÿ0.Dÿ75Mÿ:7Pÿ>;Vÿ=:Uÿ<9Sÿ;9Sÿ53Kÿ0.Cÿ30Fÿ)'9ÿÿ ÿÿ ÿ ÿÿ ÿ$ÿ*ÿ'&7ÿ52Iÿ>;Wÿ85Nÿ53Kÿ31Hÿ#"1ÿ! /ÿÿ ÿÿÿ#!0ÿÿÿ%ÿ$ÿÿÿ#ÿ%ÿ ÿ)ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ  ÿÿ ÿÿÿÿÿ,*>ÿ!-ÿ+ÿ$#3ÿ*ÿÿ&ÿ#ÿÿ'ÿÿ'ÿÿÿ ÿ" /ÿ&ÿÿÿ'ÿ)'8ÿ,*=ÿ1/Dÿ#!1ÿ1/Eÿ30Gÿ-+?ÿ'%6ÿ'%6ÿ! .ÿ&%6ÿ -ÿ+ÿ(&7ÿ)ÿ(&7ÿ!-ÿ,*=ÿ75Mÿ96Oÿ:7Qÿ74Mÿ85Nÿ30Gÿ1/Eÿ,*=ÿ%$4ÿ+)<ÿ+ÿ)'9ÿ!-ÿ&%5ÿ31Hÿ53Jÿ97Pÿ85Nÿ@=ZÿA>ZÿC@^ÿ?ZÿB?\ÿ?ÿ%$4ÿ!ÿÿÿ ÿÿÿ'ÿÿÿ"ÿ!ÿ&ÿÿÿ'ÿÿ#ÿÿ ÿÿÿÿÿ ÿ ÿÿ ÿÿ ÿÿ ÿ ÿ ÿÿ ÿÿ ÿ ÿ ÿÿÿÿÿ ÿÿ$"2ÿ:7Qÿ%#4ÿ"!/ÿ(ÿ! /ÿ&ÿ*ÿ%ÿÿ ÿÿ ÿÿ$#3ÿ'ÿÿ ÿÿ+ÿ!.ÿ)'9ÿ0.Cÿ31Gÿ.,@ÿ53Jÿ1/Dÿ41Hÿ&%6ÿ&%5ÿ"!0ÿ ,ÿ(ÿ'ÿ#ÿ(&7ÿ$"2ÿ52Iÿ.,Aÿ20Fÿ<9Tÿ86OÿC@]ÿ™”·ÿˆ„ÿ?Zÿ@=Yÿ?;Wÿ;8Rÿ;9Sÿ86Oÿ42Iÿ.,@ÿ,*=ÿ.,@ÿ'%6ÿ-+?ÿ ,ÿÿ ÿ ÿÿÿÿ&$4ÿ/-Bÿ31Gÿ<9Tÿ<:Tÿ<:Tÿ64Lÿ/-Bÿ)ÿ(ÿ+ÿ%ÿ!ÿÿ)ÿ -ÿ#ÿ$ÿ,ÿ%$4ÿ&ÿ$ÿÿÿ'ÿ"ÿ*ÿ ÿÿÿÿ ÿ$ÿÿÿ ÿÿÿÿÿ ÿ ÿÿ ÿÿ ÿÿ ÿ ÿ#ÿÿÿÿ20Fÿ/-Aÿ(&8ÿ%#3ÿ(ÿ%ÿ'ÿÿ)ÿ'ÿÿÿ ÿ,ÿ+ÿÿ'ÿ)ÿ(ÿ'ÿ ,ÿ$"2ÿ)'9ÿ'&7ÿ-+>ÿ/-Aÿ53Kÿ(&8ÿ,*=ÿ(ÿ&$4ÿ$"2ÿ(ÿ"!0ÿ$ÿ#"1ÿC@^ÿC@]ÿ>;Vÿ53Jÿ>;Wÿ>;WÿQMqÿ°©èÿ»³òÿLIkÿ&$5ÿ&%6ÿ)(:ÿ" /ÿ31Hÿ(&8ÿ*(:ÿ20Fÿ97Pÿ@=YÿB?\ÿ@=Yÿ?;Wÿ@=Yÿ20Fÿ0.Cÿ#!0ÿ1/Eÿ.+@ÿ&$5ÿ,ÿÿÿ#ÿ ÿÿ ÿÿ%#4ÿ!.ÿ30Gÿ:7Qÿ>;Vÿ;8Rÿ0.Cÿ'%6ÿ*ÿÿ!ÿÿ ÿ ÿ"ÿ+ÿ$"2ÿ'ÿ"ÿ(ÿÿ(&8ÿ,ÿ" /ÿ&ÿ$ÿÿ$"2ÿ ,ÿÿÿ ÿ$ÿÿ ÿ ÿÿÿ ÿÿÿ ÿ ÿ ÿ#ÿ(ÿÿÿÿÿÿ!-ÿ"ÿ)':ÿ-+>ÿ)':ÿ%$4ÿ(&7ÿ%$4ÿÿ'%6ÿ ÿÿ%ÿ!ÿ!ÿ+ÿÿÿ&ÿ%ÿÿ$#3ÿ#"1ÿ#!1ÿ,*=ÿ.,Aÿ42Iÿ;9Sÿ74Lÿ1.Dÿ52Jÿ/-Aÿ/-Bÿ42Iÿ)ÿ ,ÿMIkÿvq¥ÿLIkÿ&$5ÿ('8ÿ2/Eÿ1.Dÿ53JÿFBaÿ…€»ÿ¤åÿ_[…ÿ)':ÿFBaÿjf•ÿqlžÿVRxÿ@=Zÿ42Iÿ=;VÿB?]ÿ@=YÿC@]ÿEB`ÿ>;Wÿ:8Qÿ31Gÿ/-Bÿ.,Aÿ1/Eÿ%#4ÿ+);ÿ41Hÿ!.ÿ'&7ÿ+ÿÿ(ÿÿ ÿ!ÿ ÿ20Fÿ30Gÿ=:Uÿ20Fÿ=:Uÿ63Kÿ'&7ÿ ,ÿ#ÿÿ -ÿÿ(ÿÿ%ÿ'%7ÿ%$4ÿ"ÿ!ÿÿ#ÿ -ÿÿ ,ÿ!-ÿ%ÿ" /ÿÿÿ ÿ!ÿÿ#ÿ'ÿ ÿÿÿ ÿÿÿÿÿ!ÿÿÿÿ*ÿ#ÿ+ÿ ÿ$ÿ$"2ÿ+)<ÿ20Fÿ-+>ÿ1.Dÿ! /ÿ'&7ÿ$"2ÿ*ÿ#ÿ%ÿ,ÿ&ÿ)ÿÿÿÿ%ÿ!ÿ -ÿ"ÿ"ÿ'%7ÿ+ÿ$#3ÿ0.Cÿ2/Eÿ*(:ÿ0.Cÿ(&8ÿXUpÿÔÎêÿ]Y‚ÿ%#3ÿ20Fÿ\Y‚ÿqlžÿ_[†ÿDA`ÿ+)=ÿ20Fÿ-+>ÿ31Hÿ97Pÿkf–ÿ–Òÿoj›ÿ64Lÿ75Nÿd`Œÿxs¨ÿ`\‡ÿ1/Dÿ=:Vÿ97Pÿ85Nÿ=:UÿC@^ÿB?\ÿ@=Yÿ?ÿ,ÿ'%6ÿ ,ÿ&ÿ$ÿ ÿÿÿ!ÿÿ*ÿÿ&ÿ"ÿ!.ÿÿ%ÿ$"2ÿ'&7ÿ42Iÿ1/Dÿ31Hÿ20FÿXTzÿº³ôÿ“Ìÿ97Pÿ(&8ÿHEeÿ`\‡ÿje”ÿ`\†ÿHEeÿ52Iÿ75Mÿ1/Dÿ20FÿSOtÿ‚|¶ÿ}x°ÿ?[ÿHDdÿA>[ÿA>[ÿ@=Yÿ<9Sÿ42Iÿ:7Pÿ1/Eÿ'%6ÿ%$4ÿ(&7ÿ/-Aÿ+)<ÿ31Gÿ)':ÿ'ÿ#ÿ ÿ"ÿ!ÿ+ÿ&$5ÿ53Jÿ31Gÿ<9Tÿ53Jÿ20Eÿ'%6ÿ" /ÿ$ÿ"ÿ#ÿ ,ÿ -ÿ&$4ÿ ÿ -ÿ"!0ÿ)ÿÿ+ÿ&ÿ*ÿ!ÿ$ÿ!-ÿ"ÿÿ)ÿÿ$ÿ,ÿ ,ÿ!ÿ*ÿ -ÿ#ÿ(ÿÿ%ÿ$ÿ(ÿ'ÿ'ÿ$ÿÿ$ÿ -ÿ$ÿ&ÿ&ÿÿÿÿ%ÿ*(;ÿ)'9ÿ+)<ÿ,*>ÿ! .ÿ+ÿ$#3ÿ+ÿ!.ÿ!ÿÿ$ÿ ÿÿ ÿ'ÿ$ÿ!ÿÿ#ÿ ÿ#ÿ&%5ÿ2/Eÿ0.Cÿ/-Bÿ-+?ÿ:8Rÿz²ÿž—Ýÿmh˜ÿ/-Aÿ)'9ÿ?ÿ2/Eÿ.,@ÿ(&8ÿ.,@ÿ20Fÿ/-Bÿ)'9ÿ'%6ÿ&$5ÿ%ÿÿ(ÿÿ,ÿ#"1ÿ20Fÿ:8Qÿ;8Rÿ63Kÿ85Nÿ,*=ÿ%ÿ+)<ÿ$"2ÿ$"2ÿ-+?ÿ1/Dÿ-+?ÿ/,Aÿ0.Cÿ! .ÿ(&8ÿ#ÿ!.ÿ,ÿ%ÿ -ÿ+ÿ(ÿ! .ÿ"ÿ)ÿÿ$"2ÿ#"1ÿ$ÿ'%6ÿ'ÿ#ÿÿÿ#ÿ%#3ÿ'ÿÿ)ÿ$ÿ"!0ÿ%#4ÿ$"2ÿ"ÿ ,ÿ -ÿÿ(ÿ)'9ÿ!ÿÿ ,ÿ)(:ÿ&$5ÿ"!0ÿ+ÿ%#3ÿ,*=ÿ"!0ÿ*ÿ(ÿ&ÿ ÿ%ÿÿ ÿÿ#ÿÿÿÿ$ÿ$ÿ#ÿ+ÿ$"2ÿ-+@ÿ<9Sÿ:7QÿJGhÿ€z³ÿ‹…ÃÿZV~ÿ#!1ÿ'ÿ86OÿIFgÿ\Xÿ[WÿSOuÿGCcÿ=:Uÿ85NÿVRxÿvq¥ÿhd’ÿ:7Qÿ#!0ÿ1/EÿSPuÿd`Œÿ[W€ÿEBaÿ?;Wÿ>ÿ20FÿUQvÿ€{³ÿ{v­ÿQNrÿ" /ÿ ,ÿ)'9ÿ>;WÿSPuÿWT{ÿYU}ÿMJlÿC@^ÿIEfÿkg–ÿrm ÿPLpÿ!ÿ"ÿ86OÿSOtÿb]‰ÿWSyÿ?ÿ,*=ÿ+)<ÿ-+?ÿ,*>ÿ0.Cÿ41Hÿ)'9ÿ-+?ÿ+)<ÿ! .ÿ"!0ÿ'%6ÿ+);ÿ41Hÿ=:Uÿ96OÿFCbÿDA_ÿC@^ÿFCbÿ;8Rÿ>ÿ<9Sÿ]Y‚ÿxs¨ÿmi™ÿDA_ÿ#!0ÿ+ÿ!.ÿ=;VÿGDdÿYU|ÿYU}ÿSOtÿHEeÿZV}ÿnišÿ]Yƒÿ63Kÿ(ÿ -ÿ96OÿYU}ÿ`\‡ÿQMqÿ<9TÿQMrÿ|µÿމÇÿa]‡ÿ.,AÿKGhÿSOtÿ;8Rÿ*(:ÿ42Iÿ-+?ÿ-+>ÿ<9Tÿ1/Eÿ,*=ÿ)(:ÿ+*=ÿ$"2ÿ41Hÿ30Gÿ63KÿB?]ÿB?]ÿDA_ÿKGiÿLHjÿLHjÿHEeÿKHiÿPLpÿVRxÿWSyÿXT{ÿ^Z„ÿb^‰ÿid“ÿoj›ÿrm ÿ{v¬ÿŠ…Âÿ ™àÿytšÿ+ÿ)ÿ ÿ(ÿÿ&ÿ ÿÿÿ!ÿ%ÿ!ÿ*ÿ!.ÿ*ÿ" /ÿ+ÿÿ%#3ÿÿ!ÿ#ÿ+ÿ!.ÿ$"2ÿ#!1ÿ*ÿ,ÿ$"2ÿ$"2ÿ ÿ ÿÿÿ#!1ÿ,ÿ*ÿ+ÿ(&7ÿ$#2ÿ'&7ÿ+)<ÿ'%6ÿ+);ÿ$ÿ!ÿ"ÿ#!0ÿ$ÿÿ! /ÿ ÿÿÿ&ÿ! /ÿ:7Qÿ&$5ÿ! .ÿ -ÿ'%6ÿ'%6ÿ<9Tÿ^[„ÿto£ÿb^ŠÿEB`ÿÿ ÿ" /ÿ0.Dÿ@=ZÿOKnÿXT{ÿTPuÿYU}ÿgcÿje”ÿGDcÿ%$4ÿ!-ÿ.,@ÿEB`ÿYU}ÿ^Z…ÿQNrÿUQwÿ}x¯ÿ~y°ÿUQwÿ-+?ÿEB`ÿqmŸÿŠ„Áÿ]Y‚ÿ<9Sÿ/-Bÿ/-Bÿ;9Sÿ96Oÿ74Mÿ30Gÿ74Lÿ86Oÿ:8Rÿ;8SÿA>[ÿC@^ÿJFgÿJFgÿKGiÿNKmÿPMqÿPLpÿQMrÿQMrÿVRxÿROsÿTPvÿWSzÿZV~ÿ_[…ÿa]ˆÿid“ÿrm ÿ{v¬ÿ‘‹ËÿÁ¹óÿMJ\ÿÿ#ÿ -ÿ%ÿ*ÿÿ!-ÿÿ$ÿ)ÿ!ÿ"ÿ!.ÿÿ ÿ,ÿÿÿ%$4ÿ!ÿ%ÿ#!1ÿ+ÿ*ÿ+ÿ'%6ÿ#ÿÿ(ÿ ÿÿ ÿÿ ÿ"ÿ"ÿ)ÿ" 0ÿ$#3ÿ41Hÿ.,@ÿ'%6ÿ(&8ÿ+ÿ$ÿ+ÿ(ÿ#ÿ(ÿÿ!ÿ"ÿÿÿ<9Sÿ31Hÿ! .ÿ! /ÿ$"2ÿ/-Bÿ53Jÿ/-BÿA>[ÿZV~ÿlh˜ÿ]Yƒÿ96Oÿ#ÿÿ"ÿ.+?ÿA>[ÿIEfÿROtÿVRyÿc_‹ÿokœÿ]Y‚ÿ52Iÿ*(;ÿ*(:ÿ41HÿGCcÿ\Xÿ[Wÿ`\‡ÿup¤ÿws¨ÿQNrÿ%#3ÿ?;VÿA>[ÿEBaÿA>[ÿC@]ÿ<9TÿB?\ÿB?]ÿDA_ÿKHjÿMJlÿQMqÿPMpÿLIkÿPLpÿROsÿMJlÿMIlÿEBaÿLIkÿLIkÿHEeÿKGiÿNJmÿLIkÿOLoÿNKnÿVSyÿ_[…ÿxs¨ÿ‰¼ÿ*ÿ ÿ ÿÿ ÿ ÿÿÿÿÿ&ÿÿÿÿÿÿ#ÿÿÿ'ÿÿÿ ÿ(&7ÿ+)<ÿ&ÿ&ÿ+ÿ*ÿ ÿ ÿÿÿ ÿ  ÿÿ%ÿÿ$"2ÿ+ÿ+)=ÿ&$5ÿ%$4ÿ#!1ÿ&$4ÿ+)=ÿÿ#ÿ#ÿ)ÿÿÿ ÿÿ]Y‚ÿTPuÿ;8Rÿ42Iÿ&$4ÿ/,Aÿ0.Cÿ*ÿ.,@ÿEBaÿb^Šÿmh™ÿXT{ÿ42Iÿ&%6ÿÿ*ÿ)'9ÿ86OÿB?\ÿNJmÿ\X€ÿhc‘ÿhd’ÿOKoÿ75Mÿ-+?ÿ-+>ÿ96OÿLIjÿ[Wÿfbÿvq¥ÿpkÿFCbÿ! .ÿ'%6ÿQNrÿpkÿd`ÿ@=YÿB?\ÿDA_ÿFBaÿFCbÿGDdÿJGhÿGDdÿDA`ÿIFfÿB?]ÿDA_ÿJGhÿIFfÿOKnÿHEeÿIFfÿIEfÿDA`ÿ>;Wÿ85Nÿ>;Vÿ86Oÿ74Lÿ86Oÿ86Nÿ.,@ÿ63Kÿ'%7ÿ(&8ÿ.,Aÿ20Fÿ31GÿJGhÿ/-Aÿÿÿÿÿ ÿ ÿ"ÿÿÿ ÿÿ(ÿÿÿÿÿ#ÿÿÿ)ÿÿ"ÿÿ)ÿ+ÿ! .ÿ -ÿÿ  ÿÿ ÿÿÿÿÿ'ÿ"ÿ"ÿ'ÿ(&7ÿ#"1ÿ0.Cÿ!-ÿ1.Dÿ%ÿ%#3ÿ -ÿ,ÿ -ÿ#ÿ ÿÿ#ÿ`\‡ÿgcÿXT{ÿNJmÿDA_ÿ@=Yÿ74Lÿ97Pÿ.,Aÿ.,AÿC@^ÿ[WÿfbÿSOtÿ31Hÿ#ÿ)ÿ+ÿ%$4ÿ,*=ÿ>;WÿIFgÿ]Y‚ÿmi™ÿa]ˆÿIEfÿ=;Vÿ86Oÿ63KÿB?\ÿPMqÿd`Œÿvq¦ÿpkÿEBaÿ'%7ÿ&$5ÿEB`ÿd`Œÿkf–ÿLIkÿ86OÿEB`ÿHEeÿEB`ÿFCcÿKHiÿGDdÿC@^ÿHDdÿIFfÿJGhÿDA_ÿGDcÿHEeÿGDdÿ?;Vÿ<9TÿHDdÿYU}ÿc_‹ÿRNsÿ;9Sÿ&$5ÿ!.ÿ&ÿ+);ÿ20Fÿ42HÿKGiÿc^Šÿjf•ÿ\XÿPMqÿB?]ÿ>;Wÿ30GÿC@]ÿ]Yƒÿsn¡ÿpkÿOLoÿ1/Dÿ&%6ÿ>;VÿYU|ÿlh˜ÿWT{ÿFCbÿ@=YÿGDdÿNKnÿIFgÿJGhÿJFgÿEBaÿB?]ÿFCbÿA>[ÿC?]ÿ@=Yÿ?[ÿ52Iÿ1/Dÿ20Eÿ86Oÿ20Fÿ;8RÿTPuÿeaŽÿb^‰ÿVRxÿPMpÿKHiÿDA_ÿ74MÿTQvÿqlžÿsn¡ÿXT|ÿ>;Vÿ1/Dÿ<:TÿROsÿeaŽÿa]‰ÿDA_ÿGDcÿMJlÿYU}ÿkf•ÿZV{ÿGDcÿFCaÿA>[ÿ74Mÿ:8Rÿ=:Uÿ;8Rÿ:8Qÿ86Oÿ:7Pÿ+)<ÿ(&8ÿ$"2ÿ#ÿ ÿ ÿÿ ÿÿÿÿ ÿ ÿ#ÿÿ(ÿ#!1ÿÿÿÿÿ ÿÿÿÿ ÿ ÿÿ ÿÿÿÿ  ÿÿ'ÿÿ ÿ ÿÿ"ÿÿ!ÿ$ÿÿÿ ÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿ ÿÿ!ÿ)'9ÿ-+>ÿ!.ÿ)'9ÿ.,@ÿ/-Aÿ$"2ÿ*(:ÿ)'9ÿ?=Nÿzªÿ+)<ÿ!ÿ.,@ÿ;8Sÿ?[ÿ42IÿEB`ÿ_[…ÿfbÿOKnÿTPuÿjf•ÿ’ŒÌÿ½µúÿæá÷ÿmj‚ÿ>;Wÿ:7Pÿ=:Uÿ:7Qÿ/-Aÿ,*>ÿ53Kÿ:7Pÿ42Iÿ1.Dÿ%$4ÿ$ÿ ÿÿÿ ÿ ÿ ÿÿÿÿ&ÿ(&8ÿ('8ÿ:7Qÿ;9Sÿ30Gÿ ÿÿÿÿ ÿ&ÿ ÿÿÿ ÿ ÿÿ ÿÿ ÿ ÿÿ ÿÿ ÿÿÿÿÿ ÿ#ÿ ÿ ÿÿÿ  ÿ ÿ ÿÿ ÿ ÿÿÿÿ ÿÿ%#3ÿ"!/ÿ%#3ÿ'%6ÿ,*=ÿ(&8ÿ'%7ÿ(&8ÿ*(:ÿkhÿÉÂöÿpkÿ;8Rÿ'ÿÿ,*>ÿ20Fÿ52Jÿ97Pÿ<9Tÿ>[ÿ63Kÿ<9Sÿ-+?ÿ42Iÿ75Mÿ75Mÿ1/Eÿ1/Eÿ*(;ÿ&$5ÿ ÿ'ÿ ÿ ÿ ÿÿ ÿÿ  ÿÿ(ÿ,*=ÿ*(;ÿ;9SÿJFgÿDA_ÿ0-Bÿÿÿ ÿÿÿ ÿÿ ÿÿÿ!ÿÿÿÿÿÿ ÿÿÿÿÿ ÿÿ ÿÿ  ÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿ)ÿ*ÿ.,@ÿ+)<ÿ(&7ÿ'%6ÿ-+>ÿ(&8ÿ" /ÿ85Nÿ¥žáÿ ™àÿqlžÿC@^ÿ)'9ÿ ÿÿ'ÿ%#3ÿ%#4ÿ1/Dÿ53Jÿ;8Rÿ?ÿ31Hÿ0.Cÿ97Pÿ?ÿ75MÿSOtÿmh˜ÿGDdÿ64Lÿ.,@ÿ:7Qÿ97Pÿ:7Pÿ42Iÿ/-Bÿ0.Cÿ,*>ÿ&ÿ ÿ ÿÿÿ ÿ(ÿ!ÿ(&8ÿ+)<ÿ96Oÿ<9SÿD@^ÿKGiÿQMqÿXT{ÿ[W€ÿ\Xÿÿÿÿÿ ÿÿÿ ÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿ ÿ ÿÿ ÿÿÿÿ ÿÿÿÿ ÿÿ ÿÿÿÿ ÿ ÿ ÿ)ÿ&ÿ'%7ÿ)'9ÿ#!1ÿ*(;ÿ,ÿ+)<ÿ/,Aÿ$"2ÿQNrÿpkœÿ|µÿto£ÿ^Z„ÿ>;Wÿ)'9ÿÿ ÿÿÿÿ(ÿ#!0ÿ)ÿ1/Dÿ)':ÿ74LÿGDcÿURxÿWT{ÿWSzÿIEfÿKGiÿJGhÿMJlÿROsÿb^ŠÿeaŽÿro”ÿ`\ÿa\„ÿnj—ÿmi™ÿto ÿƒ¦ÿ\X€ÿURxÿ[W€ÿ[W€ÿeaÿup£ÿz²ÿojœÿTPvÿ64Lÿ('8ÿ52JÿZV}ÿ‚|¶ÿŽˆÇÿEBaÿ=:Uÿ31Hÿ:7Qÿ75Mÿ;8Rÿ64Lÿ53Jÿ*(;ÿ" /ÿ*ÿ"ÿ!ÿ!ÿ%ÿ!-ÿ"!0ÿ+)<ÿ0.Cÿ41HÿEA`ÿIEfÿIFgÿMIkÿQNrÿMIlÿVRxÿ75Mÿ ÿÿ ÿÿ ÿ ÿÿÿÿÿ ÿ ÿÿÿ ÿÿ ÿÿÿÿÿ ÿÿÿ ÿ ÿÿÿ ÿÿ ÿ ÿ&ÿÿÿÿ ÿÿ ÿÿ!ÿ ÿÿ#ÿ)'9ÿ,*>ÿ*(:ÿ)'9ÿ%#4ÿ/-Bÿ;9Sÿ_[…ÿto¢ÿsn¡ÿ`\†ÿLHjÿ74Mÿ&ÿÿ ÿ ÿ,ÿ*ÿ!.ÿ!.ÿ*(;ÿ*(:ÿ42IÿIEfÿSPuÿ\XÿWSzÿLHjÿIEfÿC@]ÿOKoÿXT{ÿd`ÿ«¦Ìÿ«§Éÿ“Æÿ–Ïÿfbÿ‚}±ÿäàøÿie“ÿvq›ÿa]ˆÿoj›ÿwr§ÿxs¨ÿrn ÿie”ÿSOtÿ<9Sÿ2/EÿC@]ÿb^Šÿ{v¬ÿsn¡ÿ_[…ÿDA^ÿ96Oÿ52Jÿ52Jÿ41Hÿ86Nÿ53Jÿ'&7ÿ" /ÿ%#3ÿ$"2ÿ ÿÿ ÿ#!1ÿ,*>ÿ(&8ÿ85Nÿ:7QÿDA_ÿFCbÿJFgÿEBaÿGDdÿ?;WÿB?\ÿEA`ÿHDdÿDA_ÿ?ÿ42Iÿ75NÿEBaÿC@^ÿC@^ÿEBaÿ@=Yÿ52Iÿ-+?ÿ*(;ÿ&ÿ(ÿ!ÿÿ/,Aÿÿ#ÿÿÿ"ÿ ÿÿÿ&ÿ ÿ ÿ ÿ!ÿÿ ÿ ÿ ÿÿ ÿ ÿ  ÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿ ÿ%ÿÿÿ'ÿÿ ,ÿÿÿÿÿÿ!ÿ*ÿ%#4ÿ&%5ÿ(&7ÿ'ÿ&ÿ ,ÿ,*=ÿ*(;ÿC@^ÿOKnÿYU|ÿ[W€ÿYV}ÿPLpÿHEeÿ<9Tÿ96Oÿ<9Sÿ75Mÿ;9SÿC@]ÿC@^ÿ?;WÿDA`ÿ=:Uÿ:7Qÿ41Hÿ74Lÿ74Mÿ@=Yÿ?[ÿDA`ÿ@=Zÿ=:UÿA>\ÿ63Kÿ0.Cÿ+);ÿ" /ÿ! .ÿ#"1ÿ)ÿÿ)ÿ -ÿ*ÿ+ÿÿ ÿÿ ÿÿ ÿ ÿ ÿÿ ÿÿÿ ÿÿÿÿ ÿÿÿ ÿ ÿ$ÿÿ&ÿ ÿÿ!-ÿÿÿÿÿÿ#ÿ ÿ ÿÿ ÿ"ÿ ÿÿ ÿÿ)ÿ#ÿ%ÿ64Lÿ(ÿ+ÿ#!1ÿ#"1ÿ#"1ÿ"!0ÿ -ÿ%$4ÿ1/Eÿ@=YÿQMqÿWTzÿ[WÿYV}ÿWSzÿSOtÿMJlÿEA`ÿDA_ÿFCbÿ@=YÿEBaÿB?\ÿGDdÿVRxÿUQwÿ[Wÿ‡‚½ÿ–Ûÿc_‹ÿOLoÿ[W€ÿlh˜ÿ™“ÖÿŒ†Äÿ’ŒÌÿ·°ôÿ¡›Ùÿ¼´øÿ«¤ìÿŠ„Áÿ£œßÿ³¬æÿÛ×ôÿ°­Óÿzu«ÿxs¨ÿ}x¯ÿup£ÿie”ÿie“ÿsn¡ÿ„~¸ÿ¤ÖÿßÛóÿc_~ÿMJlÿMJlÿLHjÿOKnÿKHiÿMIkÿMIkÿNKmÿPMpÿLHjÿPLpÿKHiÿ<:TÿC@^ÿ52Iÿ0.Dÿ!-ÿ*ÿÿ!-ÿ#!0ÿ!.ÿ"ÿ+ÿ&$4ÿ)ÿÿÿÿ$ÿ ÿ -ÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿ ÿ"ÿ)ÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ&ÿÿ%ÿÿ30Gÿÿ#ÿ&ÿ ,ÿ'%6ÿ/-Aÿ20Eÿ0.Dÿ:8Qÿ@=ZÿEBaÿIFfÿRNrÿTQvÿZV~ÿ_[…ÿSPuÿPMpÿJGhÿA>[ÿFCbÿ=:Uÿ=:UÿA>[ÿXT|ÿXT{ÿVSyÿ]Y‚ÿwr§ÿœ•Úÿ†€¼ÿtp£ÿwr§ÿ…€»ÿ£œãÿºµàÿÎÈùÿãßøÿáÚþÿÙÕ÷ÿ¸±ðÿÉÀùÿÌÃôÿ‹…·ÿ”ŽÇÿup ÿie“ÿkg—ÿc_‹ÿHEeÿ<:Tÿ.,Aÿ?ÿÿ$ÿ'&7ÿÿÿ ÿ)ÿÿÿ ÿ ÿ ÿ ÿÿ ÿÿ ÿ ÿ ÿÿÿ ÿ&ÿ"ÿ'ÿ!-ÿ$"2ÿ!ÿ ÿ!ÿÿ"ÿÿ ÿÿ!ÿÿ ÿÿ#ÿÿÿ(ÿÿÿÿ75Mÿ'%7ÿ*(:ÿ(&8ÿ+)=ÿ63Kÿ53Jÿ>;Vÿ@=ZÿEBaÿIEfÿB?\ÿD@_ÿKGhÿLIjÿPMpÿURxÿWSzÿWSyÿNJmÿMJlÿHEeÿB?]ÿFCbÿGDdÿHEdÿ™“Õÿ†¼ÿ€{³ÿƒ}·ÿ„~¸ÿ•ŽÐÿ™’Öÿƒ~¸ÿ|v­ÿŠÉÿÌÆñÿľçÿßÙ÷ÿÕÎ÷ÿãßùÿïêÿÿÒÌýÿ¨¡ëÿ|w®ÿÇ¿öÿ¢›Ðÿnišÿlh˜ÿa]ˆÿLIkÿ?;WÿB?\ÿA>[ÿ@=YÿEB`ÿHEeÿKGhÿNKmÿURxÿTPvÿUQvÿWSzÿXT{ÿRNsÿKGhÿFCbÿB?]ÿ<9Tÿ+*=ÿ)'9ÿ ÿ$ÿ"ÿ)ÿ+ÿ'ÿ!-ÿ"!0ÿ#ÿ$ÿ%ÿÿÿÿÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿ ÿÿ  ÿ'ÿ+ÿ ,ÿÿÿ#ÿ&ÿ ÿÿ(ÿ ÿ ÿ ÿÿÿÿÿ ÿ ÿÿ ÿ ÿÿÿ(ÿVSyÿ?;WÿEBaÿFCbÿGDcÿJGhÿKGiÿIEfÿHEeÿDA_ÿB?\ÿB?\ÿ=;VÿHEeÿHEeÿQMqÿPMqÿRNsÿQMqÿJGhÿGDdÿGDdÿFCcÿup¤ÿ†¼ÿ}x®ÿtp£ÿnjšÿhd’ÿto£ÿ‡ÆÿŠ„Áÿ˜’ÅÿÑÊôÿäÝýÿÔÍøÿóíÿÿýûÿÿúøÿÿëçþÿØÐüÿ½¶ìÿÍÅúÿ˜’Îÿ‰„Àÿytªÿa]‡ÿQNrÿNJmÿZV~ÿhd’ÿ~y°ÿ‰ÉÿŠÊÿA>Zÿ?;Vÿ;8Rÿ>;Vÿ;9SÿB?\ÿEBaÿHEeÿJGhÿGDdÿPMqÿVRxÿZVÿVSyÿWT{ÿVRyÿQMrÿDA_ÿ;9Sÿ31Gÿ/-Aÿ%#3ÿ$"2ÿ$#2ÿ+)<ÿ! .ÿ%#3ÿ'%7ÿ -ÿÿ%ÿ -ÿ ÿÿ"ÿÿÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ%#4ÿ1/Eÿ+ÿ&ÿ#ÿ#"1ÿÿ*ÿÿ$ÿÿÿÿÿÿ ÿ ÿ ÿÿ%ÿ"ÿÿÿÿ  ÿZV~ÿTQvÿPLpÿPLpÿLIkÿPLpÿIFgÿKGiÿKHiÿKGhÿDA_ÿDA_ÿ?;Vÿ;8Sÿ<9TÿFCbÿHEeÿKHiÿYU|ÿZV~ÿ_[†ÿYV}ÿWSzÿPLoÿEB`ÿ0.Cÿ'%6ÿ-+?ÿ-+?ÿ!.ÿ$ÿ"!0ÿ)'9ÿ$"2ÿ%ÿ&%6ÿ$ÿ)ÿ!ÿ ÿ ÿÿÿÿ ÿÿ ÿ ÿ ÿÿ#"1ÿ'%6ÿ -ÿ#"1ÿ*ÿ)ÿ$ÿ*ÿÿÿÿ ÿÿÿÿÿÿÿ!ÿÿÿÿÿÿÿ;9Sÿc_‹ÿ]YƒÿYV}ÿMJlÿPLpÿKGiÿGDdÿA?\ÿA>\ÿ?ÿ96Pÿ@=YÿEBaÿOLoÿTPuÿSPuÿXTxÿÛ×ìÿ¥ŸÑÿhd’ÿEB`ÿ@=Zÿ@=YÿURxÿie“ÿto¢ÿ‚|¶ÿŸ™ÖÿÓÍ÷ÿâÛþÿèâÿÿùøÿÿÿÿÿÿÿÿÿÿüûÿÿðëÿÿ¶®åÿ¯¨àÿÊÃëÿ|³ÿ{´ÿŒ†Äÿ’ŒÌÿŠ„Áÿzu«ÿfaŽÿVSyÿLIkÿUQwÿGCcÿ=:Uÿ>ÿ0.Cÿ@=YÿKHjÿVRyÿ\Xÿa]ˆÿgc‘ÿ_[…ÿZV}ÿGDdÿ-+?ÿ(&8ÿ ,ÿ"!0ÿ+ÿ%ÿ)'9ÿ('8ÿÿ(ÿ+ÿÿ"ÿÿ ÿ ÿÿÿ ÿ ÿÿ ÿÿ+)<ÿ)'9ÿ,*>ÿ+ÿ ,ÿ&ÿ#!0ÿ ÿ -ÿ ,ÿÿ ÿÿ ÿ'ÿÿ ÿ ÿÿÿ ÿÿÿÿÿÿRNrÿVRxÿTPuÿOKoÿIFfÿHEeÿEB`ÿ86Oÿ1/Eÿ1/Dÿ1.Dÿ.,@ÿ$#3ÿ(ÿ" /ÿ! .ÿ%#4ÿ+ÿ-+>ÿ<9Sÿ?Zÿ>;Wÿ<9TÿDA_ÿ64Lÿ31Gÿ.,@ÿ30Gÿ$"2ÿ(&8ÿ,ÿ#ÿ"ÿ-+?ÿ)':ÿB?]ÿKHiÿVRyÿc_‹ÿkf–ÿplžÿlh—ÿ]Y‚ÿHEeÿ" /ÿ)':ÿ%$4ÿ+ÿ!.ÿ#!0ÿ$"2ÿ&ÿ%#3ÿ(ÿ!-ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿ*(:ÿ)':ÿ#!0ÿ#!0ÿ!-ÿ)ÿ&$4ÿ#"1ÿ#ÿÿ(ÿ%ÿÿ+ÿÿ ÿÿ#ÿ!ÿ(ÿ!ÿ%ÿÿÿ ÿ  ÿ$#3ÿHEdÿMJlÿGCcÿ<9Tÿ96Oÿ85Nÿ,*>ÿ/,Aÿ)'9ÿ&$5ÿ!-ÿ$ÿ ÿ ,ÿ!ÿ'ÿ+ÿ)(:ÿ31Hÿ31GÿDA_ÿPLpÿRNsÿSPuÿZWÿd`Œÿwr¦ÿŒ‡Äÿ‘‹Ëÿ‘‹ËÿŽˆÆÿ|´ÿ{v¬ÿ†¶ÿ§¢Ðÿ‰¼ÿ¿·ôÿ×ÏþÿôñþÿïìüÿøôÿÿêäþÿÛÖ÷ÿ´­ÞÿÕÑòÿ¬¦áÿ„~¸ÿrn ÿeaŽÿZV~ÿfbÿ‘ŒÌÿ—Ûÿzuªÿ^Z„ÿWSzÿQMqÿJGhÿEA`ÿ:7Qÿ@=Zÿ74Lÿ;8Sÿ+)<ÿ%#4ÿ'ÿÿÿÿ%ÿ#ÿ#ÿ-+?ÿB?]ÿIFgÿ[W€ÿie”ÿxs¨ÿ|w®ÿvq¥ÿ[X€ÿ*(;ÿ#!0ÿ,ÿ%$4ÿ%$4ÿ)'9ÿ)ÿ%#3ÿ&$4ÿ"ÿÿÿÿÿÿ ÿÿÿÿÿ*ÿ(&8ÿ*ÿ!.ÿ" /ÿ$#3ÿ$ÿ)'9ÿÿ'ÿ#"1ÿ)ÿÿÿÿ*ÿÿÿÿ'ÿÿ ÿÿÿ$ÿ"ÿ!ÿ.+@ÿ;8Sÿ86Oÿ,*=ÿ30Fÿ+ÿ -ÿ&ÿÿ"ÿÿ!ÿ"!/ÿ!ÿ"ÿ'%6ÿ#"1ÿ1.Dÿ31Gÿ<9Tÿ53KÿDA_ÿGDdÿKHiÿQMqÿLHjÿPLoÿUQvÿpkœÿ‚|¶ÿ‚}·ÿz²ÿ„~¸ÿ‹…Âÿ½¸àÿÇÁéÿÏÆøÿ¬¤âÿ½¶õÿàÝûÿåáüÿâÞùÿÅ¿ìÿÜ×ùÿÊÄìÿ‹Æÿ–Òÿtp£ÿ[W€ÿMJlÿFCbÿA>[ÿplÿµ­íÿ®¦Ùÿa]‡ÿWSzÿTQvÿKHjÿ:7Qÿ>;Wÿ31Gÿ)':ÿ.+?ÿ" /ÿ+ÿ#ÿÿ ÿ ÿÿ ÿ ÿÿ&$5ÿ:7QÿHEdÿ^Z„ÿvq¦ÿŒ†Äÿ•Ñÿto¢ÿÿ(ÿ'%7ÿ!-ÿ+*=ÿ$"2ÿ%ÿ! /ÿ'%6ÿ+ÿ! .ÿÿ)ÿÿ  ÿÿ ÿÿÿ#"1ÿ$"2ÿ#"1ÿ'%6ÿ#!1ÿ$#3ÿ+ÿ#!1ÿÿÿ$"2ÿ"!0ÿ$"2ÿ$ÿ+ÿ! .ÿ)ÿÿ%ÿÿÿ%ÿ$ÿ$"2ÿ&ÿ"ÿÿ"ÿ(ÿ'ÿ*ÿ*ÿ$ÿ"ÿÿÿ ÿÿÿ#ÿÿÿ+ÿ,ÿ.,@ÿ75Mÿ=:Uÿ41HÿB?\ÿ85Nÿ=:UÿEBaÿPLoÿMIkÿZVÿsn¡ÿuq¤ÿfbÿXU|ÿ^Z„ÿsn¡ÿz²ÿ‚|¶ÿ´­ïÿ…ºÿ˜’ÕÿžüÿÊÃúÿÙÖôÿÒËûÿÒÎðÿ°©ìÿ‡‚½ÿ„¹ÿ–Òÿ~y°ÿfbÿ`\‡ÿQMqÿNKmÿRNsÿ¥ŸÈÿ«¨ÀÿXT{ÿYU}ÿVRxÿHDdÿ=:Uÿ1/Dÿ+)<ÿ#"1ÿ-+?ÿ(ÿÿ&ÿ(ÿ ÿÿÿ ÿÿÿÿ&ÿ20GÿHEeÿlg—ÿ“ÎÿÇ¿üÿHFYÿ*(:ÿ$"2ÿ'&7ÿ'%6ÿ$"2ÿ$"2ÿ#ÿ)'9ÿ%ÿ+ÿÿ ÿ ÿÿ!ÿÿÿÿ ,ÿ -ÿ)ÿ"ÿ"!0ÿ(&8ÿ(ÿ"ÿ*ÿ%$4ÿ -ÿ%ÿ)ÿ'ÿ)ÿ(&7ÿ -ÿ!ÿ*ÿ!.ÿ(ÿ'ÿ!ÿÿÿ ,ÿ*);ÿ"ÿÿÿÿ ÿ ÿÿÿ ÿ ÿÿ ÿ ÿÿ)ÿ(&7ÿ&$4ÿ0-Bÿ75Mÿ64Lÿ>[ÿ85NÿDA`ÿSPuÿQMqÿokœÿ|w­ÿokœÿZV~ÿJGgÿOLoÿb^Šÿie“ÿup¤ÿËÃòÿuq¤ÿ“ÇÿÍÅýÿ”ŽÏÿž—Üÿ¸±ûÿ’ŒÍÿœ•Úÿ•Ðÿ~x°ÿƒ}·ÿ–Üÿ•Ñÿ„¹ÿ†¼ÿƒ~¸ÿ~y±ÿeaŽÿea‡ÿOKoÿVSyÿXT{ÿQMqÿGCcÿ?ZÿZV~ÿie“ÿhd’ÿpkÿ¤ Çÿ¨¢Ôÿ„¹ÿŸ˜Ýÿc_‹ÿ®§åÿ’ŒÉÿmi™ÿŠ…Áÿ§ æÿup£ÿYU}ÿOLoÿ“Íÿ‡Äÿ\XÿVRyÿrmžÿC@]ÿFCbÿJGhÿGDcÿOLoÿVSyÿSOtÿPLoÿC@]ÿ<9Sÿ.,Aÿ1/Eÿ/-Bÿ64Lÿ:8Qÿ63Kÿ1/Eÿ-+?ÿ41Hÿ30Gÿ64Lÿ74Lÿ1/Dÿ42Iÿ#!1ÿ#ÿÿ!-ÿ"ÿ"ÿ#ÿ -ÿ*ÿ -ÿ"ÿ&%5ÿ&ÿ+*=ÿ(&7ÿ" /ÿ(ÿ -ÿ"ÿÿ!ÿ'ÿ ÿ ÿÿÿ ÿ ÿÿÿÿÿ%ÿÿ#ÿ$ÿ'%6ÿ)ÿ,ÿ'%6ÿ)ÿ ,ÿ,ÿ!.ÿ(ÿ(ÿ"ÿ'%6ÿ*(8ÿ·°âÿ šàÿ„¹ÿpkÿ_[…ÿUQwÿKGiÿ;8RÿA>Zÿ-+>ÿ,*=ÿ#!1ÿ%#3ÿ -ÿ"!/ÿ+)<ÿ,*=ÿ86Oÿ?=Yÿ=:Uÿ<9Tÿ42Iÿ53Jÿ1/Eÿ:8Qÿ?[ÿ?;Wÿ=:Uÿ>;Wÿ<9Tÿ<:TÿD@^ÿB?\ÿ>;VÿEBaÿGDcÿDA_ÿFCbÿHEeÿHEeÿ.,@ÿ"ÿÿ)ÿ)ÿ)ÿ)ÿ ,ÿ ,ÿ"!0ÿ(ÿ,ÿ"!0ÿ!.ÿ$#2ÿ-+>ÿ)ÿ" /ÿ)ÿ#ÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿ"ÿÿÿ*ÿ!ÿ$ÿ'%7ÿ!-ÿ$"2ÿ ÿ$"2ÿ#ÿ*ÿ$"2ÿ ,ÿ&$5ÿ+ÿA>[ÿƒ~¸ÿˆ‚¿ÿ~y°ÿvq¥ÿkg–ÿeaÿZV~ÿROsÿJGhÿLIkÿB?\ÿ;8Rÿ63Kÿ41Hÿ:8Rÿ:7Pÿ85NÿC@^ÿDA_ÿA>[ÿ;8Sÿ;8Rÿ=;Vÿ@=Yÿ?ZÿGDdÿLIkÿROsÿ^Z„ÿ_[†ÿVRxÿSOtÿKHiÿHEdÿJFgÿJGhÿNJmÿMIkÿIFfÿPLpÿSOtÿQMqÿ[W€ÿ_[…ÿa]ˆÿ96Oÿÿÿÿ"ÿÿÿ#ÿ#ÿÿÿ"!0ÿ#!1ÿ$ÿ&$5ÿ)ÿ#ÿ ÿ!-ÿ+ÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿ$ÿÿÿ#ÿ)ÿ(ÿ)'9ÿ(ÿ(ÿ'ÿ%ÿ'&7ÿ#"1ÿ$"2ÿ"!0ÿ$"2ÿ@=YÿOKoÿURxÿ]YƒÿZV~ÿ\Xÿ\X€ÿZV~ÿ\XÿTQvÿTPvÿVRxÿVRxÿSOtÿSOtÿQMrÿSPuÿLIjÿMIkÿHEeÿMIlÿJGhÿHEeÿFCbÿJFgÿd`‚ÿš”Éÿ“Íÿz²ÿlh˜ÿ_[…ÿjf•ÿhd’ÿTPvÿDA_ÿOKnÿ]Yƒÿ[W€ÿ^Z„ÿjf•ÿvq¥ÿqlžÿzu©ÿ¶¯îÿys¤ÿÚÖóÿkg–ÿd`Œÿ{­ÿOKnÿROsÿ[W€ÿ`\‡ÿ]Y‚ÿNKnÿEA`ÿEB`ÿD@^ÿHDdÿDA_ÿLIkÿMIkÿWSzÿ\Xÿ]Y‚ÿUQwÿHEeÿIFfÿDA`ÿGDcÿC@^ÿB?\ÿDA`ÿJFgÿFCcÿNJmÿRNsÿ_[…ÿOLoÿÿÿÿÿ!ÿ#ÿ(ÿ ÿÿ'ÿÿ" /ÿ -ÿ -ÿ)'9ÿ&$5ÿ$"2ÿ" /ÿ#"1ÿÿ ÿ ÿÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿÿÿÿ#ÿ"!0ÿ" /ÿ+ÿ+ÿ#!0ÿ'ÿ#"1ÿ(ÿ*ÿ! .ÿ!ÿ)'9ÿ+ÿ31Gÿ<9TÿB?\ÿFCbÿHEeÿKHiÿRNsÿPLoÿLHjÿMIlÿRNsÿSOtÿPLpÿRNsÿTQvÿQNrÿNJmÿJFgÿIEfÿNJmÿLIkÿKHiÿMJlÿJGhÿIEfÿQMqÿPMpÿFCbÿHEeÿ`\‡ÿkg—ÿZVÿGCcÿEB`ÿSPuÿ\Y‚ÿ^Z„ÿkf–ÿup£ÿqlžÿZVÿWSzÿXU|ÿœš¶ÿkg–ÿd`ÿUQwÿOKnÿMJlÿSOsÿ\Xÿ_[…ÿSOtÿA>[ÿDA_ÿA>[ÿ=:Uÿ=:Uÿ@=YÿC@^ÿA>[ÿRNrÿ_[…ÿ^Z„ÿUQwÿKHiÿ97Pÿ:7Qÿ41Hÿ75Mÿ20Fÿ0.Dÿ96Oÿ53Jÿ75MÿGDdÿZV~ÿÿÿÿ!ÿ"ÿ ÿÿ$ÿÿ ÿ ÿÿ$ÿ,ÿÿ*ÿ! .ÿ,ÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿ ÿ ÿÿ ÿÿÿÿÿÿÿ$ÿ)ÿ#!1ÿ!-ÿ)ÿ$"2ÿ+ÿ&ÿ(ÿ#!1ÿ'ÿ,*>ÿ#"1ÿ$ÿ-+?ÿ0.Dÿ31Gÿ/-BÿA>[ÿ<9Tÿ;8RÿC@]ÿKGiÿMJlÿMIkÿJFgÿKGhÿLHjÿIFfÿIFgÿEB`ÿFBbÿGDcÿJGhÿLIkÿOKnÿKHiÿNKmÿKHiÿDA_ÿFCbÿ[X€ÿoj›ÿ]Y‚ÿFBaÿ42IÿGDdÿ[W€ÿc_‹ÿokœÿqlžÿhc‘ÿ]Y‚ÿURxÿUQwÿ\Xÿhc‘ÿie”ÿ\XÿMIkÿLIjÿJGhÿNKmÿ_[…ÿ\X€ÿLHjÿ?;WÿTQvÿb^‰ÿWTzÿKHiÿ42Iÿ*(;ÿ)ÿ%#3ÿ!.ÿ%$4ÿ ,ÿÿ42Iÿ ÿ*ÿ ÿ*ÿÿÿ ÿ ÿÿ ÿÿ#ÿÿÿÿ!ÿ#"1ÿ!.ÿÿÿ ÿÿ ÿÿÿÿ ÿ ÿÿ ÿÿÿÿ ÿ ÿÿ ÿÿ ÿÿ!ÿ ÿ ÿ)ÿ(ÿ"ÿ! /ÿ,ÿ" /ÿ*ÿ$"2ÿ%ÿ'ÿ%ÿÿÿ)ÿ%$4ÿ'ÿ#!1ÿ1/Eÿ75Mÿ96Pÿ?[ÿ96Oÿ97Pÿ0.Cÿ31Gÿ63Kÿ&$5ÿ53Jÿ.,Aÿ41Hÿ@=Zÿ@>Zÿ@=Yÿ>;WÿGDdÿA>[ÿSPuÿrn ÿhc‘ÿEB`ÿ,*=ÿ*(;ÿHEeÿhc’ÿ|w®ÿlh˜ÿTPuÿEB`ÿTPuÿSOtÿUQwÿZV~ÿje”ÿ]Y‚ÿLHjÿLHjÿNJmÿJGgÿPLpÿWSyÿ]YƒÿVSyÿA>[ÿ1/Eÿ*(;ÿ$#2ÿ'ÿ*ÿÿ&ÿ%#4ÿ@=YÿRNrÿd`ÿc_‹ÿNJmÿ/-Bÿ0-Bÿ&$5ÿ$"2ÿ" /ÿ)ÿ)ÿ97Pÿ'ÿ#ÿ$ÿ&ÿ'ÿÿÿÿ ÿ ÿ$ÿ#ÿ#ÿÿÿ+ÿÿÿ#!0ÿÿÿÿÿ ÿÿ ÿ  ÿ ÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿ ÿÿÿ'ÿ'ÿ)ÿ$ÿ'ÿ ,ÿ(ÿ ,ÿ#ÿ%#3ÿ$ÿ*ÿÿ+ÿ -ÿÿ#ÿ! .ÿ,*>ÿ42Iÿ?ÿ<9Sÿ;9Sÿ@=Zÿ53Kÿ96Pÿ'%7ÿ'%7ÿ(ÿ(ÿ)ÿÿ)ÿ-+>ÿ20Fÿ.,Aÿ64Lÿ64Lÿ41Hÿ20FÿQMpÿŠ„ÁÿytªÿLIkÿ53Jÿ0-BÿXT{ÿytªÿ{v­ÿnjšÿXT|ÿDA_ÿ?ZÿLIkÿYU}ÿd`ÿhc‘ÿURxÿ<9Sÿ96PÿDA_ÿB?\ÿKHiÿWSzÿd`ÿfbÿUQwÿC@^ÿ=:Uÿ/-Aÿ1.Dÿ+ÿÿ&ÿ ÿÿ/-AÿROtÿd`ÿkg—ÿ\X€ÿDA^ÿ42Iÿ#!1ÿ(&8ÿ.,@ÿ,*=ÿ('8ÿ!ÿÿÿ!ÿ"ÿÿÿÿÿÿÿÿ ÿÿ%ÿÿ!ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿ ÿÿ ÿÿ ÿÿÿÿ ÿÿÿÿÿ!ÿÿ%ÿ#"1ÿ)ÿÿÿ%ÿ%ÿ%#3ÿ)(:ÿ63Kÿ<9TÿA>Zÿ:7QÿC@]ÿ85Nÿ.,@ÿ(&7ÿ+ÿ ,ÿÿ"ÿ+ÿ(&7ÿ0.Cÿ.,@ÿ0.Dÿ31Gÿ/-Bÿ85Nÿ,*>ÿC@]ÿb^ŠÿOLoÿ-+?ÿB?]ÿqmŸÿ†€»ÿrm ÿfbÿ^Z„ÿOKnÿ;8Rÿ0.CÿA>[ÿNJmÿ`\‡ÿoj›ÿa]ˆÿB?\ÿ31Hÿ53Jÿ63KÿB?\ÿHEeÿTPvÿfbÿ_[†ÿURxÿJFgÿC@^ÿ>;Wÿ86Oÿ42Iÿ'ÿ#ÿÿ ÿ42IÿMJlÿie”ÿplÿb^ŠÿA>Zÿ-+>ÿ,ÿ52Jÿ$"2ÿ'ÿ#ÿ!ÿÿÿ ÿ#ÿÿÿÿ ÿ ÿ ÿ"ÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿ ÿÿ ÿÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿÿ ÿ$ÿÿÿÿÿ%ÿ(ÿ"!0ÿ!ÿ ÿ#ÿ(ÿ(ÿ*(:ÿ86OÿDA`ÿ@=ZÿDA_ÿ;8Rÿ/-Bÿ-+?ÿ*ÿ!ÿ*ÿÿ&ÿ%ÿ)'9ÿ2/Eÿ31Hÿ31Gÿ53Jÿ0.Dÿ0.Cÿ,*>ÿ.,@ÿ85Nÿ97Pÿ=:UÿgcÿŒ‡Åÿ‰ƒÀÿhd’ÿQNrÿ`[†ÿ^Z„ÿFCaÿ20Fÿ-+?ÿ64LÿQMqÿmh˜ÿmh˜ÿTPvÿ:7Qÿ64Lÿ/-Aÿ1/Eÿ2/Eÿ?;Vÿ31Gÿ&$5ÿÿ!ÿ"ÿ,ÿOKnÿqlžÿ}x¯ÿfbÿC@^ÿ0.Cÿ96Pÿ20Fÿ$#3ÿ.,@ÿ!.ÿ'ÿ"ÿÿ'ÿ ÿ)ÿ ÿ!ÿÿÿ*ÿÿÿÿ!ÿ ÿÿÿÿÿÿÿÿ ÿÿ ÿ  ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿÿ ÿ ÿ ÿÿÿ!ÿ ÿ ÿ ÿÿ ÿÿ)'9ÿ"ÿ ÿÿÿ(&8ÿ52Iÿ64Lÿ?ÿ+)=ÿ2/Eÿ.,@ÿ41Hÿ%$4ÿ0.Cÿ30Gÿ30Gÿ<:Tÿjf”ÿž—Úÿ©¢ëÿ„¹ÿVRxÿA>\ÿSPuÿd`ŒÿUQwÿ=:Uÿ,*=ÿ*(;ÿ>;Vÿd`Œÿokœÿb^ŠÿNJmÿB?\ÿ,*>ÿ#"1ÿ(&8ÿ(&7ÿ?;Wÿ0.Dÿ'%6ÿ!.ÿ!ÿ+ÿHDdÿsn¡ÿ†¼ÿpkœÿDA_ÿ&$5ÿ-+>ÿ,*=ÿ.,@ÿ%#4ÿ(ÿ#ÿ ÿ&ÿ ÿÿÿÿ"ÿÿ#ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿ ÿÿÿ  ÿ ÿ ÿ ÿÿÿ ÿ ÿ#ÿÿÿ ÿÿÿ ÿ ÿ ÿÿ"ÿ/,Aÿ ÿÿÿ0.Cÿ>;WÿB?\ÿ<9TÿB?]ÿ?ÿ31Hÿ+)<ÿ20Fÿ2/Eÿ;8Rÿ†‚œÿçáüÿ«¤êÿnj›ÿNJmÿB?\ÿGCcÿ^Z„ÿd`ÿHEeÿ*(:ÿ! .ÿ/,AÿTPvÿtp£ÿie“ÿ[W€ÿMIkÿ<9Tÿ42Iÿ#!1ÿ" /ÿ" /ÿ?ÿ,*>ÿ*(;ÿ*(;ÿ ,ÿ$"2ÿ ÿ$#2ÿ(ÿ"ÿÿÿÿÿ*ÿÿÿÿÿ"ÿ ÿÿÿÿÿÿÿ ÿÿÿÿÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿÿ ÿ ÿ ÿ ÿ  ÿÿ ÿ ÿÿÿ!ÿÿÿ$#3ÿ(ÿÿ! .ÿ1/Eÿ86OÿC@^ÿB?\ÿB?]ÿ?ZÿLIkÿd`ŒÿYU}ÿ;9Sÿ -ÿ&$4ÿKGiÿojœÿie“ÿ\XÿUQwÿROsÿC@^ÿ31Gÿ*ÿÿ20FÿMJmÿhc‘ÿ_[†ÿA>[ÿ@=YÿFBaÿPLoÿSOtÿUQwÿWSzÿMJlÿA?\ÿ75Mÿ(ÿ"!/ÿIFgÿŒ†Äÿ®§ïÿjf“ÿ)'9ÿ)(:ÿ)'9ÿ'%6ÿ)':ÿ$#3ÿ*(:ÿÿ*ÿÿ'ÿÿÿÿ+ÿ ÿ ÿ!ÿÿÿÿÿÿ ÿÿÿÿÿÿÿ ÿÿÿ ÿÿ ÿ ÿ ÿ ÿÿÿ ÿ ÿÿÿÿ ÿÿÿÿÿ ÿÿÿÿ ÿ97Pÿ+)<ÿ,*=ÿ41HÿC@]ÿEBaÿHEeÿA>[ÿ<9Tÿ1.Dÿ+ÿ)ÿÿÿÿÿÿ&ÿ ,ÿ! .ÿ)'9ÿ64Lÿ0-Cÿ41Hÿ'%7ÿ.,@ÿ52Iÿ75Mÿ<:TÿC@^ÿB?\ÿ@=ZÿB?\ÿHEeÿA>[ÿ96Oÿ?;Wÿmh˜ÿokœÿVSyÿSPuÿYU}ÿTPuÿFBaÿ(&8ÿ(ÿÿ*(:ÿZV~ÿmh™ÿ[X€ÿB?\ÿ42Hÿ<9TÿEBaÿOLoÿXT{ÿZWÿXU|ÿPLpÿD@^ÿ*(;ÿ$ÿOLoÿ¶¯éÿ›—®ÿ)ÿ&$5ÿ(&8ÿ31Gÿ/-Aÿ#!1ÿ(&7ÿ*ÿ"!0ÿ)ÿÿ ÿ ÿ&ÿ ÿÿÿ ÿ%ÿ ÿÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿÿÿÿ ÿÿ ÿÿ"ÿÿÿÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿÿ ÿÿÿFCbÿB?\ÿC?]ÿIEfÿHEeÿEBaÿC@^ÿ96Oÿ1/Eÿ$"2ÿ"ÿÿÿ ÿÿ  ÿÿ!ÿ"ÿ,*=ÿ.,Aÿ31Gÿ.,@ÿ53Jÿ<9Sÿ75Mÿ<9Tÿ>[ÿC@]ÿ@=Yÿ75MÿGDdÿjf•ÿd_ŒÿFCaÿ,*=ÿ96Oÿje”ÿ{v¬ÿ\XÿB?\ÿROsÿ[X€ÿYU|ÿB?\ÿ-+?ÿ ÿÿ?ÿ1/Dÿ+)<ÿ$"2ÿ*(;ÿ,*>ÿ(&8ÿ*(:ÿ+ÿ" /ÿ"ÿÿÿ%ÿ!ÿÿ!ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿ ÿ ÿ ÿ ÿÿ ÿ ÿ  ÿÿ!ÿ ÿÿÿÿÿÿ ÿÿÿ ÿ ÿ  ÿ ÿ#ÿSPuÿNJmÿPLpÿQNrÿIFfÿ=:Uÿ;9Sÿ%#4ÿ"!/ÿÿÿÿ ÿ  ÿ  ÿ ÿ ÿ$ÿ"!0ÿ0.Cÿ85Nÿ75Mÿ:8Rÿ:7Qÿ?ZÿFCbÿ53Jÿa]ˆÿup¤ÿXT{ÿ1/Eÿ+)<ÿb^‰ÿ€{³ÿfaŽÿ@=Zÿ?ÿ*(:ÿ*(:ÿ ,ÿ -ÿ ÿÿ"ÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿÿÿÿÿÿ ÿÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ  ÿ!ÿÿ ÿ ÿ  ÿ*(;ÿ\XÿWSzÿOLoÿEB`ÿB?\ÿ20Fÿ%$4ÿ$ÿ ÿ ÿÿ ÿ ÿÿ ÿÿ#!1ÿ#"1ÿ/-Aÿ:7Pÿ<9TÿA?\ÿ@=Yÿ?[ÿ?[ÿ`\‡ÿ„~¸ÿplÿDA`ÿ'%7ÿ^Z„ÿŒ†Äÿto£ÿFCcÿ86Oÿ:7QÿJGhÿ[X€ÿ[X€ÿIFgÿ20Fÿ"!0ÿ20Fÿd`ÿ}x¯ÿ_[†ÿ<9Tÿ+*=ÿ-+?ÿ(&8ÿ)'9ÿ/-BÿDA_ÿc_‹ÿ[Wÿ&ÿ#ÿ'ÿ"!0ÿ&%6ÿ$ÿ0.Cÿ0.Cÿ*(:ÿ&$5ÿ'%7ÿ'%7ÿ.,@ÿ)'9ÿ"ÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿ53KÿVSyÿRNsÿJGhÿ=:Uÿ-+>ÿ&$5ÿÿÿ ÿ ÿÿ ÿ ÿ  ÿÿ%ÿ"!0ÿ20Fÿ2/Eÿ;8SÿB?\ÿEA`ÿC@]ÿ?ZÿC@^ÿ75MÿFCbÿA>[ÿB?]ÿ20Fÿ63Kÿ-+?ÿ63Kÿ1/Eÿ@>ZÿTPuÿGDcÿ.,@ÿWSzÿ–Ñÿˆ‚¾ÿRNsÿ64Lÿ86Nÿ;9SÿRNsÿ`\‡ÿ]YƒÿLIjÿ.,@ÿ*ÿDA`ÿ{v­ÿ~y±ÿVRxÿ41Hÿ(&7ÿ)'9ÿ$"2ÿ'&7ÿ)ÿYV}ÿ)ÿÿ!ÿ"ÿÿ+ÿ ,ÿ)'9ÿ%#3ÿ-+>ÿ,*>ÿ! .ÿ31Gÿ/-Aÿ'%6ÿ,ÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿÿ ÿ ÿÿ ÿÿÿ ÿ  ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿÿ20FÿGDcÿHEeÿ<9Tÿ/-Bÿ&%5ÿÿÿ ÿ ÿÿ ÿÿÿÿ" /ÿ0.Cÿ2/Eÿ20FÿDA_ÿJGhÿEB`ÿGDdÿC@^ÿ?;VÿA>ZÿIEfÿIFfÿMJlÿDA`ÿB?\ÿ?ÿ:8Qÿ…€»ÿ•Ñÿ]Y‚ÿ96Oÿ97Pÿ<9Sÿ0.Dÿ+)<ÿ%#3ÿ&$4ÿÿ ÿ%ÿ'ÿ -ÿ*ÿ&ÿ%ÿ%#4ÿ(&7ÿ*(:ÿ" /ÿ.+@ÿ%$4ÿ+ÿ#!0ÿ)ÿ"ÿ ÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿÿÿ ÿ ÿÿ ÿ  ÿÿ ÿÿÿÿ ÿÿÿÿ ÿ!.ÿ!.ÿ"ÿ ÿ ÿ ÿ ÿ ÿ ÿ&ÿÿ$ÿ53Jÿ2/Eÿ;8RÿFCbÿGDdÿKGiÿNKmÿKHiÿGDcÿ@=Zÿ;9Sÿ74Lÿ0.Cÿ('8ÿ%#3ÿ)'9ÿ"!0ÿ$#3ÿ,*=ÿ.,@ÿ'%6ÿ'%6ÿ*(:ÿ*(;ÿ)(:ÿ53JÿJH]ÿjfˆÿ;8Rÿ;8SÿDA_ÿ=;Vÿ86Oÿ-+?ÿ20Fÿ^Zƒÿxs¨ÿb^‰ÿ86Nÿ&$5ÿfbÿ·¯øÿŠ…Àÿ64Lÿ30Fÿ31Gÿ*(:ÿ-+?ÿÿ+ÿ#"1ÿ$#3ÿ" /ÿ$ÿ'ÿ(ÿÿ)ÿ'ÿ"ÿ(ÿ/-Bÿ" 0ÿ*(;ÿ+);ÿ(ÿÿ%ÿÿÿ"ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿÿÿ ÿ ÿÿ ÿÿÿ ÿ ÿ ÿÿ ÿ  ÿ ÿ ÿ ÿÿ ÿ ÿ ÿÿ ÿÿ ÿ ÿ ÿ ÿÿ ÿÿ ÿ ÿ ÿÿÿÿ#ÿ('8ÿ/-Bÿ85Nÿ<9TÿA>ZÿGDcÿLHjÿOLoÿJGhÿHEeÿFBaÿA>[ÿ@=Zÿ*(;ÿ#!1ÿ,*>ÿ&ÿ'%6ÿ)'9ÿ)'9ÿ.+?ÿ$"2ÿ('8ÿ*(:ÿ)'9ÿ#!1ÿ'%7ÿ)'9ÿ,*>ÿ,*>ÿ<9Sÿ42Iÿ@=Yÿ85Nÿ75Mÿ2/Eÿ=:Uÿ=;VÿJGhÿJGhÿ0.Cÿ! .ÿ"!0ÿDA_ÿÌÅòÿ³­Òÿ42Iÿ96Oÿ63Kÿ30Fÿ20Fÿ"!0ÿ+ÿ ÿ'ÿ ÿ#ÿ ÿÿ%ÿ'ÿ!ÿ"!0ÿÿ+)<ÿ)'9ÿ)'9ÿ,*=ÿ'%7ÿ! /ÿ)ÿ! /ÿ"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿ ÿ ÿ  ÿÿÿ ÿ ÿ ÿÿ ÿÿ ÿ  ÿ ÿÿ ÿÿ ÿ ÿÿ ÿ ÿÿÿÿÿÿ ÿ ÿ ÿ ÿÿ%ÿ!ÿ*(:ÿ53Jÿ42Iÿ;8SÿEA`ÿEBaÿIFgÿJGhÿNJmÿMIkÿGDdÿHEfÿ?ÿ+)<ÿ(&8ÿ/-Bÿ/-Aÿ%#4ÿ&%6ÿ.,@ÿ-+?ÿ30Gÿ;8Rÿ74Lÿ?=Yÿ53Jÿ=;Vÿ:7Qÿ/-Bÿ)'9ÿ)(:ÿ! .ÿ#!0ÿ#"1ÿ+ÿ(&8ÿ31Dÿ31Gÿ2/Eÿ2/Eÿ52Iÿ+);ÿ31Gÿ)'9ÿ" /ÿ%ÿ#ÿÿÿ&ÿ(ÿ$ÿÿ"ÿÿ'ÿ -ÿ*(;ÿ)'9ÿ+)<ÿ)'9ÿ%$4ÿ#!1ÿ,ÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  ÿÿ  ÿ ÿ ÿ ÿÿÿ ÿ ÿÿ ÿÿÿ ÿÿ ÿÿÿÿ ÿ ÿ ÿÿ ÿÿ ÿ ÿÿÿÿÿÿ)'9ÿ(&7ÿ)'9ÿ.,Aÿ:7QÿDA_ÿFCbÿIFfÿNJmÿJGhÿQNrÿKHjÿJFgÿGCcÿHEeÿFCbÿ?Zÿ96Pÿ0-Bÿ"!0ÿÿÿÿ ÿ!.ÿ*ÿ+)<ÿ)'9ÿ/-Aÿ,ÿ+ÿ&$5ÿ'%6ÿ%#4ÿ/-Bÿ41Hÿ;8Rÿ?ÿ,*=ÿ)ÿ!ÿ'ÿ"ÿ'ÿ!ÿÿÿ ÿ'ÿ"!0ÿ -ÿ -ÿ(&8ÿ*(;ÿ+)<ÿ+);ÿ(&8ÿ"ÿ*ÿ#ÿ ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ  ÿ ÿ ÿ ÿ ÿÿ ÿ ÿÿÿÿÿÿÿ ÿÿÿÿ ÿ ÿÿÿ ÿ ÿÿÿÿ$ÿÿ20FÿGDdÿ>;WÿC@]ÿHEeÿJGhÿTQvÿVRyÿUQvÿUQwÿRNrÿSOuÿSPuÿMJlÿEB`ÿ<9Tÿ?Zÿ75Nÿ<:Tÿ>;Wÿ0.Cÿ41Hÿ;8Rÿ20Fÿ,ÿ&ÿÿÿÿ&ÿÿ"!0ÿ*ÿ*(:ÿ$"2ÿ(&8ÿ*(:ÿ#!0ÿ-+>ÿ,*=ÿ52Iÿ;8Rÿ97Pÿ85Nÿ86Oÿ;9Sÿ30Gÿ*(;ÿ&$5ÿ+ÿ%ÿ)ÿ)ÿ+ÿ#"1ÿ(&8ÿ*(:ÿ75Mÿ-+?ÿ74Mÿ20Fÿ1/Dÿ31Gÿ*(:ÿ#!1ÿ" /ÿ$#3ÿÿ!ÿ$"2ÿÿÿ ÿ#"1ÿÿ$ÿ+ÿ)'9ÿ+)<ÿ-+>ÿ*(:ÿ,*=ÿ#"1ÿ)ÿ" /ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ  ÿ ÿÿÿ ÿÿ ÿÿÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿÿ ÿÿ ÿ ÿ ÿ ÿ&ÿ ÿ  ÿ!ÿ)'5ÿ²¬Ûÿ™“Õÿ„¹ÿwr§ÿmi™ÿlg—ÿd_ŒÿYU|ÿUQwÿJGhÿ@=Zÿ@=Zÿ:8Rÿ,*>ÿ&%5ÿ41Hÿ*(;ÿ85Nÿ20Fÿ0.Cÿ)'9ÿ%ÿ!ÿ#ÿÿÿ ÿÿ -ÿ!.ÿ,*>ÿ! /ÿ*(;ÿ+ÿ-+?ÿ1/Eÿ97Pÿ42Iÿ:7QÿB?\ÿ;9Sÿ86Oÿ1/Dÿ+)<ÿ-+>ÿ#!1ÿ!.ÿ(ÿ" /ÿ$ÿ,ÿ(&8ÿ! .ÿ,*>ÿ0.Cÿ20Fÿ20Fÿ,*>ÿ74Mÿ/,Aÿ)'9ÿ%#3ÿ#ÿ*ÿ%ÿ"ÿÿÿÿ ÿ"ÿ ÿ+ÿ"ÿ,*>ÿ"!0ÿ(ÿ$ÿ(&7ÿ(&8ÿ$"2ÿ#!0ÿÿÿÿÿÿÿ ÿÿÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ'ÿÿÿ!ÿÿÿÿ ÿÿÿÿ  ÿÿ ÿÿ ÿ!ÿÿÿÿÿÿ>ÿ(ÿ"ÿ"ÿÿ#ÿÿ ÿ'ÿ(ÿ+ÿ)'9ÿ&$4ÿ*(;ÿ1/Eÿ/-Aÿ96Oÿ;8RÿA>Zÿ;8Rÿ74Lÿ31Gÿ.+@ÿ+);ÿ%$4ÿ*(:ÿ!.ÿ-+?ÿ'ÿ -ÿ$"2ÿ#!1ÿ&ÿ'&7ÿ.,@ÿ42Iÿ-+?ÿ74Lÿ96Pÿ*(;ÿ'&7ÿ*ÿ#"1ÿÿÿ! .ÿ!ÿ,ÿ(ÿ"ÿ!ÿ#ÿ#!1ÿ+ÿ)ÿ$#3ÿ*ÿ.,@ÿ-+>ÿ*(:ÿ+)<ÿ&$5ÿ!ÿ¹Â´Àdura@’—v"0splCåÏ+>‰ð¤½Êb> ?@? U?¥ y?€?€?åã ŒKfrE:´ÙKfrSÎ`¬ˆÛfyPRheight = 350 exposure = 0.369000 gamma = 1.599000 oversample-gamma = 1.780000 fgcolor = #CC8D8C bgcolor = #000000 a = 0.212471 b = 1.300058 c = -0.442232 d = 1.339748 zoom = 50.540699 xoffset = 0.858111 yoffset = 0.004458 rotation = 0.596300 blur-radius = 0.001000 blur-ratio = 0.070000 emphasize-transient = TRUE transient-iterations = 90 initial-conditions = gaussian initial-xscale = 0.007000 initial-yscale = 0.010000 initial-xoffset = 1.614000 initial-yoffset = 1.040000Ë#†”fyTpGdkP”€Jÿÿÿÿÿÿÿÿ ÿ$ÿ¡rqÿÿöõÿÿüüÿϘ˜ÿB--ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ*ÿ>**ÿC..ÿ2""ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ)ÿ-ÿ3#"ÿ5$$ÿ4$#ÿ/ ÿ(ÿ ÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ"ÿ£srÿÿöõÿÿýýÿÓœ›ÿI22ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ$ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ2""ÿM54ÿlJJÿ›kjÿ¿‰ˆÿÕ¨§ÿã¾½ÿãÃÃÿåÆÅÿÛ¼¼ÿÍ««ÿ·”“ÿ˜rrÿpNNÿE//ÿ&ÿ ÿ ÿÿÿÿÿÿÿ ÿ ÿÿÿÿ!ÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ÿ›lkÿþððÿÿýýÿןžÿK43ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ!ÿ4##ÿS99ÿySSÿ¦rqÿÝ™˜ÿùÁÀÿþéèÿþø÷ÿÿüüÿÿþýÿÿþþÿÿþþÿÿþþÿÿýýÿþððÿóÁÀÿĈ‡ÿ~WWÿF00ÿ!ÿ ÿÿÿÿÿÿ ÿ ÿÿ*ÿ7%%ÿ?++ÿF00ÿC.-ÿ8'&ÿ+ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡]\ÿüßßÿÿøøÿÒ˜—ÿM55ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ$ÿ2""ÿB--ÿT:9ÿgGFÿ~WVÿ’ddÿ¡qpÿ±€ÿ¸‰ˆÿ»Žÿ¼‘ÿºŽÿ¹‹Šÿ­}|ÿ£rqÿ‘dcÿrONÿ\??ÿ>+*ÿ'ÿ ÿ ÿÿÿÿÿ ÿ ÿÿ,ÿ@,+ÿV;:ÿkJIÿySSÿ|UUÿsONÿW;;ÿ<))ÿ!ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhGGÿ︷ÿþâáÿÉŽÿP77ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿÿ!ÿ&ÿ'ÿ*ÿ)ÿ,ÿ)ÿ#ÿ!ÿÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿ ÿ ÿ!ÿ3#"ÿR88ÿpMLÿ˜ihÿ³{{ÿÀ„ƒÿ´|{ÿ”feÿfFEÿ8&&ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿL44ÿÍŽÿý½¼ÿ¶}|ÿK33ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ!ÿ5$$ÿZ>>ÿˆ^]ÿº€€ÿ矞ÿù³²ÿí®­ÿË‘‘ÿdcÿV;;ÿ)ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ1""ÿ—hgÿÔ’‘ÿ¡onÿD..ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿB--ÿ)ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ$ÿ9''ÿgIIÿž||ÿ¶‰ˆÿ‰^^ÿ=**ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ4$#ÿW;;ÿŠ_^ÿÈ‹Šÿò´³ÿþÖÕÿþÙØÿ鹸ÿ¸ƒ‚ÿjIHÿ4##ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcDCÿllÿYXÿ<))ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿV;:ÿ«vuÿB--ÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿ9''ÿ‘onÿâÊÊÿþùùÿþýýÿâ·¶ÿ]@?ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ/! ÿS99ÿ„[Zÿʉÿð½¼ÿþâáÿÿïíÿøÐÏÿÇ’‘ÿySSÿ4##ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ@++ÿoLLÿhGGÿ7&%ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ(ÿÈŸŸÿóÊÉÿQ77ÿ ÿÿÿÿÿÿÿÿÿ ÿÿS:9ÿÒ²±ÿþûûÿÿÿÿÿý÷÷ÿÉ¢¢ÿT:9ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ)ÿC.-ÿqMMÿ°{{ÿ੨ÿüØÖÿÿéçÿúÐÏÿÌ““ÿtPOÿ/ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ$ÿF00ÿN55ÿ-ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿY==ÿûîíÿûèçÿ`BBÿÿÿÿÿÿÿÿÿÿ ÿN65ÿÞ¸·ÿÿþþÿÿýýÿòÜÛÿŸvuÿ=*)ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ7%%ÿV;;ÿbbÿÉ‘‘ÿÿýÌËÿõ·¶ÿº€ÿbCCÿ%ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ*ÿ6%%ÿ$ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ!ÿ•qpÿþþþÿûííÿ`BBÿÿÿÿÿÿÿÿÿ ÿ-ÿ¢ooÿý×ÖÿøÝÜÿĘ˜ÿgGFÿ. ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ'ÿ?,+ÿnKKÿ¢poÿÒ““ÿ颡ÿÖ“’ÿa`ÿH11ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ!ÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ'ÿ¸•”ÿÿÿÿÿûììÿdEDÿÿÿÿÿÿÿÿÿ ÿ?++ÿ‹`_ÿŸmmÿiHHÿ8'&ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ+ÿF00ÿpMLÿ™ihÿ¨ssÿ“eeÿaCBÿ)ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ'ÿÁŸžÿÿÿÿÿúææÿ_AAÿÿÿÿÿÿÿÿÿ ÿ-ÿ=**ÿ. ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ$ÿ)ÿ+ÿ(ÿ$ÿ!ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ1!!ÿI22ÿgGFÿlJJÿ\??ÿ5$$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ$ÿº••ÿÿþþÿòØØÿV;;ÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-ÿY==ÿdcÿ»••ÿÈ­­ÿʱ°ÿ¿§§ÿ¬””ÿ‘vvÿfJIÿ;))ÿÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ+ÿ=*)ÿA-,ÿ1"!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ)ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿžsrÿÿûûÿå¼¼ÿF00ÿ ÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿ@,+ÿrNNÿ·€ÿâ½½ÿ÷ããÿþõõÿÿþþÿÿÿÿÿÿÿÿÿÿþþÿöêéÿÌ´³ÿ}\[ÿ-ÿ ÿÿÿ ÿÿ'ÿ,ÿ,ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ!ÿ#ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿrNNÿ%ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿkJIÿõÅÄÿÆŽÿ7&&ÿ ÿÿÿÿÿÿÿ ÿ ÿ+ÿA,,ÿ ÿÿÿÿÿÿÿ ÿ!ÿ)ÿ+ÿ'ÿÿ ÿ ÿ ÿÿ&ÿ7%%ÿH11ÿdEDÿzUUÿˆedÿ’ssÿœ}}ÿž~ÿ¢€ÿ”iiÿmKKÿ:((ÿÿÿÿ ÿÿ9'&ÿ\??ÿwRRÿvQQÿX<<ÿ1"!ÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖœ›ÿ^A@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿ ÿ<))ÿ­wwÿccÿ,ÿ ÿÿÿÿÿÿÿÿ1""ÿÁ Ÿÿ‘kjÿÿÿÿÿÿÿ ÿ$ÿ:((ÿlONÿ¡Š‰ÿŰ¯ÿÉ¢¢ÿZ>=ÿ ÿÿÿ ÿ ÿÿÿÿ!ÿ"ÿ!ÿÿÿ ÿ ÿÿÿÿÿÿÿ ÿ/ ÿ`BAÿ¦srÿ㟞ÿܦ¥ÿ§{zÿ[??ÿ-ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿþåäÿÇ‘ÿH11ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ>+*ÿ"ÿÿÿÿÿÿÿÿÿÿ[?>ÿ[?>ÿ ÿÿÿÿÿÿÿ ÿ*ÿ†iiÿÿýýÿ ‚‚ÿ#ÿ ÿÿÿÿ ÿÿS;:ÿ̵µÿüùùÿþþþÿèÖÕÿvYXÿ ÿ ÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿ<))ÿYXÿݪ©ÿýíìÿûííÿÖ··ÿ‚`_ÿ9''ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿûÝÜÿüèçÿ°}|ÿ7&%ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿQ87ÿtOOÿÿ ÿÿÿÿÿÿÿ ÿ,ÿ4##ÿÿÿÿÿÿÿÿÿ7&%ÿÑ»»ÿÿÿÿÿ“tsÿ(ÿ ÿÿÿÿ ÿP77ÿêÔÓÿþþþÿöçæÿ®ÿL43ÿ$ÿ ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿA-,ÿ’ggÿäÁÀÿþ÷÷ÿþüûÿæÍÍÿŽllÿ9'&ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÁÿþøøÿ÷Ø×ÿˆ^]ÿ)ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ<))ÿ×™™ÿhHHÿÿ ÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿ ÿÿA,,ÿïÞÞÿþþþÿƒ^^ÿ)ÿ ÿÿÿÿÿ†]\ÿÖ¬«ÿ¥€ÿ]A@ÿ9'&ÿ%ÿÿ ÿÿÿÿÿ ÿ ÿ ÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ!ÿD//ÿ‘iiÿàÀ¿ÿþööÿþüüÿâÉÉÿz\[ÿ'ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿZ>>ÿëÅÄÿÿýýÿå·¶ÿbCCÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ̦¥ÿåÃÃÿN55ÿÿ ÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿD/.ÿóääÿþõôÿeFFÿ!ÿ ÿÿÿ ÿÿ7&%ÿ6%%ÿ&ÿÿÿ ÿ ÿ ÿ ÿ ÿÿ ÿÿ!ÿ*ÿ2""ÿ5%$ÿ1"!ÿ$ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ>++ÿ]\ÿÔ³²ÿûîíÿýøøÿˬ«ÿR99ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ!ÿ‹aaÿúäãÿÿõõÿÊ•”ÿH21ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ€_^ÿþúúÿßžÿ/ ÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿ ÿ2""ÿæÌÌÿíÔÓÿE//ÿÿÿÿ ÿÿ"ÿ)ÿÿ ÿ ÿ ÿ ÿÿ'ÿ%ÿÿ!ÿB.-ÿ”ihÿʲ±ÿÎÁÁÿŶ¶ÿ¯›šÿŽvvÿU=<ÿ-ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ1"!ÿjJIÿ¸’’ÿð×ÖÿóÑÐÿffÿ$ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ2""ÿ¶†…ÿÿóòÿúÞÝÿmlÿ0! ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ9''ÿæÏÏÿþ÷÷ÿ“mmÿ$ÿ ÿÿÿÿÿÿÿÿÿX<<ÿÿ ÿÿÿ ÿ!ÿ¦zyÿ¶†…ÿ)ÿ ÿÿÿÿ/ ÿ_HHÿ¿Ÿžÿ,ÿ ÿ ÿ ÿ#ÿ8&&ÿN65ÿM55ÿH11ÿ-ÿ)ÿS99ÿ”ssÿ½¤£ÿßÌËÿïããÿûððÿþùùÿÚÌÌÿ‚iiÿ"ÿ ÿÿ+ÿ1""ÿ"ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿ ÿ ÿÿ#ÿI22ÿ•hgÿГ’ÿžmlÿ3##ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿG11ÿ×£¢ÿþëêÿè°¯ÿtPOÿ"ÿÿÿÿÿÿÿÿÿÿÿ ÿÿlkÿþûûÿòÞÝÿ^AAÿÿ ÿÿÿÿÿÿ ÿÿÌžÿT<;ÿÿ ÿÿÿ ÿD/.ÿW<;ÿÿÿÿ ÿ*ÿJ33ÿÝÎÎÿÕÁÁÿ;((ÿÿ ÿÿ8&&ÿssÿÖÆÆÿ÷ñðÿâÑÑÿcFFÿÿ ÿÿ,ÿ>+*ÿL43ÿQ87ÿW?>ÿ]DDÿ]BBÿ<))ÿÿÿÿN65ÿ™iiÿ®}|ÿnPPÿ0!!ÿ ÿÿ ÿ ÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿ-ÿU::ÿhGGÿ7&&ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿaCBÿ㪩ÿþÎÍÿ¿……ÿM54ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ8&&ÿÚ¿¾ÿÿþþÿÌ©¨ÿ8&&ÿ ÿÿÿÿÿÿ ÿÿ· ŸÿØÁÀÿ7&&ÿÿ ÿÿÿ ÿÿ ÿ ÿÿ ÿ1"!ÿtVUÿþþþÿ½¢¢ÿ;)(ÿÿ ÿ&ÿ«Œ‹ÿýùùÿæÕÕÿ¡„ƒÿL54ÿ(ÿ ÿ ÿ ÿ"ÿ+ÿ2""ÿ,ÿ&ÿÿ ÿÿÿÿÿ ÿ;((ÿ¤yyÿ÷æåÿêÚÙÿŸ‡‡ÿK54ÿ+ÿ!ÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ)ÿ$ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿrNNÿà Ÿÿÿ‹`_ÿ3##ÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿfHHÿøììÿýôôÿŒeeÿ ÿ ÿÿÿÿÿ ÿÿt[Zÿÿýüÿ™{zÿ1""ÿÿ ÿÿÿ ÿÿÿ ÿÿ,ÿ…kkÿÿþþÿqpÿ3##ÿ!ÿ$ÿ<))ÿƒ]]ÿuVUÿQ87ÿD//ÿ:('ÿ0! ÿ ÿÿÿ-ÿ:('ÿ=*)ÿ7%%ÿ$ÿ ÿ ÿÿÿÿÿÿ ÿÿ]BBÿÌ®®ÿýùùÿóééÿ¥ÿE0/ÿ#ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ#ÿuPPÿÍŒÿ¸~ÿbCCÿ ÿ ÿÿÿÿÿÿÿÿÿÿ ÿ'ÿzzÿþúúÿéÉÉÿL44ÿ ÿÿÿÿÿ ÿÿ<))ÿãÔÓÿôéèÿ]AAÿ"ÿ ÿÿÿ ÿL77ÿy^]ÿ&ÿÿ%ÿfJIÿóÙÙÿS:9ÿ)ÿ)ÿ=))ÿ\BBÿz_^ÿ=*)ÿ4##ÿ>+*ÿL44ÿK33ÿ<*)ÿG11ÿonÿ¦ŽŽÿš††ÿ‚ffÿT;:ÿ8'&ÿ ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿÿ0! ÿsTSÿÓ»»ÿþùùÿíááÿ~eeÿ-ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ'ÿnLKÿ¥qqÿ…\[ÿ?++ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ1"!ÿ¾™˜ÿþôóÿ©zyÿ&ÿ ÿÿÿÿÿÿ,ÿ‰mmÿÿýýÿè¨ÿ1"!ÿÿÿ ÿÿN::ÿíßßÿQ99ÿ0!!ÿ ÿ,ÿnLKÿ+ÿ(ÿ9''ÿZ?>ÿßÑÑÿ£ŠŠÿC.-ÿ3##ÿN55ÿŒppÿ´¡¡ÿ«˜˜ÿT::ÿdIIÿ¢‹‹ÿϼ¼ÿéÜÜÿíããÿ¹ªªÿP>>ÿÿ)ÿ,ÿÿÿÿÿ ÿ ÿÿ$ÿ4##ÿuWWÿÒº¹ÿûõõÿÀ¬¬ÿ:))ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ"ÿ"ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ&ÿ_BAÿWWÿ_AAÿ+ÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿ>+*ÿΟŸÿê­¬ÿU;:ÿÿÿÿÿÿ ÿÿ:((ÿÒ¾¾ÿüôôÿnOOÿÿ ÿ ÿÿ?++ÿãØ×ÿ´œœÿA-,ÿ&ÿÿ+ÿ<))ÿ2""ÿ?++ÿbaÿþýýÿxXXÿ@,,ÿ6%%ÿ¾£¢ÿïââÿÀ¨¨ÿqVUÿ5$$ÿ&ÿ4##ÿH11ÿN65ÿU;:ÿYEEÿP;;ÿÿ!ÿ~WVÿǤ¤ÿkkÿ=**ÿ2""ÿ)ÿÿÿÿÿ%ÿ2""ÿhMLÿĪªÿàÁÁÿM65ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ3#"ÿ8&&ÿ+ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ%ÿN65ÿ]@?ÿ>+*ÿÿ ÿÿÿÿÿÿÿÿÿÿ ÿ ÿC.-ÿ±zyÿ‘dcÿ,ÿ ÿÿÿÿÿ ÿ%ÿU=<ÿïããÿα±ÿ'ÿ ÿ ÿÿ<))ÿ£ˆˆÿùôôÿfJJÿ0!!ÿ ÿ1"!ÿ¶¢¡ÿZ@?ÿL44ÿ~^]ÿÞÆÆÿI32ÿ. ÿ)ÿH21ÿO66ÿK33ÿ8'&ÿ#ÿÿÿ$ÿ*ÿ'ÿÿÿ ÿÿÿfLLÿÜÌÌÿíããÿ›ƒƒÿL43ÿ2""ÿÿ ÿ ÿ ÿÿÿÿE//ÿ„[Zÿ>+*ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ(ÿC..ÿR88ÿF00ÿ'ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ;((ÿ@,,ÿ*ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ=**ÿvQQÿK43ÿ ÿÿÿÿÿÿ ÿ ÿlPPÿòÊÊÿaBBÿ ÿ ÿÿ-ÿP87ÿéÝÝÿ»¤¤ÿ1"!ÿ*ÿE//ÿ·££ÿ³™™ÿS99ÿH21ÿR98ÿ)ÿÿÿÿ'ÿ'ÿÿ ÿÿ ÿ ÿ ÿ ÿÿÿÿ$ÿ+ÿ3#"ÿB.-ÿ‚ÿðææÿâ××ÿpXXÿ1"!ÿÿ ÿÿ ÿÿ ÿ ÿ ÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÿU::ÿrNNÿdDDÿ:('ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ(ÿ*ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ,ÿD/.ÿ$ÿÿÿÿÿÿÿ ÿÿkJJÿ‡]]ÿÿÿ ÿÿ0!!ÿu]]ÿóããÿK44ÿ&ÿA-,ÿ‚gfÿóììÿ^AAÿ7%%ÿ ÿ ÿ ÿÿÿ ÿ ÿÿÿÿÿÿÿÿ ÿK33ÿ´–•ÿxdcÿM55ÿB.-ÿ>+*ÿ?++ÿ[@@ÿ¬””ÿðæåÿ“€ÿ#ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ!ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ6%%ÿcDCÿ’edÿ‘dcÿY==ÿ"ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ$ÿ ÿÿÿÿÿÿÿÿ ÿ>**ÿ/ ÿÿÿ ÿÿ%ÿ„ddÿ|WVÿ ÿ1"!ÿN55ÿȸ¸ÿ•}}ÿ,ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿM88ÿ̼»ÿÙÍÍÿ{``ÿK43ÿ7&%ÿ1"!ÿ4$#ÿJ55ÿ¤ÿ ||ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ1""ÿ=**ÿ$ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ4##ÿxRRÿ³{{ÿ¿„ƒÿySSÿ3##ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿ ÿ ÿÿÿ9''ÿÿ(ÿ:('ÿP:9ÿ¡|{ÿ"ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ)ÿF00ÿutÿåÙÙÿŠŠÿ:('ÿ"ÿÿÿÿ*ÿ0!!ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿP77ÿtPOÿH11ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7%%ÿYXÿÓ’‘ÿ餣ÿ¤qpÿD//ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿ ÿ ÿbEDÿ'ÿÿÿÿÿpUUÿV??ÿB--ÿ>+*ÿ$ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ.ÿB--ÿR:9ÿ‰‰ÿ”wwÿÿ ÿ ÿ ÿ ÿÿÿ ÿ5$$ÿ1"!ÿ ÿ ÿÿÿÿÿÿÿ ÿ'ÿwRQÿ·~}ÿvQPÿ&ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ;)(ÿˆ^]ÿꦥÿüÃÁÿÄŒ‹ÿW<<ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿbCCÿG10ÿÿ ÿ ÿÿÿÿ ÿ]HHÿ˸¸ÿS>=ÿ1!!ÿ)ÿ'ÿE22ÿÔÅÅÿ€dcÿM54ÿ3#"ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ'ÿ1"!ÿ. ÿ2""ÿ%ÿ(ÿ&ÿ ÿ ÿ ÿÿÿÿtPOÿzTSÿ"ÿ ÿ ÿÿÿÿÿÿ ÿ/ ÿllÿö¼»ÿ¯ƒ‚ÿ4$#ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ7%%ÿccÿí²±ÿþÝÜÿÛ¦¥ÿfFEÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ&ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ$ÿÍ¢¡ÿ’uuÿ.ÿÿÿ ÿ ÿ ÿ#ÿ†rqÿïäãÿ}cbÿA-,ÿ5$$ÿ;)(ÿmTTÿêäãÿ—}}ÿA--ÿ$ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿeFFÿ;((ÿ. ÿ"ÿ ÿŒbaÿpTSÿ#ÿÿ ÿ ÿ ÿ3##ÿÑœ›ÿÀ Ÿÿ;((ÿÿ ÿ ÿÿÿÿÿ ÿ8&&ÿ»Œ‹ÿþòòÿЭ¬ÿF00ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ7&&ÿ‹`_ÿî½¼ÿÿòðÿê½¼ÿtPPÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>+*ÿV;;ÿ"ÿ ÿ ÿÿÿÿÿÿÿÿÿ ÿA..ÿçÚÚÿϹ¹ÿS;;ÿ)ÿÿ ÿ ÿÿ6%$ÿ•{{ÿøóóÿ¤Š‰ÿD/.ÿ;((ÿH21ÿrTSÿßÓÓÿ¡…„ÿ+ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿS==ÿÕÅÅÿ]CCÿ>**ÿ,ÿC..ÿæÒÑÿ”€ÿ:('ÿ'ÿÿ ÿ ÿO66ÿîÜÛÿÛÇÇÿK55ÿ%ÿÿ ÿÿÿÿÿÿA,,ÿË¡ ÿÿýýÿàÅÄÿP77ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ4##ÿ…[[ÿî¾½ÿÿø÷ÿîÆÅÿ|VVÿ!ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿjIIÿ nmÿS98ÿÿ ÿ ÿÿÿÿÿÿÿ ÿÿN::ÿâ××ÿñååÿ‚feÿ5$$ÿÿ ÿÿ)ÿ>+*ÿ„kkÿñêéÿ½¨§ÿ@,+ÿ6%%ÿ>**ÿH32ÿ¤ŽÿzYYÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2""ÿ›ƒƒÿÝÒÒÿ`CCÿ>**ÿ0! ÿnTSÿ÷ññÿš††ÿA-,ÿ&ÿ ÿ ÿÿpSRÿ÷ííÿãÒÒÿQ:9ÿ*ÿÿÿÿÿÿ ÿÿG10ÿÓ¯®ÿþýýÿäÌËÿS::ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ/ ÿ|UUÿæ¶µÿþõôÿïÊÉÿzTTÿ ÿ ÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ–hgÿì¼»ÿ˜qpÿ5%$ÿÿ ÿ ÿÿÿÿÿÿ ÿ$ÿL87ÿ×ÅÅÿýøøÿ²••ÿ@,,ÿÿ ÿÿ(ÿ8&&ÿXAAÿͽ½ÿ˲±ÿ;((ÿ#ÿ"ÿ!ÿ. ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ4$$ÿS99ÿð°ÿ·¥¥ÿJ33ÿ0! ÿ:((ÿ”vvÿûöõÿ„kkÿ9''ÿÿ ÿ ÿ(ÿ†ggÿûóóÿÜËËÿF11ÿ!ÿ ÿÿÿÿÿ ÿÿL44ÿÖ´³ÿÿýýÿáÊÊÿI32ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ)ÿtPOÿá­¬ÿþóòÿîÄÃÿtPOÿÿ ÿÿÿÿ%ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ›wvÿýïïÿÓ´´ÿeGFÿ#ÿÿ ÿÿÿÿÿ ÿÿ(ÿ@,,ÿ¶ Ÿÿýûûÿ׿¾ÿO77ÿÿ ÿ ÿÿ$ÿ%ÿtYXÿˆ_^ÿ&ÿÿÿ$ÿ+ÿ'ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ9''ÿF00ÿ\A@ÿÕÁÁÿXBBÿ(ÿ+ÿC.-ÿ©ÿïææÿP:9ÿ"ÿ ÿ ÿÿ3##ÿ’ssÿüøøÿî®ÿ3##ÿÿ ÿÿÿÿÿ ÿÿJ33ÿÔ²²ÿÿþþÿÖ¼»ÿ6%%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ$ÿaCBÿÔœÿþãâÿé´³ÿeEEÿÿÿÿÿÿ:('ÿ7&%ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ‘poÿúññÿ÷ææÿ zzÿ:('ÿÿ ÿÿÿÿÿ ÿ ÿ"ÿ1"!ÿ€gfÿðââÿçÕÔÿ`DCÿÿ ÿ ÿ ÿ ÿ ÿÿ#ÿÿsWVÿ{{ÿ\CCÿL44ÿ@,+ÿ)ÿÿ ÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ)ÿ”utÿoRRÿG11ÿR::ÿbHGÿÿÿ,ÿ>+*ÿ´œÿ¯Ÿžÿÿ ÿ ÿ ÿÿ4$#ÿ—{{ÿü÷÷ÿŽvvÿÿ ÿÿÿÿÿÿ ÿÿH21ÿÒ¯®ÿþûûÿº›šÿ%ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿY=<ÿÀ‰ˆÿüÉÈÿÙ›šÿQ87ÿ ÿÿÿÿ'ÿU::ÿW<;ÿ5%$ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿuXXÿðááÿþúúÿÓ°°ÿ^AAÿ"ÿ ÿÿÿÿÿÿ ÿÿ"ÿA..ÿ³——ÿ鸷ÿmKKÿÿÿÿÿÿ ÿÿ ÿ*ÿ€llÿâ××ÿÑÁÀÿttÿD//ÿ%ÿ ÿÿÿÿÿÿÿ ÿÿ"ÿ"ÿ%ÿ=*)ÿ­››ÿÁ­­ÿN65ÿ0!!ÿ ÿ/! ÿ"ÿÿ"ÿ-ÿ¦ƒ‚ÿ*ÿ ÿÿÿ ÿÿ,ÿ–zzÿñääÿD11ÿ ÿÿÿÿÿÿÿ ÿÿ>**ÿÄ Ÿÿýòòÿ‹hgÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿF00ÿ¨tsÿð«ªÿ·~~ÿ;((ÿ ÿÿÿÿ,ÿpMLÿŠ_^ÿcDDÿ1!!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿX>>ÿÛÃÂÿþþþÿñÜÜÿŽhgÿ/ ÿ ÿ ÿÿÿÿÿ ÿ ÿÿÿK44ÿ…[[ÿR88ÿÿÿÿÿ ÿ ÿÿ$ÿ9''ÿY>>ÿ”{{ÿÐÃÂÿåÖÖÿ‰onÿ"ÿÿÿÿÿÿ ÿ ÿ9''ÿL54ÿ__ÿ=*)ÿH21ÿ§Š‰ÿã××ÿT:9ÿ0! ÿÿ]@@ÿ“mlÿ'ÿÿÿÿ$ÿ ÿÿÿÿ ÿÿ"ÿˆihÿ¤zyÿ ÿÿÿÿÿÿÿÿ ÿÿ8&&ÿ·‹Šÿð¿¾ÿM55ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ;((ÿŒa`ÿć†ÿŒ``ÿ)ÿÿÿÿ ÿ. ÿƒZZÿ»€€ÿlkÿV;:ÿ%ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ9''ÿ¯Žÿüóòÿüòñÿ¹ŽÿD//ÿÿ ÿÿÿÿÿÿÿ ÿ ÿ ÿ+ÿ*ÿ ÿ ÿ5%$ÿ6%$ÿ!ÿ(ÿ1"!ÿ6%%ÿ@,,ÿE/.ÿ?++ÿ?++ÿW<<ÿ1"!ÿ ÿ ÿ ÿ ÿ ÿÿ4$#ÿ`CCÿÓ¼»ÿáÒÒÿI22ÿG10ÿ†iiÿÝÐÐÿL44ÿ-ÿ#ÿbFFÿøìëÿY@@ÿ(ÿ ÿ ÿÿ ÿÿ ÿÿÿ ÿ ÿÿ[>>ÿ$ÿÿÿÿÿÿÿÿÿ ÿ ÿ+ÿ—ihÿ¡onÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ.ÿsONÿ™iiÿaCBÿÿÿÿÿ ÿ)ÿ‰^^ÿè¡ ÿÚ™˜ÿ‹``ÿ@,+ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ&ÿpRRÿáÅÅÿþõõÿ׫ªÿ]@@ÿÿ ÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿ—wwÿÖÂÂÿ¡ŒÿlQPÿL43ÿC.-ÿ5$$ÿ,ÿÿÿ ÿ ÿÿ%ÿ+ÿ'ÿ,ÿC.-ÿÍ·¶ÿéßßÿ{_^ÿB.-ÿ6%$ÿN76ÿ…lkÿ8&&ÿ"ÿ%ÿW<;ÿùóóÿ¦Žÿ<))ÿÿÿÿ ÿF0/ÿ5$$ÿ ÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿgGGÿJ22ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ"ÿQ87ÿnKKÿÿÿÿÿÿ ÿ%ÿ€XXÿꬫÿùÇÆÿË”“ÿsOOÿ2""ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ6%$ÿšsrÿîÂÂÿ⣢ÿpMLÿ&ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿUCBÿ°°ÿúõõÿæØ×ÿª‘‘ÿ_DDÿ/ ÿÿ ÿ ÿÿ1"!ÿD/.ÿT99ÿR88ÿJ32ÿP76ÿ}_^ÿZ??ÿK43ÿ1"!ÿ+ÿ3#"ÿE0/ÿ/ ÿÿ&ÿL44ÿêÚÚÿϽ½ÿE//ÿ!ÿ ÿÿ ÿ]@@ÿ©vvÿ,ÿ ÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿ9''ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿA,,ÿÿÿÿÿÿÿ ÿÿjIIÿ᪩ÿþåäÿðÇÆÿ¨wvÿR88ÿ"ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿJ33ÿ›kjÿ±zyÿqNMÿ. ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ$ÿ9''ÿeKKÿ­™™ÿèÛÛÿúôôÿɱ±ÿeHHÿ ÿÿsTSÿƶµÿáÐÐÿîææÿôëëÿóååÿ¢vuÿ<))ÿ2""ÿ+ÿ-ÿ9''ÿwVVÿÕ¯®ÿE//ÿÿ!ÿ?,+ÿű°ÿÝÈÈÿA-,ÿÿ ÿÿ ÿO66ÿùÙØÿ‰hgÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿK33ÿÑÿüæåÿþéèÿÚ¥¥ÿ€XXÿ;((ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿC.-ÿfFEÿY==ÿ.ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ-ÿ8&&ÿ9''ÿW?>ÿ}ffÿ‹ccÿT:9ÿ&ÿ%ÿX@@ÿ€ihÿ”wvÿ„lkÿ[BAÿ+ÿÿÿ!ÿ8'&ÿvVVÿôèèÿëÜÜÿ?++ÿÿÿ,ÿŒrrÿð°ÿ0!!ÿÿÿÿÿ9''ÿîÙÙÿæÔÓÿ?++ÿÿ ÿÿÿÿÿÿÿ2""ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ6%%ÿ—jjÿñÌËÿÿöõÿöÐÏÿ³~ÿX<<ÿ'ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ*ÿ1!!ÿ%ÿ ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿ ÿ ÿ ÿÿ)ÿ6%%ÿ<))ÿ6%%ÿ'ÿÿ ÿ ÿ"ÿO77ÿåÖÖÿüúúÿŽrrÿ2""ÿÿ ÿÿ<*)ÿ]BAÿÿ ÿÿÿÿ0! ÿÒ¶¶ÿþüüÿ|_^ÿ&ÿ ÿÿÿÿÿÿÿM55ÿM55ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ$ÿlKJÿÓ  ÿýéèÿýåäÿØ Ÿÿ|UUÿ;((ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿ ÿÿ ÿ0!!ÿbCCÿY>=ÿ6%%ÿ&ÿ!ÿÿÿÿ ÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿÿÿÿÿÿ ÿ ÿ!ÿ§……ÿãÔÓÿˆllÿD/.ÿ&ÿ ÿÿ ÿ ÿÿ ÿ ÿÿÿ ÿ,ÿ¢„ƒÿÿþþÿ±™™ÿ0!!ÿÿÿÿÿÿÿ ÿP76ÿ”feÿP77ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ?++ÿonÿÿÿÚÙÿï³²ÿ¢qpÿQ77ÿ&ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,ÿ§{zÿðÖÖÿи¸ÿž‚‚ÿfHHÿ>**ÿ-ÿ!ÿÿ ÿ ÿÿÿÿÿÿ ÿ ÿÿ#ÿ)ÿ'ÿ ÿÿ#ÿ8&&ÿ9'&ÿ3##ÿ&ÿÿÿÿ ÿÿ,ÿ. ÿ ÿÿÿ ÿ%ÿlLLÿýøøÿÔ¾½ÿ5$$ÿÿÿÿÿÿÿ ÿ@,,ÿĈˆÿº‚ÿ3#"ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ$ÿ^@@ÿÀˆ‡ÿô¹¸ÿ÷²±ÿ¹€ÿiHHÿ1""ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿP::ÿº¤¤ÿùòòÿþûûÿìÙÙÿ·œ›ÿyYXÿA,,ÿ!ÿ ÿ ÿÿÿÿÿ ÿ"ÿ;((ÿW<;ÿtSSÿ†gfÿmmÿŠeeÿaCBÿ0!!ÿÿÿ ÿÿÿ ÿÿ=*)ÿ¢rqÿrNNÿÿÿÿ ÿÿ<))ÿåÐÐÿàÍÍÿ. ÿÿÿÿÿÿÿ ÿ.ÿ¾ˆ‡ÿüâáÿŠcbÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ3##ÿzTSÿÁ†…ÿßš™ÿÂ…„ÿ~VVÿ@,,ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ"ÿQ::ÿ¢ŠŠÿäÔÓÿýúúÿýúúÿêÔÓÿ«ˆ‡ÿ[??ÿ'ÿ ÿÿ ÿ'ÿyVUÿé©ÿç××ÿùññÿþúúÿÿþþÿþüüÿèÊÊÿsOOÿÿÿÿÿÿ ÿÿ8&&ÿ´Žÿýòñÿšrqÿÿ ÿÿÿ ÿ$ÿ¤„„ÿؾ¾ÿ%ÿ ÿÿÿÿÿÿÿÿ”gfÿÿ÷÷ÿãÃÃÿ>+*ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ!ÿ4##ÿ(ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿA-,ÿySSÿ©ttÿ¨ssÿWWÿL43ÿ(ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ)ÿ8&&ÿcIIÿƒƒÿ̵´ÿêÒÒÿ鯮ÿžllÿP77ÿ$ÿ ÿ ÿ4$$ÿqYXÿ•‚ÿ«‘‘ÿ¨ÿ•~~ÿnRRÿ4$$ÿÿ ÿÿÿÿÿÿ.ÿ”ooÿýööÿþúúÿtRRÿÿ ÿÿÿÿ ÿJ33ÿ‹baÿÿ ÿÿÿÿÿÿÿÿbCCÿúååÿþúúÿˆddÿÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿ=*)ÿH11ÿ2""ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿB-,ÿiHHÿzTSÿqMMÿP76ÿ.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ ÿ"ÿ#ÿ+ÿ;((ÿE//ÿ;((ÿ+ÿÿ ÿ ÿÿ*ÿ3#"ÿ4##ÿ1!!ÿ"ÿÿ ÿÿÿÿÿ ÿÿT99ÿïÞÞÿÿÿÿÿÓ¼¼ÿ7%%ÿÿÿÿÿÿÿÿ'ÿ ÿÿÿÿÿÿÿÿ ÿ:('ÿÜ»ºÿÿÿÿÿб°ÿ1!!ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ;((ÿaCBÿZ==ÿ-ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ8&&ÿQ77ÿU::ÿF00ÿ.ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿÿ ÿÿÿÿÿ ÿ ÿÿÿ ÿ ÿÿÿÿÿÿÿ ÿ(ÿ²‘ÿþþþÿåÕÔÿ\BBÿ'ÿ ÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿ&ÿ¥}|ÿÿýýÿùççÿL44ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ2""ÿhHGÿ†\[ÿY==ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ*ÿ7&%ÿ4##ÿ)ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿA,,ÿÚ±±ÿ¶œœÿL65ÿ,ÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿaCCÿùèèÿþüüÿzWWÿÿ ÿÿÿÿÿÿÿÿÿÿ ÿ ÿ`AAÿ¦rqÿžllÿL44ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿ ÿÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ&ÿ2""ÿÿÿ ÿÿÿÿÿÿÿÿÿ ÿ&ÿ#ÿ ÿÿÿÿÿÿÿ ÿ1"!ÿΫªÿÿþþÿ{{ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿJ32ÿ¨ssÿܘ—ÿ”feÿ/! ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿ2""ÿA,,ÿ:('ÿ*ÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿ ÿ. ÿX<<ÿB--ÿÿÿÿÿÿÿÿ ÿÿ†_^ÿýòòÿ³ÿÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ3##ÿŽbaÿó­¬ÿà ŸÿiHGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ9''ÿzTSÿ­wvÿ°{zÿ‹aaÿ_AAÿA-,ÿ-ÿ!ÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ%ÿ)ÿ0! ÿ7&&ÿ?++ÿA-,ÿ6%%ÿ%ÿ ÿÿÿÿÿÿÿÿÿÿ ÿ&ÿmKJÿ°yxÿnLKÿÿÿÿÿÿÿÿÿ ÿ>+*ÿÛ«ªÿ²ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿlJJÿ穨ÿþÓÒÿ¾‡‡ÿ8&&ÿ ÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿY==ÿÀŒ‹ÿøØ×ÿûééÿíÏÎÿ˦¦ÿ wvÿnLKÿB--ÿ-ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿ%ÿ:((ÿ`BBÿŒfeÿ±‹‹ÿÍ©©ÿܸ·ÿݯ®ÿ¾„ƒÿpMLÿ3#"ÿ ÿÿÿÿÿÿÿÿÿ ÿÿY=<ÿ×¢¡ÿúÌËÿŒ``ÿÿÿÿÿÿÿÿÿ ÿÿ~WVÿ…\[ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿF00ÿĉˆÿþéèÿöËÊÿwRQÿÿÿÿÿÿÿ*ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ!ÿ[??ÿ·”“ÿóÞÞÿÿýýÿÿýýÿýîíÿèÉÈÿÀ””ÿˆ_^ÿS99ÿ/ ÿÿ ÿ ÿÿÿÿÿÿ ÿÿ=**ÿwSSÿ»•”ÿãËÊÿûîîÿÿüüÿÿÿÿÿÿÿÿÿþýüÿñÒÑÿœllÿ?++ÿÿÿÿÿÿÿÿÿÿÿ ÿ5$$ÿµ†…ÿþõôÿþóóÿ…]\ÿÿÿÿÿÿÿÿÿÿ ÿ6%%ÿL44ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ+ÿccÿûÛÚÿþööÿÁŒŒÿ2""ÿ ÿÿÿÿÿV;:ÿ7&&ÿ#ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ!ÿA,,ÿ‡edÿË««ÿôâáÿþúúÿÿþþÿþôôÿíÈÇÿÃŽŽÿ€XXÿO66ÿ-ÿÿ ÿÿÿÿ ÿ+ÿaCCÿµƒ‚ÿÝÄÃÿìØ×ÿîÛÛÿëÖÕÿØÃÃÿ»žÿˆffÿH11ÿ!ÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿqNMÿ÷ààÿÿÿÿÿøââÿY==ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\??ÿ⯮ÿÿýýÿòÍÌÿdEDÿÿÿÿÿÿ‰^^ÿfFFÿG10ÿ,ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ)ÿE//ÿzXWÿ¯ŠŠÿ×µ´ÿíÌËÿöÄÃÿ쥤ÿ²{zÿ|UUÿR88ÿ1"!ÿÿ ÿÿÿÿ ÿÿ&ÿ/ ÿ6%%ÿ7%%ÿ/ ÿ(ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ5$$ÿÆ››ÿÿýýÿÿþþÿÅ  ÿ0!!ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ4##ÿ®zyÿþïîÿþóóÿ¥ttÿ&ÿ ÿÿÿÿlkÿa`ÿnLKÿR88ÿ7&%ÿ"ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿ*ÿ?++ÿY==ÿmKKÿnLKÿiHHÿU::ÿ=**ÿ,ÿÿ ÿ ÿÿÿÿ ÿ ÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`BBÿ÷ààÿÿÿÿÿôáàÿeFEÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿlJJÿñÈÇÿÿþýÿצ¥ÿ<))ÿ ÿÿÿÿ|UTÿ‹`_ÿ…[[ÿwRQÿ[>>ÿC..ÿ+ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ#ÿ©yxÿÿúúÿ÷çæÿ€]]ÿ%ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ>+*ÿ¿‡†ÿÿóòÿõÎÍÿcDCÿ ÿÿÿÿD..ÿZ>>ÿlJJÿsONÿiHGÿ[>>ÿF00ÿ1!!ÿ!ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ;)(ÿ¾…„ÿÚ°¯ÿqOOÿ%ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿrNNÿõÃÂÿþÙØÿŒa`ÿÿÿÿÿÿ(ÿ>**ÿQ87ÿ]@@ÿ^A@ÿV;;ÿD/.ÿ6%%ÿ'ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ:''ÿZ>=ÿ7%%ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿA-,ÿº‚‚ÿþÅÄÿªuuÿ$ÿ ÿÿÿÿ ÿ ÿ'ÿ5$$ÿB--ÿH21ÿG10ÿC.-ÿ4$#ÿ(ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ(ÿ+ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿtPOÿܘ˜ÿ³{zÿ1"!ÿ ÿÿÿÿÿÿ ÿ ÿÿ+ÿ3##ÿ7&%ÿ5%$ÿ1!!ÿ'ÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ)ÿB--ÿD/.ÿ(ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ?++ÿšjiÿ nnÿ9''ÿ ÿÿÿÿÿÿÿÿ ÿ ÿÿ$ÿ(ÿ+ÿ'ÿ#ÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿD/.ÿgGFÿeEEÿ<))ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[>>ÿ€XXÿ;((ÿ ÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿÿÿÿÿÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ/ ÿiHGÿ™iiÿŠ_^ÿK43ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ3##ÿW<<ÿ4##ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿ ÿÿÿ ÿ ÿ ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿÿ$ÿ/ ÿ9''ÿF0/ÿQ87ÿP76ÿF00ÿ2""ÿ!ÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿO76ÿ¢poÿØ•”ÿµ}|ÿT:9ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ5$$ÿ'ÿ ÿÿÿà‰9ÒdurafP¯ë splCÀ>€> ?@?€?€?¥0ôKfrE:´Ùfyre-1.0.1/data/Makefile.am0000644000175000001440000000156710450731476012360 00000000000000SUBDIRS = icons fyredatadir = $(datadir)/fyre fyredata_DATA = \ explorer.glade \ animation-render.glade \ metadata-emblem.png \ about-box.fa if ENABLE_FDODESKTOP desktopdir = $(datadir)/applications desktop_DATA = fyre.desktop update_fdodesktop = update-desktop-database else update_fdodesktop = /bin/true endif if ENABLE_XDGMIME xdgmimedir = $(datadir)/mime/packages xdgmime_DATA = fyre.xml update_xdgmime = update-mime-database $(datadir)/mime xdgicondir = $(datadir)/icons/hicolor/48x48/mimetypes xdgicon_DATA = application-x-fyre-animation.png else update_xdgmime = /bin/true endif install-data-hook: $(update_xdgmime) || true $(update_fdodesktop) || true uninstall-hook: $(update_xdgmime) || true $(update_fdodesktop) || true EXTRA_DIST = \ $(fyredata_DATA) \ $(desktop_DATA) \ fyre-win32-icons.xcf.gz \ fyre.xml \ application-x-fyre-animation.png fyre-1.0.1/data/Makefile.in0000644000175000001440000004503110512344604012353 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = data DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(fyredatadir)" \ "$(DESTDIR)$(xdgicondir)" "$(DESTDIR)$(xdgmimedir)" desktopDATA_INSTALL = $(INSTALL_DATA) fyredataDATA_INSTALL = $(INSTALL_DATA) xdgiconDATA_INSTALL = $(INSTALL_DATA) xdgmimeDATA_INSTALL = $(INSTALL_DATA) DATA = $(desktop_DATA) $(fyredata_DATA) $(xdgicon_DATA) \ $(xdgmime_DATA) ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ BINRELOC_LIBS = @BINRELOC_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_FDODESKTOP_FALSE = @ENABLE_FDODESKTOP_FALSE@ ENABLE_FDODESKTOP_TRUE = @ENABLE_FDODESKTOP_TRUE@ ENABLE_XDGMIME_FALSE = @ENABLE_XDGMIME_FALSE@ ENABLE_XDGMIME_TRUE = @ENABLE_XDGMIME_TRUE@ EXEEXT = @EXEEXT@ EXR_CFLAGS = @EXR_CFLAGS@ EXR_LIBS = @EXR_LIBS@ FDODESKTOP = @FDODESKTOP@ GNET_CFLAGS = @GNET_CFLAGS@ GNET_LIBS = @GNET_LIBS@ GREP = @GREP@ HAVE_BINRELOC_FALSE = @HAVE_BINRELOC_FALSE@ HAVE_BINRELOC_TRUE = @HAVE_BINRELOC_TRUE@ HAVE_EXR_FALSE = @HAVE_EXR_FALSE@ HAVE_EXR_TRUE = @HAVE_EXR_TRUE@ HAVE_GETOPT_FALSE = @HAVE_GETOPT_FALSE@ HAVE_GETOPT_TRUE = @HAVE_GETOPT_TRUE@ HAVE_GNET_FALSE = @HAVE_GNET_FALSE@ HAVE_GNET_TRUE = @HAVE_GNET_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIN32_LIBS = @WIN32_LIBS@ XDGMIME = @XDGMIME@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = icons fyredatadir = $(datadir)/fyre fyredata_DATA = \ explorer.glade \ animation-render.glade \ metadata-emblem.png \ about-box.fa @ENABLE_FDODESKTOP_TRUE@desktopdir = $(datadir)/applications @ENABLE_FDODESKTOP_TRUE@desktop_DATA = fyre.desktop @ENABLE_FDODESKTOP_FALSE@update_fdodesktop = /bin/true @ENABLE_FDODESKTOP_TRUE@update_fdodesktop = update-desktop-database @ENABLE_XDGMIME_TRUE@xdgmimedir = $(datadir)/mime/packages @ENABLE_XDGMIME_TRUE@xdgmime_DATA = fyre.xml @ENABLE_XDGMIME_FALSE@update_xdgmime = /bin/true @ENABLE_XDGMIME_TRUE@update_xdgmime = update-mime-database $(datadir)/mime @ENABLE_XDGMIME_TRUE@xdgicondir = $(datadir)/icons/hicolor/48x48/mimetypes @ENABLE_XDGMIME_TRUE@xdgicon_DATA = application-x-fyre-animation.png EXTRA_DIST = \ $(fyredata_DATA) \ $(desktop_DATA) \ fyre-win32-icons.xcf.gz \ fyre.xml \ application-x-fyre-animation.png all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu data/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: install-desktopDATA: $(desktop_DATA) @$(NORMAL_INSTALL) test -z "$(desktopdir)" || $(mkdir_p) "$(DESTDIR)$(desktopdir)" @list='$(desktop_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(desktopDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(desktopdir)/$$f'"; \ $(desktopDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(desktopdir)/$$f"; \ done uninstall-desktopDATA: @$(NORMAL_UNINSTALL) @list='$(desktop_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(desktopdir)/$$f'"; \ rm -f "$(DESTDIR)$(desktopdir)/$$f"; \ done install-fyredataDATA: $(fyredata_DATA) @$(NORMAL_INSTALL) test -z "$(fyredatadir)" || $(mkdir_p) "$(DESTDIR)$(fyredatadir)" @list='$(fyredata_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(fyredataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(fyredatadir)/$$f'"; \ $(fyredataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(fyredatadir)/$$f"; \ done uninstall-fyredataDATA: @$(NORMAL_UNINSTALL) @list='$(fyredata_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(fyredatadir)/$$f'"; \ rm -f "$(DESTDIR)$(fyredatadir)/$$f"; \ done install-xdgiconDATA: $(xdgicon_DATA) @$(NORMAL_INSTALL) test -z "$(xdgicondir)" || $(mkdir_p) "$(DESTDIR)$(xdgicondir)" @list='$(xdgicon_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(xdgiconDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(xdgicondir)/$$f'"; \ $(xdgiconDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(xdgicondir)/$$f"; \ done uninstall-xdgiconDATA: @$(NORMAL_UNINSTALL) @list='$(xdgicon_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(xdgicondir)/$$f'"; \ rm -f "$(DESTDIR)$(xdgicondir)/$$f"; \ done install-xdgmimeDATA: $(xdgmime_DATA) @$(NORMAL_INSTALL) test -z "$(xdgmimedir)" || $(mkdir_p) "$(DESTDIR)$(xdgmimedir)" @list='$(xdgmime_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(xdgmimeDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(xdgmimedir)/$$f'"; \ $(xdgmimeDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(xdgmimedir)/$$f"; \ done uninstall-xdgmimeDATA: @$(NORMAL_UNINSTALL) @list='$(xdgmime_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(xdgmimedir)/$$f'"; \ rm -f "$(DESTDIR)$(xdgmimedir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(fyredatadir)" "$(DESTDIR)$(xdgicondir)" "$(DESTDIR)$(xdgmimedir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-desktopDATA install-fyredataDATA \ install-xdgiconDATA install-xdgmimeDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-desktopDATA uninstall-fyredataDATA \ uninstall-info-am uninstall-xdgiconDATA uninstall-xdgmimeDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-recursive ctags ctags-recursive \ distclean distclean-generic distclean-recursive distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-data-hook \ install-desktopDATA install-exec install-exec-am \ install-fyredataDATA install-info install-info-am install-man \ install-strip install-xdgiconDATA install-xdgmimeDATA \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-desktopDATA \ uninstall-fyredataDATA uninstall-hook uninstall-info-am \ uninstall-xdgiconDATA uninstall-xdgmimeDATA install-data-hook: $(update_xdgmime) || true $(update_fdodesktop) || true uninstall-hook: $(update_xdgmime) || true $(update_fdodesktop) || true # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fyre-1.0.1/data/animation-render.glade0000644000175000001440000010567110263337643014557 00000000000000 True Rendering Animation - Fyre GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False False True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST 10 True False 8 True False 6 True <b>Settings</b> False True GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 False False True False 0 True False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 0 False False True 3 5 False 6 6 True Output file: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 0 1 fill True Size: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 1 2 fill True Frame rate: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 2 3 fill True False 6 True True 1 0 True GTK_UPDATE_ALWAYS False False 512 16 9999 1 16 16 0 True True True by False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 False False True True 1 0 True GTK_UPDATE_ALWAYS False False 384 16 9999 1 16 16 0 True True 1 2 1 2 fill fill True True 0.10000000149 3 True GTK_UPDATE_ALWAYS False False 24 0.01 100 0.01 1 1 1 2 2 3 True False 6 True True True True 0 rendering.avi True * False 0 True True True True GTK_RELIEF_NORMAL True True gtk-save-as 4 0.5 0.5 0 0 0 False False 1 5 0 1 fill True True 1 0 True GTK_UPDATE_ALWAYS False False 1 0 4 1 1 1 4 5 1 2 True True 0.10000000149 3 True GTK_UPDATE_ALWAYS False False 0.10000000149 0 100 0.00999999977648 0.5 0.5 4 5 2 3 True Oversampling: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 3 4 1 2 fill True Quality: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 3 4 2 3 fill True False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 2 3 1 2 fill True False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 2 3 2 3 fill 0 True True 0 True True 0 False True True False False 8 True <b>Progress</b> False True GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 False False True False 0 True False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 0 False False True 2 2 False 6 6 True Animation: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 0 1 fill True Frame: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 1 2 fill True GTK_PROGRESS_LEFT_TO_RIGHT 0 0.10000000149 1 2 0 1 True GTK_PROGRESS_LEFT_TO_RIGHT 0 0.10000000149 1 2 1 2 0 True True 0 True True 0 False True True False 0 0 0.5 GTK_SHADOW_ETCHED_IN True 0.5 0.5 0 0 0 True False 2 False False True GTK_BUTTONBOX_END 10 True True True gtk-close True GTK_RELIEF_NORMAL True True True True gtk-ok True GTK_RELIEF_NORMAL True 0 False True GTK_PACK_END 6 Cancel Rendering? GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST False True False 0 True GTK_BUTTONBOX_END True True True GTK_RELIEF_NORMAL True -2 True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-ok 4 0.5 0.5 0 0 0 False False True _Resume True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 0 False False True True True GTK_RELIEF_NORMAL True -6 True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-clear 4 0.5 0.5 0 0 0 False False True _Cancel Rendering True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 0 False False 0 False True GTK_PACK_END 6 True False 12 True gtk-dialog-warning 6 0.5 0 0 0 0 False True True <span weight="bold" size="larger">Cancel Rendering?</span> If you cancel now, the frames rendered so far will be lost. False True GTK_JUSTIFY_LEFT False False 0 0 0 0 0 True True 0 True True fyre-1.0.1/data/application-x-fyre-animation.png0000644000175000001440000001020010263337643016502 00000000000000‰PNG  IHDR04Ì“»‘bKGDÿÿÿ ½§“ pHYs  šœtIMEÕ%9b÷Ý IDAThÞÕšklTç™Çç2WÇcƒíØ€¡6„š@0æê]HZê,TPµi•Q£4ZØ T­%ʇí‡dsS)ß’P¢ýB•n»*ä ƒ3ÆNlã`ì±Æ·¹xf|îûaf3ÆGÕJé+||æøõsù?ÿçò€€õ}øÔÕÕ]_¼xñ;À p0‡eõôôXÓW2™´,˲‰„u«¥ëº¥(Š566fY–eŽŽZÏJ¥RV0´~ó›ßä”Z xñV €eYÖM_Äb1,˲,JKKoúÞ0 t]G×u’ɤýìwÜqÃ23ì;Û2 MÓH§Ótvv²uëV€Zà:0˜Óÿæ–šišF @×õ›¾ÓuMÓPUUUÑ4ÊÊJûÙœ2ßuéºÎÕ«W)++cÍš5?~à[ pÏ$¯<ÛfápxFÅTUebb‚k×® ¹páÝÝÝ\¿~-[¶PWWDzeËØ¶m.— I’欄¦iøý~6lØÀÑ£Gùå/ù­¢(3zâ– …B,\¸ÁÁAÛš–eÇéèè ¯¯¯¾úŠ+VÐÐÐÀ‚ 0 ƒt:M[[çÏŸÇ0 žyæîºë.Ž[ÇcnEQ8}ú4ÍÍ͘¦‰(ŠôõõÑÒrŽ}ûþx<~“·T ¿¿¿@p€¡¡!^}õUJKKÙ³gëÖ­+À¼¢(ôôôàt:)))áÌ™3¼ôÒKüö·¿eçÎø|¾Yccj*Í©SŸ²}ûvTUE’$$IâÂ… ôôôðÐCåÇD°äÙª®®ŽÞÞ^jkk¹té/¼ð»wïæ‘GA áxùòeººº$ —Ë…eYlß¾•+W²cÇ¢Ñ(?ü0.— Ar¶'_Ë‚t:ÍØØ_ý5n·›±±1¼^/K—ÖqäÈ~ñ‹_< < è€zKtwwcY†a …xå•WØ·o555„B!vîÜi+ÑÑÑA0Äï÷“N§BöîÝ‹ œKenfâæ6 „ÃaR©›6m²³bss3š¦át:íçu]·F"¾ùæü~?†A<Ç4M4M#™L"Š"‚ 044„®8¢ —B",,Ef+KäéTfYpñâEjjj)^×u ÃÀårÙV…cÇŽÑÞÞŽišÈ²L[[¿úÕ¯ðz½(ŠB(b||Üö®$‰B¡ÅsV¾„™•™³ìßÏ;Ç{ï½G"‘ ²²’§Ÿ~Y–má?ûì3›At]gpp¶¶66mÚÄØØ‚ÀÈÈÃÃÃÔÕ-Å0Ì‚dXèkÅÞºvó­ŸÓ¶¿¿ŸŠŠ :;;9{ö¬mÝh4Š,ËèºN?x<$IBEDQ$‰pêÔ)A@QNž>N,£¨¨UUÂãñàõzEÑ®%IÂÈÒÉðð0¡Pˆ×^{ÚÚZZZZ8zô(Û¶m# qñâE~ÿûÿÄï/.0ØtÈÒ¨57åo¶xq /^D–e<}}}=z”ëׯçjTU¥¶¶–ªª*TUexx˜úúz^|ñEÖ¯_OGGo¾ù&ÅÅÅÄãqººº¨­­eÉ’àñx²ÜofF™D6ý~NÑï䦦âÙgŸ¥¹¹Ahii¡¾¾žýû÷ÓÐÐ@,Ã4MJKKÙ¾};ét¯×K Àétrþüyþò—¿Ð××Ç®]»èíí¥££ƒ^x‡CÆ0 Š7Ód!÷ß®±“ =ÁZI‰ŸE‹Ù}éc=ÆO<Çãabb¢€ÿ‹ŠŠåŒPáp˜D"Á믿NOOÛ¶m#‹ñå—_rÏ=÷PTäÃç+FQ¦e‡;Ù¶dέ¯– i,óE‰ ª9qâ#ÊÊÊX½z5º®‹Å 2¬iš$“I4Mcrr’¾¾>Þ}÷]TUeÏž=´´´‡)**"ñÆoàñ¸Ÿ°‹A°ðûK¸ÿþf~ò“SUU,KuR~Á7‹¦-˜Ã!ãv{X´¨†—_~™ÇœššdY¶3±¦i¤R)¢Ñ(áp˜O>ù„h4ÊwÞIuu5£££,[¶Œµk×2þ|œN'n·›ªª*ü~?‡ƒÁÁA"‘¡PˆO?=ÍÁƒ`ïÞ½ìÞý3»—¾áÛ(`š†a¢ëŠ¢àr9¹÷Þ­ŒräÈ$IbëÖ­vЃA’É$±XŒD"(ЬZµŠt:Í•+W N£iÕÕÕ¬]»–P(ÄÝwßMqq1n·›ÊÊJ4MchhˆU«VÑÛÛËÇLww7O>™¬( ³BÈîÈ’ÉI Ã@UUR©'NœDQ&''ñxÜ´¶¶24”aŸÏGuu5~¿Ó4§¯¯®®.JJJXµj%555Äãq’É$ÉdŠêëë)..¶K’\1˜Ë%eeeŒŒŒðÅ_°{÷ÏØµë$I¶=ÐÖdÇŽ÷_× ‚8ãÃÈ@iݺuœ;÷9K—.cáÂ…$“tvv088Èðð0¤R)"‘.—‹ÚÚðÀ;Y´hºn°`A&Ë:NÂák¼ýöÛìÚµ ·ÛMcc#‡Ãf£ÜpìܹslذC‡ÞfË–­””Ï:–)ˆ!Ï[¢(ráÂy@Àëõàp8E‰•+WáóùˆÇTVV Ë™xI’X´¨I þ©®ȲÌÄÄ¢(rõêU6n܈,Ëv)!Iªª²téR‚Á óæÍ£µõ šššðz½s b² $"I"‡Ìºuëøüó³´·_Ì«WÀëõâõzÑõ Ÿ 466rñbN§£€ÇœN —ˉ,˨ªŠÃá ™LÚÈíÇ‘$‰yóæQ]]ͱcÇhhXËåDÄÛ'²\iàp8eííí8.DQ² LÛº‡™‘XtuuápÈ8òM­¢eYȲŒß_lÓn®$WUÓ4³Kö@ €¦i|ñE+ƒƒ!JJHÒÌ9AžÏ‚`ÓeSÓ8sæ3Ö®m´/¿ËÊm il\×_¶ãñäÜ-ä—T*‰ÏWÌÄćFÓ4û“›·æj,Y– ƒAêë˜í¬Ùc@DD1c± Úp»]x<{«Wr›¥Ói<ß|Ó×›)örƒ«œðÉd’ë×#Äb1Âá0¤Óie*k0š¦bY ‚Ýè$“IÆÆÆìÒã6 XYÈZ@bÓ¦ñùçgq8H’d]æQ3Û& x½^Ö®]K[Û—x½L³°ÏáôéÓtwwsçw²xq %ø|>ŠŠŠòú ‰ÉÉýýW9tèm»îºmˆF' ii9‡if,¸qãÆi¤RIÒé4SS ÃÃö…ó<`"FŽsmBcP[ ^'È2ˆäO'Ç0¯xf!ÿö×?±û?Þ¡µõülyÀš6Ø´i­­ç³ž²©Ý´3l·’$ÓØ¸†`0hwZ™½2ŠL¶ü`¼Ægɪ·¸¿Ül¯à_¿9{ ä22y -;I¸AµSSSö¡†¢¨YZ”éììÌfM!û|†òÿÏÏÜŒáÓÏÝ`¬»ú˜À’{™èÿ˜Îw~<§óyæ¦DQ ¡a íííƒív|L/q3y@`ÕªU|õUçœêø|¡s«¨r %÷Pºä>Š*H^o¿­âô’5Ç‚ ÒÑÑa'6ImsùâF/,ÒÕu) ±üFÜœóÉÌÂM¿ 1œì¿û®(œ‰¢ÈÊ•+¹té+V¬(ȬÓé,Ç.===s:J§Ÿp/¤¼þ_Ñ•8—Þûë÷öP¾âA®|ò4j"47¦7Ï¢(ÑÕõµi§ nœªL!"½½—oJ÷–e!ÌB 6@”ˆ’ƒM†nÜ_¿Ÿ+?9Wr· üð‡ËE)¯¶± F0Š¢dYHdéÒº¼YÏÜX%g1U ¿àÂwqú9¶·VPµæ1$gñÜ=pcœ²,Ñ×wYgmX(ŠbŸ‹¢ÄÀÀ =mþ.Ë[¾’ÑžÿA‰ í é`àìá,^€·|%‰¡s·W 7LÊ/§—,YÂÕ«W§M ,TUC× 4-SɲDuu5ÃÃáY!4û$†ÎÍ(`ÿ©g¾[O·²,K„Bƒy3|+Û «èºa蘦a×ò‘H$[‰Âçoýÿ{Œÿ·uÓXÅÆ¦$qÇU„ÃaûÀ;ÇùÓ¯eeeö:ýË£ñןEÓô›àõ]Oó#‘ÑÜe=P–z{{ñù¼‹¢ÈÈHY–fZ°[¦‚̼[1ÓÀæÍ›ÿ.Ásëƒ>Ê]~­…2¸ví‰D‚ïó"ÏÈåß›÷…æøùo`Kö)G ë¢ìñ¥ð=v„(ÙW †Éœ°¥Y᥌ì{)@ò2²À?βro«üßyû ™šAIEND®B`‚fyre-1.0.1/data/fyre.xml0000644000175000001440000000075110263337643012005 00000000000000 Fyre Animation fyre-1.0.1/contrib/0000777000175000001440000000000010512346421011115 500000000000000fyre-1.0.1/contrib/fyre_remote.py0000755000175000001440000001103210263337641013732 00000000000000#!/usr/bin/env python # # This is an example Python module for controlling Fyre # in remote control mode. Run it for a quick demonstration, # or import it in your own scripts. # import socket RESPONSE_READY = 220 RESPONSE_OK = 250 RESPONSE_PROGRESS = 251 RESPONSE_FALSE = 252 RESPONSE_BINARY = 380 RESPONSE_UNRECOGNIZED = 500 RESPONSE_BAD_VALUE = 501 RESPONSE_UNSUPPORTED = 502 class FyreException(Exception): def __init__(self, code, message, command=None): msg = "%d %s" % (code, message) if command: msg = "%s (in response to %r" % (msg, command) Exception.__init__(self, msg) class FyreServer: """This class represents a socket connection to a remote Fyre server (fyre -r) """ defaultPort = 7931 def __init__(self, host): if host.find(":") >= 0: host, port = host.split(":") port = int(port) else: port = self.defaultPort self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((host, port)) self.file = self.socket.makefile() self.asyncQueue = [] # Read the server's greeting code, message = self._readResponse() if code != RESPONSE_READY: raise FyreException(code, message) def flush(self): """Send all pending asynchronous commands. If any of them returned an error, this raises an exception indicating which command resulted in which response code. """ self.file.flush() for command in self.asyncQueue: code, message = self._readResponse() if code < 200 or code >= 300: raise FyreException(code, message, command) self.asyncQueue = [] def _readResponse(self): """Read the server's next response, returning a (response_code, message) tuple. """ line = self.file.readline().strip() code, message = line.split(" ", 1) return int(code), message def command(self, *tokens): """Send a command in which the return value doesn't matter except for detecting errors. This command will be buffered, and any errors won't be detected until the next flush(). """ cmd = " ".join(map(str, tokens)) self.file.write(cmd + "\n") self.asyncQueue.append(cmd) def query(self, *tokens): """Immediately send a command in which we care about the response value. This forces a flush() first, so errors from other commands may be first discovered here. Returns a (response_code, message) tuple. """ self.flush() cmd = " ".join(map(str, tokens)) self.file.write(cmd + "\n") self.file.flush() return self._readResponse() def setParams(self, **kwargs): """Set any number of parameters, given as keyword arguments. Like command(), these will not take effect until the next flush(). """ for item in kwargs.iteritems(): self.command("set_param", "%s=%s" % item) if __name__ == "__main__": # A simple demo... # This connects to the Fyre server, sets up a bunch of image # parameters, (copied straight out of a saved .png file) then # varies some of the parameters to create a simple animation. # This could be extended into a more complex animation, maybe # even one based on sensors or a simulation. import math, sys if len(sys.argv) > 1: host = sys.argv[1] else: host = "localhost" fyre = FyreServer(host) fyre.command("set_render_time", 0.02) fyre.setParams(size = "400x300", exposure = 0.030000, zoom = 0.8, gamma = 1.010000, a = 4.394958, b = 1.028872, c = 1.698752, d = 3.954149, xoffset = 0.308333, yoffset = 0.058333, emphasize_transient = 1, transient_iterations = 3, initial_conditions = "circular_uniform", initial_xscale = 0.824000, initial_yscale = 0.018000) fyre.command("set_gui_style", "simple") t = 0 while 1: fyre.setParams(initial_xoffset = t * 1.5, initial_yoffset = math.sin(t) * 0.1) fyre.command("calc_step") fyre.flush() t += 0.1 ### The End ### fyre-1.0.1/contrib/Makefile.am0000644000175000001440000000020610263337641013072 00000000000000EXTRA_DIST = \ cluster-utils.sh \ fyre.fedora-initscript \ fyre.gentoo-initscript \ fyre.ubuntu-initscript \ fyre_remote.py fyre-1.0.1/contrib/Makefile.in0000644000175000001440000002125610512344604013105 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = contrib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ BINRELOC_LIBS = @BINRELOC_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_FDODESKTOP_FALSE = @ENABLE_FDODESKTOP_FALSE@ ENABLE_FDODESKTOP_TRUE = @ENABLE_FDODESKTOP_TRUE@ ENABLE_XDGMIME_FALSE = @ENABLE_XDGMIME_FALSE@ ENABLE_XDGMIME_TRUE = @ENABLE_XDGMIME_TRUE@ EXEEXT = @EXEEXT@ EXR_CFLAGS = @EXR_CFLAGS@ EXR_LIBS = @EXR_LIBS@ FDODESKTOP = @FDODESKTOP@ GNET_CFLAGS = @GNET_CFLAGS@ GNET_LIBS = @GNET_LIBS@ GREP = @GREP@ HAVE_BINRELOC_FALSE = @HAVE_BINRELOC_FALSE@ HAVE_BINRELOC_TRUE = @HAVE_BINRELOC_TRUE@ HAVE_EXR_FALSE = @HAVE_EXR_FALSE@ HAVE_EXR_TRUE = @HAVE_EXR_TRUE@ HAVE_GETOPT_FALSE = @HAVE_GETOPT_FALSE@ HAVE_GETOPT_TRUE = @HAVE_GETOPT_TRUE@ HAVE_GNET_FALSE = @HAVE_GNET_FALSE@ HAVE_GNET_TRUE = @HAVE_GNET_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIN32_LIBS = @WIN32_LIBS@ XDGMIME = @XDGMIME@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ EXTRA_DIST = \ cluster-utils.sh \ fyre.fedora-initscript \ fyre.gentoo-initscript \ fyre.ubuntu-initscript \ fyre_remote.py all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu contrib/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu contrib/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh uninstall-info-am: tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fyre-1.0.1/contrib/fyre.fedora-initscript0000755000175000001440000000176310263337641015367 00000000000000#! /bin/bash # # fyre Start/Stop the fyre daemon. # # chkconfig: 2345 99 99 # description: Fyre cluster daemon # processname: fyre # pidfile: /var/run/fyre.pid # Source function library. . /etc/init.d/functions RETVAL=0 # See how we were called. prog="fyre" start() { echo -n $"Starting $prog: " daemon $prog -r RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/fyre return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc fyre RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/fyre return $RETVAL } rhstatus() { status $prog } restart() { stop start } reload() { echo -n $"Reloading fyre configuration: " killproc fyre -HUP retval=$? echo return $RETVAL } case "$1" in start) start ;; stop) stop ;; restart) restart ;; reload) reload ;; status) rhstatus ;; condrestart) [ -f /var/lock/subsys/$prog ] && restart || : ;; *) echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}" exit 1 esac exit $? fyre-1.0.1/contrib/cluster-utils.sh0000644000175000001440000000143610263337641014217 00000000000000# Bash shell functions to assist in working with clusters # Usage: # . cluster_utils.sh # # The commands "cset ", "crun ", and # "cstart " become available. # # Set the current cluster- argument is a file of hostnames cset () { HOSTFILE=`pwd`/$1 HOST_LINES="" for host in `cat $HOSTFILE`; do echo -n "testing $host..." ping -c 1 $host >&/dev/null if [ "$?" -eq "0" ]; then echo "ok!" HOST_LINES="$HOST_LINES $host" else echo "down" fi done HOSTS=`echo $HOST_LINES | tr ' ' ','` export HOSTS export HOST_LINES export HOSTFILE } crun () { for host in $HOST_LINES; do ssh $host "$@" done } cstart () { for host in $HOST_LINES; do ssh $host "$@" & done } fyre-1.0.1/contrib/fyre.ubuntu-initscript0000755000175000001440000000142010263337641015437 00000000000000#!/bin/sh # Start/stop the fyre daemon. DAEMON=/usr/bin/fyre NAME=fyre DESC="fyre cluster daemon" NICELEVEL=19 PIDFILE=/var/run/fyre.pid PARAMS= test -f /usr/bin/fyre || exit 0 . /lib/lsb/init-functions start_fyre() { start-stop-daemon --start --quiet --name $NAME --nicelevel $NICELEVEL \ --exec $DAEMON -- -r --pidfile $PIDFILE $PARAMS } stop_fyre() { start-stop-daemon --stop --quiet --name $NAME --pidfile $PIDFILE } case "$1" in start) log_begin_msg "Starting $DESC..." start_fyre log_end_msg $? ;; stop) log_begin_msg "Stopping $DESC..." stop_fyre log_end_msg $? ;; restart) log_begin_msg "Restarting fyre cluster daemon..." stop_fyre start_fyre log_end_msg $? ;; *) log_success_msg "Usage: /etc/init.d/$NAME start|stop|restart" exit 1 ;; esac exit 0 fyre-1.0.1/contrib/fyre.gentoo-initscript0000755000175000001440000000052710263337641015417 00000000000000#!/sbin/runscript depend() { need net } start() { ebegin "Starting fyre" start-stop-daemon --start --quiet --nicelevel 19 \ --pidfile /var/run/fyre.pid \ --startas /usr/bin/fyre -- \ -r --pidfile /var/run/fyre.pid eend $? } stop() { ebegin "Stopping fyre" start-stop-daemon --stop --quiet --pidfile /var/run/fyre.pid eend $? } fyre-1.0.1/depcomp0000755000175000001440000003710010411563042010745 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2005-07-09.11 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # 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, 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mecanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: fyre-1.0.1/aclocal.m40000644000175000001440000010767610477410004011251 00000000000000# generated automatically by aclocal 1.9.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.9.6])]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 7 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH]) ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 3 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) fyre-1.0.1/README0000644000175000001440000001254510263337643010271 00000000000000================== Fyre ================== Introduction ------------ Fyre is a tool for producing computational artwork based on histograms of iterated chaotic functions. At the moment, it implements the Peter de Jong map in a fixed-function pipeline with an interactive GTK+ frontend and a command line interface for easy and efficient rendering of high-resolution, high quality images. This program was previously known as 'de Jong Explorer', but has been renamed to make way for supporting other chaotic functions. All the images you can create with this program are based on the simple Peter de Jong map equations: x' = sin(a * y) - cos(b * x) y' = sin(c * x) - cos(d * y) For most values of a,b,c and d the point (x,y) moves chaotically. The resulting image is a map of the probability that the point lies within the area represented by each pixel. As you let Fyre render longer it collects more samples and this probability map and the image becomes more accurate. The resulting probability map is treated as a High Dynamic Range image. This software includes some image manipulation features that let you apply linear interpolation and gamma correction at the full internal precision, producing a much higher quality image than if you tried to create the same effects using standard image processing tools. Additionally, Gaussian blurs can be applied to the image using a stochastic process that produces much more natural-looking images than most programs, again without losing any of the image's original precision. Contact info and the latest version of Fyre is available from: http://fyre.navi.cx Quality Metric -------------- Fyre 1.0.0 introduces a new quality metric for determining stopping conditions on command-line and animation rendering. It is much more consistent across images than using the maximum density. A quality of 1.0 is generally "pretty good", and 2.0 produces a very high quality image. As usual, while this metric is pretty reliable, it's impossible to automatically judge aesthetics, so you may need to fiddle with it if you're dissatisfied with the results. Loading and Saving ------------------ Unless given a .exr extension, all images saved using the GTK+ frontend or the -o command line option are standard PNG files containing an extra 'tEXt' chunk with all the parameters used to create the image. This means the image can be loaded back in using the -i command line option or the "Parameters -> Load from image" menu item. One convenient use of this is to save small low-quality images using the GUI, then use the -i, -q, -s, and -o options to render very high quality and/or large images noninteractively. When using the -o (--output) option, no GUI is presented. Instead, Fyre just outputs status lines every so often with the current rendering process. These lines include: - percent completion - current number of iterations - speed in iterations per second - current and target peak density values - elapsed and estimated remaining time Animation --------- Fyre includes an animation subsystem. From the main explorer window, use View > Animation window to open the animation interface. Animations are represented as a list of keyframes, with a transition after each. Keyframes can be manipulated with the buttons at the top of the window. Transitions consist of a duration, in seconds, and an editable curve. This curve's presets can be used to transition linearly or ease in and out of keyframes, but you can also edit the curve for more complex effects. Each keyframe in the list also shows you the bifurcation diagram between that keyframe's parameters and the next. Intense black dots or lines in the bifurcation diagrams are fixed points or limit cycles, which usually don't look good in animation. You can preview the animation by dragging the two horizontal seek bars, or using the 'play' button. The keyframe list can be loaded from and saved to a custom binary format. Once you have an animation you like, you can get a higher quality version using File -> Render. The result will be an uncompressed .AVI file. You can use tools like mencoder or transcode to compress this file with your favorite codec. Animations can also be rendered from the command line using the -n and -o options together. Clustering ---------- As of 0.7, Fyre supports cluster rendering. On each worker node, start up fyre with the -r command-line switch. On the head node, select your cluster nodes using either the GUI or -c on the command line. If you're dealing with a large cluster, the cluster-utils.sh file will probably prove useful. Clusters on the local network can be autodetected using UDP broadcast packets. See the -C command line option, or the autodetection check box in the GUI. Note that cluster mode cannot be used for animations at this time. Dependencies ------------ Hard Dependencies: - GTK+ 2.0 - libglade Soft Dependencies: - GTK+ 2.4 - OpenEXR, necessary for saving .exr files - GNet, for clustering and remote control mode Compiling --------- Standard autotools procedure. configure, make, make install, you know the drill. Fyre supports Windows, using the same autotools build system. You'll need Cygwin to compile this under Windows, but we find a cross-compiler under Linux easier. The tools in the 'build' directory are used to create the final binary packages. Authors -------- David Trowbridge Micah Dowty fyre-1.0.1/configure0000755000175000001440000070045610477410012011312 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.60 for fyre 1.0.1. # # Report bugs to . # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # # Copyright 2004-2006 David Trowbridge and Micah Dowty ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /usr/bin/posix$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # Find out whether ``test -x'' works. Don't use a zero-byte file, as # systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then as_executable_p="test -x" else as_executable_p=: fi rm -f conf$$.file # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='fyre' PACKAGE_TARNAME='fyre' PACKAGE_VERSION='1.0.1' PACKAGE_STRING='fyre 1.0.1' PACKAGE_BUGREPORT='trowbrds@gmail.com' ac_unique_file="config.h.in" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #endif #if HAVE_STDINT_H # include #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE LN_S CPP GREP EGREP BINRELOC_CFLAGS BINRELOC_LIBS HAVE_BINRELOC_TRUE HAVE_BINRELOC_FALSE XDGMIME ENABLE_XDGMIME_TRUE ENABLE_XDGMIME_FALSE FDODESKTOP ENABLE_FDODESKTOP_TRUE ENABLE_FDODESKTOP_FALSE PKG_CONFIG PACKAGE_CFLAGS PACKAGE_LIBS WIN32_LIBS HAVE_GETOPT_TRUE HAVE_GETOPT_FALSE EXR_CFLAGS EXR_LIBS HAVE_EXR_TRUE HAVE_EXR_FALSE GNET_CFLAGS GNET_LIBS HAVE_GNET_TRUE HAVE_GNET_FALSE LIBOBJS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS CPPFLAGS CXX CXXFLAGS CCC CPP PKG_CONFIG PACKAGE_CFLAGS PACKAGE_LIBS EXR_CFLAGS EXR_LIBS GNET_CFLAGS GNET_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures fyre 1.0.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/fyre] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of fyre 1.0.1:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-binreloc compile with binary relocation support (default=enable when available) --enable-binreloc-threads compile binary relocation with threads support (default=yes) --disable-openexr build without OpenEXR support --disable-gnet build without clustering/remote control Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor PKG_CONFIG path to pkg-config utility PACKAGE_CFLAGS C compiler flags for PACKAGE, overriding pkg-config PACKAGE_LIBS linker flags for PACKAGE, overriding pkg-config EXR_CFLAGS C compiler flags for EXR, overriding pkg-config EXR_LIBS linker flags for EXR, overriding pkg-config GNET_CFLAGS C compiler flags for GNET, overriding pkg-config GNET_LIBS linker flags for GNET, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF fyre configure 1.0.1 generated by GNU Autoconf 2.60 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Copyright 2004-2006 David Trowbridge and Micah Dowty _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by fyre $as_me 1.0.1, which was generated by GNU Autoconf 2.60. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu VERSION=1.0.1 PACKAGE=fyre am__api_version="1.9" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm -f conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$AWK" && break done { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=$PACKAGE VERSION=$VERSION cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_config_headers="$ac_config_headers config.h" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi { echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi { echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6; } fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; } if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !x[0] && !zero.x; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Extract the first word of "grep ggrep" to use in msg output if test -z "$GREP"; then set dummy grep ggrep; ac_prog_name=$2 if test "${ac_cv_path_GREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_executable_p "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS fi GREP="$ac_cv_path_GREP" if test -z "$GREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 echo "${ECHO_T}$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else # Extract the first word of "egrep" to use in msg output if test -z "$EGREP"; then set dummy egrep; ac_prog_name=$2 if test "${ac_cv_path_EGREP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_executable_p "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS fi EGREP="$ac_cv_path_EGREP" if test -z "$EGREP"; then { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { echo "$as_me:$LINENO: checking for size_t" >&5 echo $ECHO_N "checking for size_t... $ECHO_C" >&6; } if test "${ac_cv_type_size_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef size_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_size_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_size_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 echo "${ECHO_T}$ac_cv_type_size_t" >&6; } if test $ac_cv_type_size_t = yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { echo "$as_me:$LINENO: checking for pid_t" >&5 echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; } if test "${ac_cv_type_pid_t+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default typedef pid_t ac__type_new_; int main () { if ((ac__type_new_ *) 0) return 0; if (sizeof (ac__type_new_)) return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_type_pid_t=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_type_pid_t=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 echo "${ECHO_T}$ac_cv_type_pid_t" >&6; } if test $ac_cv_type_pid_t = yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi for ac_header in vfork.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } else # Is the header compilable? { echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6; } # Is the header present? { echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## --------------------------------- ## ## Report this to trowbrds@gmail.com ## ## --------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval echo '${'$as_ac_Header'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in fork vfork do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` { echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$as_ac_var'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_fork" = xyes; then { echo "$as_me:$LINENO: checking for working fork" >&5 echo $ECHO_N "checking for working fork... $ECHO_C" >&6; } if test "${ac_cv_func_fork_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_fork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default int main () { /* By Ruediger Kuhlmann. */ return fork () < 0; ; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_fork_works=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_fork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 echo "${ECHO_T}$ac_cv_func_fork_works" >&6; } else ac_cv_func_fork_works=$ac_cv_func_fork fi if test "x$ac_cv_func_fork_works" = xcross; then case $host in *-*-amigaos* | *-*-msdosdjgpp*) # Override, as these systems have only a dummy fork() stub ac_cv_func_fork_works=no ;; *) ac_cv_func_fork_works=yes ;; esac { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} fi ac_cv_func_vfork_works=$ac_cv_func_vfork if test "x$ac_cv_func_vfork" = xyes; then { echo "$as_me:$LINENO: checking for working vfork" >&5 echo $ECHO_N "checking for working vfork... $ECHO_C" >&6; } if test "${ac_cv_func_vfork_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then ac_cv_func_vfork_works=cross else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Thanks to Paul Eggert for this test. */ $ac_includes_default #include #if HAVE_VFORK_H # include #endif /* On some sparc systems, changes by the child to local and incoming argument registers are propagated back to the parent. The compiler is told about this with #include , but some compilers (e.g. gcc -O) don't grok . Test for this by using a static variable whose address is put into a register that is clobbered by the vfork. */ static void #ifdef __cplusplus sparc_address_test (int arg) # else sparc_address_test (arg) int arg; #endif { static pid_t child; if (!child) { child = vfork (); if (child < 0) { perror ("vfork"); _exit(2); } if (!child) { arg = getpid(); write(-1, "", 0); _exit (arg); } } } int main () { pid_t parent = getpid (); pid_t child; sparc_address_test (0); child = vfork (); if (child == 0) { /* Here is another test for sparc vfork register problems. This test uses lots of local variables, at least as many local variables as main has allocated so far including compiler temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should reuse the register of parent for one of the local variables, since it will think that parent can't possibly be used any more in this routine. Assigning to the local variable will thus munge parent in the parent process. */ pid_t p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); /* Convince the compiler that p..p7 are live; otherwise, it might use the same hardware register for all 8 local variables. */ if (p != p1 || p != p2 || p != p3 || p != p4 || p != p5 || p != p6 || p != p7) _exit(1); /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent from child file descriptors. If the child closes a descriptor before it execs or exits, this munges the parent's descriptor as well. Test for this by closing stdout in the child. */ _exit(close(fileno(stdout)) != 0); } else { int status; struct stat st; while (wait(&status) != child) ; return ( /* Was there some problem with vforking? */ child < 0 /* Did the child fail? (This shouldn't happen.) */ || status /* Did the vfork/compiler bug occur? */ || parent != getpid() /* Did the file descriptor bug occur? */ || fstat(fileno(stdout), &st) != 0 ); } } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_vfork_works=yes else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_func_vfork_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi { echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 echo "${ECHO_T}$ac_cv_func_vfork_works" >&6; } fi; if test "x$ac_cv_func_fork_works" = xcross; then ac_cv_func_vfork_works=$ac_cv_func_vfork { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} fi if test "x$ac_cv_func_vfork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_VFORK 1 _ACEOF else cat >>confdefs.h <<\_ACEOF #define vfork fork _ACEOF fi if test "x$ac_cv_func_fork_works" = xyes; then cat >>confdefs.h <<\_ACEOF #define HAVE_WORKING_FORK 1 _ACEOF fi # Check whether --enable-binreloc was given. if test "${enable_binreloc+set}" = set; then enableval=$enable_binreloc; enable_binreloc=$enableval else enable_binreloc=auto fi # Check whether --enable-binreloc-threads was given. if test "${enable_binreloc_threads+set}" = set; then enableval=$enable_binreloc_threads; enable_binreloc_threads=$enableval else enable_binreloc_threads=yes fi BINRELOC_CFLAGS= BINRELOC_LIBS= if test "x$enable_binreloc" = "xauto"; then { echo "$as_me:$LINENO: checking for /proc/self/maps" >&5 echo $ECHO_N "checking for /proc/self/maps... $ECHO_C" >&6; } if test "${ac_cv_file__proc_self_maps+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else test "$cross_compiling" = yes && { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} { (exit 1); exit 1; }; } if test -r "/proc/self/maps"; then ac_cv_file__proc_self_maps=yes else ac_cv_file__proc_self_maps=no fi fi { echo "$as_me:$LINENO: result: $ac_cv_file__proc_self_maps" >&5 echo "${ECHO_T}$ac_cv_file__proc_self_maps" >&6; } { echo "$as_me:$LINENO: checking whether everything is installed to the same prefix" >&5 echo $ECHO_N "checking whether everything is installed to the same prefix... $ECHO_C" >&6; } if test "${br_cv_valid_prefixes+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$bindir" = '${exec_prefix}/bin' -a "$sbindir" = '${exec_prefix}/sbin' -a \ "$datadir" = '${prefix}/share' -a "$libdir" = '${exec_prefix}/lib' -a \ "$libexecdir" = '${exec_prefix}/libexec' -a "$sysconfdir" = '${prefix}/etc' then br_cv_valid_prefixes=yes else br_cv_valid_prefixes=no fi fi { echo "$as_me:$LINENO: result: $br_cv_valid_prefixes" >&5 echo "${ECHO_T}$br_cv_valid_prefixes" >&6; } fi { echo "$as_me:$LINENO: checking whether binary relocation support should be enabled" >&5 echo $ECHO_N "checking whether binary relocation support should be enabled... $ECHO_C" >&6; } if test "${br_cv_binreloc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$enable_binreloc" = "xyes"; then br_cv_binreloc=yes elif test "x$enable_binreloc" = "xauto"; then if test "x$br_cv_valid_prefixes" = "xyes" -a \ "x$ac_cv_file__proc_self_maps" = "xyes"; then br_cv_binreloc=yes else br_cv_binreloc=no fi else br_cv_binreloc=no fi fi { echo "$as_me:$LINENO: result: $br_cv_binreloc" >&5 echo "${ECHO_T}$br_cv_binreloc" >&6; } if test "x$br_cv_binreloc" = "xyes"; then cat >>confdefs.h <<\_ACEOF #define ENABLE_BINRELOC _ACEOF if test "x$enable_binreloc_threads" = "xyes"; then { echo "$as_me:$LINENO: checking for pthread_getspecific in -lpthread" >&5 echo $ECHO_N "checking for pthread_getspecific in -lpthread... $ECHO_C" >&6; } if test "${ac_cv_lib_pthread_pthread_getspecific+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_getspecific (); int main () { return pthread_getspecific (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_pthread_pthread_getspecific=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_pthread_pthread_getspecific=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_getspecific" >&5 echo "${ECHO_T}$ac_cv_lib_pthread_pthread_getspecific" >&6; } if test $ac_cv_lib_pthread_pthread_getspecific = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi fi { echo "$as_me:$LINENO: checking whether binary relocation should use threads" >&5 echo $ECHO_N "checking whether binary relocation should use threads... $ECHO_C" >&6; } if test "${br_cv_binreloc_threads+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$enable_binreloc_threads" = "xyes"; then if test "x$ac_cv_lib_pthread_pthread_getspecific" = "xyes"; then br_cv_binreloc_threads=yes else br_cv_binreloc_threads=no fi else br_cv_binreloc_threads=no fi fi { echo "$as_me:$LINENO: result: $br_cv_binreloc_threads" >&5 echo "${ECHO_T}$br_cv_binreloc_threads" >&6; } if test "x$br_cv_binreloc_threads" = "xyes"; then BINRELOC_LIBS="-lpthread" cat >>confdefs.h <<\_ACEOF #define BR_PTHREAD 1 _ACEOF else BINRELOC_CFLAGS="$BINRELOC_CFLAGS -DBR_PTHREAD=0" cat >>confdefs.h <<\_ACEOF #define BR_PTHREAD 0 _ACEOF fi fi if test "x$br_cv_binreloc" = "xyes" ; then HAVE_BINRELOC_TRUE= HAVE_BINRELOC_FALSE='#' else HAVE_BINRELOC_TRUE='#' HAVE_BINRELOC_FALSE= fi # Extract the first word of "update-mime-database", so it can be a program name with args. set dummy update-mime-database; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_XDGMIME+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $XDGMIME in [\\/]* | ?:[\\/]*) ac_cv_path_XDGMIME="$XDGMIME" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XDGMIME="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XDGMIME" && ac_cv_path_XDGMIME="no" ;; esac fi XDGMIME=$ac_cv_path_XDGMIME if test -n "$XDGMIME"; then { echo "$as_me:$LINENO: result: $XDGMIME" >&5 echo "${ECHO_T}$XDGMIME" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$XDGMIME" = "xno"; then enable_xdgmime="no" else enable_xdgmime="yes" fi if test "x$enable_xdgmime" = "xyes"; then ENABLE_XDGMIME_TRUE= ENABLE_XDGMIME_FALSE='#' else ENABLE_XDGMIME_TRUE='#' ENABLE_XDGMIME_FALSE= fi # Extract the first word of "update-desktop-database", so it can be a program name with args. set dummy update-desktop-database; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_FDODESKTOP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $FDODESKTOP in [\\/]* | ?:[\\/]*) ac_cv_path_FDODESKTOP="$FDODESKTOP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_FDODESKTOP="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_FDODESKTOP" && ac_cv_path_FDODESKTOP="no" ;; esac fi FDODESKTOP=$ac_cv_path_FDODESKTOP if test -n "$FDODESKTOP"; then { echo "$as_me:$LINENO: result: $FDODESKTOP" >&5 echo "${ECHO_T}$FDODESKTOP" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$FDODESKTOP" = "xno"; then enable_fdodesktop="no" else enable_fdodesktop="yes" fi if test "x$enable_fdodesktop" = "xyes"; then ENABLE_FDODESKTOP_TRUE= ENABLE_FDODESKTOP_FALSE='#' else ENABLE_FDODESKTOP_TRUE='#' ENABLE_FDODESKTOP_FALSE= fi pkg_modules="glib-2.0 >= 2.0.0, gtk+-2.0 >= 2.0.0, libglade-2.0 >= 2.0" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_PKG_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 echo "${ECHO_T}$PKG_CONFIG" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5 echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5 echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { echo "$as_me:$LINENO: checking for PACKAGE" >&5 echo $ECHO_N "checking for PACKAGE... $ECHO_C" >&6; } if test -n "$PKG_CONFIG"; then if test -n "$PACKAGE_CFLAGS"; then pkg_cv_PACKAGE_CFLAGS="$PACKAGE_CFLAGS" else if test -n "$PKG_CONFIG" && \ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"\$pkg_modules\"") >&5 ($PKG_CONFIG --exists --print-errors "$pkg_modules") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_PACKAGE_CFLAGS=`$PKG_CONFIG --cflags "$pkg_modules" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$PACKAGE_LIBS"; then pkg_cv_PACKAGE_LIBS="$PACKAGE_LIBS" else if test -n "$PKG_CONFIG" && \ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"\$pkg_modules\"") >&5 ($PKG_CONFIG --exists --print-errors "$pkg_modules") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_PACKAGE_LIBS=`$PKG_CONFIG --libs "$pkg_modules" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PACKAGE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$pkg_modules"` else PACKAGE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$pkg_modules"` fi # Put the nasty error message in config.log where it belongs echo "$PACKAGE_PKG_ERRORS" >&5 { { echo "$as_me:$LINENO: error: Package requirements ($pkg_modules) were not met: $PACKAGE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PACKAGE_CFLAGS and PACKAGE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&5 echo "$as_me: error: Package requirements ($pkg_modules) were not met: $PACKAGE_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PACKAGE_CFLAGS and PACKAGE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&2;} { (exit 1); exit 1; }; } elif test $pkg_failed = untried; then { { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PACKAGE_CFLAGS and PACKAGE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." >&5 echo "$as_me: error: The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PACKAGE_CFLAGS and PACKAGE_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } else PACKAGE_CFLAGS=$pkg_cv_PACKAGE_CFLAGS PACKAGE_LIBS=$pkg_cv_PACKAGE_LIBS { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } : fi # Check for windows, enable compiling windows resources if we find it { echo "$as_me:$LINENO: checking for Win32" >&5 echo $ECHO_N "checking for Win32... $ECHO_C" >&6; } case "$host" in *mingw*) WIN32_LIBS=fyre-win32-res.o ;; *) WIN32_LIBS= ;; esac # Check for getopt. If we're missing it, include our own version { echo "$as_me:$LINENO: checking for getopt_long" >&5 echo $ECHO_N "checking for getopt_long... $ECHO_C" >&6; } if test "${ac_cv_func_getopt_long+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define getopt_long to an innocuous variant, in case declares getopt_long. For example, HP-UX 11i declares gettimeofday. */ #define getopt_long innocuous_getopt_long /* System header to define __stub macros and hopefully few prototypes, which can conflict with char getopt_long (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef getopt_long /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getopt_long (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_getopt_long || defined __stub___getopt_long choke me #endif int main () { return getopt_long (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_getopt_long=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_getopt_long=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_func_getopt_long" >&5 echo "${ECHO_T}$ac_cv_func_getopt_long" >&6; } if test $ac_cv_func_getopt_long = yes; then have_getopt=yes fi if test "x$have_getopt" = "xyes"; then HAVE_GETOPT_TRUE= HAVE_GETOPT_FALSE='#' else HAVE_GETOPT_TRUE='#' HAVE_GETOPT_FALSE= fi # Check for OpenEXR- we support saving OpenEXR files if the library is available # Check whether --enable-openexr was given. if test "${enable_openexr+set}" = set; then enableval=$enable_openexr; fi if test x$enable_openexr != xno; then pkg_failed=no { echo "$as_me:$LINENO: checking for EXR" >&5 echo $ECHO_N "checking for EXR... $ECHO_C" >&6; } if test -n "$PKG_CONFIG"; then if test -n "$EXR_CFLAGS"; then pkg_cv_EXR_CFLAGS="$EXR_CFLAGS" else if test -n "$PKG_CONFIG" && \ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"OpenEXR\"") >&5 ($PKG_CONFIG --exists --print-errors "OpenEXR") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_EXR_CFLAGS=`$PKG_CONFIG --cflags "OpenEXR" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$EXR_LIBS"; then pkg_cv_EXR_LIBS="$EXR_LIBS" else if test -n "$PKG_CONFIG" && \ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"OpenEXR\"") >&5 ($PKG_CONFIG --exists --print-errors "OpenEXR") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_EXR_LIBS=`$PKG_CONFIG --libs "OpenEXR" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then EXR_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "OpenEXR"` else EXR_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "OpenEXR"` fi # Put the nasty error message in config.log where it belongs echo "$EXR_PKG_ERRORS" >&5 { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } have_exr=no elif test $pkg_failed = untried; then have_exr=no else EXR_CFLAGS=$pkg_cv_EXR_CFLAGS EXR_LIBS=$pkg_cv_EXR_LIBS { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } have_exr=yes fi if test "x$have_exr" = "xyes"; then cat >>confdefs.h <<\_ACEOF #define HAVE_EXR 1 _ACEOF fi if test "x$have_exr" = "xyes"; then HAVE_EXR_TRUE= HAVE_EXR_FALSE='#' else HAVE_EXR_TRUE='#' HAVE_EXR_FALSE= fi else if false; then HAVE_EXR_TRUE= HAVE_EXR_FALSE='#' else HAVE_EXR_TRUE='#' HAVE_EXR_FALSE= fi fi # Check for gnet, required for cluster and remote control support # Check whether --enable-gnet was given. if test "${enable_gnet+set}" = set; then enableval=$enable_gnet; fi if test x$enable_gnet != xno; then pkg_failed=no { echo "$as_me:$LINENO: checking for GNET" >&5 echo $ECHO_N "checking for GNET... $ECHO_C" >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GNET_CFLAGS"; then pkg_cv_GNET_CFLAGS="$GNET_CFLAGS" else if test -n "$PKG_CONFIG" && \ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gnet-2.0\"") >&5 ($PKG_CONFIG --exists --print-errors "gnet-2.0") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_GNET_CFLAGS=`$PKG_CONFIG --cflags "gnet-2.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GNET_LIBS"; then pkg_cv_GNET_LIBS="$GNET_LIBS" else if test -n "$PKG_CONFIG" && \ { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"gnet-2.0\"") >&5 ($PKG_CONFIG --exists --print-errors "gnet-2.0") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_GNET_LIBS=`$PKG_CONFIG --libs "gnet-2.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GNET_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gnet-2.0"` else GNET_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gnet-2.0"` fi # Put the nasty error message in config.log where it belongs echo "$GNET_PKG_ERRORS" >&5 { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } have_gnet=no elif test $pkg_failed = untried; then have_gnet=no else GNET_CFLAGS=$pkg_cv_GNET_CFLAGS GNET_LIBS=$pkg_cv_GNET_LIBS { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } have_gnet=yes fi if test "x$have_gnet" = "xyes"; then cat >>confdefs.h <<\_ACEOF #define HAVE_GNET 1 _ACEOF fi if test "x$have_gnet" = "xyes"; then HAVE_GNET_TRUE= HAVE_GNET_FALSE='#' else HAVE_GNET_TRUE='#' HAVE_GNET_FALSE= fi else if false; then HAVE_GNET_TRUE= HAVE_GNET_FALSE='#' else HAVE_GNET_TRUE='#' HAVE_GNET_FALSE= fi fi if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -D__NO_INLINE__ -Wall" fi if test "x$CC" = "xicc"; then CFLAGS="$CFLAGS -O3" else CFLAGS="$CFLAGS -O3 -ffast-math" fi ac_config_files="$ac_config_files Makefile autopackage/default.apspec data/Makefile data/icons/Makefile data/icons/16x16/Makefile data/icons/22x22/Makefile data/icons/24x24/Makefile data/icons/scalable/Makefile src/Makefile contrib/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_BINRELOC_TRUE}" && test -z "${HAVE_BINRELOC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_BINRELOC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_BINRELOC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_XDGMIME_TRUE}" && test -z "${ENABLE_XDGMIME_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_XDGMIME\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_XDGMIME\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${ENABLE_FDODESKTOP_TRUE}" && test -z "${ENABLE_FDODESKTOP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"ENABLE_FDODESKTOP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"ENABLE_FDODESKTOP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_GETOPT_TRUE}" && test -z "${HAVE_GETOPT_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_GETOPT\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_GETOPT\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_EXR_TRUE}" && test -z "${HAVE_EXR_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_EXR\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_EXR\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_EXR_TRUE}" && test -z "${HAVE_EXR_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_EXR\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_EXR\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_GNET_TRUE}" && test -z "${HAVE_GNET_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_GNET\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_GNET\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${HAVE_GNET_TRUE}" && test -z "${HAVE_GNET_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"HAVE_GNET\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"HAVE_GNET\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # Find out whether ``test -x'' works. Don't use a zero-byte file, as # systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then as_executable_p="test -x" else as_executable_p=: fi rm -f conf$$.file # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by fyre $as_me 1.0.1, which was generated by GNU Autoconf 2.60. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ fyre config.status 1.0.1 configured by $0, generated by GNU Autoconf 2.60, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "autopackage/default.apspec") CONFIG_FILES="$CONFIG_FILES autopackage/default.apspec" ;; "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; "data/icons/Makefile") CONFIG_FILES="$CONFIG_FILES data/icons/Makefile" ;; "data/icons/16x16/Makefile") CONFIG_FILES="$CONFIG_FILES data/icons/16x16/Makefile" ;; "data/icons/22x22/Makefile") CONFIG_FILES="$CONFIG_FILES data/icons/22x22/Makefile" ;; "data/icons/24x24/Makefile") CONFIG_FILES="$CONFIG_FILES data/icons/24x24/Makefile" ;; "data/icons/scalable/Makefile") CONFIG_FILES="$CONFIG_FILES data/icons/scalable/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim CYGPATH_W!$CYGPATH_W$ac_delim PACKAGE!$PACKAGE$ac_delim VERSION!$VERSION$ac_delim ACLOCAL!$ACLOCAL$ac_delim AUTOCONF!$AUTOCONF$ac_delim AUTOMAKE!$AUTOMAKE$ac_delim AUTOHEADER!$AUTOHEADER$ac_delim MAKEINFO!$MAKEINFO$ac_delim install_sh!$install_sh$ac_delim STRIP!$STRIP$ac_delim INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim mkdir_p!$mkdir_p$ac_delim AWK!$AWK$ac_delim SET_MAKE!$SET_MAKE$ac_delim am__leading_dot!$am__leading_dot$ac_delim AMTAR!$AMTAR$ac_delim am__tar!$am__tar$ac_delim am__untar!$am__untar$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim DEPDIR!$DEPDIR$ac_delim am__include!$am__include$ac_delim am__quote!$am__quote$ac_delim AMDEP_TRUE!$AMDEP_TRUE$ac_delim AMDEP_FALSE!$AMDEP_FALSE$ac_delim AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim CCDEPMODE!$CCDEPMODE$ac_delim am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim CXX!$CXX$ac_delim CXXFLAGS!$CXXFLAGS$ac_delim ac_ct_CXX!$ac_ct_CXX$ac_delim CXXDEPMODE!$CXXDEPMODE$ac_delim am__fastdepCXX_TRUE!$am__fastdepCXX_TRUE$ac_delim am__fastdepCXX_FALSE!$am__fastdepCXX_FALSE$ac_delim LN_S!$LN_S$ac_delim CPP!$CPP$ac_delim GREP!$GREP$ac_delim EGREP!$EGREP$ac_delim BINRELOC_CFLAGS!$BINRELOC_CFLAGS$ac_delim BINRELOC_LIBS!$BINRELOC_LIBS$ac_delim HAVE_BINRELOC_TRUE!$HAVE_BINRELOC_TRUE$ac_delim HAVE_BINRELOC_FALSE!$HAVE_BINRELOC_FALSE$ac_delim XDGMIME!$XDGMIME$ac_delim ENABLE_XDGMIME_TRUE!$ENABLE_XDGMIME_TRUE$ac_delim ENABLE_XDGMIME_FALSE!$ENABLE_XDGMIME_FALSE$ac_delim FDODESKTOP!$FDODESKTOP$ac_delim ENABLE_FDODESKTOP_TRUE!$ENABLE_FDODESKTOP_TRUE$ac_delim ENABLE_FDODESKTOP_FALSE!$ENABLE_FDODESKTOP_FALSE$ac_delim PKG_CONFIG!$PKG_CONFIG$ac_delim PACKAGE_CFLAGS!$PACKAGE_CFLAGS$ac_delim PACKAGE_LIBS!$PACKAGE_LIBS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF CEOF$ac_eof _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF WIN32_LIBS!$WIN32_LIBS$ac_delim HAVE_GETOPT_TRUE!$HAVE_GETOPT_TRUE$ac_delim HAVE_GETOPT_FALSE!$HAVE_GETOPT_FALSE$ac_delim EXR_CFLAGS!$EXR_CFLAGS$ac_delim EXR_LIBS!$EXR_LIBS$ac_delim HAVE_EXR_TRUE!$HAVE_EXR_TRUE$ac_delim HAVE_EXR_FALSE!$HAVE_EXR_FALSE$ac_delim GNET_CFLAGS!$GNET_CFLAGS$ac_delim GNET_LIBS!$GNET_LIBS$ac_delim HAVE_GNET_TRUE!$HAVE_GNET_TRUE$ac_delim HAVE_GNET_FALSE!$HAVE_GNET_FALSE$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 13; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" # Compute $ac_file's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $ac_file | $ac_file:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $ac_file" >`$as_dirname -- $ac_file || $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X$ac_file : 'X\(//\)[^/]' \| \ X$ac_file : 'X\(//\)$' \| \ X$ac_file : 'X\(/\)' \| . 2>/dev/null || echo X$ac_file | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir=$dirpart/$fdir case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi echo echo $PACKAGE v$VERSION echo if test "x$have_exr" != "xyes"; then echo "Not including support for OpenEXR files" else echo "Including support for OpenEXR files" fi if test "x$have_gnet" != "xyes"; then echo "Not including clustering or remote control support" else echo "Including clustering or remote control support" fi echo echo "Now type make to compile" echo "Then su to root and type: make install" echo fyre-1.0.1/configure.ac0000644000175000001440000001074310450744743011676 00000000000000dnl Process this file with autoconf to create configure. dnl ################################################################ dnl # Initialize autoconf dnl ################################################################ AC_INIT(fyre, 1.0.1, trowbrds@gmail.com) AC_PREREQ(2.50) AC_CONFIG_SRCDIR(config.h.in) AC_COPYRIGHT([Copyright 2004-2006 David Trowbridge and Micah Dowty]) dnl ################################################################ dnl # Initialize automake dnl ################################################################ VERSION=1.0.1 PACKAGE=fyre AM_INIT_AUTOMAKE($PACKAGE, $VERSION) AM_CONFIG_HEADER(config.h) dnl ################################################################ dnl # Check for some standard stuff dnl ################################################################ AC_PROG_CC AC_PROG_CXX AC_PROG_MAKE_SET AC_PROG_LN_S AC_PROG_INSTALL AC_C_CONST AC_TYPE_SIZE_T AC_EXEEXT AC_FUNC_FORK AM_BINRELOC AM_CONDITIONAL([HAVE_BINRELOC], [ test "x$br_cv_binreloc" = "xyes" ]) AC_PATH_PROG(XDGMIME, update-mime-database, no) if test "x$XDGMIME" = "xno"; then enable_xdgmime="no" else enable_xdgmime="yes" fi AM_CONDITIONAL(ENABLE_XDGMIME, test "x$enable_xdgmime" = "xyes") AC_PATH_PROG(FDODESKTOP, update-desktop-database, no) if test "x$FDODESKTOP" = "xno"; then enable_fdodesktop="no" else enable_fdodesktop="yes" fi AM_CONDITIONAL(ENABLE_FDODESKTOP, test "x$enable_fdodesktop" = "xyes") pkg_modules="glib-2.0 >= 2.0.0, gtk+-2.0 >= 2.0.0, libglade-2.0 >= 2.0" PKG_CHECK_MODULES(PACKAGE, [$pkg_modules]) AC_SUBST(PACKAGE_CFLAGS) AC_SUBST(PACKAGE_LIBS) # Check for windows, enable compiling windows resources if we find it AC_MSG_CHECKING([for Win32]) case "$host" in *mingw*) WIN32_LIBS=fyre-win32-res.o ;; *) WIN32_LIBS= ;; esac AC_SUBST(WIN32_LIBS) # Check for getopt. If we're missing it, include our own version AC_CHECK_FUNC(getopt_long, have_getopt=yes) AM_CONDITIONAL([HAVE_GETOPT], [test "x$have_getopt" = "xyes"]) # Check for OpenEXR- we support saving OpenEXR files if the library is available AC_ARG_ENABLE(openexr, [ --disable-openexr build without OpenEXR support]) if test x$enable_openexr != xno; then PKG_CHECK_MODULES(EXR, OpenEXR, have_exr=yes, have_exr=no) AC_SUBST(EXR_CFLAGS) AC_SUBST(EXR_LIBS) if test "x$have_exr" = "xyes"; then AC_DEFINE(HAVE_EXR, 1,[compile in OpenEXR support]) fi AM_CONDITIONAL([HAVE_EXR], [test "x$have_exr" = "xyes"]) else AM_CONDITIONAL([HAVE_EXR], false) fi # Check for gnet, required for cluster and remote control support AC_ARG_ENABLE(gnet, [ --disable-gnet build without clustering/remote control]) if test x$enable_gnet != xno; then PKG_CHECK_MODULES(GNET, gnet-2.0, have_gnet=yes, have_gnet=no) AC_SUBST(GNET_CFLAGS) AC_SUBST(GNET_LIBS) if test "x$have_gnet" = "xyes"; then AC_DEFINE(HAVE_GNET, 1,[compile in gnet support]) fi AM_CONDITIONAL([HAVE_GNET], [test "x$have_gnet" = "xyes"]) else AM_CONDITIONAL([HAVE_GNET], false) fi dnl # Use wall if we have GCC dnl # Also disable glibc versions of functions that have faster versions dnl # versions as gcc inlines. This should speed up trig on some systems. if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -D__NO_INLINE__ -Wall" fi dnl # -O3 and -ffast-math should make it go faster on any system dnl # But Intel icc doesn't have -ffast-math, just -ffast, which is creepy if test "x$CC" = "xicc"; then CFLAGS="$CFLAGS -O3" else CFLAGS="$CFLAGS -O3 -ffast-math" fi dnl ### FIXME dnl # -march=i686 speeds this up quite a bit on my machine (even more so dnl # than -march=athlon-xp) so if this looks like a recent x86 machine, dnl # stick that in CFLAGS dnl # CFLAGS += $(shell if grep mmx /proc/cpuinfo > /dev/null; then echo -march=i686; fi) dnl ################################################################ dnl # Output the Makefiles dnl ################################################################ AC_CONFIG_FILES([ Makefile autopackage/default.apspec data/Makefile data/icons/Makefile data/icons/16x16/Makefile data/icons/22x22/Makefile data/icons/24x24/Makefile data/icons/scalable/Makefile src/Makefile contrib/Makefile ]) AC_OUTPUT echo echo $PACKAGE v$VERSION echo if test "x$have_exr" != "xyes"; then echo "Not including support for OpenEXR files" else echo "Including support for OpenEXR files" fi if test "x$have_gnet" != "xyes"; then echo "Not including clustering or remote control support" else echo "Including clustering or remote control support" fi echo echo "Now type make to compile" echo "Then su to root and type: make install" echo fyre-1.0.1/config.guess0000755000175000001440000012735010457763364011742 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2006-07-02' # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown if [ "${UNAME_SYSTEM}" = "Linux" ] ; then eval $set_cc_for_build cat << EOF > $dummy.c #include #ifdef __UCLIBC__ # ifdef __UCLIBC_CONFIG_VERSION__ LIBC=uclibc __UCLIBC_CONFIG_VERSION__ # else LIBC=uclibc # endif #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep LIBC= | sed -e 's: ::g'` fi # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[3456]*) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T:Interix*:[3456]*) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo cris-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo frv-unknown-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-${LIBC}" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-${LIBC}aout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-${LIBC}coff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-${LIBC}oldld" exit ;; esac # This should get integrated into the C code below, but now we hack if [ "$LIBC" != "gnu" ] ; then echo "$TENTATIVE" && exit 0 ; fi # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fyre-1.0.1/install-sh0000755000175000001440000002202110411563042011370 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2005-05-14.22 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit 1; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit 0 } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: fyre-1.0.1/autogen.sh0000755000175000001440000000416010446431132011373 00000000000000#!/bin/sh # Run this to generate all the initial makefiles, etc. DIE=0 # SETUP_GETTEXT=./setup-gettext PACKAGE=fyre echo "Generating configuration files for $PACKAGE, please wait..." # ($SETUP_GETTEXT --gettext-tool) < /dev/null > /dev/null 2>&1 || { # echo # echo "You must have gettext installed to compile $PACKAGE." # DIE=1 # } (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have autoconf installed to compile $PACKAGE." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } # (libtool --version) < /dev/null > /dev/null 2>&1 || { # echo # echo "You must have libtool installed to compile $PACKAGE." # echo "Download the appropriate package for your distribution," # echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" # DIE=1 # } (automake --version) < /dev/null > /dev/null 2>&1 || { echo echo "You must have automake installed to compile $PACKAGE." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } [ $DIE -eq 1 ] && exit 1; # Backup the po/ChangeLog. This should prevent the annoying # gettext ChangeLog modifications. # if test -e po/ChangeLog; then # cp -p po/ChangeLog po/ChangeLog.save # fi # echo "Running gettextize, please ignore non-fatal messages...." # $SETUP_GETTEXT # Restore the po/ChangeLog file. # if test -e po/ChangeLog.save; then # mv po/ChangeLog.save po/ChangeLog # fi # echo " libtoolize --copy --force" # libtoolize --copy --force echo " aclocal $ACLOCAL_FLAGS" aclocal $ACLOCAL_FLAGS echo " autoheader" autoheader echo " automake --add-missing" automake --add-missing echo " autoconf" autoconf if [ -x config.status -a -z "$*" ]; then ./config.status --recheck else if test -z "$*"; then echo "I am going to run ./configure with no arguments - if you wish" echo "to pass any to it, please specify them on the $0 command line." echo "If you do not wish to run ./configure, press Ctrl-C now." trap 'echo "configure aborted" ; exit 0' 1 2 15 sleep 1 fi ./configure "$@"; fi fyre-1.0.1/config.sub0000755000175000001440000007771210457763364011413 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2006-07-02' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx | dvp \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[24]a | sh[24]a*eb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]a*eb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsEE* | ee | ps2) basic_machine=mips64r5900el-scei case $os in -linux*) ;; *) os=-elf ;; esac ;; iop) basic_machine=mipsel-scei os=-irx ;; dvp) basic_machine=dvp-scei os=-elf ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -irx*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: fyre-1.0.1/missing0000755000175000001440000002540610411563042010775 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2005-06-08.21 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # 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, 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., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: fyre-1.0.1/mkinstalldirs0000755000175000001440000000370410346652520012210 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # End: # mkinstalldirs ends here fyre-1.0.1/Makefile.am0000644000175000001440000000021510450743542011431 00000000000000SUBDIRS = data src contrib EXTRA_DIST = \ AUTHORS \ NEWS \ INSTALL \ COPYING \ README \ ChangeLog \ autogen.sh \ configure.ac fyre-1.0.1/Makefile.in0000644000175000001440000004625110512344606011451 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/autopackage/default.apspec.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ TODO config.guess config.sub depcomp install-sh missing \ mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = autopackage/default.apspec SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINRELOC_CFLAGS = @BINRELOC_CFLAGS@ BINRELOC_LIBS = @BINRELOC_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_FDODESKTOP_FALSE = @ENABLE_FDODESKTOP_FALSE@ ENABLE_FDODESKTOP_TRUE = @ENABLE_FDODESKTOP_TRUE@ ENABLE_XDGMIME_FALSE = @ENABLE_XDGMIME_FALSE@ ENABLE_XDGMIME_TRUE = @ENABLE_XDGMIME_TRUE@ EXEEXT = @EXEEXT@ EXR_CFLAGS = @EXR_CFLAGS@ EXR_LIBS = @EXR_LIBS@ FDODESKTOP = @FDODESKTOP@ GNET_CFLAGS = @GNET_CFLAGS@ GNET_LIBS = @GNET_LIBS@ GREP = @GREP@ HAVE_BINRELOC_FALSE = @HAVE_BINRELOC_FALSE@ HAVE_BINRELOC_TRUE = @HAVE_BINRELOC_TRUE@ HAVE_EXR_FALSE = @HAVE_EXR_FALSE@ HAVE_EXR_TRUE = @HAVE_EXR_TRUE@ HAVE_GETOPT_FALSE = @HAVE_GETOPT_FALSE@ HAVE_GETOPT_TRUE = @HAVE_GETOPT_TRUE@ HAVE_GNET_FALSE = @HAVE_GNET_FALSE@ HAVE_GNET_TRUE = @HAVE_GNET_TRUE@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ WIN32_LIBS = @WIN32_LIBS@ XDGMIME = @XDGMIME@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = data src contrib EXTRA_DIST = \ AUTHORS \ NEWS \ INSTALL \ COPYING \ README \ ChangeLog \ autogen.sh \ configure.ac all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 autopackage/default.apspec: $(top_builddir)/config.status $(top_srcdir)/autopackage/default.apspec.in cd $(top_builddir) && $(SHELL) ./config.status $@ uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/autopackage @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-recursive ctags \ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \ dist-tarZ dist-zip distcheck distclean distclean-generic \ distclean-hdr distclean-recursive distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: fyre-1.0.1/autopackage/0000777000175000001440000000000010512346410011737 500000000000000fyre-1.0.1/autopackage/default.apspec.in0000644000175000001440000000272410263337616015121 00000000000000# -*-shell-script-*- [Meta] RootName: @fyre.navi.cx/fyre:$SOFTWAREVERSION DisplayName: Fyre ShortName: fyre Maintainer: Micah Dowty Packager: Mike Hearn Summary: Fyre renders and animates Peter de Jong maps SoftwareVersion: @VERSION@ AutopackageTarget: 1.0 # Only uncomment InterfaceVersion if your package exposes interfaces to other software, # for instance if it includes DSOs or python/perl modules. See the developer guide for more info, # or ask on autopackage-dev if you don't understand interface versioning in autopackage. # # InterfaceVersion: 0.0 PackageVersion: 1 [Description] Fyre provides a rendering of the Peter de Jong map, with an interactive GTK+ frontend and a command line interface for easy and efficient rendering of high-resolution, high quality images. [BuildPrepare] export APBUILD_STATIC="gnet-2.0" export APBUILD_DISABLE_BOGUS_DETECTOR=1 # exr pulls in c++ even when we're not building with it due to automake wackyness # so override it here export CXX=apgcc prepareBuild [BuildUnprepare] unprepareBuild [Imports] echo '*' | import [Prepare] require @gtk.org/gtk 2.2 require @glade.gnome.org/libglade 2.0 [Install] installExe ./bin/* installData ./share/fyre installIcon ./share/icons/hicolor installIcon ./share/pixmaps installDesktop "Graphics" ./share/applications/fyre.desktop installMime share/mime/packages/fyre.xml [Uninstall] # Usually just the following line is enough to uninstall everything uninstallFromLog fyre-1.0.1/config.h.in0000644000175000001440000000440710477410233011424 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Include pthread support for binary relocation? */ #undef BR_PTHREAD /* Use binary relocation? */ #undef ENABLE_BINRELOC /* compile in OpenEXR support */ #undef HAVE_EXR /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* compile in gnet support */ #undef HAVE_GNET /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `int' if does not define. */ #undef pid_t /* Define to `unsigned int' if does not define. */ #undef size_t /* Define as `fork' if `vfork' does not work. */ #undef vfork fyre-1.0.1/acinclude.m40000644000175000001440000000475410263337643011605 00000000000000# Check for binary relocation support # Hongli Lai # http://autopackage.org/ AC_DEFUN([AM_BINRELOC], [ AC_ARG_ENABLE(binreloc, [ --enable-binreloc compile with binary relocation support (default=enable when available)], enable_binreloc=$enableval,enable_binreloc=auto) AC_ARG_ENABLE(binreloc-threads, [ --enable-binreloc-threads compile binary relocation with threads support (default=yes)], enable_binreloc_threads=$enableval,enable_binreloc_threads=yes) BINRELOC_CFLAGS= BINRELOC_LIBS= if test "x$enable_binreloc" = "xauto"; then AC_CHECK_FILE([/proc/self/maps]) AC_CACHE_CHECK([whether everything is installed to the same prefix], [br_cv_valid_prefixes], [ if test "$bindir" = '${exec_prefix}/bin' -a "$sbindir" = '${exec_prefix}/sbin' -a \ "$datadir" = '${prefix}/share' -a "$libdir" = '${exec_prefix}/lib' -a \ "$libexecdir" = '${exec_prefix}/libexec' -a "$sysconfdir" = '${prefix}/etc' then br_cv_valid_prefixes=yes else br_cv_valid_prefixes=no fi ]) fi AC_CACHE_CHECK([whether binary relocation support should be enabled], [br_cv_binreloc], [if test "x$enable_binreloc" = "xyes"; then br_cv_binreloc=yes elif test "x$enable_binreloc" = "xauto"; then if test "x$br_cv_valid_prefixes" = "xyes" -a \ "x$ac_cv_file__proc_self_maps" = "xyes"; then br_cv_binreloc=yes else br_cv_binreloc=no fi else br_cv_binreloc=no fi]) if test "x$br_cv_binreloc" = "xyes"; then AC_DEFINE(ENABLE_BINRELOC,,[Use binary relocation?]) if test "x$enable_binreloc_threads" = "xyes"; then AC_CHECK_LIB([pthread], [pthread_getspecific]) fi AC_CACHE_CHECK([whether binary relocation should use threads], [br_cv_binreloc_threads], [if test "x$enable_binreloc_threads" = "xyes"; then if test "x$ac_cv_lib_pthread_pthread_getspecific" = "xyes"; then br_cv_binreloc_threads=yes else br_cv_binreloc_threads=no fi else br_cv_binreloc_threads=no fi]) if test "x$br_cv_binreloc_threads" = "xyes"; then BINRELOC_LIBS="-lpthread" AC_DEFINE(BR_PTHREAD,1,[Include pthread support for binary relocation?]) else BINRELOC_CFLAGS="$BINRELOC_CFLAGS -DBR_PTHREAD=0" AC_DEFINE(BR_PTHREAD,0,[Include pthread support for binary relocation?]) fi fi AC_SUBST(BINRELOC_CFLAGS) AC_SUBST(BINRELOC_LIBS) ]) fyre-1.0.1/AUTHORS0000644000175000001440000000010210263337643010443 00000000000000David Trowbridge Micah Dowty fyre-1.0.1/INSTALL0000644000175000001440000002203010263337643010430 00000000000000Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. fyre-1.0.1/ChangeLog0000644000175000001440000000554610450733360011160 000000000000001.0.1 * New scalable (and not-ugly) icon, drawn by Andreas Nilsson * Fix a few crashes in pathological and corner cases * Add +/- 1 subpixel of noise during oversampling, to avoid aliasing in certain conditions * Implement the 'Polar' variant of the Box-Mueller transform, for a slight performance increase. 1.0.0 (17 February 2005) * Minor cluster autodetection bugfixes * Fixed a hang on exit when running Fyre in console mode on Windows XP * Implemented a "Go" menu that provides undo/redo functionality using a web-browser-like history system * Many binreloc and deployment fixes * Added the --chuid and --pidfile options for Fyre servers * Replaced the "target density" stopping conditions with a new quality metric based on the ratio of histogram samples to distance travelled in color space * Minor UI bugfixes * Added and updated init scripts and packaging for Linux distros * Automatically retry connections to cluster nodes as long as they are enabled. Currently it retries every 60 seconds * Added elapsed time to the status bar 0.9 (07 February 2005) * Made the about box the coolest thing since sliced cheese * Added keybindings for zoom presets * Used the new icon in Win32 and on individual Fyre windows * Added an index to AVI files created with the animation renderer, allowing them to be played in Windows Media Player * Added cluster autodetection using UDP broadcast packets * Added file associations for image/png and application/x-fyre-animation on linux * Minor bugfixes and UI polishing * Added GUI support to remote control mode * Added a Python example client for Fyre's remote control mode 0.8 (27 January 2005) * Minor bugfixes * Add an icon 0.7 (02 January 2005) * Brand New Cluster support! * GtkFileChooser support for gtk+ 2.4+ * Tweakable interactivity * Saving to OpenEXR * Autoconf support * Added binreloc support for relocatability * Added windows support * Adjustable interactivity settings * Various bug fixes 0.6 (11 August 2004) * Support 64-bit machines and Intel icc * Added experimental "screensaver" mode * Added gamma correction for oversampling * Scrolly parameter panel, due to feature bloat! * Add selectable distributions for the initial conditions in emphasize-transient mode * Added new "emphasize transient" feature to show just the first few iterations of the map * En-coolinated the rotate tool - now rotates around the center of the view rather than the origin * Begin the long road towards multiple function support * Renamed project to "Fyre" 0.5 (01 March 2004) * Added animation support * Added tileable image support * Added mouse-based tools * Improved oversampling 0.3 (15 February 2004) * Fixed a super-critical bug in parameters * Added oversampling * Added color clamping * Lots of speed improvements 0.2 (15 February 2004) * First histogram-based release fyre-1.0.1/COPYING0000644000175000001440000004311010263337643010434 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.