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]; }
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; } }