diff --git a/Vocaluxe/GlobalSuppressions.cs b/Vocaluxe/GlobalSuppressions.cs index 0b83f3ab..05266267 100644 --- a/Vocaluxe/GlobalSuppressions.cs +++ b/Vocaluxe/GlobalSuppressions.cs @@ -12,3 +12,6 @@ [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Objekte verwerfen, bevor Bereich verloren geht", Scope = "member", Target = "Vocaluxe.Lib.Draw.CDrawWinForm.#ColorizeBitmap(System.Drawing.Bitmap,Vocaluxe.Menu.SColorF)")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Objekte verwerfen, bevor Bereich verloren geht", Scope = "member", Target = "Vocaluxe.Lib.Draw.CDrawWinForm.#CopyScreen(Vocaluxe.Menu.STexture&)")] [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Objekte verwerfen, bevor Bereich verloren geht", Scope = "member", Target = "Vocaluxe.Base.CGlyph.#.ctor(System.Char,System.Single)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Objekte verwerfen, bevor Bereich verloren geht", Scope = "member", Target = "Vocaluxe.Lib.Draw.CDirect3D.#AddTexture(System.Drawing.Bitmap,System.String)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Objekte verwerfen, bevor Bereich verloren geht", Scope = "member", Target = "Vocaluxe.Lib.Draw.CDirect3D.#AddTexture(System.Int32,System.Int32,System.Byte[]&)")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Objekte verwerfen, bevor Bereich verloren geht", Scope = "member", Target = "Vocaluxe.Lib.Draw.CDirect3D.#CopyScreen()")] diff --git a/Vocaluxe/Lib/Draw/CDirect3D.cs b/Vocaluxe/Lib/Draw/CDirect3D.cs index ae483f01..a89d3a62 100644 --- a/Vocaluxe/Lib/Draw/CDirect3D.cs +++ b/Vocaluxe/Lib/Draw/CDirect3D.cs @@ -734,18 +734,18 @@ namespace Vocaluxe.Lib.Draw Surface textureSurface = tex.GetSurfaceLevel(0); Surface.FromSurface(textureSurface, backbufferSurface, Filter.Default, 0); backbufferSurface.Dispose(); - _D3DTextures.Add(_IDs.Peek(), tex); - - texture.color = new SColorF(1f, 1f, 1f, 1f); - texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); - texture.width = w; - texture.height = h; - texture.w2 = CheckForNextPowerOf2(texture.width); - texture.h2 = CheckForNextPowerOf2(texture.height); - texture.index = _IDs.Dequeue(); - lock (MutexTexture) { + _D3DTextures.Add(_IDs.Peek(), tex); + + texture.color = new SColorF(1f, 1f, 1f, 1f); + texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); + texture.width = w; + texture.height = h; + texture.w2 = CheckForNextPowerOf2(texture.width); + texture.h2 = CheckForNextPowerOf2(texture.height); + texture.index = _IDs.Dequeue(); + _Textures[texture.index] = texture; } return texture; @@ -899,14 +899,13 @@ namespace Vocaluxe.Lib.Draw /// /// Adds a texture and stores it in the Vram /// - /// The Bitmap of which the texute will be created from + /// The Bitmap of which the texure will be created from /// The path to the texture /// A STexture object containing the added texture public STexture AddTexture(Bitmap bmp, string TexturePath) { - STexture texture = new STexture(-1); if (bmp.Height == 0 || bmp.Width == 0) - return texture; + return new STexture(-1); int MaxSize; //Apply the right max size switch (CConfig.TextureQuality) @@ -934,7 +933,7 @@ namespace Vocaluxe.Lib.Draw int w = bmp.Width; int h = bmp.Height; - if (w > MaxSize) + if (w > MaxSize && w > h) { h = (int)Math.Round((float)MaxSize / bmp.Width * bmp.Height); w = MaxSize; @@ -946,68 +945,47 @@ namespace Vocaluxe.Lib.Draw h = MaxSize; } - texture.width = w; - texture.height = h; - //Older graphics card can only handle textures with sizes being powers of two - texture.w2 = (float)CheckForNextPowerOf2(w); - texture.h2 = (float)CheckForNextPowerOf2(h); + w = (int)CheckForNextPowerOf2(w); + h = (int)CheckForNextPowerOf2(h); - if (texture.w2 != bmp.Width || texture.h2 != bmp.Height) + Bitmap bmp2 = null; + byte[] Data; + try { - //Create a new Bitmap with the new sizes - Bitmap bmp2 = new Bitmap((int)texture.w2, (int)texture.h2); - //Scale the texture - Graphics g = Graphics.FromImage(bmp2); - g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; - g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; - g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height)); - g.Dispose(); - bmp = bmp2; + + if (w != bmp.Width || h != bmp.Height) + { + //Create a new Bitmap with the new sizes + bmp2 = new Bitmap(w, h); + //Scale the texture + Graphics g = Graphics.FromImage(bmp2); + g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; + g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height)); + g.Dispose(); + bmp = bmp2; + } + + //Fill the new Bitmap with the texture data + BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + Data = new byte[4 * w * h]; + Marshal.Copy(bmp_data.Scan0, Data, 0, Data.Length); + bmp.UnlockBits(bmp_data); + } + finally + { + if (bmp2 != null) + bmp2.Dispose(); } - texture.width_ratio = 1f; - texture.height_ratio = 1f; - - //Fill the new Bitmap with the texture data - BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, (int)texture.w2, (int)texture.h2), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - byte[] Data = new byte[4 * (int)texture.w2 * (int)texture.h2]; - Marshal.Copy(bmp_data.Scan0, Data, 0, Data.Length); - bmp.UnlockBits(bmp_data); - - //Create a new texture in the managed pool, which does not need to be recreated on a lost device - //because a copy of the texture is hold in the Ram - Texture t = new Texture(_Device, (int)texture.w2, (int)texture.h2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed); - //Lock the texture and fill it with the data - DataRectangle rect = t.LockRectangle(0, LockFlags.Discard); - for (int i = 0; i < Data.Length; ) - { - rect.Data.Write(Data, i, 4 * (int)texture.w2); - i += 4 * (int)texture.w2; - rect.Data.Position = rect.Data.Position - 4 * (int)texture.w2; - rect.Data.Position += rect.Pitch; - } - t.UnlockRectangle(0); - - bmp_data = null; - - // Add to Texture List - texture.color = new SColorF(1f, 1f, 1f, 1f); - texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); - texture.TexturePath = String.Empty; - lock (MutexTexture) - { - _D3DTextures.Add(_IDs.Peek(), t); - texture.index = _IDs.Dequeue(); - _Textures[texture.index] = texture; - } - return texture; + return AddTexture(w, h, ref Data); } /// /// Adds a texture and stores it in the Vram /// - /// The Bitmap of which the texute will be created from + /// The Bitmap of which the texure will be created from /// A STexture object containing the added texture public STexture AddTexture(Bitmap bmp) { @@ -1021,6 +999,59 @@ namespace Vocaluxe.Lib.Draw return AddTexture(W, H, ref PointerData); } + public STexture AddTexture(int W, int H, ref byte[] Data) + { + STexture texture = new STexture(-1); + + Texture t = _CreateTexture(W, H, ref Data, ref texture); + + lock (MutexTexture) + { + _D3DTextures.Add(_IDs.Peek(), t); + texture.index = _IDs.Dequeue(); + _Textures[texture.index] = texture; + } + return texture; + } + + private Texture _CreateTexture(int W, int H, ref byte[] Data, ref STexture sTexture) + { + sTexture.width = W; + sTexture.height = H; + sTexture.w2 = CheckForNextPowerOf2(W); + sTexture.h2 = CheckForNextPowerOf2(H); + sTexture.width_ratio = W / sTexture.w2; + sTexture.height_ratio = H / sTexture.h2; + + //Create a new texture in the managed pool, which does not need to be recreated on a lost device + //because a copy of the texture is hold in the Ram + Texture t = null; + try + { + t = new Texture(_Device, (int)sTexture.w2, (int)sTexture.h2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed); + //Lock the texture and fill it with the data + DataRectangle rect = t.LockRectangle(0, LockFlags.Discard); + for (int i = 0; i < Data.Length; i += 4 * W) + { + rect.Data.Write(Data, i, 4 * (int)sTexture.w2); + rect.Data.Position = rect.Data.Position - 4 * (int)sTexture.w2; + rect.Data.Position += rect.Pitch; + } + t.UnlockRectangle(0); + + sTexture.color = new SColorF(1f, 1f, 1f, 1f); + sTexture.rect = new SRectF(0f, 0f, sTexture.width, sTexture.height, 0f); + sTexture.TexturePath = String.Empty; + } + catch (Exception) + { + if (t != null) + t.Dispose(); + throw; + } + return t; + } + public STexture QuequeTexture(int W, int H, ref byte[] Data) { STexture texture = new STexture(-1); @@ -1043,39 +1074,6 @@ namespace Vocaluxe.Lib.Draw return texture; } - public STexture AddTexture(int W, int H, ref byte[] Data) - { - STexture texture = new STexture(-1); - texture.width = W; - texture.height = H; - texture.w2 = CheckForNextPowerOf2(texture.width); - texture.h2 = CheckForNextPowerOf2(texture.height); - texture.width_ratio = texture.width / texture.w2; - texture.height_ratio = texture.height / texture.h2; - - Texture t = new Texture(_Device, (int)texture.w2, (int)texture.h2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed); - DataRectangle rect = t.LockRectangle(0, LockFlags.Discard); - for (int i = 0; i < Data.Length; ) - { - rect.Data.Write(Data, i, 4 * W); - i += 4 * W; - rect.Data.Position = rect.Data.Position - 4 * W; - rect.Data.Position += rect.Pitch; - } - t.UnlockRectangle(0); - - texture.color = new SColorF(1f, 1f, 1f, 1f); - texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); - texture.TexturePath = String.Empty; - - lock (MutexTexture) - { - _D3DTextures.Add(_IDs.Peek(), t); - texture.index = _IDs.Dequeue(); - _Textures[texture.index] = texture; - } - return texture; - } #endregion adding #region updating @@ -1103,18 +1101,22 @@ namespace Vocaluxe.Lib.Draw { if ((Texture.index >= 0) && (_Textures.Count > 0) && _TextureExists(ref Texture)) { - DataRectangle rect = _D3DTextures[Texture.index].LockRectangle(0, LockFlags.Discard); - for (int i = 0; i < Data.Length; ) + lock (MutexTexture) { - rect.Data.Write(Data, i, 4 * (int)Texture.width); - i += 4 * (int)Texture.width; - rect.Data.Position = rect.Data.Position - 4 * (int)Texture.width; - rect.Data.Position += rect.Pitch; + DataRectangle rect = _D3DTextures[Texture.index].LockRectangle(0, LockFlags.Discard); + int W = (int)Texture.width; + for (int i = 0; i < Data.Length; i += 4 * W) + { + rect.Data.Write(Data, i, 4 * W); + rect.Data.Position -= 4 * W; + rect.Data.Position += rect.Pitch; + } + _D3DTextures[Texture.index].UnlockRectangle(0); } - _D3DTextures[Texture.index].UnlockRectangle(0); - Texture.height_ratio = Texture.height / CheckForNextPowerOf2(Texture.height); - Texture.width_ratio = Texture.width / CheckForNextPowerOf2(Texture.width); + //Flamefire: Unneccesary as height can not be changed by this! (Texture gets copied) + //Texture.height_ratio = Texture.height / CheckForNextPowerOf2(Texture.height); + //Texture.width_ratio = Texture.width / CheckForNextPowerOf2(Texture.width); return true; /*Surface s = _D3DTextures[Texture.index].GetSurfaceLevel(0); @@ -1460,37 +1462,15 @@ namespace Vocaluxe.Lib.Draw return; STextureQueque q = _Queque[0]; - STexture texture = new STexture(-1); + STexture texture; if (_Textures.ContainsKey(q.ID)) texture = _Textures[q.ID]; - if (texture.index < 0) + else return; - texture.width = q.width; - texture.height = q.height; - texture.w2 = CheckForNextPowerOf2(texture.width); - texture.h2 = CheckForNextPowerOf2(texture.height); - - texture.width_ratio = texture.width / texture.w2; - texture.height_ratio = texture.height / texture.h2; - - Texture t = new Texture(_Device, (int)texture.w2, (int)texture.h2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed); - DataRectangle rect = t.LockRectangle(0, LockFlags.Discard); - for (int i = 0; i < q.data.Length; ) - { - rect.Data.Write(q.data, i, 4 * q.width); - i += 4 * q.width; - rect.Data.Position = rect.Data.Position - 4 * q.width; - rect.Data.Position += rect.Pitch; - } - t.UnlockRectangle(0); + Texture t = _CreateTexture(q.width, q.height, ref q.data, ref texture); _D3DTextures[q.ID] = t; - // Add to Texture List - texture.color = new SColorF(1f, 1f, 1f, 1f); - texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f); - texture.TexturePath = String.Empty; - _Textures[texture.index] = texture; _Queque.RemoveAt(0); }