| /* | |
| * Copyright 2024 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "src/codec/SkPngCompositeChunkReader.h" | |
| #include <cstring> | |
| class SkData; | |
| bool SkPngCompositeChunkReader::readChunk(const char tag[], const void* data, size_t length) { | |
| if (fChunkReader && !fChunkReader->readChunk(tag, data, length)) { | |
| // Only fail if the client's chunk reader failed; If we don't have a | |
| // chunk reader we would still need to grab gainmap chunks | |
| return false; | |
| } | |
| // If we found a chunk but there's no data, then just skip it! | |
| if (data == nullptr || length == 0) { | |
| return true; | |
| } | |
| if (strcmp("gmAP", tag) == 0) { | |
| SkMemoryStream stream(data, length); | |
| sk_sp<const SkData> streamData = stream.getData(); | |
| SkGainmapInfo info; | |
| if (SkGainmapInfo::Parse(streamData.get(), info)) { | |
| fGainmapInfo.emplace(std::move(info)); | |
| } | |
| } else if (strcmp("gdAT", tag) == 0) { | |
| fGainmapStream = SkMemoryStream::MakeCopy(data, length); | |
| } else if (strcmp("cLLI", tag) == 0) { | |
| auto sk_data = SkData::MakeWithoutCopy(data, length); | |
| skhdr::ContentLightLevelInformation clli; | |
| if (clli.parsePngChunk(sk_data.get())) { | |
| fHdrMetadata.setContentLightLevelInformation(clli); | |
| } | |
| } else if (strcmp("mDCV", tag) == 0) { | |
| auto sk_data = SkData::MakeWithoutCopy(data, length); | |
| skhdr::MasteringDisplayColorVolume mdcv; | |
| if (mdcv.parse(sk_data.get())) { | |
| fHdrMetadata.setMasteringDisplayColorVolume(mdcv); | |
| } | |
| } | |
| return true; | |
| } |