icc_codec_common.h (4304B)
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 #ifndef LIB_JXL_ICC_CODEC_COMMON_H_ 7 #define LIB_JXL_ICC_CODEC_COMMON_H_ 8 9 // Compressed representation of ICC profiles. 10 11 #include <array> 12 #include <cstddef> 13 #include <cstdint> 14 15 #include "lib/jxl/base/span.h" 16 #include "lib/jxl/base/status.h" 17 18 namespace jxl { 19 20 class PaddedBytes; 21 22 static constexpr size_t kICCHeaderSize = 128; 23 24 typedef std::array<uint8_t, 4> Tag; 25 26 static const Tag kAcspTag = {{'a', 'c', 's', 'p'}}; 27 static const Tag kBkptTag = {{'b', 'k', 'p', 't'}}; 28 static const Tag kBtrcTag = {{'b', 'T', 'R', 'C'}}; 29 static const Tag kBxyzTag = {{'b', 'X', 'Y', 'Z'}}; 30 static const Tag kChadTag = {{'c', 'h', 'a', 'd'}}; 31 static const Tag kChrmTag = {{'c', 'h', 'r', 'm'}}; 32 static const Tag kCprtTag = {{'c', 'p', 'r', 't'}}; 33 static const Tag kCurvTag = {{'c', 'u', 'r', 'v'}}; 34 static const Tag kDescTag = {{'d', 'e', 's', 'c'}}; 35 static const Tag kDmddTag = {{'d', 'm', 'd', 'd'}}; 36 static const Tag kDmndTag = {{'d', 'm', 'n', 'd'}}; 37 static const Tag kGbd_Tag = {{'g', 'b', 'd', ' '}}; 38 static const Tag kGtrcTag = {{'g', 'T', 'R', 'C'}}; 39 static const Tag kGxyzTag = {{'g', 'X', 'Y', 'Z'}}; 40 static const Tag kKtrcTag = {{'k', 'T', 'R', 'C'}}; 41 static const Tag kKxyzTag = {{'k', 'X', 'Y', 'Z'}}; 42 static const Tag kLumiTag = {{'l', 'u', 'm', 'i'}}; 43 static const Tag kMab_Tag = {{'m', 'A', 'B', ' '}}; 44 static const Tag kMba_Tag = {{'m', 'B', 'A', ' '}}; 45 static const Tag kMlucTag = {{'m', 'l', 'u', 'c'}}; 46 static const Tag kMntrTag = {{'m', 'n', 't', 'r'}}; 47 static const Tag kParaTag = {{'p', 'a', 'r', 'a'}}; 48 static const Tag kRgb_Tag = {{'R', 'G', 'B', ' '}}; 49 static const Tag kRtrcTag = {{'r', 'T', 'R', 'C'}}; 50 static const Tag kRxyzTag = {{'r', 'X', 'Y', 'Z'}}; 51 static const Tag kSf32Tag = {{'s', 'f', '3', '2'}}; 52 static const Tag kTextTag = {{'t', 'e', 'x', 't'}}; 53 static const Tag kVcgtTag = {{'v', 'c', 'g', 't'}}; 54 static const Tag kWtptTag = {{'w', 't', 'p', 't'}}; 55 static const Tag kXyz_Tag = {{'X', 'Y', 'Z', ' '}}; 56 57 // Tag names focused on RGB and GRAY monitor profiles 58 static constexpr size_t kNumTagStrings = 17; 59 static constexpr const Tag* kTagStrings[kNumTagStrings] = { 60 &kCprtTag, &kWtptTag, &kBkptTag, &kRxyzTag, &kGxyzTag, &kBxyzTag, 61 &kKxyzTag, &kRtrcTag, &kGtrcTag, &kBtrcTag, &kKtrcTag, &kChadTag, 62 &kDescTag, &kChrmTag, &kDmndTag, &kDmddTag, &kLumiTag}; 63 64 static constexpr size_t kCommandTagUnknown = 1; 65 static constexpr size_t kCommandTagTRC = 2; 66 static constexpr size_t kCommandTagXYZ = 3; 67 static constexpr size_t kCommandTagStringFirst = 4; 68 69 // Tag types focused on RGB and GRAY monitor profiles 70 static constexpr size_t kNumTypeStrings = 8; 71 static constexpr const Tag* kTypeStrings[kNumTypeStrings] = { 72 &kXyz_Tag, &kDescTag, &kTextTag, &kMlucTag, 73 &kParaTag, &kCurvTag, &kSf32Tag, &kGbd_Tag}; 74 75 static constexpr size_t kCommandInsert = 1; 76 static constexpr size_t kCommandShuffle2 = 2; 77 static constexpr size_t kCommandShuffle4 = 3; 78 static constexpr size_t kCommandPredict = 4; 79 static constexpr size_t kCommandXYZ = 10; 80 static constexpr size_t kCommandTypeStartFirst = 16; 81 82 static constexpr size_t kFlagBitOffset = 64; 83 static constexpr size_t kFlagBitSize = 128; 84 85 static constexpr size_t kNumICCContexts = 41; 86 87 uint32_t DecodeUint32(const uint8_t* data, size_t size, size_t pos); 88 void EncodeUint32(size_t pos, uint32_t value, PaddedBytes* data); 89 void AppendUint32(uint32_t value, PaddedBytes* data); 90 Tag DecodeKeyword(const uint8_t* data, size_t size, size_t pos); 91 void EncodeKeyword(const Tag& keyword, uint8_t* data, size_t size, size_t pos); 92 void AppendKeyword(const Tag& keyword, PaddedBytes* data); 93 94 // Checks if a + b > size, taking possible integer overflow into account. 95 Status CheckOutOfBounds(uint64_t a, uint64_t b, uint64_t size); 96 Status CheckIs32Bit(uint64_t v); 97 98 Span<const uint8_t> ICCInitialHeaderPrediction(); 99 void ICCPredictHeader(const uint8_t* icc, size_t size, uint8_t* header, 100 size_t pos); 101 uint8_t LinearPredictICCValue(const uint8_t* data, size_t start, size_t i, 102 size_t stride, size_t width, int order); 103 size_t ICCANSContext(size_t i, size_t b1, size_t b2); 104 105 } // namespace jxl 106 107 #endif // LIB_JXL_ICC_CODEC_COMMON_H_