/// ************************************************************************** /// /// $Id: MonochromeTransformTosRGB.java,v 1.1 2002/07/25 14:56:50 grosbois Exp $ /// /// Copyright Eastman Kodak Company, 343 State Street, Rochester, NY 14650 /// $Date $ /// *************************************************************************** /// using System; using ColorSpace = CSJ2K.Color.ColorSpace; using ICCProfile = CSJ2K.Icc.ICCProfile; using RestrictedICCProfile = CSJ2K.Icc.RestrictedICCProfile; using DataBlkInt = CSJ2K.j2k.image.DataBlkInt; using DataBlkFloat = CSJ2K.j2k.image.DataBlkFloat; namespace CSJ2K.Icc.Lut { /// /// This class constructs a LookUpTableFP from a RestrictedICCProfile. /// The values in this table are used to calculate a second lookup table (simply a short []). /// table. When this transform is applied to an input DataBlk, an output data block is /// constructed by using the input samples as indices into the lookup table, whose values /// are used to populate the output DataBlk. /// /// /// /// /// /// /// 1.0 /// /// Bruce A. Kern /// public class MonochromeTransformTosRGB { //UPGRADE_NOTE: Final was removed from the declaration of 'eol '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" private static readonly System.String eol = System.Environment.NewLine; /// Transform parameter. public const double ksRGBShadowCutoff = 0.0031308; /// Transform parameter. public const double ksRGBShadowSlope = 12.92; /// Transform parameter. //UPGRADE_NOTE: Final was removed from the declaration of 'ksRGB8ShadowSlope '. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'" public static readonly double ksRGB8ShadowSlope = (255 * ksRGBShadowSlope); /// Transform parameter. public const double ksRGBExponent = (1.0 / 2.4); /// Transform parameter. public const double ksRGB8ScaleAfterExp = 269.025; /// Transform parameter. public const double ksRGB8ReduceAfterExp = 14.025; private short[] lut = null; private int dwInputMaxValue = 0; private LookUpTableFP fLut = null; /// String representation of class /// suitable representation for class /// public override System.String ToString() { System.Text.StringBuilder rep = new System.Text.StringBuilder("[MonochromeTransformTosRGB "); System.Text.StringBuilder body = new System.Text.StringBuilder(" "); // Print the parameters: body.Append(eol).Append("ksRGBShadowSlope= ").Append(System.Convert.ToString(ksRGBShadowSlope)); body.Append(eol).Append("ksRGBShadowCutoff= ").Append(System.Convert.ToString(ksRGBShadowCutoff)); body.Append(eol).Append("ksRGBShadowSlope= ").Append(System.Convert.ToString(ksRGBShadowSlope)); body.Append(eol).Append("ksRGB8ShadowSlope= ").Append(System.Convert.ToString(ksRGB8ShadowSlope)); body.Append(eol).Append("ksRGBExponent= ").Append(System.Convert.ToString(ksRGBExponent)); body.Append(eol).Append("ksRGB8ScaleAfterExp= ").Append(System.Convert.ToString(ksRGB8ScaleAfterExp)); body.Append(eol).Append("ksRGB8ReduceAfterExp= ").Append(System.Convert.ToString((ksRGB8ReduceAfterExp))); body.Append(eol).Append("dwInputMaxValue= ").Append(System.Convert.ToString(dwInputMaxValue)); // Print the LinearSRGBtoSRGB lut. body.Append(eol).Append("[lut = [short[" + lut.Length + "]]]"); // Print the FP luts. //UPGRADE_TODO: The equivalent in .NET for method 'java.lang.Object.toString' may return a different value. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1043'" body.Append(eol).Append("fLut= " + fLut.ToString()); rep.Append(ColorSpace.indent(" ", body)); return rep.Append("]").ToString(); } /// Construct the lut from the RestrictedICCProfile. /// /// /// input RestrictedICCProfile /// /// size of the output lut. /// /// value used to shift samples to positive /// public MonochromeTransformTosRGB(RestrictedICCProfile ricc, int dwInputMaxValue, int dwInputShiftValue) { if (ricc.Type != RestrictedICCProfile.kMonochromeInput) throw new System.ArgumentException("MonochromeTransformTosRGB: wrong type ICCProfile supplied"); this.dwInputMaxValue = dwInputMaxValue; lut = new short[dwInputMaxValue + 1]; fLut = LookUpTableFP.createInstance(ricc.trc[ICCProfile.GRAY], dwInputMaxValue + 1); // First calculate the value for the shadow region int i; for (i = 0; ((i <= dwInputMaxValue) && (fLut.lut[i] <= ksRGBShadowCutoff)); i++) { //UPGRADE_WARNING: Data types in Visual C# might be different. Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'" lut[i] = (short) (System.Math.Floor(ksRGB8ShadowSlope * (double) fLut.lut[i] + 0.5) - dwInputShiftValue); } // Now calculate the rest for (; i <= dwInputMaxValue; i++) { //UPGRADE_WARNING: Data types in Visual C# might be different. Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'" lut[i] = (short) (System.Math.Floor(ksRGB8ScaleAfterExp * System.Math.Pow((double) fLut.lut[i], ksRGBExponent) - ksRGB8ReduceAfterExp + 0.5) - dwInputShiftValue); } } /// Populate the output block by looking up the values in the lut, using the input /// as lut indices. /// /// input samples /// /// output samples. /// /// /// public virtual void apply(DataBlkInt inb, DataBlkInt outb) { int i, j, o; // x, y removed int[] in_Renamed = (int[]) inb.Data; int[] out_Renamed = (int[]) outb.Data; if (out_Renamed == null || out_Renamed.Length < in_Renamed.Length) { out_Renamed = new int[in_Renamed.Length]; outb.Data = out_Renamed; } outb.uly = inb.uly; outb.ulx = inb.ulx; outb.h = inb.h; outb.w = inb.w; outb.offset = inb.offset; outb.scanw = inb.scanw; o = inb.offset; for (i = 0; i < inb.h * inb.w; ++i) { j = in_Renamed[i]; if (j < 0) j = 0; else if (j > dwInputMaxValue) j = dwInputMaxValue; out_Renamed[i] = lut[j]; } } /// Populate the output block by looking up the values in the lut, using the input /// as lut indices. /// /// input samples /// /// output samples. /// /// /// public virtual void apply(DataBlkFloat inb, DataBlkFloat outb) { int i, j, o; // x, y removed float[] in_Renamed = (float[]) inb.Data; float[] out_Renamed = (float[]) outb.Data; if (out_Renamed == null || out_Renamed.Length < in_Renamed.Length) { out_Renamed = new float[in_Renamed.Length]; outb.Data = out_Renamed; outb.uly = inb.uly; outb.ulx = inb.ulx; outb.h = inb.h; outb.w = inb.w; outb.offset = inb.offset; outb.scanw = inb.scanw; } o = inb.offset; for (i = 0; i < inb.h * inb.w; ++i) { //UPGRADE_WARNING: Data types in Visual C# might be different. Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'" j = (int) in_Renamed[i]; if (j < 0) j = 0; else if (j > dwInputMaxValue) j = dwInputMaxValue; out_Renamed[i] = lut[j]; } } /* end class MonochromeTransformTosRGB */ } }