diff options
| author | Sarah B <git@sarahduck.ca> | 2024-04-17 16:38:11 -0700 |
|---|---|---|
| committer | Sarah B <git@sarahduck.ca> | 2024-04-17 16:38:11 -0700 |
| commit | 7032958d5b38cf70c4f5b0765529a9160a4a75e9 (patch) | |
| tree | 62869c3acaffa4de21c1798081b4da766d323416 | |
Inital Commit
| -rw-r--r-- | .gitignore | 4 | ||||
| -rw-r--r-- | Bitmap.cs | 126 | ||||
| -rw-r--r-- | SarahEngine.csproj | 14 |
3 files changed, 144 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c614c3a --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.vscode/ +bin/ +obj/ +config.conf
\ No newline at end of file diff --git a/Bitmap.cs b/Bitmap.cs new file mode 100644 index 0000000..7f7b9d6 --- /dev/null +++ b/Bitmap.cs @@ -0,0 +1,126 @@ +using ZeroElectric.Vinculum; +using System.Runtime.InteropServices; +using System.Numerics; + +namespace SarahEngine; + +public unsafe class Bitmap +{ + Image img; + Texture tex; + + public Vector2 Origin = Vector2.Zero; + + bool imgChanged = false; + + private Bitmap(Image image) + { + img = image; + tex = Raylib.LoadTextureFromImage(img); + } + + void ReloadTexture() + { + Raylib.UnloadTexture(tex); + tex = Raylib.LoadTextureFromImage(img); + } + + public enum ImageType + { + PNG,GIF,JPG,TGA,BMP + } + + static string ImageTypeToString(ImageType type) => type switch + { + ImageType.PNG => ".png", + ImageType.GIF => ".gif", + ImageType.JPG => ".jpg", + ImageType.TGA => ".tga", + ImageType.BMP => ".bmp", + _ => throw new Exception("Image type not supported... How did you get this error??") + }; + + public int Width + { + get => img.width; + set => ResizeCanvas(value, Height); + } + + public int Height + { + get => img.height; + set => ResizeCanvas(Width, value); + } + + public void CenterOrigin() + { + Origin = new(Width/2f, Height/2f); + } + + public byte[] ToMemory(ImageType imageType = ImageType.PNG) + { + byte* ptr = Raylib.ExportImageToMemory(img, ImageTypeToString(imageType), out int length); + byte[] mem = new byte[length]; + Marshal.Copy((nint)ptr, mem, 0, length); + return mem; + } + + public static Bitmap FromMemory(byte[] ImageMemory, ImageType imageType) + { + Image img; + fixed (byte* ptr = &ImageMemory[0]) + img = Raylib.LoadImageFromMemory(ImageTypeToString(imageType), ptr, ImageMemory.Length); + return new Bitmap(img); + } + + public static Bitmap FromFile(string filePath) + { + Image img = Raylib.LoadImage(filePath); + return new Bitmap(img); + } + + public void Crop(Rectangle crop) + { + fixed (Image* imgptr = &img) + Raylib.ImageCrop(imgptr, crop); + imgChanged = true; + } + + public void ResizeCanvas(int newWidth, int newHeight, int offsetX = 0, int offsetY = 0, Color fill = new()) + { + fixed (Image* imgptr = &img) + Raylib.ImageResizeCanvas(imgptr, newWidth, newHeight, offsetX, offsetY, fill); + imgChanged = true; + } + + public void Resize(int newWidth, int newHeight) + { + fixed (Image* imgptr = &img) + Raylib.ImageResize(imgptr, newWidth, newHeight); + imgChanged = true; + } + + public void Draw(Vector2 Position, float Rotation, Vector2 Scale) + { + if (imgChanged) { + ReloadTexture(); + imgChanged = false; + } + + Rectangle source = new(0f, 0f, Width, Height); + Color tint = new(255,255,255,255); + + Position -= Origin*Scale; + Rectangle dest = new(Position.X, Position.Y, Width*Scale.X, Height*Scale.Y); + + Raylib.DrawTexturePro(tex, source, dest, Origin, Rotation, tint); + } + + void Unload() + { + Raylib.UnloadImage(img); + Raylib.UnloadTexture(tex); + } + + ~Bitmap() => Unload(); +} diff --git a/SarahEngine.csproj b/SarahEngine.csproj new file mode 100644 index 0000000..c5b01ae --- /dev/null +++ b/SarahEngine.csproj @@ -0,0 +1,14 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net8.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Raylib-CSharp-Vinculum" Version="5.0.1" /> + </ItemGroup> + +</Project> |
