BitMiracle.LibJpeg.SampleRow.SampleRow C# (CSharp) Method

SampleRow() public method

Creates a row from raw samples data.
public SampleRow ( byte row, int columnCount, byte bitsPerComponent, byte componentsPerSample ) : System
row byte Raw description of samples.
/// You can pass collection with more than sampleCount samples - only sampleCount samples /// will be parsed and all remaining bytes will be ignored.
columnCount int The number of samples in row.
bitsPerComponent byte The number of bits per component.
componentsPerSample byte The number of components per sample.
return System
        public SampleRow(byte[] row, int columnCount, byte bitsPerComponent, byte componentsPerSample)
        {
            if (row == null)
                throw new ArgumentNullException("row");

            if (row.Length == 0)
                throw new ArgumentException("row is empty");

            if (columnCount <= 0)
                throw new ArgumentOutOfRangeException("sampleCount");

            if (bitsPerComponent <= 0 || bitsPerComponent > 16)
                throw new ArgumentOutOfRangeException("bitsPerComponent");

            if (componentsPerSample <= 0 || componentsPerSample > 5) //1,2,3,4
                throw new ArgumentOutOfRangeException("componentsPerSample");

            this.componentsPerSample = componentsPerSample;
            this.m_bytes = row;
            this.columnCount = columnCount;
            using (BitStream bitStream = new BitStream(row))
            {
                //create long buffer for a single line                
                lineBuffer = new short[columnCount * componentsPerSample];
                int byteIndex = 0;
                for (int i = 0; i < columnCount; ++i)
                {
                    //each component
                    //eg. 1,2,3,4 
                    switch (componentsPerSample)
                    {
                        case 1:
                            lineBuffer[byteIndex] = (short)bitStream.Read(bitsPerComponent);
                            byteIndex++;
                            break;
                        case 2:
                            lineBuffer[byteIndex] = (short)bitStream.Read(bitsPerComponent);
                            lineBuffer[byteIndex + 1] = (short)bitStream.Read(bitsPerComponent);
                            byteIndex += 2;
                            break;
                        case 3:
                            lineBuffer[byteIndex] = (short)bitStream.Read(bitsPerComponent);
                            lineBuffer[byteIndex + 1] = (short)bitStream.Read(bitsPerComponent);
                            lineBuffer[byteIndex + 2] = (short)bitStream.Read(bitsPerComponent);
                            byteIndex += 3;
                            break;
                        case 4:
                            lineBuffer[byteIndex] = (short)bitStream.Read(bitsPerComponent);
                            lineBuffer[byteIndex + 1] = (short)bitStream.Read(bitsPerComponent);
                            lineBuffer[byteIndex + 2] = (short)bitStream.Read(bitsPerComponent);
                            lineBuffer[byteIndex + 4] = (short)bitStream.Read(bitsPerComponent);
                            byteIndex += 4;
                            break;
                        default:
                            throw new NotSupportedException();
                    }
                    //for (short i = 0; i < componentCount; ++i)
                    //{
                    //    //bitPerSample may >8 bits                
                    //    m_components[i] = (short)bitStream.Read(bitsPerComponent);
                    //}
                }
                //m_samples = new Sample[sampleCount];
                //for (int i = 0; i < sampleCount; ++i)
                //    m_samples[i] = new Sample(bitStream, bitsPerComponent, componentsPerSample);
            }
        }