From 6d1f43c7c6a8214aaa31cf1247094f15de69af0d Mon Sep 17 00:00:00 2001 From: codeimp Date: Wed, 15 Oct 2008 19:14:32 +0000 Subject: [PATCH] - added feature to display an image from file on the background along with ability to scale it - fixed some scaled sizes in some image data classes --- Documents/todo.txt | 3 + Source/Data/FileImage.cs | 14 +++ Source/Data/ImageData.cs | 11 ++- Source/Data/ResourceImage.cs | 14 +++ Source/Editing/GridSetup.cs | 47 ++++++--- Source/Rendering/Renderer2D.cs | 6 +- Source/Windows/GridSetupForm.Designer.cs | 119 +++++++++++++++++++++-- Source/Windows/GridSetupForm.cs | 33 ++++++- Source/Windows/GridSetupForm.resx | 32 +++++- 9 files changed, 243 insertions(+), 36 deletions(-) diff --git a/Documents/todo.txt b/Documents/todo.txt index 67cf9b27..4d52272e 100644 --- a/Documents/todo.txt +++ b/Documents/todo.txt @@ -12,6 +12,9 @@ - Make DECORATE support +- Make plugin dependencies + (load BEFORE and load AFTER so that also their functions are called in that order) + - Make dialog and editing mode help documentation - Make Plugin Development Kit diff --git a/Source/Data/FileImage.cs b/Source/Data/FileImage.cs index d0950c91..007ab89a 100644 --- a/Source/Data/FileImage.cs +++ b/Source/Data/FileImage.cs @@ -45,6 +45,18 @@ namespace CodeImp.DoomBuilder.Data // Initialize this.filepathname = filepathname; SetName(name); + + // Temporarily load file + Bitmap bmp = (Bitmap)Bitmap.FromFile(filepathname); + + // Get width and height from image + width = bmp.Size.Width; + height = bmp.Size.Height; + scaledwidth = (float)bmp.Size.Width * General.Map.Config.DefaultTextureScale; + scaledheight = (float)bmp.Size.Height * General.Map.Config.DefaultTextureScale; + + // Unload file + bmp.Dispose(); // We have no destructor GC.SuppressFinalize(this); @@ -69,6 +81,8 @@ namespace CodeImp.DoomBuilder.Data // Get width and height from image width = bitmap.Size.Width; height = bitmap.Size.Height; + scaledwidth = (float)bitmap.Size.Width * General.Map.Config.DefaultTextureScale; + scaledheight = (float)bitmap.Size.Height * General.Map.Config.DefaultTextureScale; // Pass on to base base.LocalLoadImage(); diff --git a/Source/Data/ImageData.cs b/Source/Data/ImageData.cs index 69bebde5..16541d4b 100644 --- a/Source/Data/ImageData.cs +++ b/Source/Data/ImageData.cs @@ -102,13 +102,16 @@ namespace CodeImp.DoomBuilder.Data // Constructor public ImageData() { - // We have no destructor - GC.SuppressFinalize(this); - // Defaults usecolorcorrection = true; } + // Destructor + ~ImageData() + { + this.Dispose(); + } + // Disposer public virtual void Dispose() { @@ -243,6 +246,8 @@ namespace CodeImp.DoomBuilder.Data bitmap = new Bitmap(Properties.Resources.Failed); width = bitmap.Size.Width; height = bitmap.Size.Height; + scaledwidth = (float)bitmap.Size.Width * General.Map.Config.DefaultTextureScale; + scaledheight = (float)bitmap.Size.Height * General.Map.Config.DefaultTextureScale; } // Image is ready diff --git a/Source/Data/ResourceImage.cs b/Source/Data/ResourceImage.cs index f3441ec1..2a787987 100644 --- a/Source/Data/ResourceImage.cs +++ b/Source/Data/ResourceImage.cs @@ -40,7 +40,21 @@ namespace CodeImp.DoomBuilder.Data { // Initialize SetName(resourcename); + + // Temporarily load resource from memory + Stream bitmapdata = General.ThisAssembly.GetManifestResourceStream("CodeImp.DoomBuilder.Resources." + Name); + Bitmap bmp = (Bitmap)Image.FromStream(bitmapdata); + + // Get width and height from image + width = bmp.Size.Width; + height = bmp.Size.Height; + scaledwidth = (float)bmp.Size.Width; + scaledheight = (float)bmp.Size.Height; + // Done + bmp.Dispose(); + bitmapdata.Dispose(); + // We have no destructor GC.SuppressFinalize(this); } diff --git a/Source/Editing/GridSetup.cs b/Source/Editing/GridSetup.cs index 57081511..8bd58fc0 100644 --- a/Source/Editing/GridSetup.cs +++ b/Source/Editing/GridSetup.cs @@ -45,6 +45,7 @@ namespace CodeImp.DoomBuilder.Editing public const int SOURCE_TEXTURES = 0; public const int SOURCE_FLATS = 1; + public const int SOURCE_FILE = 2; #endregion @@ -60,6 +61,7 @@ namespace CodeImp.DoomBuilder.Editing private int backsource; private ImageData backimage = new NullImage(); private int backoffsetx, backoffsety; + private float backscalex, backscaley; // Disposing private bool isdisposed; @@ -75,6 +77,8 @@ namespace CodeImp.DoomBuilder.Editing internal ImageData Background { get { return backimage; } } internal int BackgroundX { get { return backoffsetx; } } internal int BackgroundY { get { return backoffsety; } } + internal float BackgroundScaleX { get { return backscalex; } } + internal float BackgroundScaleY { get { return backscaley; } } internal bool Disposed { get { return isdisposed; } } #endregion @@ -86,7 +90,9 @@ namespace CodeImp.DoomBuilder.Editing { // Initialize SetGridSize(DEFAULT_GRID_SIZE); - + backscalex = 1.0f; + backscaley = 1.0f; + // Register actions General.Actions.BindMethods(this); @@ -99,6 +105,9 @@ namespace CodeImp.DoomBuilder.Editing { if(!isdisposed) { + // Dispose image if needed + if(backimage is FileImage) (backimage as FileImage).Dispose(); + // Clean up backimage = null; @@ -138,30 +147,38 @@ namespace CodeImp.DoomBuilder.Editing LinkBackground(); } - // This sets the background offset - internal void SetBackgroundOffset(int offsetx, int offsety) + // This sets the background view + internal void SetBackgroundView(int offsetx, int offsety, float scalex, float scaley) { // Set background offset this.backoffsetx = offsetx; this.backoffsety = offsety; + this.backscalex = scalex; + this.backscaley = scaley; } // This finds and links the background image internal void LinkBackground() { - // From textures? - if(backsource == SOURCE_TEXTURES) - { - // Get this texture - backimage = General.Map.Data.GetTextureImage(background); - } - // From flats? - else if(backsource == SOURCE_FLATS) - { - // Get this flat - backimage = General.Map.Data.GetFlatImage(background); - } + // Dispose image if needed + if(backimage is FileImage) (backimage as FileImage).Dispose(); + // Where to load background from? + switch(backsource) + { + case SOURCE_TEXTURES: + backimage = General.Map.Data.GetTextureImage(background); + break; + + case SOURCE_FLATS: + backimage = General.Map.Data.GetFlatImage(background); + break; + + case SOURCE_FILE: + backimage = new FileImage(background, background); + break; + } + // Make sure it is loaded backimage.LoadImage(); backimage.CreateTexture(); diff --git a/Source/Rendering/Renderer2D.cs b/Source/Rendering/Renderer2D.cs index 4d41fcd2..98b8bd59 100644 --- a/Source/Rendering/Renderer2D.cs +++ b/Source/Rendering/Renderer2D.cs @@ -731,7 +731,11 @@ namespace CodeImp.DoomBuilder.Rendering { Vector2D ltpos, rbpos; Vector2D backoffset = new Vector2D((float)General.Map.Grid.BackgroundX, (float)General.Map.Grid.BackgroundY); - Vector2D backimagesize = new Vector2D((float)General.Map.Grid.Background.Width, (float)General.Map.Grid.Background.Height); + Vector2D backimagesize = new Vector2D((float)General.Map.Grid.Background.ScaledWidth, (float)General.Map.Grid.Background.ScaledHeight); + Vector2D backimagescale = new Vector2D(General.Map.Grid.BackgroundScaleX, General.Map.Grid.BackgroundScaleY); + + // Scale the background image size + backimagesize *= backimagescale; // Only if a background image is set if((General.Map.Grid.Background != null) && diff --git a/Source/Windows/GridSetupForm.Designer.cs b/Source/Windows/GridSetupForm.Designer.cs index bcb6dec0..2a440ebb 100644 --- a/Source/Windows/GridSetupForm.Designer.cs +++ b/Source/Windows/GridSetupForm.Designer.cs @@ -32,6 +32,10 @@ namespace CodeImp.DoomBuilder.Windows System.Windows.Forms.Label label1; System.Windows.Forms.GroupBox groupBox2; this.gridsize = new System.Windows.Forms.NumericUpDown(); + this.backscaley = new System.Windows.Forms.NumericUpDown(); + this.backscalex = new System.Windows.Forms.NumericUpDown(); + this.backscale = new System.Windows.Forms.Label(); + this.selectfile = new System.Windows.Forms.Button(); this.showbackground = new System.Windows.Forms.CheckBox(); this.backoffsety = new System.Windows.Forms.NumericUpDown(); this.backoffsetx = new System.Windows.Forms.NumericUpDown(); @@ -41,18 +45,23 @@ namespace CodeImp.DoomBuilder.Windows this.backgroundimage = new System.Windows.Forms.Panel(); this.cancel = new System.Windows.Forms.Button(); this.apply = new System.Windows.Forms.Button(); + this.browsefile = new System.Windows.Forms.OpenFileDialog(); groupBox1 = new System.Windows.Forms.GroupBox(); label1 = new System.Windows.Forms.Label(); groupBox2 = new System.Windows.Forms.GroupBox(); groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.gridsize)).BeginInit(); groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.backscaley)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.backscalex)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.backoffsety)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.backoffsetx)).BeginInit(); this.SuspendLayout(); // // groupBox1 // + groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); groupBox1.Controls.Add(this.gridsize); groupBox1.Controls.Add(label1); groupBox1.Location = new System.Drawing.Point(12, 12); @@ -96,6 +105,12 @@ namespace CodeImp.DoomBuilder.Windows // // groupBox2 // + groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + groupBox2.Controls.Add(this.backscaley); + groupBox2.Controls.Add(this.backscalex); + groupBox2.Controls.Add(this.backscale); + groupBox2.Controls.Add(this.selectfile); groupBox2.Controls.Add(this.showbackground); groupBox2.Controls.Add(this.backoffsety); groupBox2.Controls.Add(this.backoffsetx); @@ -105,11 +120,80 @@ namespace CodeImp.DoomBuilder.Windows groupBox2.Controls.Add(this.backgroundimage); groupBox2.Location = new System.Drawing.Point(12, 89); groupBox2.Name = "groupBox2"; - groupBox2.Size = new System.Drawing.Size(285, 181); + groupBox2.Size = new System.Drawing.Size(285, 255); groupBox2.TabIndex = 1; groupBox2.TabStop = false; groupBox2.Text = " Background "; // + // backscaley + // + this.backscaley.Enabled = false; + this.backscaley.ImeMode = System.Windows.Forms.ImeMode.Off; + this.backscaley.Location = new System.Drawing.Point(197, 209); + this.backscaley.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.backscaley.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.backscaley.Name = "backscaley"; + this.backscaley.Size = new System.Drawing.Size(57, 20); + this.backscaley.TabIndex = 11; + this.backscaley.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // backscalex + // + this.backscalex.Enabled = false; + this.backscalex.ImeMode = System.Windows.Forms.ImeMode.Off; + this.backscalex.Location = new System.Drawing.Point(134, 209); + this.backscalex.Maximum = new decimal(new int[] { + 1000, + 0, + 0, + 0}); + this.backscalex.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.backscalex.Name = "backscalex"; + this.backscalex.Size = new System.Drawing.Size(57, 20); + this.backscalex.TabIndex = 10; + this.backscalex.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // backscale + // + this.backscale.AutoSize = true; + this.backscale.Enabled = false; + this.backscale.Location = new System.Drawing.Point(40, 211); + this.backscale.Name = "backscale"; + this.backscale.Size = new System.Drawing.Size(88, 14); + this.backscale.TabIndex = 9; + this.backscale.Text = "Scale in percent:"; + // + // selectfile + // + this.selectfile.Enabled = false; + this.selectfile.Location = new System.Drawing.Point(137, 122); + this.selectfile.Name = "selectfile"; + this.selectfile.Size = new System.Drawing.Size(117, 25); + this.selectfile.TabIndex = 8; + this.selectfile.Text = "Select File..."; + this.selectfile.UseVisualStyleBackColor = true; + this.selectfile.Click += new System.EventHandler(this.selectfile_Click); + // // showbackground // this.showbackground.AutoSize = true; @@ -125,7 +209,7 @@ namespace CodeImp.DoomBuilder.Windows // this.backoffsety.Enabled = false; this.backoffsety.ImeMode = System.Windows.Forms.ImeMode.Off; - this.backoffsety.Location = new System.Drawing.Point(197, 137); + this.backoffsety.Location = new System.Drawing.Point(197, 172); this.backoffsety.Maximum = new decimal(new int[] { 4096, 0, @@ -139,7 +223,7 @@ namespace CodeImp.DoomBuilder.Windows // this.backoffsetx.Enabled = false; this.backoffsetx.ImeMode = System.Windows.Forms.ImeMode.Off; - this.backoffsetx.Location = new System.Drawing.Point(134, 137); + this.backoffsetx.Location = new System.Drawing.Point(134, 172); this.backoffsetx.Maximum = new decimal(new int[] { 4096, 0, @@ -153,7 +237,7 @@ namespace CodeImp.DoomBuilder.Windows // this.backoffset.AutoSize = true; this.backoffset.Enabled = false; - this.backoffset.Location = new System.Drawing.Point(25, 140); + this.backoffset.Location = new System.Drawing.Point(25, 175); this.backoffset.Name = "backoffset"; this.backoffset.Size = new System.Drawing.Size(103, 14); this.backoffset.TabIndex = 4; @@ -162,7 +246,7 @@ namespace CodeImp.DoomBuilder.Windows // selectflat // this.selectflat.Enabled = false; - this.selectflat.Location = new System.Drawing.Point(92, 91); + this.selectflat.Location = new System.Drawing.Point(137, 91); this.selectflat.Name = "selectflat"; this.selectflat.Size = new System.Drawing.Size(117, 25); this.selectflat.TabIndex = 3; @@ -173,7 +257,7 @@ namespace CodeImp.DoomBuilder.Windows // selecttexture // this.selecttexture.Enabled = false; - this.selecttexture.Location = new System.Drawing.Point(92, 60); + this.selecttexture.Location = new System.Drawing.Point(137, 60); this.selecttexture.Name = "selecttexture"; this.selecttexture.Size = new System.Drawing.Size(117, 25); this.selecttexture.TabIndex = 2; @@ -188,13 +272,14 @@ namespace CodeImp.DoomBuilder.Windows this.backgroundimage.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.backgroundimage.Location = new System.Drawing.Point(28, 60); this.backgroundimage.Name = "backgroundimage"; - this.backgroundimage.Size = new System.Drawing.Size(58, 56); + this.backgroundimage.Size = new System.Drawing.Size(91, 87); this.backgroundimage.TabIndex = 1; // // cancel // + this.cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.cancel.Location = new System.Drawing.Point(185, 283); + this.cancel.Location = new System.Drawing.Point(185, 357); this.cancel.Name = "cancel"; this.cancel.Size = new System.Drawing.Size(112, 25); this.cancel.TabIndex = 22; @@ -204,7 +289,8 @@ namespace CodeImp.DoomBuilder.Windows // // apply // - this.apply.Location = new System.Drawing.Point(67, 283); + this.apply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.apply.Location = new System.Drawing.Point(67, 357); this.apply.Name = "apply"; this.apply.Size = new System.Drawing.Size(112, 25); this.apply.TabIndex = 21; @@ -212,12 +298,18 @@ namespace CodeImp.DoomBuilder.Windows this.apply.UseVisualStyleBackColor = true; this.apply.Click += new System.EventHandler(this.apply_Click); // + // browsefile + // + this.browsefile.Filter = "All supported images|*.bmp;*.jpg;*.png|All Files|*.*"; + this.browsefile.RestoreDirectory = true; + this.browsefile.Title = "Select Background Image File"; + // // GridSetupForm // this.AcceptButton = this.apply; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.CancelButton = this.cancel; - this.ClientSize = new System.Drawing.Size(309, 318); + this.ClientSize = new System.Drawing.Size(309, 392); this.Controls.Add(this.cancel); this.Controls.Add(this.apply); this.Controls.Add(groupBox2); @@ -237,6 +329,8 @@ namespace CodeImp.DoomBuilder.Windows ((System.ComponentModel.ISupportInitialize)(this.gridsize)).EndInit(); groupBox2.ResumeLayout(false); groupBox2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.backscaley)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.backscalex)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.backoffsety)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.backoffsetx)).EndInit(); this.ResumeLayout(false); @@ -255,5 +349,10 @@ namespace CodeImp.DoomBuilder.Windows private System.Windows.Forms.Button cancel; private System.Windows.Forms.Button apply; private System.Windows.Forms.Label backoffset; + private System.Windows.Forms.Button selectfile; + private System.Windows.Forms.NumericUpDown backscaley; + private System.Windows.Forms.NumericUpDown backscalex; + private System.Windows.Forms.Label backscale; + private System.Windows.Forms.OpenFileDialog browsefile; } } \ No newline at end of file diff --git a/Source/Windows/GridSetupForm.cs b/Source/Windows/GridSetupForm.cs index 3f43a22f..0e712e3e 100644 --- a/Source/Windows/GridSetupForm.cs +++ b/Source/Windows/GridSetupForm.cs @@ -68,6 +68,8 @@ namespace CodeImp.DoomBuilder.Windows // Show background offset backoffsetx.Value = General.Map.Grid.BackgroundX; backoffsety.Value = General.Map.Grid.BackgroundY; + backscalex.Value = (int)(General.Map.Grid.BackgroundScaleX * 100.0f); + backscaley.Value = (int)(General.Map.Grid.BackgroundScaleY * 100.0f); } // Show Background changed @@ -76,9 +78,13 @@ namespace CodeImp.DoomBuilder.Windows // Enable/disable controls selecttexture.Enabled = showbackground.Checked; selectflat.Enabled = showbackground.Checked; + selectfile.Enabled = showbackground.Checked; backoffset.Enabled = showbackground.Checked; + backscale.Enabled = showbackground.Checked; backoffsetx.Enabled = showbackground.Checked; backoffsety.Enabled = showbackground.Checked; + backscalex.Enabled = showbackground.Checked; + backscaley.Enabled = showbackground.Checked; } // Browse texture @@ -93,7 +99,9 @@ namespace CodeImp.DoomBuilder.Windows // Set this texture as background backgroundname = result; backgroundsource = GridSetup.SOURCE_TEXTURES; - General.DisplayZoomedImage(backgroundimage, General.Map.Data.GetTextureImage(result).GetPreview()); + ImageData img = General.Map.Data.GetTextureImage(result); + img.LoadImage(); + General.DisplayZoomedImage(backgroundimage, img.Bitmap); } } @@ -109,7 +117,25 @@ namespace CodeImp.DoomBuilder.Windows // Set this flat as background backgroundname = result; backgroundsource = GridSetup.SOURCE_FLATS; - General.DisplayZoomedImage(backgroundimage, General.Map.Data.GetFlatImage(result).GetPreview()); + ImageData img = General.Map.Data.GetFlatImage(result); + img.LoadImage(); + General.DisplayZoomedImage(backgroundimage, img.Bitmap); + } + } + + // Browse file + private void selectfile_Click(object sender, EventArgs e) + { + // Browse for file + if(browsefile.ShowDialog(this) == DialogResult.OK) + { + // Set this file as background + backgroundname = browsefile.FileName; + backgroundsource = GridSetup.SOURCE_FILE; + ImageData img = new FileImage(backgroundname, backgroundname); + img.LoadImage(); + General.DisplayZoomedImage(backgroundimage, new Bitmap(img.Bitmap)); + img.Dispose(); } } @@ -125,7 +151,8 @@ namespace CodeImp.DoomBuilder.Windows { // Apply General.Map.Grid.SetGridSize((int)gridsize.Value); - General.Map.Grid.SetBackgroundOffset((int)backoffsetx.Value, (int)backoffsety.Value); + General.Map.Grid.SetBackgroundView((int)backoffsetx.Value, (int)backoffsety.Value, + (float)backscalex.Value / 100.0f, (float)backscaley.Value / 100.0f); // Background image? if(showbackground.Checked) diff --git a/Source/Windows/GridSetupForm.resx b/Source/Windows/GridSetupForm.resx index 23678291..2a9d6045 100644 --- a/Source/Windows/GridSetupForm.resx +++ b/Source/Windows/GridSetupForm.resx @@ -117,12 +117,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - False - True + + False + True @@ -132,12 +132,33 @@ False - + + True + + + True + + False True + + False + + + True + + + True + + + True + + + True + True @@ -165,6 +186,9 @@ True + + 17, 17 + True