Exemple #1
0
        //double[] coefficient = new double[9];
        //UInt16[] lookup = new UInt16[65536];

        public OpcodeGainMap(TiffBinaryReaderBigEndian parameters, UInt32 param_max_bytes, ref int bytes_used, uint offset)
        {
            if (param_max_bytes < 36)
            {
                throw new RawDecoderException("Not enough data to read parameters, only " + param_max_bytes + " bytes left.");
            }
            uint h1 = parameters.ReadUInt32();
            uint w1 = parameters.ReadUInt32();
            uint h2 = parameters.ReadUInt32();
            uint w2 = parameters.ReadUInt32();

            aoi.SetAbsolute(w1, h1, w2, h2);
            firstPlane = parameters.ReadUInt32();
            planes     = parameters.ReadUInt32();
            rowPitch   = parameters.ReadUInt32();
            colPitch   = parameters.ReadUInt32();
            if (planes == 0)
            {
                throw new RawDecoderException("Zero planes");
            }
            if (rowPitch == 0 || colPitch == 0)
            {
                throw new RawDecoderException("Invalid Pitch");
            }

            mapPointsV  = parameters.ReadUInt32();
            mapPointsH  = parameters.ReadUInt32();
            mapSpacingV = parameters.ReadDouble() * h2;
            mapSpacingH = parameters.ReadDouble() * w2;
            mapOriginV  = parameters.ReadDouble();
            mapOriginH  = parameters.ReadDouble();
            mapPlanes   = parameters.ReadUInt32();
            gain        = new double[mapPointsV, mapPointsH, mapPlanes];
            bytes_used  = 76;
            if (param_max_bytes < 36 + (mapPointsV * mapPointsH * mapPlanes * 8))
            {
                throw new RawDecoderException("Not enough data to read parameters, only " + param_max_bytes + " bytes left.");
            }
            for (UInt64 i = 0; i < mapPointsV; i++)
            {
                for (UInt64 j = 0; j < mapPointsH; j++)
                {
                    for (UInt64 k = 0; k < mapPlanes; k++)
                    {
                        gain[i, j, k] = parameters.ReadSingle();
                    }
                }
            }
            bytes_used += (int)(8 * mapPointsV * mapPointsH * mapPlanes);
            flags       = (int)Flags.MultiThreaded | (int)Flags.PureLookup;
        }
Exemple #2
0
        unsafe public DngOpcodes(Tag entry)
        {
            using (TiffBinaryReaderBigEndian reader = new TiffBinaryReaderBigEndian(entry.GetByteArray()))
            {
                UInt32 entry_size = entry.dataCount;

                if (entry_size < 20)
                {
                    throw new RawDecoderException("Not enough bytes to read a single opcode");
                }

                UInt32 opcode_count = reader.ReadUInt32();
                uint   bytes_used   = 4;
                for (UInt32 i = 0; i < opcode_count; i++)
                {
                    //if ((int)entry_size - bytes_used < 16)
                    // throw new RawDecoderException("DngOpcodes: Not enough bytes to read a new opcode");
                    reader.BaseStream.Position = bytes_used;
                    UInt32 code = reader.ReadUInt32();
                    reader.ReadUInt32();
                    reader.ReadUInt32();
                    UInt32 expected_size = reader.ReadUInt32();
                    bytes_used += 16;
                    int opcode_used = 0;
                    switch (code)
                    {
                    /*
                     * case 4:
                     *  mOpcodes.Add(new OpcodeFixBadPixelsConstant(&data[bytes_used], entry_size - bytes_used, &opcode_used));
                     *  break;
                     * case 5:
                     *  mOpcodes.Add(new OpcodeFixBadPixelsList(&data[bytes_used], entry_size - bytes_used, &opcode_used));
                     *  break;*/
                    case 6:
                        opcodes.Add(new OpcodeTrimBounds(reader, entry_size - bytes_used, ref opcode_used));
                        break;

                    case 7:
                        opcodes.Add(new OpcodeMapTable(reader, entry_size - bytes_used, ref opcode_used, bytes_used));
                        break;

                    case 8:
                        opcodes.Add(new OpcodeMapPolynomial(reader, entry_size - bytes_used, ref opcode_used, bytes_used));
                        break;

                    case 9:
                        opcodes.Add(new OpcodeGainMap(reader, entry_size - bytes_used, ref opcode_used, bytes_used));
                        break;

                    /*
                     * case 10:
                     * mOpcodes.Add(new OpcodeDeltaPerRow(&data[bytes_used], entry_size - bytes_used, &opcode_used));
                     * break;
                     * case 11:
                     * mOpcodes.Add(new OpcodeDeltaPerCol(&data[bytes_used], entry_size - bytes_used, &opcode_used));
                     * break;
                     * case 12:
                     * mOpcodes.Add(new OpcodeScalePerRow(&data[bytes_used], entry_size - bytes_used, &opcode_used));
                     * break;
                     * case 13:
                     * mOpcodes.Add(new OpcodeScalePerCol(&data[bytes_used], entry_size - bytes_used, &opcode_used));
                     * break;*/
                    default:
                        // Throw Error if not marked as optional

                        /*if ((flags & 1) == 0)
                         *  throw new RawDecoderException("DngOpcodes: Unsupported Opcode: " + code);*/
                        break;
                    }
                    //if (opcode_used != expected_size)
                    //throw new RawDecoderException("DngOpcodes: Inconsistent length of opcode");
                    bytes_used += (uint)opcode_used;
                }
            }
        }