diff --git a/.idea/detekt.xml b/.idea/detekt.xml
index 5ac0d84..86fb510 100644
--- a/.idea/detekt.xml
+++ b/.idea/detekt.xml
@@ -11,6 +11,8 @@
+
+
diff --git a/README.md b/README.md
index 6c8068b..52ffcd5 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@ It's part of [Ashampoo Photos](https://ashampoo.com/photos).
## Installation
```
-implementation("com.ashampoo:xmpcore:0.2.3")
+implementation("com.ashampoo:xmpcore:0.2.4")
```
## How to use
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/DomParser.kt b/src/commonMain/kotlin/com/ashampoo/xmp/DomParser.kt
index 8483076..10b1158 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/DomParser.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/DomParser.kt
@@ -36,7 +36,7 @@ object DomParser {
return writer.target
} catch (ex: Exception) {
- throw XMPException("Error reading the XML-file", XMPError.BADSTREAM, ex)
+ throw XMPException("Error reading the XML file: ${ex.message}", XMPError.BADSTREAM, ex)
}
}
}
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPIterator.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPIterator.kt
index 7f3c9d4..d964ca3 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPIterator.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPIterator.kt
@@ -10,11 +10,11 @@ package com.ashampoo.xmp
import com.ashampoo.xmp.XMPNodeUtils.findNode
import com.ashampoo.xmp.XMPNodeUtils.findSchemaNode
-import com.ashampoo.xmp.xpath.XMPPath
-import com.ashampoo.xmp.xpath.XMPPathParser.expandXPath
import com.ashampoo.xmp.options.IteratorOptions
import com.ashampoo.xmp.options.PropertyOptions
import com.ashampoo.xmp.properties.XMPPropertyInfo
+import com.ashampoo.xmp.xpath.XMPPath
+import com.ashampoo.xmp.xpath.XMPPathParser.expandXPath
/**
* Interface for the `XMPMeta` iteration services.
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPMeta.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPMeta.kt
index b0ee4d9..8695ea3 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPMeta.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPMeta.kt
@@ -8,14 +8,6 @@
// =================================================================================================
package com.ashampoo.xmp
-import com.ashampoo.xmp.XMPPathFactory.composeArrayItemPath
-import com.ashampoo.xmp.XMPPathFactory.composeQualifierPath
-import com.ashampoo.xmp.XMPPathFactory.composeStructFieldPath
-import com.ashampoo.xmp.XMPUtils.convertToBoolean
-import com.ashampoo.xmp.XMPUtils.convertToDouble
-import com.ashampoo.xmp.XMPUtils.convertToInteger
-import com.ashampoo.xmp.XMPUtils.convertToLong
-import com.ashampoo.xmp.XMPUtils.decodeBase64
import com.ashampoo.xmp.Utils.normalizeLangValue
import com.ashampoo.xmp.XMPNodeUtils.appendLangItem
import com.ashampoo.xmp.XMPNodeUtils.chooseLocalizedText
@@ -24,12 +16,20 @@ import com.ashampoo.xmp.XMPNodeUtils.findNode
import com.ashampoo.xmp.XMPNodeUtils.setNodeValue
import com.ashampoo.xmp.XMPNodeUtils.verifySetOptions
import com.ashampoo.xmp.XMPNormalizer.normalize
-import com.ashampoo.xmp.xpath.XMPPathParser.expandXPath
+import com.ashampoo.xmp.XMPPathFactory.composeArrayItemPath
+import com.ashampoo.xmp.XMPPathFactory.composeQualifierPath
+import com.ashampoo.xmp.XMPPathFactory.composeStructFieldPath
+import com.ashampoo.xmp.XMPUtils.convertToBoolean
+import com.ashampoo.xmp.XMPUtils.convertToDouble
+import com.ashampoo.xmp.XMPUtils.convertToInteger
+import com.ashampoo.xmp.XMPUtils.convertToLong
+import com.ashampoo.xmp.XMPUtils.decodeBase64
import com.ashampoo.xmp.options.IteratorOptions
import com.ashampoo.xmp.options.ParseOptions
import com.ashampoo.xmp.options.PropertyOptions
import com.ashampoo.xmp.properties.XMPProperty
import com.ashampoo.xmp.properties.XMPPropertyInfo
+import com.ashampoo.xmp.xpath.XMPPathParser.expandXPath
/**
* This class represents the set of XMP metadata as a DOM representation. It has methods to read and
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPMetaParser.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPMetaParser.kt
index 8e7924b..d9d2101 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPMetaParser.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPMetaParser.kt
@@ -10,6 +10,7 @@ package com.ashampoo.xmp
import com.ashampoo.xmp.XMPNormalizer.normalize
import com.ashampoo.xmp.options.ParseOptions
+import nl.adaptivity.xmlutil.dom.Comment
import nl.adaptivity.xmlutil.dom.Element
import nl.adaptivity.xmlutil.dom.Node
import nl.adaptivity.xmlutil.dom.ProcessingInstruction
@@ -117,6 +118,11 @@ internal object XMPMetaParser {
if (result != null)
result[2] = child.getData()
+ } else if (child is Comment) {
+
+ /* We ignore comments. */
+ continue
+
} else if (child !is Text && child !is ProcessingInstruction) {
val childElement = child as Element
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPNode.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPNode.kt
index 3c42f5b..e4fe0c1 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPNode.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPNode.kt
@@ -64,7 +64,9 @@ class XMPNode(
fun addChild(node: XMPNode) {
- assertChildNotExisting(node.name!!)
+ /* Ignore doubled childs. */
+ if (childExists(node.name!!))
+ return
node.parent = this
@@ -73,7 +75,9 @@ class XMPNode(
fun addChild(index: Int, node: XMPNode) {
- assertChildNotExisting(node.name!!)
+ /* Ignore doubled childs. */
+ if (childExists(node.name!!))
+ return
node.parent = this
@@ -146,7 +150,9 @@ class XMPNode(
fun addQualifier(qualNode: XMPNode) {
- assertQualifierNotExisting(qualNode.name!!)
+ /* Ignore doubled qualifiers. */
+ if (qualifierExists(qualNode.name!!))
+ return
qualNode.parent = this
qualNode.options.setQualifier(true)
@@ -305,21 +311,9 @@ class XMPNode(
return qualifier!!
}
- /**
- * Checks that a node name is not existing on the same level, except for array items.
- */
- private fun assertChildNotExisting(childName: String) {
-
- if (XMPConst.ARRAY_ITEM_NAME != childName && findChildByName(childName) != null)
- throw XMPException("Duplicate property or field node '$childName'", XMPError.BADXMP)
- }
+ private fun childExists(childName: String): Boolean =
+ XMPConst.ARRAY_ITEM_NAME != childName && findChildByName(childName) != null
- /**
- * Checks that a qualifier name is not existing on the same level.
- */
- private fun assertQualifierNotExisting(qualifierName: String) {
-
- if (XMPConst.ARRAY_ITEM_NAME != qualifierName && findQualifierByName(qualifierName) != null)
- throw XMPException("Duplicate '$qualifierName' qualifier", XMPError.BADXMP)
- }
+ private fun qualifierExists(qualifierName: String): Boolean =
+ XMPConst.ARRAY_ITEM_NAME != qualifierName && findQualifierByName(qualifierName) != null
}
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPNodeUtils.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPNodeUtils.kt
index 182db23..4cf9e40 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPNodeUtils.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPNodeUtils.kt
@@ -8,14 +8,14 @@
// =================================================================================================
package com.ashampoo.xmp
-import com.ashampoo.xmp.XMPUtils.encodeBase64
import com.ashampoo.xmp.Utils.normalizeLangValue
import com.ashampoo.xmp.Utils.replaceControlCharsWithSpace
import com.ashampoo.xmp.Utils.splitNameAndValue
-import com.ashampoo.xmp.xpath.XMPPath
-import com.ashampoo.xmp.xpath.XMPPathSegment
+import com.ashampoo.xmp.XMPUtils.encodeBase64
import com.ashampoo.xmp.options.AliasOptions
import com.ashampoo.xmp.options.PropertyOptions
+import com.ashampoo.xmp.xpath.XMPPath
+import com.ashampoo.xmp.xpath.XMPPathSegment
/**
* Utilities for `XMPNode`.
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPNormalizer.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPNormalizer.kt
index 64cab72..8c589d8 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPNormalizer.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPNormalizer.kt
@@ -9,9 +9,9 @@
package com.ashampoo.xmp
import com.ashampoo.xmp.Utils.checkUUIDFormat
-import com.ashampoo.xmp.xpath.XMPPathParser.expandXPath
import com.ashampoo.xmp.options.ParseOptions
import com.ashampoo.xmp.options.PropertyOptions
+import com.ashampoo.xmp.xpath.XMPPathParser.expandXPath
internal object XMPNormalizer {
@@ -230,20 +230,16 @@ internal object XMPNormalizer {
val strictAliasing = options.getStrictAliasing()
- val schemaIt: Iterator = tree.iterateChildren()
-
- while (schemaIt.hasNext()) {
+ val schemas = tree.iterateChildren().asSequence().toList()
- val currSchema = schemaIt.next()
+ for (currSchema in schemas) {
if (!currSchema.hasAliases)
continue
- val propertyIt = currSchema.iterateChildrenMutable()
+ val properties = currSchema.iterateChildrenMutable().asSequence().toList()
- while (propertyIt.hasNext()) {
-
- val currProp = propertyIt.next()
+ for (currProp in properties) {
if (!currProp.isAlias)
continue
@@ -282,7 +278,8 @@ internal object XMPNormalizer {
baseSchema.addChild(currProp)
// remove the alias property
- propertyIt.remove()
+
+ currSchema.removeChild(currProp)
} else {
@@ -296,7 +293,9 @@ internal object XMPNormalizer {
baseSchema.addChild(baseNode)
- transplantArrayItemAlias(propertyIt, currProp, baseNode)
+ transplantArrayItemAlias(currProp, baseNode) {
+ currSchema.removeChild(currProp)
+ }
}
} else if (info.getAliasForm().isSimple()) {
@@ -307,7 +306,7 @@ internal object XMPNormalizer {
if (strictAliasing)
compareAliasedSubtrees(currProp, baseNode, true)
- propertyIt.remove()
+ currSchema.removeChild(currProp)
} else {
@@ -330,14 +329,16 @@ internal object XMPNormalizer {
if (itemNode == null) {
- transplantArrayItemAlias(propertyIt, currProp, baseNode)
+ transplantArrayItemAlias(currProp, baseNode) {
+ currSchema.removeChild(currProp)
+ }
} else {
if (strictAliasing)
compareAliasedSubtrees(currProp, itemNode, true)
- propertyIt.remove()
+ currSchema.removeChild(currProp)
}
}
}
@@ -350,15 +351,15 @@ internal object XMPNormalizer {
/**
* Moves an alias node of array form to another schema into an array
*
- * @param propertyIt the property iterator of the old schema (used to delete the property)
+ * @param removeChildFromTree lambda used to delete the property of the schema
* @param childNode the node to be moved
* @param baseArray the base array for the array item
*
*/
private fun transplantArrayItemAlias(
- propertyIt: MutableIterator,
childNode: XMPNode,
- baseArray: XMPNode
+ baseArray: XMPNode,
+ removeChildFromTree: () -> Unit
) {
if (baseArray.options.isArrayAltText()) {
@@ -372,7 +373,7 @@ internal object XMPNormalizer {
childNode.addQualifier(langQual)
}
- propertyIt.remove()
+ removeChildFromTree()
childNode.name = XMPConst.ARRAY_ITEM_NAME
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPRDFParser.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPRDFParser.kt
index bd3758b..9bddb6c 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPRDFParser.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPRDFParser.kt
@@ -653,9 +653,7 @@ internal object XMPRDFParser {
/**
* 7.2.21 emptyPropertyElt
* start-element ( URI == propertyElementURIs,
- * attributes == set (
- * idAttr?, ( resourceAttr | nodeIdAttr )?, propertyAttr* ) )
- * end-element()
+ * attributes == set (idAttr?, ( resourceAttr | nodeIdAttr )?, propertyAttr* ) ) end-element()
*
*
*
@@ -701,7 +699,7 @@ internal object XMPRDFParser {
"Nested content not allowed with rdf:resource or property attributes", XMPError.BADRDF
)
- // First figure out what XMP this maps to and remember the XML node for a simple value.
+ /* First figure out what XMP this maps to and remember the XML node for a simple value. */
for (index in 0 until xmlNode.attributes.length) {
val attribute = xmlNode.attributes.item(index) as Attr
@@ -713,9 +711,15 @@ internal object XMPRDFParser {
when (attrTerm) {
- RDFTERM_ID -> {
- /* Do nothing. */
- }
+ /*
+ * Do nothing.
+ */
+ RDFTERM_ID -> continue
+
+ /*
+ * sample_52.xmp has an we want to skip.
+ */
+ RDFTERM_ABOUT -> continue
RDFTERM_RESOURCE -> {
@@ -769,8 +773,12 @@ internal object XMPRDFParser {
}
}
+ /* Fail on unknown elements. */
else ->
- throw XMPException("Unrecognized attribute of empty property element", XMPError.BADRDF)
+ throw XMPException(
+ "Unrecognized attribute of empty property element: $attrTerm",
+ XMPError.BADRDF
+ )
}
}
@@ -816,9 +824,13 @@ internal object XMPRDFParser {
when (attrTerm) {
- RDFTERM_ID, RDFTERM_NODE_ID -> {
- /* Do nothing. */
- }
+ /* Do nothing with IDs. */
+ RDFTERM_ID, RDFTERM_NODE_ID -> continue
+
+ /*
+ * sample_52.xmp has an we want to skip.
+ */
+ RDFTERM_ABOUT -> continue
RDFTERM_RESOURCE ->
addQualifierNode(childNode, "rdf:resource", attribute.value)
@@ -834,7 +846,7 @@ internal object XMPRDFParser {
}
else -> throw XMPException(
- "Unrecognized attribute of empty property element",
+ "Unrecognized attribute of empty property element: $attrTerm",
XMPError.BADRDF
)
}
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPRDFWriter.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPRDFWriter.kt
index 9f592fd..3088aa2 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPRDFWriter.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPRDFWriter.kt
@@ -155,8 +155,6 @@ internal object XMPRDFWriter {
/**
* Serializes the metadata in pretty-printed manner.
- *
- * @param level indent level
*/
private fun serializeCanonicalRDFSchemas(
sb: StringBuilder,
@@ -198,8 +196,6 @@ internal object XMPRDFWriter {
/**
* Serializes the metadata in compact manner.
- *
- * @param level indent level to start with
*/
private fun serializeCompactRDFSchemas(
sb: StringBuilder,
@@ -291,9 +287,6 @@ internal object XMPRDFWriter {
* field of a struct, or an item of an array. The indent is that for the
* property element. The patterns bwlow ignore attribute qualifiers such as
* xml:lang, they don't affect the output form.
- *
- * @param parentNode the parent node
- * @param indent the current indent level
*/
private fun serializeCompactRDFElementProps(
sb: StringBuilder,
@@ -383,7 +376,6 @@ internal object XMPRDFWriter {
/**
* Serializes a simple property.
*
- * @param node an XMPNode
* @return Returns an array containing the flags emitEndTag and indentEndTag.
*/
private fun serializeCompactRDFSimpleProp(
diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/xpath/XMPPathParser.kt b/src/commonMain/kotlin/com/ashampoo/xmp/xpath/XMPPathParser.kt
index 63092ff..12a74fd 100644
--- a/src/commonMain/kotlin/com/ashampoo/xmp/xpath/XMPPathParser.kt
+++ b/src/commonMain/kotlin/com/ashampoo/xmp/xpath/XMPPathParser.kt
@@ -8,10 +8,10 @@
// =================================================================================================
package com.ashampoo.xmp.xpath
+import com.ashampoo.xmp.Utils
import com.ashampoo.xmp.XMPError
import com.ashampoo.xmp.XMPException
import com.ashampoo.xmp.XMPMetaFactory.schemaRegistry
-import com.ashampoo.xmp.Utils
/**
* Parser for XMP XPaths.
diff --git a/src/commonTest/kotlin/com/ashampoo/xmp/RewriteXmpTest.kt b/src/commonTest/kotlin/com/ashampoo/xmp/RewriteXmpTest.kt
index bbd072e..eb9156e 100644
--- a/src/commonTest/kotlin/com/ashampoo/xmp/RewriteXmpTest.kt
+++ b/src/commonTest/kotlin/com/ashampoo/xmp/RewriteXmpTest.kt
@@ -5,7 +5,6 @@ import com.goncalossilva.resources.Resource
import kotlinx.io.buffered
import kotlinx.io.files.Path
import kotlinx.io.files.SystemFileSystem
-import kotlinx.io.files.sink
import kotlin.test.Test
import kotlin.test.fail
@@ -42,35 +41,46 @@ class RewriteXmpTest {
@Suppress("LoopWithTooManyJumpStatements")
for (index in 1..TEST_PHOTO_COUNT) {
- val originalXmp = getOriginalXmp(index)
+ try {
- val xmpMeta = XMPMetaFactory.parseFromString(originalXmp)
+ val originalXmp = getOriginalXmp(index)
- val actualCompactXmp = XMPMetaFactory.serializeToString(xmpMeta, xmpSerializeOptionsCompact)
- val actualCanonicalXmp = XMPMetaFactory.serializeToString(xmpMeta, xmpSerializeOptionsCanonical)
+ val xmpMeta = XMPMetaFactory.parseFromString(originalXmp)
- val expectedCompactXmp = getFormattedCompactXmp(index)
- val expectedCanonicalXmp = getFormattedCanonicalXmp(index)
+ val actualCompactXmp = XMPMetaFactory.serializeToString(xmpMeta, xmpSerializeOptionsCompact)
+ val actualCanonicalXmp =
+ XMPMetaFactory.serializeToString(xmpMeta, xmpSerializeOptionsCanonical)
- val equals = expectedCompactXmp.contentEquals(actualCompactXmp) &&
- expectedCanonicalXmp.contentEquals(actualCanonicalXmp)
+ val expectedCompactXmp = getFormattedCompactXmp(index)
+ val expectedCanonicalXmp = getFormattedCanonicalXmp(index)
- if (!equals) {
+ val equals = expectedCompactXmp.contentEquals(actualCompactXmp) &&
+ expectedCanonicalXmp.contentEquals(actualCanonicalXmp)
- SystemFileSystem
- .sink(Path("build/sample_${index}_formatted_compact.xmp"))
- .buffered()
- .use {
- it.write(actualCompactXmp.encodeToByteArray())
- }
+ if (!equals) {
- SystemFileSystem.sink(Path("build/sample_${index}_formatted_canonical.xmp"))
- .buffered()
- .use {
- it.write(actualCanonicalXmp.encodeToByteArray())
- }
+ SystemFileSystem
+ .sink(Path("build/sample_${index}_formatted_compact.xmp"))
+ .buffered()
+ .use {
+ it.write(actualCompactXmp.encodeToByteArray())
+ }
+
+ SystemFileSystem.sink(Path("build/sample_${index}_formatted_canonical.xmp"))
+ .buffered()
+ .use {
+ it.write(actualCanonicalXmp.encodeToByteArray())
+ }
+
+ fail("XMP for sample $index looks different after rewrite.")
+ }
+
+ } catch (ex: Exception) {
+
+ @Suppress("PrintStackTrace")
+ ex.printStackTrace()
- fail("XMP for sample $index looks different after rewrite.")
+ fail("testRewriteXmp() failed for XMP sample $index due to ${ex.message}")
}
}
}
diff --git a/src/commonTest/kotlin/com/ashampoo/xmp/UtilsTest.kt b/src/commonTest/kotlin/com/ashampoo/xmp/UtilsTest.kt
index 422c2a5..186b892 100644
--- a/src/commonTest/kotlin/com/ashampoo/xmp/UtilsTest.kt
+++ b/src/commonTest/kotlin/com/ashampoo/xmp/UtilsTest.kt
@@ -1,6 +1,5 @@
package com.ashampoo.xmp
-import com.ashampoo.xmp.Utils
import kotlin.test.Test
import kotlin.test.assertEquals
diff --git a/src/commonTest/kotlin/com/ashampoo/xmp/WriteXmpTest.kt b/src/commonTest/kotlin/com/ashampoo/xmp/WriteXmpTest.kt
index e11439b..875e56a 100644
--- a/src/commonTest/kotlin/com/ashampoo/xmp/WriteXmpTest.kt
+++ b/src/commonTest/kotlin/com/ashampoo/xmp/WriteXmpTest.kt
@@ -1,14 +1,11 @@
package com.ashampoo.xmp
-import com.ashampoo.xmp.XMPConst.DEFAULT_GPS_VERSION_ID
-import com.ashampoo.xmp.XMPConst.XMP_DC_SUBJECT
import com.ashampoo.xmp.options.PropertyOptions
import com.ashampoo.xmp.options.SerializeOptions
import com.goncalossilva.resources.Resource
import kotlinx.io.buffered
import kotlinx.io.files.Path
import kotlinx.io.files.SystemFileSystem
-import kotlinx.io.files.sink
import kotlin.test.Test
import kotlin.test.fail
diff --git a/src/commonTest/resources/com/ashampoo/xmp/README b/src/commonTest/resources/com/ashampoo/xmp/README
new file mode 100644
index 0000000..cf0a770
--- /dev/null
+++ b/src/commonTest/resources/com/ashampoo/xmp/README
@@ -0,0 +1,13 @@
+This document makes comments about special XMP samples in the set.
+We collect problematic files from real-world images to test for regression.
+
+# sample_50.xml
+Problem: Doubled child entries
+
+# sample_51.xml
+Problem: Doubled ImageDescription field
+
+# sample_52.xml
+okb9GBO6w0.jpg
+XMPException: Unrecognized attribute of empty property element
+
diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_50.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_50.xmp
index bc19b36..f400ac5 100644
--- a/src/commonTest/resources/com/ashampoo/xmp/sample_50.xmp
+++ b/src/commonTest/resources/com/ashampoo/xmp/sample_50.xmp
@@ -1,4 +1,105 @@
-0
-
-
\ No newline at end of file
+
+
+
+
+ 0
+ 0
+ 2013-05-24T14:08:48+03:00
+ 2000-01-01T00:08:04.39+02:00
+ 2013-05-24T14:08:48+03:00
+
+
+
+ 113063070880
+ 50/1 50/1 0/0 0/0
+ 50-50mm
+ 27
+ 0000000000
+ 0
+ 0/1
+ 1.0.1
+ 113063070880
+ 50/1 50/1 0/0 0/0
+ 50-50mm
+ 27
+ 0000000000
+ 0
+ 0/1
+ 1.0.1
+
+
+
+ True
+ True
+
+
+
+ 3
+ sRGB IEC61966-2.1
+ 3
+ sRGB IEC61966-2.1
+ 2000-01-01T00:08:04.039
+
+
+
+ image/jpeg
+
+
+
+ xmp.iid:E2D0CB145FC4E211AD7DCE11772AE6CC
+ xmp.did:E2D0CB145FC4E211AD7DCE11772AE6CC
+ xmp.iid:E2D0CB145FC4E211AD7DCE11772AE6CC
+
+ xmp.did:E2D0CB145FC4E211AD7DCE11772AE6CC
+
+
+
+
+
+
+
+ 5184
+ 3456
+ 8, 8, 8
+ RGB
+ Canon
+ Canon EOS 600D
+ Top-left
+ 3
+ 72,0000
+ 72,0000
+ Inch
+ Adobe Photoshop CS5 Windows
+ 2013:05:24 14:08:48
+ Co-sited
+ JPEG compression
+ 72
+ 72
+ Inch
+ 1/1250 sec.
+ f/2,0
+ Shutter priority
+
+
+ 100
+
+
+ Exif Version 2.3
+ 2000:01:01 00:08:04
+ 2000:01:01 00:08:04
+
+
+ Y Cb Cr -
+
+
+ 10,38 EV (1/1327 sec.)
+ 2,00 EV (f/2,0)
+ 0,00 EV
+ 2,00 EV (f/2,0)
+ Pattern
+
+
+
+
+
diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_50_formatted_canonical.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_50_formatted_canonical.xmp
index 63bda32..9a5e702 100644
--- a/src/commonTest/resources/com/ashampoo/xmp/sample_50_formatted_canonical.xmp
+++ b/src/commonTest/resources/com/ashampoo/xmp/sample_50_formatted_canonical.xmp
@@ -2,8 +2,75 @@
+ xmlns:aux="http://ns.adobe.com/exif/1.0/aux/"
+ xmlns:crs="http://ns.adobe.com/camera-raw-settings/1.0/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:exif="http://ns.adobe.com/exif/1.0/"
+ xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
+ 1.0.1
+ 0/1
+ 0
+ 50-50mm
+ 27
+ 50/1 50/1 0/0 0/0
+ 0000000000
+ 113063070880
+ True
+ image/jpeg
+ 2,00 EV (f/2,0)
+ 8, 8, 8
+
+
+ Y Cb Cr -
+
+
+ JPEG compression
+ 2013:05:24 14:08:48
+ 2000:01:01 00:08:04
+ Exif Version 2.3
+ 0,00 EV
+ Shutter priority
+ 1/1250 sec.
+ f/2,0
+
+
+ 100
+
+
+ 3456
+ 5184
+ Canon
+ 2,00 EV (f/2,0)
+ Pattern
+ Canon EOS 600D
+ Top-left
+ RGB
+ Inch
+ 3
+ 10,38 EV (1/1327 sec.)
+ Adobe Photoshop CS5 Windows
+ 72,0000
+ Co-sited
+ 72,0000
+ 3
+ 2000-01-01T00:08:04.039
+ sRGB IEC61966-2.1
+ 2000-01-01T00:08:04.39+02:00
+ 2013-05-24T14:08:48+03:00
+ 2013-05-24T14:08:48+03:00
0
+
+
+ xmp.did:E2D0CB145FC4E211AD7DCE11772AE6CC
+
+
+
+
+
+ xmp.iid:E2D0CB145FC4E211AD7DCE11772AE6CC
+ xmp.did:E2D0CB145FC4E211AD7DCE11772AE6CC
diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_50_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_50_formatted_compact.xmp
index 7fec24e..e6b92b1 100644
--- a/src/commonTest/resources/com/ashampoo/xmp/sample_50_formatted_compact.xmp
+++ b/src/commonTest/resources/com/ashampoo/xmp/sample_50_formatted_compact.xmp
@@ -2,8 +2,73 @@
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ aux:Firmware="1.0.1"
+ aux:FlashCompensation="0/1"
+ aux:ImageNumber="0"
+ aux:Lens="50-50mm"
+ aux:LensID="27"
+ aux:LensInfo="50/1 50/1 0/0 0/0"
+ aux:LensSerialNumber="0000000000"
+ aux:SerialNumber="113063070880"
+ crs:AlreadyApplied="True"
+ dc:format="image/jpeg"
+ exif:ApertureValue="2,00 EV (f/2,0)"
+ exif:BitsPerSample="8, 8, 8"
+ exif:Compression="JPEG compression"
+ exif:DateTime="2013:05:24 14:08:48"
+ exif:DateTimeOriginal="2000:01:01 00:08:04"
+ exif:ExifVersion="Exif Version 2.3"
+ exif:ExposureBiasValue="0,00 EV"
+ exif:ExposureProgram="Shutter priority"
+ exif:ExposureTime="1/1250 sec."
+ exif:FNumber="f/2,0"
+ exif:ImageLength="3456"
+ exif:ImageWidth="5184"
+ exif:Make="Canon"
+ exif:MaxApertureValue="2,00 EV (f/2,0)"
+ exif:MeteringMode="Pattern"
+ exif:Model="Canon EOS 600D"
+ exif:Orientation="Top-left"
+ exif:PhotometricInterpretation="RGB"
+ exif:ResolutionUnit="Inch"
+ exif:SamplesPerPixel="3"
+ exif:ShutterSpeedValue="10,38 EV (1/1327 sec.)"
+ exif:Software="Adobe Photoshop CS5 Windows"
+ exif:XResolution="72,0000"
+ exif:YCbCrPositioning="Co-sited"
+ exif:YResolution="72,0000"
+ photoshop:ColorMode="3"
+ photoshop:DateCreated="2000-01-01T00:08:04.039"
+ photoshop:ICCProfile="sRGB IEC61966-2.1"
+ xmp:CreateDate="2000-01-01T00:08:04.39+02:00"
+ xmp:MetadataDate="2013-05-24T14:08:48+03:00"
+ xmp:ModifyDate="2013-05-24T14:08:48+03:00"
+ xmp:Rating="0"
+ xmpMM:InstanceID="xmp.iid:E2D0CB145FC4E211AD7DCE11772AE6CC"
+ xmpMM:OriginalDocumentID="xmp.did:E2D0CB145FC4E211AD7DCE11772AE6CC">
+
+
+ Y Cb Cr -
+
+
+
+
+ 100
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_51.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_51.xmp
index bd656cf..876f94e 100644
--- a/src/commonTest/resources/com/ashampoo/xmp/sample_51.xmp
+++ b/src/commonTest/resources/com/ashampoo/xmp/sample_51.xmp
@@ -1,239 +1,76 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SippakorN
-
-
-
-
- @Sippakorn1955
-
-
-
-
+
+
+
+
+
+
+ SONY
+ SLT-A37
+ Top-left
+ 350
+ 350
+ Inch
+ SLT-A37 v1.02
+ 2014:04:05 12:39:31
+ Co-sited
+ 106 bytes undefined data
+ JPEG compression
+
+ SONY
+ SLT-A37
+ Top-left
+ 72
+ 72
+ Inch
+ SLT-A37 v1.02
+ 2014:04:05 12:39:31
+ Co-sited
+ 1/160 sec.
+ f/5,6
+ Normal program
+
+
+ 320
+
+
+ Unknown Exif Version
+ 2014:04:05 12:39:31
+ 2014:04:05 12:39:31
+
+
+ Y Cb Cr -
+
+
+ 1
+ 5,48 EV (152,72 cd/m^2)
+ 0,00 EV
+ 4,97 EV (f/5,6)
+ Pattern
+ Unknown
+
+
+ 55,0 mm
+ 35692 bytes undefined data
+
+ FlashPix Version 1.0
+ sRGB
+ 4912
+ 3264
+ DSC
+ Directly photographed
+ Normal process
+ Auto exposure
+ Auto white balance
+ 1,00
+ 82
+ Standard
+ Normal
+ Normal
+ Normal
+ R98
+ 0100
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_51_formatted_canonical.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_51_formatted_canonical.xmp
index c5ab663..6e46718 100644
--- a/src/commonTest/resources/com/ashampoo/xmp/sample_51_formatted_canonical.xmp
+++ b/src/commonTest/resources/com/ashampoo/xmp/sample_51_formatted_canonical.xmp
@@ -2,231 +2,65 @@
- 2.0
- Mac OS
- 1664194672787493
- 2.10.30
- 161/100
- 1.4.0
- 0/1
- 0
- EF70-300mm f/4-5.6L IS USM
- 489
- 70/1 300/1 0/0 0/0
- 7820004130
- 058021001133
- True
- 0
- DB958B423B648352F5500DCF12E528B1
- 5D637BD0F4976718D5C101714DE7835E
- -27
- 0
- 0
- Adobe Standard
- 38E531B7F49849F74EF6FA15106BD31D
- -15
- 25
- 23
- 23
- +56
- False
- 0
- 60
- 40
- 0
- 70
- 30
- +11
- +0.20
- 0
- 0
- 0
- False
- True
- -33
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- LensDefaults
-
-
- 1.000000
- © 2018 Adobe Systems, Inc.
- lang="x-default" Profiles
- Adobe Color
-
-
- Adobe Standard
- False
- E1095149FDB39D7A057BAB208837E2E1
- 11.0
- 0, 0, 22, 16, 40, 35, 127, 127, 224, 230, 240, 246, 255, 255
- 0, 0, 255, 255
- 0, 0, 255, 255
- 0, 0, 255, 255
- 12.2
-
-
- false
- false
- false
- B952C231111CD8E0ECCF14B86BAA7077
-
-
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 21
- 20
- 20
- False
- 0
- 75
- 0
- 0
- 50
- 25
- 0
- 0
- 0
- 0.0
- 100
- 0
- 0
- 0.00
- 0.00
- 0
- 11.0
- 353A9054.CR3
- 0
- 0
- -1
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- +42
- 25
- 0
- +1.0
- 40
- 0
- 0
- 0
- 0
- 0
- 4850
- -9
- -7
- 0, 0, 32, 22, 64, 56, 128, 128, 192, 196, 255, 255
- 0, 0, 255, 255
- 0, 0, 255, 255
- Medium Contrast
- Linear
- 0, 0, 255, 255
- 0, 0, 255, 255
- 0, 0, 255, 255
- 0, 0, 255, 255
- 0, 0, 255, 255
- 0
- 0
- 0.5
- 0.5
- 35
- 0
- 0
- False
- 6
- 151388160
- 12.2
- +14
- 0
- Custom
- +36
-
+ xmlns:exif="http://ns.adobe.com/exif/1.0/"
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/">
+ 5,48 EV (152,72 cd/m^2)
+ sRGB
+
- SippakorN
+ Y Cb Cr -
-
- image/jpeg
-
-
- @Sippakorn1955
-
-
- EF70-300mm f/4-5.6L IS USM
- 2020-03-11T17:37:33.36+08:00
- 1
- 2020-03-11T17:37:33.36+08:00
- GIMP 2.10
- 2020-03-11T20:10:12+07:00
- 2020-03-11T20:10:12+07:00
- 2
-
-
- D91E7F7E064AEF7A630A1DCAC6BF38D0
- D91E7F7E064AEF7A630A1DCAC6BF38D0
-
-
- xmp.did:69493116-46dc-402d-931b-1c9bf37ddaad
-
+
+ 1
+ JPEG compression
+ Normal
+ Normal process
+ 2014:04:05 12:39:31
+ 2014:04:05 12:39:31
+ 1,00
+ Unknown Exif Version
+ 0,00 EV
+ Auto exposure
+ Normal program
+ 1/160 sec.
+ f/5,6
+ DSC
+
+
+
+ FlashPix Version 1.0
+ 55,0 mm
+ 82
+
-
-
- derived
- converted from image/x-canon-cr3 to image/jpeg, saved to new location
-
-
-
-
- saved
- /
- xmp.iid:69493116-46dc-402d-931b-1c9bf37ddaad
- Adobe Photoshop Camera Raw 12.2 (Macintosh)
- 2020-03-11T20:10:12+07:00
-
-
-
-
- saved
- /
- xmp.iid:9d7b157e-f1a6-4fbe-8b35-d7cf3cf75dd3
- Gimp 2.10 (Mac OS)
- 2022-09-26T14:17:52+02:00
-
-
+ 320
-
- xmp.iid:b6251a9e-0b38-4a48-b01e-cf5a7d9a4bb9
- D91E7F7E064AEF7A630A1DCAC6BF38D0
+
+
+ R98
+ 0100
+ Unknown
+ SONY
+ 35692 bytes undefined data
+ 4,97 EV (f/5,6)
+ Pattern
+ SLT-A37
+ Top-left
+ 4912
+ 3264
+ 106 bytes undefined data
+ Inch
+ Normal
+ Standard
+ Directly photographed
+ Normal
+ SLT-A37 v1.02
+
+ Auto white balance
+ 350
+ Co-sited
+ 350
+ 2014:04:05 12:39:31
diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_51_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_51_formatted_compact.xmp
index 9e5e197..bc3fbd1 100644
--- a/src/commonTest/resources/com/ashampoo/xmp/sample_51_formatted_compact.xmp
+++ b/src/commonTest/resources/com/ashampoo/xmp/sample_51_formatted_compact.xmp
@@ -2,216 +2,63 @@
-
-
-
-
-
-
+ exif:BrightnessValue="5,48 EV (152,72 cd/m^2)"
+ exif:ColorSpace="sRGB"
+ exif:CompressedBitsPerPixel=" 1"
+ exif:Compression="JPEG compression"
+ exif:Contrast="Normal"
+ exif:CustomRendered="Normal process"
+ exif:DateTime="2014:04:05 12:39:31"
+ exif:DateTimeOriginal="2014:04:05 12:39:31"
+ exif:DigitalZoomRatio="1,00"
+ exif:ExifVersion="Unknown Exif Version"
+ exif:ExposureBiasValue="0,00 EV"
+ exif:ExposureMode="Auto exposure"
+ exif:ExposureProgram="Normal program"
+ exif:ExposureTime="1/160 sec."
+ exif:FNumber="f/5,6"
+ exif:FileSource="DSC"
+ exif:FlashPixVersion="FlashPix Version 1.0"
+ exif:FocalLength="55,0 mm"
+ exif:FocalLengthIn35mmFilm="82"
+ exif:ImageDescription=" "
+ exif:InteroperabilityIndex="R98"
+ exif:InteroperabilityVersion="0100"
+ exif:LightSource="Unknown"
+ exif:Make="SONY"
+ exif:MakerNote="35692 bytes undefined data"
+ exif:MaxApertureValue="4,97 EV (f/5,6)"
+ exif:MeteringMode="Pattern"
+ exif:Model="SLT-A37"
+ exif:Orientation="Top-left"
+ exif:PixelXDimension="4912"
+ exif:PixelYDimension="3264"
+ exif:PrintImageMatching="106 bytes undefined data"
+ exif:ResolutionUnit="Inch"
+ exif:Saturation="Normal"
+ exif:SceneCaptureType="Standard"
+ exif:SceneType="Directly photographed"
+ exif:Sharpness="Normal"
+ exif:Software="SLT-A37 v1.02"
+ exif:UserComment=""
+ exif:WhiteBalance="Auto white balance"
+ exif:XResolution="350"
+ exif:YCbCrPositioning="Co-sited"
+ exif:YResolution="350"
+ xmp:CreateDate="2014:04:05 12:39:31">
+
- SippakorN
+ Y Cb Cr -
-
-
-
- @Sippakorn1955
-
-
-
-
+
+
+
-
-
-
+ 320
-
+
diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_52.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_52.xmp
index 4519be8..d78a614 100644
--- a/src/commonTest/resources/com/ashampoo/xmp/sample_52.xmp
+++ b/src/commonTest/resources/com/ashampoo/xmp/sample_52.xmp
@@ -1,250 +1,421 @@
-
-
-
-
-
- dxfoto|published
-
-
- Firmware Version 1.1.2
- 55/1 250/1 0/0 0/0
- Canon EF-S 55-250mm f/4-5.6 IS STM
- 4148
- 0/1
- 0
- 1
- 2670
- 208885/36926
-
-
- 250
-
-
- 55,54.679N
- 36,57.8089E
- 2
- 1
- 2.2.0.0
- 368640/65536
- 0100
- 47
- 3648000/599
-
-
- 1
- 2
- 3
- 0
-
-
- 1/400
- E
- 250/1
- 0
- 565248/65536
- 47
- N
- 0
- 1
- 71/10
- 5
-
- False
- False
- 0
- 2
- False
-
- 5472000/899
- 0/1
- 4000
- 0230
- 47
- 103025021031
- 250
- 250
- EF-S55-250mm f/4-5.6 IS STM
- 0000800dcf
- 2
-
-
- 55/1
- 250/1
- 0/1
- 0/1
-
-
- 2019-07-15T20:09:19.47
- 0
- 2019-07-14T09:21:11.47
- darktable 2.6.2
- 1
-
-
-
- 000000400000003f0000003f
- sharpen
- 1
- 1
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- ffffffff
- flip
- 1
- 2
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- gz09eJxjYIAAM6vnNnqyn22E9n235b6aa3cy6rVdRaK9/Y970fYf95bbMzA0QPEoGEqADYnNhCELiVMAudcSGA==
- basecurve
- 1
- 5
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- 00000000e040f23c4ee4053efce6413f80c75b3f0000000000000000cdcc4c3ecdcc4c3ecdcc4c3fcdcc4c3ecdcc4c3fcdcc4c3fcdcc4c3ecdcc4c3f000000000000000000000000010000000000000001000000
- clipping
- 1
- 5
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- 00000000501a1c3d0c5cb53d9a16443feef9503f0000000000000000cdcc4c3ecdcc4c3ecdcc4c3fcdcc4c3ecdcc4c3fcdcc4c3fcdcc4c3ecdcc4c3f000000000000000000000000010000000000000001000000
- clipping
- 1
- 5
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- d0ccccbdd0cccc3dd0cc4cbd
- colisa
- 1
- 1
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- 01000000cdcccc3ecdcc8c3f0000803ecdcc4c3e
- bilat
- 1
- 3
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- 000000400000803f0000003f
- sharpen
- 1
- 1
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- 01000000cdcccc3ecdcc8c3f9a99993ecdcc4c3e
- bilat
- 1
- 3
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- 0000000000000000000048420000c842d9899d3dc332d53e8bac483f
- levels
- 1
- 2
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- 0000000000000000000000000100000000000000
- demosaic
- 1
- 3
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
- 32000000
- cacorrect
- 1
- 1
- 8
- 0
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
-
-
-
-
- 12
- 0
- 2
- 1
- 300
- 2
- Canon
- 300
- Canon EOS 70D
-
-
- dxfoto
- published
-
-
-
-
- CC-BY 3.0
-
-
-
-
- honeybee perching on yellow flower
-
-
-
-
- dxfoto.ru
-
-
- 2019-07-14T09:21:11.47
- _MG_9604.CR2
-
-
+
+
+
+
+
+ CZE
+ 23614
+
+
+
+
+
+
+ Kublov
+ Czechia
+ Central Bohemian Region
+
+
+
+
+
+
+ 99
+
+
+
+ 382/100
+ 2.0.0
+ 0/1
+ 0
+ EF70-200mm f/2.8L USM
+ 165
+ 70/1 200/1 0/0 0/0
+ 2981205828
+
+
+
+
+
+ Eva Machackova
+
+
+ image/jpeg
+
+
+ Rys ostrovid
+ Křivoklátsko
+ Kublov
+ Europe
+ Czech
+
+
+
+
+ _MG_1573_1
+
+
+
+
+
+ 2970854/1000000
+ 65535
+ 0
+ 2015-01-18T10:45:53.240+01:00
+ 2015-01-18T10:45:53.240+01:00
+ 0/1
+ 0
+ 3
+ 1/800
+ 28/10
+
+ False
+ True
+ 2
+ False
+ 0
+
+ 200/1
+ 2
+ 5184000/907
+ 3456000/595
+ 44540597/100000
+ 0
+ 49,56.622156N
+ 13,52.600764E
+ WGS-84
+ 2015-01-18T09:45:53.240Z
+ 2.0.0.0
+
+
+ 1600
+
+
+ 3/1
+ 2
+ 3364
+ 2968
+ 0
+ 9643856/1000000
+ 1
+
+
+
+ 2981205828
+ EF70-200mm f/2.8L USM
+
+
+ 70/1
+ 200/1
+ 0
+ 0
+
+
+
+
+
+ 1
+
+
+
+
+
+ Savci|Rys ostrovid
+ Places|Europe|Czech|Křivoklátsko
+ Places|Europe|Czech|Křivoklátsko|Kublov
+ Places|Europe
+ Places|Europe|Czech
+
+
+
+
+
+ Kublov
+ 3
+ Czechia
+ 2015-01-18T10:45:53.240+01:00
+ sRGB IEC61966-2.1
+ Central Bohemian Region
+
+
+
+ Eva Machackova
+
+
+ 8
+
+
+ 6
+ 2015-01-18T10:45:53.240+01:00
+ Canon
+ Canon EOS 7D
+ 1
+ 2
+ Adobe Photoshop CC 2014 (Windows)
+ 3000000/10000
+ 3000000/10000
+
+
+
+ 2015-01-18T10:45:53+01:00
+ Photo Supreme (3.0.3.2061)
+ 2016-10-22T11:07:15.226+01:00
+ 2015-01-24T18:40:12+01:00
+ 2
+
+
+
+
+ xmp.did:eaa16c47-805c-0447-a2a7-89b902ffac12
+ xmp.iid:bed40db5-cd53-8641-84ab-b36224e3aec0
+ 6AC5E3D6229714EAD2DD6804103177A0
+
+ adobe:docid:photoshop:05d4c353-a3f0-11e4-9ecb-ca3a401e6bd9
+
+
+
+
+
+ derived
+ converted from image/x-canon-cr2 to image/tiff
+
+
+ saved
+ /
+ xmp.iid:eaa16c47-805c-0447-a2a7-89b902ffac12
+ Adobe Photoshop Camera Raw 8.7.1 (Windows)
+ 2015-01-24T18:36:04+01:00
+
+
+ saved
+ /
+ xmp.iid:bed40db5-cd53-8641-84ab-b36224e3aec0
+ Adobe Photoshop CC 2014 (Windows)
+ 2015-01-24T18:39:40+01:00
+
+
+ converted
+ from image/tiff to image/jpeg
+
+
+ derived
+ converted from image/tiff to image/jpeg
+
+
+ saved
+ /
+ xmp.iid:8173f4be-25aa-3c4f-914c-e8b283a62d0d
+ Adobe Photoshop CC 2014 (Windows)
+ 2015-01-24T18:39:40+01:00
+
+
+ saved
+ /
+ xmp.iid:45212f11-0c60-4b47-9de5-4977445eeea5
+ Adobe Photoshop CC 2014 (Windows)
+ 2015-01-24T18:40:12+01:00
+
+
+
+ xmp.iid:45212f11-0c60-4b47-9de5-4977445eeea5
+ 6AC5E3D6229714EAD2DD6804103177A0
+ _MG_1573.CR2
+
+
+
+ True
+ 0
+ 134348800
+ 0
+ 0
+ 0
+ Camera Standard
+ 18F667CAF0021C83697E05BE19459589
+ 0
+ 25
+ 50
+ 50
+ 0
+ False
+ 0
+ 1
+ 1
+ 0.000687
+ 1
+ 0.038144
+ 0
+ 60
+ 40
+ 0
+ 70
+ 30
+ 0.00
+ 0
+ 0
+ 0
+ True
+ True
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ LensDefaults
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 75
+ 0
+ 0
+ 50
+ 25
+ 0
+ 0
+ 0
+ 0.0
+ 100
+ 0
+ 0
+ 0
+ 6.7
+ _MG_1573.CR2
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 25
+ 0
+ +1
+ 25
+ 0
+ 0
+ 0
+ 0
+ 0
+ 6250
+ +13
+
+
+ 0, 0
+ 32, 22
+ 64, 56
+ 128, 128
+ 192, 196
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+ Medium Contrast
+ Linear
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+ 8.7.1
+ 0
+ 0
+ As Shot
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_52_formatted_canonical.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_52_formatted_canonical.xmp
index f655382..51143b3 100644
--- a/src/commonTest/resources/com/ashampoo/xmp/sample_52_formatted_canonical.xmp
+++ b/src/commonTest/resources/com/ashampoo/xmp/sample_52_formatted_canonical.xmp
@@ -2,276 +2,371 @@
- Firmware Version 1.1.2
- 0/1
- Canon EF-S 55-250mm f/4-5.6 IS STM
- 4148
- 55/1 250/1 0/0 0/0
- 1
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 1
-
- 0
- sharpen
- 000000400000003f0000003f
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 2
-
- 0
- flip
- ffffffff
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 5
-
- 0
- basecurve
- gz09eJxjYIAAM6vnNnqyn22E9n235b6aa3cy6rVdRaK9/Y970fYf95bbMzA0QPEoGEqADYnNhCELiVMAudcSGA==
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 5
-
- 0
- clipping
- 00000000e040f23c4ee4053efce6413f80c75b3f0000000000000000cdcc4c3ecdcc4c3ecdcc4c3fcdcc4c3ecdcc4c3fcdcc4c3fcdcc4c3ecdcc4c3f000000000000000000000000010000000000000001000000
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 5
-
- 0
- clipping
- 00000000501a1c3d0c5cb53d9a16443feef9503f0000000000000000cdcc4c3ecdcc4c3ecdcc4c3fcdcc4c3ecdcc4c3fcdcc4c3fcdcc4c3ecdcc4c3f000000000000000000000000010000000000000001000000
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 1
-
- 0
- colisa
- d0ccccbdd0cccc3dd0cc4cbd
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 3
-
- 0
- bilat
- 01000000cdcccc3ecdcc8c3f0000803ecdcc4c3e
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 1
-
- 0
- sharpen
- 000000400000803f0000003f
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 3
-
- 0
- bilat
- 01000000cdcccc3ecdcc8c3f9a99993ecdcc4c3e
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 2
-
- 0
- levels
- 0000000000000000000048420000c842d9899d3dc332d53e8bac483f
-
-
-
-
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 3
-
- 0
- demosaic
- 0000000000000000000000000100000000000000
-
-
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
+ CZE
+ 23614
+
+
- gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA==
- 8
- 1
- 1
-
- 0
- cacorrect
- 32000000
+ Kublov
+ Czechia
+ Central Bohemian Region
+
+
+ 99
+ 382/100
+ 2.0.0
+ 0/1
+ 0
+ EF70-200mm f/2.8L USM
+ 165
+ 70/1 200/1 0/0 0/0
+ 2981205828
+ True
+ 0
+ 134348800
+ 0
+ 0
+ 0
+ Camera Standard
+ 18F667CAF0021C83697E05BE19459589
+ 0
+ 25
+ 50
+ 50
+ 0
+ False
+ 0
+ 1
+ 1
+ 0.000687
+ 1
+ 0.038144
+ 0
+ 60
+ 40
+ 0
+ 70
+ 30
+ 0.00
+ 0
+ 0
+ 0
+ True
+ True
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ LensDefaults
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 75
+ 0
+ 0
+ 50
+ 25
+ 0
+ 0
+ 0
+ 0.0
+ 100
+ 0
+ 0
+ 0
+ 6.7
+ _MG_1573.CR2
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 25
+ 0
+ +1
+ 25
+ 0
+ 0
+ 0
+ 0
+ 0
+ 6250
+ +13
+
+
+ 0, 0
+ 32, 22
+ 64, 56
+ 128, 128
+ 192, 196
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+ Medium Contrast
+ Linear
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
-
- 12
- 0
- 2
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+ 8.7.1
+ 0
+ 0
+ As Shot
+ 0
- dxfoto.ru
+ Eva Machackova
-
-
- honeybee perching on yellow flower
-
-
-
-
- CC-BY 3.0
-
-
+ image/jpeg
- dxfoto
- published
+ Rys ostrovid
+ Křivoklátsko
+ Kublov
+ Europe
+ Czech
- 368640/65536
- 1
-
-
- 1
- 2
- 3
- 0
-
-
+
+
+ _MG_1573_1
+
+
+ 2970854/1000000
+ 65535
0
- 0230
+ 2015-01-18T10:45:53.240+01:00
0/1
- 1
- 1
- 1/400
- 71/10
+ 0
+ 3
+ 1/800
+ 28/10
False
- False
+ True
2
False
0
- 0100
- 250/1
+ 200/1
2
- 5472000/899
- 3648000/599
- 55,54.679N
- N
- 36,57.8089E
- E
- 2.2.0.0
+ 5184000/907
+ 3456000/595
+ 44540597/100000
+ 0
+ 49,56.622156N
+ 13,52.600764E
+ WGS-84
+ 2015-01-18T09:45:53.240Z
+ 2.0.0.0
- 250
+ 1600
- 208885/36926
- 5
- 4000
- 2670
+ 3/1
+ 2
+ 3364
+ 2968
0
- 565248/65536
- 47
- 47
- 47
- 0
- 103025021031
- EF-S55-250mm f/4-5.6 IS STM
- 0000800dcf
+ 9643856/1000000
+ 1
+ 2981205828
+ EF70-200mm f/2.8L USM
-
- 55/1
- 250/1
- 0/1
- 0/1
-
+
+ 70/1
+ 200/1
+ 0
+ 0
+
- 250
- 250
- 2
+ 1
+
+ Savci|Rys ostrovid
+ Places|Europe|Czech|Křivoklátsko
+ Places|Europe|Czech|Křivoklátsko|Kublov
+ Places|Europe
+ Places|Europe|Czech
+
+
+ Kublov
+ 3
+ Czechia
+ 2015-01-18T10:45:53.240+01:00
+ sRGB IEC61966-2.1
+ Central Bohemian Region
+
- dxfoto|published
+ 8
-
- 2019-07-14T09:21:11.47
+
+ 6
Canon
- Canon EOS 70D
+ Canon EOS 7D
1
2
- 300
- 300
- 2019-07-14T09:21:11.47
- darktable 2.6.2
- 2019-07-15T20:09:19.47
- 0
- _MG_9604.CR2
+ 3000000/10000
+ 3000000/10000
+ 2015-01-18T10:45:53+01:00
+ Photo Supreme (3.0.3.2061)
+ 2016-10-22T11:07:15.226+01:00
+ 2015-01-24T18:40:12+01:00
+ 2
+
+
+ xmp.did:eaa16c47-805c-0447-a2a7-89b902ffac12
+ xmp.iid:bed40db5-cd53-8641-84ab-b36224e3aec0
+ 6AC5E3D6229714EAD2DD6804103177A0
+
+
+ adobe:docid:photoshop:05d4c353-a3f0-11e4-9ecb-ca3a401e6bd9
+
+
+
+
+
+
+ derived
+ converted from image/x-canon-cr2 to image/tiff
+
+
+
+
+ saved
+ /
+ xmp.iid:eaa16c47-805c-0447-a2a7-89b902ffac12
+ Adobe Photoshop Camera Raw 8.7.1 (Windows)
+ 2015-01-24T18:36:04+01:00
+
+
+
+
+ saved
+ /
+ xmp.iid:bed40db5-cd53-8641-84ab-b36224e3aec0
+ Adobe Photoshop CC 2014 (Windows)
+ 2015-01-24T18:39:40+01:00
+
+
+
+
+ converted
+ from image/tiff to image/jpeg
+
+
+
+
+ derived
+ converted from image/tiff to image/jpeg
+
+
+
+
+ saved
+ /
+ xmp.iid:8173f4be-25aa-3c4f-914c-e8b283a62d0d
+ Adobe Photoshop CC 2014 (Windows)
+ 2015-01-24T18:39:40+01:00
+
+
+
+
+ saved
+ /
+ xmp.iid:45212f11-0c60-4b47-9de5-4977445eeea5
+ Adobe Photoshop CC 2014 (Windows)
+ 2015-01-24T18:40:12+01:00
+
+
+
+
+ xmp.iid:45212f11-0c60-4b47-9de5-4977445eeea5
+ 6AC5E3D6229714EAD2DD6804103177A0
+ _MG_1573.CR2
diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_52_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_52_formatted_compact.xmp
index 1b44f14..1393807 100644
--- a/src/commonTest/resources/com/ashampoo/xmp/sample_52_formatted_compact.xmp
+++ b/src/commonTest/resources/com/ashampoo/xmp/sample_52_formatted_compact.xmp
@@ -2,237 +2,341 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+ tiff:XResolution="3000000/10000"
+ tiff:YResolution="3000000/10000"
+ xmp:CreateDate="2015-01-18T10:45:53+01:00"
+ xmp:CreatorTool="Photo Supreme (3.0.3.2061)"
+ xmp:MetadataDate="2016-10-22T11:07:15.226+01:00"
+ xmp:ModifyDate="2015-01-24T18:40:12+01:00"
+ xmp:Rating="2"
+ xmpMM:DocumentID="adobe:docid:photoshop:05d4c353-a3f0-11e4-9ecb-ca3a401e6bd9"
+ xmpMM:InstanceID="xmp.iid:45212f11-0c60-4b47-9de5-4977445eeea5"
+ xmpMM:OriginalDocumentID="6AC5E3D6229714EAD2DD6804103177A0"
+ xmpMM:PreservedFileName="_MG_1573.CR2">
+
+
+ Iptc4xmpExt:City="Kublov"
+ Iptc4xmpExt:CountryName="Czechia"
+ Iptc4xmpExt:ProvinceState="Central Bohemian Region"/>
+
+
+
+
+ 0, 0
+ 32, 22
+ 64, 56
+ 128, 128
+ 192, 196
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
+
+
+
+
+ 0, 0
+ 255, 255
-
+
- dxfoto.ru
+ Eva Machackova
-
-
- honeybee perching on yellow flower
-
-
-
-
- CC-BY 3.0
-
-
- dxfoto
- published
+ Rys ostrovid
+ Křivoklátsko
+ Kublov
+ Europe
+ Czech
-
-
- 1
- 2
- 3
- 0
-
-
+
+
+ _MG_1573_1
+
+
- 250
+ 1600
-
- 55/1
- 250/1
- 0/1
- 0/1
-
+
+ 70/1
+ 200/1
+ 0
+ 0
+
+
+ Savci|Rys ostrovid
+ Places|Europe|Czech|Křivoklátsko
+ Places|Europe|Czech|Křivoklátsko|Kublov
+ Places|Europe
+ Places|Europe|Czech
+
+
+
- dxfoto|published
+ 8
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+