mirror of https://github.com/GNOME/gimp.git
Merge branch 'master' into bug-728633
This commit is contained in:
commit
779649bdb7
|
@ -49,13 +49,20 @@ static const GimpActionEntry drawable_actions[] =
|
|||
|
||||
{ "drawable-invert", GIMP_STOCK_INVERT,
|
||||
NC_("drawable-action", "In_vert"), NULL,
|
||||
NC_("drawable-action", "Invert the colors"),
|
||||
NC_("drawable-action", "Invert the colors perceptually"),
|
||||
G_CALLBACK (drawable_invert_cmd_callback),
|
||||
GIMP_HELP_LAYER_INVERT },
|
||||
|
||||
{ "drawable-linear-invert", GIMP_STOCK_INVERT,
|
||||
NC_("drawable-action", "_Linear Invert"), NULL,
|
||||
NC_("drawable-action", "Invert the colors in linear light"),
|
||||
G_CALLBACK (drawable_linear_invert_cmd_callback),
|
||||
GIMP_HELP_LAYER_INVERT },
|
||||
|
||||
{ "drawable-value-invert", GIMP_STOCK_GEGL,
|
||||
NC_("drawable-action", "_Value Invert"), NULL,
|
||||
NC_("drawable-action", "Invert the brightness of each pixel"),
|
||||
NC_("drawable-action",
|
||||
"Invert the brightness of each pixel, keeping the color"),
|
||||
G_CALLBACK (drawable_value_invert_cmd_callback),
|
||||
GIMP_HELP_LAYER_INVERT },
|
||||
|
||||
|
@ -241,6 +248,7 @@ drawable_actions_update (GimpActionGroup *group,
|
|||
|
||||
SET_SENSITIVE ("drawable-equalize", writable && !children);
|
||||
SET_SENSITIVE ("drawable-invert", writable && !children);
|
||||
SET_SENSITIVE ("drawable-linear-invert", writable && !children);
|
||||
SET_SENSITIVE ("drawable-value-invert", writable && !children);
|
||||
SET_SENSITIVE ("drawable-levels-stretch", writable && !children && is_rgb);
|
||||
SET_SENSITIVE ("drawable-dilate", writable && !children);
|
||||
|
|
|
@ -80,13 +80,29 @@ drawable_invert_cmd_callback (GtkAction *action,
|
|||
return_if_no_drawable (image, drawable, data);
|
||||
return_if_no_display (display, data);
|
||||
|
||||
/* FIXME invert masks? */
|
||||
gimp_drawable_apply_operation_by_name (drawable, GIMP_PROGRESS (display),
|
||||
_("Invert"), "gegl:invert-gamma",
|
||||
NULL);
|
||||
gimp_image_flush (image);
|
||||
}
|
||||
|
||||
void
|
||||
drawable_linear_invert_cmd_callback (GtkAction *action,
|
||||
gpointer data)
|
||||
{
|
||||
GimpImage *image;
|
||||
GimpDrawable *drawable;
|
||||
GimpDisplay *display;
|
||||
return_if_no_drawable (image, drawable, data);
|
||||
return_if_no_display (display, data);
|
||||
|
||||
gimp_drawable_apply_operation_by_name (drawable, GIMP_PROGRESS (display),
|
||||
_("Linear Invert"), "gegl:invert-linear",
|
||||
NULL);
|
||||
gimp_image_flush (image);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
drawable_value_invert_cmd_callback (GtkAction *action,
|
||||
gpointer data)
|
||||
|
@ -98,7 +114,7 @@ drawable_value_invert_cmd_callback (GtkAction *action,
|
|||
return_if_no_display (display, data);
|
||||
|
||||
gimp_drawable_apply_operation_by_name (drawable, GIMP_PROGRESS (display),
|
||||
_("Invert"), "gegl:value-invert",
|
||||
_("Value Invert"), "gegl:value-invert",
|
||||
NULL);
|
||||
gimp_image_flush (image);
|
||||
}
|
||||
|
|
|
@ -23,6 +23,8 @@ void drawable_equalize_cmd_callback (GtkAction *action,
|
|||
gpointer data);
|
||||
void drawable_invert_cmd_callback (GtkAction *action,
|
||||
gpointer data);
|
||||
void drawable_linear_invert_cmd_callback (GtkAction *action,
|
||||
gpointer data);
|
||||
void drawable_value_invert_cmd_callback (GtkAction *action,
|
||||
gpointer data);
|
||||
void drawable_levels_stretch_cmd_callback (GtkAction *action,
|
||||
|
|
|
@ -78,9 +78,21 @@
|
|||
#include "session.h"
|
||||
#include "splash.h"
|
||||
#include "themes.h"
|
||||
|
||||
#ifdef GDK_WINDOWING_QUARTZ
|
||||
#import <AppKit/AppKit.h>
|
||||
#include <gtkosxapplication.h>
|
||||
|
||||
/* Forward declare since we are building against old SDKs. */
|
||||
#if !defined(MAC_OS_X_VERSION_10_12) || \
|
||||
MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
|
||||
|
||||
@interface NSWindow(ForwardDeclarations)
|
||||
+ (void)setAllowsAutomaticWindowTabbing:(BOOL)allow;
|
||||
@end
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* GDK_WINDOWING_QUARTZ */
|
||||
|
||||
#include "gimp-intl.h"
|
||||
|
@ -247,6 +259,17 @@ gui_init (Gimp *gimp,
|
|||
/* disable automatic startup notification */
|
||||
gtk_window_set_auto_startup_notification (FALSE);
|
||||
|
||||
#ifdef GDK_WINDOWING_QUARTZ
|
||||
/* Before the first window is created (typically the splash window),
|
||||
* we need to disable automatic tabbing behavior introduced on Sierra.
|
||||
* This is known to cause all kinds of weird issues (see for instance
|
||||
* Bugzilla #776294) and needs proper GTK+ support if we would want to
|
||||
* enable it.
|
||||
*/
|
||||
if ([NSWindow respondsToSelector:@selector(setAllowsAutomaticWindowTabbing:)])
|
||||
[NSWindow setAllowsAutomaticWindowTabbing:NO];
|
||||
#endif /* GDK_WINDOWING_QUARTZ */
|
||||
|
||||
gimp_dnd_init (gimp);
|
||||
|
||||
themes_init (gimp);
|
||||
|
|
|
@ -131,7 +131,7 @@ gimp_color_scales_init (GimpColorScales *scales)
|
|||
static const gdouble slider_initial_vals[] =
|
||||
{ 0, 0, 0, 0, 0, 0, 0 };
|
||||
static const gdouble slider_max_vals[] =
|
||||
{ 360, 100, 100, 255, 255, 255, 100 };
|
||||
{ 360, 100, 100, 100, 100, 100, 100 };
|
||||
static const gdouble slider_incs[] =
|
||||
{ 30, 10, 10, 16, 16, 16, 10 };
|
||||
|
||||
|
@ -187,7 +187,7 @@ gimp_color_scales_init (GimpColorScales *scales)
|
|||
slider_initial_vals[i],
|
||||
0.0, slider_max_vals[i],
|
||||
1.0, slider_incs[i],
|
||||
0,
|
||||
1,
|
||||
gettext (enum_desc->value_help),
|
||||
NULL);
|
||||
|
||||
|
@ -310,9 +310,9 @@ gimp_color_scales_update_scales (GimpColorScales *scales,
|
|||
values[GIMP_COLOR_SELECTOR_HUE] = ROUND (selector->hsv.h * 360.0);
|
||||
values[GIMP_COLOR_SELECTOR_SATURATION] = ROUND (selector->hsv.s * 100.0);
|
||||
values[GIMP_COLOR_SELECTOR_VALUE] = ROUND (selector->hsv.v * 100.0);
|
||||
values[GIMP_COLOR_SELECTOR_RED] = ROUND (selector->rgb.r * 255.0);
|
||||
values[GIMP_COLOR_SELECTOR_GREEN] = ROUND (selector->rgb.g * 255.0);
|
||||
values[GIMP_COLOR_SELECTOR_BLUE] = ROUND (selector->rgb.b * 255.0);
|
||||
values[GIMP_COLOR_SELECTOR_RED] = ROUND (selector->rgb.r * 100.0);
|
||||
values[GIMP_COLOR_SELECTOR_GREEN] = ROUND (selector->rgb.g * 100.0);
|
||||
values[GIMP_COLOR_SELECTOR_BLUE] = ROUND (selector->rgb.b * 100.0);
|
||||
values[GIMP_COLOR_SELECTOR_ALPHA] = ROUND (selector->rgb.a * 100.0);
|
||||
|
||||
for (i = 0; i < 7; i++)
|
||||
|
@ -384,15 +384,15 @@ gimp_color_scales_scale_update (GtkAdjustment *adjustment,
|
|||
break;
|
||||
|
||||
case GIMP_COLOR_SELECTOR_RED:
|
||||
selector->rgb.r = value / 255.0;
|
||||
selector->rgb.r = value / 100.0;
|
||||
break;
|
||||
|
||||
case GIMP_COLOR_SELECTOR_GREEN:
|
||||
selector->rgb.g = value / 255.0;
|
||||
selector->rgb.g = value / 100.0;
|
||||
break;
|
||||
|
||||
case GIMP_COLOR_SELECTOR_BLUE:
|
||||
selector->rgb.b = value / 255.0;
|
||||
selector->rgb.b = value / 100.0;
|
||||
break;
|
||||
|
||||
case GIMP_COLOR_SELECTOR_ALPHA:
|
||||
|
|
|
@ -375,9 +375,12 @@ gimp_enum_store_set_icon_prefix (GimpEnumStore *store,
|
|||
|
||||
enum_value = g_enum_get_value (store->enum_class, value);
|
||||
|
||||
icon_name = g_strconcat (icon_prefix, "-",
|
||||
enum_value->value_nick,
|
||||
NULL);
|
||||
if (enum_value)
|
||||
{
|
||||
icon_name = g_strconcat (icon_prefix, "-",
|
||||
enum_value->value_nick,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
gtk_list_store_set (GTK_LIST_STORE (store), &iter,
|
||||
|
|
|
@ -568,6 +568,7 @@
|
|||
<separator />
|
||||
<placeholder name="Invert">
|
||||
<menuitem action="drawable-invert" />
|
||||
<menuitem action="drawable-linear-invert" />
|
||||
<menuitem action="drawable-value-invert" />
|
||||
</placeholder>
|
||||
<separator />
|
||||
|
|
|
@ -38,6 +38,14 @@
|
|||
#define IPTC_PREFIX "Iptc."
|
||||
#define XMP_PREFIX "Xmp."
|
||||
|
||||
/* The length at which to truncate tag values, in characters. */
|
||||
#define TAG_VALUE_MAX_SIZE 1024
|
||||
|
||||
/* The length at which to truncate raw data (i.e., tag values
|
||||
* of type "Byte" or "Undefined"), in bytes.
|
||||
*/
|
||||
#define RAW_DATA_MAX_SIZE 16
|
||||
|
||||
enum
|
||||
{
|
||||
C_XMP_TAG = 0,
|
||||
|
@ -62,21 +70,31 @@ typedef struct
|
|||
|
||||
/* local function prototypes */
|
||||
|
||||
static void query (void);
|
||||
static void run (const gchar *name,
|
||||
gint nparams,
|
||||
const GimpParam *param,
|
||||
gint *nreturn_vals,
|
||||
GimpParam **return_vals);
|
||||
static void query (void);
|
||||
static void run (const gchar *name,
|
||||
gint nparams,
|
||||
const GimpParam *param,
|
||||
gint *nreturn_vals,
|
||||
GimpParam **return_vals);
|
||||
|
||||
static gboolean metadata_dialog (gint32 image_id,
|
||||
GExiv2Metadata *metadata);
|
||||
static gboolean metadata_dialog (gint32 image_id,
|
||||
GExiv2Metadata *metadata);
|
||||
|
||||
static void metadata_dialog_set_metadata (GExiv2Metadata *metadata,
|
||||
GtkBuilder *builder);
|
||||
static void metadata_dialog_set_metadata (GExiv2Metadata *metadata,
|
||||
GtkBuilder *builder);
|
||||
|
||||
static void metadata_dialog_iptc_callback (GtkWidget *dialog,
|
||||
GtkBuilder *builder);
|
||||
static void metadata_dialog_append_tags (GExiv2Metadata *metadata,
|
||||
gchar **tags,
|
||||
GtkListStore *store,
|
||||
gint tag_column,
|
||||
gint value_column);
|
||||
|
||||
static gchar * metadata_dialog_format_tag_value (GExiv2Metadata *metadata,
|
||||
const gchar *tag,
|
||||
gboolean truncate);
|
||||
|
||||
static void metadata_dialog_iptc_callback (GtkWidget *dialog,
|
||||
GtkBuilder *builder);
|
||||
|
||||
|
||||
/* local variables */
|
||||
|
@ -270,47 +288,24 @@ metadata_dialog_set_metadata (GExiv2Metadata *metadata,
|
|||
GtkListStore *exif_store;
|
||||
GtkListStore *xmp_store;
|
||||
gchar **exif_data;
|
||||
gchar **iptc_data;
|
||||
gchar **xmp_data;
|
||||
gchar **iptc_data;
|
||||
gchar *value;
|
||||
gchar *value_utf;
|
||||
GtkTreeIter iter;
|
||||
gint i;
|
||||
|
||||
exif_data = gexiv2_metadata_get_exif_tags (metadata);
|
||||
exif_store = GTK_LIST_STORE (gtk_builder_get_object (builder,
|
||||
"exif-liststore"));
|
||||
xmp_store = GTK_LIST_STORE (gtk_builder_get_object (builder,
|
||||
|
||||
metadata_dialog_append_tags (metadata, exif_data,
|
||||
exif_store, C_EXIF_TAG, C_EXIF_VALUE);
|
||||
|
||||
xmp_data = gexiv2_metadata_get_xmp_tags (metadata);
|
||||
xmp_store = GTK_LIST_STORE (gtk_builder_get_object (builder,
|
||||
"xmp-liststore"));
|
||||
|
||||
exif_data = gexiv2_metadata_get_exif_tags (metadata);
|
||||
|
||||
for (i = 0; exif_data[i] != NULL; i++)
|
||||
{
|
||||
gtk_list_store_append (exif_store, &iter);
|
||||
value = gexiv2_metadata_get_tag_interpreted_string (metadata,
|
||||
exif_data[i]);
|
||||
value_utf = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
|
||||
|
||||
gtk_list_store_set (exif_store, &iter,
|
||||
C_EXIF_TAG, exif_data[i],
|
||||
C_EXIF_VALUE, value_utf,
|
||||
-1);
|
||||
}
|
||||
|
||||
xmp_data = gexiv2_metadata_get_xmp_tags (metadata);
|
||||
|
||||
for (i = 0; xmp_data[i] != NULL; i++)
|
||||
{
|
||||
gtk_list_store_append (xmp_store, &iter);
|
||||
value = gexiv2_metadata_get_tag_interpreted_string (metadata,
|
||||
xmp_data[i]);
|
||||
value_utf = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
|
||||
|
||||
gtk_list_store_set (xmp_store, &iter,
|
||||
C_XMP_TAG, xmp_data[i],
|
||||
C_XMP_VALUE, value_utf,
|
||||
-1);
|
||||
}
|
||||
metadata_dialog_append_tags (metadata, xmp_data,
|
||||
xmp_store, C_XMP_TAG, C_XMP_VALUE);
|
||||
|
||||
iptc_data = gexiv2_metadata_get_iptc_tags (metadata);
|
||||
|
||||
|
@ -319,15 +314,15 @@ metadata_dialog_set_metadata (GExiv2Metadata *metadata,
|
|||
GtkWidget *widget;
|
||||
|
||||
widget = GTK_WIDGET (gtk_builder_get_object (builder, iptc_data[i]));
|
||||
value = gexiv2_metadata_get_tag_interpreted_string (metadata,
|
||||
iptc_data[i]);
|
||||
value_utf = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
|
||||
|
||||
value = metadata_dialog_format_tag_value (metadata, iptc_data[i],
|
||||
/* truncate = */ FALSE);
|
||||
|
||||
if (GTK_IS_ENTRY (widget))
|
||||
{
|
||||
GtkEntry *entry_widget = GTK_ENTRY (widget);
|
||||
|
||||
gtk_entry_set_text (entry_widget, value_utf);
|
||||
gtk_entry_set_text (entry_widget, value);
|
||||
}
|
||||
else if (GTK_IS_TEXT_VIEW (widget))
|
||||
{
|
||||
|
@ -335,9 +330,135 @@ metadata_dialog_set_metadata (GExiv2Metadata *metadata,
|
|||
GtkTextBuffer *buffer;
|
||||
|
||||
buffer = gtk_text_view_get_buffer (text_view);
|
||||
gtk_text_buffer_set_text (buffer, value_utf, -1);
|
||||
gtk_text_buffer_set_text (buffer, value, -1);
|
||||
}
|
||||
|
||||
g_free (value);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
metadata_dialog_append_tags (GExiv2Metadata *metadata,
|
||||
gchar **tags,
|
||||
GtkListStore *store,
|
||||
gint tag_column,
|
||||
gint value_column)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
const gchar *tag;
|
||||
|
||||
while ((tag = *tags++))
|
||||
{
|
||||
const gchar *tag_label;
|
||||
gchar *value;
|
||||
|
||||
tag_label = gexiv2_metadata_get_tag_label (tag);
|
||||
|
||||
/* skip private tags */
|
||||
if (g_strcmp0 (tag_label, "") == 0 || g_strcmp0 (tag_label, NULL) == 0)
|
||||
continue;
|
||||
|
||||
gtk_list_store_append (store, &iter);
|
||||
|
||||
value = metadata_dialog_format_tag_value (metadata, tag,
|
||||
/* truncate = */ TRUE);
|
||||
|
||||
gtk_list_store_set (store, &iter,
|
||||
tag_column, tag,
|
||||
value_column, value,
|
||||
-1);
|
||||
|
||||
g_free (value);
|
||||
}
|
||||
}
|
||||
|
||||
static gchar *
|
||||
metadata_dialog_format_tag_value (GExiv2Metadata *metadata,
|
||||
const gchar *tag,
|
||||
gboolean truncate)
|
||||
{
|
||||
const gchar *tag_type;
|
||||
gchar *result;
|
||||
|
||||
tag_type = gexiv2_metadata_get_tag_type (tag);
|
||||
|
||||
if (g_strcmp0 (tag_type, "Byte") != 0 &&
|
||||
g_strcmp0 (tag_type, "Undefined") != 0 &&
|
||||
g_strcmp0 (tag_type, NULL) != 0)
|
||||
{
|
||||
gchar *value;
|
||||
gchar *value_utf8;
|
||||
glong size;
|
||||
|
||||
value = gexiv2_metadata_get_tag_interpreted_string (metadata, tag);
|
||||
value_utf8 = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
|
||||
|
||||
g_free (value);
|
||||
|
||||
size = g_utf8_strlen (value_utf8, -1);
|
||||
|
||||
if (! truncate || size < TAG_VALUE_MAX_SIZE)
|
||||
{
|
||||
result = value_utf8;
|
||||
}
|
||||
else
|
||||
{
|
||||
gchar *value_utf8_trunc;
|
||||
GString *str;
|
||||
|
||||
value_utf8_trunc = g_utf8_substring (value_utf8,
|
||||
0, TAG_VALUE_MAX_SIZE);
|
||||
|
||||
g_free (value_utf8);
|
||||
|
||||
str = g_string_new (value_utf8_trunc);
|
||||
|
||||
g_free (value_utf8_trunc);
|
||||
|
||||
g_string_append (str, "... ");
|
||||
g_string_append_printf (str,
|
||||
_("(%lu more character(s))"),
|
||||
size - TAG_VALUE_MAX_SIZE);
|
||||
|
||||
result = g_string_free (str, FALSE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GBytes *bytes;
|
||||
const guchar *data;
|
||||
gsize size;
|
||||
gsize display_size;
|
||||
GString *str;
|
||||
gint i;
|
||||
|
||||
bytes = gexiv2_metadata_get_tag_raw (metadata, tag);
|
||||
data = g_bytes_get_data (bytes, &size);
|
||||
|
||||
if (! truncate)
|
||||
display_size = size;
|
||||
else
|
||||
display_size = MIN (size, RAW_DATA_MAX_SIZE);
|
||||
|
||||
str = g_string_sized_new (3 * display_size);
|
||||
|
||||
for (i = 0; i < display_size; i++)
|
||||
g_string_append_printf (str, i == 0 ? "%02x" : " %02x", data[i]);
|
||||
|
||||
if (display_size < size)
|
||||
{
|
||||
g_string_append (str, " ... ");
|
||||
g_string_append_printf (str,
|
||||
_("(%llu more byte(s))"),
|
||||
(unsigned long long) (size - display_size));
|
||||
}
|
||||
|
||||
result = g_string_free (str, FALSE);
|
||||
|
||||
g_bytes_unref (bytes);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -1375,10 +1375,10 @@ $extra{app}->{code} = <<'CODE';
|
|||
static GimpGradient *
|
||||
gradient_get (Gimp *gimp,
|
||||
const gchar *name,
|
||||
gboolean writable,
|
||||
gboolean writable,
|
||||
gint segment,
|
||||
GimpGradientSegment **seg,
|
||||
GError **error)
|
||||
GError **error)
|
||||
{
|
||||
GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, writable, error);
|
||||
|
||||
|
@ -1397,7 +1397,7 @@ gradient_get_range (Gimp *gimp,
|
|||
gint end_segment,
|
||||
GimpGradientSegment **start_seg,
|
||||
GimpGradientSegment **end_seg,
|
||||
GError **error)
|
||||
GError **error)
|
||||
{
|
||||
GimpGradient *gradient = gimp_pdb_get_gradient (gimp, name, TRUE, error);
|
||||
|
||||
|
|
|
@ -4841,7 +4841,7 @@ gaussian_blur (GimpDrawable *drawable,
|
|||
"operation", "gegl:gaussian-blur",
|
||||
"std-dev-x", horizontal * 0.32,
|
||||
"std-dev-y", vertical * 0.32,
|
||||
"abyss-policy", 1,
|
||||
"abyss-policy", 1,
|
||||
NULL);
|
||||
|
||||
node = wrap_in_gamma_cast (node, drawable);
|
||||
|
|
Loading…
Reference in New Issue