diff --git a/gimpformats/GimpIOBase.py b/gimpformats/GimpIOBase.py index 10c90be..8b73ee7 100644 --- a/gimpformats/GimpIOBase.py +++ b/gimpformats/GimpIOBase.py @@ -67,6 +67,7 @@ def __init__(self, parent: Any = None) -> None: self.isGroup = None self.groupItemFlags: int = 0 self.positionLocked: bool = False + self.visibilityLocked: bool = False self.opacity: float = 1.0 self.colorTag: TagColor = TagColor.Blue self.compositeMode: CompositeMode = CompositeMode.Union @@ -320,14 +321,16 @@ def _propertyDecode(self, prop: int, data: bytearray) -> int: self.groupItemFlags = ioBuf.u32 elif _prop_cmp(prop, AllProps.PROP_LOCK_POSITION): self.positionLocked = ioBuf.boolean + elif _prop_cmp(prop, AllProps.PROP_LOCK_VISIBILITY): + self.visibilityLocked = ioBuf.boolean elif _prop_cmp(prop, AllProps.PROP_FLOAT_OPACITY): self.opacity = ioBuf.float32 elif _prop_cmp(prop, AllProps.PROP_COLOR_TAG): self.colorTag = list(TagColor)[ioBuf.u32] elif _prop_cmp(prop, AllProps.PROP_COMPOSITE_MODE): - self.compositeMode = list(CompositeMode)[ioBuf.i32] + self.compositeMode = list(CompositeMode)[abs(ioBuf.i32) - 1] elif _prop_cmp(prop, AllProps.PROP_COMPOSITE_SPACE): - self.compositeSpace = list(CompositeSpace)[ioBuf.i32] + self.compositeSpace = list(CompositeSpace)[abs(ioBuf.i32) - 1] elif _prop_cmp(prop, AllProps.PROP_BLEND_SPACE): self.blendSpace = ioBuf.u32 elif _prop_cmp(prop, AllProps.PROP_FLOAT_COLOR): @@ -479,6 +482,9 @@ def _propertyEncode(self, prop: int) -> bytearray: elif _prop_cmp(prop, AllProps.PROP_LOCK_POSITION): if self.positionLocked is not None and self.positionLocked: ioBuf.boolean = self.positionLocked + elif _prop_cmp(prop, AllProps.PROP_LOCK_VISIBILITY): + if self.visibilityLocked is not None and self.visibilityLocked: + ioBuf.boolean = self.visibilityLocked elif _prop_cmp(prop, AllProps.PROP_FLOAT_OPACITY): if self.opacity is not None and isinstance(self.opacity, float): ioBuf.float32 = self.opacity @@ -487,10 +493,10 @@ def _propertyEncode(self, prop: int) -> bytearray: ioBuf.u32 = list(TagColor).index(self.colorTag) elif _prop_cmp(prop, AllProps.PROP_COMPOSITE_MODE): if self.compositeMode is not None: - ioBuf.i32 = list(CompositeMode).index(self.compositeMode) + ioBuf.i32 = list(CompositeMode).index(self.compositeMode) + 1 elif _prop_cmp(prop, AllProps.PROP_COMPOSITE_SPACE): if self.compositeSpace is not None: - ioBuf.i32 = list(CompositeSpace).index(self.compositeSpace) + ioBuf.i32 = list(CompositeSpace).index(self.compositeSpace) + 1 elif _prop_cmp(prop, AllProps.PROP_BLEND_SPACE): if self.blendSpace is not None: ioBuf.u32 = self.blendSpace diff --git a/gimpformats/GimpImageLevel.py b/gimpformats/GimpImageLevel.py index 9d3eacb..3baf342 100644 --- a/gimpformats/GimpImageLevel.py +++ b/gimpformats/GimpImageLevel.py @@ -127,9 +127,9 @@ def _decodeRLE(self, data: bytearray, pixels: int, bpp: int, index: int = 0) -> index += 1 if 0 <= opcode <= 126: # Short run of identical bytes - val = data[index] + val = data[index:index+1] # use 1-len bytearray to avoid slow list index += 1 - ret[chan].extend([val] * (opcode + 1)) # Extend is faster than append in a loop + ret[chan].extend(val * (opcode + 1)) # Extend is faster than append in a loop n += opcode + 1 elif opcode == 127: # Long run of identical bytes @@ -137,10 +137,10 @@ def _decodeRLE(self, data: bytearray, pixels: int, bpp: int, index: int = 0) -> index += 1 b = data[index] index += 1 - val = data[index] + val = data[index:index+1] # use 1-len bytearray to avoid slow list index += 1 amt = (m << 8) + b - ret[chan].extend([val] * amt) + ret[chan].extend(val * amt) n += amt elif opcode == 128: # Long run of different bytes diff --git a/gimpformats/enums.py b/gimpformats/enums.py index cfe20a1..affb7b3 100644 --- a/gimpformats/enums.py +++ b/gimpformats/enums.py @@ -26,8 +26,9 @@ class CompositeMode(Enum): class CompositeSpace(Enum): RGB_linear = "RGB (linear)" - RGB_perceptual = "RGB (perceptual)" + RGB_profile = "RGB (from color profile)" LAB = "LAB" + RGB_perceptual = "RGB (perceptual)" class TagColor(Enum): @@ -150,7 +151,7 @@ class GeneralProperties(Enum): PROP_VISIBLE = 8 PROP_TATTOO = 20 # PROP_ITEM_SET_ITEM = 41 - # PROP_LOCK_VISIBILITY = 42 + PROP_LOCK_VISIBILITY = 42 class ImageProperties(Enum): diff --git a/tests/with_paths/with_paths.txt b/tests/with_paths/with_paths.txt index 484ebae..e11c781 100644 --- a/tests/with_paths/with_paths.txt +++ b/tests/with_paths/with_paths.txt @@ -58,8 +58,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -88,8 +88,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 diff --git a/tests/xcf_document/dest/issue_14.txt b/tests/xcf_document/dest/issue_14.txt index 840cb10..8ed41f0 100644 --- a/tests/xcf_document/dest/issue_14.txt +++ b/tests/xcf_document/dest/issue_14.txt @@ -60,8 +60,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -90,8 +90,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 diff --git a/tests/xcf_document/dest/layer_comp_modes.txt b/tests/xcf_document/dest/layer_comp_modes.txt new file mode 100644 index 0000000..4891a2e --- /dev/null +++ b/tests/xcf_document/dest/layer_comp_modes.txt @@ -0,0 +1,158 @@ +Version: 23 +Width: 10 +Height: 10 +Base Color Mode: 0 +Precision: +Selected: False +Is Selection: False +Blend Mode: GimpBlendMode.ADDITION +Visible: False +Is Linked: False +Lock Alpha: False +Apply Mask: False +Editing Mask: False +Show Mask: False +Show Masked: False +X Offset: 0 +Y Offset: 0 +Compression: CompressionMode.RLE +Horizontal Resolution: 300.0 +Vertical Resolution: 300.0 +Unique Id: 00000006 +Units: Units.Millimetres +Group Item Flags: 0 +Position Locked: False +Opacity: 1.0 +Color Tag: TagColor.Blue +Composite Mode: CompositeMode.Union +Composite Space: CompositeSpace.RGB_linear +Vectors Version: 0 +Active Vector Index: 0 +Paths: [] +Offset: 0 x 0 +Resolution: 300.0ppi x 300.0ppi +Parasites: + + + +Layers: + Name: RGB Color Profile - Intersection + Size: 10 x 10 + colorMode: RGB color with alpha + Selected: True + Is Selection: False + Blend Mode: GimpBlendMode.NORMAL + Visible: True + Is Linked: False + Lock Alpha: False + Apply Mask: False + Editing Mask: False + Show Mask: False + Show Masked: False + X Offset: 0 + Y Offset: 0 + Compression: CompressionMode.None_Compression + Unique Id: 00000006 + Units: Units.Inches + Locked: False + Group Item Flags: 0 + Position Locked: False + Opacity: 1.0 + Color Tag: TagColor.None_Color + Composite Mode: CompositeMode.Intersection + Composite Space: CompositeSpace.RGB_profile + Blend Space: 0 + Vectors Version: 0 + Active Vector Index: 0 + Paths: [] + Offset: 0 x 0 + Name: RGB Linear - Clip To Backdrop + Size: 10 x 10 + colorMode: RGB color with alpha + Selected: False + Is Selection: False + Blend Mode: GimpBlendMode.NORMAL + Visible: True + Is Linked: False + Lock Alpha: False + Apply Mask: False + Editing Mask: False + Show Mask: False + Show Masked: False + X Offset: 0 + Y Offset: 0 + Compression: CompressionMode.None_Compression + Unique Id: 00000004 + Units: Units.Inches + Locked: False + Group Item Flags: 0 + Position Locked: False + Opacity: 1.0 + Color Tag: TagColor.None_Color + Composite Mode: CompositeMode.Clip_to_backdrop + Composite Space: CompositeSpace.RGB_linear + Blend Space: 0 + Vectors Version: 0 + Active Vector Index: 0 + Paths: [] + Offset: 0 x 0 + Name: RGB Perceptual - Union + Size: 10 x 10 + colorMode: RGB color with alpha + Selected: False + Is Selection: False + Blend Mode: GimpBlendMode.NORMAL + Visible: True + Is Linked: False + Lock Alpha: False + Apply Mask: False + Editing Mask: False + Show Mask: False + Show Masked: False + X Offset: 0 + Y Offset: 0 + Compression: CompressionMode.None_Compression + Unique Id: 00000003 + Units: Units.Inches + Locked: False + Group Item Flags: 0 + Position Locked: False + Opacity: 1.0 + Color Tag: TagColor.None_Color + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_perceptual + Blend Space: 0 + Vectors Version: 0 + Active Vector Index: 0 + Paths: [] + Offset: 0 x 0 + Name: Auto + Size: 10 x 10 + colorMode: RGB color with alpha + Selected: False + Is Selection: False + Blend Mode: GimpBlendMode.NORMAL + Visible: True + Is Linked: False + Lock Alpha: False + Apply Mask: False + Editing Mask: False + Show Mask: False + Show Masked: False + X Offset: 0 + Y Offset: 0 + Compression: CompressionMode.None_Compression + Unique Id: 00000005 + Units: Units.Inches + Locked: False + Group Item Flags: 0 + Position Locked: False + Opacity: 1.0 + Color Tag: TagColor.None_Color + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear + Blend Space: 0 + Vectors Version: 0 + Active Vector Index: 0 + Paths: [] + Offset: 0 x 0 \ No newline at end of file diff --git a/tests/xcf_document/dest/layer_groups.txt b/tests/xcf_document/dest/layer_groups.txt index 73361c0..b8ce850 100644 --- a/tests/xcf_document/dest/layer_groups.txt +++ b/tests/xcf_document/dest/layer_groups.txt @@ -59,8 +59,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -89,8 +89,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -119,8 +119,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 diff --git a/tests/xcf_document/dest/testComplexImage.txt b/tests/xcf_document/dest/testComplexImage.txt index 58f34b6..c2b2822 100644 --- a/tests/xcf_document/dest/testComplexImage.txt +++ b/tests/xcf_document/dest/testComplexImage.txt @@ -58,8 +58,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -88,8 +88,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -118,8 +118,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -148,8 +148,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -179,8 +179,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -209,8 +209,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -239,8 +239,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 @@ -269,8 +269,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 diff --git a/tests/xcf_document/dest/testOneLayerWithTransparency.txt b/tests/xcf_document/dest/testOneLayerWithTransparency.txt index 47196d1..7e22ce2 100644 --- a/tests/xcf_document/dest/testOneLayerWithTransparency.txt +++ b/tests/xcf_document/dest/testOneLayerWithTransparency.txt @@ -58,8 +58,8 @@ Layers: Position Locked: False Opacity: 1.0 Color Tag: TagColor.None_Color - Composite Mode: CompositeMode.Intersection - Composite Space: CompositeSpace.LAB + Composite Mode: CompositeMode.Union + Composite Space: CompositeSpace.RGB_linear Blend Space: 0 Vectors Version: 0 Active Vector Index: 0 diff --git a/tests/xcf_document/src/layer_comp_modes.xcf b/tests/xcf_document/src/layer_comp_modes.xcf new file mode 100644 index 0000000..e2b7a27 Binary files /dev/null and b/tests/xcf_document/src/layer_comp_modes.xcf differ diff --git a/tests/xcf_document/test_xcf_document.py b/tests/xcf_document/test_xcf_document.py index ef3367e..43ce6de 100644 --- a/tests/xcf_document/test_xcf_document.py +++ b/tests/xcf_document/test_xcf_document.py @@ -15,7 +15,7 @@ def gimp_doc() -> GimpDocument: @pytest.mark.parametrize( - ("image_name"), ["testOneLayerWithTransparency", "testComplexImage", "issue_14", "layer_groups"] + ("image_name"), ["testOneLayerWithTransparency", "testComplexImage", "issue_14", "layer_groups", "layer_comp_modes"] ) def test_image_repr(gimp_doc: GimpDocument, image_name: str) -> None: """Test the text representation of an image."""