forked from FHPythonUtils/GimpFormats
-
Notifications
You must be signed in to change notification settings - Fork 0
/
xcfSpec.txt
1629 lines (1304 loc) · 65.6 KB
/
xcfSpec.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
====================================
DOCUMENTATION OF THE XCF FILE FORMAT
====================================
THIS FILE IS GPL2
Introduction
------------
This document describes the native image file format of GIMP.
Note that the XCF format is a "living" format which follows closely the
GIMP software and evolves together. The ultimate reference for the
format is therefore its code, even though we will try to update this
documentation regularly, to make life simpler to ourselves as well as
third-party XCF-reader's developers.
The code for reading and writing XCF is found in: app/xcf/
License
-------
Copyright Henning Makholm <[email protected]>, 2006-07-11
Copyright various GIMP developers (see git log), 2009-2019
This is free documentation; you can modify and/or redistribute
it according to the terms of the GNU General Public License
as published by the Free Software Foundation, either version
2 of the license, or (at your option) any later version.
Table of contents
-----------------
Documentation of the XCF file format
License
Table of contents
Audience
Scope
Status
Version history
1. Basic concepts
XCF file
Basic data types
Canvas
Color
Pixel data: Tiles
Pixel data: Levels of detail hierarchy
Channels
Layers
Layer masks
Properties
Parasites
Selections
Floating selection
Tattoos
2. General properties
3. The Image structure
Header
Image properties
4. The Channel structure
Channel properties
5. The Layer structure
Layer properties
6. The Hierarchy structure
Levels
7. Tile data organization
Uncompressed tile data
RLE compressed tile data
8. Miscellaneous
The name XCF
Audience
--------
Audience of this document are developers of GIMP and other software that
reads and writes XCF files.
Scope
-----
The XCF format is designed to store the whole state of GIMP that is specific to
one image (i.e., not the cut buffer, tool options, key bindings, etc.) and
is not undo data. This makes the full collection of data stored in an XCF file
rather heterogeneous and tied to the internals of GIMP.
Use of the XCF format by third-party software is recommended only as a
way to get data into and out of GIMP for which it would be impossible or
inconvenient to use a more standard interchange format. Authors of
third-party XCF-creating software in particular should take care to
write files that are as indistinguishable as possible from ones saved by
GIMP. The GIMP developers take care to make each version of GIMP able to
read XCF files produced by older GIMP versions, but they make no special
efforts to allow reading of XCF files created by other software.
Interchanging image data with other applications is not the goal of the
XCF format. Other formats may be more appropriate. For this use case
GIMP opens and exports common images formats, like JPEG, PNG and PSD,
though they may all miss various features of XCF.
OpenRaster (ORA) in particular is meant to be a generic interchange
format between software, with as few feature loss as possible, though
its standardization is still quite slow.
For the stated reasons and clarification GIMP _saves_ XCF files,
but _exports_ to other image formats.
Beware that CinePaint's native file format is called XCF, too. While it is
derived from the format described here, both formats differ in many details
and are _not_ mutually compatible.
This document does not describe the CinePaint XCF format.
For more information on that see:
https://web.archive.org/web/20161024115140/http://www.cinepaint.org/more/docs/xcf.html
Status
------
This specification is an official condensation and extrapolation of
the XCF-writing and -reading code in version 2.10.14 of GIMP, and
earlier versions. Yet we remind that the ultimate reference is the
loading and saving code of the XCF format.
Some of the normative statements made below are enforced by the XCF
code in GIMP; others are just the authors' informed guess about
"best practices" that would be likely to maximize interoperability
with future versions of GIMP.
This document is complete, relatively to GIMP 2.10 features stored in
the XCF format, though if you discover any errors or missing features,
we would be thankful if you could report it as a bug:
https://gitlab.gnome.org/GNOME/gimp/issues
Version history
---------------
This section lists the changes between file format versions in bigger terms.
Details are denoted in the text.
Version 0:
Since GIMP 0.99.16, released on 1997-12-15.
The initial file format. Everything that is not listed in the following versions
is part of this.
Version 1:
Since GIMP 0.99.16, released on 1997-12-15.
Adds color maps. Chapter 3 "The image structure" describes the PROP_COLOR_MAP
property.
Version 2:
Since GIMP 1.3.10, released on 2002-11-07.
Adds layer modes "Soft light", "Grain extract", "Grain merge" and painting
mode "Color Erase". In chapter 5 "The layer structure" the description of
the property PROP_MODE contains the new layer modes.
Improves path handling in GIMP 1.3.21, released on 5.10.2003.
Chapter 1 "Basic concepts" describes the path handling in general and
chapter 2 "General concepts" introduces the PROP_VECTORS property.
Version 3:
Since GIMP 2.7.1, released on 2010-06-29.
Adds layer groups. The chapter 5 "The layer structure" describes the new
properties PROP_GROUP_ITEM, PROP_GROUP_ITEM_FLAGS and PROP_ITEM_PATH.
Version 4 to 13:
Since GIMP 2.10.0, released on 2018-04-27.
Adds many layer modes, layer group masks, high-bit depth (precisions
other than 8-bit gamma), zlib compression and 64-bit offsets for XCF
files bigger than 4GB.
1. BASIC CONCEPTS
=================
It is recommended that a software developer who wants to take full
advantage of the XCF format be deeply familiar with GIMP at least
as a user. The following high-level overview is meant to help those
non-users who just need to extract pixel data from an XCF file get up
to speed.
XCF file
--------
An XCF file is a sequence of bytes. In general an XCF file describes a stack of
layers and channels on a canvas.
It contains a series of data structures, the order of which is in general not
significant. The exception to this is that the main image structure must come at
the very beginning of the file, and that the tile data blocks for each drawable
must follow each other directly.
References _between_ structures in the XCF file take the form of
"pointers" that count the number of bytes between the beginning
of the XCF file and the beginning of the target structure.
Pointers used to be 32-bit data. Since the maximum address of a layer,
channel, hierarchy or tile set was 2^32 - 1, i.e. at 4 GB, the maximum
size for XCF images before GIMP 2.10.0 was quite limited.
Now pointers can be 64-bit, allowing files big enough for any image
produced by current technology. See the chapter "Basic data types" for
description of the POINTER type.
Each structure is designed to be written and read sequentially; many
contain items of variable length and the concept of an offset _within_
a data structure is not often relevant.
Basic data types
----------------
A WORD is a 32-bit integer stored as 4 bytes in big-endian order, i.e. with
the most significant byte first. The word is not necessarily aligned to an
offset within the XCF file that is a multiple of 4.
Depending on the context the word can be unsigned or (2's complement) signed.
UINT32 denotes unsigned words and INT32 denotes signed words in this document.
A FLOAT is stored as a 32-bit IEEE 754 single-precision floating-point number
in big-endian order.
A STRING is stored as follows:
uint32 n+1 Number of bytes that follow, including the zero byte
byte[n] ... String data in Unicode, encoded using UTF-8
byte 0 Zero marks the end of the string.
Exception: the empty string is stored simply as an uint32 with the
value 0.
A POINTER is stored as a 32-bit integer (4 bytes) in big-endian order
for XCF up to 10, and 64-bit (8 bytes), still big-endian, for XCF 11
and over, allowing higher than 4GB XCF files since GIMP 2.10.0.
Canvas
------
A canvas is an abstract rectangular viewport for the layers and channels.
The image header stores the canvas' dimensions.
Color
-----
RGB:
Three intensity values for red, green, and blue additive color
components. The exact format depends on the field 'precision' of the
image header. If this field is absent (i.e. for XCF version 3 or
before), "8-bit gamma integer" is assumed, which means each component is
on a scale from 0 to 255, with the intensity values considered nonlinear
samples that map to physical light intensities using a power function
with an exponent ("gamma") of about 2.5 (this is how PC hardware
commonly treat bit values in the video buffer, which incidentally
also has the property of making each 1/255th step about equally
perceptible to the human eye when the monitor is correctly
adjusted).
When the precision field is present though, it defines the storage
format and the exact color space depends on the color profile attached
to the image. The color profile is saved as a parasite named
"icc-profile" on the image. If no profile is set, sRGB is assumed.
Beware, however, that **before GIMP 2.10**, GIMP's compositing
algorithms (as described in the document compositing.txt) implicitly
treated the intensities as _linear_ samples. The XCF file format had no
support for storing the intended gamma of the samples.
Since GIMP 2.10.0 and over, you must rely on PROP_COMPOSITE_MODE,
PROP_COMPOSITE_SPACE and PROP_BLEND_SPACE for compositing and blending.
Grayscale:
One intensity value. Grayscale has the same precision considerations as
for RGB and it can also have a profile since GIMP 2.10.0, as well as
compositing and blending rules.
On older XCF without precision field, the value was simply on a scale
from 0 (black) to 255 (white).
Indexed:
An 8-bit index into a color map that is shared between all
layers. The color map maps each index to an RGB triple which is
interpreted as in the RGB model.
It is to be noted that Indexed image in GIMP is limited to 8-bit integer
RGB, even in GIMP 2.10.
Pixel data: Tiles
-----------------
Basically pixels are organized in a grid of "tiles", each
with a width and height of up to 64 pixels. The only tiles that have a
width less than 64 are those in the rightmost column, and the only
tiles that have a height less than 64 are those in the bottommost row.
Thus, a layer measuring 200 x 150 pixels will be divided into 12
tiles:
+-----------------+-----------------+------------------+-----------------+
| Tile 0: 64 x 64 | Tile 1: 64 x 64 | Tile 2: 64 x 64 | Tile 3: 8 x 64 |
+-----------------+-----------------+------------------+-----------------+
| Tile 4: 64 x 64 | Tile 5: 64 x 64 | Tile 6: 64 x 64 | Tile 7: 8 x 64 |
+-----------------+-----------------+------------------+-----------------+
| Tile 8: 64 x 22 | Tile 9: 64 x 22 | Tile 10: 64 x 22 | Tile 11: 8 x 22 |
+-----------------+-----------------+------------------+-----------------+
As can be seen from this example, the tiles appear in the XCF file in
row-major, top-to-bottom, left-to-right order. The dimensions of the
individual tiles are not stored explicitly in the XCF file, but must
be computed by the reader.
The tiles that are pointed to by a single level structure must be
contiguous in the XCF file, because GIMP's XCF reader uses the
difference between two subsequent tile pointers to judge the amount of
memory it needs to allocate for internal data structures.
Pixel data: Levels of detail hierarchy
--------------------------------------
The tiles themselves are organized in levels of detail. These levels
build a hierarchy.
Only the first level structure is used by GIMP's XCF reader,
except that the reader checks that a terminating zero for the
level-pointer list can be found. GIMP's XCF writer creates a
series of dummy level structures (with NULL-pointers to the tiles), each
declaring a height and width half of the previous one (rounded down),
until the height and with are both less than 64. Thus, for a layer of
200 x 150 pixels, this series of levels will be saved:
A level of 200 x 150 pixels with 12 tiles: the actually used one
A level of 100 x 75 pixels with no tiles
A level of 50 x 37 pixels with no tiles
Third-party XCF writers should probably mimic this entire structure;
robust XCF readers should have no reason to even read past the pointer
to the first level structure.
TODO: The XCF file holds (for unclear historical reasons)
a level-of-detail hierarchy, but we only use the
lowest hierarchy level of it and other XCF consumers
are told to do the same. This looks like a mipmap. Would
using it to save an image pyramid or the thumbnail
for the File dialogs get us some benefits?
Channel
-------
A channel is a named object that contains a single byte of information
for each pixel in the canvas area. Channels have a variety of use as
intermediate objects during editing; they are not meant to be rendered
directly when the final image is displayed or exported to layer-less
formats. A major use of channels is as a store for saved selections.
A channel can be edited as if it was a grayscale layer with the same
dimensions as the canvas. When it is shown in the GIMP editor UI
together with other layers, it is used as if it was the _inverse_
alpha channel of a layer with the same color information in all
pixels; this color can be stored in the XCF file as a property of the
channel. This "mask" representation is generally thought of as an UI
feature rather than an intrinsic semantics of a channel.
Though the channel data structure in the XCF file contains a height
and width field, these must always be the same as the canvas width and
height.
TODO: does this apply to any channel or only to selections?
Layer
-----
A layer is a named rectangular area of pixels which has a definite
position with respect to the canvas. It may extend beyond the canvas or
(more commonly) only cover some of it. Each pixel of the layer has a color
which is specified in one of three ways as described in the "Color" section.
All layers in an image must use the same color model.
Exception: if the "floating selection" (see below) belongs to a channel or
layer mask, it will be represented as grayscale pixels with alpha independently
of the image's overall color model.
Each pixel of a layer also has an alpha component which specifies the
opacity of the pixel on a linear scale from 0 (denoting an alpha of
0.0, or completely transparent) to 255 (denoting an alpha of 1.0, or
completely opaque). The color values do not use "premultiplied alpha"
storage. The color information for pixels with alpha 0 _may_ be
meaningful; GIMP preserves it when parts of a layer are erased and
provides (obscure) ways of recovering it in its user interface.
The bottommost layer _only_ in an image may not contain alpha
information; in this case all pixels in the layer have an alpha value
of 255. (Even if the bottommost layer does not cover the entire
canvas, it is the only layer that can be without an explicit alpha
channel).
In images that use the indexed color model, GIMP does not support
partial transparency and interprets alpha values from 0 to 127 as
fully transparent and values from 128 to 255 as fully opaque. This
behavior _may_ change in future versions of GIMP.
TODO: has already changed?
Layers have certain other properties such as a visibility flag,
a global opacity (which is multiplied with individual pixel alphas)
a layer group flag and various editing state flags.
Layer mask
----------
The layer mask can be attached to a layer (since GIMP 2.10.0, layer
group can also have a layer mask).
Actually it is represented as a channel structure in the XCF file.
It is referred to from its parent layer and not listed in the master list
of channels.
Its dimensions and placement coincide with those of its parent layer.
Unless disabled by the PROP_APPLY_MASK property, the layer mask
functions as an extra alpha channel for the layer, in that for each
pixel the layer's alpha byte and the layer mask byte are multiplied to
find the extent to which the layer blankets the background. Thus a
layer mask can make parts of the layer more transparent, but never
more opaque.
Properties
----------
Properties are an extension mechanism to attribute the image, channels
and layers. Some are attributes for general use, such as PROP_END,
others are specific to the image, a channel or a layer.
Technically properties are implemented as variable-length series of
variable-length PROPERTY records which have the following general format
uint32 type Numerical type identifier
uint32 plength Payload length in bytes (but BEWARE! see below)
byte[n] ... Payload - interpretation depends on the type
The authoritative source for property type numbers is the file
app/xcf/xcf-private.h in the GIMP sources. Only GIMP itself should define
new property types.
The number of properties in a property list is not stored explicitly;
the last property in the list is identified by having type 0; it must
have length 0.
XCF readers must skip and ignore property records of unrecognized
type, and the length word is there to support such skipping. However,
GIMP's own XCF reader will _ignore_ the length word of most
properties that it _does_ recognize, and instead reads the amount of
payload it knows this property to have. This means that a property
record is not itself extensible: one cannot piggyback extra data onto
an existing property record by increasing its length. Also, some
historical versions of GIMP actually stored the wrong length for
some properties, so there are XCF files with misleading property
length information in circulation. For maximal compatibility, an XCF
reader should endeavor to know the native lengths of as many
properties as possible and fall back to the length word only for truly
unknown property types.
There is not supposed to be more than one instance of each property in
a property list, but some versions of GIMP will erroneously emit
duplicate properties. An XCF reader that meets a duplicated property
should let the content of the later instance take precedence, except
for properties that contain lists of subitems, in which the lists
should generally be concatenated. An XCF writer should never
deliberately duplicate properties within a single property list.
Parasites
---------
Parasites provide a second level of extensibility.
A parasite is analogous to a property, but is identified by a string
rather than a number. This makes a larger namespace available for
parasites. GIMP plug-ins can access the parasites of an image
component through the API and can define their own parasite
names which will be ignored by other plug-ins.
A list of known parasites and their data formats can be found in the
file devel-doc/parasites.txt of the GIMP source tree.
The PROP_PARASITE property stores the parasites of the image, layers
and channels and the PROP_VECTORS property those of the paths.
The number of parasites there is not directly encoded; the list ends when
the total length of the parasite data read equals the property payload length.
GIMP's XCF reader checks that the combined size of all parasites
in the property precisely equals the length word, so it is safe for
a reader to use the length word to skip the property without parsing
the individual parasites.
The parasite content may be binary, but often a textual encoding is
chosen in order to spare the writing and reading code of having to deal
with byte ordering.
There can only be one parasite with a given name attached to
each element of the image. Some versions of GIMP will
erroneously write some parasites twice in the same property list;
XCF readers must be prepared to gracefully ignore all but the
last instance of a parasite name in each property list.
TODO: How shall parasite readers handle lists in duplicate parasites?
Selection
---------
If the current selection in the editor is nonempty, then GIMP stores it
as a channel in the XCF file. Pixels with a value of 255 belong to the
selection; pixels with a value of 0 don't, and pixels with intermediate
values are partially selected.
Floating selection
------------------
A floating selection is a selection, that is attached to a particular
layer, channel or layer mask.
Technically it is handled as a layer with alpha.
If a floating selection exists, it must always be the first layer in
the layer list, but it is not rendered at that position in the layer stack.
Instead it is logically attached to another layer, or a channel or layer mask,
and the content of the floating selection is combined with ("anchored to")
that drawable before it is used to render the visible image.
The floating selection must not have a layer mask of its own, but if
an ordinary (not floating) selection also exists, it will be used as
a layer mask for the floating selection.
If a floating selection exists, it must also be the active layer.
Because the floating selection is modal and ephemeral, users rarely
save XCF files containing a floating selection. It may be acceptable
for third-party XCF consumers to ignore the floating selection or
explicitly refuse to process it.
Tattoos
-------
A tattoo is a unique and permanent identifier attached to a drawable or path
that can be used to uniquely identify it within an image even between sessions.
The tattoo of the image, a layer or channel is stored in the PROP_TATTOO
property, a tattoo for a path in the PROP_VECTORS property.
The PROP_TATTOO property of the entire image stores a "high-water
mark" for the entire image; it is greater than OR EQUAL TO any
tattoo for an element of the image. It allows efficient generation
of new unused tattoo values and also prevents old tattoo numbers
from being reused within a single image, lest plug-ins that use
the tattoos for bookkeeping get confused.
An XCF file must either provide tattoo values for all its elements
or for none of them. GIMP will invent fresh tattoos when it
reads in tattoo-less elements, but it does not attempt to keep them
different from ones specified explicitly in the file.
TODO: can this cause confusion and hard-to-find errors? If so, fix.
Text
----
GIMP stores text in plain layers with parasites for the text and formatting
and PROP_TEXT_LAYER_FLAGS for flags.
Vector paths
------------
GIMP stores vector paths as properties of the image.
If all paths are continuous sequences of Bezier strokes, then GIMP uses
the PROP_PATHS property, otherwise PROP_VECTORS. PROP_PATHS is for old
files from GIMP up to version 1.2.
2. GENERAL PROPERTIES
=====================
This chapter describes the formats of the defined property records that
can appear in more than one context in an XCF file.
PROP_COLOR_TAG (since GIMP 2.10.0, commit 4f9095798d0)
uint32 34 Type identification
uint32 4 Four bytes of payload
uint32 tag Color tag of the layer; one of
0: None
1: Blue
2: Green
3: Yellow
4: Orange
5: Brown
6: Red
7: Violet
8: Gray
PROP_COLOR_TAG can be assigned to layers, channels and paths. They are
only organisational properties and have no consequence on render.
PROP_END
uint32 0 Type identification
uint32 0 PROP_END has no payload.
The PROP_END pseudo-property marks the end of any property list.
PROP_FLOAT_OPACITY (essential, since GIMP 2.10.0, commit a2ad257711a)
uint32 33 Type identification
uint32 4 Four bytes of payload
float opacity Opacity on a scale from 0.0 (fully transparent) to
1.0 (fully opaque)
PROP_FLOAT_OPACITY records the overall opacity setting for the layer
or channel. Since GIMP 2.10.0, it always appears in the property list
of layers and channels after PROP_OPACITY, which saves the same value,
yet with integer precision. This way, new readers can overwrite the
8-bit value with proper precision whereas older readers can simply
skip PROP_FLOAT_OPACITY if unknown.
PROP_LINKED (editing state)
uint32 9 Type identification
uint32 4 Four bytes of payload
uint32 linked 1 if the layer is linked; 0 if not
PROP_LINKED controls the behavior of Transform tools with a layer,
channel or path. If a Transform tool is used to transform one of them
all other linked elements will be transformed the same way.
It appears in the property list for layers, channels and paths.
PROP_LOCK_CONTENT (since version 3, editing state)
uint32 28 Type identification
uint32 4 Four bytes of payload
uint32 locked 1 if the content is locked; 0 if not
PROP_LOCK_CONTENT specifies whether the layer, channel or path is locked,
i.e. cannot be edited.
PROP_LOCK_POSITION (since GIMP 2.10.0, commit d4933b30526, editing state)
uint32 32 Type identification
uint32 4 Four bytes of payload
uint32 locked 1 if the position is locked; 0 if not
PROP_LOCK_POSITION specifies whether the layer, channel or path's
position is locked, i.e. cannot be transformed (translation, etc.).
PROP_OPACITY (essential)
uint32 6 Type identification
uint32 4 Four bytes of payload
uint32 opacity Opacity on a scale from 0 (fully transparent) to
255 (fully opaque)
PROP_OPACITY records the overall opacity setting for the layer or channel.
It appears in the property list of layers and channels.
Note that though GIMP's user interface displays the opacity as a percentage,
it is actually stored on a 0-255 scale. Also note that this opacity value
is stored as a 32-bit quantity even though it has been scaled to
fit exactly in a single byte.
When reading old XCF files that lack this property, full opacity
should be assumed.
While this property continues to be stored for compatibility, the new
property PROP_FLOAT_OPACITY since GIMP 2.10.0 must override the value
of PROP_OPACITY with float precision.
PROP_PARASITES
uint32 21 Type identification
uint32 plength Total length of the following payload data in bytes
,----------------- Repeat for each parasite:
| string name Name of the parasite
| uint32 flags Flags of the parasite
| uint32 pplength Length of the payload data in bytes
| byte[n] ... Parasite-specific payload
`--
PROP_PARASITES stores parasites. It can contain multiple parasite records.
See "Basic concepts" and the file parasites.txt for more information about
parasites.
This property can appear in any property list.
PROP_TATTOO (internal GIMP state)
uint32 20 Type identification
uint32 4 Four bytes of payload
uint32 tattoo Nonzero unsigned integer identifier
PROP_TATTOO is an unique identifier for the denoted image, channel or layer.
It appears in the property list of layers, channels, and the image.
PROP_VISIBLE (essential)
uint32 8 Type identification
uint32 4 Four bytes of payload
uint32 visible 1 if the layer/channel is visible; 0 if not
PROP_VISIBLE specifies the visibility of a layer or channel.
It appears in the property list for layers and channels.
For the visibility of a path see the PROP_VECTORS property.
When reading old XCF files that lack this property, assume that
layers are visible and channels are not.
3. THE IMAGE STRUCTURE
======================
Header
------
The image structure always starts at offset 0 in the XCF file.
byte[9] "gimp xcf " File type identification
byte[4] version XCF version
"file": version 0
"v001": version 1
"v002": version 2
"v003": version 3
byte 0 Zero marks the end of the version tag.
uint32 width Width of canvas
uint32 height Height of canvas
uint32 base_type Color mode of the image; one of
0: RGB color
1: Grayscale
2: Indexed color
(see enum GimpImageBaseType
in libgimpbase/gimpbaseenums.h)
uint32 precision Image precision; this field is only present for
XCF 4 or over (since GIMP 2.10.0). Its value for
XCF 7 or over is one of:
100: 8-bit linear integer
150: 8-bit gamma integer
200: 16-bit linear integer
250: 16-bit gamma integer
300: 32-bit linear integer
350: 32-bit gamma integer
500: 16-bit linear floating point
550: 16-bit gamma floating point
600: 32-bit linear floating point
650: 32-bit gamma floating point
700: 64-bit linear floating point
750: 64-bit gamma floating point
For XCF 4 (which was a development version, hence
this format should not be found often and may be
ignored by readers), its value may be one of:
0: 8-bit gamma integer
1: 16-bit gamma integer
2: 32-bit linear integer
3: 16-bit linear floating point
4: 32-bit linear floating point
For XCF 5 or 6 (which were development versions,
hence these formats may be ignored by readers),
its value may be one of:
100: 8-bit linear integer
150: 8-bit gamma integer
200: 16-bit linear integer
250: 16-bit gamma integer
300: 32-bit linear integer
350: 32-bit gamma integer
400: 16-bit linear floating point
450: 16-bit gamma floating point
500: 32-bit linear floating point
550: 32-bit gamma floating point
NOTE: XCF 3 or older's precision was always
"8-bit gamma integer".
property-list Image properties
,----------------- Repeat once for each layer, topmost layer first:
| pointer lptr Pointer to the layer structure.
`--
pointer 0 Zero marks the end of the array of layer pointers.
,------------------ Repeat once for each channel, in no particular order:
| pointer cptr Pointer to the channel structure.
`--
pointer 0 Zero marks the end of the array of channel pointers.
The last 4 characters of the initial 13-character identification string are
a version indicator. The version will be higher than 3 if the correct
reconstruction of pixel data from the file requires that the reader
understands features not described in this specification. On the other
hand, optional extra information that can be safely ignored will not
cause the version to increase.
GIMP's XCF writer dynamically selects the lowest version that will
allow the image to be represented. Third-party XCF writers should do
likewise.
Version numbers from v100 upwards have been used by CinePaint, which
originated as a 16-bit fork of GIMP, see "Scope".
Image properties
----------------
The following properties are found only in the property list of the
image structure. Additionally the list can also contain the properties
PROP_END, PROP_PARASITES and PROP_TATTOO, defined in chapter 2.
PROP_COLORMAP (essential)
uint32 1 Type identification
uint32 3*n+4 Payload length in bytes
uint32 n Number of colors in the color map (should be <256)
,------------ Repeat n times:
| byte r Red component of a color map color
| byte g Green component of a color map color
| byte b Blue component of a color map color
`--
PROP_COLORMAP stores the color map.
It appears in all indexed images.
The property will be ignored if it is encountered in an RGB or grayscale
image. The current GIMP will not write a color map with RGB or
grayscale images, but some older ones occasionally did, and readers
should be prepared to gracefully ignore it in those cases.
Note that in contrast to the palette data model of, for example, the
PNG format, an XCF color map does not contain alpha components, and
there is no color map entry for "transparent"; the alpha channel of
layers that have one is always represented separately.
The structure here is that of since XCF version 1. Comments in the
GIMP source code indicate that XCF version 0 could not store indexed
images in a sane way; contemporary GIMP versions will complain and
reinterpret the pixel data as a grayscale image if they meet a
version-0 indexed image.
Beware that the payload length of the PROP_COLORMAP in particular
cannot be trusted: some historic releases of GIMP erroneously
wrote n+4 instead of 3*n+4 into the length word (but still actually
followed it by 3*n+4 bytes of payload).
PROP_COMPRESSION (essential)
uint32 17 Type identification
uint32 1 One byte of payload
byte comp Compression indicator; one of
0: No compression
1: RLE encoding
2: zlib compression
3: (Never used, but reserved for some fractal compression)
PROP_COMPRESSION defines the encoding of pixels in tile data blocks in the
entire XCF file. See chapter 7 for details.
Note that unlike most other properties whose payload is always a
small integer, PROP_COMPRESSION does _not_ pad the value to a full
32-bit integer.
Contemporary GIMP versions always write files with comp=1. It is unknown to
the author of this document whether versions that wrote completely
uncompressed (comp=0) files ever existed.
PROP_GUIDES (editing state)
uint32 18 Type identification
uint32 5*n Five bytes of payload per guide
,--------------- Repeat n times:
| int32 coord Guide coordinate
| byte o Guide orientation; one of
| 1: The guide is horizontal, and coord is a y coordinate
| 2: The guide is vertical, and coord is an x coordinate
(see enum XcfOrientationType in /app/xcf/xcf-private.h)
`--
PROP_GUIDES stores the horizontal or vertical positions of guides.
It appears if any guides have been defined.
Some old XCF files define guides with negative coordinates; those
should be ignored by readers.
PROP_PATHS
uint32 23 Type identification
uint32 plength Total length of the following payload in bytes
uint32 aindex Index of the active path
uint32 n Number of paths that follow
path_1
path_2
...
path_n
PROP_PATHS stores the paths.
Each path has one of three formats
Format 1: Format 2: Format 3:
string string string name Name of the path
uint32 uint32 uint32 linked 1 if the path is linked;
0 if not
byte byte byte state 4 if closed; 2 otherwise
(for GIMP 1.2 compatibility)
uint32 uint32 uint32 closed 1 if path is closed;
0 otherwise
uint32 uint32 uint32 np Number of points
uint32=1 uint32=2 uint32=3 version Version indicator
uint32 uint32 dummy Ignored; always set to 1
uint32 tattoo 0 if none, or see PROP_TATTOO
,---------- ,---------- ,------------------ Repeat for np points:
| int32 | int32 | int32 type Type of point; one of
| | | 0: Anchor
| | | 1: Bezier control point
| | | (for GIMP 1.2 compatibility)
| int32 | float | float x X coordinate
| int32 | float | float y Y coordinate
`-- `-- `--
This format is used to save path data if all paths in the image are
continuous sequences of Bezier strokes. Otherwise GIMP stores the paths in
PROP_VECTORS.
Note: the attribute 'linked' was formerly erroneously called 'locked'
(but meant 'linked' anyway).
A closed path is a path which has the last and the first point connected,
for instance a triangle.
GIMP's XCF reader _does not_ check that the total size of all path
specifications in the property precisely equals the plength word.
Note that this is different to PROP_VECTORS.
TODO: Clarify: PROP_PATHS cannot represent parasites for paths, but the
XCF writer does not check whether all paths are parasite-less when
choosing which property to use, so path parasites may be lost upon
saving). Is this by design or a bug?
There may be paths that declare a length of 0 points; these should
be ignored.
PROP_RESOLUTION (not editing state, but not _really_ essential either)
uint32 19 Type identification
uint32 8 Eight bytes of payload
float hres Horizontal resolution in pixels per inch (ppi)
float vres Vertical resolution in pixels per inch (ppi)
PROP_RESOLUTION gives the intended physical size of the image's pixels.
Note that for many images, such as graphics created for the web, the
creator does not really have an intended resolution in mind but
intends the image to be shown at whatever the natural resolution of
the viewer's monitor is. Similarly, photographs commonly do not have
a well-defined target size and are intended to be scaled to fit the
available space instead. Therefore readers should not interpret the
information in this property too rigidly; GIMP writes it to XCF
files unconditionally, even if the user has not explicitly chosen a
resolution.
PROP_SAMPLE_POINTS
uint32 17 Type identification
uint32 plength Total length of the following payload in bytes
,---------------- Repeat for each sample point:
| uint32 x X coordinate
| uint32 y Y coordinate
`--
PROP_UNIT (editing state)
uint32 22 Type identification
uint32 4 Four bytes of payload
uint32 uid Unit identifier; one of
1: Inches (25.4 mm)
2: Millimeters (1 mm)
3: Points (127/360 mm)
4: Picas (127/30 mm)
PROP_UNIT specifies the units used to specify resolution in the Scale Image
and Print Size dialogs. Note that this is used only in the user interface;
the PROP_RESOLUTION property is always stored in ppi.
To specify non-standard units use PROP_USER_UNIT.
PROP_USER_UNIT (editing state)
uint32 24 Type identification
uint32 plength Total length of the following payload in bytes
float factor 1 inch divided by the length of the unit
uint32 digits Number of decimal digits used with the unit
string id An identifier for the unit
string symbol Short symbol for the unit
string abbrev Abbreviation for the unit
string sname Unit name in singular form
string pname Unit name in plural form
PROP_USER_UNIT allows the use of units that are not on the standard list.
It is an alternative to PROP_UNIT.
TODO: How is this related to the unitrc file?
PROP_VECTORS
uint32 25 Type identification
uint32 plength Total length of the following payload in bytes
uint32 1 Version tag; so far always 1
uint32 aindex Index of the active path
uint32 n Number of paths that follow
,---------------------- Repeat n times:
| string name Name of the path
| uint32 tattoo Tattoo of the path (see PROP_TATTOO), or 0
| uint32 visible 1 if path is visible, 0 if not
| uint32 linked 1 if path is linked, 0 if not
| uint32 m Number of parasites for the path
| uint32 k Number of strokes in the first path
| ,-------------------- Repeat m times: