gimp/app/gui/about-dialog.c

1192 lines
41 KiB
C
Raw Normal View History

/* 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"
1999-03-07 20:56:03 +08:00
#include <string.h>
1997-11-25 06:05:25 +08:00
#include <time.h>
1998-07-15 10:28:31 +08:00
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
1998-07-15 10:28:31 +08:00
#include "libgimpmath/gimpmath.h"
#include "libgimpbase/gimpbase.h"
Makefile.am configure.in added the new library below. 2001-01-24 Michael Natterer <mitch@gimp.org> * Makefile.am * configure.in * gimptool.in: added the new library below. * libgimpwidgets/Makefile.am * libgimpwidgets/gimpchainbutton.[ch] * libgimpwidgets/gimpcolorarea.[ch] * libgimpwidgets/gimpcolorbutton.[ch] * libgimpwidgets/gimpdialog.[ch] * libgimpwidgets/gimpfileselection.[ch] * libgimpwidgets/gimphelpui.[ch] * libgimpwidgets/gimppatheditor.[ch] * libgimpwidgets/gimppixmap.[ch] * libgimpwidgets/gimpquerybox.[ch] * libgimpwidgets/gimpsizeentry.[ch] * libgimpwidgets/gimpunitmenu.[ch] * libgimpwidgets/gimpwidgets.[ch] * libgimpwidgets/gimpwidgets.def * libgimpwidgets/gimpwidgetstypes.h: new shared library. Currently there are some ugly dependencies into libgimp. These will be removed and go to a "libgimpglue" library which will be a library for functions which share a common interface between plug-ins and the app but have different implementations. Include "libgimp/gimpunit.h" from "libgimpwidgets/gimpwidgetstypes.h" to simulate this upcoming separation. * libgimp/Makefile.am * libgimp/gimpchainbutton.[ch] * libgimp/gimpcolorarea.[ch] * libgimp/gimpcolorbutton.[ch] * libgimp/gimpdialog.[ch] * libgimp/gimpfileselection.[ch] * libgimp/gimphelpui.[ch] * libgimp/gimppatheditor.[ch] * libgimp/gimppixmap.[ch] * libgimp/gimpquerybox.[ch] * libgimp/gimpsizeentry.[ch] * libgimp/gimpunitmenu.[ch] * libgimp/gimpwidgets.[ch]: removed from here. * libgimp/gimpui.h * libgimp/gimpuitypes.h * libgimp/makefile.mingw.in * libgimp/makefile.msc: changed accordingly. * app/[all ui files] * app/pdb/palette_cmds.c * app/pdb/tools_cmds.c * tools/pdbgen/pdb/palette.pdb * tools/pdbgen/pdb/tools.pdb: #include "libgimpwidgets/gimpwidgets.h" and removed useless includes. * app/apptypes.h: #include "libgimpwidgets/gimpwidgetstypes.h" * app/Makefile.am * plug-ins/[all makefiles which link against libgimpui]: link against libgimpwidgets.la * po-libgimp/POTFILES.in: changed file locations.
2001-01-25 06:36:18 +08:00
#include "libgimpwidgets/gimpwidgets.h"
devel-docs/Makefile.am new file documenting the core's include policy. 2002-05-03 Michael Natterer <mitch@gimp.org> * devel-docs/Makefile.am * devel-docs/includes.txt: new file documenting the core's include policy. * HACKING: mention it here. * libgimptool/gimptooltypes.h: removed GimpToolOptions here. * app/core/core-types.h: and added it here. This is a temp hack needed because GimpToolInfo needs to know the GimpToolOptions type. * libgimpproxy/gimpproxytypes.h: regenerated. * libgimptool/gimptoolmodule.h: don't include gimptooltypes.h here... * libgimptool/gimptoolmodule.c: ...but here. * app/config/gimpconfig-params.c: include "libgimpbase/gimpbase.h" entirely, not single files from it. * app/core/gimp.c * app/core/gimpcontext.c * app/core/gimpcoreconfig.c * app/core/gimpdatafactory.c * app/core/gimpdocuments.c * app/core/gimpdrawable-blend.c * app/core/gimpdrawable-bucket-fill.c * app/core/gimpdrawable-offset.c * app/core/gimpdrawable-transform.c * app/core/gimpdrawable.c * app/core/gimpedit.c * app/core/gimpimage-convert.c * app/core/gimpimage-crop.c * app/core/gimpimage-duplicate.c * app/core/gimpimage-guides.c * app/core/gimpimage-mask.c * app/core/gimpimage-merge.c * app/core/gimpimage-new.c * app/core/gimpimage-projection.c * app/core/gimpimage-qmask.c * app/core/gimpimage-resize.c * app/core/gimpimage-scale.c * app/core/gimpimage.c * app/core/gimpitem.c * app/core/gimpmodules.c * app/core/gimppaintinfo.c * app/core/gimpparasite.c * app/core/gimppreviewcache.c * app/core/gimptoolinfo.c * app/core/gimpunit.c: include "core-types.h" and no other types file. * app/display/gimpdisplay.c * app/display/gimpdisplayshell-callbacks.c * app/display/gimpdisplayshell.c: include "tools/tools-types.h" instead of "libgimptool/gimptooltypes.h", warn about inclusion on "gui/gui-types.h" * app/file/file-open.c * app/file/file-save.c: don't include "libgimptool/gimptooltypes.h". * app/gui/about-dialog.c * app/gui/brush-select.c * app/gui/brushes-commands.c * app/gui/color-select.c * app/gui/data-commands.c * app/gui/device-status-dialog.c * app/gui/dialogs.c * app/gui/gradients-commands.c * app/gui/help-commands.c * app/gui/info-window.c * app/gui/palettes-commands.c * app/gui/patterns-commands.c * app/gui/resize-dialog.c * app/gui/tips-dialog.c * app/gui/tool-options-dialog.c: include "gui-types.h" and no other types file. * app/paint/gimpairbrush.c * app/paint/gimpclone.c * app/paint/gimpconvolve.c * app/paint/gimpdodgeburn.c * app/paint/gimperaser.c * app/paint/gimppaintbrush.c * app/paint/gimppaintcore-stroke.c * app/paint/gimppaintcore.c * app/paint/gimppaintoptions.c * app/paint/gimppencil.c * app/paint/gimpsmudge.c * app/paint/paint.c: include "paint-types.h" and no other types file. * app/pdb/pdb-types.h: don't include "libgimptool/gimptooltypes.h". * app/plug-in/plug-in-progress.c: warn about inclusion of "display/display-types.h" * app/tools/tools-types.h: include "libgimptool/gimptooltypes.h". * app/tools/gimpairbrushtool.c * app/tools/gimpbezierselecttool.c * app/tools/gimpblendtool.c * app/tools/gimpbrightnesscontrasttool.c * app/tools/gimpbucketfilltool.c * app/tools/gimpbycolorselecttool.c * app/tools/gimpclonetool.c * app/tools/gimpcolorbalancetool.c * app/tools/gimpcolorpickertool.c * app/tools/gimpconvolvetool.c * app/tools/gimpcroptool.c * app/tools/gimpcurvestool.c * app/tools/gimpdodgeburntool.c * app/tools/gimpdrawtool.c * app/tools/gimpeditselectiontool.c * app/tools/gimpellipseselecttool.c * app/tools/gimperasertool.c * app/tools/gimpfliptool.c * app/tools/gimpfreeselecttool.c * app/tools/gimpfuzzyselecttool.c * app/tools/gimphistogramtool.c * app/tools/gimphuesaturationtool.c * app/tools/gimpinktool.c * app/tools/gimplevelstool.c * app/tools/gimpmagnifytool.c * app/tools/gimpmeasuretool.c * app/tools/gimpmovetool.c * app/tools/gimppaintbrushtool.c * app/tools/gimppainttool.c * app/tools/gimppathtool.c * app/tools/gimppenciltool.c * app/tools/gimpperspectivetool.c * app/tools/gimpposterizetool.c * app/tools/gimprectselecttool.c * app/tools/gimprotatetool.c * app/tools/gimpscaletool.c * app/tools/gimpselectiontool.c * app/tools/gimpsheartool.c * app/tools/gimpsmudgetool.c * app/tools/gimptexttool.c * app/tools/gimpthresholdtool.c * app/tools/gimptoolcontrol.c * app/tools/gimptoolcontrol.h * app/tools/gimptransformtool.c * app/tools/gimpvectortool.c * app/tools/tools.c: include "tools-types.h" and no other types file, warn about inclusion of "gui/gui-types.h". * app/widgets/gimpcolorpanel.c * app/widgets/gimptoolbox-color-area.c: warn about inclusion of "gui/gui-types.h". * app/xcf/xcf-load.c * app/xcf/xcf.c: don't include "libgimptool/gimptooltypes.h". Split tool-safe-mode up in two files, one including libgimpproxy, one libgimp. * plug-ins/tools/Makefile.am * plug-ins/tools/tool-safe-mode-plug-in.[ch]: new files including libgimp/ stuff only. * plug-ins/tools/tool-safe-mode.[ch]: include libgimpproxy/ and libgimptool/ but don't include libgimp/ because of conflicting declarations. Unrelated: * app/tools/gimpclonetool.c: create the clone core so we don't crash. * app/gui/file-open-dialog.c: changed the way we create previews so that only out-of-date previews are created on a click in the preview area. Unconditional creation can still be forced by <Ctrl>+click. Changed the tooltip to document this.
2002-05-03 20:45:22 +08:00
#include "gui-types.h"
#include "core/gimptoolinfo.h"
Made the tool system work again and integrated it back with the 2001-02-21 Michael Natterer <mitch@gimp.org> Made the tool system work again and integrated it back with the GimpContext. It's a hack between old, new and freshly hacked stuff. There are still lots of warnings but at least we can switch tools again. * app/tools/Makefile.am * app/tools/gimptoolinfo.[ch]: resurrected as real object. The GimpToolInfo objects are derived from GimpData, which gives us the tool icon stuff for free. Also, we need a list of _objects_ which is allocated all the time. All tools are required to have a "register" function which registers themselves with the list of GimpToolInfo objects which is maintained by the tool manager. * app/tools/tool.[ch]: made a real GtkObject with properly named functions out of it. The former "active_tool_control" is of course not the default implementation of the tool's "control" method but a hack _around_ it, so it went to the tool manager. * app/tools/color_picker.[ch] * app/tools/measure.[ch]: ditto. Added "register" functions and "destroy" implementations so the tools go away after use. * app/tools/tool_manager.[ch]: badly hacked at the moment to keep both the list of class structures _and_ the tool info list. * app/tools/tools.c: call the tools' register functions. * app/gimpcontext.[ch]: store a pointer to a GimpToolInfo object as "active_tool" in the context, so we're independent of tools being allocated or not. It's treated just like a brush or pattern now. * app/gimpdnd.[ch]: made tool DND work like all other DND types. * app/devices.[ch]: also here: the tool is just a normal data object now, resulting in removal of lots of code. * app/commands.c * app/context_manager.c: updated the tool select and context stuff to work again. * app/toolbox.c: removed the old pixmap buttons and put GimpPreviews inside the tool buttons. Still needs an own preview type to look nice. * app/disp_callbacks.c * app/about_dialog.c * app/app_procs.c * app/appenums.h * app/apptypes.h * app/gimage.c * app/gimppalette.c * app/gimppreview.c * app/gimprc.c * app/info_window.c * app/menus.c * app/palette_select.h * app/scale.c * app/scroll.c: lots of changes to make it work again.
2001-02-21 20:18:09 +08:00
app/widgets/Makefile.am new file defining the available help topics. Work 2003-08-21 Michael Natterer <mitch@gimp.org> * app/widgets/Makefile.am * app/widgets/gimphelp-ids.h: new file defining the available help topics. Work in progress and totally unusable for matching to the help system. Stay tuned... * app/gui/about-dialog.c * app/gui/brushes-menu.c * app/gui/buffers-menu.c * app/gui/channels-commands.[ch] * app/gui/channels-menu.c * app/gui/edit-commands.c * app/gui/file-commands.c * app/gui/file-new-dialog.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * app/gui/gradients-commands.c * app/gui/gradients-menu.c * app/gui/image-menu.c * app/gui/layers-commands.[ch] * app/gui/layers-menu.c * app/gui/module-browser.c * app/gui/offset-dialog.c * app/gui/palettes-menu.c * app/gui/patterns-menu.c * app/gui/resize-dialog.c * app/gui/select-commands.c * app/gui/templates-menu.c * app/gui/tips-dialog.c * app/gui/toolbox-menu.c * app/gui/vectors-commands.[ch] * app/gui/vectors-menu.c: replaced literal HTML file paths by help IDs from gimphelp-ids.h. Renamed some menu callbacks to be consistent with similar ones. This is just an intermediate commit and not finished. While browsing all the menus, I noticed that our "x to selection" functions are not consistent at all. They should all offer the REPLACE,ADD,SUBTRACT,INTERSECT options: * app/core/gimpchannel.[ch]: added new function gimp_channel_new_from_alpha(). Removed gimp_channel_layer_alpha() and gimp_channel_layer_mask(). * app/core/gimpimage-mask.[ch]: added gimp_image_mask_select_alpha() and gimp_image_mask_select_component() which offer the full set of operation, feather and feather_radius parameters as the other selection functions. * app/core/gimpimage-mask-select.[ch]: removed gimp_image_mask_layer_alpha() and gimp_image_mask_layer_mask(). * app/gui/channels-commands.c (channels_channel_to_selection): use gimp_image_mask_select_component() instead of implementing it here. * app/gui/image-menu.c * app/gui/layers-commands.[ch]: offer the full choice of REPLACE,ADD,SUBTRACT,INTERSECT with "Alpha to Selection" and "Mask to Selection". * tools/pdbgen/pdb/selection.pdb: changed accordingly. * app/pdb/selection_cmds.c: regenerated.
2003-08-21 23:54:47 +08:00
#include "widgets/gimphelp-ids.h"
#include "widgets/gimpdnd.h"
app/Makefile.am app/gui/Makefile.am app/about_dialog.[ch] 2001-04-17 Michael Natterer <mitch@gimp.org> * app/Makefile.am * app/gui/Makefile.am * app/about_dialog.[ch] * app/brush_edit.[ch] * app/brush_select.[ch] * app/channels_dialog.[ch] * app/color_area.[ch] * app/color_notebook.[ch] * app/color_select.[ch] * app/colormap_dialog.[ch] * app/commands.[ch] * app/file_new_dialog.[ch] * app/gradient_editor.[ch] * app/gradient_select.[ch] * app/indicator_area.[ch] * app/info_dialog.[ch] * app/info_window.[ch] * app/layer_select.[ch] * app/layers_dialog.[ch] * app/menus.[ch] * app/palette.[ch] * app/palette_import.[ch] * app/palette_select.[ch] * app/paths_dialog.[ch] * app/pattern_select.[ch] * app/preferences_dialog.[ch] * app/session.[ch] * app/test_commands.[ch] * app/tips_dialog.[ch] * app/toolbox.[ch]: moved to gui/ (s/_/-/ and some more useful filenames on the way). * app/app_procs.c * app/context_manager.c * app/convert.c * app/disp_callbacks.c * app/errorconsole.c * app/file-open.c * app/file-save.c * app/file-utils.c * app/gdisplay.c * app/gimage.c * app/gimprc.c * app/image_new.c * app/interface.c * app/nav_window.c * app/path.c * app/plug_in.c * app/gui/dialogs-constructors.c * app/pdb/brush_select_cmds.c * app/pdb/convert_cmds.c * app/pdb/gradient_select_cmds.c * app/pdb/pattern_select_cmds.c * app/tools/gimpcolorpickertool.c * app/tools/gimpcroptool.c * app/tools/gimpmagnifytool.c * app/tools/gimpmeasuretool.c * app/tools/gimpscaletool.c * app/tools/gimptransformtool.c * app/widgets/gimpcolorpanel.c * tools/pdbgen/pdb/brush_select.pdb * tools/pdbgen/pdb/convert.pdb * tools/pdbgen/pdb/gradient_select.pdb * tools/pdbgen/pdb/pattern_select.pdb * po/POTFILES.in: changed accordingly.
2001-04-18 05:43:29 +08:00
#include "about-dialog.h"
#include "authors.h"
app/Makefile.am app/gui/Makefile.am app/about_dialog.[ch] 2001-04-17 Michael Natterer <mitch@gimp.org> * app/Makefile.am * app/gui/Makefile.am * app/about_dialog.[ch] * app/brush_edit.[ch] * app/brush_select.[ch] * app/channels_dialog.[ch] * app/color_area.[ch] * app/color_notebook.[ch] * app/color_select.[ch] * app/colormap_dialog.[ch] * app/commands.[ch] * app/file_new_dialog.[ch] * app/gradient_editor.[ch] * app/gradient_select.[ch] * app/indicator_area.[ch] * app/info_dialog.[ch] * app/info_window.[ch] * app/layer_select.[ch] * app/layers_dialog.[ch] * app/menus.[ch] * app/palette.[ch] * app/palette_import.[ch] * app/palette_select.[ch] * app/paths_dialog.[ch] * app/pattern_select.[ch] * app/preferences_dialog.[ch] * app/session.[ch] * app/test_commands.[ch] * app/tips_dialog.[ch] * app/toolbox.[ch]: moved to gui/ (s/_/-/ and some more useful filenames on the way). * app/app_procs.c * app/context_manager.c * app/convert.c * app/disp_callbacks.c * app/errorconsole.c * app/file-open.c * app/file-save.c * app/file-utils.c * app/gdisplay.c * app/gimage.c * app/gimprc.c * app/image_new.c * app/interface.c * app/nav_window.c * app/path.c * app/plug_in.c * app/gui/dialogs-constructors.c * app/pdb/brush_select_cmds.c * app/pdb/convert_cmds.c * app/pdb/gradient_select_cmds.c * app/pdb/pattern_select_cmds.c * app/tools/gimpcolorpickertool.c * app/tools/gimpcroptool.c * app/tools/gimpmagnifytool.c * app/tools/gimpmeasuretool.c * app/tools/gimpscaletool.c * app/tools/gimptransformtool.c * app/widgets/gimpcolorpanel.c * tools/pdbgen/pdb/brush_select.pdb * tools/pdbgen/pdb/convert.pdb * tools/pdbgen/pdb/gradient_select.pdb * tools/pdbgen/pdb/pattern_select.pdb * po/POTFILES.in: changed accordingly.
2001-04-18 05:43:29 +08:00
#include "gimp-intl.h"
app/Makefile.am app/channel_pvt.h app/drawable_pvt.h app/gdisplayF.h 2000-12-29 Michael Natterer <mitch@gimp.org> * app/Makefile.am * app/channel_pvt.h * app/drawable_pvt.h * app/gdisplayF.h * app/gimpdrawableP.h * app/gimpimageP.h * app/layer_pvt.h * app/toolsF.h: removed these files. * app/apptypes.h * tools/pdbgen/enums.pl: added tons of opaque typedefs and enums. * tools/pdbgen/pdb/brush_select.pdb * tools/pdbgen/pdb/brushes.pdb * tools/pdbgen/pdb/channel.pdb * tools/pdbgen/pdb/color.pdb * tools/pdbgen/pdb/convert.pdb * tools/pdbgen/pdb/display.pdb * tools/pdbgen/pdb/drawable.pdb * tools/pdbgen/pdb/fileops.pdb * tools/pdbgen/pdb/gradient_select.pdb * tools/pdbgen/pdb/gradients.pdb * tools/pdbgen/pdb/help.pdb * tools/pdbgen/pdb/image.pdb * tools/pdbgen/pdb/layer.pdb * tools/pdbgen/pdb/pattern_select.pdb * tools/pdbgen/pdb/patterns.pdb * tools/pdbgen/pdb/selection.pdb * tools/pdbgen/pdb/tools.pdb * app/*: chainsaw #include cleanup: - Never (never!!) include stuff in header files except where we need access to structures' contents (like derived objects). - Added prototypes and proper formating in many files. - The #include order in *all* *.c files is as follows: #include "config.h" #include <system stuff> #include <gtk/gtk.h> #include "apptypes.h" #include "gimp stuff" #include "libgimp stuff" #include "libgimp/gimpintl.h" By following this scheme we can easily see a file's dependencies from it's #include's and can grep for the inclusion to find out where a file is used. * tools/pdbgen/app.pl: changed to follow the include scheme above. * libgimp/Makefile.am * libgimp/gimpuitypes.h: new file, included from libgimp/gimpui.h and from app/apptypes.h. * libgimp/gimpcolorbutton.[ch] * libgimp/gimpdialog.[ch] * libgimp/gimphelpui.[ch] * libgimp/gimpparasite.[ch] * libgimp/gimppatheditor.[ch] * libgimp/gimpprotocol.c * libgimp/gimpquerybox.[ch] * libgimp/gimpsizeentry.[ch] * libgimp/gimptypes.h * libgimp/gimpui.h * libgimp/gimpunit.h * libgimp/gimpunitmenu.[ch] * libgimp/gimpwidgets.[ch]: changed accordingly. * plug-ins/FractalExplorer/Dialogs.c * plug-ins/gdyntext/message_window.c * plug-ins/imagemap/imap_default_dialog.c * plug-ins/imagemap/imap_file.c: these files used to include "libgimp/gimpui.h" without including "libgimp/gimp.h". This is no longer possible because the libgimpui headers don't inlcude "libgimp/gimpunit.h" any more.
2000-12-29 23:22:01 +08:00
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 addresses. */
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 void about_dialog_center (GtkWindow *window);
static gboolean 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);
1997-11-25 06:05:25 +08:00
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)];
generate app/file/Makefile 2001-10-25 Michael Natterer <mitch@gimp.org> * configure.in: generate app/file/Makefile * app/Makefile.am * app/file-open.[ch] * app/file-save.[ch] * app/file-utils.[ch]: removed... * app/file/Makefile.am * app/file/file-open.[ch] * app/file/file-save.[ch] * app/file/file-utils.[ch]: ...and added here. * app/gui/file-commands.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * tools/pdbgen/pdb/fileops.pdb: changed includes accordingly. * app/app_procs.[ch]: removed app_exit_finish() and app_exit_finish_done() from the public API, call gtk_main() here, pass "no_data" to gimp_new() and "restore_session" to gui_restore(). * app/main.c: removed global variable "double_speed", don't call gtk_main() in main.c. Added some missing log domains. * app/appenv.h: removed "double_speed". * app/core/gimp.[ch]: added "gboolean no_data" property which must be passed to gimp_new(). * app/display/gimpdisplay-foreach.[ch]: added gdisplays_set_busy() and gdisplays_unset_busy(). * app/gui/about-dialog.c: don't include "appenv.h", declare "double_speed" extern. * app/gui/brush-select.[ch] * app/gui/gradient-select.[ch] * app/gui/palette-select.[ch] * app/gui/pattern-select.[ch]: made the list of dialogs and the global selection dialogs private. Added functions which get a dialog by PDB callback_name. Pass a "Gimp" and the callback_name to the constructors. Don't include "app_procs.h" for "the_gimp" and "appenv.h" for "no_data" any more. Use the passed "Gimp" instead and look at gimp->no_data. * app/gui/toolbox.[ch]: pass a "Gimp" to the constructor. * app/gui/gui.[ch]: use the new gdisplays_[un]set_busy() functions, use the passed "Gimp" all over the place, don't include "appenv.h" and "app_procs.h". gui_really_quit_dialog() takes a "quit_func" callback now and calls it instead of calling app_exit_finish() (which is now private) directly. * app/gui/convert-dialog.c * app/gui/dialogs-constructors.c * app/gui/palette-import-dialog.c * tools/pdbgen/pdb/brush_select.pdb * tools/pdbgen/pdb/gradient_select.pdb * tools/pdbgen/pdb/pattern_select.pdb: changed accordingly. * app/pdb/brush_select_cmds.c * app/pdb/fileops_cmds.c * app/pdb/gradient_select_cmds.c * app/pdb/pattern_select_cmds.c: regenerated. 2001-10-25 Michael Natterer <mitch@gimp.org> * POTFILES.in: app/file-*.c -> app/file/file-*.c
2001-10-25 21:30:01 +08:00
GtkWidget *
about_dialog_create (void)
1997-11-25 06:05:25 +08:00
{
if (! about_info.about_dialog)
{
GtkWidget *widget;
GdkGCValues shape_gcv;
about_info.visible = FALSE;
about_info.state = 0;
about_info.animstep = -1;
widget = g_object_new (GTK_TYPE_WINDOW,
"type", GTK_WINDOW_POPUP,
"title", _("About The GIMP"),
"window_position", GTK_WIN_POS_CENTER,
"resizable", FALSE,
NULL);
about_info.about_dialog = widget;
gtk_window_set_role (GTK_WINDOW (widget), "about-dialog");
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;
1997-11-25 06:05:25 +08:00
}
about_dialog_center (GTK_WINDOW (widget));
/* 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;
1997-11-25 06:05:25 +08:00
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);
1997-11-25 06:05:25 +08:00
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);
1997-11-25 06:05:25 +08:00
}
if (! GTK_WIDGET_VISIBLE (about_info.about_dialog))
1997-11-25 06:05:25 +08:00
{
about_info.state = 0;
about_info.index = 0;
reshuffle_array ();
pango_layout_set_text (about_info.layout, "", -1);
1997-11-25 06:05:25 +08:00
}
gtk_window_present (GTK_WINDOW (about_info.about_dialog));
return about_info.about_dialog;
1997-11-25 06:05:25 +08:00
}
static void
about_dialog_destroy (GtkObject *object,
gpointer data)
1997-11-25 06:05:25 +08:00
{
about_info.about_dialog = NULL;
about_dialog_unmap (NULL, NULL);
1997-11-25 06:05:25 +08:00
}
static void
about_dialog_unmap (GtkWidget *widget,
gpointer data)
1997-11-25 06:05:25 +08:00
{
if (about_info.timer)
1997-11-25 06:05:25 +08:00
{
g_source_remove (about_info.timer);
about_info.timer = 0;
1997-11-25 06:05:25 +08:00
}
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);
}
1997-11-25 06:05:25 +08:00
}
static void
about_dialog_center (GtkWindow *window)
{
GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (window));
GdkScreen *screen;
GdkRectangle rect;
gint monitor;
gint x, y;
gdk_display_get_pointer (display, &screen, &x, &y, NULL);
monitor = gdk_screen_get_monitor_at_point (screen, x, y);
gdk_screen_get_monitor_geometry (screen, monitor, &rect);
gtk_window_set_screen (window, screen);
gtk_window_move (window,
2004-05-06 22:32:43 +08:00
rect.x + (rect.width - about_info.pixmaparea.width) / 2,
rect.y + (rect.height - about_info.pixmaparea.height) / 2);
}
static gboolean
1997-11-25 06:05:25 +08:00
about_dialog_logo_expose (GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
1997-11-25 06:05:25 +08:00
{
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)
1997-11-25 06:05:25 +08:00
{
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);
1997-11-25 06:05:25 +08:00
}
gdk_gc_set_clip_rectangle (widget->style->black_gc, NULL);
1997-11-25 06:05:25 +08:00
return FALSE;
}
new ui for the "Layer Offset" dialog. 1999-07-22 Michael Natterer <mitschel@cs.tu-berlin.de> * app/channel_ops.[ch]: new ui for the "Layer Offset" dialog. * app/channels_dialog.c * app/layers_dialog.c: major code cleanup: Folded some callbacks into common ones, "widget" instead of "w", indentation, ... * app/commands.c * app/interface.[ch] * app/global_edit.c: the query boxes must be shown by the caller now. There's no need to split up the string for the message box manually as the Gtk 1.2 label widget handles newlines corectly. Added the "edge_lock" toggle to the "Shrink Selection" dialog. Nicer spacings for the query and message boxes. * app/ink.c: tried to grab the pointer in the blob preview but failed. Left the code there as a reminder (commented out). * app/menus.c: reordered <Image>/Select. I was bored and grep-ed the sources for ancient or deprecated stuff: * app/about_dialog.[ch] * app/actionarea.[ch] * app/app_procs.c * app/brush_edit.c * app/brush_select.c * app/color_select.c * app/convert.c * app/devices.c * app/gdisplay.c * app/gdisplay_ops.c * app/histogram_tool.[ch] * app/info_window.c * app/install.c * app/ops_buttons.c * app/palette.c * app/palette_select.c * app/paths_dialog.c * app/pattern_select.c * app/resize.c * app/scale_toolc.c * app/text_tool.c: s/container_border_width/container_set_border_width/g, s/sprintf/g_snprintf/g, replaced some constant string lengths with strlen(x). * app/bezier_select.c * app/blend.c * app/boundary.c * app/errors.[ch] * app/free_select.c * app/gimpbrushlist.c * app/gimprc.c * app/iscissors.c * app/main.c * app/patterns.[ch] * app/text_tool.c: namespace fanaticism: prefixed all gimp error functions with "gimp_" and formated the messages more uniformly. * app/gradient.c * app/gradient_select.c: same stuff as above for the ui code. There are still some sub-dialogs which need cleanup. Did some cleanup in most of these files: prototypes, removed tons of #include's, i18n fixes, s/w/widget/ as above, indentation, ...
1999-07-23 00:21:10 +08:00
static gint
1997-11-25 06:05:25 +08:00
about_dialog_button (GtkWidget *widget,
GdkEventButton *event,
gpointer data)
1997-11-25 06:05:25 +08:00
{
gtk_widget_hide (about_info.about_dialog);
1997-11-25 06:05:25 +08:00
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);
}
added "wm_name", "wm_class", "display_name" and "monitor_number" to the 2003-11-07 Michael Natterer <mitch@gimp.org> * libgimpbase/gimpprotocol.[ch]: added "wm_name", "wm_class", "display_name" and "monitor_number" to the GPConfig message. Increased protocol version number. * libgimp/gimp.[ch] (gimp_config): read them from the GPConfig message and remember them. Added public accessors for the new config values. * libgimp/gimpui.c (gimp_ui_init): pass wm_name and wm_class to gtk_init() and export the display/screen to use to the environment. * app/core/gimp.[ch]: added vtable entries to get the values from the GUI. * app/gui/gui-vtable.c: implement the vtable entries. * app/plug-in/plug-in-run.c: fill in the GPConfig values using the new Gimp vtable functions. * app/display/gimpdisplayshell-layer-select.c * app/display/gimpdisplayshell.c * app/gui/about-dialog.c * app/gui/channels-commands.c * app/gui/color-notebook.c * app/gui/convert-dialog.c * app/gui/file-dialog-utils.[ch] * app/gui/file-new-dialog.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * app/gui/gradient-editor-commands.c * app/gui/gradients-commands.c * app/gui/grid-dialog.c * app/gui/image-commands.c * app/gui/info-dialog.[ch] * app/gui/info-window.c * app/gui/layers-commands.c * app/gui/module-browser.c * app/gui/offset-dialog.c * app/gui/palette-import-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/splash.c * app/gui/stroke-dialog.c * app/gui/templates-commands.c * app/gui/tips-dialog.c * app/gui/vectors-commands.c * app/tools/gimpcurvestool.c * app/tools/gimplevelstool.c * app/widgets/gimpdock.c * app/widgets/gimperrorconsole.c * app/widgets/gimptexteditor.c * app/widgets/gimptoolbox.c * app/widgets/gimpviewabledialog.[ch] * libgimpwidgets/gimpfileselection.c * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpunitmenu.c * plug-ins/helpbrowser/dialog.c * plug-ins/ifscompose/ifscompose.c: replaced all calls to gtk_window_set_wmclass() by gtk_window_set_role() and all "const gchar *wmclass_name" parameters by "const gchar *role". Cleaned up the window role strings.
2003-11-08 01:29:02 +08:00
g_free (normalized);
added "wm_name", "wm_class", "display_name" and "monitor_number" to the 2003-11-07 Michael Natterer <mitch@gimp.org> * libgimpbase/gimpprotocol.[ch]: added "wm_name", "wm_class", "display_name" and "monitor_number" to the GPConfig message. Increased protocol version number. * libgimp/gimp.[ch] (gimp_config): read them from the GPConfig message and remember them. Added public accessors for the new config values. * libgimp/gimpui.c (gimp_ui_init): pass wm_name and wm_class to gtk_init() and export the display/screen to use to the environment. * app/core/gimp.[ch]: added vtable entries to get the values from the GUI. * app/gui/gui-vtable.c: implement the vtable entries. * app/plug-in/plug-in-run.c: fill in the GPConfig values using the new Gimp vtable functions. * app/display/gimpdisplayshell-layer-select.c * app/display/gimpdisplayshell.c * app/gui/about-dialog.c * app/gui/channels-commands.c * app/gui/color-notebook.c * app/gui/convert-dialog.c * app/gui/file-dialog-utils.[ch] * app/gui/file-new-dialog.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * app/gui/gradient-editor-commands.c * app/gui/gradients-commands.c * app/gui/grid-dialog.c * app/gui/image-commands.c * app/gui/info-dialog.[ch] * app/gui/info-window.c * app/gui/layers-commands.c * app/gui/module-browser.c * app/gui/offset-dialog.c * app/gui/palette-import-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/splash.c * app/gui/stroke-dialog.c * app/gui/templates-commands.c * app/gui/tips-dialog.c * app/gui/vectors-commands.c * app/tools/gimpcurvestool.c * app/tools/gimplevelstool.c * app/widgets/gimpdock.c * app/widgets/gimperrorconsole.c * app/widgets/gimptexteditor.c * app/widgets/gimptoolbox.c * app/widgets/gimpviewabledialog.[ch] * libgimpwidgets/gimpfileselection.c * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpunitmenu.c * plug-ins/helpbrowser/dialog.c * plug-ins/ifscompose/ifscompose.c: replaced all calls to gtk_window_set_wmclass() by gtk_window_set_role() and all "const gchar *wmclass_name" parameters by "const gchar *role". Cleaned up the window role strings.
2003-11-08 01:29:02 +08:00
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;
added "wm_name", "wm_class", "display_name" and "monitor_number" to the 2003-11-07 Michael Natterer <mitch@gimp.org> * libgimpbase/gimpprotocol.[ch]: added "wm_name", "wm_class", "display_name" and "monitor_number" to the GPConfig message. Increased protocol version number. * libgimp/gimp.[ch] (gimp_config): read them from the GPConfig message and remember them. Added public accessors for the new config values. * libgimp/gimpui.c (gimp_ui_init): pass wm_name and wm_class to gtk_init() and export the display/screen to use to the environment. * app/core/gimp.[ch]: added vtable entries to get the values from the GUI. * app/gui/gui-vtable.c: implement the vtable entries. * app/plug-in/plug-in-run.c: fill in the GPConfig values using the new Gimp vtable functions. * app/display/gimpdisplayshell-layer-select.c * app/display/gimpdisplayshell.c * app/gui/about-dialog.c * app/gui/channels-commands.c * app/gui/color-notebook.c * app/gui/convert-dialog.c * app/gui/file-dialog-utils.[ch] * app/gui/file-new-dialog.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * app/gui/gradient-editor-commands.c * app/gui/gradients-commands.c * app/gui/grid-dialog.c * app/gui/image-commands.c * app/gui/info-dialog.[ch] * app/gui/info-window.c * app/gui/layers-commands.c * app/gui/module-browser.c * app/gui/offset-dialog.c * app/gui/palette-import-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/splash.c * app/gui/stroke-dialog.c * app/gui/templates-commands.c * app/gui/tips-dialog.c * app/gui/vectors-commands.c * app/tools/gimpcurvestool.c * app/tools/gimplevelstool.c * app/widgets/gimpdock.c * app/widgets/gimperrorconsole.c * app/widgets/gimptexteditor.c * app/widgets/gimptoolbox.c * app/widgets/gimpviewabledialog.[ch] * libgimpwidgets/gimpfileselection.c * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpunitmenu.c * plug-ins/helpbrowser/dialog.c * plug-ins/ifscompose/ifscompose.c: replaced all calls to gtk_window_set_wmclass() by gtk_window_set_role() and all "const gchar *wmclass_name" parameters by "const gchar *role". Cleaned up the window role strings.
2003-11-08 01:29:02 +08:00
}
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
1997-11-25 06:05:25 +08:00
about_dialog_timer (gpointer data)
{
gboolean return_val;
gint width, height;
gdouble size;
gchar *text;
1997-11-25 06:05:25 +08:00
return_val = TRUE;
if (about_info.animstep == 0)
1997-11-25 06:05:25 +08:00
{
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);
1997-11-25 06:05:25 +08:00
pango_font_description_set_size (font_desc, size * PANGO_SCALE);
pango_layout_set_font_description (about_info.layout, font_desc);
1997-11-25 06:05:25 +08:00
pango_layout_get_pixel_size (about_info.layout, &width, &height);
1997-11-25 06:05:25 +08:00
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);
}
}
1997-11-25 06:05:25 +08:00
about_info.animstep++;
1997-11-25 06:05:25 +08:00
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;
1997-11-25 06:05:25 +08:00
}
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);
1997-11-25 06:05:25 +08:00
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;
}