private static VoiLutSequenceItem SerializeDataLut(IDataLut voiLut)
        {
            int inputLength = voiLut.Data.Length;

            int[] descriptor = new int[3];
            descriptor[0] = inputLength;
            if (descriptor[0] == 65536)
            {
                descriptor[0] = 0;
            }
            descriptor[1] = voiLut.FirstMappedPixelValue;
            descriptor[2] = 16;

            ushort[] data = new ushort[inputLength];
            unsafe
            {
                fixed(ushort *output = data)
                {
                    fixed(int *input = voiLut.Data)
                    {
                        for (int n = 0; n < inputLength; n++)
                        {
                            output[n] = (ushort)(input[n] & 0x0000FFFF);
                        }
                    }
                }
            }

            VoiLutSequenceItem lutseq = new VoiLutSequenceItem();

            lutseq.LutDescriptor  = descriptor;
            lutseq.LutData        = data;
            lutseq.LutExplanation = SR.LabelPresentationVoiDataLut;
            return(lutseq);
        }
        protected void SerializeSoftcopyVoiLut(SoftcopyVoiLutModuleIod module, DicomPresentationImageCollection <T> images)
        {
            List <SoftcopyVoiLutModuleIod.SoftcopyVoiLutSequenceItem> voiLutSequenceItems = new List <SoftcopyVoiLutModuleIod.SoftcopyVoiLutSequenceItem>();

            foreach (T image in images)
            {
                if (!image.VoiLutManager.Enabled)
                {
                    continue;
                }

                SoftcopyVoiLutModuleIod.SoftcopyVoiLutSequenceItem sequenceItem = new SoftcopyVoiLutModuleIod.SoftcopyVoiLutSequenceItem();
                sequenceItem.InitializeAttributes();
                sequenceItem.ReferencedImageSequence = new ImageSopInstanceReferenceMacro[] { CreateImageSopInstanceReference(image.Frame) };

                IVoiLut lut = image.VoiLutManager.VoiLut;
                if (lut is IDataLut)
                {
                    IDataLut voiLut = (IDataLut)lut;
                    sequenceItem.VoiLutSequence = new VoiLutSequenceItem[] { SerializeDataLut(voiLut) };
                }
                else if (lut is IVoiLutLinear)
                {
                    IVoiLutLinear voiLut = (IVoiLutLinear)lut;
                    sequenceItem.WindowWidth  = new double[] { voiLut.WindowWidth };
                    sequenceItem.WindowCenter = new double[] { voiLut.WindowCenter };
                    sequenceItem.WindowCenterWidthExplanation = new string[] { SR.LabelPresentationVoiLinearLut };
                    sequenceItem.VoiLutFunction = VoiLutFunction.Linear;                     // we don't support sigmoid
                }
                else
                {
                    // should never happen - all VOI LUT object should implement either interface
                    continue;
                }

                voiLutSequenceItems.Add(sequenceItem);
            }

            if (voiLutSequenceItems.Count > 0)
            {
                module.SoftcopyVoiLutSequence = voiLutSequenceItems.ToArray();
            }
        }