summaryrefslogtreecommitdiffstats
path: root/pdb/groups/fileops.pdb
diff options
context:
space:
mode:
Diffstat (limited to 'pdb/groups/fileops.pdb')
-rw-r--r--pdb/groups/fileops.pdb756
1 files changed, 756 insertions, 0 deletions
diff --git a/pdb/groups/fileops.pdb b/pdb/groups/fileops.pdb
new file mode 100644
index 0000000..f2750fc
--- /dev/null
+++ b/pdb/groups/fileops.pdb
@@ -0,0 +1,756 @@
+# GIMP - The GNU Image Manipulation Program
+# Copyright (C) 1995, 1996, 1997 Spencer Kimball and Peter Mattis
+# Copyright (C) 1997 Josh MacDonald
+
+# 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/>.
+
+# "Perlized" from C source by Manish Singh <yosh@gimp.org>
+
+sub file_load {
+ $blurb = 'Loads an image file by invoking the right load handler.';
+
+ $help = <<'HELP';
+This procedure invokes the correct file load handler using magic if
+possible, and falling back on the file's extension and/or prefix if
+not. The name of the file to load is typically a full pathname, and
+the name entered is what the user actually typed before prepending a
+directory path. The reason for this is that if the user types
+https://www.gimp.org/foo.png he wants to fetch a URL, and the full
+pathname will not look like a URL.
+HELP
+
+ &josh_pdb_misc('1997');
+
+ @inargs = (
+ { name => 'run_mode',
+ type => 'enum GimpRunMode (no GIMP_RUN_WITH_LAST_VALS)',
+ desc => 'The run mode' },
+ { name => 'filename', type => 'string', allow_non_utf8 => 1,
+ desc => 'The name of the file to load' },
+ { name => 'raw_filename', type => 'string', allow_non_utf8 => 1,
+ desc => 'The name as entered by the user' }
+ );
+
+ @outargs = (
+ { name => 'image', type => 'image',
+ desc => 'The output image' }
+ );
+
+ %invoke = (
+ no_marshalling => 1,
+ code => <<'CODE'
+{
+ GimpValueArray *new_args;
+ GimpValueArray *return_vals;
+ GimpPlugInProcedure *file_proc;
+ GimpProcedure *proc;
+ GFile *file;
+ gint i;
+
+ file = file_utils_filename_to_file (gimp,
+ g_value_get_string (gimp_value_array_index (args, 1)),
+ error);
+
+ if (! file)
+ return gimp_procedure_get_return_values (procedure, FALSE,
+ error ? *error : NULL);
+
+ file_proc = gimp_plug_in_manager_file_procedure_find (gimp->plug_in_manager,
+ GIMP_FILE_PROCEDURE_GROUP_OPEN,
+ file, error);
+
+ if (! file_proc)
+ {
+ g_object_unref (file);
+
+ return gimp_procedure_get_return_values (procedure, FALSE,
+ error ? *error : NULL);
+ }
+
+ proc = GIMP_PROCEDURE (file_proc);
+
+ new_args = gimp_procedure_get_arguments (proc);
+
+ g_value_transform (gimp_value_array_index (args, 0),
+ gimp_value_array_index (new_args, 0));
+
+ if (file_proc->handles_uri)
+ g_value_take_string (gimp_value_array_index (new_args, 1),
+ g_file_get_uri (file));
+ else
+ g_value_transform (gimp_value_array_index (args, 1),
+ gimp_value_array_index (new_args, 1));
+
+ g_value_transform (gimp_value_array_index (args, 2),
+ gimp_value_array_index (new_args, 2));
+
+ for (i = 3; i < proc->num_args; i++)
+ if (G_IS_PARAM_SPEC_STRING (proc->args[i]))
+ g_value_set_static_string (gimp_value_array_index (new_args, i), "");
+
+ return_vals =
+ gimp_pdb_execute_procedure_by_name_args (gimp->pdb,
+ context, progress, error,
+ gimp_object_get_name (proc),
+ new_args);
+
+ gimp_value_array_unref (new_args);
+
+ if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) ==
+ GIMP_PDB_SUCCESS)
+ {
+ if (gimp_value_array_length (return_vals) > 1 &&
+ GIMP_VALUE_HOLDS_IMAGE_ID (gimp_value_array_index (return_vals, 1)))
+ {
+ GimpImage *image =
+ gimp_value_get_image (gimp_value_array_index (return_vals, 1),
+ gimp);
+ gimp_image_set_load_proc (image, file_proc);
+ }
+ }
+
+ g_object_unref (file);
+
+ return return_vals;
+}
+CODE
+ );
+}
+
+sub file_load_layer {
+ $blurb = 'Loads an image file as a layer for an existing image.';
+
+ $help = <<'HELP';
+This procedure behaves like the file-load procedure but opens the specified
+image as a layer for an existing image. The returned layer needs to be
+added to the existing image with gimp_image_insert_layer().
+HELP
+
+ &neo_pdb_misc('2005', '2.4');
+
+ @inargs = (
+ { name => 'run_mode',
+ type => 'enum GimpRunMode (no GIMP_RUN_WITH_LAST_VALS)',
+ desc => 'The run mode' },
+ { name => 'image', type => 'image',
+ desc => 'Destination image' },
+ { name => 'filename', type => 'string', allow_non_utf8 => 1,
+ desc => 'The name of the file to load' }
+ );
+
+ @outargs = (
+ { name => 'layer', type => 'layer',
+ desc => 'The layer created when loading the image file' }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ GFile *file = file_utils_filename_to_file (gimp, filename, error);
+
+ if (file)
+ {
+ GList *layers;
+ GimpPDBStatusType status;
+
+ layers = file_open_layers (gimp, context, progress,
+ image, FALSE,
+ file, run_mode, NULL, &status, error);
+
+ g_object_unref (file);
+
+ if (layers)
+ {
+ layer = layers->data;
+ g_list_free (layers);
+ }
+ else
+ success = FALSE;
+ }
+ else
+ success = FALSE;
+}
+CODE
+ );
+}
+
+sub file_load_layers {
+ $blurb = 'Loads an image file as layers for an existing image.';
+
+ $help = <<'HELP';
+This procedure behaves like the file-load procedure but opens the specified
+image as layers for an existing image. The returned layers needs to be
+added to the existing image with gimp_image_insert_layer().
+HELP
+
+ &mitch_pdb_misc('2006', '2.4');
+
+ @inargs = (
+ { name => 'run_mode',
+ type => 'enum GimpRunMode (no GIMP_RUN_WITH_LAST_VALS)',
+ desc => 'The run mode' },
+ { name => 'image', type => 'image',
+ desc => 'Destination image' },
+ { name => 'filename', type => 'string', allow_non_utf8 => 1,
+ desc => 'The name of the file to load' }
+ );
+
+ @outargs = (
+ { name => 'layer_ids', type => 'int32array',
+ desc => 'The list of loaded layers',
+ array => { name => 'num_layers',
+ desc => 'The number of loaded layers' } }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ GFile *file = file_utils_filename_to_file (gimp, filename, error);
+
+ if (file)
+ {
+ GList *layers;
+ GimpPDBStatusType status;
+
+ layers = file_open_layers (gimp, context, progress,
+ image, FALSE,
+ file, run_mode, NULL, &status, error);
+
+ g_object_unref (file);
+
+ if (layers)
+ {
+ GList *list;
+ gint i;
+
+ num_layers = g_list_length (layers);
+
+ layer_ids = g_new (gint32, num_layers);
+
+ for (i = 0, list = layers;
+ i < num_layers;
+ i++, list = g_list_next (list))
+ layer_ids[i] = gimp_item_get_ID (GIMP_ITEM (list->data));
+
+ g_list_free (layers);
+ }
+ else
+ success = FALSE;
+ }
+ else
+ success = FALSE;
+}
+CODE
+ );
+}
+
+sub file_save {
+ $blurb = 'Saves a file by extension.';
+
+ $help = <<'HELP';
+This procedure invokes the correct file save handler according to the
+file's extension and/or prefix. The name of the file to save is
+typically a full pathname, and the name entered is what the user
+actually typed before prepending a directory path. The reason for this
+is that if the user types https://www.gimp.org/foo.png she wants to
+fetch a URL, and the full pathname will not look like a URL.
+HELP
+
+ &josh_pdb_misc('1997');
+
+ @inargs = (
+ { name => 'run_mode', type => 'enum GimpRunMode',
+ desc => 'The run mode' },
+ { name => 'image', type => 'image',
+ desc => 'Input image' },
+ { name => 'drawable', type => 'drawable',
+ desc => 'Drawable to save' },
+ { name => 'filename', type => 'string', allow_non_utf8 => 1,
+ desc => 'The name of the file to save the image in' },
+ { name => 'raw_filename', type => 'string', allow_non_utf8 => 1,
+ desc => 'The name as entered by the user' }
+ );
+
+ %invoke = (
+ headers => [ qw(<string.h>) ],
+ no_marshalling => 1,
+ code => <<'CODE'
+{
+ GimpValueArray *new_args;
+ GimpValueArray *return_vals;
+ GimpPlugInProcedure *file_proc;
+ GimpProcedure *proc;
+ GFile *file;
+ gint i;
+
+ file = file_utils_filename_to_file (gimp,
+ g_value_get_string (gimp_value_array_index (args, 3)),
+ error);
+
+ if (! file)
+ return gimp_procedure_get_return_values (procedure, FALSE,
+ error ? *error : NULL);
+
+ file_proc = gimp_plug_in_manager_file_procedure_find (gimp->plug_in_manager,
+ GIMP_FILE_PROCEDURE_GROUP_SAVE,
+ file, NULL);
+
+ if (! file_proc)
+ file_proc = gimp_plug_in_manager_file_procedure_find (gimp->plug_in_manager,
+ GIMP_FILE_PROCEDURE_GROUP_EXPORT,
+ file, error);
+
+ if (! file_proc)
+ {
+ g_object_unref (file);
+
+ return gimp_procedure_get_return_values (procedure, FALSE,
+ error ? *error : NULL);
+ }
+
+ proc = GIMP_PROCEDURE (file_proc);
+
+ new_args = gimp_procedure_get_arguments (proc);
+
+ g_value_transform (gimp_value_array_index (args, 0),
+ gimp_value_array_index (new_args, 0));
+ g_value_transform (gimp_value_array_index (args, 1),
+ gimp_value_array_index (new_args, 1));
+ g_value_transform (gimp_value_array_index (args, 2),
+ gimp_value_array_index (new_args, 2));
+
+ if (file_proc->handles_uri)
+ g_value_take_string (gimp_value_array_index (new_args, 3),
+ g_file_get_uri (file));
+ else
+ g_value_transform (gimp_value_array_index (args, 3),
+ gimp_value_array_index (new_args, 3));
+
+ g_value_transform (gimp_value_array_index (args, 4),
+ gimp_value_array_index (new_args, 4));
+
+ for (i = 5; i < proc->num_args; i++)
+ if (G_IS_PARAM_SPEC_STRING (proc->args[i]))
+ g_value_set_static_string (gimp_value_array_index (new_args, i), "");
+
+ return_vals =
+ gimp_pdb_execute_procedure_by_name_args (gimp->pdb,
+ context, progress, error,
+ gimp_object_get_name (proc),
+ new_args);
+
+ gimp_value_array_unref (new_args);
+
+ g_object_unref (file);
+
+ return return_vals;
+}
+CODE
+ );
+}
+
+sub file_load_thumbnail {
+ $blurb = 'Loads the thumbnail for a file.';
+
+ $help = <<'HELP';
+This procedure tries to load a thumbnail that belongs to the file with
+the given filename. This name is a full pathname. The returned data is
+an array of colordepth 3 (RGB), regardless of the image type. Width and
+height of the thumbnail are also returned. Don't use this function if
+you need a thumbnail of an already opened image, use gimp_image_thumbnail()
+instead.
+HELP
+
+ $author = $copyright = 'Adam D. Moss, Sven Neumann';
+ $date = '1999-2003';
+
+ @inargs = (
+ { name => 'filename', type => 'string', allow_non_utf8 => 1,
+ desc => 'The name of the file that owns the thumbnail to load' }
+ );
+
+ @outargs = (
+ { name => 'width', type => 'int32',
+ desc => 'The width of the thumbnail' },
+ { name => 'height', type => 'int32',
+ desc => 'The height of the thumbnail' },
+ { name => 'thumb_data', type => 'int8array',
+ desc => 'The thumbnail data',
+ array => { name => 'thumb_data_count',
+ desc => 'The number of bytes in thumbnail data' } }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ GdkPixbuf *pixbuf = file_utils_load_thumbnail (filename);
+
+ if (pixbuf)
+ {
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ thumb_data_count = 3 * width * height;
+ thumb_data = g_memdup (gdk_pixbuf_get_pixels (pixbuf),
+ thumb_data_count);
+
+ g_object_unref (pixbuf);
+ }
+ else
+ success = FALSE;
+}
+CODE
+ );
+}
+
+sub file_save_thumbnail {
+ $blurb = 'Saves a thumbnail for the given image';
+
+ $help = <<'HELP';
+This procedure saves a thumbnail for the given image according to the
+Free Desktop Thumbnail Managing Standard. The thumbnail is saved so
+that it belongs to the file with the given filename. This means you
+have to save the image under this name first, otherwise this procedure
+will fail. This procedure may become useful if you want to
+explicitly save a thumbnail with a file.
+HELP
+
+ &josh_pdb_misc('1997');
+
+ @inargs = (
+ { name => 'image', type => 'image',
+ desc => 'The image' },
+ { name => 'filename', type => 'string', allow_non_utf8 => 1,
+ desc => 'The name of the file the thumbnail belongs to' },
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ success = file_utils_save_thumbnail (image, filename);
+}
+CODE
+ );
+}
+
+sub register_magic_load_handler {
+ $blurb = 'Registers a file load handler procedure.';
+
+ $help = <<'HELP';
+Registers a procedural database procedure to be called to load files of a
+particular file format using magic file information.
+HELP
+
+ &std_pdb_misc;
+
+ @inargs = (
+ { name => 'procedure_name', type => 'string', non_empty => 1,
+ desc => 'The name of the procedure to be used for loading' },
+ { name => 'extensions', type => 'string', no_validate => 1,
+ desc => 'comma separated list of extensions this handler
+ can load (i.e. "jpg,jpeg")' },
+ { name => 'prefixes', type => 'string', no_validate => 1,
+ desc => 'comma separated list of prefixes this handler
+ can load (i.e. "http:,ftp:")' },
+ { name => 'magics', type => 'string', no_validate => 1,
+ desc => 'comma separated list of magic file information
+ this handler can load (i.e. "0,string,GIF")' }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ gchar *canonical = gimp_canonicalize_identifier (procedure_name);
+
+ success = gimp_plug_in_manager_register_load_handler (gimp->plug_in_manager,
+ canonical,
+ extensions, prefixes, magics);
+
+ g_free (canonical);
+}
+CODE
+ );
+}
+
+sub register_load_handler {
+ $blurb = 'Registers a file load handler procedure.';
+
+ $help = <<'HELP';
+Registers a procedural database procedure to be called to load files of a
+particular file format.
+HELP
+
+ &std_pdb_misc;
+
+ @inargs = (
+ { name => 'procedure_name', type => 'string', non_empty => 1,
+ desc => 'The name of the procedure to be used for loading' },
+ { name => 'extensions', type => 'string', no_validate => 1,
+ desc => 'comma separated list of extensions this handler
+ can load (i.e. "jpg,jpeg")' },
+ { name => 'prefixes', type => 'string', no_validate => 1,
+ desc => 'comma separated list of prefixes this handler
+ can load (i.e. "http:,ftp:")' }
+ );
+
+
+ %invoke = (
+ code => <<'CODE'
+{
+ gchar *canonical = gimp_canonicalize_identifier (procedure_name);
+
+ success = gimp_plug_in_manager_register_load_handler (gimp->plug_in_manager,
+ canonical,
+ extensions, prefixes, NULL);
+
+ g_free (canonical);
+}
+CODE
+ );
+}
+
+sub register_save_handler {
+ $blurb = 'Registers a file save handler procedure.';
+
+ $help = <<'HELP';
+Registers a procedural database procedure to be called to save files in a
+particular file format.
+HELP
+
+ &std_pdb_misc;
+
+ @inargs = (
+ { name => 'procedure_name', type => 'string', non_empty => 1,
+ desc => 'The name of the procedure to be used for saving' },
+ { name => 'extensions', type => 'string', no_validate => 1,
+ desc => 'comma separated list of extensions this handler
+ can save (i.e. "jpg,jpeg")' },
+ { name => 'prefixes', type => 'string', no_validate => 1,
+ desc => 'comma separated list of prefixes this handler
+ can save (i.e. "http:,ftp:")' }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ gchar *canonical = gimp_canonicalize_identifier (procedure_name);
+
+ success = gimp_plug_in_manager_register_save_handler (gimp->plug_in_manager,
+ canonical,
+ extensions, prefixes);
+
+ g_free (canonical);
+}
+CODE
+ );
+}
+
+sub register_file_handler_priority {
+ $blurb = 'Sets the priority of a file handler procedure.';
+
+ $help = <<'HELP';
+Sets the priority of a file handler procedure. When more than one
+procedure matches a given file, the procedure with the lowest priority
+is used; if more than one procedure has the lowest priority, it is
+unspecified which one of them is used. The default priority for file
+handler procedures is 0.
+HELP
+
+ &ell_pdb_misc('2018', '2.10.6');
+
+ @inargs = (
+ { name => 'procedure_name', type => 'string', non_empty => 1,
+ desc => "The name of the procedure to set the priority of." },
+ { name => 'priority', type => 'int32',
+ desc => "The procedure priority." }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ gchar *canonical = gimp_canonicalize_identifier (procedure_name);
+
+ success = gimp_plug_in_manager_register_priority (gimp->plug_in_manager,
+ canonical, priority);
+
+ g_free (canonical);
+}
+CODE
+ );
+}
+
+sub register_file_handler_uri {
+ $blurb = 'Registers a file handler procedure as capable of handling URIs.';
+
+ $help = <<'HELP';
+Registers a file handler procedure as capable of handling URIs. This
+allows GIMP to call the procedure directly for all kinds of URIs, and
+the 'filename' traditionally passed to file procedures turns into an
+URI.
+HELP
+
+ &mitch_pdb_misc('2012', '2.10');
+
+ @inargs = (
+ { name => 'procedure_name', type => 'string', non_empty => 1,
+ desc => "The name of the procedure to enable URIs for." }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ gchar *canonical = gimp_canonicalize_identifier (procedure_name);
+
+ success = gimp_plug_in_manager_register_handles_uri (gimp->plug_in_manager,
+ canonical);
+
+ g_free (canonical);
+}
+CODE
+ );
+}
+
+sub register_file_handler_mime {
+ $blurb = 'Associates MIME types with a file handler procedure.';
+
+ $help = <<'HELP';
+Registers MIME types for a file handler procedure. This allows GIMP to
+determine the MIME type of the file opened or saved using this
+procedure. It is recommended that only one MIME type is registered per
+file procedure; when registering more than one MIME type, GIMP will
+associate the first one with files opened or saved with this procedure.
+HELP
+
+ &neo_pdb_misc('2004', '2.2');
+
+ @inargs = (
+ { name => 'procedure_name', type => 'string', non_empty => 1,
+ desc => "The name of the procedure to associate a MIME type with." },
+ { name => 'mime_types', type => 'string',
+ desc => 'A comma-separated list of MIME types, such as "image/jpeg".' }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ gchar *canonical = gimp_canonicalize_identifier (procedure_name);
+
+ success = gimp_plug_in_manager_register_mime_types (gimp->plug_in_manager,
+ canonical, mime_types);
+
+ g_free (canonical);
+}
+CODE
+ );
+}
+
+sub register_file_handler_raw {
+ $blurb = 'Registers a file handler procedure as capable of handling raw camera files.';
+
+ $help = <<'HELP';
+Registers a file handler procedure as capable of handling raw digital
+camera files. Use this procedure only to register raw load handlers,
+calling it on a save handler will generate an error.
+HELP
+
+ &mitch_pdb_misc('2017', '2.10');
+
+ @inargs = (
+ { name => 'procedure_name', type => 'string', non_empty => 1,
+ desc => "The name of the procedure to enable raw handling for." }
+ );
+
+ %invoke = (
+ code => <<'CODE'
+{
+ gchar *canonical = gimp_canonicalize_identifier (procedure_name);
+
+ success = gimp_plug_in_manager_register_handles_raw (gimp->plug_in_manager,
+ canonical);
+
+ g_free (canonical);
+}
+CODE
+ );
+}
+
+sub register_thumbnail_loader {
+ $blurb = 'Associates a thumbnail loader with a file load procedure.';
+
+ $help = <<'HELP';
+Some file formats allow for embedded thumbnails, other file formats
+contain a scalable image or provide the image data in different
+resolutions. A file plug-in for such a format may register a special
+procedure that allows GIMP to load a thumbnail preview of the
+image. This procedure is then associated with the standard load
+procedure using this function.
+HELP
+
+ &neo_pdb_misc('2004', '2.2');
+
+ @inargs = (
+ { name => 'load_proc', type => 'string', non_empty => 1,
+ desc => "The name of the procedure the thumbnail loader with." },
+ { name => 'thumb_proc', type => 'string', non_empty => 1,
+ desc => "The name of the thumbnail load procedure." }
+ );
+ %invoke = (
+ code => <<'CODE'
+{
+ gchar *canonical = gimp_canonicalize_identifier (load_proc);
+ gchar *canon_thumb = gimp_canonicalize_identifier (thumb_proc);
+
+ success = gimp_plug_in_manager_register_thumb_loader (gimp->plug_in_manager,
+ canonical, canon_thumb);
+
+ g_free (canonical);
+ g_free (canon_thumb);
+}
+CODE
+ );
+}
+
+
+@headers = qw("libgimpbase/gimpbase.h"
+ "libgimpconfig/gimpconfig.h"
+ "core/gimp.h"
+ "core/gimp-utils.h"
+ "plug-in/gimppluginmanager-file.h"
+ "plug-in/gimppluginprocedure.h"
+ "file/file-open.h"
+ "file/file-save.h"
+ "file/file-utils.h");
+
+@procs = qw(file_load
+ file_load_layer
+ file_load_layers
+ file_save
+ file_load_thumbnail
+ file_save_thumbnail
+ register_magic_load_handler
+ register_load_handler
+ register_save_handler
+ register_file_handler_priority
+ register_file_handler_mime
+ register_file_handler_uri
+ register_file_handler_raw
+ register_thumbnail_loader);
+
+%exports = (app => [@procs], lib => [@procs[0..3,5..13]]);
+
+$desc = 'File Operations';
+$doc_title = 'gimpfileops';
+$doc_short_desc = 'Image file operations (load, save, etc.)';
+$doc_long_desc = 'Image file operations (load, save, etc.)';
+
+1;