feyris-tan ef86554f9a Import
2025-05-12 22:09:16 +02:00

114 lines
3.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SDL2;
namespace testdrid.SdlWrapper
{
internal class Renderer : IDisposable
{
private Renderer() { }
internal IntPtr Pointer { get; set; }
public static Renderer Create(Window targetWindow)
{
return Create(targetWindow, -1, SDL.SDL_RendererFlags.SDL_RENDERER_ACCELERATED | SDL.SDL_RendererFlags.SDL_RENDERER_PRESENTVSYNC);
}
public static Renderer Create(Window targetWindow, int index, SDL.SDL_RendererFlags flags)
{
Renderer child = new Renderer();
child.Pointer = SDL.SDL_CreateRenderer(targetWindow.Pointer, index, flags);
if (child.Pointer == IntPtr.Zero)
{
throw SdlException.GenerateException();
}
return child;
}
public void Dispose()
{
SDL.SDL_DestroyRenderer(Pointer);
Pointer = IntPtr.Zero;
}
public void Clear()
{
SDL.SDL_RenderClear(Pointer);
}
public void Copy(Texture texture)
{
int sdlRenderCopy = SDL.SDL_RenderCopy(this.Pointer, texture.Pointer, IntPtr.Zero, IntPtr.Zero);
if (sdlRenderCopy != 0)
throw SdlException.GenerateException();
}
public void Copy(Texture texture, ref SDL.SDL_Rect sourceRect, ref SDL.SDL_Rect targetRect)
{
int sdlRenderCopy = SDL.SDL_RenderCopy(this.Pointer, texture.Pointer, ref sourceRect, ref targetRect);
if (sdlRenderCopy != 0)
throw SdlException.GenerateException();
}
public void Copy(Texture texture, Point targetPoint)
{
SDL.SDL_Rect targetRect = new SDL.SDL_Rect();
targetRect.x = targetPoint.X;
targetRect.y = targetPoint.Y;
targetRect.w = texture.GetWidth();
targetRect.h = texture.GetHeight();
int sdlRenderCopy = SDL.SDL_RenderCopy(this.Pointer, texture.Pointer, IntPtr.Zero, ref targetRect);
if (sdlRenderCopy != 0)
throw SdlException.GenerateException();
}
public void Copy(Texture texture, Rectangle rectangle)
{
SDL.SDL_Rect targetRect = new SDL.SDL_Rect();
targetRect.x = rectangle.X;
targetRect.y = rectangle.Y;
targetRect.w = rectangle.Width;
targetRect.h = rectangle.Height;
int sdlRenderCopy = SDL.SDL_RenderCopy(this.Pointer, texture.Pointer, IntPtr.Zero, ref targetRect);
if (sdlRenderCopy != 0)
throw SdlException.GenerateException();
}
public void SetDrawBlendMode(SDL.SDL_BlendMode blendMode)
{
int result = SDL.SDL_SetRenderDrawBlendMode(Pointer, blendMode);
if (result != 0)
throw SdlException.GenerateException();
}
public void Present()
{
lock (Lockable)
{
SDL.SDL_RenderPresent(Pointer);
}
}
private static object _lockable;
public static object Lockable
{
get
{
if (_lockable == null)
_lockable = new object();
return _lockable;
}
}
}
}