Use maximum possible resolution for bmp->texture

This commit is contained in:
Flamefire committed 2013-05-03 23:56:08 +02:00
1 parent 5aeea59e76
commit 55ef3a0050
2 files changed
+35 -68

No files matched your search

+26 -43
View File
@@ -857,49 +857,31 @@ namespace Vocaluxe.Lib.Draw
break; break;
} }
int w = bmp.Width; STexture texture = new STexture(-1, bmp.Width, bmp.Height) {UseFullTexture = true};
int h = bmp.Height;
float ratio = (float)w / h;
int newW = w;
int newH = h;
if (w > maxSize && w > h) int w = Math.Min(bmp.Width, maxSize);
newW = maxSize; int h = Math.Min(bmp.Height, maxSize);
else if (h > maxSize) w = _CheckForNextPowerOf2(w);
newH = maxSize; h = _CheckForNextPowerOf2(h);
else if (w > h)
newW = _CheckForNextPowerOf2(w); texture.W2 = w;
else texture.H2 = h;
newH = _CheckForNextPowerOf2(h);
Bitmap bmp2 = null; Bitmap bmp2 = null;
byte[] data; byte[] data;
try try
{ {
if (w != newW || h != newH) if (bmp.Width != w || bmp.Height != h)
{ {
if (w != newW)
{
w = newW;
h = (int)Math.Round(w / ratio);
if (h == 0)
h = 1;
}
else
{
h = newH;
w = (int)Math.Round(h * ratio);
if (w == 0)
w = 1;
}
//Create a new Bitmap with the new sizes //Create a new Bitmap with the new sizes
bmp2 = new Bitmap(w, h); bmp2 = new Bitmap(w, h);
//Scale the texture //Scale the texture
Graphics g = Graphics.FromImage(bmp2); using (Graphics g = Graphics.FromImage(bmp2))
g.InterpolationMode = InterpolationMode.HighQualityBicubic; {
g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height)); g.SmoothingMode = SmoothingMode.HighQuality;
g.Dispose(); g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height));
}
bmp = bmp2; bmp = bmp2;
} }
@@ -915,14 +897,18 @@ namespace Vocaluxe.Lib.Draw
bmp2.Dispose(); bmp2.Dispose();
} }
return AddTexture(w, h, data); return _AddTexture(texture, w, data);
} }
public STexture AddTexture(int w, int h, byte[] data) public STexture AddTexture(int w, int h, byte[] data)
{ {
STexture texture = new STexture(-1, w, h); STexture texture = new STexture(-1, w, h) {W2 = _CheckForNextPowerOf2(w), H2 = _CheckForNextPowerOf2(h)};
return _AddTexture(texture, w, data);
}
Texture t = _CreateTexture(data, ref texture); private STexture _AddTexture(STexture texture, int w, byte[] data)
{
Texture t = _CreateTexture(ref texture, w, data);
lock (_MutexTexture) lock (_MutexTexture)
{ {
@@ -933,13 +919,8 @@ namespace Vocaluxe.Lib.Draw
return texture; return texture;
} }
private Texture _CreateTexture(byte[] data, ref STexture texture) private Texture _CreateTexture(ref STexture texture, int w, byte[] data)
{ {
int w = texture.OrigSize.Width;
int h = texture.OrigSize.Height;
texture.W2 = _CheckForNextPowerOf2(w);
texture.H2 = _CheckForNextPowerOf2(h);
//Create a new texture in the managed pool, which does not need to be recreated on a lost device //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 //because a copy of the texture is hold in the Ram
Texture t = null; Texture t = null;
@@ -1322,7 +1303,9 @@ namespace Vocaluxe.Lib.Draw
STexture texture = _Textures[q.ID]; STexture texture = _Textures[q.ID];
if (q.Width == texture.OrigSize.Width && q.Height == texture.OrigSize.Height) if (q.Width == texture.OrigSize.Width && q.Height == texture.OrigSize.Height)
{ {
Texture t = _CreateTexture(q.Data, ref texture); texture.W2 = _CheckForNextPowerOf2(texture.OrigSize.Width);
texture.H2 = _CheckForNextPowerOf2(texture.OrigSize.Height);
Texture t = _CreateTexture(ref texture, q.Width, q.Data);
_D3DTextures[q.ID] = t; _D3DTextures[q.ID] = t;
_Textures[texture.Index] = texture; _Textures[texture.Index] = texture;
+9 -25
View File
@@ -698,42 +698,26 @@ namespace Vocaluxe.Lib.Draw
break; break;
} }
int w = bmp.Width; STexture texture = new STexture(-1, bmp.Width, bmp.Height) {UseFullTexture = true};
int h = bmp.Height;
if (w > maxSize)
{
h = (int)Math.Round((float)maxSize / bmp.Width * bmp.Height);
if (h == 0)
h = 1;
w = maxSize;
}
if (h > maxSize)
{
w = (int)Math.Round((float)maxSize / bmp.Height * bmp.Width);
if (w == 0)
w = 1;
h = maxSize;
}
STexture texture = new STexture(-1, bmp.Width, bmp.Height){UseFullTexture = true};
int id = GL.GenTexture(); int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id); GL.BindTexture(TextureTarget.Texture2D, id);
texture.ID = id; texture.ID = id;
int w = Math.Min(bmp.Width, maxSize);
int h = Math.Min(bmp.Height, maxSize);
texture.W2 = MathHelper.NextPowerOfTwo(w); texture.W2 = MathHelper.NextPowerOfTwo(w);
texture.H2 = MathHelper.NextPowerOfTwo(h); texture.H2 = MathHelper.NextPowerOfTwo(h);
try try
{ {
using (Bitmap bmp2 = new Bitmap(texture.W2, texture.H2)) using (Bitmap bmp2 = new Bitmap(texture.W2, texture.H2))
{ {
Graphics g = Graphics.FromImage(bmp2); using (Graphics g = Graphics.FromImage(bmp2))
g.InterpolationMode = InterpolationMode.HighQualityBicubic; {
g.SmoothingMode = SmoothingMode.HighQuality; g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height)); g.SmoothingMode = SmoothingMode.HighQuality;
g.Dispose(); g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height));
}
BitmapData bmpData = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); BitmapData bmpData = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);