BitPumpPlain(ByteStream *s);
void DecompressNikon(ByteStream* metadata, UInt32 w, UInt32 h, UInt32 bitsPS, UInt32 offset, UInt32 size) { UInt32 v0 = metadata.getByte(); UInt32 v1 = metadata.getByte(); UInt32 huffSelect = 0; UInt32 split = 0; int[] pUp1 = new int[2]; int[] pUp2 = new int[2]; mUseBigtable = true; _RPT2(0, "Nef version v0:%u, v1:%u\n", v0, v1); if (v0 == 73 || v1 == 88) metadata.skipBytes(2110); if (v0 == 70) huffSelect = 2; if (bitsPS == 14) huffSelect += 3; pUp1[0] = metadata.getShort(); pUp1[1] = metadata.getShort(); pUp2[0] = metadata.getShort(); pUp2[1] = metadata.getShort(); int _max = 1 << bitsPS & 0x7fff; UInt32 step = 0; UInt32 csize = metadata.getShort(); if (csize > 1) step = _max / (csize - 1); if (v0 == 68 && v1 == 32 && step > 0) { for (UInt32 i = 0; i < csize; i++) curve[i * step] = metadata.getShort(); for (int i = 0; i < _max; i++) curve[i] = (curve[i - i % step] * (step - i % step) + curve[i - i % step + step] * (i % step)) / step; metadata.setAbsoluteOffset(562); split = metadata.getShort(); } else if (v0 != 70 && csize <= 0x4001) { for (UInt32 i = 0; i < csize; i++) { curve[i] = metadata.getShort(); } _max = csize; } initTable(huffSelect); mRaw.whitePoint = curve[_max - 1]; mRaw.blackLevel = curve[0]; if (!uncorrectedRawValues) { mRaw.setTable(curve, _max, true); } UInt32 x, y; BitPumpMSB bits = new BitPumpMSB(mFile, offset, size); byte* draw = mRaw.getData(); UInt16* dest; UInt32 pitch = mRaw.pitch; int pLeft1 = 0; int pLeft2 = 0; UInt32 cw = w / 2; UInt32 random = bits.peekBits(24); //allow gcc to devirtualize the calls below RawImageDataU16[] rawdata = mRaw.get(); for (y = 0; y < h; y++) { if (split && y == split) { initTable(huffSelect + 1); } dest = (UInt16*)&draw[y * pitch]; // Adjust destination pUp1[y & 1] += HuffDecodeNikon(bits); pUp2[y & 1] += HuffDecodeNikon(bits); pLeft1 = pUp1[y & 1]; pLeft2 = pUp2[y & 1]; rawdata.setWithLookUp(clampbits(pLeft1, 15), (byte8*)dest++, &random); rawdata.setWithLookUp(clampbits(pLeft2, 15), (byte8*)dest++, &random); for (x = 1; x < cw; x++) { bits.checkPos(); pLeft1 += HuffDecodeNikon(bits); pLeft2 += HuffDecodeNikon(bits); rawdata.setWithLookUp(clampbits(pLeft1, 15), (byte8*)dest++, &random); rawdata.setWithLookUp(clampbits(pLeft2, 15), (byte8*)dest++, &random); } } if (uncorrectedRawValues) { mRaw.setTable(curve, _max, false); } else { mRaw.setTable(null); } }