Example #1
0
 BitPumpPlain(ByteStream *s);
Example #2
0
        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);
            }
        }