blob: e5e0ed032c6c326a3beb3e1a5217bcd2e97fb291 [file] [log] [blame]
/*
* Copyright 2023 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkTypes.h"
#if defined(SK_XML)
#include "include/core/SkColor.h"
#include "include/core/SkData.h"
#include "include/core/SkRefCnt.h"
#include "include/private/SkGainmapInfo.h"
#include "include/private/SkXmp.h"
#include "tests/Test.h"
#include <cstddef>
#include <memory>
DEF_TEST(SkXmp_invalidXml, r) {
// Invalid truncated xml.
const char xmpData[] = R"(
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 6.0.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:)";
sk_sp<SkData> app1Param = SkData::MakeWithoutCopy(xmpData, sizeof(xmpData) - 1);
auto xmp = SkXmp::Make(app1Param);
REPORTER_ASSERT(r, xmp == nullptr);
}
DEF_TEST(SkXmp_xmpHdrgmAsFieldValue, r) {
// Expose HDRM values as fields. Also place the HDRGM namespace in the rdf:RDF node.
const char xmpData[] = R"(
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 6.0.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:hdrgm="http://ns.adobe.com/hdr-gain-map/1.0/">
<rdf:Description rdf:about="">
<hdrgm:Version>1.0</hdrgm:Version>
<hdrgm:GainMapMax>3</hdrgm:GainMapMax>
<hdrgm:HDRCapacityMax>4</hdrgm:HDRCapacityMax>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>)";
sk_sp<SkData> app1Param = SkData::MakeWithoutCopy(xmpData, sizeof(xmpData) - 1);
auto xmp = SkXmp::Make(app1Param);
REPORTER_ASSERT(r, xmp);
SkGainmapInfo info;
REPORTER_ASSERT(r, xmp->getGainmapInfoHDRGM(&info));
REPORTER_ASSERT(r, info.fGainmapRatioMax.fR == 8.f);
REPORTER_ASSERT(r, info.fDisplayRatioHdr == 16.f);
}
DEF_TEST(SkXmp_xmpHdrgmRequiresVersion, r) {
// Same as the above, except with Version being absent.
const char xmpData[] = R"(
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 6.0.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:hdrgm="http://ns.adobe.com/hdr-gain-map/1.0/">
<rdf:Description rdf:about="">
<hdrgm:GainMapMax>3</hdrgm:GainMapMax>
<hdrgm:HDRCapacityMax>4</hdrgm:HDRCapacityMax>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>)";
sk_sp<SkData> app1Param = SkData::MakeWithoutCopy(xmpData, sizeof(xmpData) - 1);
auto xmp = SkXmp::Make(app1Param);
REPORTER_ASSERT(r, xmp);
SkGainmapInfo info;
REPORTER_ASSERT(r, !xmp->getGainmapInfoHDRGM(&info));
}
DEF_TEST(SkXmp_xmpHdrgmAsDescriptionPropertyAttributes, r) {
// Expose HDRGM values as attributes on an rdf:Description node.
const char xmpData[] = R"(
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 6.0.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:hdrgm="http://ns.adobe.com/hdr-gain-map/1.0/"
hdrgm:Version="1.0"
hdrgm:GainMapMax="3"
hdrgm:HDRCapacityMax="4"/>
</rdf:RDF>
</x:xmpmeta>)";
sk_sp<SkData> app1Param = SkData::MakeWithoutCopy(xmpData, sizeof(xmpData) - 1);
auto xmp = SkXmp::Make(app1Param);
REPORTER_ASSERT(r, xmp);
SkGainmapInfo info;
REPORTER_ASSERT(r, xmp->getGainmapInfoHDRGM(&info));
REPORTER_ASSERT(r, info.fGainmapRatioMax.fR == 8.f);
REPORTER_ASSERT(r, info.fDisplayRatioHdr == 16.f);
}
// Test mixed list and non-list entries.
DEF_TEST(SkXmp_xmpHdrgmList, r) {
const char xmpData[] = R"(
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 6.0.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:hdrgm="http://ns.adobe.com/hdr-gain-map/1.0/">
<rdf:Description rdf:about=""
hdrgm:Version="1.0"
hdrgm:GainMapMin="2.0"
hdrgm:OffsetSDR="0.1">
<hdrgm:GainMapMax>
<rdf:Seq>
<rdf:li>3</rdf:li>
<rdf:li>4</rdf:li>
<rdf:li>5</rdf:li>
</rdf:Seq>
</hdrgm:GainMapMax>
<hdrgm:Gamma>
1.2
</hdrgm:Gamma>
<hdrgm:OffsetHDR>
<rdf:Seq>
<rdf:li>
0.2
</rdf:li>
<rdf:li>
0.3
</rdf:li>
<rdf:li>
0.4
</rdf:li>
</rdf:Seq>
</hdrgm:OffsetHDR>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>)";
sk_sp<SkData> app1Param = SkData::MakeWithoutCopy(xmpData, sizeof(xmpData) - 1);
auto xmp = SkXmp::Make(app1Param);
REPORTER_ASSERT(r, xmp);
SkGainmapInfo info;
REPORTER_ASSERT(r, xmp->getGainmapInfoHDRGM(&info));
REPORTER_ASSERT(r, info.fGainmapRatioMin.fR == 4.f);
REPORTER_ASSERT(r, info.fGainmapRatioMin.fG == 4.f);
REPORTER_ASSERT(r, info.fGainmapRatioMin.fB == 4.f);
REPORTER_ASSERT(r, info.fGainmapRatioMax.fR == 8.f);
REPORTER_ASSERT(r, info.fGainmapRatioMax.fG == 16.f);
REPORTER_ASSERT(r, info.fGainmapRatioMax.fB == 32.f);
REPORTER_ASSERT(r, info.fGainmapGamma.fR == 1.f/1.2f);
REPORTER_ASSERT(r, info.fGainmapGamma.fG == 1.f/1.2f);
REPORTER_ASSERT(r, info.fGainmapGamma.fB == 1.f/1.2f);
REPORTER_ASSERT(r, info.fEpsilonSdr.fR == 0.1f);
REPORTER_ASSERT(r, info.fEpsilonSdr.fG == 0.1f);
REPORTER_ASSERT(r, info.fEpsilonSdr.fB == 0.1f);
REPORTER_ASSERT(r, info.fEpsilonHdr.fR == 0.2f);
REPORTER_ASSERT(r, info.fEpsilonHdr.fG == 0.3f);
REPORTER_ASSERT(r, info.fEpsilonHdr.fB == 0.4f);
}
DEF_TEST(SkXmp_xmpContainerTypedNode, r) {
// Container and Item using a node of type Container:Item.
const char xmpData[] = R"(
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.5.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:Container="http://ns.google.com/photos/1.0/container/"
xmlns:Item="http://ns.google.com/photos/1.0/container/item/">
<Container:Directory>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<Container:Item>
<Item:Mime>image/jpeg</Item:Mime>
<Item:Semantic>Primary</Item:Semantic>
</Container:Item>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<Container:Item
Item:Semantic="GainMap"
Item:Mime="image/jpeg"
Item:Length="49035"/>
</rdf:li>
</rdf:Seq>
</Container:Directory>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>)";
sk_sp<SkData> app1Param = SkData::MakeWithoutCopy(xmpData, sizeof(xmpData) - 1);
auto xmp = SkXmp::Make(app1Param);
REPORTER_ASSERT(r, xmp);
size_t offset = 999;
size_t size = 999;
REPORTER_ASSERT(r, xmp->getContainerGainmapLocation(&offset, &size));
REPORTER_ASSERT(r, size == 49035);
}
DEF_TEST(SkXmp_xmpContainerTypedNodeRdfEquivalent, r) {
// Container and Item using rdf:value and rdf:type pairs.
const char xmpData[] = R"(
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.5.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:Container="http://ns.google.com/photos/1.0/container/"
xmlns:Item="http://ns.google.com/photos/1.0/container/item/">
<Container:Directory>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<rdf:value rdf:parseType="Resource">
<Item:Mime>image/jpeg</Item:Mime>
<Item:Semantic>Primary</Item:Semantic>
</rdf:value>
<rdf:type rdf:resource="Item"/>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<rdf:value rdf:parseType="Resource">
<Item:Semantic>GainMap</Item:Semantic>
<Item:Mime>image/jpeg</Item:Mime>
<Item:Length>49035</Item:Length>
</rdf:value>
<rdf:type rdf:resource="Item"/>
</rdf:li>
</rdf:Seq>
</Container:Directory>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>)";
sk_sp<SkData> app1Param = SkData::MakeWithoutCopy(xmpData, sizeof(xmpData) - 1);
auto xmp = SkXmp::Make(app1Param);
REPORTER_ASSERT(r, xmp);
size_t offset = 999;
size_t size = 999;
REPORTER_ASSERT(r, xmp->getContainerGainmapLocation(&offset, &size));
REPORTER_ASSERT(r, size == 49035);
}
#endif // SK_XML