OK...  Since the bug tracker seems to have lost the bug report that I
wrote last week and I don't want to re-type it until I am sure that it
will not be lost again, I will post a description of the problem
here...

Almost all File->Save plug-ins that are designed for single-layer file
formats (i.e. almost everything but .XCF) will save the current layer
(drawable) and ignore any other information from the image.  In some
cases, you could loose some of your work because of that.  The
following things are ignored when the current layer is saved:
1) canvas size
2) layer offset
3) layer mask (or layer itself, if a mask or a channel is selected!)
4) layer opacity

This bug exists in all versions of the Gimp, from 0.99.x to 1.1.27.
The first part of the problem (canvas size) was reported in #23610
(http://bugs.gnome.org/db/23/23610.html) but this bug is assigned to
"gimp-1.0", that's why I wanted to submit a more detailled report for
the current Gimp.

Most of the time, the bug (or design problem) will not be visible
because the "Export" feature will hide it: if the source image
contains several layers, flattening it will make the resulting
drawable equal to the visible image.  The "Export" feature will also
be triggered for a single-layer image with alpha if the output format
does not support transparency.  But in all other cases (e.g saving as
GIF, TIFF or PNG, or saving an image without alpha as JPEG), then some
information will be lost.

Problems:

1) Ignoring the canvas size means that the saved file may contain some
   areas that should not be part of the visible image.  This is the
   problem reported in bug #23610 for gimp-1.0.4.

2) Ignoring the layer offset has the same effects as ignoring the
   canvas size: some parts of the layer may be outside of the canvas
   and should not be saved.

   Try this: load a file, then change the canvas size or move the
   layer with the move tool.  Save as GIF or JPEG and load the
   resulting file.  You will still see the original layer.  If you
   save as PNG and re-load, the layer offset will be saved but the
   layer will not be clipped to the canvas size (the result is
   confusing).

3) Ignoring the layer mask (or ignoring the layer data if the mask or
   a selection channel is selected) is the most dangerous part of this
   bug: you could loose some data if you do not see what went wrong
   and you do not have a copy of your source image in .XCF format.

   Try this: create or open an image, then add a layer mask and draw
   something in it.  Then save the image using a format that supports
   transparency (so that "Export" is not triggered) such as PNG, GIF
   or TIFF.  Depending on what was selected when you saved, the file
   will only contain the layer data without the mask, or only the mask
   (or selection channel) but not the image.  Oops!  You have lost
   half of your work...

4) Ignoring the layer opacity is a lesser problem.  But if you open a
   PNG image with transparency and move the opacity slider in order to
   make it more transparent, you could expect that the result would be
   correctly saved in a new PNG file, but it is not.  The result will
   be identical to the original image because the layer opacity was
   ignored.  Playing with transparency could become more frequent when
   more web browsers support PNG with alpha (correctly).

All these effects are related to the same design problem: most of the
File->Save plug-ins see only the current drawable and ignore the other
parameters of the image.  This is even worse when you correlate this
with bug #25272 (http://bugs.gnome.org/db/25/25272.html): the .xvpics
thumbnails are generated from the visible image, not from what gets
saved in the file.  So you may save your image and think that
everything went well when you see the thumbnails, but the contents of
the file are actually different.

What is the best way to fix these problems?  I don't know.  Some
changes could be done in the main app, and some others in the
plug-ins.  For example, the PNG plug-in is the only one (AFAIK) that
saves the layer offset because the file format supports this feature
(but it should also consider the canvas size).  The other plug-ins
could clip the layer to the canvas, but then the "Export" feature
should also be triggered for non-transparent file formats if some
areas are transparent because they are within the canvas but outside
the layer boundaries.

The most dangerous error is described in (3) and also as an example in
bug #25272: you could loose some of your work if a layer mask or a
channel mask is saved when you thought that the current layer would be
saved.  I don't know how to prevent that...  Maybe there could be a
warning if you attempt to save anything that is not the current layer
(but then we should also add an option in the gimprc to disable the
warning, and we are in feature freeze...).  At least, it would be nice
to have a warning if a channel mask is going to be saved (i.e. a
channel is active and you selected a file format other than XCF) and
the corresponding tab of the L&C&P dialog is not open, which indicates
that the user is probably about to make a mistake.

I think that the solution should be discussed here before attempting
to implement it, because it will affect most file plug-ins and it
should be designed carefully.  So, who starts with the suggestions?  :-)

-Raphael

Reply via email to