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