Manually implement macro functions

All of these get "Function like macro definition records are not supported: [...] Generated bindings may be incomplete."
warnings when running ClangSharp.
This commit is contained in:
Susko3 2024-04-06 14:05:52 +02:00
parent 4b1a1e2102
commit 42b196611d
15 changed files with 383 additions and 0 deletions

16
SDL3-CS/MacroAttribute.cs Normal file
View File

@ -0,0 +1,16 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Diagnostics;
namespace SDL
{
/// <summary>
/// Denotes a manually implemented macro function.
/// Such functions should be excluded from ClangSharp generation to prevent warnings.
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
[Conditional("NEVER")]
internal class MacroAttribute : Attribute;
}

View File

@ -0,0 +1,14 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
namespace SDL
{
public unsafe partial class SDL3
{
[Macro]
public static int SDL_AtomicIncRef(SDL_AtomicInt* a) => SDL_AtomicAdd(a, 1);
[Macro]
public static bool SDL_AtomicDecRef(SDL_AtomicInt* a) => SDL_AtomicAdd(a, -1) == 1;
}
}

View File

@ -31,5 +31,32 @@ namespace SDL
[Constant]
public static readonly SDL_AudioFormat SDL_AUDIO_F32 = BitConverter.IsLittleEndian ? SDL_AudioFormat.SDL_AUDIO_F32LE : SDL_AudioFormat.SDL_AUDIO_F32BE;
[Macro]
public static int SDL_AUDIO_BITSIZE(SDL_AudioFormat x) => (UInt16)x & SDL_AUDIO_MASK_BITSIZE;
[Macro]
public static int SDL_AUDIO_BYTESIZE(SDL_AudioFormat x) => SDL_AUDIO_BITSIZE(x) / 8;
[Macro]
public static bool SDL_AUDIO_ISFLOAT(SDL_AudioFormat x) => ((UInt16)x & SDL_AUDIO_MASK_FLOAT) != 0;
[Macro]
public static bool SDL_AUDIO_ISBIGENDIAN(SDL_AudioFormat x) => ((UInt16)x & SDL_AUDIO_MASK_BIG_ENDIAN) != 0;
[Macro]
public static bool SDL_AUDIO_ISLITTLEENDIAN(SDL_AudioFormat x) => !SDL_AUDIO_ISBIGENDIAN(x);
[Macro]
public static bool SDL_AUDIO_ISSIGNED(SDL_AudioFormat x) => ((UInt16)x & SDL_AUDIO_MASK_SIGNED) != 0;
[Macro]
public static bool SDL_AUDIO_ISINT(SDL_AudioFormat x) => !SDL_AUDIO_ISFLOAT(x);
[Macro]
public static bool SDL_AUDIO_ISUNSIGNED(SDL_AudioFormat x) => !SDL_AUDIO_ISSIGNED(x);
[Macro]
public static int SDL_AUDIO_FRAMESIZE(SDL_AudioSpec x) => SDL_AUDIO_BYTESIZE((x).format) * (x).channels;
}
}

21
SDL3-CS/SDL3/SDL_error.cs Normal file
View File

@ -0,0 +1,21 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
namespace SDL
{
public static partial class SDL3
{
[Macro]
public static int SDL_OutOfMemory() => SDL_Error(SDL_errorcode.SDL_ENOMEM);
[Macro]
public static int SDL_Unsupported() => SDL_Error(SDL_errorcode.SDL_UNSUPPORTED);
[Macro]
public static unsafe int SDL_InvalidParamError([NativeTypeName("const char *")] byte* param)
{
fixed (byte* fmt = "Parameter '%s' is invalid"u8)
return SDL_SetError(fmt, __arglist(param));
}
}
}

View File

@ -0,0 +1,11 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
namespace SDL
{
public static partial class SDL3
{
[Macro]
public static SDL_Keycode SDL_SCANCODE_TO_KEYCODE(SDL_Scancode scancode) => (SDL_Keycode)((int)scancode | SDLK_SCANCODE_MASK);
}
}

View File

@ -7,4 +7,29 @@ namespace SDL
{
[Typedef]
public enum SDL_MouseID : UInt32;
public enum SDLButton
{
SDL_BUTTON_LEFT = SDL3.SDL_BUTTON_LEFT,
SDL_BUTTON_MIDDLE = SDL3.SDL_BUTTON_MIDDLE,
SDL_BUTTON_RIGHT = SDL3.SDL_BUTTON_RIGHT,
SDL_BUTTON_X1 = SDL3.SDL_BUTTON_X1,
SDL_BUTTON_X2 = SDL3.SDL_BUTTON_X2,
}
[Flags]
public enum SDLButtonMask
{
SDL_BUTTON_LMASK = SDL3.SDL_BUTTON_LMASK,
SDL_BUTTON_MMASK = SDL3.SDL_BUTTON_MMASK,
SDL_BUTTON_RMASK = SDL3.SDL_BUTTON_RMASK,
SDL_BUTTON_X1MASK = SDL3.SDL_BUTTON_X1MASK,
SDL_BUTTON_X2MASK = SDL3.SDL_BUTTON_X2MASK,
}
public static partial class SDL3
{
[Macro]
public static SDLButtonMask SDL_BUTTON(SDLButton button) => (SDLButtonMask)(1 << ((int)button - 1));
}
}

View File

@ -8,9 +8,30 @@ namespace SDL
[Typedef]
public enum SDL_PenID : UInt32;
[Flags]
public enum SDL_PEN_CAPABILITIES : uint
{
SDL_PEN_DOWN_MASK = SDL3.SDL_PEN_DOWN_MASK,
SDL_PEN_INK_MASK = SDL3.SDL_PEN_INK_MASK,
SDL_PEN_ERASER_MASK = SDL3.SDL_PEN_ERASER_MASK,
SDL_PEN_AXIS_PRESSURE_MASK = SDL3.SDL_PEN_AXIS_PRESSURE_MASK,
SDL_PEN_AXIS_XTILT_MASK = SDL3.SDL_PEN_AXIS_XTILT_MASK,
SDL_PEN_AXIS_YTILT_MASK = SDL3.SDL_PEN_AXIS_YTILT_MASK,
SDL_PEN_AXIS_DISTANCE_MASK = SDL3.SDL_PEN_AXIS_DISTANCE_MASK,
SDL_PEN_AXIS_ROTATION_MASK = SDL3.SDL_PEN_AXIS_ROTATION_MASK,
SDL_PEN_AXIS_SLIDER_MASK = SDL3.SDL_PEN_AXIS_SLIDER_MASK,
SDL_PEN_AXIS_BIDIRECTIONAL_MASKS = SDL3.SDL_PEN_AXIS_BIDIRECTIONAL_MASKS,
}
public static partial class SDL3
{
[Constant]
public const SDL_MouseID SDL_PEN_MOUSEID = unchecked((SDL_MouseID)(-2));
[Macro]
public static SDL_PEN_CAPABILITIES SDL_PEN_CAPABILITY(int capbit) => (SDL_PEN_CAPABILITIES)(1ul << (capbit));
[Macro]
public static SDL_PEN_CAPABILITIES SDL_PEN_AXIS_CAPABILITY(SDL_PenAxis axis) => SDL_PEN_CAPABILITY((int)axis + SDL_PEN_FLAG_AXIS_BIT_OFFSET);
}
}

137
SDL3-CS/SDL3/SDL_pixels.cs Normal file
View File

@ -0,0 +1,137 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
namespace SDL
{
using static SDL_PixelFormatEnum;
using static SDL_PixelType;
using static SDL_PackedOrder;
using static SDL_PackedLayout;
using static SDL_MatrixCoefficients;
using static SDL_ColorRange;
public static partial class SDL3
{
[Macro]
public static SDL_PixelFormatEnum SDL_DEFINE_PIXELFOURCC(byte A, byte B, byte C, byte D) => (SDL_PixelFormatEnum)SDL_FOURCC(A, B, C, D);
[Macro]
public static SDL_PixelFormatEnum SDL_DEFINE_PIXELFORMAT(int type, int order, int layout, int bits, int bytes)
=> (SDL_PixelFormatEnum)((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) |
((bits) << 8) | ((bytes) << 0));
[Macro]
public static int SDL_PIXELFLAG(SDL_PixelFormatEnum X) => ((int)X >> 28) & 0x0F;
[Macro]
public static SDL_PixelType SDL_PIXELTYPE(SDL_PixelFormatEnum X) => (SDL_PixelType)(((int)X >> 24) & 0x0F);
[Macro]
public static SDL_PackedOrder SDL_PIXELORDER(SDL_PixelFormatEnum X) => (SDL_PackedOrder)(((int)X >> 20) & 0x0F);
[Macro]
public static SDL_PackedLayout SDL_PIXELLAYOUT(SDL_PixelFormatEnum X) => (SDL_PackedLayout)(((int)X >> 16) & 0x0F);
[Macro]
public static int SDL_BITSPERPIXEL(SDL_PixelFormatEnum X) => ((int)X >> 8) & 0xFF;
[Macro]
public static int SDL_BYTESPERPIXEL(SDL_PixelFormatEnum X) =>
(SDL_ISPIXELFORMAT_FOURCC(X)
? ((((X) == SDL_PIXELFORMAT_YUY2) ||
((X) == SDL_PIXELFORMAT_UYVY) ||
((X) == SDL_PIXELFORMAT_YVYU) ||
((X) == SDL_PIXELFORMAT_P010))
? 2
: 1)
: ((((int)X) >> 0) & 0xFF));
[Macro]
public static bool SDL_ISPIXELFORMAT_INDEXED(SDL_PixelFormatEnum format) =>
(!SDL_ISPIXELFORMAT_FOURCC(format) &&
((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX2) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8)));
[Macro]
public static bool SDL_ISPIXELFORMAT_PACKED(SDL_PixelFormatEnum format) =>
(!SDL_ISPIXELFORMAT_FOURCC(format) &&
((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED8) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED16) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32)));
[Macro]
public static bool SDL_ISPIXELFORMAT_ARRAY(SDL_PixelFormatEnum format) =>
(!SDL_ISPIXELFORMAT_FOURCC(format) &&
((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU16) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU32) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32)));
[Macro]
public static bool SDL_ISPIXELFORMAT_ALPHA(SDL_PixelFormatEnum format) =>
((SDL_ISPIXELFORMAT_PACKED(format) &&
((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) ||
(SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) ||
(SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) ||
(SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))));
[Macro]
public static bool SDL_ISPIXELFORMAT_10BIT(SDL_PixelFormatEnum format) =>
(!SDL_ISPIXELFORMAT_FOURCC(format) &&
((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32) &&
(SDL_PIXELLAYOUT(format) == SDL_PACKEDLAYOUT_2101010)));
[Macro]
public static bool SDL_ISPIXELFORMAT_FLOAT(SDL_PixelFormatEnum format) =>
(!SDL_ISPIXELFORMAT_FOURCC(format) &&
((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) ||
(SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32)));
[Macro]
public static bool SDL_ISPIXELFORMAT_FOURCC(SDL_PixelFormatEnum format) =>
((format != 0) && (SDL_PIXELFLAG(format) != 1));
[Macro]
public static SDL_Colorspace SDL_DEFINE_COLORSPACE(UInt32 type, UInt32 range, UInt32 primaries, UInt32 transfer, UInt32 matrix, UInt32 chroma)
=> (SDL_Colorspace)(((type) << 28) | ((range) << 24) | ((chroma) << 20) |
((primaries) << 10) | ((transfer) << 5) | ((matrix) << 0));
[Macro]
public static SDL_ColorType SDL_COLORSPACETYPE(SDL_Colorspace X) => (SDL_ColorType)(((int)X >> 28) & 0x0F);
[Macro]
public static SDL_ColorRange SDL_COLORSPACERANGE(SDL_Colorspace X) => (SDL_ColorRange)(((int)X >> 24) & 0x0F);
[Macro]
public static SDL_ChromaLocation SDL_COLORSPACECHROMA(SDL_Colorspace X) => (SDL_ChromaLocation)(((int)X >> 20) & 0x0F);
[Macro]
public static SDL_ColorPrimaries SDL_COLORSPACEPRIMARIES(SDL_Colorspace X) => (SDL_ColorPrimaries)(((int)X >> 10) & 0x1F);
[Macro]
public static SDL_TransferCharacteristics SDL_COLORSPACETRANSFER(SDL_Colorspace X) => (SDL_TransferCharacteristics)(((int)X >> 5) & 0x1F);
[Macro]
public static SDL_MatrixCoefficients SDL_COLORSPACEMATRIX(SDL_Colorspace X) => (SDL_MatrixCoefficients)((int)X & 0x1F);
[Macro]
public static bool SDL_ISCOLORSPACE_MATRIX_BT601(SDL_Colorspace X) => (SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT601 || SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT470BG);
[Macro]
public static bool SDL_ISCOLORSPACE_MATRIX_BT709(SDL_Colorspace X) => (SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT709);
[Macro]
public static bool SDL_ISCOLORSPACE_MATRIX_BT2020_NCL(SDL_Colorspace X) => (SDL_COLORSPACEMATRIX(X) == SDL_MATRIX_COEFFICIENTS_BT2020_NCL);
[Macro]
public static bool SDL_ISCOLORSPACE_LIMITED_RANGE(SDL_Colorspace X) => (SDL_COLORSPACERANGE(X) != SDL_COLOR_RANGE_FULL);
[Macro]
public static bool SDL_ISCOLORSPACE_FULL_RANGE(SDL_Colorspace X) => (SDL_COLORSPACERANGE(X) == SDL_COLOR_RANGE_FULL);
}
}

15
SDL3-CS/SDL3/SDL_quit.cs Normal file
View File

@ -0,0 +1,15 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
namespace SDL
{
public partial class SDL3
{
[Macro]
public static unsafe bool SDL_QuitRequested()
{
SDL_PumpEvents();
return SDL_PeepEvents(null, 0, SDL_eventaction.SDL_PEEKEVENT, (uint)SDL_EventType.SDL_EVENT_QUIT, (uint)SDL_EventType.SDL_EVENT_QUIT) > 0;
}
}
}

View File

@ -14,4 +14,10 @@ namespace SDL
[Typedef]
public enum SDL_Time : Int64;
public partial class SDL3
{
[Macro]
public static uint SDL_FOURCC(byte A, byte B, byte C, byte D) => (uint)((A << 0) | (B << 8) | (C << 16) | (D << 24));
}
}

View File

@ -0,0 +1,11 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
namespace SDL
{
public static partial class SDL3
{
[Macro]
public static unsafe bool SDL_MUSTLOCK(SDL_Surface* S) => (((S)->flags & SDL_RLEACCEL) != 0);
}
}

View File

@ -0,0 +1,21 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Runtime.Versioning;
namespace SDL
{
public static partial class SDL3
{
[SupportedOSPlatform("iOS")]
[Macro]
public static unsafe int SDL_iOSSetAnimationCallback(SDL_Window* window, int interval, delegate* unmanaged[Cdecl]<IntPtr, void> callback, IntPtr callbackParam)
=> SDL_iPhoneSetAnimationCallback(window, interval, callback, callbackParam);
[SupportedOSPlatform("iOS")]
[Macro]
public static void SDL_iOSSetEventPump(SDL_bool enabled)
=> SDL_iPhoneSetEventPump(enabled);
}
}

View File

@ -7,4 +7,25 @@ namespace SDL
{
[Typedef]
public enum SDL_TimerID : UInt32;
public static partial class SDL3
{
[Macro]
public static UInt64 SDL_SECONDS_TO_NS(UInt64 S) => (((UInt64)(S)) * SDL_NS_PER_SECOND);
[Macro]
public static UInt64 SDL_NS_TO_SECONDS(UInt64 NS) => ((NS) / SDL_NS_PER_SECOND);
[Macro]
public static UInt64 SDL_MS_TO_NS(UInt64 MS) => (((UInt64)(MS)) * SDL_NS_PER_MS);
[Macro]
public static UInt64 SDL_NS_TO_MS(UInt64 NS) => ((NS) / SDL_NS_PER_MS);
[Macro]
public static UInt64 SDL_US_TO_NS(UInt64 US) => (((UInt64)(US)) * SDL_NS_PER_US);
[Macro]
public static UInt64 SDL_NS_TO_US(UInt64 NS) => ((NS) / SDL_NS_PER_US);
}
}

View File

@ -0,0 +1,22 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
namespace SDL
{
public static partial class SDL3
{
[Macro]
public static void SDL_VERSION(ref SDL_Version version)
{
version.major = SDL_MAJOR_VERSION;
version.minor = SDL_MINOR_VERSION;
version.patch = SDL_PATCHLEVEL;
}
[Macro]
public static int SDL_VERSIONNUM(int X, int Y, int Z) => ((X) << 24 | (Y) << 8 | (Z) << 0);
[Macro]
public static bool SDL_VERSION_ATLEAST(int X, int Y, int Z) => SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z);
}
}

View File

@ -39,4 +39,19 @@ namespace SDL
SDL_WINDOW_TRANSPARENT = SDL3.SDL_WINDOW_TRANSPARENT,
SDL_WINDOW_NOT_FOCUSABLE = SDL3.SDL_WINDOW_NOT_FOCUSABLE,
}
public static partial class SDL3
{
[Macro]
public static int SDL_WINDOWPOS_UNDEFINED_DISPLAY(int X) => (int)(SDL_WINDOWPOS_UNDEFINED_MASK | (X));
[Macro]
public static bool SDL_WINDOWPOS_ISUNDEFINED(int X) => (((X) & 0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK);
[Macro]
public static int SDL_WINDOWPOS_CENTERED_DISPLAY(int X) => (int)(SDL_WINDOWPOS_CENTERED_MASK | (X));
[Macro]
public static bool SDL_WINDOWPOS_ISCENTERED(int X) => (((X) & 0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK);
}
}