diff --git a/.gitignore b/.gitignore index 5b27f24..9d4419f 100644 --- a/.gitignore +++ b/.gitignore @@ -22,5 +22,6 @@ /.idea/vcs.xml /.idea/workspace.xml /.idea/xmpcore.iml +/.kotlin/ /build/ /local.properties diff --git a/README.md b/README.md index 2f8f65e..0908c6a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # XMP Core for Kotlin Multiplatform -[![Kotlin](https://img.shields.io/badge/kotlin-1.9.23-blue.svg?logo=kotlin)](httpw://kotlinlang.org) +[![Kotlin](https://img.shields.io/badge/kotlin-2.0.0-blue.svg?logo=kotlin)](httpw://kotlinlang.org) ![JVM](https://img.shields.io/badge/-JVM-gray.svg?style=flat) ![Android](https://img.shields.io/badge/-Android-gray.svg?style=flat) ![iOS](https://img.shields.io/badge/-iOS-gray.svg?style=flat) @@ -20,7 +20,7 @@ It's part of [Ashampoo Photo Organizer](https://ashampoo.com/photo-organizer). ## Installation ``` -implementation("com.ashampoo:xmpcore:1.3.0") +implementation("com.ashampoo:xmpcore:1.4.0") ``` ## How to use diff --git a/build.gradle.kts b/build.gradle.kts index 008fe86..c3ece4b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFramework import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl plugins { - kotlin("multiplatform") version "1.9.23" + kotlin("multiplatform") version "2.0.0" id("com.android.library") version "8.2.2" id("maven-publish") id("signing") @@ -24,8 +24,8 @@ repositories { val productName = "Ashampoo XMP Core" -val xmlUtilVersion: String = "0.86.3" -val kotlinIoVersion: String = "0.3.1" +val xmlUtilVersion: String = "0.90.0-RC3" +val kotlinIoVersion: String = "0.4.0" description = productName group = "com.ashampoo" @@ -157,11 +157,7 @@ kotlin { js() @OptIn(ExperimentalWasmDsl::class) - wasmJs { - // All tests reading from files fail, because kotlinx-io - // has no Path support for WASM (yet?). - // nodejs() - } + wasmJs() @OptIn(ExperimentalWasmDsl::class) wasmWasi() @@ -188,6 +184,7 @@ kotlin { } } + @Suppress("UnusedPrivateMember", "UNUSED_VARIABLE") // False positive val jvmMain by sourceSets.getting @Suppress("UnusedPrivateMember", "UNUSED_VARIABLE") // False positive diff --git a/examples/xmpcore-java-sample/build.gradle b/examples/xmpcore-java-sample/build.gradle index 5d64c69..197997d 100644 --- a/examples/xmpcore-java-sample/build.gradle +++ b/examples/xmpcore-java-sample/build.gradle @@ -10,7 +10,7 @@ repositories { } dependencies { - implementation 'com.ashampoo:xmpcore:1.3.0' + implementation 'com.ashampoo:xmpcore:1.4.0' } // Needed to make it work for the Gradle java plugin diff --git a/examples/xmpcore-kotlin-jvm-sample/build.gradle.kts b/examples/xmpcore-kotlin-jvm-sample/build.gradle.kts index e9af068..8e8a90e 100644 --- a/examples/xmpcore-kotlin-jvm-sample/build.gradle.kts +++ b/examples/xmpcore-kotlin-jvm-sample/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - kotlin("jvm") version "1.9.23" + kotlin("jvm") version "2.0.0" } group = "com.ashampoo" @@ -10,5 +10,5 @@ repositories { } dependencies { - implementation("com.ashampoo:xmpcore:1.3.0") + implementation("com.ashampoo:xmpcore:1.4.0") } diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPIterator.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPIterator.kt index e29868e..18c0d78 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPIterator.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPIterator.kt @@ -13,10 +13,10 @@ import com.ashampoo.xmp.internal.XMPErrorConst import com.ashampoo.xmp.internal.XMPNode import com.ashampoo.xmp.internal.XMPNodeUtils.findNode import com.ashampoo.xmp.internal.XMPNodeUtils.findSchemaNode -import com.ashampoo.xmp.options.IteratorOptions -import com.ashampoo.xmp.options.PropertyOptions import com.ashampoo.xmp.internal.XMPPath import com.ashampoo.xmp.internal.XMPPathParser.expandXPath +import com.ashampoo.xmp.options.IteratorOptions +import com.ashampoo.xmp.options.PropertyOptions /** * 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 05a5355..520a5ff 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPMeta.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPMeta.kt @@ -25,6 +25,7 @@ import com.ashampoo.xmp.internal.XMPNodeUtils.findNode import com.ashampoo.xmp.internal.XMPNodeUtils.setNodeValue import com.ashampoo.xmp.internal.XMPNodeUtils.verifySetOptions import com.ashampoo.xmp.internal.XMPNormalizer.normalize +import com.ashampoo.xmp.internal.XMPPathParser.expandXPath import com.ashampoo.xmp.internal.XMPUtils.convertToBoolean import com.ashampoo.xmp.internal.XMPUtils.convertToDouble import com.ashampoo.xmp.internal.XMPUtils.convertToInteger @@ -33,7 +34,6 @@ import com.ashampoo.xmp.internal.XMPUtils.decodeBase64 import com.ashampoo.xmp.options.IteratorOptions import com.ashampoo.xmp.options.ParseOptions import com.ashampoo.xmp.options.PropertyOptions -import com.ashampoo.xmp.internal.XMPPathParser.expandXPath /** * This class represents the set of XMP metadata as a DOM representation. It has methods to read and @@ -106,7 +106,10 @@ public class XMPMeta internal constructor() { ) ?: return null if (valueType != XMPValueType.STRING && propNode.options.isCompositeProperty()) - throw XMPException("Property must be simple when a value type is requested", XMPErrorConst.BADXPATH) + throw XMPException( + "Property must be simple when a value type is requested", + XMPErrorConst.BADXPATH + ) val value = evaluateNodeValue(valueType, propNode) @@ -547,7 +550,10 @@ public class XMPMeta internal constructor() { } else { // array options missing - throw XMPException("Explicit arrayOptions required to create new array", XMPErrorConst.BADOPTIONS) + throw XMPException( + "Explicit arrayOptions required to create new array", + XMPErrorConst.BADOPTIONS + ) } } @@ -1200,7 +1206,10 @@ public class XMPMeta internal constructor() { } else -> // does not happen under normal circumstances - throw XMPException("Unexpected result from ChooseLocalizedText", XMPErrorConst.INTERNALFAILURE) + throw XMPException( + "Unexpected result from ChooseLocalizedText", + XMPErrorConst.INTERNALFAILURE + ) } // Add an x-default at the front if needed. @@ -1297,7 +1306,10 @@ public class XMPMeta internal constructor() { ) ?: return null if (valueType != XMPValueType.STRING && propNode.options.isCompositeProperty()) - throw XMPException("Property must be simple when a value type is requested", XMPErrorConst.BADXPATH) + throw XMPException( + "Property must be simple when a value type is requested", + XMPErrorConst.BADXPATH + ) return evaluateNodeValue(valueType, propNode) } diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/XMPVersionInfo.kt b/src/commonMain/kotlin/com/ashampoo/xmp/XMPVersionInfo.kt index 5568e5c..d9abce3 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/XMPVersionInfo.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/XMPVersionInfo.kt @@ -8,7 +8,7 @@ package com.ashampoo.xmp public object XMPVersionInfo { public const val MAJOR: Int = 1 - public const val MINOR: Int = 3 + public const val MINOR: Int = 4 public const val PATCH: Int = 0 public const val VERSION_MESSAGE: String = diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/internal/DomParser.kt b/src/commonMain/kotlin/com/ashampoo/xmp/internal/DomParser.kt index 4002d1b..f8066bb 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/internal/DomParser.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/internal/DomParser.kt @@ -3,7 +3,8 @@ package com.ashampoo.xmp.internal import com.ashampoo.xmp.XMPException import nl.adaptivity.xmlutil.DomWriter import nl.adaptivity.xmlutil.EventType -import nl.adaptivity.xmlutil.dom.Document +import nl.adaptivity.xmlutil.XmlUtilInternal +import nl.adaptivity.xmlutil.dom2.Document import nl.adaptivity.xmlutil.writeCurrent import nl.adaptivity.xmlutil.xmlStreaming @@ -11,6 +12,7 @@ internal object DomParser { private const val RDF_RDF_END = "" + @OptIn(XmlUtilInternal::class) fun parseDocumentFromString(input: String): Document { /* diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPMetaParser.kt b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPMetaParser.kt index c800500..e06d7d5 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPMetaParser.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPMetaParser.kt @@ -12,17 +12,15 @@ import com.ashampoo.xmp.XMPConst import com.ashampoo.xmp.XMPMeta import com.ashampoo.xmp.internal.XMPNormalizer.normalize import com.ashampoo.xmp.options.ParseOptions -import nl.adaptivity.xmlutil.dom.Element -import nl.adaptivity.xmlutil.dom.Node import nl.adaptivity.xmlutil.dom.NodeConsts -import nl.adaptivity.xmlutil.dom.ProcessingInstruction -import nl.adaptivity.xmlutil.dom.childNodes -import nl.adaptivity.xmlutil.dom.nodeType -import nl.adaptivity.xmlutil.dom.getData -import nl.adaptivity.xmlutil.dom.getTarget -import nl.adaptivity.xmlutil.dom.length -import nl.adaptivity.xmlutil.dom.localName -import nl.adaptivity.xmlutil.dom.namespaceURI +import nl.adaptivity.xmlutil.dom2.Element +import nl.adaptivity.xmlutil.dom2.Node +import nl.adaptivity.xmlutil.dom2.ProcessingInstruction +import nl.adaptivity.xmlutil.dom2.childNodes +import nl.adaptivity.xmlutil.dom2.length +import nl.adaptivity.xmlutil.dom2.localName +import nl.adaptivity.xmlutil.dom2.namespaceURI +import nl.adaptivity.xmlutil.dom2.nodeType /** * This class replaces the `ExpatAdapter.cpp` and does the XML-parsing and fixes the prefix. diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPNodeUtils.kt b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPNodeUtils.kt index b9aa76a..3bae5fa 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPNodeUtils.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPNodeUtils.kt @@ -102,11 +102,15 @@ internal object XMPNodeUtils { !parent.isImplicit -> throw XMPException( - "Named children only allowed for schemas and structs: $childName", XMPErrorConst.BADXPATH + "Named children only allowed for schemas and structs: $childName", + XMPErrorConst.BADXPATH ) parent.options.isArray() -> - throw XMPException("Named children not allowed for arrays: $childName", XMPErrorConst.BADXPATH) + throw XMPException( + "Named children not allowed for arrays: $childName", + XMPErrorConst.BADXPATH + ) createNodes -> parent.options.setStruct(true) diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPNormalizer.kt b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPNormalizer.kt index 7b32df2..484cd36 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPNormalizer.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPNormalizer.kt @@ -13,9 +13,9 @@ import com.ashampoo.xmp.XMPException import com.ashampoo.xmp.XMPMeta import com.ashampoo.xmp.XMPSchemaRegistry import com.ashampoo.xmp.internal.Utils.checkUUIDFormat +import com.ashampoo.xmp.internal.XMPPathParser.expandXPath import com.ashampoo.xmp.options.ParseOptions import com.ashampoo.xmp.options.PropertyOptions -import com.ashampoo.xmp.internal.XMPPathParser.expandXPath internal object XMPNormalizer { @@ -355,10 +355,9 @@ internal object XMPNormalizer { /** * Moves an alias node of array form to another schema into an array * - * @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 - * + * @param removeChildFromTree lambda used to delete the property of the schema */ private fun transplantArrayItemAlias( childNode: XMPNode, @@ -370,7 +369,10 @@ internal object XMPNormalizer { // *** Allow x-default. if (childNode.options.hasLanguage()) - throw XMPException("Alias to x-default already has a language qualifier", XMPErrorConst.BADXMP) + throw XMPException( + "Alias to x-default already has a language qualifier", + XMPErrorConst.BADXMP + ) val langQual = XMPNode(XMPConst.XML_LANG, XMPConst.X_DEFAULT) diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPRDFParser.kt b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPRDFParser.kt index c5248fa..44710a7 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPRDFParser.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPRDFParser.kt @@ -14,23 +14,22 @@ import com.ashampoo.xmp.XMPMeta import com.ashampoo.xmp.XMPSchemaRegistry import com.ashampoo.xmp.options.ParseOptions import com.ashampoo.xmp.options.PropertyOptions -import nl.adaptivity.xmlutil.dom.Attr -import nl.adaptivity.xmlutil.dom.Element -import nl.adaptivity.xmlutil.dom.Node import nl.adaptivity.xmlutil.dom.NodeConsts -import nl.adaptivity.xmlutil.dom.ProcessingInstruction -import nl.adaptivity.xmlutil.dom.Text -import nl.adaptivity.xmlutil.dom.attributes -import nl.adaptivity.xmlutil.dom.childNodes -import nl.adaptivity.xmlutil.dom.data -import nl.adaptivity.xmlutil.dom.length -import nl.adaptivity.xmlutil.dom.localName -import nl.adaptivity.xmlutil.dom.namespaceURI -import nl.adaptivity.xmlutil.dom.nodeName -import nl.adaptivity.xmlutil.dom.nodeType -import nl.adaptivity.xmlutil.dom.ownerElement -import nl.adaptivity.xmlutil.dom.prefix -import nl.adaptivity.xmlutil.dom.value +import nl.adaptivity.xmlutil.dom2.Attr +import nl.adaptivity.xmlutil.dom2.Element +import nl.adaptivity.xmlutil.dom2.Node +import nl.adaptivity.xmlutil.dom2.Text +import nl.adaptivity.xmlutil.dom2.attributes +import nl.adaptivity.xmlutil.dom2.childNodes +import nl.adaptivity.xmlutil.dom2.data +import nl.adaptivity.xmlutil.dom2.length +import nl.adaptivity.xmlutil.dom2.localName +import nl.adaptivity.xmlutil.dom2.namespaceURI +import nl.adaptivity.xmlutil.dom2.nodeName +import nl.adaptivity.xmlutil.dom2.nodeType +import nl.adaptivity.xmlutil.dom2.ownerElement +import nl.adaptivity.xmlutil.dom2.prefix +import nl.adaptivity.xmlutil.dom2.value /** * Parser for "normal" XML serialisation of RDF. @@ -135,7 +134,7 @@ internal object XMPRDFParser { rdfRdfNode as Element - if (rdfRdfNode.attributes.length == 0) + if (rdfRdfNode.attributes.getLength() == 0) throw XMPException("Illegal: rdf:RDF node has no attributes", XMPErrorConst.BADRDF) for (index in 0 until rdfRdfNode.childNodes.length) { @@ -207,7 +206,7 @@ internal object XMPRDFParser { // Used to detect attributes that are mutually exclusive. var exclusiveAttrs = 0 - for (index in 0 until xmlNode.attributes.length) { + for (index in 0 until xmlNode.attributes.getLength()) { val attribute = xmlNode.attributes.item(index) as Attr @@ -223,7 +222,10 @@ internal object XMPRDFParser { RDFTERM_ID, RDFTERM_NODE_ID, RDFTERM_ABOUT -> { if (exclusiveAttrs > 0) - throw XMPException("Mutally exclusive about, ID, nodeID attributes", XMPErrorConst.BADRDF) + throw XMPException( + "Mutally exclusive about, ID, nodeID attributes", + XMPErrorConst.BADRDF + ) exclusiveAttrs++ @@ -236,7 +238,10 @@ internal object XMPRDFParser { if (xmpParent.name != null && xmpParent.name!!.isNotEmpty()) { if (xmpParent.name != attribute.value) - throw XMPException("Mismatched top level rdf:about values", XMPErrorConst.BADXMP) + throw XMPException( + "Mismatched top level rdf:about values", + XMPErrorConst.BADXMP + ) } else { xmpParent.name = attribute.value @@ -357,7 +362,7 @@ internal object XMPRDFParser { var nsAttrs: MutableList? = null - for (index in 0 until attributes.length) { + for (index in 0 until attributes.getLength()) { val attribute = attributes.item(index) as Attr @@ -378,17 +383,19 @@ internal object XMPRDFParser { attributes.removeNamedItem(it.next()) } - if (attributes.length > 3) { + if (attributes.getLength() > 3) { - // Only an emptyPropertyElt can have more than 3 attributes. + /* Only an emptyPropertyElt can have more than 3 attributes. */ parseEmptyPropertyElement(xmp, xmpParent, xmlNode, isTopLevel) } else { - // Look through the attributes for one that isn't rdf:ID or xml:lang, - // it will usually tell what we should be dealing with. - // The called routines must verify their specific syntax! - for (index in 0 until attributes.length) { + /* + * Look through the attributes for one that isn't rdf:ID or xml:lang, + * it will usually tell what we should be dealing with. + * The called routines must verify their specific syntax! + */ + for (index in 0 until attributes.getLength()) { val attribute = attributes.item(index) as Attr @@ -424,8 +431,10 @@ internal object XMPRDFParser { } } - // Only rdf:ID and xml:lang, could be a resourcePropertyElt, a literalPropertyElt, - // or an emptyPropertyElt. Look at the child XML nodes to decide which. + /* + * Only rdf:ID and xml:lang, could be a resourcePropertyElt, a literalPropertyElt, + * or an emptyPropertyElt. Look at the child XML nodes to decide which. + */ if (xmlNode.childNodes.length > 0) { for (index in 0 until xmlNode.childNodes.length) { @@ -475,7 +484,7 @@ internal object XMPRDFParser { // walk through the attributes @Suppress("LoopWithTooManyJumpStatements") - for (index in 0 until xmlNode.attributes.length) { + for (index in 0 until xmlNode.attributes.getLength()) { val attribute = xmlNode.attributes.item(index) as Attr @@ -579,7 +588,7 @@ internal object XMPRDFParser { val newChild = addChildNode(xmp, xmpParent, xmlNode, null, isTopLevel) @Suppress("LoopWithTooManyJumpStatements") - for (index in 0 until xmlNode.attributes.length) { + for (index in 0 until xmlNode.attributes.getLength()) { val attribute = xmlNode.attributes.item(index) as Attr @@ -637,7 +646,7 @@ internal object XMPRDFParser { newStruct.options.setStruct(true) @Suppress("LoopWithTooManyJumpStatements") - for (index in 0 until xmlNode.attributes.length) { + for (index in 0 until xmlNode.attributes.getLength()) { val attribute = xmlNode.attributes.item(index) as Attr @@ -714,7 +723,7 @@ internal object XMPRDFParser { ) /* 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) { + for (index in 0 until xmlNode.attributes.getLength()) { val attribute = xmlNode.attributes.item(index) as Attr @@ -824,7 +833,7 @@ internal object XMPRDFParser { childIsStruct = true } - for (index in 0 until xmlNode.attributes.length) { + for (index in 0 until xmlNode.attributes.getLength()) { val attribute = xmlNode.attributes.item(index) as Attr diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPRDFWriter.kt b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPRDFWriter.kt index 81cc9a8..de3ae83 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPRDFWriter.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/internal/XMPRDFWriter.kt @@ -948,7 +948,10 @@ internal object XMPRDFWriter { for (child in node.getChildren()) { if (!canBeRDFAttrProp(child)) - throw XMPException("Can't mix rdf:resource and complex fields", XMPErrorConst.BADRDF) + throw XMPException( + "Can't mix rdf:resource and complex fields", + XMPErrorConst.BADRDF + ) sb.append(XMP_DEFAULT_NEWLINE) writeIndent(sb, actualIndent + 1) diff --git a/src/commonMain/kotlin/com/ashampoo/xmp/options/PropertyOptions.kt b/src/commonMain/kotlin/com/ashampoo/xmp/options/PropertyOptions.kt index 8e7c07b..e3fa634 100644 --- a/src/commonMain/kotlin/com/ashampoo/xmp/options/PropertyOptions.kt +++ b/src/commonMain/kotlin/com/ashampoo/xmp/options/PropertyOptions.kt @@ -282,7 +282,10 @@ public class PropertyOptions : Options { public override fun assertConsistency(options: Int) { if (options and STRUCT > 0 && options and ARRAY > 0) - throw XMPException("IsStruct and IsArray options are mutually exclusive", XMPErrorConst.BADOPTIONS) + throw XMPException( + "IsStruct and IsArray options are mutually exclusive", + XMPErrorConst.BADOPTIONS + ) else if (options and URI > 0 && options and (ARRAY or STRUCT) > 0) throw XMPException("Structs and arrays can't have \"value\" options", XMPErrorConst.BADOPTIONS) } diff --git a/src/commonTest/resources/com/ashampoo/xmp/empty.xmp b/src/commonTest/resources/com/ashampoo/xmp/empty.xmp index 20fa509..99103d5 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/empty.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/empty.xmp @@ -1,5 +1,5 @@ - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/new.xmp b/src/commonTest/resources/com/ashampoo/xmp/new.xmp index 90ec790..61d640c 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/new.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/new.xmp @@ -1,5 +1,5 @@ - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_13_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_13_formatted_compact.xmp index ad869ad..d1b358b 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_13_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_13_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_14_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_14_formatted_compact.xmp index 1783e27..92c2e6d 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_14_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_14_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_15_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_15_formatted_compact.xmp index 4e3cbd6..1d99655 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_15_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_15_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + dxfoto.ru + + + + + CC-BY 3.0 + + + + + dxfoto + published + + + + + dxfoto|published + + + + + + \ No newline at end of file diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_1_compact_to_canonical.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_1_compact_to_canonical.xmp new file mode 100644 index 0000000..9d36a12 --- /dev/null +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_1_compact_to_canonical.xmp @@ -0,0 +1,192 @@ + + + + + 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 + + + + + gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA== + 8 + 1 + 1 + + 0 + cacorrect + 32000000 + + + + + 12 + 0 + 2 + + + dxfoto.ru + + + + + CC-BY 3.0 + + + + + dxfoto + published + + + 55,54.678955N + 36,57.808914E + 2.2.0.0 + + + dxfoto|published + + + 0 + _MG_9604.CR2 + + + + \ No newline at end of file diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_1_formatted_canonical.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_1_formatted_canonical.xmp index aa1bf1d..9d36a12 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_1_formatted_canonical.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_1_formatted_canonical.xmp @@ -1,5 +1,5 @@ - + - + + + + + 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 + + + + + gz11eJxjYGBgkGAAgRNODGiAEV0AJ2iwh+CRxQcA5qIZBA== + 8 + 1 + 1 + + 0 + cacorrect + 32000000 + + + + + 12 + 0 + 2 + + + dxfoto.ru + + + + + CC-BY 3.0 + + + + + dxfoto + published + + + 55,54.678955N + 36,57.808914E + 2.2.0.0 + + + dxfoto|published + + + 0 + _MG_9604.CR2 + + + + \ No newline at end of file diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_1_roundtrip_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_1_roundtrip_compact.xmp new file mode 100644 index 0000000..170e8de --- /dev/null +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_1_roundtrip_compact.xmp @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + dxfoto.ru + + + + + CC-BY 3.0 + + + + + dxfoto + published + + + + + dxfoto|published + + + + + + \ No newline at end of file diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_20_formatted_canonical.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_20_formatted_canonical.xmp index f368068..1769d2c 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_20_formatted_canonical.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_20_formatted_canonical.xmp @@ -1,5 +1,5 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_31_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_31_formatted_compact.xmp index 1783e27..92c2e6d 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_31_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_31_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + - + - + - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_34_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_34_formatted_compact.xmp index 1783e27..92c2e6d 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_34_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_34_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + - + - + - + - + - + - + - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_39_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_39_formatted_compact.xmp index ad869ad..d1b358b 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_39_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_39_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + - + - + - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_41_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_41_formatted_compact.xmp index ad869ad..d1b358b 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_41_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_41_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_43_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_43_formatted_compact.xmp index 2414867..1350677 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_43_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_43_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_44_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_44_formatted_compact.xmp index 5bef245..1107621 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_44_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_44_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + - + - + - + - + - + - + - + - + diff --git a/src/commonTest/resources/com/ashampoo/xmp/sample_49_formatted_compact.xmp b/src/commonTest/resources/com/ashampoo/xmp/sample_49_formatted_compact.xmp index 1783e27..92c2e6d 100644 --- a/src/commonTest/resources/com/ashampoo/xmp/sample_49_formatted_compact.xmp +++ b/src/commonTest/resources/com/ashampoo/xmp/sample_49_formatted_compact.xmp @@ -1,5 +1,5 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +