mirror of https://github.com/GNOME/gimp.git
985 lines
35 KiB
C
985 lines
35 KiB
C
/* The GIMP -- an image manipulation program
|
||
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
||
*
|
||
* This program is free software; you can redistribute it and/or modify
|
||
* it under the terms of the GNU General Public License as published by
|
||
* the Free Software Foundation; either version 2 of the License, or
|
||
* (at your option) any later version.
|
||
*
|
||
* This program is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
* GNU General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU General Public License
|
||
* along with this program; if not, write to the Free Software
|
||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
*/
|
||
|
||
#include "config.h"
|
||
|
||
#include <string.h>
|
||
#include <time.h>
|
||
|
||
#include <gtk/gtk.h>
|
||
|
||
#include "libgimpbase/gimpbase.h"
|
||
|
||
#include "dialogs-types.h"
|
||
|
||
#include "core/gimpcontext.h"
|
||
|
||
#include "pdb/procedural_db.h"
|
||
|
||
#include "about-dialog.h"
|
||
#include "authors.h"
|
||
|
||
#include "gimp-intl.h"
|
||
|
||
|
||
#define COPYRIGHT \
|
||
"Copyright (C) 1995-2005\n" \
|
||
"Spencer Kimball, Peter Mattis and the GIMP Development Team"
|
||
|
||
/* FIXME: let GTK+ do the wrapping (requires GTK+ 2.8) */
|
||
#define LICENSE \
|
||
"This program is free software; you can redistribute it and/or modify\n" \
|
||
"it under the terms of the GNU General Public License as published by\n" \
|
||
"the Free Software Foundation; either version 2 of the License, or\n" \
|
||
"(at your option) any later version.\n" \
|
||
"\n" \
|
||
"This program is distributed in the hope that it will be useful,\n" \
|
||
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
|
||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" \
|
||
"See the GNU General Public License for more details.\n" \
|
||
"\n" \
|
||
"You should have received a copy of the GNU General Public License\n" \
|
||
"along with this program; if not, write to the Free Software\n" \
|
||
"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA."
|
||
|
||
#define NAME "GIMP"
|
||
#define COMMENTS _("GNU Image Manipulation Program")
|
||
|
||
#define WEBSITE "http://www.gimp.org/"
|
||
#define WEBSITE_LABEL _("Visit the GIMP website")
|
||
|
||
#define PDB_URL_LOAD "plug-in-web-browser"
|
||
|
||
|
||
typedef struct
|
||
{
|
||
GtkWidget *dialog;
|
||
|
||
GtkWidget *logo_area;
|
||
GdkPixmap *logo_pixmap;
|
||
gint logo_width;
|
||
gint logo_height;
|
||
|
||
GdkRectangle text_area;
|
||
gdouble text_size;
|
||
gdouble min_text_size;
|
||
PangoLayout *layout;
|
||
PangoFontDescription *font_desc;
|
||
|
||
gint n_authors;
|
||
gint shuffle[G_N_ELEMENTS (authors) - 1]; /* NULL terminated */
|
||
|
||
guint timer;
|
||
|
||
gint index;
|
||
gint animstep;
|
||
gint textrange[2];
|
||
gint state;
|
||
gboolean visible;
|
||
gboolean pp;
|
||
} GimpAboutDialog;
|
||
|
||
|
||
static void about_dialog_map (GtkWidget *widget,
|
||
GimpAboutDialog *dialog);
|
||
static void about_dialog_unmap (GtkWidget *widget,
|
||
GimpAboutDialog *dialog);
|
||
static void about_dialog_load_url (GtkAboutDialog *dialog,
|
||
const gchar *url,
|
||
gpointer data);
|
||
static void about_dialog_add_logo (GtkWidget *vbox,
|
||
GimpAboutDialog *dialog);
|
||
static gboolean about_dialog_logo_expose (GtkWidget *widget,
|
||
GdkEventExpose *event,
|
||
GimpAboutDialog *dialog);
|
||
static gboolean about_dialog_load_logo (GtkWidget *widget,
|
||
GimpAboutDialog *dialog);
|
||
static void about_dialog_reshuffle (GimpAboutDialog *dialog);
|
||
static gboolean about_dialog_timer (gpointer data);
|
||
|
||
|
||
GtkWidget *
|
||
about_dialog_create (GimpContext *context)
|
||
{
|
||
static GimpAboutDialog *dialog = NULL;
|
||
|
||
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
|
||
|
||
if (! dialog)
|
||
{
|
||
GtkWidget *widget;
|
||
GtkWidget *container;
|
||
GList *children;
|
||
GdkModifierType mask;
|
||
|
||
if (procedural_db_lookup (context->gimp, PDB_URL_LOAD))
|
||
gtk_about_dialog_set_url_hook (about_dialog_load_url,
|
||
g_object_ref (context),
|
||
(GDestroyNotify) g_object_unref);
|
||
|
||
dialog = g_new0 (GimpAboutDialog, 1);
|
||
|
||
dialog->n_authors = G_N_ELEMENTS (authors) - 1;
|
||
|
||
widget = g_object_new (GTK_TYPE_ABOUT_DIALOG,
|
||
"role", "about-dialog",
|
||
"window-position", GTK_WIN_POS_CENTER,
|
||
"name", NAME,
|
||
"version", GIMP_VERSION,
|
||
"copyright", COPYRIGHT,
|
||
"comments", COMMENTS,
|
||
"license", LICENSE,
|
||
"website", WEBSITE,
|
||
"website-label", WEBSITE_LABEL,
|
||
"authors", authors,
|
||
"artists", artists,
|
||
"documenters", documenters,
|
||
/* Translators: insert your names here,
|
||
* separated by newline
|
||
*/
|
||
"translator-credits", _("translator-credits"),
|
||
NULL);
|
||
|
||
dialog->dialog = widget;
|
||
|
||
g_object_add_weak_pointer (G_OBJECT (widget), (gpointer) &dialog);
|
||
|
||
g_signal_connect (widget, "response",
|
||
G_CALLBACK (gtk_widget_destroy),
|
||
NULL);
|
||
|
||
g_signal_connect (widget, "map",
|
||
G_CALLBACK (about_dialog_map),
|
||
dialog);
|
||
g_signal_connect (widget, "unmap",
|
||
G_CALLBACK (about_dialog_unmap),
|
||
dialog);
|
||
|
||
if (! about_dialog_load_logo (widget, dialog))
|
||
{
|
||
gtk_widget_destroy (widget);
|
||
return NULL;
|
||
}
|
||
|
||
/* kids, don't try this at home! */
|
||
container = GTK_DIALOG (widget)->vbox;
|
||
children = gtk_container_get_children (GTK_CONTAINER (container));
|
||
|
||
if (GTK_IS_VBOX (children->data))
|
||
about_dialog_add_logo (children->data, dialog);
|
||
else
|
||
g_warning ("%s: ooops, no vbox in this container?", G_STRLOC);
|
||
|
||
g_list_free (children);
|
||
|
||
/* weird magic to determine the way the logo should be shown */
|
||
gdk_window_get_pointer (NULL, NULL, NULL, &mask);
|
||
|
||
mask &= ~GDK_BUTTON3_MASK;
|
||
dialog->pp = (mask &= (GDK_SHIFT_MASK | GDK_CONTROL_MASK) &
|
||
(GDK_CONTROL_MASK | GDK_MOD1_MASK) &
|
||
(GDK_MOD1_MASK | ~GDK_SHIFT_MASK));
|
||
|
||
dialog->text_area.height = dialog->pp ? 50 : 32;
|
||
dialog->text_area.y = (dialog->logo_height - dialog->text_area.height);
|
||
}
|
||
|
||
gtk_window_present (GTK_WINDOW (dialog->dialog));
|
||
|
||
return dialog->dialog;
|
||
}
|
||
|
||
static void
|
||
about_dialog_map (GtkWidget *widget,
|
||
GimpAboutDialog *dialog)
|
||
{
|
||
if (dialog->layout && dialog->timer == 0)
|
||
{
|
||
dialog->state = 0;
|
||
dialog->index = 0;
|
||
dialog->animstep = 0;
|
||
dialog->visible = FALSE;
|
||
|
||
about_dialog_reshuffle (dialog);
|
||
|
||
dialog->timer = g_timeout_add (800, about_dialog_timer, dialog);
|
||
}
|
||
}
|
||
|
||
static void
|
||
about_dialog_unmap (GtkWidget *widget,
|
||
GimpAboutDialog *dialog)
|
||
{
|
||
if (dialog->timer)
|
||
{
|
||
g_source_remove (dialog->timer);
|
||
dialog->timer = 0;
|
||
}
|
||
}
|
||
|
||
static void
|
||
about_dialog_load_url (GtkAboutDialog *dialog,
|
||
const gchar *url,
|
||
gpointer data)
|
||
{
|
||
GimpContext *context = GIMP_CONTEXT (data);
|
||
Argument *return_vals;
|
||
gint nreturn_vals;
|
||
|
||
return_vals = procedural_db_run_proc (context->gimp, context, NULL,
|
||
PDB_URL_LOAD,
|
||
&nreturn_vals,
|
||
GIMP_PDB_STRING, url,
|
||
GIMP_PDB_END);
|
||
procedural_db_destroy_args (return_vals, nreturn_vals);
|
||
}
|
||
|
||
|
||
static void
|
||
about_dialog_add_logo (GtkWidget *vbox,
|
||
GimpAboutDialog *dialog)
|
||
{
|
||
GtkWidget *align;
|
||
GList *children;
|
||
|
||
children = gtk_container_get_children (GTK_CONTAINER (vbox));
|
||
|
||
for (children = gtk_container_get_children (GTK_CONTAINER (vbox));
|
||
children;
|
||
children = g_list_next (children))
|
||
{
|
||
if (GTK_IS_IMAGE (children->data))
|
||
{
|
||
gtk_widget_hide (children->data);
|
||
break;
|
||
}
|
||
}
|
||
|
||
g_list_free (children);
|
||
|
||
align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
|
||
gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
|
||
gtk_box_reorder_child (GTK_BOX (vbox), align, 0);
|
||
gtk_widget_show (align);
|
||
|
||
dialog->logo_area = gtk_drawing_area_new ();
|
||
gtk_widget_set_size_request (dialog->logo_area,
|
||
dialog->logo_width, dialog->logo_height);
|
||
gtk_widget_set_events (dialog->logo_area, GDK_EXPOSURE_MASK);
|
||
gtk_container_add (GTK_CONTAINER (align), dialog->logo_area);
|
||
gtk_widget_show (dialog->logo_area);
|
||
|
||
g_signal_connect (dialog->logo_area, "expose-event",
|
||
G_CALLBACK (about_dialog_logo_expose),
|
||
dialog);
|
||
|
||
/* place the scrolltext at the bottom of the image */
|
||
dialog->text_area.width = dialog->logo_width;
|
||
dialog->text_area.height = 32; /* gets changed in map() as well */
|
||
dialog->text_area.x = 0;
|
||
dialog->text_area.y = (dialog->logo_height - dialog->text_area.height);
|
||
|
||
dialog->layout = gtk_widget_create_pango_layout (dialog->logo_area, NULL);
|
||
g_object_weak_ref (G_OBJECT (dialog->logo_area),
|
||
(GWeakNotify) g_object_unref, dialog->layout);
|
||
|
||
dialog->font_desc = pango_font_description_from_string ("Sans, 11");
|
||
|
||
pango_layout_set_font_description (dialog->layout, dialog->font_desc);
|
||
pango_layout_set_justify (dialog->layout, PANGO_ALIGN_CENTER);
|
||
}
|
||
|
||
static void
|
||
about_dialog_reshuffle (GimpAboutDialog *dialog)
|
||
{
|
||
GRand *gr = g_rand_new ();
|
||
gint i;
|
||
|
||
for (i = 0; i < dialog->n_authors; i++)
|
||
dialog->shuffle[i] = i;
|
||
|
||
/* here we rely on the authors array having Peter and Spencer first */
|
||
#define START_INDEX 2
|
||
|
||
for (i = START_INDEX; i < dialog->n_authors; i++)
|
||
{
|
||
gint j = g_rand_int_range (gr, START_INDEX, dialog->n_authors);
|
||
|
||
if (i != j)
|
||
{
|
||
gint t;
|
||
|
||
t = dialog->shuffle[j];
|
||
dialog->shuffle[j] = dialog->shuffle[i];
|
||
dialog->shuffle[i] = t;
|
||
}
|
||
}
|
||
|
||
#undef START_INDEX
|
||
|
||
g_rand_free (gr);
|
||
}
|
||
|
||
static gboolean
|
||
about_dialog_logo_expose (GtkWidget *widget,
|
||
GdkEventExpose *event,
|
||
GimpAboutDialog *dialog)
|
||
{
|
||
gdk_gc_set_clip_rectangle (widget->style->black_gc, &event->area);
|
||
|
||
gdk_draw_drawable (widget->window,
|
||
widget->style->black_gc,
|
||
dialog->logo_pixmap,
|
||
event->area.x, event->area.y +
|
||
(dialog->pp ? dialog->logo_height : 0),
|
||
event->area.x, event->area.y,
|
||
event->area.width, event->area.height);
|
||
|
||
gdk_gc_set_clip_rectangle (widget->style->black_gc, NULL);
|
||
|
||
if (dialog->visible)
|
||
{
|
||
GdkGC *text_gc;
|
||
gint layout_x, layout_y;
|
||
gint width, height;
|
||
|
||
text_gc = dialog->logo_area->style->text_gc[GTK_STATE_NORMAL];
|
||
|
||
pango_layout_get_pixel_size (dialog->layout, &width, &height);
|
||
|
||
layout_x = dialog->text_area.x + (dialog->text_area.width - width) / 2;
|
||
layout_y = dialog->text_area.y + (dialog->text_area.height - height) / 2;
|
||
|
||
if (dialog->textrange[1] > 0)
|
||
{
|
||
GdkRegion *covered_region = NULL;
|
||
GdkRegion *rect_region;
|
||
|
||
covered_region =
|
||
gdk_pango_layout_get_clip_region (dialog->layout,
|
||
layout_x, layout_y,
|
||
dialog->textrange, 1);
|
||
|
||
rect_region = gdk_region_rectangle (&event->area);
|
||
|
||
gdk_region_intersect (covered_region, rect_region);
|
||
gdk_region_destroy (rect_region);
|
||
|
||
gdk_gc_set_clip_region (text_gc, covered_region);
|
||
gdk_region_destroy (covered_region);
|
||
}
|
||
|
||
gdk_draw_layout (widget->window,
|
||
widget->style->text_gc[GTK_STATE_NORMAL],
|
||
layout_x, layout_y,
|
||
dialog->layout);
|
||
|
||
gdk_gc_set_clip_region (text_gc, NULL);
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
static gchar *
|
||
insert_spacers (const gchar *string)
|
||
{
|
||
GString *str = g_string_new (NULL);
|
||
gchar *normalized;
|
||
gchar *ptr;
|
||
gunichar unichr;
|
||
|
||
normalized = g_utf8_normalize (string, -1, G_NORMALIZE_DEFAULT_COMPOSE);
|
||
ptr = normalized;
|
||
|
||
while ((unichr = g_utf8_get_char (ptr)))
|
||
{
|
||
g_string_append_unichar (str, unichr);
|
||
g_string_append_unichar (str, 0x200b); /* ZERO WIDTH SPACE */
|
||
ptr = g_utf8_next_char (ptr);
|
||
}
|
||
|
||
g_free (normalized);
|
||
|
||
return g_string_free (str, FALSE);
|
||
}
|
||
|
||
|
||
/* color constants */
|
||
|
||
static const PangoColor foreground = { 5000, 5000, 5000 };
|
||
static const PangoColor background = { 139 * 257, 137 * 257, 124 * 257 };
|
||
|
||
static const PangoColor gradient[] =
|
||
{
|
||
{ 139 * 257, 137 * 257, 124 * 257 },
|
||
{ 65535, 65535, 65535 },
|
||
{ 5000, 5000, 5000 }
|
||
};
|
||
|
||
/* backup values */
|
||
|
||
static const PangoColor grad1ent[] =
|
||
{
|
||
{ 0xff * 257, 0xba * 257, 0x00 * 257 },
|
||
{ 37522, 51914, 57568 }
|
||
};
|
||
|
||
static const PangoColor foregr0und = { 37522, 51914, 57568 };
|
||
static const PangoColor backgr0und = { 0, 0, 0 };
|
||
|
||
static void
|
||
mix_gradient (const PangoColor *gradient,
|
||
guint ncolors,
|
||
PangoColor *target,
|
||
gdouble pos)
|
||
{
|
||
gint index;
|
||
|
||
if (pos == 1.0)
|
||
{
|
||
target->red = gradient[ncolors - 1].red;
|
||
target->green = gradient[ncolors - 1].green;
|
||
target->blue = gradient[ncolors - 1].blue;
|
||
return;
|
||
}
|
||
|
||
index = (gint) floor (pos * (ncolors - 1));
|
||
pos = pos * (ncolors - 1) - index;
|
||
|
||
target->red = (gradient[index].red *
|
||
(1.0 - pos) + gradient[index + 1].red * pos);
|
||
target->green = (gradient[index].green *
|
||
(1.0 - pos) + gradient[index + 1].green * pos);
|
||
target->blue = (gradient[index].blue *
|
||
(1.0 - pos) + gradient[index + 1].blue * pos);
|
||
}
|
||
|
||
static void inline
|
||
mix_colors (const PangoColor *start,
|
||
const PangoColor *end,
|
||
PangoColor *target,
|
||
gdouble pos)
|
||
{
|
||
target->red = start->red * (1.0 - pos) + end->red * pos;
|
||
target->green = start->green * (1.0 - pos) + end->green * pos;
|
||
target->blue = start->blue * (1.0 - pos) + end->blue * pos;
|
||
}
|
||
|
||
static void
|
||
decorate_text (GimpAboutDialog *dialog,
|
||
gint anim_type,
|
||
gdouble time)
|
||
{
|
||
const gchar *text;
|
||
const gchar *ptr;
|
||
gint letter_count = 0;
|
||
gint text_length = 0;
|
||
gint text_bytelen = 0;
|
||
gint cluster_start, cluster_end;
|
||
gunichar unichr;
|
||
PangoAttrList *attrlist = NULL;
|
||
PangoAttribute *attr;
|
||
PangoRectangle irect = {0, 0, 0, 0};
|
||
PangoRectangle lrect = {0, 0, 0, 0};
|
||
PangoColor mix;
|
||
|
||
mix_colors ((dialog->pp ? &backgr0und : &background),
|
||
(dialog->pp ? &foregr0und : &foreground), &mix, time);
|
||
|
||
text = pango_layout_get_text (dialog->layout);
|
||
g_return_if_fail (text != NULL);
|
||
|
||
text_length = g_utf8_strlen (text, -1);
|
||
text_bytelen = strlen (text);
|
||
|
||
attrlist = pango_attr_list_new ();
|
||
|
||
dialog->textrange[0] = 0;
|
||
dialog->textrange[1] = text_bytelen;
|
||
|
||
switch (anim_type)
|
||
{
|
||
case 0: /* Fade in */
|
||
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
|
||
attr->start_index = 0;
|
||
attr->end_index = text_bytelen;
|
||
pango_attr_list_insert (attrlist, attr);
|
||
break;
|
||
|
||
case 1: /* Fade in, spread */
|
||
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
|
||
attr->start_index = 0;
|
||
attr->end_index = text_bytelen;
|
||
pango_attr_list_change (attrlist, attr);
|
||
|
||
ptr = text;
|
||
|
||
cluster_start = 0;
|
||
while ((unichr = g_utf8_get_char (ptr)))
|
||
{
|
||
ptr = g_utf8_next_char (ptr);
|
||
cluster_end = (ptr - text);
|
||
|
||
if (unichr == 0x200b)
|
||
{
|
||
lrect.width = (1.0 - time) * 15.0 * PANGO_SCALE + 0.5;
|
||
attr = pango_attr_shape_new (&irect, &lrect);
|
||
attr->start_index = cluster_start;
|
||
attr->end_index = cluster_end;
|
||
pango_attr_list_change (attrlist, attr);
|
||
}
|
||
cluster_start = cluster_end;
|
||
}
|
||
break;
|
||
|
||
case 2: /* Fade in, sinewave */
|
||
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
|
||
attr->start_index = 0;
|
||
attr->end_index = text_bytelen;
|
||
pango_attr_list_change (attrlist, attr);
|
||
|
||
ptr = text;
|
||
|
||
cluster_start = 0;
|
||
|
||
while ((unichr = g_utf8_get_char (ptr)))
|
||
{
|
||
if (unichr == 0x200b)
|
||
{
|
||
cluster_end = ptr - text;
|
||
attr = pango_attr_rise_new ((1.0 -time) * 18000 *
|
||
sin (4.0 * time +
|
||
(float) letter_count * 0.7));
|
||
attr->start_index = cluster_start;
|
||
attr->end_index = cluster_end;
|
||
pango_attr_list_change (attrlist, attr);
|
||
|
||
letter_count++;
|
||
cluster_start = cluster_end;
|
||
}
|
||
|
||
ptr = g_utf8_next_char (ptr);
|
||
}
|
||
break;
|
||
|
||
case 3: /* letterwise Fade in */
|
||
ptr = text;
|
||
|
||
letter_count = 0;
|
||
cluster_start = 0;
|
||
|
||
while ((unichr = g_utf8_get_char (ptr)))
|
||
{
|
||
gint border = (text_length + 15) * time - 15;
|
||
gdouble pos;
|
||
|
||
if (letter_count < border)
|
||
pos = 0;
|
||
else if (letter_count > border + 15)
|
||
pos = 1;
|
||
else
|
||
pos = ((gdouble) (letter_count - border)) / 15;
|
||
|
||
mix_colors ((dialog->pp ? &foregr0und : &foreground),
|
||
(dialog->pp ? &backgr0und : &background),
|
||
&mix, pos);
|
||
|
||
ptr = g_utf8_next_char (ptr);
|
||
|
||
cluster_end = ptr - text;
|
||
|
||
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
|
||
attr->start_index = cluster_start;
|
||
attr->end_index = cluster_end;
|
||
pango_attr_list_change (attrlist, attr);
|
||
|
||
if (pos < 1.0)
|
||
dialog->textrange[1] = cluster_end;
|
||
|
||
letter_count++;
|
||
cluster_start = cluster_end;
|
||
}
|
||
|
||
break;
|
||
|
||
case 4: /* letterwise Fade in, triangular */
|
||
ptr = text;
|
||
|
||
letter_count = 0;
|
||
cluster_start = 0;
|
||
|
||
while ((unichr = g_utf8_get_char (ptr)))
|
||
{
|
||
gint border = (text_length + 15) * time - 15;
|
||
gdouble pos;
|
||
|
||
if (letter_count < border)
|
||
pos = 1.0;
|
||
else if (letter_count > border + 15)
|
||
pos = 0.0;
|
||
else
|
||
pos = 1.0 - ((gdouble) (letter_count - border)) / 15;
|
||
|
||
mix_gradient (dialog->pp ? grad1ent : gradient,
|
||
dialog->pp ?
|
||
G_N_ELEMENTS (grad1ent) : G_N_ELEMENTS (gradient),
|
||
&mix, pos);
|
||
|
||
ptr = g_utf8_next_char (ptr);
|
||
|
||
cluster_end = ptr - text;
|
||
|
||
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
|
||
attr->start_index = cluster_start;
|
||
attr->end_index = cluster_end;
|
||
pango_attr_list_change (attrlist, attr);
|
||
|
||
if (pos > 0.0)
|
||
dialog->textrange[1] = cluster_end;
|
||
|
||
letter_count++;
|
||
cluster_start = cluster_end;
|
||
}
|
||
break;
|
||
|
||
default:
|
||
g_printerr ("Unknown animation type %d\n", anim_type);
|
||
}
|
||
|
||
pango_layout_set_attributes (dialog->layout, attrlist);
|
||
pango_attr_list_unref (attrlist);
|
||
}
|
||
|
||
static gboolean
|
||
about_dialog_timer (gpointer data)
|
||
{
|
||
GimpAboutDialog *dialog = data;
|
||
gint timeout = 0;
|
||
|
||
if (dialog->animstep == 0)
|
||
{
|
||
gchar *text = NULL;
|
||
gdouble size = 11.0;
|
||
gint width;
|
||
gint height;
|
||
|
||
dialog->visible = TRUE;
|
||
|
||
switch (dialog->state)
|
||
{
|
||
case 0:
|
||
dialog->timer = g_timeout_add (30, about_dialog_timer, dialog);
|
||
dialog->state += 1;
|
||
return FALSE;
|
||
|
||
case 1:
|
||
text = insert_spacers (_("GIMP is brought to you by"));
|
||
dialog->state += 1;
|
||
break;
|
||
|
||
case 2:
|
||
if (! (dialog->index < dialog->n_authors))
|
||
dialog->index = 0;
|
||
|
||
text = insert_spacers (authors[dialog->shuffle[dialog->index]]);
|
||
dialog->index += 1;
|
||
break;
|
||
|
||
default:
|
||
g_return_val_if_reached (TRUE);
|
||
break;
|
||
}
|
||
|
||
g_return_val_if_fail (text != NULL, TRUE);
|
||
|
||
pango_layout_set_text (dialog->layout, text, -1);
|
||
pango_layout_set_attributes (dialog->layout, NULL);
|
||
|
||
pango_font_description_set_size (dialog->font_desc, size * PANGO_SCALE);
|
||
pango_layout_set_font_description (dialog->layout, dialog->font_desc);
|
||
|
||
pango_layout_get_pixel_size (dialog->layout, &width, &height);
|
||
|
||
while (width >= dialog->text_area.width && size >= 6.0)
|
||
{
|
||
size -= 0.5;
|
||
pango_font_description_set_size (dialog->font_desc,
|
||
size * PANGO_SCALE);
|
||
pango_layout_set_font_description (dialog->layout, dialog->font_desc);
|
||
pango_layout_get_pixel_size (dialog->layout, &width, &height);
|
||
}
|
||
}
|
||
|
||
if (dialog->animstep < 16)
|
||
{
|
||
decorate_text (dialog, 4, ((gfloat) dialog->animstep) / 15.0);
|
||
}
|
||
else if (dialog->animstep == 16)
|
||
{
|
||
timeout = 800;
|
||
}
|
||
else if (dialog->animstep == 17)
|
||
{
|
||
timeout = 30;
|
||
}
|
||
else if (dialog->animstep < 33)
|
||
{
|
||
decorate_text (dialog, 1,
|
||
1.0 - ((gfloat) (dialog->animstep - 17)) / 15.0);
|
||
}
|
||
else if (dialog->animstep == 33)
|
||
{
|
||
dialog->visible = FALSE;
|
||
timeout = 300;
|
||
}
|
||
else
|
||
{
|
||
dialog->visible = FALSE;
|
||
dialog->animstep = -1;
|
||
timeout = 30;
|
||
}
|
||
|
||
dialog->animstep++;
|
||
|
||
gtk_widget_queue_draw_area (dialog->logo_area,
|
||
dialog->text_area.x,
|
||
dialog->text_area.y,
|
||
dialog->text_area.width,
|
||
dialog->text_area.height);
|
||
|
||
if (timeout > 0)
|
||
{
|
||
dialog->timer = g_timeout_add (timeout, about_dialog_timer, dialog);
|
||
return FALSE;
|
||
}
|
||
|
||
/* else keep the current timeout */
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/* some handy shortcuts */
|
||
|
||
#define random() gdk_pixbuf_loader_new_with_type ("\160\x6e\147", NULL)
|
||
#define pink(a) gdk_pixbuf_loader_close ((a), NULL)
|
||
#define line gdk_pixbuf_loader_write
|
||
#define white gdk_pixbuf_loader_get_pixbuf
|
||
#define level(a) gdk_pixbuf_get_width ((a))
|
||
#define variance(a) gdk_pixbuf_get_height ((a))
|
||
#define GPL GdkPixbufLoader
|
||
|
||
static gboolean
|
||
about_dialog_load_logo (GtkWidget *widget,
|
||
GimpAboutDialog *dialog)
|
||
{
|
||
GdkPixbuf *pixbuf;
|
||
GdkGC *gc;
|
||
GPL *noise;
|
||
gchar *filename;
|
||
|
||
g_return_val_if_fail (dialog->logo_pixmap == NULL, FALSE);
|
||
|
||
filename = g_build_filename (gimp_data_directory (), "images",
|
||
"gimp-logo.png",
|
||
NULL);
|
||
|
||
pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
|
||
g_free (filename);
|
||
|
||
if (! pixbuf)
|
||
return FALSE;
|
||
|
||
dialog->logo_width = gdk_pixbuf_get_width (pixbuf);
|
||
dialog->logo_height = gdk_pixbuf_get_height (pixbuf);
|
||
|
||
gtk_widget_realize (widget);
|
||
|
||
dialog->logo_pixmap = gdk_pixmap_new (widget->window,
|
||
dialog->logo_width,
|
||
dialog->logo_height * 2,
|
||
-1);
|
||
|
||
gc = gdk_gc_new (dialog->logo_pixmap);
|
||
|
||
/* draw a defined content to the pixmap */
|
||
gdk_draw_rectangle (GDK_DRAWABLE (dialog->logo_pixmap),
|
||
gc, TRUE,
|
||
0, 0,
|
||
dialog->logo_width, dialog->logo_height * 2);
|
||
|
||
gdk_draw_pixbuf (GDK_DRAWABLE (dialog->logo_pixmap),
|
||
gc, pixbuf,
|
||
0, 0, 0, 0,
|
||
dialog->logo_width, dialog->logo_height,
|
||
GDK_RGB_DITHER_NORMAL, 0, 0);
|
||
|
||
g_object_unref (pixbuf);
|
||
|
||
if ((noise = random ()) && line (noise, (const guchar *)
|
||
"\211\120\116\107\r\n\032\n\0\0\0\r\111\110D\122\0\0\001+\0\0\001"
|
||
"\r\004\003\0\0\0\245\177^\254\0\0\0000\120\114TE\0\0\0\023\026\026"
|
||
" \'(2=ANXYSr\177surg\216\234\226\230\225z\247\272\261\263\257\222<EFBFBD>"
|
||
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;\014<EFBFBD>\016\000\000\017\210I\104A\124x<EFBFBD><EFBFBD>\235[l\033<EFBFBD>\025"
|
||
"@gw)<29>a<EFBFBD>b<EFBFBD>\246\255<EFBFBD><EFBFBD>\242\037)j+\251hII\2122)i<>v<EFBFBD>\270\211\234<EFBFBD><EFBFBD>\010"
|
||
"<EFBFBD><EFBFBD>&F`\004\251\251<EFBFBD>\r\202B?jR\030A\220\226I\213<EFBFBD>0<EFBFBD>\243<EFBFBD>\201a\030\t"
|
||
"X;\026\004\201?<3F>\003E\020\250\241<EFBFBD>\257\242?\222Q#\010\002W\264e\201"
|
||
"\020\004\205<EFBFBD>y-\271\217;\273\\\212\273b\212\275\200%q<>\261gg<EFBFBD><EFBFBD>\271"
|
||
"sg\226F(\220@\002\t$\220@\276B\"\037\2760>}<7D>D\254\265\250\036-p9"
|
||
"<EFBFBD>BPR\272P\225<EFBFBD>h<EFBFBD>`<60>\2500W\253P%\n\006<EFBFBD>SkP}\243`\222\221\226\030\203"
|
||
"<EFBFBD>f\254<EFBFBD>X<EFBFBD>u!\221k\033O\245\024\000<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\205\260\256n\270<EFBFBD>\032\207\260"
|
||
"\2467\016h<EFBFBD>\000\221Gk,<2C>_\256!\236\035X\237<EFBFBD>7h\224<EFBFBD>3\267<EFBFBD><EFBFBD>\230~\016"
|
||
"Z\27744\213<EFBFBD>g\256<EFBFBD>iv<EFBFBD>\201<EFBFBD>q<EFBFBD>\261\t\266<EFBFBD>--\245\275y\\<EFBFBD>u\017\277I<EFBFBD>"
|
||
"<EFBFBD>\270.y<>5<EFBFBD>\270<EFBFBD><EFBFBD><EFBFBD>\232<EFBFBD>\\n\255_\233<EFBFBD>s\035k\032<EFBFBD>\233<EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>\276a\275"
|
||
"8j2\236\006##5\r<EFBFBD>\245Q\226<EFBFBD>\n\177\257<EFBFBD>)\\\227\254O\265\210\\\270"
|
||
"p<EFBFBD><EFBFBD>\223\'O\014\r<EFBFBD><EFBFBD><EFBFBD>\273AX<EFBFBD>\013>I#\256<EFBFBD>{n<>\270\023.<2E><>c\r`\271w\215"
|
||
"\245\267\032\032<EFBFBD>\256\212\204<EFBFBD><EFBFBD>\r<EFBFBD>\256z\217<EFBFBD><EFBFBD>~<7E>\216<EFBFBD>\200\225pm<EFBFBD><EFBFBD>"
|
||
"\013>`\215\273\236\031<EFBFBD>>`<60>5E<35>\225\235<EFBFBD>\036\253<EFBFBD>\265M9<EFBFBD>\007V\257<EFBFBD>"
|
||
"H\203R<EFBFBD>\003+m]r<>\265\245\001\231\036M\2461<EFBFBD>\007\226\004\030<EFBFBD><EFBFBD><EFBFBD>\205"
|
||
"<EFBFBD>/\235\034<EFBFBD><EFBFBD>)\\<EFBFBD>z\216<EFBFBD>\006x\216<EFBFBD>\216;9\\\236cm\242\005\246\214&#"
|
||
"<EFBFBD>4\223{\216u<EFBFBD>jL\225i;\'<EFBFBD>\037,<2C>\230vN:<3A>J\274<EFBFBD>R\200y:q<><71>\033<EFBFBD>\032\013"
|
||
"\232\247G\247<EFBFBD>\026k\276`\261y<EFBFBD>\272<EFBFBD>\265<EFBFBD>\271S<EFBFBD>\n\033\201<EFBFBD><EFBFBD><EFBFBD>\257&"
|
||
"\203P[<5B><><EFBFBD>\033\201<EFBFBD>\027=<3D><><EFBFBD>4<EFBFBD>\260<EFBFBD><EFBFBD>\030\213\033<EFBFBD>\250e6<EFBFBD>s<EFBFBD>\274o<EFBFBD>\'"
|
||
"<EFBFBD>v\2531<EFBFBD>\226\253\'<EFBFBD>w\037\256<EFBFBD><EFBFBD><EFBFBD>C\232<EFBFBD><EFBFBD>\017\254\2645\222<EFBFBD>f\037\004"
|
||
"j<EFBFBD>\003\013\230\2477\001T\223<EFBFBD>W,h<>\003EhF<EFBFBD><EFBFBD>\202\214)`\021\246\220"
|
||
"\277X<EFBFBD>\242\'\0044<EFBFBD>q\237\261\240y<EFBFBD>Ju\035<EFBFBD>\213\005-z\022\016<EFBFBD>E\037"
|
||
"\260\240E\217U\265R<EFBFBD>g,`<60>c<EFBFBD>\256\236F~c\001\213\036<EFBFBD>\200<EFBFBD>\240\272<EFBFBD>"
|
||
"\203\005-zX<7A>)\211<EFBFBD>1\205\227b<EFBFBD>w,h<>3\252<EFBFBD>F<EFBFBD><EFBFBD><EFBFBD>\223C1Q!/\2616\t<EFBFBD><EFBFBD>\021"
|
||
"\247g<EFBFBD>\022\013X<EFBFBD>\2649\206<EFBFBD>\274<EFBFBD>\002\214<EFBFBD>v<EFBFBD>\020\234<EFBFBD>X\2201M;\206<EFBFBD>"
|
||
"<<3C>J\000-<2D>\2749<EFBFBD>5\226\014\234Uis\016:{\215<EFBFBD>\013x<EFBFBD>\235<EFBFBD>;\270\036ci"
|
||
"+\255<EFBFBD>\240\0138\031<EFBFBD> ,mY\032\205<EFBFBD><EFBFBD><EFBFBD>\003\033\202\245\235w\230\022"
|
||
"<EFBFBD><EFBFBD>g7\002k\233y\257<EFBFBD><EFBFBD>\002<EFBFBD>\035<EFBFBD>-<2D>8t<38><74>\024\234\001;<3B>S\254v<EFBFBD>\254\221"
|
||
"<EFBFBD><EFBFBD><EFBFBD>\257|<7C>\032\025l\266\207<EFBFBD>\235N\224y\211<EFBFBD>.<2E><>\226\237\261<EFBFBD>\266<EFBFBD>\032"
|
||
"+ms\220<EFBFBD>Q<EFBFBD>C\002\036b\265<EFBFBD>\236\0000\234\002\232<EFBFBD>\021+]\260<EFBFBD>~RFmN<6D>"
|
||
"x\207\025r<Q<>cq/z\207\225\020,j@Kq<4B>/,\245\236<EFBFBD>\267<EFBFBD>\216\274<EFBFBD>\027"
|
||
"V\242\256S\256<EFBFBD>3<EFBFBD>\244<EFBFBD>!\226\\\200<EFBFBD>\'\260\024<EFBFBD>>a<>\002\215<EFBFBD>vP8o<EFBFBD>\204"
|
||
"\245\271\177<EFBFBD>F/g<>\240`<60><>S\'B\036\r=<3D>c\001S<EFBFBD>\201<EFBFBD>\r\226<EFBFBD><EFBFBD><EFBFBD>\';mh\232"
|
||
"<EFBFBD><EFBFBD>|\034\211Pc<EFBFBD>\202\270S?\2658\205<EFBFBD>|<7C>\002<EFBFBD>?C ^\007\266<EFBFBD>\272\035<EFBFBD>\025"
|
||
"\026<EFBFBD><EFBFBD>\231vW\247~f\260o#~`\001<EFBFBD><EFBFBD>6Q\0107\rN<EFBFBD>^`\001<EFBFBD>\037\2603w]<5D>\010"
|
||
"1\037\260\000<EFBFBD>O<EFBFBD>2\001|<7C><>\003,<2C><>S\204<EFBFBD>Vex\212<EFBFBD>\000\013p<EFBFBD><EFBFBD><EFBFBD>\035\236"
|
||
"\220_<EFBFBD>iH\264<EFBFBD>\005\006<EFBFBD><EFBFBD>a\277\272<EFBFBD>X\200<EFBFBD>\247\215<EFBFBD><EFBFBD>\207<EFBFBD><EFBFBD>\273\026\235"
|
||
"\240<EFBFBD>j>\026<EFBFBD><EFBFBD>m\253\235\217\227j`<60>%\266<EFBFBD>+\037\253<EFBFBD>W5\016L\261\037"
|
||
"\036<EFBFBD>ky\002v\254\233\215\005\270\177\t<EFBFBD>VE\233<EFBFBD>\232<EFBFBD>\275<EFBFBD>\262\272"
|
||
"\177!<21><>\\\273<EFBFBD>l\215[<5B>_\036`\001<EFBFBD>_<EFBFBD>\274\026<EFBFBD>O<EFBFBD>\222 \024<EFBFBD>d,\253G<EFBFBD>n"
|
||
"y\247\244W<EFBFBD>\234\212<EFBFBD><EFBFBD>o.\226<EFBFBD><EFBFBD>\223F-<2D>\017<EFBFBD><EFBFBD>\014;\201<EFBFBD><EFBFBD>\2626<EFBFBD>6k\260"
|
||
"h<EFBFBD>b\266\256y\214eq<EFBFBD>L<EFBFBD><EFBFBD>29<EFBFBD>N`\223\261\254<EFBFBD>_<EFBFBD>\272\217)[<5B>\226<EFBFBD>a7\213"
|
||
"<EFBFBD>\027\002\266<EFBFBD><EFBFBD>\234\235<EFBFBD><EFBFBD>bY<EFBFBD>\2774\020(2\230\255Q<EFBFBD>\033C<EFBFBD><EFBFBD>\262\270"
|
||
"\177<EFBFBD><EFBFBD>\013g\006u\022\235tn\"\226<EFBFBD><EFBFBD>\253\276\034i\210\215<EFBFBD><EFBFBD>\226,<2C>X"
|
||
"l\"\226<EFBFBD><EFBFBD><EFBFBD>\013F\222\217<EFBFBD>\206@H\024kj\036\226<EFBFBD><EFBFBD>\223<EFBFBD><EFBFBD>\250^\235<EFBFBD>E<EFBFBD>"
|
||
"<EFBFBD><EFBFBD>aY<EFBFBD>\277\004|<7C>A\257N\235\242\2737\rK67M\010~<7E><>`\266zE<EFBFBD>\260M<EFBFBD><EFBFBD>f<EFBFBD>"
|
||
"\2434\034E6\250SB\024]m\032V<EFBFBD>4<EFBFBD>\264\013<EFBFBD>F5\250SZ\264\235<EFBFBD>,,<2C><>X\260"
|
||
"q0\233-\201\023<EFBFBD><\254\220<EFBFBD><EFBFBD><EFBFBD>+<2B>f<EFBFBD>\233-Ix\036\242YX<EFBFBD>F\217F\021n\233"
|
||
"<EFBFBD><EFBFBD>\226\"\214<EFBFBD>6\013\253<EFBFBD><EFBFBD>c\211\202hgE\257N\"\'\260yX\233\014<EFBFBD><EFBFBD>&~\021"
|
||
"u<EFBFBD>b\266\256y\216U<EFBFBD>WO\214<EFBFBD><EFBFBD>8\211\214\013\234<EFBFBD><EFBFBD>\275<EFBFBD>l<EFBFBD><EFBFBD>\202<EFBFBD>5s\273"
|
||
"(<28>\210M c\275X<EFBFBD>\013<EFBFBD><EFBFBD>Q<EFBFBD>\252\273 <\200\'\212<5\202\005<EFBFBD>3b\263\276"
|
||
"\255\t<EFBFBD>m\tMz\201Y\262?:m<><6D>S\266<EFBFBD>W<EFBFBD>2<EFBFBD>\2403<EFBFBD>\266\253R<EFBFBD>[<5B>\275\rc]\265"
|
||
"o\005<EFBFBD>\261\261<EFBFBD>\272<EFBFBD>\261o|(\036\007\035\033<EFBFBD><EFBFBD>\245<EFBFBD><EFBFBD><,tKN<4B>b<EFBFBD>\211\275"
|
||
"<EFBFBD><EFBFBD>\001\212\205\277<EFBFBD>\260?\263<EFBFBD>/80}<7D><>\244<EFBFBD>\206\220mc5<EFBFBD>\022\277<EFBFBD>\266"
|
||
"\206\023\004S1<EFBFBD>\034\241\273<EFBFBD>\264<EFBFBD>\220\247<EFBFBD><EFBFBD>`\234\002\236R\032<\251"
|
||
"I\277<EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD><EFBFBD>s<EFBFBD><EFBFBD>{<7B>\016\277<EFBFBD>VN\240@\002\t$\220@\002\t$\220@\002\201"
|
||
"$<24><>\257[\220\212\2548<EFBFBD>k=\254<EFBFBD><EFBFBD><EFBFBD>NN0\030<EFBFBD>f<EFBFBD>a\215:\204<EFBFBD>\244<EFBFBD><EFBFBD>1W\025"
|
||
"~\272\270\270\030oP\241v\r<EFBFBD><EFBFBD>t\221 \033<EFBFBD>\222Tu\214\227<EFBFBD>=\260\253\216"
|
||
"\257<EFBFBD>,\251\252<EFBFBD>\020V<EFBFBD>]\225<EFBFBD><EFBFBD>\251j\014<EFBFBD>\031<EFBFBD>\205\"-S\271\034<EFBFBD>\014"
|
||
"k\263<EFBFBD>%SO\'2\254\222Vf5<EFBFBD>9<EFBFBD>Z\224\007#G<><47>\242\205\274<EFBFBD>\272<EFBFBD><EFBFBD><EFBFBD>7p<EFBFBD>\031"
|
||
"\026\240\232\216\272<EFBFBD>R<EFBFBD><EFBFBD>\014k\215<EFBFBD><EFBFBD>\247\252+<2B>B<EFBFBD>\022\271<EFBFBD>Z<EFBFBD>\026\013"
|
||
"\r\253*\031\216\017<EFBFBD>Gub<EFBFBD>\267\246\222\036buhc\277N\254\030\222\237"
|
||
"\"X\013<EFBFBD>b<EFBFBD>\032\026<EFBFBD>`\221\217y<EFBFBD><EFBFBD>\256<EFBFBD>Xy<EFBFBD>\216[\254\035*<2A>H/\261r<EFBFBD>\222"
|
||
"(<28>\236<EFBFBD>\247<EFBFBD>\020V\0071]<5D>\233<EFBFBD><EFBFBD><EFBFBD>-\273vq<EFBFBD>\277<EFBFBD><EFBFBD>\225s\251\032V<EFBFBD><EFBFBD>s5\266"
|
||
"<EFBFBD>k\237\2604$<24><><EFBFBD>\227z<EFBFBD>\242\035V\226<EFBFBD><EFBFBD>fr\233\244<EFBFBD>%+VRo\220<EFBFBD>\277 \026"
|
||
"=\003`\205<EFBFBD>PT<EFBFBD><EFBFBD>\254<EFBFBD><EFBFBD><EFBFBD>\233t0\\<EFBFBD>\260\276E<EFBFBD>k\206\227\245<EFBFBD>l\021\242"
|
||
"\242JI]vl\255n\202\245i\177\227\252\222<EFBFBD>~<7E>,A\254n\2540\033\243\025"
|
||
"\236s\220~<7E>\235<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\034+\216-<2D>\262\275n<EFBFBD><EFBFBD>Xh\236<EFBFBD><EFBFBD><EFBFBD>\272B\270<EFBFBD>-<2D><>\206"
|
||
"\260\023<EFBFBD>Xy\265\nBrf<EFBFBD>Z\003iit\244<EFBFBD><EFBFBD>V\207T\007,j<>\031V\222>\251<EFBFBD>F"
|
||
"<EFBFBD>0\261MJ\236f3a<EFBFBD><EFBFBD>nn<EFBFBD><EFBFBD>\215E<EFBFBD>\2463\274KZ\277\261<EFBFBD>\2122\254\'\034\260"
|
||
":\250edXaZ}\027\035DRI<EFBFBD>g5<EFBFBD>\204\225eu\232\260zt\034:\254U\246)\270"
|
||
"<EFBFBD><EFBFBD>L\247N0\254\274\003\026n\224\250\206\205\212\244\221\207<EFBFBD>2m<EFBFBD>\n"
|
||
"o<EFBFBD>\0053\026<EFBFBD>\223<EFBFBD>\026,<2C><>\"<EFBFBD>sf\241\212<EFBFBD><EFBFBD> \\\275<EFBFBD><EFBFBD>\276<EFBFBD>\240\273t<EFBFBD>*"
|
||
"<EFBFBD><EFBFBD>\003\204@p\254><\026q3<EFBFBD><EFBFBD>?Y\251$<24>\255<EFBFBD>:\270<EFBFBD>\210\2462&\254\034C"
|
||
"@q\236\023\017<EFBFBD>a\222%<25>@&\250<EFBFBD>\222<EFBFBD><EFBFBD><EFBFBD>\177<EFBFBD>&\210U\031\212n=<3D><>s,<2C>\213"
|
||
"\231\0166I<EFBFBD><EFBFBD>9<EFBFBD>\264b\005\232\252\t\200\t+<2B>\2614\273\205\037G<EFBFBD>\017"
|
||
"<EFBFBD>\247\262J\263t\234R\254J<EFBFBD><EFBFBD><EFBFBD>\242#\230c<EFBFBD>\252\227\222\264<EFBFBD>p<EFBFBD>\031\256"
|
||
"{k\020<EFBFBD>2\002\261<EFBFBD><EFBFBD>a\215Q\255\240\217\235U\265<EFBFBD> <20>\024<EFBFBD>\037\016n`J"
|
||
"\217\265C]-<2D><>\223\264<EFBFBD>#L\236<EFBFBD>\212\225B\240n\251\037<EFBFBD>\260R<i\202\022"
|
||
"\257\2209!I\215?<3F>\212<EFBFBD>bq<EFBFBD>W<EFBFBD>\n<EFBFBD>1L<EFBFBD>\270<EFBFBD>\032\2217<EFBFBD>\255-X\037 +V\037"
|
||
"M<EFBFBD>,\212\252\276\006\035PDSu\235\217i;l<>5\254[\247\257\\><3E>?iX<69>\271"
|
||
"\226Q<EFBFBD>bs52c\275\215\000\254\260N)\214X\222\036+C\261V\234\246j#V"
|
||
"7}:#\226\241\265<EFBFBD>\277\177=\213 ,<2C>\222O<EFBFBD>\260\222\024K<EFBFBD>c\215Q\254\262"
|
||
";\254,o-\\<EFBFBD>\212&F7\260<EFBFBD>%<25>\2029q<EFBFBD>\036+<2B>\000\226\254<EFBFBD>V\230<EFBFBD>\021<EFBFBD>N\r"
|
||
"X1\275\007<EFBFBD><EFBFBD><EFBFBD>p0bIV<EFBFBD>r\207\025Q<EFBFBD>X/\204\014\000b\254\270\036\213\267"
|
||
"<EFBFBD>\214\031\213<EFBFBD>\\<EFBFBD>\276<EFBFBD>/<2F>\000VN\275\221\247\275\250p<EFBFBD>a\207\245Y\201"
|
||
"|\025\013\205<EFBFBD><EFBFBD>\274d<EFBFBD>*\252|*\253:9\256\2600L\246\207<EFBFBD>\"k4G\254\031"
|
||
"<EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>f6<EFBFBD>\231\260r\252<EFBFBD>)]c<><63>\027<EFBFBD>\014(\257<EFBFBD>\245a,<2C>\005<EFBFBD><EFBFBD>\261$<24>B\002"
|
||
"XI<EFBFBD>\232<EFBFBD>5V\216\024.<2E>^L<><4C>a,j<>\177<EFBFBD>\2106s<EFBFBD>\275<EFBFBD>[<5B><>\211<EFBFBD><EFBFBD>\"<EFBFBD><EFBFBD><EFBFBD>\250{"
|
||
"\254\020\255>I{1\242<EFBFBD>E\030+i\260F\230<EFBFBD>\213s<EFBFBD>\227@\225\0171<EFBFBD>q<EFBFBD><EFBFBD>t\214"
|
||
"\270<EFBFBD><EFBFBD>A\025\263\203\002<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B\254\210\016k\242<EFBFBD>\027[\r\004S\256<EFBFBD>"
|
||
"j<EFBFBD>-\026\033\204<EFBFBD>\245\037&\201\254<EFBFBD>_+\222<EFBFBD>a,\205<EFBFBD><EFBFBD>s\206URE<EFBFBD>T<EFBFBD>\004"
|
||
"\023\256\261<EFBFBD>|@%\251<EFBFBD>\024<EFBFBD>=\037\214<EFBFBD><EFBFBD>\240<EFBFBD>\035z7Y\037<EFBFBD>1c<EFBFBD>\232k<EFBFBD>5"
|
||
"V\0373\r\274\027I0<EFBFBD>\001\213\271\231<EFBFBD>\207\030\026o\2552\202\260\250"
|
||
"A<EFBFBD><EFBFBD>\266\035V<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Oo<EFBFBD>ro<EFBFBD>\235<EFBFBD>\017<EFBFBD>\\\202\253\252<EFBFBD>\233<EFBFBD>\233<EFBFBD><EFBFBD>\014\275"
|
||
">;k\210\202<EFBFBD>+\021\017K<EFBFBD>\2271\265L\226\020\225KQ<EFBFBD>s\022\254<EFBFBD><EFBFBD>o6rB\277"
|
||
"\'P_\220Y>\214/~\264\236\010<EFBFBD><EFBFBD>\203N9\006<EFBFBD>\255\'<EFBFBD>\261;\256\263ep\250"
|
||
"u<EFBFBD>s\274@\002\t<EFBFBD>+(<28>\200<EFBFBD><EFBFBD>\204h@@<40>y<EFBFBD>e\ry<EFBFBD><EFBFBD>\227<EFBFBD>__\207y<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>\235):\033"
|
||
"t\254<EFBFBD>_<EFBFBD>\2207\253<EFBFBD><EFBFBD>\201\021<EFBFBD>\'<EFBFBD><<3C><>-<2D>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>+W<>\002U<EFBFBD><EFBFBD><EFBFBD>|<7C>\214\025\276"
|
||
"Y\037\026)k<>k<EFBFBD>:\003E=\036#<23>ld<6C>E<EFBFBD>0<EFBFBD>s<EFBFBD>1\224[\\\274\001U\235B;<3B>\230"
|
||
"\261<EFBFBD>micY3\026(<28>f1V.\205<EFBFBD>\251\216e<EFBFBD>\265\214<EFBFBD>\021V<EFBFBD>qW<EFBFBD>\217<EFBFBD>.<2E>8\035"
|
||
"\212\206<EFBFBD><EFBFBD>\020<EFBFBD>\227\235h\013\032$\213\254C<EFBFBD>-<2D>\'Y\252<EFBFBD><EFBFBD>\023<EFBFBD>\001\234"
|
||
"D\263nAC<EFBFBD>\262;qn|\001)C<>\n\256\204N\222\007<EFBFBD>\226\250\024#\027\021"
|
||
"<EFBFBD>3<EFBFBD>\222\261<EFBFBD>z0<EFBFBD>\227<EFBFBD>M\231<EFBFBD>\236C<EFBFBD>*<2A><>\006+\214<EFBFBD>\275\"\222<EFBFBD><EFBFBD>\205p9\217"
|
||
"\035%<25>9<EFBFBD>\030<EFBFBD>q\236RW\263\230.\227!<21><>8qkX<6B><58><EFBFBD>+\265\262<EFBFBD>\032\222*Q\245"
|
||
"\244<EFBFBD>\007_!\225<EFBFBD>\244\207\260\203\233Mu<EFBFBD>\245q\237\007qA\232L\004c"
|
||
"a\032<EFBFBD>\275<EFBFBD>\207S*\250,<2C>\210<EFBFBD><EFBFBD>^]<5D>r*\\ye<EFBFBD>*\271w<EFBFBD>\213\201<EFBFBD>\230R\211"
|
||
"<EFBFBD>#^w<>\014\212,)\225\003,\211`<60>>\247+\233<EFBFBD>t<EFBFBD>E}\037(\213<EFBFBD>l\212TB\034"
|
||
"<EFBFBD><EFBFBD>\036\234\034\256\\<EFBFBD><EFBFBD>\n<EFBFBD><EFBFBD>^<5E>\023\247<EFBFBD>:\254<EFBFBD>\267\tVI^\273\014<EFBFBD>{6<>"
|
||
"\265<EFBFBD>\030\273W7~<7E>0.Q\242X\023\250g!B<>T<EFBFBD>e<EFBFBD>Z<EFBFBD>\265E<EFBFBD>jh><3E>\261<EFBFBD><EFBFBD>e#K<>\031"
|
||
"\224\217\242<EFBFBD>L6<EFBFBD><EFBFBD>v\216*\224\032<EFBFBD>&U\210\006!\226<EFBFBD>\261H\235<EFBFBD><EFBFBD>\233\227"
|
||
"\260\273\255|R\254<EFBFBD><EFBFBD>A^<5E>M\020<EFBFBD>\035C<EFBFBD><EFBFBD><EFBFBD>h\013\240<EFBFBD>\235\236\031<EFBFBD>\t[\263"
|
||
"2\276\007<EFBFBD>\220<EFBFBD>O\220<EFBFBD><EFBFBD><EFBFBD><EFBFBD>k\267\020Z%w<>\246\"<EFBFBD>^\024<EFBFBD>(\026<EFBFBD>\242b\264"
|
||
"\207<<3C>*\003b?\263\237\035--\204+\247<EFBFBD>@By\2719\010<EFBFBD><EFBFBD>\251(<28>tk%Z<>J\241"
|
||
"\256;I2j<32><6A>,<2C><>$\276<EFBFBD><EFBFBD>\004<EFBFBD>J\031<EFBFBD>f\227\230\013?Atk%Ju<4A>\267\004\213"
|
||
"<EFBFBD>\026MN<EFBFBD>%w\025+\\Z\033\236@g<>\217<EFBFBD>\202&r\027<EFBFBD>D\2048\026\n\025<EFBFBD>\254"
|
||
"Xy\032<EFBFBD><EFBFBD>\277\002aie<EFBFBD>e\244\254\036\032\030\210<EFBFBD><EFBFBD>\270\022\222<EFBFBD>\223"
|
||
"/\rX,Y<>BR\224\224\275\227\232\243\216e!\026N.\221}\205e#V\017V\224"
|
||
"\"\251\254<EFBFBD>\034<EFBFBD>\2569\222\233e5b\205<EFBFBD><EFBFBD>1iM\263[]<5D>6<EFBFBD>\224\206<EFBFBD>G\"<EFBFBD><EFBFBD>"
|
||
"\205\014<EFBFBD>J\231\206HH\n\036<EFBFBD>\",<<3C>Cd<43>\025.\033\261\272<EFBFBD><EFBFBD>:<3A><>\2725Cn"
|
||
"\'\225b,\253\021\253o.9\203\212q\216<EFBFBD>-r6\243aE<EFBFBD>\205b<EFBFBD>\200<EFBFBD>\275e\272"
|
||
"\005\227<EFBFBD><EFBFBD>@,Tz;W\214v=<3D><>\222\021K.}\234\247\255\025<EFBFBD><EFBFBD>1Y}<7D><>2<EFBFBD>j<EFBFBD>*<2A>"
|
||
";<3B>\250\257<p\024\227\"\225<EFBFBD>\253\227\006K1\rKQ<EFBFBD>>\222\242<EFBFBD>\032V<EFBFBD>\005"
|
||
"\262<EFBFBD>>\222<EFBFBD>v<EFBFBD><EFBFBD>#\245\224\020<EFBFBD>!<21>f6z\277Z\241\025<EFBFBD>\252Xx\215x\221<EFBFBD>\026"
|
||
"\"1<EFBFBD>\007<EFBFBD>\262\237f5`\205W<EFBFBD>\220W\212xy\231M<EFBFBD>O7\000\244y<EFBFBD>fU\267<EFBFBD><\250"
|
||
"fh\262\206<EFBFBD>]y\205<EFBFBD><EFBFBD>y\214Dv>\264\231\252v<EFBFBD>\245\022dA\212<EFBFBD><EFBFBD>\241<EFBFBD>~w"
|
||
"\254\232\025ts\242\265J$C\256\255<EFBFBD>\253<EFBFBD>,<@<40>\244\207\010\266<EFBFBD>7<EFBFBD><EFBFBD><EFBFBD>"
|
||
"TWw<EFBFBD>h)\'<EFBFBD><EFBFBD>{\237\244\241<EFBFBD><EFBFBD>T+Q<>|\253\250\257<EFBFBD>R\215\205\224#t\\\207"
|
||
"c<EFBFBD><EFBFBD>\"\220@\002\t$\220@\002\t$\220@\002\t$\220@\002\t$\220@\002\t"
|
||
"$\220@<40><><EFBFBD>\177t<EFBFBD>\007<EFBFBD>uUy$\0\0\0\0IE\116\104\256B`\202", 4093, NULL)
|
||
&& pink (noise) && white (noise))
|
||
{
|
||
gdk_draw_pixbuf (GDK_DRAWABLE (dialog->logo_pixmap),
|
||
gc, white (noise), 0, 0,
|
||
(dialog->logo_width - level (white (noise))) / 2,
|
||
dialog->logo_height + (dialog->logo_height -
|
||
variance (white (noise))) / 2,
|
||
level (white (noise)),
|
||
variance (white (noise)),
|
||
GDK_RGB_DITHER_NORMAL, 0, 0);
|
||
}
|
||
|
||
g_object_unref (noise);
|
||
g_object_unref (gc);
|
||
|
||
return TRUE;
|
||
}
|