//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; }
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; } } }