ReFuel.FreeType/FT.cs

121 lines
4.5 KiB
C#
Raw Permalink Normal View History

2024-03-23 09:56:10 +01:00
using System;
using System.Reflection;
using System.Runtime.InteropServices;
2024-06-20 11:39:15 +02:00
namespace ReFuel.FreeType
2024-03-23 09:56:10 +01:00
{
public static class FT
{
private const string freetype2 = "freetype";
private static readonly string[] LibraryNames = new string[]
{
//FIXME: This is wrong on so many levels, but, i need to do this
// in order to get a change of this running.
"runtimes/win-x64/native/libfreetype.dll",
"runtimes/win-x86/native/libfreetype.dll",
"runtimes/linux-arm/native/libfreetype.so",
"runtimes/linux-arm64/native/libfreetype.so",
"runtimes/linux-x64/native/libfreetype.so",
2024-04-06 15:47:03 +02:00
"runtimes/osx-arm64/libfreetype.dylib",
"runtimes/osx-x64/libfreetype.dylib",
2024-03-23 09:56:10 +01:00
"libfreetype.dll",
"libfreetype.so",
"libfreetype.dylib",
};
static FT()
{
NativeLibrary.SetDllImportResolver(Assembly.GetExecutingAssembly(), Resolver);
}
private static IntPtr Resolver(string libraryName, Assembly assembly, DllImportSearchPath? searchPath)
{
if (libraryName != freetype2)
return IntPtr.Zero;
foreach (string name in LibraryNames)
{
if (NativeLibrary.TryLoad(name, assembly, searchPath, out IntPtr handle))
{
return handle;
}
}
return NativeLibrary.Load(libraryName);
}
[DllImport(freetype2, EntryPoint = "FT_Init_FreeType")]
public static extern FTError InitFreeType(out FTLibrary library);
[DllImport(freetype2, EntryPoint = "FT_Done_FreeType")]
public static extern FTError DoneFreeType(FTLibrary library);
[DllImport(freetype2, EntryPoint = "FT_New_Face")]
public static extern FTError NewFace(
FTLibrary library,
[MarshalAs(UnmanagedType.LPStr)] string path,
long faceIndex,
out FTFace face);
[DllImport(freetype2, EntryPoint = "FT_New_Memory_Face")]
public static extern FTError NewMemoryFace(
FTLibrary library,
IntPtr buffer,
long size,
long faceIndex,
out FTFace face);
[DllImport(freetype2, EntryPoint = "FT_New_Memory_Face")]
public static extern FTError NewMemoryFace(
FTLibrary library,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] byte[] buffer,
long size,
long faceIndex,
out FTFace face);
[DllImport(freetype2, EntryPoint = "FT_New_Memory_Face")]
public static extern FTError NewMemoryFace(
FTLibrary library,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] Span<byte> buffer,
long size,
long faceIndex,
out FTFace face);
// public static extern FTError OpenFace(FTLibrary library, in FTOpenArgs args, long faceIndex, out FTFace face);
// [DllImport(freetype2, EntryPoint = "FT_Attach_File")]
// public static extern FTError AttachFile(FTFace face, [MarshalAs(UnmanagedType.LPStr)] string filePathName);
[DllImport(freetype2, EntryPoint = "FT_Set_Char_Size")]
public static extern FTError SetCharSize(
FTFace library,
long charWidth,
long charHeight,
uint horizontalResolution,
uint verticalResolution);
[DllImport(freetype2, EntryPoint = "FT_Get_Char_Index")]
public static extern uint GetCharIndex(FTFace face, ulong charCode);
[DllImport(freetype2, EntryPoint = "FT_Load_Glyph")]
public static extern FTError LoadGlyph(FTFace face, uint charIndex, FTLoadFlags flags);
[DllImport(freetype2, EntryPoint = "FT_Render_Glyph")]
public static extern FTError RenderGlyph(FTGlyphSlot slot, FTRenderMode mode);
[DllImport(freetype2, EntryPoint = "FT_Done_Face")]
public static extern FTError DoneFace(FTFace face);
[DllImport(freetype2, EntryPoint = "FT_Bitmap_Init")]
public static extern void BitmapInit(ref FTBitmap bitmap);
[DllImport(freetype2, EntryPoint = "FT_Bitmap_Convert")]
public static extern void BitmapConvert(FTLibrary library, in FTBitmap source, ref FTBitmap target,
int alignment);
[DllImport(freetype2, EntryPoint = "FT_Bitmap_Done")]
public static extern void BitmapDone(FTLibrary library, ref FTBitmap bitmap);
}
}