void dng_camera_profile::ReadHueSatMap (dng_stream &stream, dng_hue_sat_map &hueSatMap, uint32 hues, uint32 sats, uint32 vals, bool skipSat0) { hueSatMap.SetDivisions (hues, sats, vals); for (uint32 val = 0; val < vals; val++) { for (uint32 hue = 0; hue < hues; hue++) { for (uint32 sat = skipSat0 ? 1 : 0; sat < sats; sat++) { dng_hue_sat_map::HSBModify modify; modify.fHueShift = stream.Get_real32 (); modify.fSatScale = stream.Get_real32 (); modify.fValScale = stream.Get_real32 (); hueSatMap.SetDelta (hue, sat, val, modify); } } } }
void dng_camera_profile::Parse (dng_stream &stream, dng_camera_profile_info &profileInfo) { SetUniqueCameraModelRestriction (profileInfo.fUniqueCameraModel.Get ()); if (profileInfo.fProfileName.NotEmpty ()) { SetName (profileInfo.fProfileName.Get ()); } SetCopyright (profileInfo.fProfileCopyright.Get ()); SetEmbedPolicy (profileInfo.fEmbedPolicy); SetCalibrationIlluminant1 (profileInfo.fCalibrationIlluminant1); SetColorMatrix1 (profileInfo.fColorMatrix1); if (profileInfo.fForwardMatrix1.NotEmpty ()) { SetForwardMatrix1 (profileInfo.fForwardMatrix1); } if (profileInfo.fReductionMatrix1.NotEmpty ()) { SetReductionMatrix1 (profileInfo.fReductionMatrix1); } if (profileInfo.fColorMatrix2.NotEmpty ()) { SetCalibrationIlluminant2 (profileInfo.fCalibrationIlluminant2); SetColorMatrix2 (profileInfo.fColorMatrix2); if (profileInfo.fForwardMatrix2.NotEmpty ()) { SetForwardMatrix2 (profileInfo.fForwardMatrix2); } if (profileInfo.fReductionMatrix2.NotEmpty ()) { SetReductionMatrix2 (profileInfo.fReductionMatrix2); } } SetProfileCalibrationSignature (profileInfo.fProfileCalibrationSignature.Get ()); if (profileInfo.fHueSatDeltas1Offset != 0 && profileInfo.fHueSatDeltas1Count != 0) { TempBigEndian setEndianness (stream, profileInfo.fBigEndian); stream.SetReadPosition (profileInfo.fHueSatDeltas1Offset); bool skipSat0 = (profileInfo.fHueSatDeltas1Count == profileInfo.fProfileHues * (profileInfo.fProfileSats - 1) * profileInfo.fProfileVals * 3); ReadHueSatMap (stream, fHueSatDeltas1, profileInfo.fProfileHues, profileInfo.fProfileSats, profileInfo.fProfileVals, skipSat0); } if (profileInfo.fHueSatDeltas2Offset != 0 && profileInfo.fHueSatDeltas2Count != 0) { TempBigEndian setEndianness (stream, profileInfo.fBigEndian); stream.SetReadPosition (profileInfo.fHueSatDeltas2Offset); bool skipSat0 = (profileInfo.fHueSatDeltas2Count == profileInfo.fProfileHues * (profileInfo.fProfileSats - 1) * profileInfo.fProfileVals * 3); ReadHueSatMap (stream, fHueSatDeltas2, profileInfo.fProfileHues, profileInfo.fProfileSats, profileInfo.fProfileVals, skipSat0); } if (profileInfo.fLookTableOffset != 0 && profileInfo.fLookTableCount != 0) { TempBigEndian setEndianness (stream, profileInfo.fBigEndian); stream.SetReadPosition (profileInfo.fLookTableOffset); bool skipSat0 = (profileInfo.fLookTableCount == profileInfo.fLookTableHues * (profileInfo.fLookTableSats - 1) * profileInfo.fLookTableVals * 3); ReadHueSatMap (stream, fLookTable, profileInfo.fLookTableHues, profileInfo.fLookTableSats, profileInfo.fLookTableVals, skipSat0); } if ((profileInfo.fToneCurveCount & 1) == 0) { TempBigEndian setEndianness (stream, profileInfo.fBigEndian); stream.SetReadPosition (profileInfo.fToneCurveOffset); uint32 points = profileInfo.fToneCurveCount / 2; fToneCurve.fCoord.resize (points); for (size_t i = 0; i < points; i++) { dng_point_real64 point; point.h = stream.Get_real32 (); point.v = stream.Get_real32 (); fToneCurve.fCoord [i] = point; } } }
dng_opcode_DeltaPerRow::dng_opcode_DeltaPerRow (dng_host &host, dng_stream &stream) : dng_inplace_opcode (dngOpcode_DeltaPerRow, stream, "DeltaPerRow") , fAreaSpec () , fTable () , fScale (1.0f) { uint32 dataSize = stream.Get_uint32 (); fAreaSpec.GetData (stream); uint32 deltas = (fAreaSpec.Area ().H () + fAreaSpec.RowPitch () - 1) / fAreaSpec.RowPitch (); if (deltas != stream.Get_uint32 ()) { ThrowBadFormat (); } if (dataSize != dng_area_spec::kDataSize + 4 + deltas * 4) { ThrowBadFormat (); } fTable.Reset (host.Allocate (deltas * sizeof (real32))); real32 *table = fTable->Buffer_real32 (); for (uint32 j = 0; j < deltas; j++) { table [j] = stream.Get_real32 (); } #if qDNGValidate if (gVerbose) { printf ("Count: %u\n", (unsigned) deltas); for (uint32 k = 0; k < deltas && k < gDumpLineLimit; k++) { printf (" Delta [%u] = %f\n", k, table [k]); } if (deltas > gDumpLineLimit) { printf (" ... %u deltas skipped\n", deltas - gDumpLineLimit); } } #endif }
dng_opcode_ScalePerColumn::dng_opcode_ScalePerColumn (dng_host &host, dng_stream &stream) : dng_inplace_opcode (dngOpcode_ScalePerColumn, stream, "ScalePerColumn") , fAreaSpec () , fTable () { uint32 dataSize = stream.Get_uint32 (); fAreaSpec.GetData (stream); uint32 scales = (fAreaSpec.Area ().W () + fAreaSpec.ColPitch () - 1) / fAreaSpec.ColPitch (); if (scales != stream.Get_uint32 ()) { ThrowBadFormat (); } if (dataSize != dng_area_spec::kDataSize + 4 + scales * 4) { ThrowBadFormat (); } fTable.Reset (host.Allocate (scales * sizeof (real32))); real32 *table = fTable->Buffer_real32 (); for (uint32 j = 0; j < scales; j++) { table [j] = stream.Get_real32 (); } #if qDNGValidate if (gVerbose) { printf ("Count: %u\n", (unsigned) scales); for (uint32 k = 0; k < scales && k < gDumpLineLimit; k++) { printf (" Scale [%u] = %f\n", k, table [k]); } if (scales > gDumpLineLimit) { printf (" ... %u deltas skipped\n", scales - gDumpLineLimit); } } #endif }