/// /// @file CAPI.h /// /// @brief The C-language API for Ultralight /// /// @author /// /// This file is a part of Ultralight, a fast, lightweight, HTML UI engine /// /// Website: /// /// Copyright (C) 2020 Ultralight, Inc. All rights reserved. /// #ifndef ULTRALIGHT_CAPI_H #define ULTRALIGHT_CAPI_H #ifndef __cplusplus //#include #endif #include #include #ifdef __OBJC__ #import #endif #if defined(__WIN32__) || defined(_WIN32) # if defined(ULTRALIGHT_IMPLEMENTATION) # define ULExport __declspec(dllexport) # else # define ULExport __declspec(dllimport) # endif #define _thread_local __declspec(thread) #ifndef _NATIVE_WCHAR_T_DEFINED #define DISABLE_NATIVE_WCHAR_T typedef unsigned short ULChar16; #else typedef wchar_t ULChar16; #endif #else # define ULExport __attribute__((visibility("default"))) #define _thread_local __thread typedef unsigned short ULChar16; #endif #ifdef __cplusplus extern "C" { #endif typedef struct C_Config* ULConfig; typedef struct C_Renderer* ULRenderer; typedef struct C_Session* ULSession; typedef struct C_View* ULView; typedef struct C_Bitmap* ULBitmap; typedef struct C_String* ULString; typedef struct C_Buffer* ULBuffer; typedef struct C_KeyEvent* ULKeyEvent; typedef struct C_MouseEvent* ULMouseEvent; typedef struct C_ScrollEvent* ULScrollEvent; typedef struct C_Surface* ULSurface; typedef struct C_Surface* ULBitmapSurface; typedef enum { kMessageSource_XML = 0, kMessageSource_JS, kMessageSource_Network, kMessageSource_ConsoleAPI, kMessageSource_Storage, kMessageSource_AppCache, kMessageSource_Rendering, kMessageSource_CSS, kMessageSource_Security, kMessageSource_ContentBlocker, kMessageSource_Other, } ULMessageSource; typedef enum { kMessageLevel_Log = 1, kMessageLevel_Warning = 2, kMessageLevel_Error = 3, kMessageLevel_Debug = 4, kMessageLevel_Info = 5, } ULMessageLevel; typedef enum { kCursor_Pointer = 0, kCursor_Cross, kCursor_Hand, kCursor_IBeam, kCursor_Wait, kCursor_Help, kCursor_EastResize, kCursor_NorthResize, kCursor_NorthEastResize, kCursor_NorthWestResize, kCursor_SouthResize, kCursor_SouthEastResize, kCursor_SouthWestResize, kCursor_WestResize, kCursor_NorthSouthResize, kCursor_EastWestResize, kCursor_NorthEastSouthWestResize, kCursor_NorthWestSouthEastResize, kCursor_ColumnResize, kCursor_RowResize, kCursor_MiddlePanning, kCursor_EastPanning, kCursor_NorthPanning, kCursor_NorthEastPanning, kCursor_NorthWestPanning, kCursor_SouthPanning, kCursor_SouthEastPanning, kCursor_SouthWestPanning, kCursor_WestPanning, kCursor_Move, kCursor_VerticalText, kCursor_Cell, kCursor_ContextMenu, kCursor_Alias, kCursor_Progress, kCursor_NoDrop, kCursor_Copy, kCursor_None, kCursor_NotAllowed, kCursor_ZoomIn, kCursor_ZoomOut, kCursor_Grab, kCursor_Grabbing, kCursor_Custom } ULCursor; typedef enum { /// /// Alpha channel only, 8-bits per pixel. /// /// Encoding: 8-bits per channel, unsigned normalized. /// /// Color-space: Linear (no gamma), alpha-coverage only. /// kBitmapFormat_A8_UNORM, /// /// Blue Green Red Alpha channels, 32-bits per pixel. /// /// Encoding: 8-bits per channel, unsigned normalized. /// /// Color-space: sRGB gamma with premultiplied linear alpha channel. /// kBitmapFormat_BGRA8_UNORM_SRGB } ULBitmapFormat; typedef enum { /// /// Key-Down event type. (Does not trigger accelerator commands in WebCore) /// /// @NOTE: You should probably use RawKeyDown instead when a physical key /// is pressed. This member is only here for historic compatibility /// with WebCore's key event types. /// kKeyEventType_KeyDown, /// /// Key-Up event type. Use this when a physical key is released. /// kKeyEventType_KeyUp, /// /// Raw Key-Down type. Use this when a physical key is pressed. /// /// @NOTE: You should use RawKeyDown for physical key presses since it /// allows WebCore to do additional command translation. /// kKeyEventType_RawKeyDown, /// /// Character input event type. Use this when the OS generates text from /// a physical key being pressed (eg, WM_CHAR on Windows). /// kKeyEventType_Char, } ULKeyEventType; typedef enum { kMouseEventType_MouseMoved, kMouseEventType_MouseDown, kMouseEventType_MouseUp, } ULMouseEventType; typedef enum { kMouseButton_None = 0, kMouseButton_Left, kMouseButton_Middle, kMouseButton_Right, } ULMouseButton; typedef enum { kScrollEventType_ScrollByPixel, kScrollEventType_ScrollByPage, } ULScrollEventType; typedef enum { kFaceWinding_Clockwise, kFaceWindow_CounterClockwise, } ULFaceWinding; typedef enum { /// /// Lighter hinting algorithm-- glyphs are slightly fuzzier but better /// resemble their original shape. This is achieved by snapping glyphs to the /// pixel grid only vertically which better preserves inter-glyph spacing. /// kFontHinting_Smooth, /// /// Default hinting algorithm-- offers a good balance between sharpness and /// shape at smaller font sizes. /// kFontHinting_Normal, /// /// Strongest hinting algorithm-- outputs only black/white glyphs. The result /// is usually unpleasant if the underlying TTF does not contain hints for /// this type of rendering. /// kFontHinting_Monochrome, } ULFontHinting; typedef struct { float left; float top; float right; float bottom; } ULRect; typedef struct { int left; int top; int right; int bottom; } ULIntRect; typedef struct { bool is_empty; unsigned int width; unsigned int height; unsigned int texture_id; unsigned int texture_width; unsigned int texture_height; ULBitmapFormat texture_format; ULRect uv_coords; unsigned int render_buffer_id; } ULRenderTarget; /****************************************************************************** * API Note: * * You should only destroy objects that you explicitly create. Do not destroy * any objects returned from the API or callbacks unless otherwise noted. *****************************************************************************/ /****************************************************************************** * Version *****************************************************************************/ /// /// Get the version string of the library in MAJOR.MINOR.PATCH format. /// ULExport const char* ulVersionString(); /// /// Get the numeric major version of the library. /// ULExport unsigned int ulVersionMajor(); /// /// Get the numeric minor version of the library. /// ULExport unsigned int ulVersionMinor(); /// /// Get the numeric patch version of the library. /// ULExport unsigned int ulVersionPatch(); /****************************************************************************** * Config *****************************************************************************/ /// /// Create config with default values (see ). /// ULExport ULConfig ulCreateConfig(); /// /// Destroy config. /// ULExport void ulDestroyConfig(ULConfig config); /// /// Set the file path to the directory that contains Ultralight's bundled /// resources (eg, cacert.pem and other localized resources). /// ULExport void ulConfigSetResourcePath(ULConfig config, ULString resource_path); /// /// Set the file path to a writable directory that will be used to store /// cookies, cached resources, and other persistent data. /// ULExport void ulConfigSetCachePath(ULConfig config, ULString cache_path); /// /// When enabled, each View will be rendered to an offscreen GPU texture /// using the GPU driver set in ulPlatformSetGPUDriver. You can fetch /// details for the texture via ulViewGetRenderTarget. /// /// When disabled (the default), each View will be rendered to an offscreen /// pixel buffer. This pixel buffer can optionally be provided by the user-- /// for more info see ulViewGetSurface. /// ULExport void ulConfigSetUseGPURenderer(ULConfig config, bool use_gpu); /// /// Set the amount that the application DPI has been scaled, used for /// scaling device coordinates to pixels and oversampling raster shapes /// (Default = 1.0). /// ULExport void ulConfigSetDeviceScale(ULConfig config, double value); /// /// The winding order for front-facing triangles. @see FaceWinding /// /// Note: This is only used with custom GPUDrivers /// ULExport void ulConfigSetFaceWinding(ULConfig config, ULFaceWinding winding); /// /// Set whether images should be enabled (Default = True). /// ULExport void ulConfigSetEnableImages(ULConfig config, bool enabled); /// /// Set whether JavaScript should be eanbled (Default = True). /// ULExport void ulConfigSetEnableJavaScript(ULConfig config, bool enabled); /// /// The hinting algorithm to use when rendering fonts. (Default = kFontHinting_Normal) /// @see ULFontHinting /// ULExport void ulConfigSetFontHinting(ULConfig config, ULFontHinting font_hinting); /// /// The gamma to use when compositing font glyphs, change this value to /// adjust contrast (Adobe and Apple prefer 1.8, others may prefer 2.2). /// (Default = 1.8) /// ULExport void ulConfigSetFontGamma(ULConfig config, double font_gamma); /// /// Set default font-family to use (Default = Times New Roman). /// ULExport void ulConfigSetFontFamilyStandard(ULConfig config, ULString font_name); /// /// Set default font-family to use for fixed fonts, eg
 and 
/// (Default = Courier New).
///
ULExport void ulConfigSetFontFamilyFixed(ULConfig config, ULString font_name);

///
/// Set default font-family to use for serif fonts (Default = Times New Roman).
///
ULExport void ulConfigSetFontFamilySerif(ULConfig config, ULString font_name);

///
/// Set default font-family to use for sans-serif fonts (Default = Arial).
///
ULExport void ulConfigSetFontFamilySansSerif(ULConfig config,
                                             ULString font_name);

///
/// Set user agent string (See  for the default).
///
ULExport void ulConfigSetUserAgent(ULConfig config, ULString agent_string);

///
/// Set user stylesheet (CSS) (Default = Empty).
///
ULExport void ulConfigSetUserStylesheet(ULConfig config, ULString css_string);

///
/// Set whether or not we should continuously repaint any Views or compositor
/// layers, regardless if they are dirty or not. This is mainly used to
/// diagnose painting/shader issues. (Default = False)
///
ULExport void ulConfigSetForceRepaint(ULConfig config, bool enabled);

///
/// Set the amount of time to wait before triggering another repaint when a
/// CSS animation is active. (Default = 1.0 / 60.0)
///
ULExport void ulConfigSetAnimationTimerDelay(ULConfig config, double delay);

///
/// When a smooth scroll animation is active, the amount of time (in seconds)
/// to wait before triggering another repaint. Default is 60 Hz.
///
ULExport void ulConfigSetScrollTimerDelay(ULConfig config, double delay);

///
/// The amount of time (in seconds) to wait before running the recycler (will
/// attempt to return excess memory back to the system). (Default = 4.0)
///
ULExport void ulConfigSetRecycleDelay(ULConfig config, double delay);

///
/// Set the size of WebCore's memory cache for decoded images, scripts, and
/// other assets in bytes. (Default = 64 * 1024 * 1024)
///
ULExport void ulConfigSetMemoryCacheSize(ULConfig config, unsigned int size);

///
/// Set the number of pages to keep in the cache. (Default = 0)
///
ULExport void ulConfigSetPageCacheSize(ULConfig config, unsigned int size);

///
/// JavaScriptCore tries to detect the system's physical RAM size to set
/// reasonable allocation limits. Set this to anything other than 0 to
/// override the detected value. Size is in bytes.
///
/// This can be used to force JavaScriptCore to be more conservative with
/// its allocation strategy (at the cost of some performance).
///
ULExport void ulConfigSetOverrideRAMSize(ULConfig config, unsigned int size);

///
/// The minimum size of large VM heaps in JavaScriptCore. Set this to a
/// lower value to make these heaps start with a smaller initial value.
///
ULExport void ulConfigSetMinLargeHeapSize(ULConfig config, unsigned int size);

///
/// The minimum size of small VM heaps in JavaScriptCore. Set this to a
/// lower value to make these heaps start with a smaller initial value.
///
ULExport void ulConfigSetMinSmallHeapSize(ULConfig config, unsigned int size);

/******************************************************************************
 * Renderer
 *****************************************************************************/

///
/// Create the Ultralight Renderer directly.
///
/// Unlike ulCreateApp(), this does not use any native windows for drawing
/// and allows you to manage your own runloop and painting. This method is
/// recommended for those wishing to integrate the library into a game.
///
/// This singleton manages the lifetime of all Views and coordinates all
/// painting, rendering, network requests, and event dispatch.
///
/// You should only call this once per process lifetime.
///
/// You shoud set up your platform handlers (eg, ulPlatformSetLogger,
/// ulPlatformSetFileSystem, etc.) before calling this.
///
/// You will also need to define a font loader before calling this-- 
/// as of this writing (v1.2) the only way to do this in C API is by calling
/// ulEnablePlatformFontLoader() (available in ).
///
/// @NOTE:  You should not call this if you are using ulCreateApp(), it
///         creates its own renderer and provides default implementations for
///         various platform handlers automatically.
///
ULExport ULRenderer ulCreateRenderer(ULConfig config);

///
/// Destroy the renderer.
///
ULExport void ulDestroyRenderer(ULRenderer renderer);

///
/// Update timers and dispatch internal callbacks (JavaScript and network).
///
ULExport void ulUpdate(ULRenderer renderer);

///
/// Render all active Views.
///
ULExport void ulRender(ULRenderer renderer);

///
/// Attempt to release as much memory as possible. Don't call this from any
/// callbacks or driver code.
///
ULExport void ulPurgeMemory(ULRenderer renderer);

///
/// Print detailed memory usage statistics to the log.
/// (@see ulPlatformSetLogger)
///
ULExport void ulLogMemoryUsage(ULRenderer renderer);

/******************************************************************************
 * Session
 *****************************************************************************/

///
/// Create a Session to store local data in (such as cookies, local storage,
/// application cache, indexed db, etc).
///
ULExport ULSession ulCreateSession(ULRenderer renderer, bool is_persistent,
                                   ULString name);

///
/// Destroy a Session.
///
ULExport void ulDestroySession(ULSession session);

///
/// Get the default session (persistent session named "default").
///
/// @note  This session is owned by the Renderer, you shouldn't destroy it.
///
ULExport ULSession ulDefaultSession(ULRenderer renderer);

///
/// Whether or not is persistent (backed to disk).
///
ULExport bool ulSessionIsPersistent(ULSession session);

///
/// Unique name identifying the session (used for unique disk path).
///
ULExport ULString ulSessionGetName(ULSession session);

///
/// Unique numeric Id for the session.
///
ULExport unsigned long long ulSessionGetId(ULSession session);

///
/// The disk path to write to (used by persistent sessions only).
///
ULExport ULString ulSessionGetDiskPath(ULSession session);

/******************************************************************************
 * View
 *****************************************************************************/

///
/// Create a View with certain size (in pixels).
///
/// @note  You can pass null to 'session' to use the default session.
///
ULExport ULView ulCreateView(ULRenderer renderer, unsigned int width,
                             unsigned int height, bool transparent,
                             ULSession session, bool force_cpu_renderer);

///
/// Destroy a View.
///
ULExport void ulDestroyView(ULView view);

///
/// Get current URL.
///
/// @note Don't destroy the returned string, it is owned by the View.
///
ULExport ULString ulViewGetURL(ULView view);

///
/// Get current title.
///
/// @note Don't destroy the returned string, it is owned by the View.
///
ULExport ULString ulViewGetTitle(ULView view);

///
/// Get the width, in pixels.
///
ULExport unsigned int ulViewGetWidth(ULView view);

///
/// Get the height, in pixels.
///
ULExport unsigned int ulViewGetHeight(ULView view);

///
/// Check if main frame is loading.
///
ULExport bool ulViewIsLoading(ULView view);

///
/// Get the RenderTarget for the View.
///
/// @note  Only valid when the GPU renderer is enabled in Config.
///
ULExport ULRenderTarget ulViewGetRenderTarget(ULView view);

///
/// Get the Surface for the View (native pixel buffer container).
///
/// @note  Only valid when the GPU renderer is disabled in Config.
///
///        (Will return a nullptr when the GPU renderer is enabled.)
///
///        The default Surface is BitmapSurface but you can provide your
///        own Surface implementation via ulPlatformSetSurfaceDefinition.
///
///        When using the default Surface, you can retrieve the underlying
///        bitmap by casting ULSurface to ULBitmapSurface and calling
///        ulBitmapSurfaceGetBitmap().
///
ULExport ULSurface ulViewGetSurface(ULView view);

///
/// Load a raw string of HTML.
///
ULExport void ulViewLoadHTML(ULView view, ULString html_string);

///
/// Load a URL into main frame.
///
ULExport void ulViewLoadURL(ULView view, ULString url_string);

///
/// Resize view to a certain width and height (in pixels).
///
ULExport void ulViewResize(ULView view, unsigned int width,
                           unsigned int height);

///
/// Acquire the page's JSContext for use with JavaScriptCore API.
/// 
/// @note  This call locks the context for the current thread. You should
///        call ulViewUnlockJSContext() after using the context so other
///        worker threads can modify JavaScript state.
///
/// @note  The lock is recusive, it's okay to call this multiple times as long
///        as you call ulViewUnlockJSContext() the same number of times.
///
ULExport JSContextRef ulViewLockJSContext(ULView view);

///
/// Unlock the page's JSContext after a previous call to ulViewLockJSContext().
///
ULExport void ulViewUnlockJSContext(ULView view);

///
/// Evaluate a string of JavaScript and return result.
///
/// @param  js_string  The string of JavaScript to evaluate.
///
/// @param  exception  The address of a ULString to store a description of the
///                    last exception. Pass NULL to ignore this. Don't destroy
///                    the exception string returned, it's owned by the View.
///
/// @note Don't destroy the returned string, it's owned by the View. This value
///       is reset with every call-- if you want to retain it you should copy
///       the result to a new string via ulCreateStringFromCopy().
///
/// @note An example of using this API:
///       
///         ULString script = ulCreateString("1 + 1");
///         ULString exception;
///         ULString result = ulViewEvaluateScript(view, script, &exception);
///         /* Use the result ("2") and exception description (if any) here. */
///         ulDestroyString(script);
///       
/// ULExport ULString ulViewEvaluateScript(ULView view, ULString js_string, ULString* exception); /// /// Check if can navigate backwards in history. /// ULExport bool ulViewCanGoBack(ULView view); /// /// Check if can navigate forwards in history. /// ULExport bool ulViewCanGoForward(ULView view); /// /// Navigate backwards in history. /// ULExport void ulViewGoBack(ULView view); /// /// Navigate forwards in history. /// ULExport void ulViewGoForward(ULView view); /// /// Navigate to arbitrary offset in history. /// ULExport void ulViewGoToHistoryOffset(ULView view, int offset); /// /// Reload current page. /// ULExport void ulViewReload(ULView view); /// /// Stop all page loads. /// ULExport void ulViewStop(ULView view); /// /// Give focus to the View. /// /// You should call this to give visual indication that the View has input /// focus (changes active text selection colors, for example). /// ULExport void ulViewFocus(ULView view); /// /// Remove focus from the View and unfocus any focused input elements. /// /// You should call this to give visual indication that the View has lost /// input focus. /// ULExport void ulViewUnfocus(ULView view); /// /// Whether or not the View has focus. /// ULExport bool ulViewHasFocus(ULView view); /// /// Whether or not the View has an input element with visible keyboard focus /// (indicated by a blinking caret). /// /// You can use this to decide whether or not the View should consume /// keyboard input events (useful in games with mixed UI and key handling). /// ULExport bool ulViewHasInputFocus(ULView view); /// /// Fire a keyboard event. /// ULExport void ulViewFireKeyEvent(ULView view, ULKeyEvent key_event); /// /// Fire a mouse event. /// ULExport void ulViewFireMouseEvent(ULView view, ULMouseEvent mouse_event); /// /// Fire a scroll event. /// ULExport void ulViewFireScrollEvent(ULView view, ULScrollEvent scroll_event); typedef void (*ULChangeTitleCallback) (void* user_data, ULView caller, ULString title); /// /// Set callback for when the page title changes. /// ULExport void ulViewSetChangeTitleCallback(ULView view, ULChangeTitleCallback callback, void* user_data); typedef void (*ULChangeURLCallback) (void* user_data, ULView caller, ULString url); /// /// Set callback for when the page URL changes. /// ULExport void ulViewSetChangeURLCallback(ULView view, ULChangeURLCallback callback, void* user_data); typedef void (*ULChangeTooltipCallback) (void* user_data, ULView caller, ULString tooltip); /// /// Set callback for when the tooltip changes (usually result of a mouse hover). /// ULExport void ulViewSetChangeTooltipCallback(ULView view, ULChangeTooltipCallback callback, void* user_data); typedef void (*ULChangeCursorCallback) (void* user_data, ULView caller, ULCursor cursor); /// /// Set callback for when the mouse cursor changes. /// ULExport void ulViewSetChangeCursorCallback(ULView view, ULChangeCursorCallback callback, void* user_data); typedef void (*ULAddConsoleMessageCallback) (void* user_data, ULView caller, ULMessageSource source, ULMessageLevel level, ULString message, unsigned int line_number, unsigned int column_number, ULString source_id); /// /// Set callback for when a message is added to the console (useful for /// JavaScript / network errors and debugging). /// ULExport void ulViewSetAddConsoleMessageCallback(ULView view, ULAddConsoleMessageCallback callback, void* user_data); typedef ULView (*ULCreateChildViewCallback) (void* user_data, ULView caller, ULString opener_url, ULString target_url, bool is_popup, ULIntRect popup_rect); /// /// Set callback for when the page wants to create a new View. /// /// This is usually the result of a user clicking a link with target="_blank" /// or by JavaScript calling window.open(url). /// /// To allow creation of these new Views, you should create a new View in /// this callback, resize it to your container, /// and return it. You are responsible for displaying the returned View. /// /// You should return NULL if you want to block the action. /// ULExport void ulViewSetCreateChildViewCallback(ULView view, ULCreateChildViewCallback callback, void* user_data); typedef void (*ULBeginLoadingCallback) (void* user_data, ULView caller, unsigned long long frame_id, bool is_main_frame, ULString url); /// /// Set callback for when the page begins loading a new URL into a frame. /// ULExport void ulViewSetBeginLoadingCallback(ULView view, ULBeginLoadingCallback callback, void* user_data); typedef void (*ULFinishLoadingCallback) (void* user_data, ULView caller, unsigned long long frame_id, bool is_main_frame, ULString url); /// /// Set callback for when the page finishes loading a URL into a frame. /// ULExport void ulViewSetFinishLoadingCallback(ULView view, ULFinishLoadingCallback callback, void* user_data); typedef void (*ULFailLoadingCallback) (void* user_data, ULView caller, unsigned long long frame_id, bool is_main_frame, ULString url, ULString description, ULString error_domain, int error_code); /// /// Set callback for when an error occurs while loading a URL into a frame. /// ULExport void ulViewSetFailLoadingCallback(ULView view, ULFailLoadingCallback callback, void* user_data); typedef void (*ULWindowObjectReadyCallback) (void* user_data, ULView caller, unsigned long long frame_id, bool is_main_frame, ULString url); /// /// Set callback for when the JavaScript window object is reset for a new /// page load. /// /// This is called before any scripts are executed on the page and is the /// earliest time to setup any initial JavaScript state or bindings. /// /// The document is not guaranteed to be loaded/parsed at this point. If /// you need to make any JavaScript calls that are dependent on DOM elements /// or scripts on the page, use DOMReady instead. /// /// The window object is lazily initialized (this will not be called on pages /// with no scripts). /// ULExport void ulViewSetWindowObjectReadyCallback(ULView view, ULWindowObjectReadyCallback callback, void* user_data); typedef void (*ULDOMReadyCallback) (void* user_data, ULView caller, unsigned long long frame_id, bool is_main_frame, ULString url); /// /// Set callback for when all JavaScript has been parsed and the document is /// ready. /// /// This is the best time to make any JavaScript calls that are dependent on /// DOM elements or scripts on the page. /// ULExport void ulViewSetDOMReadyCallback(ULView view, ULDOMReadyCallback callback, void* user_data); typedef void (*ULUpdateHistoryCallback) (void* user_data, ULView caller); /// /// Set callback for when the history (back/forward state) is modified. /// ULExport void ulViewSetUpdateHistoryCallback(ULView view, ULUpdateHistoryCallback callback, void* user_data); /// /// Set whether or not a view should be repainted during the next call to /// ulRender. /// /// @note This flag is automatically set whenever the page content changes /// but you can set it directly in case you need to force a repaint. /// ULExport void ulViewSetNeedsPaint(ULView view, bool needs_paint); /// /// Whether or not a view should be painted during the next call to ulRender. /// ULExport bool ulViewGetNeedsPaint(ULView view); /// /// Create an inspector for this View, this is useful for debugging and /// inspecting pages locally. This will only succeed if you have the /// inspector assets in your filesystem-- the inspector will look for /// file:///inspector/Main.html when it loads. /// /// @note The initial dimensions of the returned View are 10x10, you should /// call ulViewResize on the returned View to resize it to your desired /// dimensions. /// /// @note You will need to call ulDestroyView on the returned instance /// when you're done using it. /// ULExport ULView ulViewCreateInspectorView(ULView view); /****************************************************************************** * String *****************************************************************************/ /// /// Create string from null-terminated ASCII C-string. /// ULExport ULString ulCreateString(const char* str); /// /// Create string from UTF-8 buffer. /// ULExport ULString ulCreateStringUTF8(const char* str, size_t len); /// /// Create string from UTF-16 buffer. /// ULExport ULString ulCreateStringUTF16(ULChar16* str, size_t len); /// /// Create string from copy of existing string. /// ULExport ULString ulCreateStringFromCopy(ULString str); /// /// Destroy string (you should destroy any strings you explicitly Create). /// ULExport void ulDestroyString(ULString str); /// /// Get internal UTF-16 buffer data. /// ULExport ULChar16* ulStringGetData(ULString str); /// /// Get length in UTF-16 characters. /// ULExport size_t ulStringGetLength(ULString str); /// /// Whether this string is empty or not. /// ULExport bool ulStringIsEmpty(ULString str); /// /// Replaces the contents of 'str' with the contents of 'new_str' /// ULExport void ulStringAssignString(ULString str, ULString new_str); /// /// Replaces the contents of 'str' with the contents of a C-string. /// ULExport void ulStringAssignCString(ULString str, const char* c_str); /****************************************************************************** * Bitmap *****************************************************************************/ /// /// Create empty bitmap. /// ULExport ULBitmap ulCreateEmptyBitmap(); /// /// Create bitmap with certain dimensions and pixel format. /// ULExport ULBitmap ulCreateBitmap(unsigned int width, unsigned int height, ULBitmapFormat format); /// /// Create bitmap from existing pixel buffer. @see Bitmap for help using /// this function. /// ULExport ULBitmap ulCreateBitmapFromPixels(unsigned int width, unsigned int height, ULBitmapFormat format, unsigned int row_bytes, const void* pixels, size_t size, bool should_copy); /// /// Create bitmap from copy. /// ULExport ULBitmap ulCreateBitmapFromCopy(ULBitmap existing_bitmap); /// /// Destroy a bitmap (you should only destroy Bitmaps you have explicitly /// created via one of the creation functions above. /// ULExport void ulDestroyBitmap(ULBitmap bitmap); /// /// Get the width in pixels. /// ULExport unsigned int ulBitmapGetWidth(ULBitmap bitmap); /// /// Get the height in pixels. /// ULExport unsigned int ulBitmapGetHeight(ULBitmap bitmap); /// /// Get the pixel format. /// ULExport ULBitmapFormat ulBitmapGetFormat(ULBitmap bitmap); /// /// Get the bytes per pixel. /// ULExport unsigned int ulBitmapGetBpp(ULBitmap bitmap); /// /// Get the number of bytes per row. /// ULExport unsigned int ulBitmapGetRowBytes(ULBitmap bitmap); /// /// Get the size in bytes of the underlying pixel buffer. /// ULExport size_t ulBitmapGetSize(ULBitmap bitmap); /// /// Whether or not this bitmap owns its own pixel buffer. /// ULExport bool ulBitmapOwnsPixels(ULBitmap bitmap); /// /// Lock pixels for reading/writing, returns pointer to pixel buffer. /// ULExport void* ulBitmapLockPixels(ULBitmap bitmap); /// /// Unlock pixels after locking. /// ULExport void ulBitmapUnlockPixels(ULBitmap bitmap); /// /// Get raw pixel buffer-- you should only call this if Bitmap is already /// locked. /// ULExport void* ulBitmapRawPixels(ULBitmap bitmap); /// /// Whether or not this bitmap is empty. /// ULExport bool ulBitmapIsEmpty(ULBitmap bitmap); /// /// Reset bitmap pixels to 0. /// ULExport void ulBitmapErase(ULBitmap bitmap); /// /// Write bitmap to a PNG on disk. /// ULExport bool ulBitmapWritePNG(ULBitmap bitmap, const char* path); /// /// This converts a BGRA bitmap to RGBA bitmap and vice-versa by swapping /// the red and blue channels. /// ULExport void ulBitmapSwapRedBlueChannels(ULBitmap bitmap); /****************************************************************************** * Key Event ******************************************************************************/ /// /// Create a key event, @see KeyEvent for help with the following parameters. /// ULExport ULKeyEvent ulCreateKeyEvent(ULKeyEventType type, unsigned int modifiers, int virtual_key_code, int native_key_code, ULString text, ULString unmodified_text, bool is_keypad, bool is_auto_repeat, bool is_system_key); #ifdef _WIN32 /// /// Create a key event from native Windows event. /// ULExport ULKeyEvent ulCreateKeyEventWindows(ULKeyEventType type, uintptr_t wparam, intptr_t lparam, bool is_system_key); #endif #ifdef __OBJC__ /// /// Create a key event from native macOS event. /// ULExport ULKeyEvent ulCreateKeyEventMacOS(NSEvent* evt); #endif /// /// Destroy a key event. /// ULExport void ulDestroyKeyEvent(ULKeyEvent evt); /****************************************************************************** * Mouse Event *****************************************************************************/ /// /// Create a mouse event, @see MouseEvent for help using this function. /// ULExport ULMouseEvent ulCreateMouseEvent(ULMouseEventType type, int x, int y, ULMouseButton button); /// /// Destroy a mouse event. /// ULExport void ulDestroyMouseEvent(ULMouseEvent evt); /****************************************************************************** * Scroll Event *****************************************************************************/ /// /// Create a scroll event, @see ScrollEvent for help using this function. /// ULExport ULScrollEvent ulCreateScrollEvent(ULScrollEventType type, int delta_x, int delta_y); /// /// Destroy a scroll event. /// ULExport void ulDestroyScrollEvent(ULScrollEvent evt); /****************************************************************************** * Rect *****************************************************************************/ /// /// Whether or not a ULRect is empty (all members equal to 0) /// ULExport bool ulRectIsEmpty(ULRect rect); /// /// Create an empty ULRect (all members equal to 0) /// ULExport ULRect ulRectMakeEmpty(); /****************************************************************************** * IntRect *****************************************************************************/ /// /// Whether or not a ULIntRect is empty (all members equal to 0) /// ULExport bool ulIntRectIsEmpty(ULIntRect rect); /// /// Create an empty ULIntRect (all members equal to 0) /// ULExport ULIntRect ulIntRectMakeEmpty(); /****************************************************************************** * Surface *****************************************************************************/ /// /// Width (in pixels). /// ULExport unsigned int ulSurfaceGetWidth(ULSurface surface); /// /// Height (in pixels). /// ULExport unsigned int ulSurfaceGetHeight(ULSurface surface); /// /// Number of bytes between rows (usually width * 4) /// ULExport unsigned int ulSurfaceGetRowBytes(ULSurface surface); /// /// Size in bytes. /// ULExport size_t ulSurfaceGetSize(ULSurface surface); /// /// Lock the pixel buffer and get a pointer to the beginning of the data /// for reading/writing. /// /// Native pixel format is premultiplied BGRA 32-bit (8 bits per channel). /// ULExport void* ulSurfaceLockPixels(ULSurface surface); /// /// Unlock the pixel buffer. /// ULExport void ulSurfaceUnlockPixels(ULSurface surface); /// /// Resize the pixel buffer to a certain width and height (both in pixels). /// /// This should never be called while pixels are locked. /// ULExport void ulSurfaceResize(ULSurface surface, unsigned int width, unsigned int height); /// /// Set the dirty bounds to a certain value. /// /// This is called after the Renderer paints to an area of the pixel buffer. /// (The new value will be joined with the existing dirty_bounds()) /// ULExport void ulSurfaceSetDirtyBounds(ULSurface surface, ULIntRect bounds); /// /// Get the dirty bounds. /// /// This value can be used to determine which portion of the pixel buffer has /// been updated since the last call to ulSurfaceClearDirtyBounds(). /// /// The general algorithm to determine if a Surface needs display is: ///
///   if (!ulIntRectIsEmpty(ulSurfaceGetDirtyBounds(surface))) {
///       // Surface pixels are dirty and needs display.
///       // Cast Surface to native Surface and use it here (pseudo code)
///       DisplaySurface(surface);
///
///       // Once you're done, clear the dirty bounds:
///       ulSurfaceClearDirtyBounds(surface);
///  }
///  
/// ULExport ULIntRect ulSurfaceGetDirtyBounds(ULSurface surface); /// /// Clear the dirty bounds. /// /// You should call this after you're done displaying the Surface. /// ULExport void ulSurfaceClearDirtyBounds(ULSurface surface); /// /// Get the underlying user data pointer (this is only valid if you have /// set a custom surface implementation via ulPlatformSetSurfaceDefinition). /// /// This will return nullptr if this surface is the default ULBitmapSurface. /// ULExport void* ulSurfaceGetUserData(ULSurface surface); /****************************************************************************** * BitmapSurface *****************************************************************************/ /// /// Get the underlying Bitmap from the default Surface. /// /// @note Do not call ulDestroyBitmap() on the returned value, it is owned /// by the surface. /// ULExport ULBitmap ulBitmapSurfaceGetBitmap(ULBitmapSurface surface); /****************************************************************************** * Surface Definition *****************************************************************************/ /// /// The callback invoked when a Surface is created. /// /// @param width The width in pixels. /// @param height The height in pixels. /// /// @return This callback should return a pointer to user-defined data for the /// instance. This user data pointer will be passed to all other /// callbacks when operating on the instance. /// typedef void* (*ULSurfaceDefinitionCreateCallback) (unsigned int width, unsigned int height); /// /// The callback invoked when a Surface is destroyed. /// /// @param user_data User data pointer uniquely identifying the surface. /// typedef void (*ULSurfaceDefinitionDestroyCallback) (void* user_data); /// /// The callback invoked when a Surface's width (in pixels) is requested. /// /// @param user_data User data pointer uniquely identifying the surface. /// typedef unsigned int (*ULSurfaceDefinitionGetWidthCallback) (void* user_data); /// /// The callback invoked when a Surface's height (in pixels) is requested. /// /// @param user_data User data pointer uniquely identifying the surface. /// typedef unsigned int (*ULSurfaceDefinitionGetHeightCallback) (void* user_data); /// /// The callback invoked when a Surface's row bytes is requested. /// /// @note This value is also known as "stride". Usually width * 4. /// /// @param user_data User data pointer uniquely identifying the surface. /// typedef unsigned int (*ULSurfaceDefinitionGetRowBytesCallback) (void* user_data); /// /// The callback invoked when a Surface's size (in bytes) is requested. /// /// @param user_data User data pointer uniquely identifying the surface. /// typedef size_t (*ULSurfaceDefinitionGetSizeCallback) (void* user_data); /// /// The callback invoked when a Surface's pixel buffer is requested to be /// locked for reading/writing (should return a pointer to locked bytes). /// /// @param user_data User data pointer uniquely identifying the surface. /// typedef void* (*ULSurfaceDefinitionLockPixelsCallback) (void* user_data); /// /// The callback invoked when a Surface's pixel buffer is requested to be /// unlocked after previously being locked. /// /// @param user_data User data pointer uniquely identifying the surface. /// typedef void (*ULSurfaceDefinitionUnlockPixelsCallback) (void* user_data); /// /// The callback invoked when a Surface is requested to be resized to a /// certain width/height. /// /// @param user_data User data pointer uniquely identifying the surface. /// @param width Width in pixels. /// @param height Height in pixels. /// typedef void (*ULSurfaceDefinitionResizeCallback) (void* user_data, unsigned int width, unsigned int height); typedef struct { ULSurfaceDefinitionCreateCallback create; ULSurfaceDefinitionDestroyCallback destroy; ULSurfaceDefinitionGetWidthCallback get_width; ULSurfaceDefinitionGetHeightCallback get_height; ULSurfaceDefinitionGetRowBytesCallback get_row_bytes; ULSurfaceDefinitionGetSizeCallback get_size; ULSurfaceDefinitionLockPixelsCallback lock_pixels; ULSurfaceDefinitionUnlockPixelsCallback unlock_pixels; ULSurfaceDefinitionResizeCallback resize; } ULSurfaceDefinition; /****************************************************************************** * File System *****************************************************************************/ /// /// File Handle type used as unique ID for opened files. /// #if defined(__WIN32__) || defined(_WIN32) typedef size_t ULFileHandle; #else typedef int ULFileHandle; #endif /// /// Handle used to denote an invalid file. /// const ULFileHandle ULInvalidFileHandle = (ULFileHandle)-1; /// /// The callback invoked when the FileSystem wants to check if a file path /// exists, return true if it exists. /// typedef bool (*ULFileSystemFileExistsCallback) (ULString path); /// /// The callback invoked when the FileSystem wants to get the file size of a /// previously opened file, store result in 'result'. Return true on success. /// typedef bool (*ULFileSystemGetFileSizeCallback) (ULFileHandle handle, long long* result); /// /// The callback invoked when the FileSystem wants to get the mime type of a /// file (eg "text/html"), store result in 'result'. Return true on success. /// typedef bool (*ULFileSystemGetFileMimeTypeCallback) (ULString path, ULString result); /// /// The callback invoked when the FileSystem wants to open a file path for /// reading or writing. Return file handle on success, or ULInvalidFileHandle /// on failure. /// /// @NOTE: As of this writing (v1.2), this function is only used for reading. /// typedef ULFileHandle (*ULFileSystemOpenFileCallback) (ULString path, bool open_for_writing); /// /// The callback invoked when the FileSystem wants to close a previously-opened /// file. /// typedef void (*ULFileSystemCloseFileCallback) (ULFileHandle handle); /// /// The callback invoked when the FileSystem wants to read from a /// currently-opened file, return number of bytes read or -1 on failure. /// typedef long long (*ULFileSystemReadFromFileCallback) (ULFileHandle handle, char* data, long long length); typedef struct { ULFileSystemFileExistsCallback file_exists; ULFileSystemGetFileSizeCallback get_file_size; ULFileSystemGetFileMimeTypeCallback get_file_mime_type; ULFileSystemOpenFileCallback open_file; ULFileSystemCloseFileCallback close_file; ULFileSystemReadFromFileCallback read_from_file; } ULFileSystem; /****************************************************************************** * Logger *****************************************************************************/ typedef enum { kLogLevel_Error = 0, kLogLevel_Warning, kLogLevel_Info } ULLogLevel; /// /// The callback invoked when the library wants to print a message to the log. /// typedef void (*ULLoggerLogMessageCallback) (ULLogLevel log_level, ULString message); typedef struct { ULLoggerLogMessageCallback log_message; } ULLogger; /****************************************************************************** * GPUDriver *****************************************************************************/ /// /// Render buffer description. /// typedef struct { unsigned int texture_id; // The backing texture for this RenderBuffer unsigned int width; // The width of the RenderBuffer texture unsigned int height; // The height of the RenderBuffer texture bool has_stencil_buffer; // Currently unused, always false. bool has_depth_buffer; // Currently unsued, always false. } ULRenderBuffer; /// /// @note This pragma pack(push, 1) command is important! Vertex layouts /// should not be padded with any bytes. /// #pragma pack(push, 1) /// /// Vertex layout for path vertices. /// /// (this struct's members aligned on single-byte boundaries) /// typedef struct { float pos[2]; unsigned char color[4]; float obj[2]; } ULVertex_2f_4ub_2f; /// /// Vertex layout for quad vertices. /// /// (this struct's members aligned on single-byte boundaries) /// typedef struct { float pos[2]; unsigned char color[4]; float tex[2]; float obj[2]; float data0[4]; float data1[4]; float data2[4]; float data3[4]; float data4[4]; float data5[4]; float data6[4]; } ULVertex_2f_4ub_2f_2f_28f; /// /// End single-byte alignment. /// #pragma pack(pop) /// /// Vertex formats. /// typedef enum { kVertexBufferFormat_2f_4ub_2f, kVertexBufferFormat_2f_4ub_2f_2f_28f, } ULVertexBufferFormat; /// /// Vertex buffer data. /// typedef struct { ULVertexBufferFormat format; unsigned int size; unsigned char* data; } ULVertexBuffer; /// /// Vertex index type. /// typedef unsigned int ULIndexType; /// /// Vertex index buffer data. /// typedef struct { unsigned int size; unsigned char* data; } ULIndexBuffer; /// /// Shader types, used with ULGPUState::shader_type /// /// Each of these correspond to a vertex/pixel shader pair. You can find /// stock shader code for these in the `shaders` folder of the AppCore repo. /// typedef enum { kShaderType_Fill, // Shader program for quad geometry kShaderType_FillPath, // Shader program for path geometry } ULShaderType; /// /// Raw 4x4 matrix as an array of floats /// typedef struct { float data[16]; } ULMatrix4x4; /// /// 4-component float vector /// typedef struct { float value[4]; } ULvec4; /// /// GPU State description. /// typedef struct { /// Viewport width in pixels unsigned int viewport_width; /// Viewport height in pixels unsigned int viewport_height; /// Transform matrix-- you should multiply this with the screen-space /// orthographic projection matrix then pass to the vertex shader. ULMatrix4x4 transform; /// Whether or not we should enable texturing for the current draw command. bool enable_texturing; /// Whether or not we should enable blending for the current draw command. /// If blending is disabled, any drawn pixels should overwrite existing. /// Mainly used so we can modify alpha values of the RenderBuffer during /// scissored clears. bool enable_blend; /// The vertex/pixel shader program pair to use for the current draw command. /// You should cast this to ShaderType to get the corresponding enum. unsigned char shader_type; /// The render buffer to use for the current draw command. unsigned int render_buffer_id; /// The texture id to bind to slot #1. (Will be 0 if none) unsigned int texture_1_id; /// The texture id to bind to slot #2. (Will be 0 if none) unsigned int texture_2_id; /// The texture id to bind to slot #3. (Will be 0 if none) unsigned int texture_3_id; /// The following four members are passed to the pixel shader via uniforms. float uniform_scalar[8]; ULvec4 uniform_vector[8]; unsigned char clip_size; ULMatrix4x4 clip[8]; /// Whether or not scissor testing should be used for the current draw /// command. bool enable_scissor; /// The scissor rect to use for scissor testing (units in pixels) ULIntRect scissor_rect; } ULGPUState; /// /// Command types, used with ULCommand::command_type /// typedef enum { kCommandType_ClearRenderBuffer, kCommandType_DrawGeometry, } ULCommandType; /// /// Command description. /// typedef struct { unsigned char command_type; // The type of command to dispatch. ULGPUState gpu_state; // GPU state parameters for current command. /// The following members are only used with kCommandType_DrawGeometry unsigned int geometry_id; // The geometry ID to bind unsigned int indices_count; // The number of indices unsigned int indices_offset; // The index to start from } ULCommand; /// /// Command list, @see ULGPUDriverUpdateCommandList typedef struct { unsigned int size; ULCommand* commands; } ULCommandList; /// /// The callback invoked when the GPUDriver will begin dispatching commands /// (such as CreateTexture and UpdateCommandList) during the current call to /// ulRender(). /// typedef void (*ULGPUDriverBeginSynchronizeCallback) (); /// /// The callback invoked when the GPUDriver has finished dispatching commands. /// during the current call to ulRender(). /// typedef void (*ULGPUDriverEndSynchronizeCallback) (); /// /// The callback invoked when the GPUDriver wants to get the next available /// texture ID. /// typedef unsigned int (*ULGPUDriverNextTextureIdCallback) (); /// /// The callback invoked when the GPUDriver wants to create a texture with a /// certain ID and optional bitmap. /// /// **NOTE**: If the Bitmap is empty (ulBitmapIsEmpty), then a RTT Texture /// should be created instead. This will be used as a backing /// texture for a new RenderBuffer. /// typedef void (*ULGPUDriverCreateTextureCallback) (unsigned int texture_id, ULBitmap bitmap); /// /// The callback invoked when the GPUDriver wants to update an existing non-RTT /// texture with new bitmap data. /// typedef void (*ULGPUDriverUpdateTextureCallback) (unsigned int texture_id, ULBitmap bitmap); /// /// The callback invoked when the GPUDriver wants to destroy a texture. /// typedef void (*ULGPUDriverDestroyTextureCallback) (unsigned int texture_id); /// /// The callback invoked when the GPUDriver wants to generate the next /// available render buffer ID. /// typedef unsigned int (*ULGPUDriverNextRenderBufferIdCallback) (); /// /// The callback invoked when the GPUDriver wants to create a render buffer /// with certain ID and buffer description. /// typedef void (*ULGPUDriverCreateRenderBufferCallback) (unsigned int render_buffer_id, ULRenderBuffer buffer); /// /// The callback invoked when the GPUDriver wants to destroy a render buffer /// typedef void (*ULGPUDriverDestroyRenderBufferCallback) (unsigned int render_buffer_id); /// /// The callback invoked when the GPUDriver wants to generate the next /// available geometry ID. /// typedef unsigned int (*ULGPUDriverNextGeometryIdCallback) (); /// /// The callback invoked when the GPUDriver wants to create geometry with /// certain ID and vertex/index data. /// typedef void (*ULGPUDriverCreateGeometryCallback) (unsigned int geometry_id, ULVertexBuffer vertices, ULIndexBuffer indices); /// /// The callback invoked when the GPUDriver wants to update existing geometry /// with new vertex/index data. /// typedef void (*ULGPUDriverUpdateGeometryCallback) (unsigned int geometry_id, ULVertexBuffer vertices, ULIndexBuffer indices); /// /// The callback invoked when the GPUDriver wants to destroy geometry. /// typedef void (*ULGPUDriverDestroyGeometryCallback) (unsigned int geometry_id); /// /// The callback invoked when the GPUDriver wants to update the command list /// (you should copy the commands to your own structure). /// typedef void (*ULGPUDriverUpdateCommandListCallback) (ULCommandList list); typedef struct { ULGPUDriverBeginSynchronizeCallback begin_synchronize; ULGPUDriverEndSynchronizeCallback end_synchronize; ULGPUDriverNextTextureIdCallback next_texture_id; ULGPUDriverCreateTextureCallback create_texture; ULGPUDriverUpdateTextureCallback update_texture; ULGPUDriverDestroyTextureCallback destroy_texture; ULGPUDriverNextRenderBufferIdCallback next_render_buffer_id; ULGPUDriverCreateRenderBufferCallback create_render_buffer; ULGPUDriverDestroyRenderBufferCallback destroy_render_buffer; ULGPUDriverNextGeometryIdCallback next_geometry_id; ULGPUDriverCreateGeometryCallback create_geometry; ULGPUDriverUpdateGeometryCallback update_geometry; ULGPUDriverDestroyGeometryCallback destroy_geometry; ULGPUDriverUpdateCommandListCallback update_command_list; } ULGPUDriver; /// /// Sets up an orthographic projection matrix with a certain viewport width /// and height, multiplies it by 'transform', and returns the result. /// /// This should be used to calculate the model-view projection matrix for the /// vertex shaders using the current ULGPUState. /// /// The 'flip_y' can be optionally used to flip the Y coordinate-space. /// (Usually flip_y == true for OpenGL) /// ULExport ULMatrix4x4 ulApplyProjection(ULMatrix4x4 transform, float viewport_width, float viewport_height, bool flip_y); /****************************************************************************** * Clipboard *****************************************************************************/ /// /// The callback invoked when the library wants to clear the system's /// clipboard. /// typedef void (*ULClipboardClearCallback) (); /// /// The callback invoked when the library wants to read from the system's /// clipboard. /// /// You should store the result (if any) in 'result'. /// typedef void (*ULClipboardReadPlainTextCallback) (ULString result); /// /// The callback invoked when the library wants to write to the system's /// clipboard. /// typedef void (*ULClipboardWritePlainTextCallback) (ULString text); typedef struct { ULClipboardClearCallback clear; ULClipboardReadPlainTextCallback read_plain_text; ULClipboardWritePlainTextCallback write_plain_text; } ULClipboard; /****************************************************************************** * Platform *****************************************************************************/ /// /// Set a custom Logger implementation. /// /// This is used to log debug messages to the console or to a log file. /// /// You should call this before ulCreateRenderer() or ulCreateApp(). /// /// @note ulCreateApp() will use the default logger if you never call this. /// /// @note If you're not using ulCreateApp(), (eg, using ulCreateRenderer()) /// you can still use the default logger by calling /// ulEnableDefaultLogger() (@see ) /// ULExport void ulPlatformSetLogger(ULLogger logger); /// /// Set a custom FileSystem implementation. /// /// This is used for loading File URLs (eg, ). If you don't /// call this, and are not using ulCreateApp() or ulEnablePlatformFileSystem(), /// you will not be able to load any File URLs. /// /// You should call this before ulCreateRenderer() or ulCreateApp(). /// /// @note ulCreateApp() will use the default platform file system if you never /// call this. /// /// @note If you're not using ulCreateApp(), (eg, using ulCreateRenderer()) /// you can still use the default platform file system by calling /// ulEnablePlatformFileSystem() (@see ) /// ULExport void ulPlatformSetFileSystem(ULFileSystem file_system); /// /// Set a custom Surface implementation. /// /// This can be used to wrap a platform-specific GPU texture, Windows DIB, /// macOS CGImage, or any other pixel buffer target for display on screen. /// /// By default, the library uses a bitmap surface for all surfaces but you can /// override this by providing your own surface definition here. /// /// You should call this before ulCreateRenderer() or ulCreateApp(). /// ULExport void ulPlatformSetSurfaceDefinition(ULSurfaceDefinition surface_definition); /// /// Set a custom GPUDriver implementation. /// /// This should be used if you have enabled the GPU renderer in the Config and /// are using ulCreateRenderer() (which does not provide its own GPUDriver /// implementation). /// /// The GPUDriver interface is used by the library to dispatch GPU calls to /// your native GPU context (eg, D3D11, Metal, OpenGL, Vulkan, etc.) There /// are reference implementations for this interface in the AppCore repo. /// /// You should call this before ulCreateRenderer(). /// ULExport void ulPlatformSetGPUDriver(ULGPUDriver gpu_driver); /// /// Set a custom Clipboard implementation. /// /// This should be used if you are using ulCreateRenderer() (which does not /// provide its own clipboard implementation). /// /// The Clipboard interface is used by the library to make calls to the /// system's native clipboard (eg, cut, copy, paste). /// /// You should call this before ulCreateRenderer(). /// ULExport void ulPlatformSetClipboard(ULClipboard clipboard); #ifdef __cplusplus } #endif #endif // ULTRALIGHT_CAPI_H