mirror of https://github.com/GNOME/gimp.git
1181 lines
40 KiB
C
1181 lines
40 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 <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <time.h>
|
||
|
||
#include <gtk/gtk.h>
|
||
#include <gdk/gdkkeysyms.h>
|
||
|
||
#include "libgimpmath/gimpmath.h"
|
||
#include "libgimpbase/gimpbase.h"
|
||
#include "libgimpwidgets/gimpwidgets.h"
|
||
|
||
#include "gui-types.h"
|
||
|
||
#include "core/gimptoolinfo.h"
|
||
|
||
#include "widgets/gimphelp-ids.h"
|
||
#include "widgets/gimpdnd.h"
|
||
|
||
#include "about-dialog.h"
|
||
#include "authors.h"
|
||
|
||
#include "gimp-intl.h"
|
||
|
||
static gchar *founders[] =
|
||
{
|
||
N_("Version %s brought to you by"),
|
||
"Spencer Kimball & Peter Mattis"
|
||
};
|
||
|
||
static gchar *translators[] =
|
||
{
|
||
N_("Translation by"),
|
||
/* Translators: insert your names here, separated by newline */
|
||
/* we'd prefer just the names, please no email adresses. */
|
||
N_("translator-credits"),
|
||
};
|
||
|
||
static gchar *contri_intro[] =
|
||
{
|
||
N_("Contributions by")
|
||
};
|
||
|
||
static gchar **translator_names = NULL;
|
||
|
||
typedef struct
|
||
{
|
||
GtkWidget *about_dialog;
|
||
GtkWidget *logo_area;
|
||
GdkPixmap *logo_pixmap;
|
||
GdkRectangle pixmaparea;
|
||
|
||
GdkBitmap *shape_bitmap;
|
||
GdkGC *trans_gc;
|
||
GdkGC *opaque_gc;
|
||
|
||
GdkRectangle textarea;
|
||
gdouble text_size;
|
||
gdouble min_text_size;
|
||
PangoLayout *layout;
|
||
|
||
gint timer;
|
||
|
||
gint index;
|
||
gint animstep;
|
||
gboolean visible;
|
||
gint textrange[2];
|
||
gint state;
|
||
|
||
} GimpAboutInfo;
|
||
|
||
PangoColor gradient[] =
|
||
{
|
||
{ 50372, 50372, 50115 },
|
||
{ 65535, 65535, 65535 },
|
||
{ 10000, 10000, 10000 },
|
||
};
|
||
|
||
PangoColor foreground = { 10000, 10000, 10000 };
|
||
PangoColor background = { 50372, 50372, 50115 };
|
||
|
||
/* backup values */
|
||
|
||
PangoColor grad1ent[] =
|
||
{
|
||
{ 0xff * 257, 0xba * 257, 0x00 * 257 },
|
||
{ 37522, 51914, 57568 },
|
||
};
|
||
|
||
PangoColor foregr0und = { 37522, 51914, 57568 };
|
||
PangoColor backgr0und = { 0, 0, 0 };
|
||
|
||
static GimpAboutInfo about_info = { 0 };
|
||
static gboolean pp = FALSE;
|
||
|
||
static gboolean about_dialog_load_logo (GtkWidget *window);
|
||
static void about_dialog_destroy (GtkObject *object,
|
||
gpointer data);
|
||
static void about_dialog_unmap (GtkWidget *widget,
|
||
gpointer data);
|
||
static gint about_dialog_logo_expose (GtkWidget *widget,
|
||
GdkEventExpose *event,
|
||
gpointer data);
|
||
static gint about_dialog_button (GtkWidget *widget,
|
||
GdkEventButton *event,
|
||
gpointer data);
|
||
static gint about_dialog_key (GtkWidget *widget,
|
||
GdkEventKey *event,
|
||
gpointer data);
|
||
static void reshuffle_array (void);
|
||
static gboolean about_dialog_timer (gpointer data);
|
||
|
||
|
||
static gboolean double_speed = FALSE;
|
||
|
||
static PangoFontDescription *font_desc = NULL;
|
||
static gchar **scroll_text = authors;
|
||
static gint nscroll_texts = G_N_ELEMENTS (authors);
|
||
static gint shuffle_array[G_N_ELEMENTS (authors)];
|
||
|
||
|
||
GtkWidget *
|
||
about_dialog_create (void)
|
||
{
|
||
if (! about_info.about_dialog)
|
||
{
|
||
GtkWidget *widget;
|
||
GdkGCValues shape_gcv;
|
||
|
||
about_info.visible = FALSE;
|
||
about_info.state = 0;
|
||
about_info.animstep = -1;
|
||
|
||
widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||
about_info.about_dialog = widget;
|
||
|
||
gtk_window_set_type_hint (GTK_WINDOW (widget),
|
||
GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
|
||
gtk_window_set_wmclass (GTK_WINDOW (widget), "about_dialog", "Gimp");
|
||
gtk_window_set_title (GTK_WINDOW (widget), _("About The GIMP"));
|
||
gtk_window_set_position (GTK_WINDOW (widget), GTK_WIN_POS_CENTER);
|
||
|
||
/* The window must not be resizeable, since otherwise
|
||
* the copying of nonexisting parts of the image pixmap
|
||
* would result in an endless loop due to the X-Server
|
||
* generating expose events on the pixmap. */
|
||
|
||
gtk_window_set_resizable (GTK_WINDOW (widget), FALSE);
|
||
|
||
g_signal_connect (widget, "destroy",
|
||
G_CALLBACK (about_dialog_destroy),
|
||
NULL);
|
||
g_signal_connect (widget, "unmap",
|
||
G_CALLBACK (about_dialog_unmap),
|
||
NULL);
|
||
g_signal_connect (widget, "button_press_event",
|
||
G_CALLBACK (about_dialog_button),
|
||
NULL);
|
||
g_signal_connect (widget, "key_press_event",
|
||
G_CALLBACK (about_dialog_key),
|
||
NULL);
|
||
|
||
gtk_widget_set_events (widget, GDK_BUTTON_PRESS_MASK);
|
||
|
||
if (! about_dialog_load_logo (widget))
|
||
{
|
||
gtk_widget_destroy (widget);
|
||
about_info.about_dialog = NULL;
|
||
return NULL;
|
||
}
|
||
|
||
/* place the scrolltext at the bottom of the image */
|
||
about_info.textarea.width = about_info.pixmaparea.width;
|
||
about_info.textarea.height = 50;
|
||
about_info.textarea.x = 0;
|
||
about_info.textarea.y = (about_info.pixmaparea.height -
|
||
about_info.textarea.height);
|
||
|
||
widget = gtk_drawing_area_new ();
|
||
about_info.logo_area = widget;
|
||
|
||
gtk_widget_set_size_request (widget,
|
||
about_info.pixmaparea.width,
|
||
about_info.pixmaparea.height);
|
||
gtk_widget_set_events (widget, GDK_EXPOSURE_MASK);
|
||
gtk_container_add (GTK_CONTAINER (about_info.about_dialog),
|
||
widget);
|
||
gtk_widget_show (widget);
|
||
|
||
g_signal_connect (widget, "expose_event",
|
||
G_CALLBACK (about_dialog_logo_expose),
|
||
NULL);
|
||
|
||
gtk_widget_realize (widget);
|
||
gdk_window_set_background (widget->window,
|
||
&(widget->style)->black);
|
||
|
||
/* setup shape bitmap */
|
||
|
||
about_info.shape_bitmap = gdk_pixmap_new (widget->window,
|
||
about_info.pixmaparea.width,
|
||
about_info.pixmaparea.height,
|
||
1);
|
||
about_info.trans_gc = gdk_gc_new (about_info.shape_bitmap);
|
||
|
||
about_info.opaque_gc = gdk_gc_new (about_info.shape_bitmap);
|
||
gdk_gc_get_values (about_info.opaque_gc, &shape_gcv);
|
||
gdk_gc_set_foreground (about_info.opaque_gc, &shape_gcv.background);
|
||
|
||
gdk_draw_rectangle (about_info.shape_bitmap,
|
||
about_info.trans_gc,
|
||
TRUE,
|
||
0, 0,
|
||
about_info.pixmaparea.width,
|
||
about_info.pixmaparea.height);
|
||
|
||
gdk_draw_line (about_info.shape_bitmap,
|
||
about_info.opaque_gc,
|
||
0, 0,
|
||
about_info.pixmaparea.width, 0);
|
||
|
||
gtk_widget_shape_combine_mask (about_info.about_dialog,
|
||
about_info.shape_bitmap,
|
||
0, 0);
|
||
about_info.layout = gtk_widget_create_pango_layout (about_info.logo_area,
|
||
NULL);
|
||
g_object_weak_ref (G_OBJECT (about_info.logo_area),
|
||
(GWeakNotify) g_object_unref, about_info.layout);
|
||
|
||
font_desc = pango_font_description_from_string ("Sans, 11");
|
||
|
||
pango_layout_set_font_description (about_info.layout, font_desc);
|
||
pango_layout_set_justify (about_info.layout, PANGO_ALIGN_CENTER);
|
||
|
||
}
|
||
|
||
if (! GTK_WIDGET_VISIBLE (about_info.about_dialog))
|
||
{
|
||
if (! double_speed)
|
||
{
|
||
about_info.state = 0;
|
||
about_info.index = 0;
|
||
|
||
reshuffle_array ();
|
||
pango_layout_set_text (about_info.layout, "", -1);
|
||
}
|
||
}
|
||
|
||
gtk_window_present (GTK_WINDOW (about_info.about_dialog));
|
||
|
||
return about_info.about_dialog;
|
||
}
|
||
|
||
static void
|
||
about_dialog_destroy (GtkObject *object,
|
||
gpointer data)
|
||
{
|
||
about_info.about_dialog = NULL;
|
||
about_dialog_unmap (NULL, NULL);
|
||
}
|
||
|
||
static void
|
||
about_dialog_unmap (GtkWidget *widget,
|
||
gpointer data)
|
||
{
|
||
if (about_info.timer)
|
||
{
|
||
g_source_remove (about_info.timer);
|
||
about_info.timer = 0;
|
||
}
|
||
|
||
if (about_info.about_dialog)
|
||
{
|
||
gdk_draw_rectangle (about_info.shape_bitmap,
|
||
about_info.trans_gc,
|
||
TRUE,
|
||
0, 0,
|
||
about_info.pixmaparea.width,
|
||
about_info.pixmaparea.height);
|
||
|
||
gdk_draw_line (about_info.shape_bitmap,
|
||
about_info.opaque_gc,
|
||
0, 0,
|
||
about_info.pixmaparea.width, 0);
|
||
|
||
gtk_widget_shape_combine_mask (about_info.about_dialog,
|
||
about_info.shape_bitmap,
|
||
0, 0);
|
||
}
|
||
}
|
||
|
||
static gint
|
||
about_dialog_logo_expose (GtkWidget *widget,
|
||
GdkEventExpose *event,
|
||
gpointer data)
|
||
{
|
||
gint width, height;
|
||
|
||
if (!about_info.timer)
|
||
{
|
||
GdkModifierType mask;
|
||
|
||
/* No timeout, we were unmapped earlier */
|
||
about_info.state = 0;
|
||
about_info.index = 1;
|
||
about_info.animstep = -1;
|
||
about_info.visible = FALSE;
|
||
reshuffle_array ();
|
||
gdk_draw_rectangle (about_info.shape_bitmap,
|
||
about_info.trans_gc,
|
||
TRUE,
|
||
0, 0,
|
||
about_info.pixmaparea.width,
|
||
about_info.pixmaparea.height);
|
||
|
||
gdk_draw_line (about_info.shape_bitmap,
|
||
about_info.opaque_gc,
|
||
0, 0,
|
||
about_info.pixmaparea.width, 0);
|
||
|
||
gtk_widget_shape_combine_mask (about_info.about_dialog,
|
||
about_info.shape_bitmap,
|
||
0, 0);
|
||
about_info.timer = g_timeout_add (30, about_dialog_timer, NULL);
|
||
|
||
gdk_window_get_pointer (NULL, NULL, NULL, &mask);
|
||
|
||
/* weird magic to determine the way the logo should be shown */
|
||
mask &= ~GDK_BUTTON3_MASK;
|
||
pp = (mask &= (GDK_SHIFT_MASK | GDK_CONTROL_MASK) &
|
||
(GDK_CONTROL_MASK | GDK_MOD1_MASK) &
|
||
(GDK_MOD1_MASK | ~GDK_SHIFT_MASK),
|
||
height = mask ? (about_info.pixmaparea.height > 0) &&
|
||
(about_info.pixmaparea.width > 0): 0);
|
||
|
||
}
|
||
|
||
/* only operate on the region covered by the pixmap */
|
||
if (! gdk_rectangle_intersect (&(about_info.pixmaparea),
|
||
&(event->area),
|
||
&(event->area)))
|
||
return FALSE;
|
||
|
||
gdk_gc_set_clip_rectangle (widget->style->black_gc, &(event->area));
|
||
|
||
gdk_draw_drawable (widget->window,
|
||
widget->style->white_gc,
|
||
about_info.logo_pixmap,
|
||
event->area.x, event->area.y +
|
||
(pp ? about_info.pixmaparea.height : 0),
|
||
event->area.x, event->area.y,
|
||
event->area.width, event->area.height);
|
||
|
||
if (pp && about_info.state == 0 &&
|
||
(about_info.index < about_info.pixmaparea.height / 12 ||
|
||
about_info.index < g_random_int () %
|
||
(about_info.pixmaparea.height / 8 + 13)))
|
||
{
|
||
gdk_draw_rectangle (widget->window,
|
||
widget->style->black_gc,
|
||
TRUE,
|
||
0, 0, about_info.pixmaparea.width, 158);
|
||
|
||
}
|
||
|
||
if (about_info.visible == TRUE)
|
||
{
|
||
gint layout_x, layout_y;
|
||
|
||
pango_layout_get_pixel_size (about_info.layout, &width, &height);
|
||
|
||
layout_x = about_info.textarea.x +
|
||
(about_info.textarea.width - width) / 2;
|
||
layout_y = about_info.textarea.y +
|
||
(about_info.textarea.height - height) / 2;
|
||
|
||
if (about_info.textrange[1] > 0)
|
||
{
|
||
GdkRegion *covered_region = NULL;
|
||
GdkRegion *rect_region;
|
||
|
||
covered_region = gdk_pango_layout_get_clip_region
|
||
(about_info.layout,
|
||
layout_x, layout_y,
|
||
about_info.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 (about_info.logo_area->style->text_gc[GTK_STATE_NORMAL],
|
||
covered_region);
|
||
gdk_region_destroy (covered_region);
|
||
}
|
||
|
||
gdk_draw_layout (widget->window,
|
||
widget->style->text_gc[GTK_STATE_NORMAL],
|
||
layout_x, layout_y,
|
||
about_info.layout);
|
||
|
||
}
|
||
|
||
gdk_gc_set_clip_rectangle (widget->style->black_gc, NULL);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
static gint
|
||
about_dialog_button (GtkWidget *widget,
|
||
GdkEventButton *event,
|
||
gpointer data)
|
||
{
|
||
gtk_widget_hide (about_info.about_dialog);
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
static gint
|
||
about_dialog_key (GtkWidget *widget,
|
||
GdkEventKey *event,
|
||
gpointer data)
|
||
{
|
||
/* placeholder */
|
||
switch (event->keyval)
|
||
{
|
||
case GDK_a:
|
||
case GDK_A:
|
||
case GDK_b:
|
||
case GDK_B:
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
static gchar *
|
||
insert_spacers (const gchar *string)
|
||
{
|
||
gchar *normalized, *ptr;
|
||
gunichar unichr;
|
||
GString *str;
|
||
|
||
str = g_string_new (NULL);
|
||
|
||
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);
|
||
}
|
||
|
||
static void
|
||
mix_gradient (PangoColor *gradient, guint ncolors,
|
||
PangoColor *target, gdouble pos)
|
||
{
|
||
gint index;
|
||
|
||
g_return_if_fail (gradient != NULL);
|
||
g_return_if_fail (ncolors > 1);
|
||
g_return_if_fail (target != NULL);
|
||
g_return_if_fail (pos >= 0.0 && pos <= 1.0);
|
||
|
||
if (pos == 1.0)
|
||
{
|
||
target->red = gradient[ncolors-1].red;
|
||
target->green = gradient[ncolors-1].green;
|
||
target->blue = gradient[ncolors-1].blue;
|
||
return;
|
||
}
|
||
|
||
index = (int) 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
|
||
mix_colors (PangoColor *start, PangoColor *end,
|
||
PangoColor *target,
|
||
gdouble pos)
|
||
{
|
||
g_return_if_fail (start != NULL);
|
||
g_return_if_fail (end != NULL);
|
||
g_return_if_fail (target != NULL);
|
||
g_return_if_fail (pos >= 0.0 && pos <= 1.0);
|
||
|
||
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
|
||
reshuffle_array (void)
|
||
{
|
||
GRand *gr = g_rand_new ();
|
||
gint i;
|
||
|
||
for (i = 0; i < nscroll_texts; i++)
|
||
{
|
||
shuffle_array[i] = i;
|
||
}
|
||
|
||
for (i = 0; i < nscroll_texts; i++)
|
||
{
|
||
gint j;
|
||
|
||
j = g_rand_int_range (gr, 0, nscroll_texts);
|
||
if (i != j)
|
||
{
|
||
gint t;
|
||
|
||
t = shuffle_array[j];
|
||
shuffle_array[j] = shuffle_array[i];
|
||
shuffle_array[i] = t;
|
||
}
|
||
}
|
||
|
||
g_rand_free (gr);
|
||
}
|
||
|
||
static void
|
||
decorate_text (PangoLayout *layout, gint anim_type, gdouble time)
|
||
{
|
||
gint letter_count = 0;
|
||
gint text_length = 0;
|
||
gint text_bytelen = 0;
|
||
gint cluster_start, cluster_end;
|
||
const gchar *text;
|
||
const gchar *ptr;
|
||
gunichar unichr;
|
||
PangoAttrList *attrlist = NULL;
|
||
PangoAttribute *attr;
|
||
PangoRectangle irect = {0, 0, 0, 0};
|
||
PangoRectangle lrect = {0, 0, 0, 0};
|
||
PangoColor mix;
|
||
|
||
mix_colors ((pp ? &backgr0und : &background),
|
||
(pp ? &foregr0und : &foreground),
|
||
&mix, time);
|
||
|
||
text = pango_layout_get_text (layout);
|
||
text_length = g_utf8_strlen (text, -1);
|
||
text_bytelen = strlen (text);
|
||
|
||
attrlist = pango_attr_list_new ();
|
||
|
||
about_info.textrange[0] = 0;
|
||
about_info.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;
|
||
gdouble pos;
|
||
|
||
border = (text_length + 15) * time - 15;
|
||
|
||
if (letter_count < border)
|
||
pos = 0;
|
||
else if (letter_count > border + 15)
|
||
pos = 1;
|
||
else
|
||
pos = ((gdouble) (letter_count - border)) / 15;
|
||
|
||
mix_colors ((pp ? &foregr0und : &foreground),
|
||
(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)
|
||
about_info.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;
|
||
gdouble pos;
|
||
|
||
border = (text_length + 15) * time - 15;
|
||
|
||
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 (pp ? grad1ent : gradient,
|
||
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)
|
||
about_info.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 (layout, attrlist);
|
||
pango_attr_list_unref (attrlist);
|
||
|
||
}
|
||
|
||
static gboolean
|
||
about_dialog_timer (gpointer data)
|
||
{
|
||
gboolean return_val;
|
||
gint width, height;
|
||
gdouble size;
|
||
gchar *text;
|
||
return_val = TRUE;
|
||
|
||
if (about_info.animstep == 0)
|
||
{
|
||
size = 11.0;
|
||
text = NULL;
|
||
about_info.visible = TRUE;
|
||
|
||
if (about_info.state == 0)
|
||
{
|
||
if (about_info.index > (about_info.pixmaparea.height /
|
||
(pp ? 8 : 16)) + 16)
|
||
{
|
||
about_info.index = 0;
|
||
about_info.state ++;
|
||
}
|
||
else
|
||
{
|
||
height = about_info.index * 16;
|
||
|
||
if (height < about_info.pixmaparea.height)
|
||
gdk_draw_line (about_info.shape_bitmap,
|
||
about_info.opaque_gc,
|
||
0, height,
|
||
about_info.pixmaparea.width, height);
|
||
|
||
height -= 15;
|
||
while (height > 0)
|
||
{
|
||
if (height < about_info.pixmaparea.height)
|
||
gdk_draw_line (about_info.shape_bitmap,
|
||
about_info.opaque_gc,
|
||
0, height,
|
||
about_info.pixmaparea.width, height);
|
||
height -= 15;
|
||
}
|
||
|
||
gtk_widget_shape_combine_mask (about_info.about_dialog,
|
||
about_info.shape_bitmap,
|
||
0, 0);
|
||
about_info.index++;
|
||
about_info.visible = FALSE;
|
||
gtk_widget_queue_draw_area (about_info.logo_area,
|
||
0, 0,
|
||
about_info.pixmaparea.width,
|
||
about_info.pixmaparea.height);
|
||
return TRUE;
|
||
}
|
||
}
|
||
|
||
if (about_info.state == 1)
|
||
{
|
||
if (about_info.index >= G_N_ELEMENTS (founders))
|
||
{
|
||
about_info.index = 0;
|
||
|
||
/* skip the translators section when the translator
|
||
* did not provide a translation with his name
|
||
*/
|
||
if (gettext (translators[1]) == translators[1])
|
||
about_info.state = 4;
|
||
else
|
||
about_info.state = 2;
|
||
}
|
||
else
|
||
{
|
||
if (about_info.index == 0)
|
||
{
|
||
gchar *tmp;
|
||
tmp = g_strdup_printf (gettext (founders[0]), GIMP_VERSION);
|
||
text = insert_spacers (tmp);
|
||
g_free (tmp);
|
||
}
|
||
else
|
||
{
|
||
text = insert_spacers (gettext (founders[about_info.index]));
|
||
}
|
||
about_info.index++;
|
||
}
|
||
}
|
||
|
||
if (about_info.state == 2)
|
||
{
|
||
if (about_info.index >= G_N_ELEMENTS (translators) - 1)
|
||
{
|
||
about_info.index = 0;
|
||
about_info.state++;
|
||
}
|
||
else
|
||
{
|
||
text = insert_spacers (gettext (translators[about_info.index]));
|
||
about_info.index++;
|
||
}
|
||
}
|
||
|
||
if (about_info.state == 3)
|
||
{
|
||
if (!translator_names)
|
||
translator_names = g_strsplit (gettext (translators[1]), "\n", 0);
|
||
|
||
if (translator_names[about_info.index] == NULL)
|
||
{
|
||
about_info.index = 0;
|
||
about_info.state++;
|
||
}
|
||
else
|
||
{
|
||
text = insert_spacers (translator_names[about_info.index]);
|
||
about_info.index++;
|
||
}
|
||
}
|
||
|
||
if (about_info.state == 4)
|
||
{
|
||
if (about_info.index >= G_N_ELEMENTS (contri_intro))
|
||
{
|
||
about_info.index = 0;
|
||
about_info.state++;
|
||
}
|
||
else
|
||
{
|
||
text = insert_spacers (gettext (contri_intro[about_info.index]));
|
||
about_info.index++;
|
||
}
|
||
|
||
}
|
||
|
||
if (about_info.state == 5)
|
||
{
|
||
|
||
about_info.index += 1;
|
||
if (about_info.index == nscroll_texts)
|
||
about_info.index = 0;
|
||
|
||
text = insert_spacers (scroll_text[shuffle_array[about_info.index]]);
|
||
}
|
||
|
||
if (text == NULL)
|
||
{
|
||
g_printerr ("TEXT == NULL\n");
|
||
return TRUE;
|
||
}
|
||
pango_layout_set_text (about_info.layout, text, -1);
|
||
pango_layout_set_attributes (about_info.layout, NULL);
|
||
|
||
pango_font_description_set_size (font_desc, size * PANGO_SCALE);
|
||
pango_layout_set_font_description (about_info.layout, font_desc);
|
||
|
||
pango_layout_get_pixel_size (about_info.layout, &width, &height);
|
||
|
||
while (width >= about_info.textarea.width && size >= 6.0)
|
||
{
|
||
size -= 0.5;
|
||
pango_font_description_set_size (font_desc, size * PANGO_SCALE);
|
||
pango_layout_set_font_description (about_info.layout, font_desc);
|
||
|
||
pango_layout_get_pixel_size (about_info.layout, &width, &height);
|
||
}
|
||
}
|
||
|
||
about_info.animstep++;
|
||
|
||
if (about_info.animstep < 16)
|
||
{
|
||
decorate_text (about_info.layout, 4,
|
||
((float) about_info.animstep) / 15.0);
|
||
}
|
||
else if (about_info.animstep == 16)
|
||
{
|
||
about_info.timer = g_timeout_add (800, about_dialog_timer, NULL);
|
||
return_val = FALSE;
|
||
}
|
||
else if (about_info.animstep == 17)
|
||
{
|
||
about_info.timer = g_timeout_add (30, about_dialog_timer, NULL);
|
||
return_val = FALSE;
|
||
}
|
||
else if (about_info.animstep < 33)
|
||
{
|
||
decorate_text (about_info.layout, 1,
|
||
1.0 - ((float) (about_info.animstep-17)) / 15.0);
|
||
}
|
||
else if (about_info.animstep == 33)
|
||
{
|
||
about_info.timer = g_timeout_add (300, about_dialog_timer, NULL);
|
||
return_val = FALSE;
|
||
about_info.visible = FALSE;
|
||
}
|
||
else
|
||
{
|
||
about_info.animstep = 0;
|
||
about_info.timer = g_timeout_add (30, about_dialog_timer, NULL);
|
||
return_val = FALSE;
|
||
about_info.visible = FALSE;
|
||
}
|
||
|
||
gtk_widget_queue_draw_area (about_info.logo_area,
|
||
about_info.textarea.x,
|
||
about_info.textarea.y,
|
||
about_info.textarea.width,
|
||
about_info.textarea.height);
|
||
|
||
return return_val;
|
||
}
|
||
|
||
|
||
/* 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 *window)
|
||
{
|
||
gchar *filename;
|
||
GdkPixbuf *pixbuf;
|
||
GdkGC *gc;
|
||
gint width;
|
||
PangoLayout *layout;
|
||
PangoFontDescription *desc;
|
||
GPL *noise;
|
||
|
||
if (about_info.logo_pixmap)
|
||
return TRUE;
|
||
|
||
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;
|
||
|
||
about_info.pixmaparea.x = 0;
|
||
about_info.pixmaparea.y = 0;
|
||
about_info.pixmaparea.width = gdk_pixbuf_get_width (pixbuf);
|
||
about_info.pixmaparea.height = gdk_pixbuf_get_height (pixbuf);
|
||
|
||
gtk_widget_realize (window);
|
||
|
||
about_info.logo_pixmap = gdk_pixmap_new (window->window,
|
||
about_info.pixmaparea.width,
|
||
about_info.pixmaparea.height * 2,
|
||
gtk_widget_get_visual (window)->depth);
|
||
|
||
layout = gtk_widget_create_pango_layout (window, NULL);
|
||
desc = pango_font_description_from_string ("Sans, Italic 9");
|
||
pango_layout_set_font_description (layout, desc);
|
||
pango_layout_set_justify (layout, PANGO_ALIGN_CENTER);
|
||
pango_layout_set_text (layout, GIMP_VERSION, -1);
|
||
|
||
gc = gdk_gc_new (about_info.logo_pixmap);
|
||
|
||
/* draw a defined content to the Pixmap */
|
||
gdk_draw_rectangle (GDK_DRAWABLE (about_info.logo_pixmap),
|
||
gc, TRUE,
|
||
0, 0,
|
||
about_info.pixmaparea.width,
|
||
about_info.pixmaparea.height * 2);
|
||
|
||
gdk_draw_pixbuf (GDK_DRAWABLE (about_info.logo_pixmap),
|
||
gc, pixbuf,
|
||
0, 0, 0, 0,
|
||
about_info.pixmaparea.width,
|
||
about_info.pixmaparea.height,
|
||
GDK_RGB_DITHER_NORMAL, 0, 0);
|
||
|
||
pango_layout_get_pixel_size (layout, &width, NULL);
|
||
|
||
gdk_draw_layout (GDK_DRAWABLE (about_info.logo_pixmap),
|
||
gc, 222, 137, layout);
|
||
|
||
g_object_unref (pixbuf);
|
||
g_object_unref (layout);
|
||
|
||
if ((noise = random ()) && line (noise,
|
||
"\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 (about_info.logo_pixmap),
|
||
gc, white (noise), 0, 0,
|
||
(about_info.pixmaparea.width -
|
||
level (white (noise))) / 2,
|
||
about_info.pixmaparea.height +
|
||
(about_info.pixmaparea.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;
|
||
}
|
||
|