public void ReadFrom( BinaryReader reader ) { ReadHeader( reader ); colormap = new Colormap( reader ); resources = new Resources( reader ); layers = new Layers( this, reader ); CompressionMethod compression = (CompressionMethod)IPAddress.NetworkToHostOrder( reader.ReadInt16() ); byte[][] data = new byte[3][]; switch ( compression ) { case CompressionMethod.Raw: // read each line for ( int c=0; c<3; c++ ) { //data[c] = new byte[imgsize.Width*imgsize.Height]; //int i = 0; //while ( i < imgsize.Width*imgsize.Height ) i += reader.Read( data[c], i, (imgsize.Width*imgsize.Height)-i ); data[c] = new byte[imgsize.Width*imgsize.Height]; reader.Read( data[c], 0, data[c].Length ); } image = new Channels( imgsize, data[0], data[1], data[2] ).Combine(); break; case CompressionMethod.RLE: // Throw widthlist away... reader.ReadBytes( imgsize.Height * numchannels * 2 ); // read each line for ( int c=0; c<3; c++ ) { data[c] = new byte[imgsize.Width*imgsize.Height]; for ( int y=0, offset = 0; y<imgsize.Height; ++y ) { offset += Utils.UnpackRLELine( reader, imgsize.Width, data[c], offset ); } } image = new Channels( imgsize, data[0], data[1], data[2] ).Combine(); break; default: throw new InvalidCompressionMethodException( compression ); } }
public void ReadDefinitionFrom( BinaryReader reader ) { // Read bounds int top = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); int left = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); int bottom = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); int right = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); bounds = Rectangle.FromLTRB( left, top, right, bottom ); maskbounds = bounds; hasmask = false; channels = new Channels( reader ); // Blend info Utils.CheckSignature( reader, "8BIM", new InvalidBlendSignature() ); blendkey = new string( reader.ReadChars( 4 ) ); opacity = reader.ReadByte(); clipping = reader.ReadByte() == 0 ? LayerClipping.Base : LayerClipping.NonBase; // Flags byte flags = reader.ReadByte(); protecttrans = (flags & 1) != 0; visible = (flags & 2) == 0; reader.ReadByte(); // filler // extra data (?) int extradatasize = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); if ( extradatasize > 0 ) extradatasize += (int)reader.BaseStream.Position; // Layer mask data int datasize = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); if ( datasize > 0 ) { top = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); left = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); bottom = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); right = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); maskbounds = Rectangle.FromLTRB( left, top, right, bottom ); hasmask = true; // layer mask data datasize = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); } // Range data datasize = IPAddress.NetworkToHostOrder( reader.ReadInt32() ); if ( datasize > 0 ) { reader.ReadBytes( datasize ); // throw away } name = Utils.ReadPascalString( reader, 4 ); // Read rest System.Collections.ArrayList list = new System.Collections.ArrayList(); while ( (int)reader.BaseStream.Position < extradatasize ) { LayerAdjustment adj = LayerAdjustment.Construct( reader ); if ( adj == null ) break; list.Add( adj ); } if ( list.Count > 0 ) { adjustments = new LayerAdjustment[list.Count]; list.CopyTo( adjustments, 0 ); } else adjustments = new LayerAdjustment[0]; if ( channels.Mask != null ) channels.Mask.Size = maskbounds.Size; if ( channels.Alpha != null ) channels.Alpha.Size = bounds.Size; if ( channels.Red != null ) { // Let's assume that a valid Red channel also means valid Green and Blue channels channels.Red.Size = bounds.Size; channels.Green.Size = bounds.Size; channels.Blue.Size = bounds.Size; } }