staticbool read_iso_gainmap_version(SkStream* s) { // Ensure minimum version is 0.
uint16_t minimum_version = 0; if (!read_u16_be(s, &minimum_version)) {
SkCodecPrintf("Failed to read ISO 21496-1 minimum version.\n"); returnfalse;
} if (minimum_version != 0) {
SkCodecPrintf("Unsupported ISO 21496-1 minimum version.\n"); returnfalse;
}
// Ensure writer version is present. No value is invalid.
uint16_t writer_version = 0; if (!read_u16_be(s, &writer_version)) {
SkCodecPrintf("Failed to read ISO 21496-1 version.\n"); returnfalse;
}
returntrue;
}
staticbool read_iso_gainmap_info(SkStream* s, SkGainmapInfo& info) { if (!read_iso_gainmap_version(s)) {
SkCodecPrintf("Failed to read ISO 21496-1 version.\n"); returnfalse;
}
int channelCount = isMultiChannel ? 3 : 1; for (int i = 0; i < channelCount; ++i) { if (!read_rational_be(s, gainMapMin + i)) {
SkCodecPrintf("Failed to read ISO 21496-1 gainmap minimum.\n"); returnfalse;
} if (!read_rational_be(s, gainMapMax + i)) {
SkCodecPrintf("Failed to read ISO 21496-1 gainmap maximum.\n"); returnfalse;
} if (!read_positive_rational_be(s, gamma + i)) {
SkCodecPrintf("Failed to read ISO 21496-1 gamma.\n"); returnfalse;
} if (!read_rational_be(s, baseOffset + i)) {
SkCodecPrintf("Failed to read ISO 21496-1 base offset.\n"); returnfalse;
} if (!read_rational_be(s, altrOffset + i)) {
SkCodecPrintf("Failed to read ISO 21496-1 altr offset.\n"); returnfalse;
}
}
info = SkGainmapInfo(); if (!useBaseColourSpace) {
info.fGainmapMathColorSpace = SkColorSpace::MakeSRGB();
} if (baseHdrHeadroom < altrHdrHeadroom) {
info.fBaseImageType = SkGainmapInfo::BaseImageType::kSDR;
info.fDisplayRatioSdr = std::exp2(baseHdrHeadroom);
info.fDisplayRatioHdr = std::exp2(altrHdrHeadroom);
} else {
info.fBaseImageType = SkGainmapInfo::BaseImageType::kHDR;
info.fDisplayRatioHdr = std::exp2(baseHdrHeadroom);
info.fDisplayRatioSdr = std::exp2(altrHdrHeadroom);
} for (int i = 0; i < 3; ++i) { int j = i >= channelCount ? 0 : i;
info.fGainmapRatioMin[i] = std::exp2(gainMapMin[j]);
info.fGainmapRatioMax[i] = std::exp2(gainMapMax[j]);
info.fGainmapGamma[i] = 1.f / gamma[j]; switch (info.fBaseImageType) { case SkGainmapInfo::BaseImageType::kSDR:
info.fEpsilonSdr[i] = baseOffset[j];
info.fEpsilonHdr[i] = altrOffset[j]; break; case SkGainmapInfo::BaseImageType::kHDR:
info.fEpsilonHdr[i] = baseOffset[j];
info.fEpsilonSdr[i] = altrOffset[j]; break;
}
} returntrue;
}
bool SkGainmapInfo::isUltraHDRv1Compatible() const { // UltraHDR v1 supports having the base image be HDR in theory, but it is largely // untested. if (fBaseImageType == BaseImageType::kHDR) { returnfalse;
} // UltraHDR v1 doesn't support a non-base gainmap math color space. if (fGainmapMathColorSpace) { returnfalse;
} returntrue;
}
bool SkGainmapInfo::ParseVersion(const SkData* data) { if (!data) { returnfalse;
} auto s = SkMemoryStream::MakeDirect(data->data(), data->size()); return read_iso_gainmap_version(s.get());
}
bool SkGainmapInfo::Parse(const SkData* data, SkGainmapInfo& info) { if (!data) { returnfalse;
} auto s = SkMemoryStream::MakeDirect(data->data(), data->size()); return read_iso_gainmap_info(s.get(), info);
}
sk_sp<SkData> SkGainmapInfo::SerializeVersion() {
SkDynamicMemoryWStream s;
SkWStreamWriteU16BE(&s, 0); // Minimum reader version
SkWStreamWriteU16BE(&s, 0); // Writer version return s.detachAsData();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.