From 7032958d5b38cf70c4f5b0765529a9160a4a75e9 Mon Sep 17 00:00:00 2001 From: Sarah B Date: Wed, 17 Apr 2024 16:38:11 -0700 Subject: Inital Commit --- .gitignore | 4 ++ Bitmap.cs | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++ SarahEngine.csproj | 14 ++++++ 3 files changed, 144 insertions(+) create mode 100644 .gitignore create mode 100644 Bitmap.cs create mode 100644 SarahEngine.csproj 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 @@ + + + + net8.0 + enable + enable + true + + + + + + + -- cgit