gimp/plug-ins/common/file-xbm.c

1296 lines
38 KiB
C
Raw Permalink Normal View History

/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* X10 and X11 bitmap (XBM) loading and exporting file filter for GIMP.
* XBM code Copyright (C) 1998 Gordon Matzigkeit
*
* The XBM reading and writing code was written from scratch by Gordon
* Matzigkeit <gord@gnu.org> based on the XReadBitmapFile(3X11) manual
* page distributed with X11R6 and by staring at valid XBM files. It
* does not contain any code written for other XBM file loaders.
*
* 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 3 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, see <https://www.gnu.org/licenses/>.
*/
/* Release 1.0, 1998-02-04, Gordon Matzigkeit <gord@gnu.org>:
* - Load and save X10 and X11 bitmaps.
* - Allow the user to specify the C identifier prefix.
*
* TODO:
* - Parsing is very tolerant, and the algorithms are quite hairy, so
* load_image should be carefully tested to make sure there are no XBM's
* that fail.
*/
configure.in removed tips files, AC_SUBST GIMP_PLUGINS and GIMP_MODULES so * configure.in * Makefile.am: removed tips files, AC_SUBST GIMP_PLUGINS and GIMP_MODULES so you can easily skip those parts of the build * acinclude.m4 * config.sub * config.guess * ltconfig * ltmain.sh: libtool 1.3.2 * app/fileops.c: shuffle #includes to avoid warning about MIN and MAX [ The following is a big i18n patch from David Monniaux <david.monniaux@ens.fr> ] * tips/gimp_conseils.fr.txt * tips/gimp_tips.txt * tips/Makefile.am * configure.in: moved tips to separate dir * po-plugins: new dir for plug-in translation files * configure.in: add po-plugins dir and POTFILES processing * app/boundary.c * app/brightness_contrast.c * app/by_color_select.c * app/color_balance.c * app/convert.c * app/curves.c * app/free_select.c * app/gdisplay.c * app/gimpimage.c * app/gimpunit.c * app/gradient.c * app/gradient_select.c * app/install.c * app/session.c: various i18n tweaks * app/tips_dialog.c: localize tips filename * libgimp/gimpunit.c * libgimp/gimpunitmenu.c: #include "config.h" * plug-ins/CEL * plug-ins/CML_explorer * plug-ins/Lighting * plug-ins/apply_lens * plug-ins/autostretch_hsv * plug-ins/blur * plug-ins/bmp * plug-ins/borderaverage * plug-ins/bumpmap * plug-ins/bz2 * plug-ins/checkerboard * plug-ins/colorify * plug-ins/compose * plug-ins/convmatrix * plug-ins/cubism * plug-ins/depthmerge * plug-ins/destripe * plug-ins/gif * plug-ins/gifload * plug-ins/jpeg * plug-ins/mail * plug-ins/oilify * plug-ins/png * plug-ins/print * plug-ins/ps * plug-ins/xbm * plug-ins/xpm * plug-ins/xwd: plug-in i18n stuff -Yosh
1999-05-29 16:35:47 +00:00
#include "config.h"
2000-01-11 15:48:00 +00:00
Cleaned up and improved the message system: 2003-06-13 Michael Natterer <mitch@gimp.org> Cleaned up and improved the message system: * app/core/gimp.[ch]: added "const gchar *domain" to GimpMessageFunc (a NULL domain means the message is from the GIMP core, everything else is a plug-in). * app/errors.c: pass "domain == NULL" to gimp_message(). * tools/pdbgen/pdb/message.pdb: derive the message domain from the current plug-in's menu_path (evil hack but works reasonably well). * app/pdb/message_cmds.c: regenerated. * app/widgets/gimpwidgets-utils.[ch] (gimp_message_box): added a header showing the message domain and changed the dialog layout to follow the HIG more closely. * app/gui/error-console-dialog.[ch]: removed. * app/widgets/gimperrorconsole.[ch] * app/gui/error-console-commands.[ch] * app/gui/error-console-menu.[ch]: new files containing a re-implementation of the error console dialog. * app/gui/Makefile.am * app/gui/dialogs-constructors.c * app/gui/gui.c * app/gui/menus.c * app/widgets/Makefile.am * app/widgets/widgets-types.h: changed accordingly. * app/display/gimpprogress.c: added more spacing and removed the separator (more HIG compliant). * plug-ins/[most plug-ins].c: Changed lots of messages and progress strings: - Removed plug-in names from messages since that's automatically covered by "domain" now. - Put all filenames in ''. - Changed "Loading" to "Opening". - Added "..." to all progress messages. - Cleaned up all file open/save error messages to look the same and include g_strerror(errno). - Removed special casing for progress bars and *always* show them, not only if run_mode != GIMP_RUN_NONINTERACTIVE (we can't expect all plug-ins to do this correctly but need to hack the core to sort out unwanted progress bars). Unrelated: - Cleaned up indentation, spacing, #includes, coding style and other stuff while I was at all these files.
2003-06-13 14:37:00 +00:00
#include <errno.h>
#include <string.h>
2000-01-11 15:48:00 +00:00
#include <glib/gstdio.h>
2000-01-11 15:48:00 +00:00
#include <libgimp/gimp.h>
#include <libgimp/gimpui.h>
configure.in removed tips files, AC_SUBST GIMP_PLUGINS and GIMP_MODULES so * configure.in * Makefile.am: removed tips files, AC_SUBST GIMP_PLUGINS and GIMP_MODULES so you can easily skip those parts of the build * acinclude.m4 * config.sub * config.guess * ltconfig * ltmain.sh: libtool 1.3.2 * app/fileops.c: shuffle #includes to avoid warning about MIN and MAX [ The following is a big i18n patch from David Monniaux <david.monniaux@ens.fr> ] * tips/gimp_conseils.fr.txt * tips/gimp_tips.txt * tips/Makefile.am * configure.in: moved tips to separate dir * po-plugins: new dir for plug-in translation files * configure.in: add po-plugins dir and POTFILES processing * app/boundary.c * app/brightness_contrast.c * app/by_color_select.c * app/color_balance.c * app/convert.c * app/curves.c * app/free_select.c * app/gdisplay.c * app/gimpimage.c * app/gimpunit.c * app/gradient.c * app/gradient_select.c * app/install.c * app/session.c: various i18n tweaks * app/tips_dialog.c: localize tips filename * libgimp/gimpunit.c * libgimp/gimpunitmenu.c: #include "config.h" * plug-ins/CEL * plug-ins/CML_explorer * plug-ins/Lighting * plug-ins/apply_lens * plug-ins/autostretch_hsv * plug-ins/blur * plug-ins/bmp * plug-ins/borderaverage * plug-ins/bumpmap * plug-ins/bz2 * plug-ins/checkerboard * plug-ins/colorify * plug-ins/compose * plug-ins/convmatrix * plug-ins/cubism * plug-ins/depthmerge * plug-ins/destripe * plug-ins/gif * plug-ins/gifload * plug-ins/jpeg * plug-ins/mail * plug-ins/oilify * plug-ins/png * plug-ins/print * plug-ins/ps * plug-ins/xbm * plug-ins/xpm * plug-ins/xwd: plug-in i18n stuff -Yosh
1999-05-29 16:35:47 +00:00
#include "libgimp/stdplugins-intl.h"
#define LOAD_PROC "file-xbm-load"
#define EXPORT_PROC "file-xbm-export"
#define PLUG_IN_BINARY "file-xbm"
#define MAX_COMMENT 72
#define MAX_MASK_EXT 32
#define MAX_PREFIX 64
typedef struct _Xbm Xbm;
typedef struct _XbmClass XbmClass;
struct _Xbm
{
GimpPlugIn parent_instance;
};
struct _XbmClass
{
GimpPlugInClass parent_class;
};
#define XBM_TYPE (xbm_get_type ())
#define XBM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XBM_TYPE, Xbm))
GType xbm_get_type (void) G_GNUC_CONST;
static GList * xbm_query_procedures (GimpPlugIn *plug_in);
static GimpProcedure * xbm_create_procedure (GimpPlugIn *plug_in,
const gchar *name);
static GimpValueArray * xbm_load (GimpProcedure *procedure,
GimpRunMode run_mode,
GFile *file,
GimpMetadata *metadata,
GimpMetadataLoadFlags *flags,
GimpProcedureConfig *config,
gpointer run_data);
static GimpValueArray * xbm_export (GimpProcedure *procedure,
GimpRunMode run_mode,
GimpImage *image,
GFile *file,
GimpExportOptions *options,
GimpMetadata *metadata,
GimpProcedureConfig *config,
gpointer run_data);
static GimpImage * load_image (GFile *file,
GError **error);
static gboolean export_image (GFile *file,
const gchar *prefix,
gboolean save_mask,
GimpImage *image,
GimpDrawable *drawable,
GObject *config,
GError **error);
static gboolean save_dialog (GimpImage *image,
GimpDrawable *drawable,
GimpProcedure *procedure,
GObject *config);
static gboolean print (GOutputStream *output,
GError **error,
const gchar *format,
...) G_GNUC_PRINTF (3, 4);
G_DEFINE_TYPE (Xbm, xbm, GIMP_TYPE_PLUG_IN)
GIMP_MAIN (XBM_TYPE)
DEFINE_STD_SET_I18N
static void
xbm_class_init (XbmClass *klass)
{
GimpPlugInClass *plug_in_class = GIMP_PLUG_IN_CLASS (klass);
plug_in_class->query_procedures = xbm_query_procedures;
plug_in_class->create_procedure = xbm_create_procedure;
plug_in_class->set_i18n = STD_SET_I18N;
}
static void
xbm_init (Xbm *xbm)
{
}
static GList *
xbm_query_procedures (GimpPlugIn *plug_in)
{
GList *list = NULL;
list = g_list_append (list, g_strdup (LOAD_PROC));
list = g_list_append (list, g_strdup (EXPORT_PROC));
return list;
}
static GimpProcedure *
xbm_create_procedure (GimpPlugIn *plug_in,
const gchar *name)
{
GimpProcedure *procedure = NULL;
if (! strcmp (name, LOAD_PROC))
{
procedure = gimp_load_procedure_new (plug_in, name,
GIMP_PDB_PROC_TYPE_PLUGIN,
xbm_load, NULL, NULL);
gimp_procedure_set_menu_label (procedure, _("X BitMap image"));
gimp_procedure_set_documentation (procedure,
_("Load a file in X10 or X11 bitmap "
"(XBM) file format"),
_("Load a file in X10 or X11 bitmap "
"(XBM) file format. XBM is a lossless "
"format for flat black-and-white "
"(two color indexed) images."),
name);
gimp_procedure_set_attribution (procedure,
"Gordon Matzigkeit",
"Gordon Matzigkeit",
"1998");
gimp_file_procedure_set_mime_types (GIMP_FILE_PROCEDURE (procedure),
"image/x-xbitmap");
gimp_file_procedure_set_extensions (GIMP_FILE_PROCEDURE (procedure),
"xbm,icon,bitmap");
}
else if (! strcmp (name, EXPORT_PROC))
{
procedure = gimp_export_procedure_new (plug_in, name,
GIMP_PDB_PROC_TYPE_PLUGIN,
FALSE, xbm_export, NULL, NULL);
gimp_procedure_set_image_types (procedure, "INDEXED");
gimp_procedure_set_menu_label (procedure, _("X BitMap image"));
gimp_procedure_set_documentation (procedure,
_("Export a file in X10 or X11 bitmap "
"(XBM) file format"),
_("X10 or X11 bitmap "
"(XBM) file format. XBM is a lossless "
"format for flat black-and-white "
"(two color indexed) images."),
name);
gimp_procedure_set_attribution (procedure,
"Gordon Matzigkeit",
"Gordon Matzigkeit",
"1998");
gimp_file_procedure_set_format_name (GIMP_FILE_PROCEDURE (procedure),
_("XBM"));
gimp_file_procedure_set_handles_remote (GIMP_FILE_PROCEDURE (procedure),
TRUE);
gimp_file_procedure_set_mime_types (GIMP_FILE_PROCEDURE (procedure),
"image/x-xbitmap");
gimp_file_procedure_set_extensions (GIMP_FILE_PROCEDURE (procedure),
"xbm,icon,bitmap");
gimp_export_procedure_set_capabilities (GIMP_EXPORT_PROCEDURE (procedure),
GIMP_EXPORT_CAN_HANDLE_BITMAP |
GIMP_EXPORT_CAN_HANDLE_ALPHA,
app, libgimp*, pdb, plug-ins: review and enhance MR !1549. - Fix annotations for gimp_export_options_get_image() to make it actually introspectable with the GimpImage being both input and output. Even though the logic doesn't change much (the input image may be overriden or not), it doesn't matter for introspection because images are handled centrally by libgimp and therefore must not be freed. Actually deleting the image from the central list of images though remains a manual action depending on code logic, not some automatic action to be handled by binding engines. - Add G_GNUC_WARN_UNUSED_RESULT to gimp_export_options_get_image() because ignoring the returned value is rarely a good idea (as you usually want to delete the image). - Remove gimp_export_options_new(): we don't need this constructor because at this point, the best is to tell plug-in developers to just pass NULL everywhere. This leaves us free to create a more useful default constructor if needed, in the future. Main description for GimpExportOptions has also been updated to say this. - Add a data_destroy callback for the user data passed in gimp_export_procedure_set_capabilities(). - Fixing annotations of 'export_options' object from pdb/pdb.pl: input args would actually be (nullable) and would not transfer ownership (calling code must still free the object). Return value's ownership on the other hand is fully transfered. - Add C and Python unit testing for GimpExportOptions and gimp_export_options_get_image() in particular. - Fix or improve various details. Note that I have also considered for a long time changing the signature of gimp_export_options_get_image() to return a boolean indicating whether `image` had been replaced (hence needed deletion) or not. This also meant getting rid of the GimpExportReturn enum. Right now it would work because there are no third case, but I was considering the future possibility that for instance we got some impossible conversion for some future capability. I'm not sure it would ever happen; and for sure, this is not desirable because it implies an export failure a bit late in the workflow. But just in case, let's keep the enum return value. It does not even make the using code that much more complicated (well just a value comparison instead of a simple boolean test).
2024-08-17 15:06:27 +02:00
NULL, NULL, NULL);
gimp_procedure_add_boolean_argument (procedure, "include-comment",
_("_Write comment"),
_("Write a comment at the beginning of the file."),
FALSE, /* *NOT* gimp_export_comment() */
G_PARAM_READWRITE);
gimp_procedure_add_string_argument (procedure, "gimp-comment",
_("Co_mment"),
_("Image description (maximum 72 bytes)"),
gimp_get_default_comment (),
G_PARAM_READWRITE);
gimp_procedure_set_argument_sync (procedure, "gimp-comment",
GIMP_ARGUMENT_SYNC_PARASITE);
gimp_procedure_add_boolean_argument (procedure, "x10-format",
_("_X10 format bitmap"),
_("Export in X10 format"),
FALSE,
G_PARAM_READWRITE);
gimp_procedure_add_boolean_argument (procedure, "use-hot-spot",
_("Write hot spot _values"),
_("Write hotspot information"),
FALSE,
G_PARAM_READWRITE);
gimp_procedure_add_int_argument (procedure, "hot-spot-x",
_("Hot s_pot X"),
_("X coordinate of hotspot"),
0, GIMP_MAX_IMAGE_SIZE, 0,
G_PARAM_READWRITE);
gimp_procedure_add_int_argument (procedure, "hot-spot-y",
_("Hot spot _Y"),
_("Y coordinate of hotspot"),
0, GIMP_MAX_IMAGE_SIZE, 0,
G_PARAM_READWRITE);
gimp_procedure_add_string_argument (procedure, "prefix",
_("I_dentifier prefix"),
_("Identifier prefix [determined from filename]"),
"bitmap",
G_PARAM_READWRITE);
gimp_procedure_add_boolean_argument (procedure, "write-mask",
_("Write extra mask _file"),
_("Write extra mask file"),
FALSE,
G_PARAM_READWRITE);
gimp_procedure_add_string_argument (procedure, "mask-suffix",
_("Mas_k file extensions"),
_("Suffix of the mask file"),
"-mask",
G_PARAM_READWRITE);
}
return procedure;
}
static GimpValueArray *
xbm_load (GimpProcedure *procedure,
GimpRunMode run_mode,
GFile *file,
GimpMetadata *metadata,
GimpMetadataLoadFlags *flags,
GimpProcedureConfig *config,
gpointer run_data)
{
GimpValueArray *return_vals;
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
GimpImage *image;
GError *error = NULL;
gegl_init (NULL, NULL);
image = load_image (file, &error);
if (! image)
return gimp_procedure_new_return_values (procedure, status, error);
return_vals = gimp_procedure_new_return_values (procedure,
GIMP_PDB_SUCCESS,
NULL);
GIMP_VALUES_SET_IMAGE (return_vals, 1, image);
return return_vals;
}
static gchar *
init_prefix (GFile *file,
GObject *config)
{
configure.in po-plug-ins/POTFILES.in plug-ins/common/Makefile.am 2000-01-25 Michael Natterer <mitch@gimp.org> * configure.in * po-plug-ins/POTFILES.in * plug-ins/common/Makefile.am * plug-ins/common/plugin-defs.pl * plug-ins/megawidget/*: removed. (There were only 3 functions left which were used by ~5 plugins, so I moved the resp. functions to the plugins). More preview stuff to come... * app/airbrush_blob.c * modules/colorsel_triangle.c * modules/colorsel_water.c: use G_PI instead of M_PI. * app/procedural_db.h * libgimp/gimpenums.h * plug-ins/script-fu/script-fu-constants.c * tools/pdbgen/enums.pl: new PDB return value STATUS_CANCEL which indicates that "Cancel" was pressed in a plugin dialog. (Useful only for file load/save plugins). * app/fileops.[ch] * app/menus.c: changes to handle STATUS_CANCEL correctly. Did some code cleanup in fileops.[ch]. Pop up a warning if File->Save failed. * app/plug_in.c: return_val[0] is of type PDB_STATUS, not PDB_INT32. * libgimp/gimpmath.h: new constant G_MAXRAND which equals to RAND_MAX if it exists or to G_MAXINT otherwise. * libgimp/gimpwidgets.[ch]: new function gimp_random_seed_new() which creates a spinbutton and a "Time" toggle. Call the function which does the "set_sensitive" magic from the radio button callback. * plug-ins/[75 plugins]: - Return STATUS_CANCEL in all file load/save dialogs if "Cancel" was pressed. - Standardized the file plugins' "run" functions. - Use G_PI and G_MAXRAND everywhere. - Added tons of scales and spinbuttons instead of text entries. - Applied uniform packing/spacings all over the place. - Reorganized some UIs (stuff like moving the preview to the top left corner of the dialog). - Removed many ui helper functions and callbacks and use the stuff from libgimp instead. - I tried not to restrict the range of possible values when I replaced entries with spinbuttons/scales but may have failed, though in some cases. Please test ;-) - #include <libgimp/gimpmath.h> where appropriate and use it's constants. - Indentation, s/int/gint/ et.al., code cleanup. RFC: The plugins are definitely not useable with GIMP 1.0 any more, so shouldn't we remove all the remaining compatibility stuff ??? (like "#ifdef GIMP_HAVE_PARASITES")
2000-01-25 17:46:56 +00:00
gchar *p, *prefix;
gint len;
prefix = g_file_get_basename (file);
g_object_set (config,
"prefix", NULL,
NULL);
if (prefix)
{
/* Strip any extension. */
p = strrchr (prefix, '.');
if (p && p != prefix)
len = MIN (MAX_PREFIX, p - prefix);
else
len = MAX_PREFIX;
prefix[len] = '\0';
g_object_set (config,
"prefix", prefix,
NULL);
}
return prefix;
}
static GimpValueArray *
xbm_export (GimpProcedure *procedure,
GimpRunMode run_mode,
GimpImage *image,
GFile *file,
GimpExportOptions *options,
GimpMetadata *metadata,
GimpProcedureConfig *config,
gpointer run_data)
{
GimpPDBStatusType status = GIMP_PDB_SUCCESS;
GimpExportReturn export = GIMP_EXPORT_IGNORE;
GList *drawables;
gchar *mask_basename = NULL;
GError *error = NULL;
2012-11-18 23:22:07 +01:00
gegl_init (NULL, NULL);
if (run_mode == GIMP_RUN_INTERACTIVE ||
run_mode == GIMP_RUN_WITH_LAST_VALS)
{
/* Always override the prefix with the filename. */
mask_basename = g_strdup (init_prefix (file, G_OBJECT (config)));
}
export = gimp_export_options_get_image (options, &image);
drawables = gimp_image_list_layers (image);
if (run_mode == GIMP_RUN_INTERACTIVE)
{
GimpParasite *parasite;
gimp_ui_init (PLUG_IN_BINARY);
parasite = gimp_image_get_parasite (image, "hot-spot");
if (parasite)
{
gchar *parasite_data;
guint32 parasite_size;
gint x, y;
parasite_data = (gchar *) gimp_parasite_get_data (parasite, &parasite_size);
parasite_data = g_strndup (parasite_data, parasite_size);
if (sscanf (parasite_data, "%i %i", &x, &y) == 2)
{
g_object_set (config,
"use-hot-spot", TRUE,
"hot-spot-x", x,
"hot-spot-y", y,
NULL);
}
gimp_parasite_free (parasite);
g_free (parasite_data);
}
if (! save_dialog (image, drawables->data, procedure, G_OBJECT (config)))
status = GIMP_PDB_CANCEL;
}
if (status == GIMP_PDB_SUCCESS)
{
GFile *mask_file;
GFile *dir;
gchar *mask_prefix;
gchar *mask_ext;
gchar *prefix;
gchar *temp;
gboolean write_mask;
g_object_get (config,
"prefix", &prefix,
"mask-suffix", &mask_ext,
"write-mask", &write_mask,
NULL);
dir = g_file_get_parent (file);
temp = g_strdup_printf ("%s%s.xbm", mask_basename, mask_ext);
mask_file = g_file_get_child (dir, temp);
g_free (temp);
g_object_unref (dir);
/* Change any non-alphanumeric prefix characters to underscores. */
for (temp = prefix; *temp; temp++)
if (! g_ascii_isalnum (*temp))
*temp = '_';
g_object_set (config,
"prefix", prefix,
NULL);
mask_prefix = g_strdup_printf ("%s%s", prefix, mask_ext);
for (temp = mask_prefix; *temp; temp++)
if (! g_ascii_isalnum (*temp))
*temp = '_';
if (! export_image (file,
prefix,
FALSE,
image, drawables->data,
G_OBJECT (config),
&error)
||
(write_mask &&
! export_image (mask_file,
mask_prefix,
TRUE,
image, drawables->data,
G_OBJECT (config),
&error)))
{
status = GIMP_PDB_EXECUTION_ERROR;
}
1999-10-14 02:11:52 +00:00
g_free (prefix);
g_free (mask_prefix);
g_free (mask_ext);
g_free (mask_basename);
g_object_unref (mask_file);
}
if (export == GIMP_EXPORT_EXPORT)
gimp_image_delete (image);
g_list_free (drawables);
return gimp_procedure_new_return_values (procedure, status, error);
}
/* Return the value of a digit. */
static gint
removed our own action_area API and use GtkDialog's one. Create all 2003-11-06 Michael Natterer <mitch@gimp.org> * libgimpwidgets/gimpdialog.[ch]: removed our own action_area API and use GtkDialog's one. Create all dialogs without separator. Changed almost everything else too. Fixes bug #125143. * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpunitmenu.c: changed accordingly. * libgimp/gimpexport.[ch]: ditto. Renamed enum GimpExportReturnType to GimpExportReturn. * libgimp/gimpcompat.h: added a #define for the old name. * themes/Default/gtkrc: increased action_area border to 6 pixels. * app/display/gimpdisplayshell-filter-dialog.c * app/display/gimpdisplayshell-scale.c * app/display/gimpprogress.c * app/gui/brush-select.c * app/gui/channels-commands.c * app/gui/color-notebook.c * app/gui/convert-dialog.c * app/gui/file-new-dialog.c * app/gui/font-select.c * app/gui/gradient-editor-commands.c * app/gui/gradient-select.c * app/gui/grid-dialog.c * app/gui/image-commands.c * 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/palette-select.c * app/gui/pattern-select.c * app/gui/preferences-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/resolution-calibrate-dialog.c * app/gui/stroke-dialog.c * app/gui/templates-commands.c * app/gui/user-install-dialog.c * app/gui/vectors-commands.c * app/tools/gimpcolorpickertool.c * app/tools/gimpcroptool.c * app/tools/gimpimagemaptool.c * app/tools/gimpmeasuretool.c * app/tools/gimptransformtool.c * app/widgets/gimptexteditor.c * app/widgets/gimptooldialog.[ch] * app/widgets/gimpviewabledialog.[ch] * app/widgets/gimpwidgets-utils.c: changed accordingly and increased the dialogs' outer borders to 6 pixels all over the place. * plug-ins/*/*.c: changed accordingly. The plug-ins may be arbitrarily broken, I tested none of them.
2003-11-06 15:27:05 +00:00
getval (gint c,
gint base)
{
const gchar *digits = "0123456789abcdefABCDEF";
gint val;
/* Include uppercase hex digits. */
if (base == 16)
base = 22;
/* Find a match. */
for (val = 0; val < base; val ++)
if (c == digits[val])
return (val < 16) ? val : (val - 6);
return -1;
}
/* Get a comment */
static gchar *
fgetcomment (FILE *fp)
{
GString *str = NULL;
gint comment, c;
comment = 0;
do
{
c = fgetc (fp);
if (comment)
{
if (c == '*')
{
/* In a comment, with potential to leave. */
comment = 1;
}
else if (comment == 1 && c == '/')
{
gchar *retval;
/* Leaving a comment. */
comment = 0;
retval = g_strstrip (g_strdup (str->str));
g_string_free (str, TRUE);
return retval;
}
else
{
/* In a comment, with no potential to leave. */
comment = 2;
g_string_append_c (str, c);
}
}
else
{
/* Not in a comment. */
if (c == '/')
{
/* Potential to enter a comment. */
c = fgetc (fp);
if (c == '*')
{
/* Entered a comment, with no potential to leave. */
comment = 2;
str = g_string_new (NULL);
}
else
{
/* put everything back and return */
ungetc (c, fp);
c = '/';
ungetc (c, fp);
return NULL;
}
}
else if (c != EOF && g_ascii_isspace (c))
{
/* Skip leading whitespace */
continue;
}
}
}
while (comment && c != EOF);
if (str)
g_string_free (str, TRUE);
return NULL;
}
/* Same as fgetc, but skip C-style comments and insert whitespace. */
static gint
cpp_fgetc (FILE *fp)
{
configure.in po-plug-ins/POTFILES.in plug-ins/common/Makefile.am 2000-01-25 Michael Natterer <mitch@gimp.org> * configure.in * po-plug-ins/POTFILES.in * plug-ins/common/Makefile.am * plug-ins/common/plugin-defs.pl * plug-ins/megawidget/*: removed. (There were only 3 functions left which were used by ~5 plugins, so I moved the resp. functions to the plugins). More preview stuff to come... * app/airbrush_blob.c * modules/colorsel_triangle.c * modules/colorsel_water.c: use G_PI instead of M_PI. * app/procedural_db.h * libgimp/gimpenums.h * plug-ins/script-fu/script-fu-constants.c * tools/pdbgen/enums.pl: new PDB return value STATUS_CANCEL which indicates that "Cancel" was pressed in a plugin dialog. (Useful only for file load/save plugins). * app/fileops.[ch] * app/menus.c: changes to handle STATUS_CANCEL correctly. Did some code cleanup in fileops.[ch]. Pop up a warning if File->Save failed. * app/plug_in.c: return_val[0] is of type PDB_STATUS, not PDB_INT32. * libgimp/gimpmath.h: new constant G_MAXRAND which equals to RAND_MAX if it exists or to G_MAXINT otherwise. * libgimp/gimpwidgets.[ch]: new function gimp_random_seed_new() which creates a spinbutton and a "Time" toggle. Call the function which does the "set_sensitive" magic from the radio button callback. * plug-ins/[75 plugins]: - Return STATUS_CANCEL in all file load/save dialogs if "Cancel" was pressed. - Standardized the file plugins' "run" functions. - Use G_PI and G_MAXRAND everywhere. - Added tons of scales and spinbuttons instead of text entries. - Applied uniform packing/spacings all over the place. - Reorganized some UIs (stuff like moving the preview to the top left corner of the dialog). - Removed many ui helper functions and callbacks and use the stuff from libgimp instead. - I tried not to restrict the range of possible values when I replaced entries with spinbuttons/scales but may have failed, though in some cases. Please test ;-) - #include <libgimp/gimpmath.h> where appropriate and use it's constants. - Indentation, s/int/gint/ et.al., code cleanup. RFC: The plugins are definitely not useable with GIMP 1.0 any more, so shouldn't we remove all the remaining compatibility stuff ??? (like "#ifdef GIMP_HAVE_PARASITES")
2000-01-25 17:46:56 +00:00
gint comment, c;
/* FIXME: insert whitespace as advertised. */
comment = 0;
do
{
c = fgetc (fp);
if (comment)
{
if (c == '*')
/* In a comment, with potential to leave. */
comment = 1;
else if (comment == 1 && c == '/')
/* Leaving a comment. */
comment = 0;
else
/* In a comment, with no potential to leave. */
comment = 2;
}
else
{
/* Not in a comment. */
if (c == '/')
{
/* Potential to enter a comment. */
c = fgetc (fp);
if (c == '*')
/* Entered a comment, with no potential to leave. */
comment = 2;
else
{
/* Just a slash in the open. */
ungetc (c, fp);
c = '/';
}
}
}
}
while (comment && c != EOF);
return c;
}
/* Match a string with a file. */
static gint
match (FILE *fp,
const gchar *s)
{
configure.in po-plug-ins/POTFILES.in plug-ins/common/Makefile.am 2000-01-25 Michael Natterer <mitch@gimp.org> * configure.in * po-plug-ins/POTFILES.in * plug-ins/common/Makefile.am * plug-ins/common/plugin-defs.pl * plug-ins/megawidget/*: removed. (There were only 3 functions left which were used by ~5 plugins, so I moved the resp. functions to the plugins). More preview stuff to come... * app/airbrush_blob.c * modules/colorsel_triangle.c * modules/colorsel_water.c: use G_PI instead of M_PI. * app/procedural_db.h * libgimp/gimpenums.h * plug-ins/script-fu/script-fu-constants.c * tools/pdbgen/enums.pl: new PDB return value STATUS_CANCEL which indicates that "Cancel" was pressed in a plugin dialog. (Useful only for file load/save plugins). * app/fileops.[ch] * app/menus.c: changes to handle STATUS_CANCEL correctly. Did some code cleanup in fileops.[ch]. Pop up a warning if File->Save failed. * app/plug_in.c: return_val[0] is of type PDB_STATUS, not PDB_INT32. * libgimp/gimpmath.h: new constant G_MAXRAND which equals to RAND_MAX if it exists or to G_MAXINT otherwise. * libgimp/gimpwidgets.[ch]: new function gimp_random_seed_new() which creates a spinbutton and a "Time" toggle. Call the function which does the "set_sensitive" magic from the radio button callback. * plug-ins/[75 plugins]: - Return STATUS_CANCEL in all file load/save dialogs if "Cancel" was pressed. - Standardized the file plugins' "run" functions. - Use G_PI and G_MAXRAND everywhere. - Added tons of scales and spinbuttons instead of text entries. - Applied uniform packing/spacings all over the place. - Reorganized some UIs (stuff like moving the preview to the top left corner of the dialog). - Removed many ui helper functions and callbacks and use the stuff from libgimp instead. - I tried not to restrict the range of possible values when I replaced entries with spinbuttons/scales but may have failed, though in some cases. Please test ;-) - #include <libgimp/gimpmath.h> where appropriate and use it's constants. - Indentation, s/int/gint/ et.al., code cleanup. RFC: The plugins are definitely not useable with GIMP 1.0 any more, so shouldn't we remove all the remaining compatibility stuff ??? (like "#ifdef GIMP_HAVE_PARASITES")
2000-01-25 17:46:56 +00:00
gint c;
do
{
c = fgetc (fp);
if (c == *s)
s ++;
else
break;
}
while (c != EOF && *s);
if (!*s)
return TRUE;
if (c != EOF)
ungetc (c, fp);
return FALSE;
}
/* Read the next integer from the file, skipping all non-integers. */
static gint
get_int (FILE *fp)
{
int digval, base, val, c;
do
c = cpp_fgetc (fp);
while (c != EOF && ! g_ascii_isdigit (c));
if (c == EOF)
return 0;
/* Check for the base. */
if (c == '0')
{
c = fgetc (fp);
if (c == 'x' || c == 'X')
{
c = fgetc (fp);
base = 16;
}
else if (g_ascii_isdigit (c))
base = 8;
else
{
ungetc (c, fp);
return 0;
}
}
else
base = 10;
val = 0;
for (;;)
{
digval = getval (c, base);
if (digval == -1)
{
ungetc (c, fp);
break;
}
val *= base;
val += digval;
c = fgetc (fp);
}
return val;
}
static GimpImage *
load_image (GFile *file,
GError **error)
{
FILE *fp;
GeglBuffer *buffer;
GimpImage *image;
GimpLayer *layer;
guchar *data;
gint intbits;
gint width = 0;
gint height = 0;
gint x_hot = 0;
gint y_hot = 0;
gint c, i, j, k;
gint tileheight, rowoffset;
gchar *comment;
const guchar cmap[] =
{
0x00, 0x00, 0x00, /* black */
0xff, 0xff, 0xff /* white */
};
gimp_progress_init_printf (_("Opening '%s'"),
gimp_file_get_utf8_name (file));
fp = g_fopen (g_file_peek_path (file), "rb");
if (! fp)
{
g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (errno),
_("Could not open '%s' for reading: %s"),
gimp_file_get_utf8_name (file), g_strerror (errno));
return NULL;
}
comment = fgetcomment (fp);
/* Loosely parse the header */
intbits = height = width = 0;
c = ' ';
do
{
if (g_ascii_isspace (c))
{
if (match (fp, "char"))
{
c = fgetc (fp);
if (g_ascii_isspace (c))
{
intbits = 8;
continue;
}
}
else if (match (fp, "short"))
{
c = fgetc (fp);
if (g_ascii_isspace (c))
{
intbits = 16;
continue;
}
}
}
if (c == '_')
{
if (match (fp, "width"))
{
c = fgetc (fp);
if (g_ascii_isspace (c))
{
width = get_int (fp);
continue;
}
}
else if (match (fp, "height"))
{
c = fgetc (fp);
if (g_ascii_isspace (c))
{
height = get_int (fp);
continue;
}
}
else if (match (fp, "x_hot"))
{
c = fgetc (fp);
if (g_ascii_isspace (c))
{
x_hot = get_int (fp);
continue;
}
}
else if (match (fp, "y_hot"))
{
c = fgetc (fp);
if (g_ascii_isspace (c))
{
y_hot = get_int (fp);
continue;
}
}
}
c = cpp_fgetc (fp);
}
while (c != '{' && c != EOF);
if (c == EOF)
{
plug-ins/FractalExplorer/Dialogs.c 2003-11-15 Michael Natterer <mitch@gimp.org> * plug-ins/FractalExplorer/Dialogs.c * plug-ins/FractalExplorer/FractalExplorer.c * plug-ins/bmp/bmpread.c * plug-ins/bmp/bmpwrite.c * plug-ins/common/CEL.c * plug-ins/common/CML_explorer.c * plug-ins/common/animoptimize.c * plug-ins/common/bz2.c * plug-ins/common/convmatrix.c * plug-ins/common/curve_bend.c * plug-ins/common/dicom.c * plug-ins/common/gauss_iir.c * plug-ins/common/gauss_rle.c * plug-ins/common/gbr.c * plug-ins/common/gif.c * plug-ins/common/gifload.c * plug-ins/common/gih.c * plug-ins/common/grid.c * plug-ins/common/gtm.c * plug-ins/common/gz.c * plug-ins/common/hrz.c * plug-ins/common/jpeg.c * plug-ins/common/mail.c * plug-ins/common/mapcolor.c * plug-ins/common/pat.c * plug-ins/common/pcx.c * plug-ins/common/pix.c * plug-ins/common/png.c * plug-ins/common/pnm.c * plug-ins/common/ps.c * plug-ins/common/psd.c * plug-ins/common/psd_save.c * plug-ins/common/psp.c * plug-ins/common/sel_gauss.c * plug-ins/common/spheredesigner.c * plug-ins/common/sunras.c * plug-ins/common/svg.c * plug-ins/common/tga.c * plug-ins/common/tiff.c * plug-ins/common/wmf.c * plug-ins/common/xbm.c * plug-ins/common/xwd.c * plug-ins/faxg3/faxg3.c * plug-ins/fits/fits.c * plug-ins/flame/flame.c * plug-ins/gfig/gfig.c * plug-ins/gflare/gflare.c * plug-ins/gfli/gfli.c * plug-ins/gimpressionist/brush.c * plug-ins/gimpressionist/ppmtool.c * plug-ins/helpbrowser/domain.c * plug-ins/ifscompose/ifscompose.c * plug-ins/sgi/sgi.c * plug-ins/twain/twain.c * plug-ins/winsnap/winsnap.c * plug-ins/xjt/xjt.c: removed explicit newlines from messages. Made file open/save messages the same all over the place. Reduced number of translatable strings by adding some more "standard" messages. Removed plug-in names from messages. Added some random mnemonics. Unmarked some strings for translation and added some that were forgotten. General message cleanup. Removed trailing whitespace.
2003-11-15 13:53:33 +00:00
g_message (_("'%s':\nCould not read header (ftell == %ld)"),
gimp_file_get_utf8_name (file), ftell (fp));
fclose (fp);
return NULL;
}
if (width <= 0)
{
2004-01-19 03:06:04 +00:00
g_message (_("'%s':\nNo image width specified"),
gimp_file_get_utf8_name (file));
fclose (fp);
return NULL;
}
if (width > GIMP_MAX_IMAGE_SIZE)
{
g_message (_("'%s':\nImage width is larger than GIMP can handle"),
gimp_file_get_utf8_name (file));
fclose (fp);
return NULL;
}
if (height <= 0)
{
2004-01-19 03:06:04 +00:00
g_message (_("'%s':\nNo image height specified"),
gimp_file_get_utf8_name (file));
fclose (fp);
return NULL;
}
if (height > GIMP_MAX_IMAGE_SIZE)
{
g_message (_("'%s':\nImage height is larger than GIMP can handle"),
gimp_file_get_utf8_name (file));
fclose (fp);
return NULL;
}
if (intbits == 0)
{
2004-01-19 03:06:04 +00:00
g_message (_("'%s':\nNo image data type specified"),
gimp_file_get_utf8_name (file));
fclose (fp);
return NULL;
}
image = gimp_image_new (width, height, GIMP_INDEXED);
if (comment)
{
GimpParasite *parasite;
parasite = gimp_parasite_new ("gimp-comment",
GIMP_PARASITE_PERSISTENT,
strlen (comment) + 1, (gpointer) comment);
gimp_image_attach_parasite (image, parasite);
gimp_parasite_free (parasite);
g_free (comment);
}
x_hot = CLAMP (x_hot, 0, width);
y_hot = CLAMP (y_hot, 0, height);
if (x_hot > 0 || y_hot > 0)
{
GimpParasite *parasite;
gchar *str;
str = g_strdup_printf ("%d %d", x_hot, y_hot);
parasite = gimp_parasite_new ("hot-spot",
GIMP_PARASITE_PERSISTENT,
strlen (str) + 1, (gpointer) str);
g_free (str);
gimp_image_attach_parasite (image, parasite);
gimp_parasite_free (parasite);
}
/* Set a black-and-white colormap. */
gimp_palette_set_colormap (gimp_image_get_palette (image), babl_format ("R'G'B' u8"), (guint8 *) cmap, 2 * 3);
layer = gimp_layer_new (image,
_("Background"),
width, height,
GIMP_INDEXED_IMAGE,
100,
gimp_image_get_default_new_layer_mode (image));
gimp_image_insert_layer (image, layer, NULL, 0);
buffer = gimp_drawable_get_buffer (GIMP_DRAWABLE (layer));
/* Allocate the data. */
tileheight = gimp_tile_height ();
data = (guchar *) g_malloc (width * tileheight);
for (i = 0; i < height; i += tileheight)
{
tileheight = MIN (tileheight, height - i);
/* Parse the data from the file */
for (j = 0; j < tileheight; j ++)
{
/* Read each row. */
rowoffset = j * width;
for (k = 0; k < width; k ++)
{
/* Expand each integer into INTBITS pixels. */
if (k % intbits == 0)
{
c = get_int (fp);
/* Flip all the bits so that 1's become black and
0's become white. */
c ^= 0xffff;
}
data[rowoffset + k] = c & 1;
c >>= 1;
}
}
/* Put the data into the image. */
2012-11-18 23:22:07 +01:00
gegl_buffer_set (buffer, GEGL_RECTANGLE (0, i, width, tileheight), 0,
NULL, data, GEGL_AUTO_ROWSTRIDE);
gimp_progress_update ((double) (i + tileheight) / (double) height);
}
g_free (data);
2012-11-18 23:22:07 +01:00
g_object_unref (buffer);
fclose (fp);
configure.in po-plug-ins/POTFILES.in plug-ins/common/Makefile.am 2000-01-25 Michael Natterer <mitch@gimp.org> * configure.in * po-plug-ins/POTFILES.in * plug-ins/common/Makefile.am * plug-ins/common/plugin-defs.pl * plug-ins/megawidget/*: removed. (There were only 3 functions left which were used by ~5 plugins, so I moved the resp. functions to the plugins). More preview stuff to come... * app/airbrush_blob.c * modules/colorsel_triangle.c * modules/colorsel_water.c: use G_PI instead of M_PI. * app/procedural_db.h * libgimp/gimpenums.h * plug-ins/script-fu/script-fu-constants.c * tools/pdbgen/enums.pl: new PDB return value STATUS_CANCEL which indicates that "Cancel" was pressed in a plugin dialog. (Useful only for file load/save plugins). * app/fileops.[ch] * app/menus.c: changes to handle STATUS_CANCEL correctly. Did some code cleanup in fileops.[ch]. Pop up a warning if File->Save failed. * app/plug_in.c: return_val[0] is of type PDB_STATUS, not PDB_INT32. * libgimp/gimpmath.h: new constant G_MAXRAND which equals to RAND_MAX if it exists or to G_MAXINT otherwise. * libgimp/gimpwidgets.[ch]: new function gimp_random_seed_new() which creates a spinbutton and a "Time" toggle. Call the function which does the "set_sensitive" magic from the radio button callback. * plug-ins/[75 plugins]: - Return STATUS_CANCEL in all file load/save dialogs if "Cancel" was pressed. - Standardized the file plugins' "run" functions. - Use G_PI and G_MAXRAND everywhere. - Added tons of scales and spinbuttons instead of text entries. - Applied uniform packing/spacings all over the place. - Reorganized some UIs (stuff like moving the preview to the top left corner of the dialog). - Removed many ui helper functions and callbacks and use the stuff from libgimp instead. - I tried not to restrict the range of possible values when I replaced entries with spinbuttons/scales but may have failed, though in some cases. Please test ;-) - #include <libgimp/gimpmath.h> where appropriate and use it's constants. - Indentation, s/int/gint/ et.al., code cleanup. RFC: The plugins are definitely not useable with GIMP 1.0 any more, so shouldn't we remove all the remaining compatibility stuff ??? (like "#ifdef GIMP_HAVE_PARASITES")
2000-01-25 17:46:56 +00:00
2012-11-18 23:22:07 +01:00
gimp_progress_update (1.0);
return image;
}
static gboolean
export_image (GFile *file,
const gchar *prefix,
gboolean save_mask,
GimpImage *image,
GimpDrawable *drawable,
GObject *config,
GError **error)
{
2014-10-05 18:06:03 +02:00
GOutputStream *output;
GeglBuffer *buffer;
GCancellable *cancellable;
2014-10-05 18:06:03 +02:00
gint width, height, colors, dark;
gint intbits, lineints, need_comma, nints, rowoffset, tileheight;
gint c, i, j, k, thisbit;
gboolean has_alpha;
gint bpp;
guchar *data = NULL;
guchar *cmap;
const gchar *intfmt;
gboolean config_save_comment;
gchar *config_comment;
gint config_x10_format;
gint config_use_hot;
gint config_x_hot;
gint config_y_hot;
g_object_get (config,
"include-comment", &config_save_comment,
"gimp-comment", &config_comment,
"x10-format", &config_x10_format,
"use-hot-spot", &config_use_hot,
"hot-spot-x", &config_x_hot,
"hot-spot-y", &config_y_hot,
NULL);
#if 0
if (save_mask)
g_printerr ("%s: save_mask '%s'\n", G_STRFUNC, prefix);
else
g_printerr ("%s: save_image '%s'\n", G_STRFUNC, prefix);
#endif
cmap = gimp_palette_get_colormap (gimp_image_get_palette (image), babl_format ("R'G'B' u8"), &colors, NULL);
if (! gimp_drawable_is_indexed (drawable) || colors > 2)
{
/* The image is not black-and-white. */
g_message (_("The image which you are trying to export as "
"an XBM contains more than two colors.\n\n"
"Please convert it to a black and white "
"(1-bit) indexed image and try again."));
2012-11-18 23:22:07 +01:00
g_free (cmap);
return FALSE;
}
has_alpha = gimp_drawable_has_alpha (drawable);
if (! has_alpha && save_mask)
{
g_message (_("You cannot save a cursor mask for an image\n"
"which has no alpha channel."));
return FALSE;
}
buffer = gimp_drawable_get_buffer (drawable);
2012-11-18 23:22:07 +01:00
width = gegl_buffer_get_width (buffer);
height = gegl_buffer_get_height (buffer);
bpp = gimp_drawable_get_bpp (drawable);
/* Figure out which color is black, and which is white. */
dark = 0;
if (colors > 1)
{
gint first, second;
/* Maybe the second color is darker than the first. */
first = (cmap[0] * cmap[0]) + (cmap[1] * cmap[1]) + (cmap[2] * cmap[2]);
second = (cmap[3] * cmap[3]) + (cmap[4] * cmap[4]) + (cmap[5] * cmap[5]);
if (second < first)
dark = 1;
}
gimp_progress_init_printf (_("Exporting '%s'"),
2014-10-05 18:06:03 +02:00
gimp_file_get_utf8_name (file));
2014-10-05 18:06:03 +02:00
output = G_OUTPUT_STREAM (g_file_replace (file,
NULL, FALSE, G_FILE_CREATE_NONE,
NULL, error));
if (output)
{
GOutputStream *buffered;
buffered = g_buffered_output_stream_new (output);
g_object_unref (output);
output = buffered;
}
else
{
return FALSE;
}
/* Maybe write the image comment. */
if (config_save_comment && config_comment && *config_comment)
2014-10-05 18:06:03 +02:00
{
if (! print (output, error, "/* %s */\n", config_comment))
2014-10-05 18:06:03 +02:00
goto fail;
}
/* Write out the image height and width. */
2014-10-05 18:06:03 +02:00
if (! print (output, error, "#define %s_width %d\n", prefix, width) ||
! print (output, error, "#define %s_height %d\n", prefix, height))
goto fail;
/* Write out the hotspot, if any. */
if (config_use_hot)
{
2014-10-05 18:06:03 +02:00
if (! print (output, error,
"#define %s_x_hot %d\n", prefix, config_x_hot) ||
2014-10-05 18:06:03 +02:00
! print (output, error,
"#define %s_y_hot %d\n", prefix, config_y_hot))
2014-10-05 18:06:03 +02:00
goto fail;
}
/* Now write the actual data. */
if (config_x10_format)
{
/* We can fit 9 hex shorts on a single line. */
lineints = 9;
intbits = 16;
intfmt = " 0x%04x";
}
else
{
/* We can fit 12 hex chars on a single line. */
lineints = 12;
intbits = 8;
intfmt = " 0x%02x";
}
2014-10-05 18:06:03 +02:00
if (! print (output, error,
"static %s %s_bits[] = {\n ",
config_x10_format ? "unsigned short" : "unsigned char", prefix))
2014-10-05 18:06:03 +02:00
goto fail;
/* Allocate a new set of pixels. */
tileheight = gimp_tile_height ();
data = (guchar *) g_malloc (width * tileheight * bpp);
/* Write out the integers. */
need_comma = 0;
nints = 0;
for (i = 0; i < height; i += tileheight)
{
/* Get a horizontal slice of the image. */
tileheight = MIN (tileheight, height - i);
2012-11-18 23:22:07 +01:00
gegl_buffer_get (buffer, GEGL_RECTANGLE (0, i, width, tileheight), 1.0,
NULL, data,
GEGL_AUTO_ROWSTRIDE, GEGL_ABYSS_NONE);
for (j = 0; j < tileheight; j ++)
{
/* Write out a row at a time. */
rowoffset = j * width * bpp;
c = 0;
thisbit = 0;
for (k = 0; k < width * bpp; k += bpp)
{
if (k != 0 && thisbit == intbits)
{
/* Output a completed integer. */
if (need_comma)
2014-10-05 18:06:03 +02:00
{
if (! print (output, error, ","))
goto fail;
}
need_comma = 1;
/* Maybe start a new line. */
if (nints ++ >= lineints)
{
nints = 1;
2014-10-05 18:06:03 +02:00
if (! print (output, error, "\n "))
goto fail;
}
2014-10-05 18:06:03 +02:00
if (! print (output, error, intfmt, c))
goto fail;
/* Start a new integer. */
c = 0;
thisbit = 0;
}
/* Pack INTBITS pixels into an integer. */
if (save_mask)
{
c |= ((data[rowoffset + k + 1] < 128) ? 0 : 1) << (thisbit ++);
}
else
{
if (has_alpha && (data[rowoffset + k + 1] < 128))
c |= 0 << (thisbit ++);
else
c |= ((data[rowoffset + k] == dark) ? 1 : 0) << (thisbit ++);
}
}
if (thisbit != 0)
{
/* Write out the last oddball int. */
if (need_comma)
2014-10-05 18:06:03 +02:00
{
if (! print (output, error, ","))
goto fail;
}
need_comma = 1;
/* Maybe start a new line. */
if (nints ++ == lineints)
{
nints = 1;
2014-10-05 18:06:03 +02:00
if (! print (output, error, "\n "))
goto fail;
}
2014-10-05 18:06:03 +02:00
if (! print (output, error, intfmt, c))
goto fail;
}
}
gimp_progress_update ((double) (i + tileheight) / (double) height);
}
/* Write the trailer. */
2014-10-05 18:06:03 +02:00
if (! print (output, error, " };\n"))
goto fail;
2012-11-18 23:22:07 +01:00
2014-10-05 18:06:03 +02:00
if (! g_output_stream_close (output, NULL, error))
goto fail;
g_free (data);
2014-10-05 18:06:03 +02:00
g_object_unref (buffer);
g_object_unref (output);
2012-11-18 23:22:07 +01:00
gimp_progress_update (1.0);
return TRUE;
2014-10-05 18:06:03 +02:00
fail:
cancellable = g_cancellable_new ();
g_cancellable_cancel (cancellable);
g_output_stream_close (output, cancellable, NULL);
g_object_unref (cancellable);
2014-10-05 18:06:03 +02:00
g_free (data);
g_object_unref (buffer);
g_object_unref (output);
return FALSE;
}
static gboolean
save_dialog (GimpImage *image,
GimpDrawable *drawable,
GimpProcedure *procedure,
GObject *config)
1999-10-14 02:11:52 +00:00
{
GtkWidget *dialog;
GtkWidget *vbox;
GtkWidget *frame;
GtkWidget *hint;
gboolean run;
dialog = gimp_export_procedure_dialog_new (GIMP_EXPORT_PROCEDURE (procedure),
GIMP_PROCEDURE_CONFIG (config),
image);
configure.in po-plug-ins/POTFILES.in plug-ins/common/Makefile.am 2000-01-25 Michael Natterer <mitch@gimp.org> * configure.in * po-plug-ins/POTFILES.in * plug-ins/common/Makefile.am * plug-ins/common/plugin-defs.pl * plug-ins/megawidget/*: removed. (There were only 3 functions left which were used by ~5 plugins, so I moved the resp. functions to the plugins). More preview stuff to come... * app/airbrush_blob.c * modules/colorsel_triangle.c * modules/colorsel_water.c: use G_PI instead of M_PI. * app/procedural_db.h * libgimp/gimpenums.h * plug-ins/script-fu/script-fu-constants.c * tools/pdbgen/enums.pl: new PDB return value STATUS_CANCEL which indicates that "Cancel" was pressed in a plugin dialog. (Useful only for file load/save plugins). * app/fileops.[ch] * app/menus.c: changes to handle STATUS_CANCEL correctly. Did some code cleanup in fileops.[ch]. Pop up a warning if File->Save failed. * app/plug_in.c: return_val[0] is of type PDB_STATUS, not PDB_INT32. * libgimp/gimpmath.h: new constant G_MAXRAND which equals to RAND_MAX if it exists or to G_MAXINT otherwise. * libgimp/gimpwidgets.[ch]: new function gimp_random_seed_new() which creates a spinbutton and a "Time" toggle. Call the function which does the "set_sensitive" magic from the radio button callback. * plug-ins/[75 plugins]: - Return STATUS_CANCEL in all file load/save dialogs if "Cancel" was pressed. - Standardized the file plugins' "run" functions. - Use G_PI and G_MAXRAND everywhere. - Added tons of scales and spinbuttons instead of text entries. - Applied uniform packing/spacings all over the place. - Reorganized some UIs (stuff like moving the preview to the top left corner of the dialog). - Removed many ui helper functions and callbacks and use the stuff from libgimp instead. - I tried not to restrict the range of possible values when I replaced entries with spinbuttons/scales but may have failed, though in some cases. Please test ;-) - #include <libgimp/gimpmath.h> where appropriate and use it's constants. - Indentation, s/int/gint/ et.al., code cleanup. RFC: The plugins are definitely not useable with GIMP 1.0 any more, so shouldn't we remove all the remaining compatibility stuff ??? (like "#ifdef GIMP_HAVE_PARASITES")
2000-01-25 17:46:56 +00:00
/* comment string. */
hint = g_object_new (GIMP_TYPE_HINT_BOX,
"icon-name", GIMP_ICON_DIALOG_WARNING,
"hint", _("Writing a comment will make the XBM "
"file unreadable by some applications.\n"
"The comment will not affect embedding "
"the XBM in C source code."),
NULL);
vbox = gimp_procedure_dialog_fill_box (GIMP_PROCEDURE_DIALOG (dialog),
"comment-vbox", "gimp-comment", NULL);
gtk_box_pack_start (GTK_BOX (vbox), hint, FALSE, FALSE, 0);
gtk_widget_set_visible (hint, TRUE);
gtk_box_reorder_child (GTK_BOX (vbox), hint, 0);
gtk_widget_set_margin_end (hint, 24);
frame = gimp_procedure_dialog_fill_frame (GIMP_PROCEDURE_DIALOG (dialog),
"comment-frame", "include-comment",
FALSE, "comment-vbox");
/* hotspot toggle */
gimp_procedure_dialog_fill_box (GIMP_PROCEDURE_DIALOG (dialog),
"hot-spot-vbox", "hot-spot-x", "hot-spot-y",
NULL);
frame = gimp_procedure_dialog_fill_frame (GIMP_PROCEDURE_DIALOG (dialog),
"hot-spot-frame", "use-hot-spot",
FALSE, "hot-spot-vbox");
/* mask file */
frame = gimp_procedure_dialog_fill_frame (GIMP_PROCEDURE_DIALOG (dialog),
"mask-frame", "write-mask",
FALSE, "mask-suffix");
gtk_widget_set_sensitive (frame, gimp_drawable_has_alpha (drawable));
gimp_procedure_dialog_fill (GIMP_PROCEDURE_DIALOG (dialog),
"x10-format", "prefix", "comment-frame",
"hot-spot-frame", "mask-frame", NULL);
gtk_widget_show (dialog);
run = gimp_procedure_dialog_run (GIMP_PROCEDURE_DIALOG (dialog));
gtk_widget_destroy (dialog);
removed our own action_area API and use GtkDialog's one. Create all 2003-11-06 Michael Natterer <mitch@gimp.org> * libgimpwidgets/gimpdialog.[ch]: removed our own action_area API and use GtkDialog's one. Create all dialogs without separator. Changed almost everything else too. Fixes bug #125143. * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpunitmenu.c: changed accordingly. * libgimp/gimpexport.[ch]: ditto. Renamed enum GimpExportReturnType to GimpExportReturn. * libgimp/gimpcompat.h: added a #define for the old name. * themes/Default/gtkrc: increased action_area border to 6 pixels. * app/display/gimpdisplayshell-filter-dialog.c * app/display/gimpdisplayshell-scale.c * app/display/gimpprogress.c * app/gui/brush-select.c * app/gui/channels-commands.c * app/gui/color-notebook.c * app/gui/convert-dialog.c * app/gui/file-new-dialog.c * app/gui/font-select.c * app/gui/gradient-editor-commands.c * app/gui/gradient-select.c * app/gui/grid-dialog.c * app/gui/image-commands.c * 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/palette-select.c * app/gui/pattern-select.c * app/gui/preferences-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/resolution-calibrate-dialog.c * app/gui/stroke-dialog.c * app/gui/templates-commands.c * app/gui/user-install-dialog.c * app/gui/vectors-commands.c * app/tools/gimpcolorpickertool.c * app/tools/gimpcroptool.c * app/tools/gimpimagemaptool.c * app/tools/gimpmeasuretool.c * app/tools/gimptransformtool.c * app/widgets/gimptexteditor.c * app/widgets/gimptooldialog.[ch] * app/widgets/gimpviewabledialog.[ch] * app/widgets/gimpwidgets-utils.c: changed accordingly and increased the dialogs' outer borders to 6 pixels all over the place. * plug-ins/*/*.c: changed accordingly. The plug-ins may be arbitrarily broken, I tested none of them.
2003-11-06 15:27:05 +00:00
return run;
}
2014-10-05 18:06:03 +02:00
static gboolean
print (GOutputStream *output,
GError **error,
const gchar *format,
...)
{
va_list args;
gboolean success;
va_start (args, format);
success = g_output_stream_vprintf (output, NULL, NULL,
error, format, args);
va_end (args);
return success;
}