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); }
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; }
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; i<self->num_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; i<self->num_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; }