Files
LuaCsForBarotraumaEP/Libraries/MonoGame.Framework/Src/MonoGame.Framework/Graphics/Texture.cs
Joonas Rikkonen f433a7ba10 v0.11.0.9
2020-12-09 16:34:16 +02:00

128 lines
3.6 KiB
C#

// MonoGame - Copyright (C) The MonoGame Team
// This file is subject to the terms and conditions defined in
// file 'LICENSE.txt', which is part of this source code package.
using System;
using System.Diagnostics;
using System.Threading;
namespace Microsoft.Xna.Framework.Graphics
{
public abstract partial class Texture : GraphicsResource
{
internal SurfaceFormat _format;
internal int _levelCount;
private readonly int _sortingKey = Interlocked.Increment(ref _lastSortingKey);
private static int _lastSortingKey;
/// <summary>
/// Gets a unique identifier of this texture for sorting purposes.
/// </summary>
/// <remarks>
/// <para>For example, this value is used by <see cref="SpriteBatch"/> when drawing with <see cref="SpriteSortMode.Texture"/>.</para>
/// <para>The value is an implementation detail and may change between application launches or MonoGame versions.
/// It is only guaranteed to stay consistent during application lifetime.</para>
/// </remarks>
public int SortingKey
{
get { return _sortingKey; }
}
public SurfaceFormat Format
{
get { return _format; }
}
public int LevelCount
{
get { return _levelCount; }
}
internal static int CalculateMipLevels(int width, int height = 0, int depth = 0)
{
int levels = 1;
int size = Math.Max(Math.Max(width, height), depth);
while (size > 1)
{
size = size / 2;
levels++;
}
return levels;
}
internal static void GetSizeForLevel(int width, int height, int level, out int w, out int h)
{
w = width;
h = height;
while (level > 0)
{
--level;
w /= 2;
h /= 2;
}
if (w == 0)
w = 1;
if (h == 0)
h = 1;
}
internal static void GetSizeForLevel(int width, int height, int depth, int level, out int w, out int h, out int d)
{
w = width;
h = height;
d = depth;
while (level > 0)
{
--level;
w /= 2;
h /= 2;
d /= 2;
}
if (w == 0)
w = 1;
if (h == 0)
h = 1;
if (d == 0)
d = 1;
}
internal int GetPitch(int width)
{
Debug.Assert(width > 0, "The width is negative!");
int pitch;
switch (_format)
{
case SurfaceFormat.Dxt1:
case SurfaceFormat.Dxt1SRgb:
case SurfaceFormat.Dxt1a:
case SurfaceFormat.RgbPvrtc2Bpp:
case SurfaceFormat.RgbaPvrtc2Bpp:
case SurfaceFormat.RgbEtc1:
case SurfaceFormat.Dxt3:
case SurfaceFormat.Dxt3SRgb:
case SurfaceFormat.Dxt5:
case SurfaceFormat.Dxt5SRgb:
case SurfaceFormat.RgbPvrtc4Bpp:
case SurfaceFormat.RgbaPvrtc4Bpp:
pitch = ((width + 3) / 4) * _format.GetSize();
break;
default:
pitch = width * _format.GetSize();
break;
};
return pitch;
}
internal protected override void GraphicsDeviceResetting()
{
PlatformGraphicsDeviceResetting();
}
}
}