Updated with upstream update

This commit is contained in:
2023-10-30 15:55:30 -07:00
parent 098531073c
commit 3bbdd873ef
584 changed files with 91827 additions and 70362 deletions

View File

@ -259,13 +259,14 @@ get_extra_channels_count (gushort photomet, gushort spp, gboolean alpha)
}
PikaPDBStatusType
load_image (GFile *file,
PikaRunMode run_mode,
PikaImage **image,
gboolean *resolution_loaded,
gboolean *profile_loaded,
gboolean *ps_metadata_loaded,
GError **error)
load_image (GFile *file,
PikaRunMode run_mode,
PikaImage **image,
gboolean *resolution_loaded,
gboolean *profile_loaded,
gboolean *ps_metadata_loaded,
PikaProcedureConfig *config,
GError **error)
{
TIFF *tif;
TiffSelectedPages pages;
@ -300,12 +301,8 @@ load_image (GFile *file,
return PIKA_PDB_EXECUTION_ERROR;
}
pages.target = PIKA_PAGE_SELECTOR_TARGET_LAYERS;
pika_get_data (LOAD_PROC "-target", &pages.target);
pages.keep_empty_space = TRUE;
pika_get_data (LOAD_PROC "-keep-empty-space",
&pages.keep_empty_space);
g_object_get (config, "target", &pages.target, NULL);
g_object_get (config, "keep-empty-space", &pages.keep_empty_space, NULL);
pages.n_pages = pages.o_pages = TIFFNumberOfDirectories (tif);
if (pages.n_pages == 0)
@ -524,11 +521,8 @@ load_image (GFile *file,
}
}
pika_set_data (LOAD_PROC "-target",
&pages.target, sizeof (pages.target));
pika_set_data (LOAD_PROC "-keep-empty-space",
&pages.keep_empty_space,
sizeof (pages.keep_empty_space));
g_object_set (config, "target", pages.target, NULL);
g_object_set (config, "keep-empty-space", pages.keep_empty_space, NULL);
/* We will loop through the all pages in case of multipage TIFF
* and load every page as a separate layer.
@ -1750,6 +1744,7 @@ load_image (GFile *file,
{
FILE *fp;
GFile *temp_file = NULL;
PikaProcedure *procedure;
PikaValueArray *return_vals = NULL;
temp_file = pika_temp_file ("tmp");
@ -1766,15 +1761,15 @@ load_image (GFile *file,
fwrite (photoshop_data, sizeof (guchar), photoshop_len, fp);
fclose (fp);
return_vals =
pika_pdb_run_procedure (pika_get_pdb (),
"file-psd-load-metadata",
PIKA_TYPE_RUN_MODE, PIKA_RUN_NONINTERACTIVE,
G_TYPE_FILE, temp_file,
G_TYPE_INT, photoshop_len,
PIKA_TYPE_IMAGE, *image,
G_TYPE_BOOLEAN, FALSE,
G_TYPE_NONE);
procedure = pika_pdb_lookup_procedure (pika_get_pdb (),
"file-psd-load-metadata");
return_vals = pika_procedure_run (procedure,
"run-mode", PIKA_RUN_NONINTERACTIVE,
"file", temp_file,
"size", photoshop_len,
"image", *image,
"metadata-type", FALSE,
NULL);
g_file_delete (temp_file, NULL, NULL);
g_object_unref (temp_file);
@ -1787,6 +1782,7 @@ load_image (GFile *file,
{
FILE *fp;
GFile *temp_file = NULL;
PikaProcedure *procedure;
PikaValueArray *return_vals = NULL;
/* Photoshop metadata starts with 'Adobe Photoshop Document Data Block'
@ -1808,16 +1804,16 @@ load_image (GFile *file,
fwrite (photoshop_data, sizeof (guchar), photoshop_len, fp);
fclose (fp);
return_vals =
pika_pdb_run_procedure (pika_get_pdb (),
"file-psd-load-metadata",
PIKA_TYPE_RUN_MODE, run_mode,
G_TYPE_FILE, temp_file,
G_TYPE_INT, photoshop_len,
PIKA_TYPE_IMAGE, *image,
G_TYPE_BOOLEAN, TRUE,
G_TYPE_BOOLEAN, is_cmyk,
G_TYPE_NONE);
procedure = pika_pdb_lookup_procedure (pika_get_pdb (),
"file-psd-load-metadata");
return_vals = pika_procedure_run (procedure,
"run-mode", run_mode,
"file", temp_file,
"size", photoshop_len,
"image", *image,
"metadata-type", TRUE,
"cmyk", is_cmyk,
NULL);
g_file_delete (temp_file, NULL, NULL);
g_object_unref (temp_file);

View File

@ -46,13 +46,14 @@ typedef struct
} TiffSelectedPages;
PikaPDBStatusType load_image (GFile *file,
PikaRunMode run_mode,
PikaImage **image,
gboolean *resolution_loaded,
gboolean *profile_loaded,
gboolean *ps_metadata_loaded,
GError **error);
PikaPDBStatusType load_image (GFile *file,
PikaRunMode run_mode,
PikaImage **image,
gboolean *resolution_loaded,
gboolean *profile_loaded,
gboolean *ps_metadata_loaded,
PikaProcedureConfig *config,
GError **error);
#endif /* __FILE_TIFF_LOAD_H__ */

View File

@ -324,7 +324,6 @@ save_layer (TIFF *tif,
gboolean config_cmyk;
g_object_get (config,
"compression", &config_compression,
"pika-comment", &config_comment,
"save-comment", &config_save_comment,
"save-transparent-pixels", &config_save_transp_pixels,
@ -333,6 +332,7 @@ save_layer (TIFF *tif,
"cmyk", &config_cmyk,
NULL);
config_compression = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "compression");
compression = pika_compression_to_tiff_compression (config_compression);
layer_name = pika_item_get_name (PIKA_ITEM (layer));
@ -693,7 +693,7 @@ save_layer (TIFF *tif,
TIFFSetField (tif, TIFFTAG_ICCPROFILE, icc_length, icc_data);
g_object_unref (profile);
g_object_unref (cmyk_profile);
g_clear_object (&cmyk_profile);
}
#endif
@ -1221,48 +1221,6 @@ out:
return status;
}
static gboolean
combo_sensitivity_func (gint value,
gpointer data)
{
GtkTreeModel *model;
GtkTreeIter iter;
model = gtk_combo_box_get_model (GTK_COMBO_BOX (data));
if (pika_int_store_lookup_by_value (model, value, &iter))
{
gpointer insensitive;
gtk_tree_model_get (model, &iter,
PIKA_INT_STORE_USER_DATA, &insensitive,
-1);
return ! GPOINTER_TO_INT (insensitive);
}
return TRUE;
}
static void
combo_set_item_sensitive (GtkWidget *widget,
gint value,
gboolean sensitive)
{
GtkTreeModel *model;
GtkTreeIter iter;
model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
if (pika_int_store_lookup_by_value (model, value, &iter))
{
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
PIKA_INT_STORE_USER_DATA,
! GINT_TO_POINTER (sensitive),
-1);
}
}
gboolean
save_dialog (PikaImage *image,
PikaProcedure *procedure,
@ -1273,17 +1231,22 @@ save_dialog (PikaImage *image,
gboolean is_multi_layer,
gboolean classic_tiff_failed)
{
GtkWidget *dialog;
GtkListStore *store;
GtkWidget *combo;
GtkWidget *profile_label;
gchar **parasites;
PikaCompression compression;
gboolean run;
gboolean has_geotiff = FALSE;
gint i;
PikaColorProfile *cmyk_profile = NULL;
GtkWidget *dialog;
GtkWidget *profile_label;
gchar **parasites;
PikaCompression compression;
gboolean run;
gboolean has_geotiff = FALSE;
gint i;
PikaColorProfile *cmyk_profile = NULL;
GParamSpec *comp_spec;
PikaParamSpecChoice *cspec;
comp_spec = g_object_class_find_property (G_OBJECT_GET_CLASS (config), "compression");
cspec = PIKA_PARAM_SPEC_CHOICE (comp_spec);
pika_choice_set_sensitive (cspec->choice, "ccittfax3", is_monochrome);
pika_choice_set_sensitive (cspec->choice, "ccittfax4", is_monochrome);
pika_choice_set_sensitive (cspec->choice, "jpeg", ! is_indexed);
parasites = pika_image_get_parasite_list (image);
for (i = 0; i < g_strv_length (parasites); i++)
@ -1311,32 +1274,14 @@ save_dialog (PikaImage *image,
"Retry as BigTIFF or with a different compression algorithm, "
"or cancel."));
label = pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (dialog),
"big-tif-warning", text);
"big-tif-warning", text,
FALSE, FALSE);
g_free (text);
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
gtk_label_set_line_wrap_mode (GTK_LABEL (label), PANGO_WRAP_WORD);
gtk_label_set_max_width_chars (GTK_LABEL (label), 60);
}
store =
pika_int_store_new (_("None"), PIKA_COMPRESSION_NONE,
_("LZW"), PIKA_COMPRESSION_LZW,
_("Pack Bits"), PIKA_COMPRESSION_PACKBITS,
_("Deflate"), PIKA_COMPRESSION_ADOBE_DEFLATE,
_("JPEG"), PIKA_COMPRESSION_JPEG,
_("CCITT Group 3 fax"), PIKA_COMPRESSION_CCITTFAX3,
_("CCITT Group 4 fax"), PIKA_COMPRESSION_CCITTFAX4,
NULL);
combo = pika_procedure_dialog_get_int_combo (PIKA_PROCEDURE_DIALOG (dialog),
"compression", PIKA_INT_STORE (store));
combo = pika_label_int_widget_get_widget (PIKA_LABEL_INT_WIDGET (combo));
pika_int_combo_box_set_sensitivity (PIKA_INT_COMBO_BOX (combo),
combo_sensitivity_func,
combo, NULL);
combo_set_item_sensitive (combo, PIKA_COMPRESSION_CCITTFAX3, is_monochrome);
combo_set_item_sensitive (combo, PIKA_COMPRESSION_CCITTFAX4, is_monochrome);
combo_set_item_sensitive (combo, PIKA_COMPRESSION_JPEG, ! is_indexed);
pika_procedure_dialog_fill_frame (PIKA_PROCEDURE_DIALOG (dialog),
"layers-frame", "save-layers", FALSE,
"crop-layers");
@ -1359,7 +1304,8 @@ save_dialog (PikaImage *image,
/* Profile label. */
profile_label = pika_procedure_dialog_get_label (PIKA_PROCEDURE_DIALOG (dialog),
"profile-label", _("No soft-proofing profile"));
"profile-label", _("No soft-proofing profile"),
FALSE, FALSE);
gtk_label_set_xalign (GTK_LABEL (profile_label), 0.0);
gtk_label_set_ellipsize (GTK_LABEL (profile_label), PANGO_ELLIPSIZE_END);
pika_label_set_attributes (GTK_LABEL (profile_label),
@ -1419,27 +1365,17 @@ save_dialog (PikaImage *image,
"cmyk-frame",
NULL);
g_object_get (config,
"compression", &compression,
NULL);
compression = pika_procedure_config_get_choice_id (PIKA_PROCEDURE_CONFIG (config), "compression");
if (! is_monochrome)
{
if (compression == PIKA_COMPRESSION_CCITTFAX3 ||
compression == PIKA_COMPRESSION_CCITTFAX4)
{
compression = PIKA_COMPRESSION_NONE;
}
g_object_set (config, "compression", "none", NULL);
}
if (is_indexed && compression == PIKA_COMPRESSION_JPEG)
{
compression = PIKA_COMPRESSION_NONE;
}
g_object_set (config,
"compression", compression,
NULL);
g_object_set (config, "compression", "none", NULL);
gtk_widget_show (dialog);

View File

@ -76,37 +76,40 @@ struct _TiffClass
#define TIFF_TYPE (tiff_get_type ())
#define TIFF (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TIFF_TYPE, Tiff))
#define TIFF(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TIFF_TYPE, Tiff))
GType tiff_get_type (void) G_GNUC_CONST;
static GList * tiff_query_procedures (PikaPlugIn *plug_in);
static PikaProcedure * tiff_create_procedure (PikaPlugIn *plug_in,
const gchar *name);
static GList * tiff_query_procedures (PikaPlugIn *plug_in);
static PikaProcedure * tiff_create_procedure (PikaPlugIn *plug_in,
const gchar *name);
static PikaValueArray * tiff_load (PikaProcedure *procedure,
PikaRunMode run_mode,
GFile *file,
const PikaValueArray *args,
gpointer run_data);
static PikaValueArray * tiff_save (PikaProcedure *procedure,
PikaRunMode run_mode,
PikaImage *image,
gint n_drawables,
PikaDrawable **drawables,
GFile *file,
const PikaValueArray *args,
gpointer run_data);
static PikaPDBStatusType tiff_save_rec (PikaProcedure *procedure,
PikaRunMode run_mode,
PikaImage *orig_image,
gint n_orig_drawables,
PikaDrawable **orig_drawables,
GFile *file,
PikaProcedureConfig *config,
PikaMetadata *metadata,
gboolean retried,
GError **error);
static PikaValueArray * tiff_load (PikaProcedure *procedure,
PikaRunMode run_mode,
GFile *file,
PikaMetadata *metadata,
PikaMetadataLoadFlags *flags,
PikaProcedureConfig *config,
gpointer run_data);
static PikaValueArray * tiff_save (PikaProcedure *procedure,
PikaRunMode run_mode,
PikaImage *image,
gint n_drawables,
PikaDrawable **drawables,
GFile *file,
PikaMetadata *metadata,
PikaProcedureConfig *config,
gpointer run_data);
static PikaPDBStatusType tiff_save_rec (PikaProcedure *procedure,
PikaRunMode run_mode,
PikaImage *orig_image,
gint n_orig_drawables,
PikaDrawable **orig_drawables,
GFile *file,
PikaProcedureConfig *config,
PikaMetadata *metadata,
gboolean retried,
GError **error);
static gboolean image_is_monochrome (PikaImage *image);
static gboolean image_is_multi_layer (PikaImage *image);
@ -176,12 +179,29 @@ tiff_create_procedure (PikaPlugIn *plug_in,
"tif,tiff");
pika_file_procedure_set_magics (PIKA_FILE_PROCEDURE (procedure),
"0,string,II*\\0,0,string,MM\\0*");
/* TODO: the 2 below AUX arguments should likely be real arguments, but I
* just wanted to get rid of pika_get_data/pika_set_data() usage at first
* and didn't dig much into proper and full usage. Since it's always
* possible to add arguments, but not to remove them, I prefer to make
* them AUX for now and leave it as further exercise to decide whether it
* should be part of the PDB API.
*/
PIKA_PROC_AUX_ARG_ENUM (procedure, "target",
"Open _pages as", NULL,
PIKA_TYPE_PAGE_SELECTOR_TARGET,
PIKA_PAGE_SELECTOR_TARGET_LAYERS,
G_PARAM_READWRITE);
PIKA_PROC_AUX_ARG_BOOLEAN (procedure, "keep-empty-space",
_("_Keep empty space around imported layers"),
NULL, TRUE, PIKA_PARAM_READWRITE);
}
else if (! strcmp (name, SAVE_PROC))
{
procedure = pika_save_procedure_new (plug_in, name,
PIKA_PDB_PROC_TYPE_PLUGIN,
tiff_save, NULL, NULL);
TRUE, tiff_save, NULL, NULL);
pika_procedure_set_image_types (procedure, "*");
@ -214,13 +234,18 @@ tiff_create_procedure (PikaPlugIn *plug_in,
FALSE,
G_PARAM_READWRITE);
PIKA_PROC_ARG_INT (procedure, "compression",
_("Co_mpression"),
_("Compression type: { NONE (0), LZW (1), PACKBITS (2), "
"DEFLATE (3), JPEG (4), CCITT G3 Fax (5), "
"CCITT G4 Fax (6) }"),
0, 6, 0,
G_PARAM_READWRITE);
PIKA_PROC_ARG_CHOICE (procedure, "compression",
_("Co_mpression"),
_("Compression type"),
pika_choice_new_with_values ("none", PIKA_COMPRESSION_NONE, _("None"), NULL,
"lzw", PIKA_COMPRESSION_LZW, _("LZW"), NULL,
"packbits", PIKA_COMPRESSION_PACKBITS, _("Pack Bits"), NULL,
"adobe_deflate", PIKA_COMPRESSION_ADOBE_DEFLATE, _("Deflate"), NULL,
"jpeg", PIKA_COMPRESSION_JPEG, _("JPEG"), NULL,
"ccittfax3", PIKA_COMPRESSION_CCITTFAX3, _("CCITT Group 3 fax"), NULL,
"ccittfax4", PIKA_COMPRESSION_CCITTFAX4, _("CCITT Group 4 fax"), NULL,
NULL),
"none", G_PARAM_READWRITE);
PIKA_PROC_ARG_BOOLEAN (procedure, "save-transparent-pixels",
_("Save color _values from transparent pixels"),
@ -267,11 +292,13 @@ tiff_create_procedure (PikaPlugIn *plug_in,
}
static PikaValueArray *
tiff_load (PikaProcedure *procedure,
PikaRunMode run_mode,
GFile *file,
const PikaValueArray *args,
gpointer run_data)
tiff_load (PikaProcedure *procedure,
PikaRunMode run_mode,
GFile *file,
PikaMetadata *metadata,
PikaMetadataLoadFlags *flags,
PikaProcedureConfig *config,
gpointer run_data)
{
PikaValueArray *return_vals;
PikaPDBStatusType status;
@ -279,7 +306,6 @@ tiff_load (PikaProcedure *procedure,
gboolean resolution_loaded = FALSE;
gboolean profile_loaded = FALSE;
gboolean ps_metadata_loaded = FALSE;
PikaMetadata *metadata;
GError *error = NULL;
gegl_init (NULL, NULL);
@ -291,30 +317,16 @@ tiff_load (PikaProcedure *procedure,
&resolution_loaded,
&profile_loaded,
&ps_metadata_loaded,
&error);
config, &error);
if (!image)
return pika_procedure_new_return_values (procedure, status, error);
metadata = pika_image_metadata_load_prepare (image,
"image/tiff",
file, NULL);
if (resolution_loaded)
*flags &= ~PIKA_METADATA_LOAD_RESOLUTION;
if (metadata)
{
PikaMetadataLoadFlags flags = PIKA_METADATA_LOAD_ALL;
if (resolution_loaded)
flags &= ~PIKA_METADATA_LOAD_RESOLUTION;
if (profile_loaded)
flags &= ~PIKA_METADATA_LOAD_COLORSPACE;
pika_image_metadata_load_finish (image, "image/tiff",
metadata, flags);
g_object_unref (metadata);
}
if (profile_loaded)
*flags &= ~PIKA_METADATA_LOAD_COLORSPACE;
return_vals = pika_procedure_new_return_values (procedure,
PIKA_PDB_SUCCESS,
@ -332,20 +344,15 @@ tiff_save (PikaProcedure *procedure,
gint n_drawables,
PikaDrawable **drawables,
GFile *file,
const PikaValueArray *args,
PikaMetadata *metadata,
PikaProcedureConfig *config,
gpointer run_data)
{
PikaProcedureConfig *config;
PikaMetadata *metadata;
GError *error = NULL;
PikaPDBStatusType status = PIKA_PDB_SUCCESS;
GError *error = NULL;
PikaPDBStatusType status = PIKA_PDB_SUCCESS;
gegl_init (NULL, NULL);
config = pika_procedure_create_config (procedure);
metadata = pika_procedure_config_begin_export (config, image, run_mode,
args, "image/tiff");
switch (run_mode)
{
case PIKA_RUN_INTERACTIVE:
@ -360,9 +367,6 @@ tiff_save (PikaProcedure *procedure,
n_drawables, drawables,
file, config, metadata, FALSE, &error);
pika_procedure_config_end_export (config, image, file, status);
g_object_unref (config);
return pika_procedure_new_return_values (procedure, status, error);
}
@ -410,10 +414,10 @@ tiff_save_rec (PikaProcedure *procedure,
g_object_get (config,
"bigtiff", &bigtiff,
"compression", &compression,
"save-layers", &save_layers,
"crop-layers", &crop_layers,
NULL);
compression = pika_procedure_config_get_choice_id (config, "compression");
if (compression == PIKA_COMPRESSION_CCITTFAX3 ||
compression == PIKA_COMPRESSION_CCITTFAX4)