summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSarah B <git@sarahduck.ca>2024-04-17 16:38:11 -0700
committerSarah B <git@sarahduck.ca>2024-04-17 16:38:11 -0700
commit7032958d5b38cf70c4f5b0765529a9160a4a75e9 (patch)
tree62869c3acaffa4de21c1798081b4da766d323416
Inital Commit
-rw-r--r--.gitignore4
-rw-r--r--Bitmap.cs126
-rw-r--r--SarahEngine.csproj14
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>