Esempio n. 1
0
 public Layer( string name, Point location, Bitmap src )
 {
     this.file = null;
     this.name = name;
     this.location = location;
     image = src == null ? null : ((Bitmap)src.Clone());
     clipping = LayerClipping.Base;
     opacity = 255;
     visible = true;
     protecttrans = false;
     mode = LayerMode.Normal;
     mask = null;
     adjustments = new LayerAdjustment[0];
 }
Esempio 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;
            }
        }