Commit 015f4946 authored by Jehan's avatar Jehan

Issue #6435: Off canvas guides.

Allow guides with off-canvas position since we can now view and work
outside the canvas.

The guide deletion interaction does not change too much, except you
don't delete a guide because it's dropped off-canvas but off the display
viewport area instead.

The XCF format is technically unchanged as PROP_GUIDES was already
expecting an int32 coordinate (with max value at GIMP_MAX_IMAGE_SIZE,
way below uint32 max anyway). Yet our code and XCF docs was explicitly
asking to ignore negative coordinate guides, which makes a change in
behavior for the XCF parser, hence a new version XCF 15. Loading will
still ignore negative position guides (even also bigger than image
dimension guides now) for XCF 14 and below, but will now accept any
position for XCF 15 and above.
parent e8810715
Pipeline #257538 passed with stages
in 38 minutes and 7 seconds
......@@ -42,8 +42,6 @@ gimp_image_add_hguide (GimpImage *image,
GimpGuide *guide;
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
g_return_val_if_fail (position >= 0 &&
position <= gimp_image_get_height (image), NULL);
guide = gimp_guide_new (GIMP_ORIENTATION_HORIZONTAL,
image->gimp->next_guide_id++);
......@@ -66,8 +64,6 @@ gimp_image_add_vguide (GimpImage *image,
GimpGuide *guide;
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
g_return_val_if_fail (position >= 0 &&
position <= gimp_image_get_width (image), NULL);
guide = gimp_guide_new (GIMP_ORIENTATION_VERTICAL,
image->gimp->next_guide_id++);
......@@ -137,12 +133,6 @@ gimp_image_move_guide (GimpImage *image,
{
g_return_if_fail (GIMP_IS_IMAGE (image));
g_return_if_fail (GIMP_IS_GUIDE (guide));
g_return_if_fail (position >= 0);
if (gimp_guide_get_orientation (guide) == GIMP_ORIENTATION_HORIZONTAL)
g_return_if_fail (position <= gimp_image_get_height (image));
else
g_return_if_fail (position <= gimp_image_get_width (image));
if (gimp_guide_is_custom (guide))
push_undo = FALSE;
......
......@@ -2821,10 +2821,30 @@ gimp_image_get_xcf_version (GimpImage *image,
if (g_list_length (gimp_image_get_selected_layers (image)) > 1)
{
ADD_REASON (g_strdup_printf (_("Multiple layer selection was "
"added in %s"), "GIMP 2.10.20"));
"added in %s"), "GIMP 3.0.0"));
version = MAX (14, version);
}
if ((list = gimp_image_get_guides (image)))
{
for (; list; list = g_list_next (list))
{
gint32 position = gimp_guide_get_position (list->data);
if (position < 0 ||
(gimp_guide_get_orientation (list->data) == GIMP_ORIENTATION_HORIZONTAL &&
position > gimp_image_get_height (image)) ||
/* vertical guide. */
position > gimp_image_get_width (image))
{
ADD_REASON (g_strdup_printf (_("Off-canvas guides "
"added in %s"), "GIMP 3.0.0"));
version = MAX (15, version);
break;
}
}
}
#undef ADD_REASON
switch (version)
......@@ -2854,6 +2874,11 @@ gimp_image_get_xcf_version (GimpImage *image,
if (gimp_version) *gimp_version = 210;
if (version_string) *version_string = "GIMP 2.10";
break;
case 14:
case 15:
if (gimp_version) *gimp_version = 300;
if (version_string) *version_string = "GIMP 3.0";
break;
}
if (version_reason && reasons)
......
......@@ -176,9 +176,7 @@ gimp_guide_tool_button_release (GimpTool *tool,
n_non_custom_guides += ! guide->custom;
if (guide->position == GIMP_GUIDE_POSITION_UNDEFINED ||
guide->position < 0 ||
guide->position > max_position)
if (guide->position == GIMP_GUIDE_POSITION_UNDEFINED)
{
remove_guides = TRUE;
}
......
......@@ -889,8 +889,14 @@ xcf_load_image_props (XcfInfo *info,
xcf_read_int32 (info, (guint32 *) &position, 1);
xcf_read_int8 (info, (guint8 *) &orientation, 1);
/* skip -1 guides from old XCFs */
if (position < 0)
/* Some very old XCF had -1 guides which have been
* skipped since 2003 (commit 909a28ced2).
* Then XCF up to version 14 only had positive guide
* positions.
* Since XCF 15 (GIMP 3.0), off-canvas guides became a
* thing.
*/
if (info->file_version < 15 && position < 0)
continue;
GIMP_LOG (XCF, "prop guide orientation=%d position=%d",
......@@ -899,11 +905,23 @@ xcf_load_image_props (XcfInfo *info,
switch (orientation)
{
case XCF_ORIENTATION_HORIZONTAL:
gimp_image_add_hguide (image, position, FALSE);
if (info->file_version < 15 && position > gimp_image_get_height (image))
gimp_message (info->gimp, G_OBJECT (info->progress),
GIMP_MESSAGE_WARNING,
"Ignoring off-canvas horizontal guide (position %d) in XCF %d file",
position, info->file_version);
else
gimp_image_add_hguide (image, position, FALSE);
break;
case XCF_ORIENTATION_VERTICAL:
gimp_image_add_vguide (image, position, FALSE);
if (info->file_version < 15 && position > gimp_image_get_width (image))
gimp_message (info->gimp, G_OBJECT (info->progress),
GIMP_MESSAGE_WARNING,
"Ignoring off-canvas vertical guide (position %d) in XCF %d file",
position, info->file_version);
else
gimp_image_add_vguide (image, position, FALSE);
break;
default:
......
......@@ -82,7 +82,8 @@ static GimpXcfLoaderFunc * const xcf_loaders[] =
xcf_load_image, /* version 11 */
xcf_load_image, /* version 12 */
xcf_load_image, /* version 13 */
xcf_load_image /* version 14 */
xcf_load_image, /* version 14 */
xcf_load_image /* version 15 */
};
......
......@@ -176,10 +176,14 @@ other than 8-bit gamma), zlib compression and 64-bit offsets for XCF
files bigger than 4GB.
Version 14:
Since GIMP 2.10.20, released on 2020-MM-DD.
Since GIMP 3.0.0, released on TODO.
Allows multiple layers to have the property PROP_ACTIVE_LAYER, hence
multiple layers selected at once.
Version 15:
Since GIMP 3.0.0, released on TODO.
PROP_GUIDES now allows off-canvas guide positions, i.e. negative
positions and over canvas-dimensions positions.
1. BASIC CONCEPTS
=================
......@@ -872,7 +876,9 @@ PROP_GUIDES (editing state)
It appears if any guides have been defined.
Some old XCF files define guides with negative coordinates; those
should be ignored by readers.
should be ignored by readers for XCF < 15. Since XCF 15, off-canvas
guides are possible, such as negative coordinates or bigger than the
canvas width/height.
PROP_PATHS
uint32 23 Type identification
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment