compressed_icc.cc (2199B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 #include <jxl/compressed_icc.h> 7 8 #include "lib/jxl/base/span.h" 9 #include "lib/jxl/enc_aux_out.h" 10 #include "lib/jxl/enc_icc_codec.h" 11 #include "lib/jxl/icc_codec.h" 12 13 JXL_BOOL JxlICCProfileEncode(const JxlMemoryManager* memory_manager, 14 const uint8_t* icc, size_t icc_size, 15 uint8_t** compressed_icc, 16 size_t* compressed_icc_size) { 17 JxlMemoryManager local_memory_manager; 18 if (!jxl::MemoryManagerInit(&local_memory_manager, memory_manager)) { 19 return JXL_FALSE; 20 } 21 jxl::BitWriter writer(&local_memory_manager); 22 JXL_RETURN_IF_ERROR(jxl::WriteICC(jxl::Span<const uint8_t>(icc, icc_size), 23 &writer, jxl::LayerType::Header, nullptr)); 24 writer.ZeroPadToByte(); 25 jxl::Bytes bytes = writer.GetSpan(); 26 *compressed_icc_size = bytes.size(); 27 *compressed_icc = static_cast<uint8_t*>( 28 jxl::MemoryManagerAlloc(&local_memory_manager, *compressed_icc_size)); 29 memcpy(*compressed_icc, bytes.data(), bytes.size()); 30 return JXL_TRUE; 31 } 32 33 JXL_BOOL JxlICCProfileDecode(const JxlMemoryManager* memory_manager, 34 const uint8_t* compressed_icc, 35 size_t compressed_icc_size, uint8_t** icc, 36 size_t* icc_size) { 37 JxlMemoryManager local_memory_manager; 38 if (!jxl::MemoryManagerInit(&local_memory_manager, memory_manager)) { 39 return JXL_FALSE; 40 } 41 jxl::ICCReader icc_reader(&local_memory_manager); 42 jxl::PaddedBytes decompressed(&local_memory_manager); 43 jxl::BitReader bit_reader( 44 jxl::Span<const uint8_t>(compressed_icc, compressed_icc_size)); 45 JXL_RETURN_IF_ERROR(icc_reader.Init(&bit_reader)); 46 JXL_RETURN_IF_ERROR(icc_reader.Process(&bit_reader, &decompressed)); 47 JXL_RETURN_IF_ERROR(bit_reader.Close()); 48 *icc_size = decompressed.size(); 49 *icc = static_cast<uint8_t*>( 50 jxl::MemoryManagerAlloc(&local_memory_manager, *icc_size)); 51 memcpy(*icc, decompressed.data(), *icc_size); 52 return JXL_TRUE; 53 }