Ejemplo n.º 1
0
		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 );
			}
		}
Ejemplo n.º 2
0
        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;
            }
        }