65 int numLowBitsBias = (carry[2] < 3) ? 2 : 0;
67 numLowBits -= numLowBitsBias;
68 numLowBits = std::max(numLowBits, 2 + numLowBitsBias);
73 int sign = (b >> 14) * -1;
74 int low = (b >> 12) & 3;
75 int numLeadingZeros = numLZ[b & 4095];
79 if (numLeadingZeros != 12) [[likely]] {
81 highBits = numLeadingZeros;
84 int numHighBits = 15 - numLowBits;
91 carry[0] = (highBits << numLowBits) | bits.
getBitsNoFill(numLowBits);
92 int diff = (carry[0] ^ sign) + carry[1];
93 carry[1] = (diff * 3 + carry[1]) >> 5;
94 carry[2] = carry[0] > 16 ? 0 : carry[2] + 1;
96 return (diff * 4) | low;
104 [](
size_t i, [[maybe_unused]]
unsigned tableSize) {
112 decompressGroup(std::array<OlympusDifferenceDecoder, 2>& acarry,
133 auto getLeft = [&]() {
return out(row, col - 2); };
134 auto getUp = [&]() {
return out(row - 2, col); };
135 auto getLeftUp = [&]() {
return out(row - 2, col - 2); };
138 if (row < 2 && col < 2)
145 int left = getLeft();
147 int leftUp = getLeftUp();
149 int leftMinusNw = left - leftUp;
150 int upMinusNw = up - leftUp;
153 if ((std::signbit(leftMinusNw) != std::signbit(upMinusNw)) &&
154 (leftMinusNw != 0 && upMinusNw != 0)) {
155 if (std::abs(leftMinusNw) > 32 || std::abs(upMinusNw) > 32)
156 pred = left + upMinusNw;
158 pred = (left + up) >> 1;
160 pred = std::abs(leftMinusNw) > std::abs(upMinusNw) ? left : up;
168OlympusDecompressorImpl::decompressGroup(
169 std::array<OlympusDifferenceDecoder, 2>& acarry,
BitStreamerMSB& bits,
170 int row,
int group)
const {
173 for (
int c = 0; c != 2; ++c) {
174 const int col = (2 * group) + c;
175 OlympusDifferenceDecoder& carry = acarry[c];
177 int diff = carry.getDiff(bits);
178 int pred = getPred(out, row, col);
191 std::array<OlympusDifferenceDecoder, 2> acarry{numLZ, numLZ};
193 const int numGroups = out.
width() / 2;
197 decompressGroup(acarry, bits, row, group);
200 for (; group != numGroups; ++group) {
201 decompressGroup(acarry, bits, row, group);
205void OlympusDecompressorImpl::decompress(
ByteStream input)
const {
212 for (
int y = 0;
y < mRaw->
dim.
y;
y++)
213 decompressRow(bits,
y);