/* * 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 #include DEF_TEST(SkXmp_invalidXml, r) { // Invalid truncated xml. const char xmpData[] = R"( 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"( 1.0 3 4 )"; sk_sp 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"( 3 4 )"; sk_sp 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"( )"; sk_sp 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"( 3 4 5 1.2 0.2 0.3 0.4 )"; sk_sp 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"( image/jpeg Primary )"; sk_sp 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"( image/jpeg Primary GainMap image/jpeg 49035 )"; sk_sp 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