diff --git a/include/AppCore/App.h b/include/AppCore/App.h deleted file mode 100644 index de5aa38..0000000 --- a/include/AppCore/App.h +++ /dev/null @@ -1,162 +0,0 @@ -/// -/// @file App.h -/// -/// @brief The header for the App class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include "Defines.h" -#include -#include -#include - -namespace ultralight { - -class Monitor; -class Window; - -/// -/// Interface for all App-related events. @see App::set_listener -/// -class AExport AppListener { -public: - virtual ~AppListener() {} - - /// - /// Called whenever the App updates. You should update all app logic here. - /// - /// @note This event is fired right before the run loop calls - /// Renderer::Update and Renderer::Render. - /// - virtual void OnUpdate() {} -}; - -/// -/// App-specific settings. -/// -struct AExport Settings { - /// - /// The root file path for our file system. You should set this to the - /// relative path where all of your app data is. - /// - /// This will be used to resolve all file URLs, eg file:///page.html - /// - /// @note By default, on macOS we use the app bundle's @resource_path, - /// on all other platforms we use the "./assets/" directory relative - /// to the executable's directory. - /// -#ifdef __APPLE__ - String file_system_path = "@resource_path"; -#else - String file_system_path = "./assets/"; -#endif - - /// - /// Whether or not we should load and compile shaders from the file system - /// (eg, from the /shaders/ path, relative to file_system_path). - /// - /// If this is false (the default), we will instead load pre-compiled shaders - /// from memory which speeds up application startup time. - /// - bool load_shaders_from_file_system = false; -}; - -/// -/// Main application class. -/// -class AExport App : public RefCounted { -public: - /// - /// Create the App singleton. - /// - /// @param settings Settings to customize App runtime behavior. - /// - /// @param config Config options for the Ultralight renderer. - /// - /// @return Returns a ref-pointer to the created App instance. - /// - /// @note You should only create one of these per application lifetime. - /// - /// @note Certain Config options may be overridden during App creation, - /// most commonly Config::face_winding and Config::device_scale_hint. - /// - static Ref Create(Settings settings = Settings(), Config config = Config()); - - /// - /// Get the App singleton. - /// - static App* instance(); - - /// - /// Get the settings this App was created with. - /// - virtual const Settings& settings() const = 0; - - /// - /// Set the main window. You must set this before calling Run. - /// - /// @param window The window to use for all rendering. - /// - /// @note We currently only support one Window per App, this will change - /// later once we add support for multiple driver instances. - /// - virtual void set_window(Ref window) = 0; - - /// - /// Get the main window. - /// - virtual RefPtr window() = 0; - - /// - /// Set an AppListener to receive callbacks for app-related events. - /// - /// @note Ownership remains with the caller. - /// - virtual void set_listener(AppListener* listener) = 0; - - /// - /// Get the AppListener, if any. - /// - virtual AppListener* listener() = 0; - - /// - /// Whether or not the App is running. - /// - virtual bool is_running() const = 0; - - /// - /// Get the main monitor (this is never NULL). - /// - /// @note We'll add monitor enumeration later. - /// - virtual Monitor* main_monitor() = 0; - - /// - /// Get the underlying Renderer instance. - /// - virtual Ref renderer() = 0; - - /// - /// Run the main loop. - /// - /// @note Make sure to call set_window before calling this. - /// - virtual void Run() = 0; - - /// - /// Quit the application. - /// - virtual void Quit() = 0; - -protected: - virtual ~App(); -}; - -} // namespace ultralight diff --git a/include/AppCore/AppCore.h b/include/AppCore/AppCore.h deleted file mode 100644 index 4185818..0000000 --- a/include/AppCore/AppCore.h +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include -#include -#include -#include \ No newline at end of file diff --git a/include/AppCore/Defines.h b/include/AppCore/Defines.h deleted file mode 100644 index cb0f63c..0000000 --- a/include/AppCore/Defines.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2018 Ultralight, Inc. All rights reserved. -#pragma once - -// Needed for limit defines, like INTMAX_MAX, which is used by the std C++ library -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS -#endif - -#include -#include -#include - -#ifdef SWIG -#define AExport -#else - -// Require C++11 Support -#if defined(_MSC_VER) -# if _MSC_VER < 1800 -# error This project needs at least Visual Studio 2013 to build -# endif -#elif __cplusplus <= 199711L -# error This project can only be compiled with a compiler that supports C++11 -#endif - - -#if defined(__WIN32__) || defined(_WIN32) -# if defined(APPCORE_IMPLEMENTATION) -# define AExport __declspec(dllexport) -# else -# define AExport __declspec(dllimport) -# endif -#define _thread_local __declspec(thread) -#ifndef _NATIVE_WCHAR_T_DEFINED -#define DISABLE_NATIVE_WCHAR_T -#endif -#else -# define AExport __attribute__((visibility("default"))) -#define _thread_local __thread -#endif - -#endif diff --git a/include/AppCore/JSHelpers.h b/include/AppCore/JSHelpers.h deleted file mode 100644 index 1e6f38a..0000000 --- a/include/AppCore/JSHelpers.h +++ /dev/null @@ -1,415 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include - -/** -* This is a set of common JavaScriptCore Helper functions -* to simplify sample code. -*/ - -namespace ultralight { - -/** - * Set the current JSContext. - * - * NOTE: You MUST set this before using most of the classes/functions below. - * - * The only things you can create without a JSContext are JSString's and - * the empty JSFunction constructor. - */ -void AExport SetJSContext(JSContextRef ctx); - -/** - * Get the current JSContext. - */ -JSContextRef AExport GetJSContext(); - -/** - * JSString wrapper that automatically manages lifetime - * and provides helpful conversions. - */ -class AExport JSString { -public: - // Create empty string - JSString(); - - // Create from C-string - JSString(const char* str); - - // Create from Ultralight String - JSString(const String& str); - - // Take ownership of existing JSStringRef - JSString(JSStringRef str); - - // Copy constructor - JSString(const JSString& other); - - ~JSString(); - - // Assignment operator - JSString& operator=(const JSString& other); - - // Cast to String - operator String(); - - // Cast to JSStringRef - operator JSStringRef() const { return instance_; } - -protected: - JSStringRef instance_; -}; - -class JSArray; -class JSObject; -class JSFunction; - -// Used with the JSValue constructor to create "Null" types -struct AExport JSValueNullTag {}; - -// Used with the JSValue constructor to create "Undefined" types -struct AExport JSValueUndefinedTag {}; - -/** - * JSValue wrapper that automatically manages lifetime and - * provides helpful conversions. - */ -class AExport JSValue { -public: - // Create null (empty) JSValue - JSValue(); - - // Create null JSValue explicitly - JSValue(JSValueNullTag); - - // Create undefined JSValue - JSValue(JSValueUndefinedTag); - - // Create boolean JSValue - JSValue(bool val); - - // Create unsigned integer JSValue (aka, Number) [will be cast to double] - JSValue(uint32_t val); - - // Create integer JSValue (aka, Number) [will be cast to double] - JSValue(int32_t val); - - // Create unsigned integer JSValue (aka, Number) [will be cast to double] - JSValue(uint64_t val); - - // Create integer JSValue (aka, Number) [will be cast to double] - JSValue(int64_t val); - - // Create double JSValue (aka, Number) - JSValue(double val); - - // Create string JSValue - JSValue(const char* val); - - // Create string JSValue - JSValue(const String& val); - - // Create string JSValue - JSValue(JSString val); - - // Create from existing JSValueRef - JSValue(JSValueRef val); - - // Create object JSValue - JSValue(JSObjectRef obj); - - // Copy constructor, a shallow copy is made, will end up pointing to same instance - JSValue(const JSValue& other); - - virtual ~JSValue(); - - // A shallow copy is made, will end up pointing to same instance - virtual JSValue& operator=(const JSValue& other); - - bool IsNull() const; - - bool IsUndefined() const; - - bool IsBoolean() const; - - bool IsNumber() const; - - bool IsString() const; - - bool IsObject() const; - - bool IsArray() const; - - bool IsFunction() const; - - // Convert to Boolean - bool ToBoolean() const; - - // Convert to Number (Double) - double ToNumber() const; - - // Convert to Number (Integer) - int64_t ToInteger() const { return static_cast(ToNumber()); } - - // Convert to String - JSString ToString() const; - - // Convert to Object (will debug assert if not an Object) - JSObject ToObject() const; - - // Convert to Array (will debug asset if not an Array) - JSArray ToArray() const; - - // Convert to Function (will debug asset if not a Function) - JSFunction ToFunction() const; - - operator bool() const { return ToBoolean(); } - - operator double() const { return ToNumber(); } - - operator uint32_t() const { return static_cast(ToNumber()); } - - operator int32_t() const { return static_cast(ToNumber()); } - - operator uint64_t() const { return static_cast(ToNumber()); } - - operator int64_t() const { return ToInteger(); } - - operator String() const { return ToString(); } - - operator JSString() const { return ToString(); } - - operator JSObject() const; - - operator JSObjectRef() const; - - operator JSArray() const; - - operator JSFunction() const; - - // Get the underlying JSValueRef - operator JSValueRef() const { return instance(); } - -protected: - JSValue(JSContextRef ctx); - JSValue(JSContextRef ctx, JSValueRef val); - virtual JSValueRef instance() const; - - JSContextRef ctx_; - JSValueRef instance_ = nullptr; - friend class JSFunction; -}; - -/** -* A vector of JSValues, used for passing around arguments in JSCallback. -* We don't expose std::vector directly because of ABI concerns. -*/ -class AExport JSArgs { -public: - JSArgs(); - JSArgs(const std::initializer_list& values); - JSArgs(const JSArgs& other); - ~JSArgs(); - - JSArgs& operator=(const JSArgs& other); - - JSValue operator[](size_t pos); - const JSValue operator[](size_t pos) const; - - bool empty() const; - - size_t size() const; - - void clear(); - - void push_back(const JSValue& val); - void pop_back(); - - JSValue* data(); - const JSValue* data() const; -protected: - void* instance_; -}; - -typedef std::function JSCallback; -typedef std::function JSCallbackWithRetval; - -// Macro to help bind JSCallback member function to JSPropertyValue -#define BindJSCallback(fn) (JSCallback)std::bind(fn, this, std::placeholders::_1, std::placeholders::_2) -#define BindJSCallbackWithRetval(fn) (JSCallbackWithRetval)std::bind(fn, this, std::placeholders::_1, std::placeholders::_2) - -/** - * Wrapper for JSObject property value (JSValue subclass). Allows new value assignment - * to object property, binding C++ callbacks to object properties via function objects, - * as well as value query via the JSValue interface. - */ -class AExport JSPropertyValue : public JSValue { -public: - virtual ~JSPropertyValue(); - - // Assign a new value to the property (internally calls JSObjectSetProperty) - virtual JSPropertyValue& operator=(const JSValue& value); - - // Bind to native C++ callback (creates a Function object that can be called from JS) - JSPropertyValue& operator=(const JSCallback& callback); - - // Bind to native C++ callback with return value (creates a Function object that can be called from JS) - JSPropertyValue& operator=(const JSCallbackWithRetval& callback); - -protected: - virtual JSValueRef instance() const; - JSPropertyValue(JSContextRef ctx, JSObjectRef proxy_obj, unsigned idx); - JSPropertyValue(JSContextRef ctx, JSObjectRef proxy_obj, JSString idx); - JSPropertyValue(const JSPropertyValue&) = default; - JSPropertyValue& operator=(const JSPropertyValue&) = delete; - - JSObject* proxyObj_; - bool using_numeric_idx_; - unsigned numeric_idx_; - JSString string_idx_; - friend class JSArray; - friend class JSObject; -}; - -/** - * JSArray wrapper that automatically manages lifetime and provides - * convenient access to indices and Array functions. - */ -class AExport JSArray { -public: - // Create empty Array - JSArray(); - - // Create Array from list of JSValues - JSArray(const std::initializer_list& values); - - // Create Array from existing JSObjectRef (JavaScriptCore C API) - JSArray(JSObjectRef array_obj); - - // Copy constructor (shallow copy, will point to same instance) - JSArray(const JSArray& other); - - ~JSArray(); - - // Assignment (shallow assignment, will point to same instance) - JSArray& operator=(const JSArray& other); - - // Get number of elements in the Array - unsigned length(); - - // Push an element to back of Array - void push(const JSValue& val); - - // Find the index (location) of a certain value, will return -1 if not found - int indexOf(const JSValue& val, int start = 0) const; - - // Get a property by array index (numbering starts at 0) - JSPropertyValue operator[](unsigned idx) const; - - // Get the underlying JSObjectRef (JavaScriptCore C API) - operator JSObjectRef() const { return instance_; } - -protected: - JSArray(JSContextRef ctx, JSValueRef val); - - JSContextRef ctx_; - JSObjectRef instance_; - friend class JSValue; -}; - -/** - * JSObject wrapper that automatically manages lifetime and provides - * convenient access to properties. - */ -class AExport JSObject { -public: - // Create empty Object - JSObject(); - - // Create from existing JSObjectRef from JavaScriptCore C API - JSObject(JSObjectRef obj); - - // Copy constructor (shallow copy, will point to same instance) - JSObject(const JSObject& other); - - ~JSObject(); - - // Assignment (shallow assignment, will point to same instance) - JSObject& operator=(const JSObject& other); - - // Get a property by name - JSPropertyValue operator[](JSString propertyName) const; - - // Check if a property exists - bool HasProperty(JSString propertyName) const; - - // Remove a property - bool DeleteProperty(JSString propertyName); - - // Get the underlying JSObjectRef (JavaScriptCore C API) - operator JSObjectRef() const { return instance_; } - -protected: - JSObject(JSContextRef ctx, JSValueRef val); - JSObject(JSContextRef ctx, JSObjectRef obj); - - JSContextRef ctx_; - JSObjectRef instance_; - friend class JSValue; - friend class JSPropertyValue; -}; - -/** -* JSFunction wrapper that automatically manages lifetime and provides -* convenient function invocation operators. -*/ -class AExport JSFunction { -public: - // Create an empty Function. - // NOTE: It is OKAY to create this without calling SetJSContext() first. - JSFunction(); - - // Copy constructor (shallow copy, will point to same instance) - JSFunction(const JSFunction& other); - - ~JSFunction(); - - // Assignment (shallow assignment, will point to same instance) - JSFunction& operator=(const JSFunction& other); - - // Whether or not this is a valid, callable Function object. - bool IsValid() const; - - // Call function (using Global Object for 'this') and return the result. - JSValue operator()(const JSArgs& args); - - // Call function (with explicit object for 'this') and return the result - JSValue operator()(const JSObject& thisObject, const JSArgs& args); - - // Get the underlying JSObjectRef (JavaScriptCore C API) - operator JSObjectRef() const { return instance_; } - -protected: - JSFunction(JSContextRef ctx, JSValueRef val); - - JSContextRef ctx_; - JSObjectRef instance_; - friend class JSValue; -}; - -/** - * Get the Global Object for the current JSContext. - * In JavaScript, this would be equivalent to the "window" object. - */ -JSObject AExport JSGlobalObject(); - -/** - * Evaluate a string of JavaScript and return a result. - */ -JSValue AExport JSEval(const JSString& str); - -} // namespace ultralight diff --git a/include/AppCore/Monitor.h b/include/AppCore/Monitor.h deleted file mode 100644 index 26a9ebf..0000000 --- a/include/AppCore/Monitor.h +++ /dev/null @@ -1,41 +0,0 @@ -/// -/// @file Monitor.h -/// -/// @brief The header for the Monitor class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include "Defines.h" - -namespace ultralight { - -/// -/// Monitor class, represents a platform monitor. -/// -class AExport Monitor { -public: - virtual ~Monitor() {} - - /// - /// Get the DPI scale (1.0 = 100%) - /// - virtual double scale() const = 0; - - /// - /// Get the width of the monitor. - /// - virtual uint32_t width() const = 0; - - /// Get the height of the monitor. - /// - virtual uint32_t height() const = 0; -}; - -} // namespace ultralight diff --git a/include/AppCore/Overlay.h b/include/AppCore/Overlay.h deleted file mode 100644 index 2e9ebbe..0000000 --- a/include/AppCore/Overlay.h +++ /dev/null @@ -1,137 +0,0 @@ -/// -/// @file Overlay.h -/// -/// @brief The header for the Overlay class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include "Window.h" -#include - -namespace ultralight { - -/// -/// Web-content overlay. Displays a web-page within an area of the main window. -/// -/// @note Each Overlay is essentially a View and an on-screen quad. You should -/// create the Overlay then load content into the underlying View. -/// -class AExport Overlay : public RefCounted { -public: - /// - /// Create a new Overlay. - /// - /// @param window The window to create the Overlay in. (we currently only - /// support one window per application) - /// - /// @param width The width in device coordinates. - /// - /// @param height The height in device coordinates. - /// - /// @param x The x-position (offset from the left of the Window), in - /// device coordinates. - /// - /// @param y The y-position (offset from the top of the Window), in - /// device coordinates. - /// - static Ref Create(Ref window, uint32_t width, - uint32_t height, int x, int y); - - /// - /// Create a new Overlay, wrapping an existing View. - /// - /// @param window The window to create the Overlay in. (we currently only - /// support one window per application) - /// - /// @param view The View to wrap (will use its width and height). - /// - /// @param x The x-position (offset from the left of the Window), in - /// device coordinates. - /// - /// @param y The y-position (offset from the top of the Window), in - /// device coordinates. - /// - static Ref Create(Ref window, Ref view, int x, int y); - - /// - /// Get the underlying View. - /// - virtual ultralight::Ref view() = 0; - - /// - /// Get the width (in device coordinates). - /// - virtual uint32_t width() const = 0; - - /// - /// Get the height (in device coordinates). - /// - virtual uint32_t height() const = 0; - - /// - /// Get the x-position (offset from the left of the Window), in device - /// coordinates. - /// - virtual int x() const = 0; - - /// - /// Get the y-position (offset from the top of the Window), in device - /// coordinates. - /// - virtual int y() const = 0; - - /// - /// Whether or not the overlay is hidden (not drawn). - /// - virtual bool is_hidden() const = 0; - - /// - /// Hide the overlay (will no longer be drawn) - /// - virtual void Hide() = 0; - - /// - /// Show the overlay. - /// - virtual void Show() = 0; - - /// - /// Whether or not this overlay has keyboard focus. - /// - virtual bool has_focus() const = 0; - - /// - /// Grant this overlay exclusive keyboard focus. - /// - virtual void Focus() = 0; - - /// - /// Remove keyboard focus. - /// - virtual void Unfocus() = 0; - - /// - /// Move the overlay to a new position (in device coordinates). - /// - virtual void MoveTo(int x, int y) = 0; - - /// - /// Resize the overlay (and underlying View), dimensions should be - /// specified in device coordinates. - /// - virtual void Resize(uint32_t width, uint32_t height) = 0; - -protected: - virtual ~Overlay(); - virtual void Draw() = 0; - friend class OverlayManager; -}; - -} // namespace framework diff --git a/include/AppCore/Window.h b/include/AppCore/Window.h deleted file mode 100644 index 2068167..0000000 --- a/include/AppCore/Window.h +++ /dev/null @@ -1,141 +0,0 @@ -/// -/// @file Window.h -/// -/// @brief The header for the Window class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include "Defines.h" -#include -#include - -namespace ultralight { - -class Monitor; -class OverlayManager; - -/// -/// Interface for all Window-related events. @see Window::set_listener -/// -class WindowListener { -public: - virtual ~WindowListener() {} - - /// - /// Called when the Window is closed. - /// - virtual void OnClose() = 0; - - /// - /// Called when the Window is resized. - /// - /// @param width The new width (in device coordinates). - /// - /// @param height The new height (in device coordinates). - /// - virtual void OnResize(uint32_t width, uint32_t height) = 0; -}; - -/// -/// Window creation flags. @see Window::Create -/// -enum WindowFlags : uint8_t { - kWindowFlags_Borderless = 1 << 0, - kWindowFlags_Titled = 1 << 1, - kWindowFlags_Resizable = 1 << 2, - kWindowFlags_Maximizable = 1 << 3, -}; - -/// -/// Window class, represents a platform window. -/// -class AExport Window : public RefCounted { -public: - /// - /// Create a new Window. - /// - /// @param monitor The monitor to create the Window on. - /// - /// @param width The width (in device coordinates). - /// - /// @param height The height (in device coordinates). - /// - /// @param fullscreen Whether or not the window is fullscreen. - /// - /// @param window_flags Various window flags. - /// - static Ref Create(Monitor* monitor, uint32_t width, uint32_t height, - bool fullscreen, unsigned int window_flags); - - /// - /// Set a WindowListener to receive callbacks for window-related events. - /// - /// @note Ownership remains with the caller. - /// - virtual void set_listener(WindowListener* listener) = 0; - - /// - /// Get the WindowListener, if any. - /// - virtual WindowListener* listener() = 0; - - /// - /// Get the window width (in device coordinates). - /// - virtual uint32_t width() const = 0; - - /// - /// Get the window height (in device coordinates). - /// - virtual uint32_t height() const = 0; - - /// - /// Whether or not the window is fullscreen. - /// - virtual bool is_fullscreen() const = 0; - - /// - /// The DPI scale of the window. - /// - virtual double scale() const = 0; - - /// - /// Set the window title. - /// - virtual void SetTitle(const char* title) = 0; - - /// - /// Set the cursor. - /// - virtual void SetCursor(ultralight::Cursor cursor) = 0; - - /// - /// Close the window. - /// - virtual void Close() = 0; - - /// - /// Convert device coordinates to pixels using the current DPI scale. - /// - virtual int DeviceToPixels(int val) const = 0; - - /// - /// Convert pixels to device coordinates using the current DPI scale. - /// - virtual int PixelsToDevice(int val) const = 0; - -protected: - virtual ~Window(); - virtual OverlayManager* overlay_manager() const = 0; - - friend class OverlayImpl; -}; - -} // namespace ultralight diff --git a/include/Ultralight/Bitmap.h b/include/Ultralight/Bitmap.h deleted file mode 100644 index cb17485..0000000 --- a/include/Ultralight/Bitmap.h +++ /dev/null @@ -1,269 +0,0 @@ -/// -/// @file Bitmap.h -/// -/// @brief The header for the Bitmap class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -#pragma pack(push, 1) - -/// -/// The various Bitmap formats. -/// -enum UExport BitmapFormat { - /** - * 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. - * - * NOTE: Alpha is premultiplied with BGR channels _before_ sRGB gamma is - * applied so we can use sRGB conversion hardware and perform all - * blending in linear space on GPU. - */ - kBitmapFormat_BGRA8_UNORM_SRGB, -}; - -/// -/// Macro to get the bytes per pixel from a BitmapFormat -/// -#define GetBytesPerPixel(x) (x == kBitmapFormat_A8_UNORM? 1 : 4) - -/// -/// @brief Bitmap container with basic blitting and conversion routines. -/// -class UExport Bitmap : public RefCounted { - public: - /// - /// Create an empty Bitmap. No pixels will be allocated. - /// - static Ref Create(); - - /// - /// Create a Bitmap with a certain configuration. Pixels will be allocated - /// but not initialized. - /// - /// @param width The width in pixels. - /// - /// @param height The height in pixels. - /// - /// @param format The pixel format to use. - /// - /// @return A ref-pointer to a new Bitmap instance. - /// - static Ref Create(uint32_t width, uint32_t height, - BitmapFormat format); - - /// - /// Create a Bitmap with existing pixels and configuration. - /// - /// @param width The width in pixels. - /// - /// @param height The height in pixels. - /// - /// @param format The pixel format to use. - /// - /// @param row_bytes The number of bytes between each row (note that this - /// value should be >= width * bytes_per_pixel). - /// - /// @param pixels Pointer to raw pixel buffer. - /// - /// @param size Size of the raw pixel buffer. - /// - /// @param should_copy Whether or not a copy should be made of the pixels. - /// If this is false, the returned Bitmap will use the - /// raw pixels passed in as its own, but you are still - /// responsible for destroying your buffer afterwards. - /// - /// @param fixup_gamma Whether or not we should reinterpret the source - /// as an sRGB bitmap with premultiplied alpha applied - /// after the gamma function (typical of PNGs). We - /// expect all premultiplication to be applied before - /// the gamma function so we can blend properly in - /// linear space. Only valid for - /// kBitmapFormat_BGRA8_UNORM_SRGB. - /// - /// @return A ref-pointer to a new Bitmap instance. - /// - static Ref Create(uint32_t width, uint32_t height, - BitmapFormat format, uint32_t row_bytes, - const void* pixels, size_t size, - bool should_copy = true, bool fixup_gamma = false); - - /// - /// Create a bitmap from a deep copy of another Bitmap. - /// - static Ref Create(const Bitmap& bitmap); - - /// - /// Get the width in pixels. - /// - virtual uint32_t width() const = 0; - - /// - /// Get the height in pixels. - /// - virtual uint32_t height() const = 0; - - /// - /// Get the bounds as an IntRect - /// - virtual IntRect bounds() const = 0; - - /// - /// Get the pixel format. - /// - virtual BitmapFormat format() const = 0; - - /// - /// Get the number of bytes per pixel. - /// - virtual uint32_t bpp() const = 0; - - /// - /// Get the number of bytes between each row (this is always >= width * bpp) - /// - virtual uint32_t row_bytes() const = 0; - - /// - /// Get the size in bytes of the pixel buffer. - /// - virtual size_t size() const = 0; - - /// - /// Whether or not this Bitmap owns the pixel buffer and will destroy it - /// at the end of its lifetime. - /// - virtual bool owns_pixels() const = 0; - - /// - /// Lock the pixel buffer for reading/writing. - /// - /// @return A pointer to the pixel buffer. - /// - virtual void* LockPixels() = 0; - - /// - /// Unlock the pixel buffer. - /// - virtual void UnlockPixels() = 0; - - /// - /// Lock the pixel buffer for reading/writing. (const) - /// - /// @return A const pointer to the pixel buffer. - /// - virtual const void* LockPixels() const = 0; - - /// - /// Unlock the pixel buffer. (const) - /// - virtual void UnlockPixels() const = 0; - - /// - /// Get the raw pixel buffer. - /// - /// @note You should only call this if pixels are already locked. - /// - virtual void* raw_pixels() = 0; - - /// - /// Whether or not this Bitmap is empty (no pixels allocated). - /// - virtual bool IsEmpty() const = 0; - - /// - /// Erase the Bitmap (set all pixels to 0). - /// - virtual void Erase() = 0; - - /// - /// Assign another bitmap to this one. - /// - /// @param bitmap The bitmap to copy from. - /// - virtual void Set(Ref bitmap) = 0; - - /// - /// Draw another bitmap to this bitmap. - /// - /// @note Formats do not need to match. Bitmap formats will be converted - /// to one another automatically. Note that when converting from - /// BGRA8 to A8, only the Blue channel will be used. - /// - /// @param src_rect The source rectangle, relative to src bitmap. - /// - /// @param dest_rect The destination rectangle, relative to this bitmap. - /// - /// @param src The source bitmap. - /// - /// @param pad_repeat Whether or not we should pad the drawn bitmap by one - /// pixel of repeated edge pixels from the source bitmap. - /// - /// @return Whether or not the operation succeeded (this can fail if the - /// src_rect and/or dest_rect are invalid, or if their total - /// dimensions do not match). - /// - virtual bool DrawBitmap(IntRect src_rect, IntRect dest_rect, - Ref src, bool pad_repeat) = 0; - - /// - /// Write this Bitmap out to a PNG image. (mainly used for Debug) - /// - /// @param path The filepath to write to (opened with fopen()) - /// - /// @return Whether or not the operation succeeded. - /// - virtual bool WritePNG(const char* path) = 0; - - - /// - /// Make a resized copy of this bitmap by writing to a pre-allocated - /// destination bitmap. - /// - /// @param destination The bitmap to store the result in, the width and - /// height of the destination will be used. - /// - /// @param high_quality Whether or not a high quality resampling will be - /// used during the resize. (Otherwise, just uses fast - /// nearest-neighbor sampling) - /// - /// @return Whether or not the operation succeeded. This operation is only - /// valid if both formats are kBitmapFormat_BGRA8_UNORM_SRGB and - /// both the source and destination are non-empty. - /// - virtual bool Resample(Ref destination, bool high_quality) = 0; - -protected: - Bitmap(); - virtual ~Bitmap(); - Bitmap(const Bitmap&); - void operator=(const Bitmap&); -}; - -#pragma pack(pop) - -} // namespace ultralight diff --git a/include/Ultralight/Buffer.h b/include/Ultralight/Buffer.h deleted file mode 100644 index aa05627..0000000 --- a/include/Ultralight/Buffer.h +++ /dev/null @@ -1,47 +0,0 @@ -/// -/// @file Buffer.h -/// -/// @brief The header for the Buffer class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// A fixed-size byte container for passing data around. -/// -class UExport Buffer : public RefCounted { -public: - /// - /// Create a Buffer, a copy of data is made. - /// - static Ref Create(const void* data, size_t size); - - /// - /// Get a pointer to raw byte data. - /// - virtual void* data() = 0; - - /// - /// Get the size in bytes. - /// - virtual size_t size() const = 0; - -protected: - Buffer(); - virtual ~Buffer(); - Buffer(const Buffer&); - void operator=(const Buffer&); -}; - -} // namespace ultralight diff --git a/include/Ultralight/Defines.h b/include/Ultralight/Defines.h deleted file mode 100644 index fa8c6fc..0000000 --- a/include/Ultralight/Defines.h +++ /dev/null @@ -1,79 +0,0 @@ -/// -/// @file Defines.h -/// -/// @brief Common platform definitions -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once - -// Needed for limit defines, like INTMAX_MAX, which is used by the std C++ library -#ifndef __STDC_LIMIT_MACROS -#define __STDC_LIMIT_MACROS -#endif - -#include -#include -#include - -#ifdef SWIG -#define UExport -#else - -// Require C++11 Support -#if defined(_MSC_VER) -# if _MSC_VER < 1800 -# error This project needs at least Visual Studio 2013 to build -# endif -#elif __cplusplus <= 199711L -# error This project can only be compiled with a compiler that supports C++11 -#endif - - -#if defined(__WIN32__) || defined(_WIN32) -# if defined(ULTRALIGHT_IMPLEMENTATION) -# define UExport __declspec(dllexport) -# else -# define UExport __declspec(dllimport) -# endif -#define _thread_local __declspec(thread) -#ifndef _NATIVE_WCHAR_T_DEFINED -#define DISABLE_NATIVE_WCHAR_T -#endif -#else -# define UExport __attribute__((visibility("default"))) -#define _thread_local __thread -#endif - -#endif - -#define ULTRALIGHT_VERSION "1.0.0" - -/// -/// @mainpage Ultralight C++ API Reference -/// -/// @section intro_sec Introduction -/// -/// Hi there, welcome to the C++ API Reference for Ultralight! -/// -/// Ultralight is a fast, lightweight HTML UI engine for desktop apps. -/// -/// If this is your first time exploring the API, we recommend -/// starting with ultralight::Renderer and ultralight::View. -/// -/// -/// @section usefullinks_sec Useful Links -/// - Home: -- Get the latest binaries -/// - Docs: -- API overview, code snippets, tutorials and more! -/// - Slack: -- Stuck? Have questions? Come chat with us! -/// - GitHub: -- Report issues and browse code -/// -/// @section copyright_sec Copyright -/// Documentation is copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// diff --git a/include/Ultralight/Geometry.h b/include/Ultralight/Geometry.h deleted file mode 100644 index 12ac8e9..0000000 --- a/include/Ultralight/Geometry.h +++ /dev/null @@ -1,676 +0,0 @@ -/// -/// @file Geometry.h -/// -/// @brief The header for various geometry definitions and helpers -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include - -namespace ultralight { - -/// -/// 2D Vector Helper -/// -struct UExport vec2 { - union { - float value[2]; - struct { float x, y; }; - }; - - inline vec2() {} - - inline vec2(float x, float y) : x(x), y(y) {} - - inline vec2(float x) : x(x), y(x) {} - - inline vec2 yx() const { return { y, x }; } - - inline vec2 xx() const { return { x, x }; } - - inline vec2 yy() const { return { y, y }; } - - inline friend vec2 operator+(vec2 lhs, const vec2& rhs) { lhs += rhs; return lhs; } - - inline friend vec2 operator-(vec2 lhs, const vec2& rhs) { lhs -= rhs; return lhs; } - - inline friend vec2 operator*(vec2 lhs, const vec2& rhs) { lhs *= rhs; return lhs; } - - inline friend vec2 operator/(vec2 lhs, const vec2& rhs) { lhs /= rhs; return lhs; } - - inline friend vec2 operator+(vec2 lhs, float rhs) { lhs += rhs; return lhs; } - - inline friend vec2 operator-(vec2 lhs, float rhs) { lhs -= rhs; return lhs; } - - inline friend vec2 operator*(vec2 lhs, float rhs) { lhs *= rhs; return lhs; } - - inline friend vec2 operator/(vec2 lhs, float rhs) { lhs /= rhs; return lhs; } - - inline vec2& operator+=(const vec2& rhs) { - value[0] += rhs.value[0]; - value[1] += rhs.value[1]; - return *this; - } - - inline vec2& operator-=(const vec2& rhs) { - value[0] -= rhs.value[0]; - value[1] -= rhs.value[1]; - return *this; - } - - inline vec2& operator*=(const vec2& rhs) { - value[0] *= rhs.value[0]; - value[1] *= rhs.value[1]; - return *this; - } - - inline vec2& operator/=(const vec2& rhs) { - value[0] /= rhs.value[0]; - value[1] /= rhs.value[1]; - return *this; - } - - inline vec2& operator+=(float rhs) { - value[0] += rhs; - value[1] += rhs; - return *this; - } - - inline vec2& operator-=(float rhs) { - value[0] -= rhs; - value[1] -= rhs; - return *this; - } - - inline vec2& operator*=(float rhs) { - value[0] *= rhs; - value[1] *= rhs; - return *this; - } - - inline vec2& operator/=(float rhs) { - value[0] /= rhs; - value[1] /= rhs; - return *this; - } - - inline friend bool operator==(const vec2& a, const vec2& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - inline friend bool operator!=(const vec2& a, const vec2& b) { - return !(a == b); - } - - inline friend vec2 min_(const vec2& a, const vec2& b) { - return{ (b.x < a.x) ? b.x : a.x, - (b.y < a.y) ? b.y : a.y }; - } - - inline friend vec2 max_(const vec2& a, const vec2& b) { - return{ (a.x < b.x) ? b.x : a.x, - (a.y < b.y) ? b.y : a.y }; - } - - inline friend vec2 clamp(const vec2& x, const vec2& minVal, const vec2& maxVal) { - return min_(max_(x, minVal), maxVal); - } - - inline friend vec2 mix(const vec2& a, const vec2& b, float t) { - return a * (1.0f - t) + b * t; - } - - inline friend float length(const vec2& a) { - return sqrtf(a.x * a.x + a.y * a.y); - } - - // squared length - inline friend float length2(const vec2& a) { - return dot(a, a); - } - - inline friend float distance(const vec2& a, const vec2& b) { - return length(a - b); - } - - // squared distance - inline friend float distance2(const vec2& a, const vec2& b) { - return length2(a - b); - } - - inline friend vec2 normalize(const vec2& a) { - return a / length(a); - } - - inline friend float dot(const vec2& a, const vec2& b) { - return a.x * b.x + a.y * b.y; - } -}; - -/// -/// 3D Vector Helper -/// -struct UExport vec3 { - union { - float value[3]; - struct { float x, y, z; }; - }; - - inline vec3() {} - - inline vec3(float x, float y, float z) : x(x), y(y), z(z) {} - - inline vec3(float x) : x(x), y(x), z(x) {} - - inline friend vec3 operator+(vec3 lhs, const vec3& rhs) { lhs += rhs; return lhs; } - - inline friend vec3 operator-(vec3 lhs, const vec3& rhs) { lhs -= rhs; return lhs; } - - inline friend vec3 operator*(vec3 lhs, const vec3& rhs) { lhs *= rhs; return lhs; } - - inline friend vec3 operator/(vec3 lhs, const vec3& rhs) { lhs /= rhs; return lhs; } - - inline friend vec3 operator+(vec3 lhs, float rhs) { lhs += rhs; return lhs; } - - inline friend vec3 operator-(vec3 lhs, float rhs) { lhs -= rhs; return lhs; } - - inline friend vec3 operator*(vec3 lhs, float rhs) { lhs *= rhs; return lhs; } - - inline friend vec3 operator/(vec3 lhs, float rhs) { lhs /= rhs; return lhs; } - - inline vec3& operator+=(const vec3& rhs) { - value[0] += rhs.value[0]; - value[1] += rhs.value[1]; - value[2] += rhs.value[2]; - return *this; - } - - inline vec3& operator-=(const vec3& rhs) { - value[0] -= rhs.value[0]; - value[1] -= rhs.value[1]; - value[2] -= rhs.value[2]; - return *this; - } - - inline vec3& operator*=(const vec3& rhs) { - value[0] *= rhs.value[0]; - value[1] *= rhs.value[1]; - value[2] *= rhs.value[2]; - return *this; - } - - inline vec3& operator/=(const vec3& rhs) { - value[0] /= rhs.value[0]; - value[1] /= rhs.value[1]; - value[2] /= rhs.value[2]; - return *this; - } - - inline vec3& operator+=(float rhs) { - value[0] += rhs; - value[1] += rhs; - value[2] += rhs; - return *this; - } - - inline vec3& operator-=(float rhs) { - value[0] -= rhs; - value[1] -= rhs; - value[2] -= rhs; - return *this; - } - - inline vec3& operator*=(float rhs) { - value[0] *= rhs; - value[1] *= rhs; - value[2] *= rhs; - return *this; - } - - inline vec3& operator/=(float rhs) { - value[0] /= rhs; - value[1] /= rhs; - value[2] /= rhs; - return *this; - } - - inline friend bool operator==(const vec3& a, const vec3& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - inline friend bool operator!=(const vec3& a, const vec3& b) { - return !(a == b); - } - - inline friend vec3 min_(const vec3& a, const vec3& b) { - return{ (b.x < a.x) ? b.x : a.x, - (b.y < a.y) ? b.y : a.y, - (b.z < a.z) ? b.z : a.z }; - } - - inline friend vec3 max_(const vec3& a, const vec3& b) { - return{ (a.x < b.x) ? b.x : a.x, - (a.y < b.y) ? b.y : a.y, - (a.z < b.z) ? b.z : a.z }; - } - inline friend vec3 clamp(const vec3& x, const vec3& minVal, const vec3& maxVal) { - return min_(max_(x, minVal), maxVal); - } - - inline friend vec3 mix(const vec3& a, const vec3& b, float t) { - return a * (1.0f - t) + b * t; - } - - inline friend float length(const vec3& a) { - return sqrtf(a.x * a.x + a.y * a.y + a.z * a.z); - } - - inline friend float distance(const vec3& a, const vec3& b) { - return length(a - b); - } - - inline friend vec3 normalize(const vec3& a) { - return a / length(a); - } - - inline friend float dot(const vec3& a, const vec3& b) { - return a.x * b.x + a.y * b.y + a.z * b.z; - } -}; - -/// -/// 4D Vector Helper -/// -struct UExport vec4 { - union { - float value[4]; - struct { float x, y, z, w; }; - }; - - inline vec4() {} - - inline vec4(float x, float y, float z, float w) : x(x), y(y), z(z), w(w) {} - - inline vec4(float x) : x(x), y(x), z(x), w(x) {} - - inline vec4(const float x[4]) { memcpy(value, x, sizeof(value)); } - - inline friend bool operator==(const vec4& a, const vec4& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - inline friend bool operator!=(const vec4& a, const vec4& b) { - return !(a == b); - } - - inline friend vec4 operator+(vec4 lhs, const vec4& rhs) { lhs += rhs; return lhs; } - - inline friend vec4 operator-(vec4 lhs, const vec4& rhs) { lhs -= rhs; return lhs; } - - inline friend vec4 operator*(vec4 lhs, const vec4& rhs) { lhs *= rhs; return lhs; } - - inline friend vec4 operator/(vec4 lhs, const vec4& rhs) { lhs /= rhs; return lhs; } - - inline friend vec4 operator+(vec4 lhs, float rhs) { lhs += rhs; return lhs; } - - inline friend vec4 operator-(vec4 lhs, float rhs) { lhs -= rhs; return lhs; } - - inline friend vec4 operator*(vec4 lhs, float rhs) { lhs *= rhs; return lhs; } - - inline friend vec4 operator/(vec4 lhs, float rhs) { lhs /= rhs; return lhs; } - - inline vec4& operator+=(const vec4& rhs) { - value[0] += rhs.value[0]; - value[1] += rhs.value[1]; - value[2] += rhs.value[2]; - value[3] += rhs.value[3]; - return *this; - } - - inline vec4& operator-=(const vec4& rhs) { - value[0] -= rhs.value[0]; - value[1] -= rhs.value[1]; - value[2] -= rhs.value[2]; - value[3] -= rhs.value[3]; - return *this; - } - - inline vec4& operator*=(const vec4& rhs) { - value[0] *= rhs.value[0]; - value[1] *= rhs.value[1]; - value[2] *= rhs.value[2]; - value[3] *= rhs.value[3]; - return *this; - } - - inline vec4& operator/=(const vec4& rhs) { - value[0] /= rhs.value[0]; - value[1] /= rhs.value[1]; - value[2] /= rhs.value[2]; - value[3] /= rhs.value[3]; - return *this; - } - - inline vec4& operator+=(float rhs) { - value[0] += rhs; - value[1] += rhs; - value[2] += rhs; - value[3] += rhs; - return *this; - } - - inline vec4& operator-=(float rhs) { - value[0] -= rhs; - value[1] -= rhs; - value[2] -= rhs; - value[3] -= rhs; - return *this; - } - - inline vec4& operator*=(float rhs) { - value[0] *= rhs; - value[1] *= rhs; - value[2] *= rhs; - value[3] *= rhs; - return *this; - } - - inline vec4& operator/=(float rhs) { - value[0] /= rhs; - value[1] /= rhs; - value[2] /= rhs; - value[3] /= rhs; - return *this; - } - - inline friend vec4 min_(const vec4& a, const vec4& b) { - return{ (b.x < a.x) ? b.x : a.x, - (b.y < a.y) ? b.y : a.y, - (b.z < a.z) ? b.z : a.z, - (b.w < a.w) ? b.w : a.w }; - } - - inline friend vec4 max_(const vec4& a, const vec4& b) { - return{ (a.x < b.x) ? b.x : a.x, - (a.y < b.y) ? b.y : a.y, - (a.z < b.z) ? b.z : a.z, - (a.w < b.w) ? b.w : a.w }; - } -}; - -/// -/// Point is typedef'd to a 2D vector -/// -typedef vec2 Point; - -/// -/// Float Rectangle Helper -/// -struct UExport Rect { - union { - float value[4]; - struct { float left, top, right, bottom; }; - }; - - static inline Rect MakeEmpty() { - Rect result; - result.SetEmpty(); - return result; - } - - inline float width() const { return right - left; } - inline float height() const { return bottom - top; } - inline float x() const { return left; } - inline float y() const { return top; } - inline float center_x() const { return (left + right) * 0.5f; } - inline float center_y() const { return (top + bottom) * 0.5f; } - - inline Point origin() const { return { left, top }; } - - inline void SetEmpty() { - memset(this, 0, sizeof(*this)); - } - - inline bool IsEmpty() const { - return *this == MakeEmpty(); - } - - inline bool IsValid() const { - return width() > 0 && height() > 0; - } - - inline void Inset(float dx, float dy) { - value[0] += dx; - value[1] += dy; - value[2] -= dx; - value[3] -= dy; - } - - inline void Outset(float dx, float dy) { - Inset(-dx, -dy); - } - - inline void Move(float dx, float dy) { - value[0] += dx; - value[1] += dy; - value[2] += dx; - value[3] += dy; - } - - inline float area() const { - return width() * height(); - } - - inline void Join(const Rect& rhs) { - // if we are empty, just assign - if (IsEmpty()) { - *this = rhs; - } - else { - if (rhs.value[0] < value[0]) value[0] = rhs.value[0]; - if (rhs.value[1] < value[1]) value[1] = rhs.value[1]; - if (rhs.value[2] > value[2]) value[2] = rhs.value[2]; - if (rhs.value[3] > value[3]) value[3] = rhs.value[3]; - } - } - - inline void Join(const Point& p) { - // if we are empty, just assign - if (IsEmpty()) { - *this = { p.x, p.y, p.x, p.y }; - } - else { - if (p.x < value[0]) value[0] = p.x; - if (p.y < value[1]) value[1] = p.y; - if (p.x > value[2]) value[2] = p.x; - if (p.y > value[3]) value[3] = p.y; - } - } - - inline bool Contains(const Point& p) const { - return p.x >= left && p.x <= right && - p.y >= top && p.y <= bottom; - } - - inline bool Contains(const Rect& r) const { - return left <= r.left && top <= r.top && - right >= r.right && bottom >= r.bottom; - } - - inline bool Intersects(const Rect& rhs) const { - return !(rhs.left > right || - rhs.right < left || - rhs.top > bottom || - rhs.bottom < top); - } - - inline Rect Intersect(const Rect& other) const { - return{ (left < other.left) ? other.left : left, - (top < other.top) ? other.top : top, - (other.right < right) ? other.right : right, - (other.bottom < bottom) ? other.bottom : bottom }; - } - - friend inline bool operator==(const Rect& a, const Rect& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - friend inline bool operator!=(const Rect& a, const Rect& b) { - return !(a == b); - } -}; - -/// -/// Integer Rectangle Helper -/// -struct UExport IntRect { - union { - int value[4]; - struct { int left, top, right, bottom; }; - }; - - static inline IntRect MakeEmpty() { - IntRect result; - result.SetEmpty(); - return result; - } - - inline int width() const { return right - left; } - inline int height() const { return bottom - top; } - inline int x() const { return left; } - inline int y() const { return top; } - inline int center_x() const { return (int)std::round((left + right) * 0.5f); } - inline int center_y() const { return (int)std::round((top + bottom) * 0.5f); } - - inline Point origin() const { return{ (float)left, (float)top }; } - - inline void SetEmpty() { - memset(this, 0, sizeof(*this)); - } - - inline bool IsEmpty() const { - return *this == MakeEmpty(); - } - - inline bool IsValid() const { - return width() > 0 && height() > 0; - } - - inline void Inset(int dx, int dy) { - value[0] += dx; - value[1] += dy; - value[2] -= dx; - value[3] -= dy; - } - - inline void Outset(int dx, int dy) { - Inset(-dx, -dy); - } - - inline void Move(int dx, int dy) { - value[0] += dx; - value[1] += dy; - value[2] += dx; - value[3] += dy; - } - - inline int area() const { - return width() * height(); - } - - inline void Join(const IntRect& rhs) { - // if we are empty, just assign - if (IsEmpty()) { - *this = rhs; - } - else { - if (rhs.value[0] < value[0]) value[0] = rhs.value[0]; - if (rhs.value[1] < value[1]) value[1] = rhs.value[1]; - if (rhs.value[2] > value[2]) value[2] = rhs.value[2]; - if (rhs.value[3] > value[3]) value[3] = rhs.value[3]; - } - } - - inline void Join(const Point& p) { - // if we are empty, just assign - if (IsEmpty()) { - *this = { (int)std::floor(p.x), (int)std::floor(p.y), (int)std::ceil(p.x), (int)std::ceil(p.y) }; - } - else { - if ((int)std::floor(p.x) < value[0]) value[0] = (int)std::floor(p.x); - if ((int)std::floor(p.y) < value[1]) value[1] = (int)std::floor(p.y); - if ((int)std::ceil(p.x) > value[2]) value[2] = (int)std::ceil(p.x); - if ((int)std::ceil(p.y) > value[3]) value[3] = (int)std::ceil(p.y); - } - } - - inline bool Contains(const Point& p) const { - return p.x >= left && p.x <= right && - p.y >= top && p.y <= bottom; - } - - inline bool Contains(const IntRect& r) const { - return left <= r.left && top <= r.top && - right >= r.right && bottom >= r.bottom; - } - - inline bool Intersects(const IntRect& rhs) const { - // Since this is mostly used for pixel operations, we only count - // intersections that have width and height >= 1. - return !(rhs.left > right - 1 || - rhs.right < left || - rhs.top > bottom - 1 || - rhs.bottom < top); - } - - inline IntRect Intersect(const IntRect& other) const { - return{ (left < other.left) ? other.left : left, - (top < other.top) ? other.top : top, - (other.right < right) ? other.right : right, - (other.bottom < bottom) ? other.bottom : bottom }; - } - - friend inline bool operator==(const IntRect& a, const IntRect& b) { - return !memcmp(&a, &b, sizeof(a)); - } - - friend inline bool operator!=(const IntRect& a, const IntRect& b) { - return !(a == b); - } -}; - -/// -/// Rounded Rectangle Helper -/// -struct UExport RoundedRect { - Rect rect; - float radii_x[4]; - float radii_y[4]; - - void SetEmpty(); - - bool IsRounded() const; - - // Negative is inside, positive is outside. - float GetSignedDistance(const Point& p) const; - - // Returns whether or not intersection is found. Can fail if the resulting - // geometry is not a rounded rectangle. - bool Intersect(const RoundedRect& other, RoundedRect& result) const; - - void SnapToPixels(); - - Rect CalculateInterior() const; -}; - -} // namespace ultralight diff --git a/include/Ultralight/KeyCodes.h b/include/Ultralight/KeyCodes.h deleted file mode 100644 index 1133d60..0000000 --- a/include/Ultralight/KeyCodes.h +++ /dev/null @@ -1,527 +0,0 @@ -/// -/// @file KeyCodes.h -/// -/// @brief The header for the KeyCodes definitions. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once - -namespace ultralight { - -/// -/// Namespace containing all the key-code definitions for KeyboardEvent. -/// Most of these correspond directly to the key-code values on Windows. - /// -namespace KeyCodes { - - // GK_BACK (08) BACKSPACE key - const int GK_BACK = 0x08; - - // GK_TAB (09) TAB key - const int GK_TAB = 0x09; - - // GK_CLEAR (0C) CLEAR key - const int GK_CLEAR = 0x0C; - - // GK_RETURN (0D) - const int GK_RETURN = 0x0D; - - // GK_SHIFT (10) SHIFT key - const int GK_SHIFT = 0x10; - - // GK_CONTROL (11) CTRL key - const int GK_CONTROL = 0x11; - - // GK_MENU (12) ALT key - const int GK_MENU = 0x12; - - // GK_PAUSE (13) PAUSE key - const int GK_PAUSE = 0x13; - - // GK_CAPITAL (14) CAPS LOCK key - const int GK_CAPITAL = 0x14; - - // GK_KANA (15) Input Method Editor (IME) Kana mode - const int GK_KANA = 0x15; - - // GK_HANGUEL (15) IME Hanguel mode (maintained for compatibility; use GK_HANGUL) - // GK_HANGUL (15) IME Hangul mode - const int GK_HANGUL = 0x15; - - // GK_JUNJA (17) IME Junja mode - const int GK_JUNJA = 0x17; - - // GK_FINAL (18) IME final mode - const int GK_FINAL = 0x18; - - // GK_HANJA (19) IME Hanja mode - const int GK_HANJA = 0x19; - - // GK_KANJI (19) IME Kanji mode - const int GK_KANJI = 0x19; - - // GK_ESCAPE (1B) ESC key - const int GK_ESCAPE = 0x1B; - - // GK_CONVERT (1C) IME convert - const int GK_CONVERT = 0x1C; - - // GK_NONCONVERT (1D) IME nonconvert - const int GK_NONCONVERT = 0x1D; - - // GK_ACCEPT (1E) IME accept - const int GK_ACCEPT = 0x1E; - - // GK_MODECHANGE (1F) IME mode change request - const int GK_MODECHANGE = 0x1F; - - // GK_SPACE (20) SPACEBAR - const int GK_SPACE = 0x20; - - // GK_PRIOR (21) PAGE UP key - const int GK_PRIOR = 0x21; - - // GK_NEXT (22) PAGE DOWN key - const int GK_NEXT = 0x22; - - // GK_END (23) END key - const int GK_END = 0x23; - - // GK_HOME (24) HOME key - const int GK_HOME = 0x24; - - // GK_LEFT (25) LEFT ARROW key - const int GK_LEFT = 0x25; - - // GK_UP (26) UP ARROW key - const int GK_UP = 0x26; - - // GK_RIGHT (27) RIGHT ARROW key - const int GK_RIGHT = 0x27; - - // GK_DOWN (28) DOWN ARROW key - const int GK_DOWN = 0x28; - - // GK_SELECT (29) SELECT key - const int GK_SELECT = 0x29; - - // GK_PRINT (2A) PRINT key - const int GK_PRINT = 0x2A; - - // GK_EXECUTE (2B) EXECUTE key - const int GK_EXECUTE = 0x2B; - - // GK_SNAPSHOT (2C) PRINT SCREEN key - const int GK_SNAPSHOT = 0x2C; - - // GK_INSERT (2D) INS key - const int GK_INSERT = 0x2D; - - // GK_DELETE (2E) DEL key - const int GK_DELETE = 0x2E; - - // GK_HELP (2F) HELP key - const int GK_HELP = 0x2F; - - // (30) 0 key - const int GK_0 = 0x30; - - // (31) 1 key - const int GK_1 = 0x31; - - // (32) 2 key - const int GK_2 = 0x32; - - // (33) 3 key - const int GK_3 = 0x33; - - // (34) 4 key - const int GK_4 = 0x34; - - // (35) 5 key; - const int GK_5 = 0x35; - - // (36) 6 key - const int GK_6 = 0x36; - - // (37) 7 key - const int GK_7 = 0x37; - - // (38) 8 key - const int GK_8 = 0x38; - - // (39) 9 key - const int GK_9 = 0x39; - - // (41) A key - const int GK_A = 0x41; - - // (42) B key - const int GK_B = 0x42; - - // (43) C key - const int GK_C = 0x43; - - // (44) D key - const int GK_D = 0x44; - - // (45) E key - const int GK_E = 0x45; - - // (46) F key - const int GK_F = 0x46; - - // (47) G key - const int GK_G = 0x47; - - // (48) H key - const int GK_H = 0x48; - - // (49) I key - const int GK_I = 0x49; - - // (4A) J key - const int GK_J = 0x4A; - - // (4B) K key - const int GK_K = 0x4B; - - // (4C) L key - const int GK_L = 0x4C; - - // (4D) M key - const int GK_M = 0x4D; - - // (4E) N key - const int GK_N = 0x4E; - - // (4F) O key - const int GK_O = 0x4F; - - // (50) P key - const int GK_P = 0x50; - - // (51) Q key - const int GK_Q = 0x51; - - // (52) R key - const int GK_R = 0x52; - - // (53) S key - const int GK_S = 0x53; - - // (54) T key - const int GK_T = 0x54; - - // (55) U key - const int GK_U = 0x55; - - // (56) V key - const int GK_V = 0x56; - - // (57) W key - const int GK_W = 0x57; - - // (58) X key - const int GK_X = 0x58; - - // (59) Y key - const int GK_Y = 0x59; - - // (5A) Z key - const int GK_Z = 0x5A; - - // GK_LWIN (5B) Left Windows key (Microsoft Natural keyboard) - const int GK_LWIN = 0x5B; - - // GK_RWIN (5C) Right Windows key (Natural keyboard) - const int GK_RWIN = 0x5C; - - // GK_APPS (5D) Applications key (Natural keyboard) - const int GK_APPS = 0x5D; - - // GK_SLEEP (5F) Computer Sleep key - const int GK_SLEEP = 0x5F; - - // GK_NUMPAD0 (60) Numeric keypad 0 key - const int GK_NUMPAD0 = 0x60; - - // GK_NUMPAD1 (61) Numeric keypad 1 key - const int GK_NUMPAD1 = 0x61; - - // GK_NUMPAD2 (62) Numeric keypad 2 key - const int GK_NUMPAD2 = 0x62; - - // GK_NUMPAD3 (63) Numeric keypad 3 key - const int GK_NUMPAD3 = 0x63; - - // GK_NUMPAD4 (64) Numeric keypad 4 key - const int GK_NUMPAD4 = 0x64; - - // GK_NUMPAD5 (65) Numeric keypad 5 key - const int GK_NUMPAD5 = 0x65; - - // GK_NUMPAD6 (66) Numeric keypad 6 key - const int GK_NUMPAD6 = 0x66; - - // GK_NUMPAD7 (67) Numeric keypad 7 key - const int GK_NUMPAD7 = 0x67; - - // GK_NUMPAD8 (68) Numeric keypad 8 key - const int GK_NUMPAD8 = 0x68; - - // GK_NUMPAD9 (69) Numeric keypad 9 key - const int GK_NUMPAD9 = 0x69; - - // GK_MULTIPLY (6A) Multiply key - const int GK_MULTIPLY = 0x6A; - - // GK_ADD (6B) Add key - const int GK_ADD = 0x6B; - - // GK_SEPARATOR (6C) Separator key - const int GK_SEPARATOR = 0x6C; - - // GK_SUBTRACT (6D) Subtract key - const int GK_SUBTRACT = 0x6D; - - // GK_DECIMAL (6E) Decimal key - const int GK_DECIMAL = 0x6E; - - // GK_DIVIDE (6F) Divide key - const int GK_DIVIDE = 0x6F; - - // GK_F1 (70) F1 key - const int GK_F1 = 0x70; - - // GK_F2 (71) F2 key - const int GK_F2 = 0x71; - - // GK_F3 (72) F3 key - const int GK_F3 = 0x72; - - // GK_F4 (73) F4 key - const int GK_F4 = 0x73; - - // GK_F5 (74) F5 key - const int GK_F5 = 0x74; - - // GK_F6 (75) F6 key - const int GK_F6 = 0x75; - - // GK_F7 (76) F7 key - const int GK_F7 = 0x76; - - // GK_F8 (77) F8 key - const int GK_F8 = 0x77; - - // GK_F9 (78) F9 key - const int GK_F9 = 0x78; - - // GK_F10 (79) F10 key - const int GK_F10 = 0x79; - - // GK_F11 (7A) F11 key - const int GK_F11 = 0x7A; - - // GK_F12 (7B) F12 key - const int GK_F12 = 0x7B; - - // GK_F13 (7C) F13 key - const int GK_F13 = 0x7C; - - // GK_F14 (7D) F14 key - const int GK_F14 = 0x7D; - - // GK_F15 (7E) F15 key - const int GK_F15 = 0x7E; - - // GK_F16 (7F) F16 key - const int GK_F16 = 0x7F; - - // GK_F17 (80H) F17 key - const int GK_F17 = 0x80; - - // GK_F18 (81H) F18 key - const int GK_F18 = 0x81; - - // GK_F19 (82H) F19 key - const int GK_F19 = 0x82; - - // GK_F20 (83H) F20 key - const int GK_F20 = 0x83; - - // GK_F21 (84H) F21 key - const int GK_F21 = 0x84; - - // GK_F22 (85H) F22 key - const int GK_F22 = 0x85; - - // GK_F23 (86H) F23 key - const int GK_F23 = 0x86; - - // GK_F24 (87H) F24 key - const int GK_F24 = 0x87; - - // GK_NUMLOCK (90) NUM LOCK key - const int GK_NUMLOCK = 0x90; - - // GK_SCROLL (91) SCROLL LOCK key - const int GK_SCROLL = 0x91; - - // GK_LSHIFT (A0) Left SHIFT key - const int GK_LSHIFT = 0xA0; - - // GK_RSHIFT (A1) Right SHIFT key - const int GK_RSHIFT = 0xA1; - - // GK_LCONTROL (A2) Left CONTROL key - const int GK_LCONTROL = 0xA2; - - // GK_RCONTROL (A3) Right CONTROL key - const int GK_RCONTROL = 0xA3; - - // GK_LMENU (A4) Left MENU key - const int GK_LMENU = 0xA4; - - // GK_RMENU (A5) Right MENU key - const int GK_RMENU = 0xA5; - - // GK_BROWSER_BACK (A6) Windows 2000/XP: Browser Back key - const int GK_BROWSER_BACK = 0xA6; - - // GK_BROWSER_FORWARD (A7) Windows 2000/XP: Browser Forward key - const int GK_BROWSER_FORWARD = 0xA7; - - // GK_BROWSER_REFRESH (A8) Windows 2000/XP: Browser Refresh key - const int GK_BROWSER_REFRESH = 0xA8; - - // GK_BROWSER_STOP (A9) Windows 2000/XP: Browser Stop key - const int GK_BROWSER_STOP = 0xA9; - - // GK_BROWSER_SEARCH (AA) Windows 2000/XP: Browser Search key - const int GK_BROWSER_SEARCH = 0xAA; - - // GK_BROWSER_FAVORITES (AB) Windows 2000/XP: Browser Favorites key - const int GK_BROWSER_FAVORITES = 0xAB; - - // GK_BROWSER_HOME (AC) Windows 2000/XP: Browser Start and Home key - const int GK_BROWSER_HOME = 0xAC; - - // GK_VOLUME_MUTE (AD) Windows 2000/XP: Volume Mute key - const int GK_VOLUME_MUTE = 0xAD; - - // GK_VOLUME_DOWN (AE) Windows 2000/XP: Volume Down key - const int GK_VOLUME_DOWN = 0xAE; - - // GK_VOLUME_UP (AF) Windows 2000/XP: Volume Up key - const int GK_VOLUME_UP = 0xAF; - - // GK_MEDIA_NEXT_TRACK (B0) Windows 2000/XP: Next Track key - const int GK_MEDIA_NEXT_TRACK = 0xB0; - - // GK_MEDIA_PREV_TRACK (B1) Windows 2000/XP: Previous Track key - const int GK_MEDIA_PREV_TRACK = 0xB1; - - // GK_MEDIA_STOP (B2) Windows 2000/XP: Stop Media key - const int GK_MEDIA_STOP = 0xB2; - - // GK_MEDIA_PLAY_PAUSE (B3) Windows 2000/XP: Play/Pause Media key - const int GK_MEDIA_PLAY_PAUSE = 0xB3; - - // GK_LAUNCH_MAIL (B4) Windows 2000/XP: Start Mail key - const int GK_MEDIA_LAUNCH_MAIL = 0xB4; - - // GK_LAUNCH_MEDIA_SELECT (B5) Windows 2000/XP: Select Media key - const int GK_MEDIA_LAUNCH_MEDIA_SELECT = 0xB5; - - // GK_LAUNCH_APP1 (B6) Windows 2000/XP: Start Application 1 key - const int GK_MEDIA_LAUNCH_APP1 = 0xB6; - - // GK_LAUNCH_APP2 (B7) Windows 2000/XP: Start Application 2 key - const int GK_MEDIA_LAUNCH_APP2 = 0xB7; - - // GK_OEM_1 (BA) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ';:' key - const int GK_OEM_1 = 0xBA; - - // GK_OEM_PLUS (BB) Windows 2000/XP: For any country/region, the '+' key - const int GK_OEM_PLUS = 0xBB; - - // GK_OEM_COMMA (BC) Windows 2000/XP: For any country/region, the ',' key - const int GK_OEM_COMMA = 0xBC; - - // GK_OEM_MINUS (BD) Windows 2000/XP: For any country/region, the '-' key - const int GK_OEM_MINUS = 0xBD; - - // GK_OEM_PERIOD (BE) Windows 2000/XP: For any country/region, the '.' key - const int GK_OEM_PERIOD = 0xBE; - - // GK_OEM_2 (BF) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '/?' key - const int GK_OEM_2 = 0xBF; - - // GK_OEM_3 (C0) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '`~' key - const int GK_OEM_3 = 0xC0; - - // GK_OEM_4 (DB) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '[{' key - const int GK_OEM_4 = 0xDB; - - // GK_OEM_5 (DC) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the '\|' key - const int GK_OEM_5 = 0xDC; - - // GK_OEM_6 (DD) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the ']}' key - const int GK_OEM_6 = 0xDD; - - // GK_OEM_7 (DE) Used for miscellaneous characters; it can vary by keyboard. Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key - const int GK_OEM_7 = 0xDE; - - // GK_OEM_8 (DF) Used for miscellaneous characters; it can vary by keyboard. - const int GK_OEM_8 = 0xDF; - - // GK_OEM_102 (E2) Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard - const int GK_OEM_102 = 0xE2; - - // GK_PROCESSKEY (E5) Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key - const int GK_PROCESSKEY = 0xE5; - - // GK_PACKET (E7) Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The GK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT,SendInput, WM_KEYDOWN, and WM_KEYUP - const int GK_PACKET = 0xE7; - - // GK_ATTN (F6) Attn key - const int GK_ATTN = 0xF6; - - // GK_CRSEL (F7) CrSel key - const int GK_CRSEL = 0xF7; - - // GK_EXSEL (F8) ExSel key - const int GK_EXSEL = 0xF8; - - // GK_EREOF (F9) Erase EOF key - const int GK_EREOF = 0xF9; - - // GK_PLAY (FA) Play key - const int GK_PLAY = 0xFA; - - // GK_ZOOM (FB) Zoom key - const int GK_ZOOM = 0xFB; - - // GK_NONAME (FC) Reserved for future use - const int GK_NONAME = 0xFC; - - // GK_PA1 (FD) PA1 key - const int GK_PA1 = 0xFD; - - // GK_OEM_CLEAR (FE) Clear key - const int GK_OEM_CLEAR = 0xFE; - - const int GK_UNKNOWN = 0; - -} // namespace KeyCodes - -} // namespace ultralight diff --git a/include/Ultralight/KeyEvent.h b/include/Ultralight/KeyEvent.h deleted file mode 100644 index 7bc3166..0000000 --- a/include/Ultralight/KeyEvent.h +++ /dev/null @@ -1,164 +0,0 @@ -/// -/// @file KeyEvent.h -/// -/// @brief The header for the KeyEvent class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#ifdef __OBJC__ -#import -#endif - -namespace ultralight { - -/// -/// @brief A generic keyboard event that can be created from a platform event -/// or synthesized from scratch. -/// -/// @see View::FireKeyEvent -/// -class UExport KeyEvent { -public: - /// - /// The various KeyEvent types. - /// - enum Type { - /// Key-Down type - kType_KeyDown, - - /// Key-Up type - kType_KeyUp, - - /// Raw Key-Down type - kType_RawKeyDown, - - /// Character input type (this event generates text in input fields) - kType_Char, - }; - - /// - /// Creates an empty KeyEvent, you will need to initialize its members - /// yourself. This is useful for synthesizing your own keyboard events. - /// - KeyEvent(); - -#ifdef _WIN32 - /// - /// Create a KeyEvent directly from a Windows keyboard event. - /// - KeyEvent(Type type, uintptr_t wparam, intptr_t lparam, bool is_system_key); -#endif - -#ifdef __OBJC__ - /// - /// Create a KeyEvent directly from a macOS NSEvent. - /// - KeyEvent(NSEvent* evt); -#endif - - /// - /// An enumeration of the different keyboard modifiers. - /// - enum Modifiers : uint8_t { - /// Whether or not an ALT key is down - kMod_AltKey = 1 << 0, - - /// Whether or not a Control key is down - kMod_CtrlKey = 1 << 1, - - /// Whether or not a meta key (Command-key on Mac, Windows-key on Win) is down - kMod_MetaKey = 1 << 2, - - /// Whether or not a Shift key is down - kMod_ShiftKey = 1 << 3, - }; - - /// - // The type of this KeyEvent - /// - Type type; - - /// - /// The current state of the keyboard. Modifiers may be OR'd together to - /// represent multiple values. - /// - unsigned modifiers; - - /// - // The virtual key-code associated with this keyboard event. This is either - // directly from the event (ie, WPARAM on Windows) or via a mapping function. - // You can see a full list of the possible virtual key-codes in - // KeyboardCodes.h - /// - int virtual_key_code; - - /// - /// The actual key-code generated by the platform. The DOM spec primarily - /// uses Windows-equivalent codes (hence virtualKeyCode above) but it helps to - /// also specify the platform-specific key-code as well. - /// - int native_key_code; - - /// - /// This is a string identifying the key that was pressed. This can be - /// generated from the virtual_key_code via the GetKeyIdentifierFromVirtualKeyCode() - /// utility function. You can find the full list of key identifiers at: - /// - /// - String key_identifier; - - /// - /// The actual text generated by this keyboard event. This is usually only a - /// single character. - /// - String text; - - /// - /// The text generated by this keyboard event before all modifiers except - /// shift are applied. This is used internally for working out shortcut keys. - /// This is usually only a single character. - /// - String unmodified_text; - - /// - /// Whether or not this is a keypad event. - /// - bool is_keypad; - - /// - /// Whether or not this was generated as the result of an auto-repeat - /// (eg, holding down a key). - /// - bool is_auto_repeat; - - /// - /// Whether or not the pressed key is a "system key". This is a Windows-only - /// concept and should be "false" for all non-Windows platforms. For more - /// information, see the following link: - /// - bool is_system_key; -}; - -/// -/// Utility function for generating a key identifier string from a virtual -/// key-code. -/// -/// @param virtual_key_code The virtual key-code to generate the key -/// identifier from. -/// -/// @param key_identifier_result The string to store the result in. -/// -void UExport GetKeyIdentifierFromVirtualKeyCode(int virtual_key_code, - String& key_identifier_result); - -} // namespace ultralight diff --git a/include/Ultralight/Listener.h b/include/Ultralight/Listener.h deleted file mode 100644 index 7552dfe..0000000 --- a/include/Ultralight/Listener.h +++ /dev/null @@ -1,176 +0,0 @@ -/// -/// @file Listener.h -/// -/// @brief The header for View listener interfaces. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -class View; - -/// -/// MessageSource types, @see ViewListener::OnAddConsoleMessage -/// -enum MessageSource { - kMessageSource_XML = 0, - kMessageSource_JS, - kMessageSource_Network, - kMessageSource_ConsoleAPI, - kMessageSource_Storage, - kMessageSource_AppCache, - kMessageSource_Rendering, - kMessageSource_CSS, - kMessageSource_Security, - kMessageSource_ContentBlocker, - kMessageSource_Other, -}; - -/// -/// MessageLevel types, @see ViewListener::OnAddConsoleMessage -/// -enum MessageLevel { - kMessageLevel_Log = 1, - kMessageLevel_Warning = 2, - kMessageLevel_Error = 3, - kMessageLevel_Debug = 4, - kMessageLevel_Info = 5, -}; - -/// -/// Cursor types, @see ViewListener::OnChangeCursor -/// -enum Cursor { - 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 -}; - -/// -/// @brief Interface for View-related events -/// -/// @note For more info @see View::set_view_listener -/// -class UExport ViewListener { -public: - virtual ~ViewListener() {} - - /// - /// Called when the page title changes - /// - virtual void OnChangeTitle(ultralight::View* caller, - const String& title) {} - - /// - /// Called when the page URL changes - /// - virtual void OnChangeURL(ultralight::View* caller, - const String& url) {} - - /// - /// Called when the tooltip changes (usually as result of a mouse hover) - /// - virtual void OnChangeTooltip(ultralight::View* caller, - const String& tooltip) {} - - /// - /// Called when the mouse cursor changes - /// - virtual void OnChangeCursor(ultralight::View* caller, - Cursor cursor) {} - - /// - /// Called when a message is added to the console (useful for errors / debug) - /// - virtual void OnAddConsoleMessage(ultralight::View* caller, - MessageSource source, - MessageLevel level, - const String& message, - uint32_t line_number, - uint32_t column_number, - const String& source_id) {} -}; - -/// -/// @brief Interface for Load-related events -/// -/// @note For more info @see View::set_load_listener -/// -class UExport LoadListener { -public: - virtual ~LoadListener() {} - - /// - /// Called when the page begins loading new URL into main frame - /// - virtual void OnBeginLoading(ultralight::View* caller) {} - - /// - /// Called when the page finishes loading URL into main frame - /// - virtual void OnFinishLoading(ultralight::View* caller) {} - - /// - /// Called when the history (back/forward state) is modified - /// - virtual void OnUpdateHistory(ultralight::View* caller) {} - - /// - /// Called when all JavaScript has been parsed and the document is ready. - /// This is the best time to make any initial JavaScript calls to your page. - /// - virtual void OnDOMReady(ultralight::View* caller) {} -}; - -} // namespace ultralight diff --git a/include/Ultralight/Matrix.h b/include/Ultralight/Matrix.h deleted file mode 100644 index f4d2205..0000000 --- a/include/Ultralight/Matrix.h +++ /dev/null @@ -1,190 +0,0 @@ -/// -/// @file Matrix.h -/// -/// @brief The header for Matrix helpers -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -/// -/// 4x4 Matrix Helper -/// -struct UExport Matrix4x4 { - /// - /// Raw 4x4 matrix as an array - /// - float data[16]; - - /// - /// Set to identity matrix. - /// - void SetIdentity(); -}; - -/// -/// Transformation Matrix helper -/// -struct UExport Matrix { -#if defined(__x86_64__) || defined(_M_X64) -#if defined(_MSC_VER) - __declspec(align(16)) typedef double Aligned4x4[4][4]; -#else - typedef double Aligned4x4[4][4] __attribute__((aligned(16))); -#endif -#else - typedef double Aligned4x4[4][4]; -#endif - - Aligned4x4 data; - - /// - /// Set to identity matrix. - /// - void SetIdentity(); - - /// - /// Set to an orthographic projection matrix suitable for use with our - /// vertex shaders. Optionally flip the y-coordinate space (eg, for OpenGL). - /// - void SetOrthographicProjection(double screen_width, double screen_height, - bool flip_y); - - /// - /// Set to another matrix. - /// - void Set(const Matrix& other); - - /// - /// Set to another matrix. - /// - void Set(const Matrix4x4& other); - - /// - /// Set from raw affine members. - /// - void Set(double a, double b, double c, double d, double e, double f); - - /// - /// Set from raw 4x4 components. - /// - void Set(double m11, double m12, double m13, double m14, - double m21, double m22, double m23, double m24, - double m31, double m32, double m33, double m34, - double m41, double m42, double m43, double m44); - - inline double m11() const { return data[0][0]; } - inline double m12() const { return data[0][1]; } - inline double m13() const { return data[0][2]; } - inline double m14() const { return data[0][3]; } - inline double m21() const { return data[1][0]; } - inline double m22() const { return data[1][1]; } - inline double m23() const { return data[1][2]; } - inline double m24() const { return data[1][3]; } - inline double m31() const { return data[2][0]; } - inline double m32() const { return data[2][1]; } - inline double m33() const { return data[2][2]; } - inline double m34() const { return data[2][3]; } - inline double m41() const { return data[3][0]; } - inline double m42() const { return data[3][1]; } - inline double m43() const { return data[3][2]; } - inline double m44() const { return data[3][3]; } - - inline double a() const { return data[0][0]; } - inline double b() const { return data[0][1]; } - inline double c() const { return data[1][0]; } - inline double d() const { return data[1][1]; } - inline double e() const { return data[3][0]; } - inline double f() const { return data[3][1]; } - - /// - /// Whether or not this is an identity matrix. - /// - bool IsIdentity() const; - - /// - /// Whether or not this is an identity matrix or translation. - /// - bool IsIdentityOrTranslation() const; - - /// - /// Whether or not this matrix uses only affine transformations. - /// - bool IsAffine() const; - - /// - /// Whether or not this is an identity, translation, or non-negative - /// uniform scale. - /// - bool IsSimple() const; - - /// - /// Translate by x and y. - /// - void Translate(double x, double y); - - /// - /// Scale by x and y. - /// - void Scale(double x, double y); - - /// - /// Rotate matrix by theta (in degrees) - /// - void Rotate(double theta); - - /// - /// Rotate matrix by x and y - /// - void Rotate(double x, double y); - - /// - /// Transform (multiply) by another Matrix - /// - void Transform(const Matrix& other); - - /// - /// Get the inverse of this matrix. May return false if not invertible. - /// - bool GetInverse(Matrix& result) const; - - /// - /// Transform point by this matrix and get the result. - /// - Point Apply(const Point& p) const; - - /// - /// Transform rect by this matrix and get the result as an axis-aligned rect. - /// - Rect Apply(const Rect& r) const; - - /// - /// Get an integer hash of this matrix's members. - /// - uint32_t Hash() const; - - /// - /// Get this matrix as unaligned 4x4 float components (for use passing to - /// GPU driver APIs). - /// - Matrix4x4 GetMatrix4x4() const; -}; - -bool UExport operator==(const Matrix& a, const Matrix& b); -bool UExport operator!=(const Matrix& a, const Matrix& b); - -bool UExport operator==(const Matrix4x4& a, const Matrix4x4& b); -bool UExport operator!=(const Matrix4x4& a, const Matrix4x4& b); - -} // namespace ultralight diff --git a/include/Ultralight/MouseEvent.h b/include/Ultralight/MouseEvent.h deleted file mode 100644 index 4955919..0000000 --- a/include/Ultralight/MouseEvent.h +++ /dev/null @@ -1,77 +0,0 @@ -/// -/// @file MouseEvent.h -/// -/// @brief The header for the MouseEvent class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include - -namespace ultralight { - -/// -/// @brief A generic mouse event. -/// -/// @note @see View::FireMouseEvent -/// -class MouseEvent { -public: - /// - /// The various MouseEvent types. - /// - enum Type { - /// - /// Mouse moved type - /// - kType_MouseMoved, - - /// - /// Mouse button pressed type - /// - kType_MouseDown, - - /// - /// Mouse button released type - /// - kType_MouseUp, - }; - - /// - /// The various mouse button types. - /// - enum Button { - kButton_None = 0, - kButton_Left, - kButton_Middle, - kButton_Right, - }; - - /// - /// The type of this MouseEvent - /// - Type type; - - /// - /// The current x-position of the mouse, relative to the View - /// - int x; - - /// - /// The current y-position of the mouse, relative to the View - /// - int y; - - /// - /// The mouse button that was pressed/released, if any. - /// - Button button; -}; - -} // namespace ultralight diff --git a/include/Ultralight/RefPtr.h b/include/Ultralight/RefPtr.h deleted file mode 100644 index 41d6558..0000000 --- a/include/Ultralight/RefPtr.h +++ /dev/null @@ -1,537 +0,0 @@ -/// -/// @file RefPtr.h -/// -/// @brief The header for all ref-counting utilities. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -/* -* Portions of the below code are derived from 'RefPtr.h' from Apple's WTF, -* with the following license header: -* -* Copyright (C) 2013-2014 Apple Inc. All rights reserved. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that the following conditions -* are met: -* 1. Redistributions of source code must retain the above copyright -* notice, this list of conditions and the following disclaimer. -* 2. Redistributions in binary form must reproduce the above copyright -* notice, this list of conditions and the following disclaimer in the -* documentation and/or other materials provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' -* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS -* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF -* THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#pragma once -#include -#include -#include - -namespace ultralight { - -/// -/// @brief Interface for all ref-counted objects that will be managed using -/// the Ref<> and RefPtr<> smart pointers. -/// -class UExport RefCounted { - public: - virtual void AddRef() const = 0; - virtual void Release() const = 0; - virtual int ref_count() const = 0; - protected: - virtual ~RefCounted(); -}; - -inline void adopted(const void*) { } - -template class Ref; - -/// -/// @brief Helper for wrapping new objects with the Ref smart pointer. -/// -/// All ref-counted object are created with an initial ref-count of '1'. -/// The AdoptRef() helper returns a Ref without calling AddRef(). -/// This is used for creating new objects, like so: -/// -/// Ref ref = AdoptRef(*new ObjectImpl()); -/// -template Ref AdoptRef(T&); - -/// -/// @brief A non-nullable smart pointer. -/// -/// This smart pointer automatically manages the lifetime of a RefCounted -/// object. Also guarantees that the managed instance is not NULL. -/// -template class Ref { -public: - /// - /// Destroy Ref (wll decrement ref-count by one) - /// - ~Ref() - { - if (instance_) - instance_->Release(); - } - - /// - /// Construct Ref from a reference. (Will increment ref-count by one) - /// - Ref(T& object) - : instance_(&object) - { - instance_->AddRef(); - } - - /// - /// Copy constructor. - /// - Ref(const Ref& other) - : instance_(other.instance_) - { - instance_->AddRef(); - } - - /// - /// Copy constructor with internal type conversion. - /// - template - Ref(Ref& other) - : instance_(other.ptr()) - { - instance_->AddRef(); - } - - /// - /// Copy constructor with internal type conversion. - /// - template - Ref(const Ref& other) - : instance_(other.ptr()) - { - instance_->AddRef(); - } - - /// - /// Move constructor. - /// - Ref(Ref&& other) - : instance_(&other.LeakRef()) - { - assert(instance_); - } - - /// - /// Move constructor. - /// - template - Ref(Ref&& other) - : instance_(&other.LeakRef()) - { - assert(instance_); - } - - Ref& operator=(T& object) - { - assert(instance_); - object.AddRef(); - instance_->Release(); - instance_ = &object; - assert(instance_); - return *this; - } - - Ref& operator=(const Ref& other) - { - assert(instance_); - other.instance_->AddRef(); - instance_->Release(); - instance_ = other.instance_; - assert(instance_); - return *this; - } - - template - Ref& operator=(const Ref& other) - { - assert(instance_); - other.instance_->AddRef(); - instance_->Release(); - instance_ = other.instance_; - assert(instance_); - return *this; - } - - Ref& operator=(Ref&& reference) - { - assert(instance_); - instance_->Release(); - instance_ = &reference.LeakRef(); - assert(instance_); - return *this; - } - - template Ref& operator=(Ref&& reference) - { - assert(instance_); - instance_->Release(); - instance_ = &reference.LeakRef(); - assert(instance_); - return *this; - } - - const T* operator->() const { assert(instance_); return instance_; } - T* operator->() { assert(instance_); return instance_; } - - /// - /// Get a pointer to wrapped object. - /// - const T* ptr() const { assert(instance_); return instance_; } - - /// - /// Get a pointer to wrapped object. - /// - T* ptr() { assert(instance_); return instance_; } - - /// - /// Get a reference to wrapped object. - /// - const T& get() const { assert(instance_); return *instance_; } - - /// - /// Get a reference to wrapped object. - /// - T& get() { assert(instance_); return *instance_; } - - operator T&() { assert(instance_); return *instance_; } - operator const T&() const { assert(instance_); return *instance_; } - - template Ref Replace(Ref&&); - - T& LeakRef() { - assert(instance_); - - T* result = std::move(instance_); - instance_ = std::forward(nullptr); - return *result; - } - - friend inline bool operator==(const Ref& a, const Ref& b) { - return a.instance_ == b.instance_; - } - - friend inline bool operator!=(const Ref& a, const Ref& b) { - return a.instance_ != b.instance_; - } - - friend inline bool operator<(const Ref& a, const Ref& b) { - return a.instance_ < b.instance_; - } - -protected: - friend Ref AdoptRef(T&); - template friend class RefPtr; - - enum AdoptTag { Adopt }; - Ref(T& object, AdoptTag) - : instance_(&object) - { - } - - T* instance_; -}; - -template template Ref Ref::Replace(Ref&& reference) -{ - auto oldReference = AdoptRef(*instance_); - instance_ = &reference.LeakRef(); - return oldReference; -} - -template -Ref AdoptRef(T& reference) -{ - adopted(&reference); - return Ref(reference, Ref::Adopt); -} - -/// -/// @brief A nullable smart pointer. -/// -/// This smart pointer automatically manages the lifetime of a RefCounted -/// object. The managed instance may be NULL. -/// -template class RefPtr { - public: - /// - /// Construct a NULL ref-pointer. - /// - RefPtr() - : instance_(nullptr) - { - } - - /// - /// Construct a NULL ref-pointer. - /// - RefPtr(std::nullptr_t) - : instance_(nullptr) - { - } - - /// - /// Construct from a pointer. (Will increment ref-count by one) - /// - RefPtr(T* other) - : instance_(other) - { - if (instance_) - instance_->AddRef(); - } - - /// - /// Copy constructor. - /// - RefPtr(const RefPtr& other) - : instance_(other.instance_) - { - if (instance_) - instance_->AddRef(); - } - - /// - /// Copy constructor with internal type conversion. - /// - template - RefPtr(const RefPtr& other) - : instance_(other.instance_) - { - if (instance_) - instance_->AddRef(); - } - - /// - /// Move constructor. - /// - RefPtr(RefPtr&& other) - : instance_(other.LeakRef()) - { - } - - /// - /// Move constructor. - /// - template - RefPtr(RefPtr&& other) - : instance_(other.LeakRef()) - { - } - - /// - /// Construct from a Ref - /// - template - RefPtr(const Ref& other) - : instance_(other.instance_) - { - if (instance_) - instance_->AddRef(); - } - - /// - /// Construct by moving from a Ref - /// - template - RefPtr(Ref&& other); - - /// - /// Destroy RefPtr (wll decrement ref-count by one) - /// - ~RefPtr() - { - T* old_value = std::move(instance_); - instance_ = std::forward(nullptr); - if (old_value) - old_value->Release(); - } - - /// - /// Get a pointer to wrapped object. - /// - T* get() const { return instance_; } - - T* LeakRef() { - T* result = std::move(instance_); - instance_ = std::forward(nullptr); - return result; - } - - T& operator*() const { assert(instance_); return *instance_; } - T* operator->() const { return instance_; } - - bool operator!() const { return !instance_; } - - // This conversion operator allows implicit conversion to bool but not to other integer types. - typedef T* (RefPtr::*UnspecifiedBoolType); - operator UnspecifiedBoolType() const { return instance_ ? &RefPtr::instance_ : nullptr; } - - RefPtr& operator=(const RefPtr&); - RefPtr& operator=(T*); - RefPtr& operator=(std::nullptr_t); - template RefPtr& operator=(const RefPtr&); - RefPtr& operator=(RefPtr&&); - template RefPtr& operator=(RefPtr&&); - template RefPtr& operator=(Ref&&); - - friend inline bool operator==(const RefPtr& a, const RefPtr& b) { - return a.instance_ == b.instance_; - } - - friend inline bool operator!=(const RefPtr& a, const RefPtr& b) { - return a.instance_ != b.instance_; - } - - friend inline bool operator<(const RefPtr& a, const RefPtr& b) { - return a.instance_ < b.instance_; - } - - void Swap(RefPtr&); - -private: - T* instance_; -}; - -template -template -RefPtr::RefPtr(Ref&& reference) - : instance_(&reference.LeakRef()) -{ -} - -template -RefPtr& RefPtr::operator=(const RefPtr& other) -{ - RefPtr ptr = other; - Swap(ptr); - return *this; -} - -template -template -RefPtr& RefPtr::operator=(const RefPtr& other) -{ - RefPtr ptr = other; - Swap(ptr); - return *this; -} - -template -RefPtr& RefPtr::operator=(T* object) -{ - RefPtr ptr = object; - Swap(ptr); - return *this; -} - -template -RefPtr& RefPtr::operator=(std::nullptr_t) -{ - T* old_instance = std::move(instance_); - instance_ = std::forward(nullptr); - if (old_instance) - old_instance->Release(); - return *this; -} - -template -RefPtr& RefPtr::operator=(RefPtr&& other) -{ - RefPtr ptr = std::move(other); - Swap(ptr); - return *this; -} - -template -template -RefPtr& RefPtr::operator=(RefPtr&& other) -{ - RefPtr ptr = std::move(other); - Swap(ptr); - return *this; -} - -template -template -RefPtr& RefPtr::operator=(Ref&& other) -{ - RefPtr ptr = std::move(other); - Swap(ptr); - return *this; -} - -template -void RefPtr::Swap(RefPtr& other) -{ - std::swap(instance_, other.instance_); -} - -template -void Swap(RefPtr& a, RefPtr& b) -{ - a.Swap(b); -} - -template -bool operator==(const RefPtr& a, const RefPtr& b) -{ - return a.get() == b.get(); -} - -template -bool operator==(const RefPtr& a, U* b) -{ - return a.get() == b; -} - -template -bool operator==(T* a, const RefPtr& b) -{ - return a == b.get(); -} - -template -bool operator!=(const RefPtr& a, const RefPtr& b) -{ - return a.get() != b.get(); -} - -template -bool operator!=(const RefPtr& a, U* b) -{ - return a.get() != b; -} - -template -bool operator!=(T* a, const RefPtr& b) -{ - return a != b.get(); -} - -} // namespace ultralight diff --git a/include/Ultralight/RenderTarget.h b/include/Ultralight/RenderTarget.h deleted file mode 100644 index f16962c..0000000 --- a/include/Ultralight/RenderTarget.h +++ /dev/null @@ -1,84 +0,0 @@ -/// -/// @file RenderTarget.h -/// -/// @brief The header for the RenderTarget struct. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -#pragma pack(push, 1) - -/// -/// @brief Rendering details for a View, to be used with your own GPUDriver -/// -/// When using your own GPUDriver, each View is rendered to an offscreen -/// texture that you must display on a quad in your engine. This struct -/// provides all the details you need to render the View texture in your -/// engine. -/// -struct UExport RenderTarget { - /// - /// Whether this target is empty (null texture) - /// - bool is_empty; - - /// - /// The viewport width (in device coordinates). - /// - uint32_t width; - - /// - /// The viewport height (in device coordinates). - /// - uint32_t height; - - /// - /// The GPUDriver-specific texture ID (you should bind the texture using - /// your implementation of GPUDriver::BindTexture before drawing a quad). - /// - uint32_t texture_id; - - /// - /// The texture width (in pixels). This may be padded. - /// - uint32_t texture_width; - - /// - /// The texture height (in pixels). This may be padded. - /// - uint32_t texture_height; - - /// - /// The pixel format of the texture. - /// - BitmapFormat texture_format; - - /// - /// UV coordinates of the texture (this is needed because the texture may - /// be padded). - /// - Rect uv_coords; - - /// - /// The GPUDriver-specific render buffer ID. - /// - uint32_t render_buffer_id; - - RenderTarget(); -}; - -#pragma pack(pop) - -} // namespace ultralight diff --git a/include/Ultralight/Renderer.h b/include/Ultralight/Renderer.h deleted file mode 100644 index 29c4011..0000000 --- a/include/Ultralight/Renderer.h +++ /dev/null @@ -1,90 +0,0 @@ -/// -/// @file Renderer.h -/// -/// @brief The header for the Renderer class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -/// -/// @brief The core of Ultralight. You should initialize it after setting up -/// your Platform config and drivers. -/// -/// This singleton class manages the lifetime of all Views (@see View) and -/// coordinates all painting, rendering, network requests, and event dispatch. -/// -/// @note You don't have to create this instance directly if you use the -/// AppCore API. The App class will automatically create a Renderer and -/// perform all rendering within its run loop. @see App::Create -/// -class UExport Renderer : public RefCounted { -public: - /// - /// Create the Renderer singleton. You should set up all your Platform config, - /// file-system, and drivers before calling this function. @see Platform - /// - /// @note You should only create one Renderer per application lifetime. - /// - /// @return Returns a ref-pointer to a new Renderer instance. You should - /// assign it to either a Ref (non-nullable) or - /// RefPtr (nullable). - /// - static Ref Create(); - - /// - /// Create a new View. - /// - /// @param width The initial width, in device coordinates. - /// - /// @param height The initial height, in device coordinates. - /// - /// @param transparent Whether or not the view background is transparent. - /// - /// @return Returns a ref-pointer to a new View instance. You should assign - /// it to either a Ref (non-nullable) or RefPtr - /// (nullable). - /// - /// @note The device coordinates are scaled to pixels by multiplying them - /// with the current DPI scale (@see Config::device_scale_hint) and - /// rounding to the nearest integer value. - /// - virtual Ref CreateView(uint32_t width, uint32_t height, - bool transparent) = 0; - - /// - /// Update timers and dispatch internal callbacks. You should call this often - /// from your main application loop. - /// - virtual void Update() = 0; - - /// - /// Render all active views to display lists and dispatch calls to GPUDriver. - /// - /// @note If you're using the default, offscreen GL driver, this updates the - /// internal bitmap of each View (@see View::bitmap). - /// - virtual void Render() = 0; - - /// - /// Attempt to release as much memory as possible. Don't call this from any - /// callbacks or driver code. - /// - virtual void PurgeMemory() = 0; - -protected: - virtual ~Renderer(); -}; - -} // namespace ultralight diff --git a/include/Ultralight/ScrollEvent.h b/include/Ultralight/ScrollEvent.h deleted file mode 100644 index cb045e0..0000000 --- a/include/Ultralight/ScrollEvent.h +++ /dev/null @@ -1,53 +0,0 @@ -/// -/// @file ScrollEvent.h -/// -/// @brief The header for the ScrollEvent class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include - -namespace ultralight { - -/// -/// @brief A generic scroll event. -/// -/// @note @see View::FireScrollEvent -/// -class ScrollEvent { -public: - /// - /// The scroll event granularity type - /// - enum Type { - /// The delta value is interpreted as number of pixels - kType_ScrollByPixel, - - /// The delta value is interpreted as number of pages - kType_ScrollByPage, - }; - - /// - /// Scroll granularity type - /// - Type type; - - /// - /// Horizontal scroll amount - /// - int delta_x; - - /// - /// Vertical scroll amount - /// - int delta_y; -}; - -} // namespace ultralight diff --git a/include/Ultralight/String.h b/include/Ultralight/String.h deleted file mode 100644 index f63c077..0000000 --- a/include/Ultralight/String.h +++ /dev/null @@ -1,120 +0,0 @@ -/// -/// @file String.h -/// -/// @brief The header for the String class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include - -namespace ultralight { - -/// -/// @brief UTF-16 String container with conversions for UTF-8 and UTF-32. -/// -/// @note Internally, all strings are represented as UTF-16. -/// -class UExport String { -public: - /// - /// Create empty string - /// - String(); - - /// - /// Create from null-terminated, ASCII C-string - /// - String(const char* str); - - /// - /// Create from raw, UTF-8 string with certain length - /// - String(const char* str, size_t len); - - /// - /// Create from existing String8 (UTF-8). - /// - String(const String8& str); - - /// - /// Create from raw UTF-16 string with certain length - /// - String(const Char16* str, size_t len); - - /// - /// Create from existing String16 (UTF-16) - /// - String(const String16& str); - - /// - /// Create from existing String32 (UTF-32) - /// - String(const String32& str); - - /// - /// Copy constructor - /// - String(const String& other); - - /// - /// Destructor - /// - ~String(); - - /// - /// Assign string from another, copy is made - /// - String& operator=(const String& other); - - /// - /// Append string with another - /// - String& operator+=(const String& other); - - /// - /// Concatenation operator - /// - inline friend String operator+(String lhs, const String& rhs) { lhs += rhs; return lhs; } - - /// - /// Get native UTF-16 string - /// - String16& utf16() { return str_; } - - /// - /// Get native UTF-16 string - /// - const String16& utf16() const { return str_; } - - /// - /// Convert to UTF-8 string - /// - String8 utf8() const; - - /// - /// Convert to UTF-32 string - /// - String32 utf32() const; - - /// - /// Check if string is empty or not - /// - bool empty() const { return utf16().empty(); } - -private: - String16 str_; -}; - - -} // namespace ultralight - diff --git a/include/Ultralight/String16.h b/include/Ultralight/String16.h deleted file mode 100644 index 014af15..0000000 --- a/include/Ultralight/String16.h +++ /dev/null @@ -1,130 +0,0 @@ -/// -/// @file String16.h -/// -/// @brief The header for the String16 class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -namespace detail { - template struct selector; - template<> struct selector<4> { typedef char16_t Char16; }; - template<> struct selector<2> { typedef wchar_t Char16; }; -} - -#ifdef DISABLE_NATIVE_WCHAR_T -// Force Char16 type to use char16_t, used on Windows when native wchar_t support is disabled. -typedef char16_t Char16; -#else -// We use wchar_t if size == 2, otherwise use char16_t -typedef detail::selector::Char16 Char16; -#endif - -/// -/// @brief A UTF-16 string container. -/// -class UExport String16 { -public: - // Make an empty String16 - String16(); - - // Make a String16 from null-terminated ASCII C-string - String16(const char* c_str); - - // Make a String16 from ASCII C-string with certain length - String16(const char* c_str, size_t len); - - // Make a String16 from raw UTF-16 buffer with certain length - String16(const Char16* str, size_t len); - - // Make a String16 from raw unsigned short UTF-16 buffer with certain length. Useful on Windows - // when native support for wchar_t is disabled (eg, /Zc:wchar_t-). - String16(const unsigned short* str, size_t len); - - // Make a deep copy of String16 - String16(const String16& other); - - ~String16(); - - // Assign a String16 to this one, deep copy is made - String16& operator=(const String16& other); - - // Append a String16 to this one. - String16& operator+=(const String16& other); - - // Concatenation operator - inline friend String16 operator+(String16 lhs, const String16& rhs) { lhs += rhs; return lhs; } - - // Get raw UTF-16 data - Char16* data() { return data_; } - - // Get raw UTF-16 data (const) - const Char16* data() const { return data_; } - - // Get raw UTF-16 data as unsigned short. This is useful on Windows if you compile without native - // support for wchar_t (eg, /Zc:wchar_t-) - unsigned short* udata() { return reinterpret_cast(data_); } - - // Get raw UTF-16 data as unsigned short (const). - const unsigned short* udata() const { return reinterpret_cast(data_); } - - // Get length in characters. - size_t length() const { return length_; } - - // Get size in characters (synonym for length) - size_t size() const { return length_; } - - // Check if string is empty. - bool empty() const { return !data_ || length_ == 0; } - - // Get character at specific position - Char16& operator[](size_t pos) { return data_[pos]; } - - // Get character at specific position (const) - const Char16& operator[](size_t pos) const { return data_[pos]; } - -private: - Char16* data_; - size_t length_; -}; - -/// -/// @brief A UTF-16 string vector. -/// -class UExport String16Vector : public RefCounted { -public: - // Create an empty string vector - static Ref Create(); - - // Create a string vector from an existing array (a deep copy is made) - static Ref Create(const String16* stringArray, size_t len); - - // Add an element to the back of the string vector - virtual void push_back(const String16& val) = 0; - - // Get raw String16 vector array - virtual String16* data() = 0; - - // Get the number of elements in vector - virtual size_t size() const = 0; - -protected: - String16Vector(); - virtual ~String16Vector(); - String16Vector(const String16Vector&); - void operator=(const String16Vector&); -}; - -} // namespace ultralight diff --git a/include/Ultralight/String32.h b/include/Ultralight/String32.h deleted file mode 100644 index 04ed633..0000000 --- a/include/Ultralight/String32.h +++ /dev/null @@ -1,71 +0,0 @@ -/// -/// @file String32.h -/// -/// @brief The header for the String32 class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// @brief A UTF-32 string container. -/// -class UExport String32 { -public: - // Make an empty String32 - String32(); - - // Make a String32 from raw UTF-32 string with certain length - String32(const char32_t* c_str, size_t len); - - // Make a deep copy of String32 - String32(const String32& other); - - ~String32(); - - // Assign a String32 to this one, deep copy is made - String32& operator=(const String32& other); - - // Append a String32 to this one. - String32& operator+=(const String32& other); - - // Concatenation operator - inline friend String32 operator+(String32 lhs, const String32& rhs) { lhs += rhs; return lhs; } - - // Get raw UTF-32 data - char32_t* data() { return data_; } - - // Get raw UTF-32 data (const) - const char32_t* data() const { return data_; } - - // Get length in characters. - size_t length() const { return length_; } - - // Get size in characters (synonym for length) - size_t size() const { return length_; } - - // Check if string is empty. - bool empty() const { return !data_ || length_ == 0; } - - // Get character at specific position - char32_t& operator[](size_t pos) { return data_[pos]; } - - // Get character at specific position (const) - const char32_t& operator[](size_t pos) const { return data_[pos]; } - -private: - char32_t* data_; - size_t length_; -}; - -} // namespace ultralight diff --git a/include/Ultralight/String8.h b/include/Ultralight/String8.h deleted file mode 100644 index 432c8e0..0000000 --- a/include/Ultralight/String8.h +++ /dev/null @@ -1,74 +0,0 @@ -/// -/// @file String8.h -/// -/// @brief The header for the String8 class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// @brief A UTF-8 string container. -// -class UExport String8 { -public: - // Make an empty String8 - String8(); - - // Make a String8 from raw, null-terminated UTF-8 string - String8(const char* c_str); - - // Make a String8 from raw UTF-8 string with certain length - String8(const char* c_str, size_t len); - - // Make a deep copy of String8 - String8(const String8& other); - - ~String8(); - - // Assign a String8 to this one, deep copy is made - String8& operator=(const String8& other); - - // Append a String8 to this one. - String8& operator+=(const String8& other); - - // Concatenation operator - inline friend String8 operator+(String8 lhs, const String8& rhs) { lhs += rhs; return lhs; } - - // Get raw UTF-8 data - char* data() { return data_; } - - // Get raw UTF-8 data (const) - const char* data() const { return data_; } - - // Get length in characters. - size_t length() const { return length_; } - - // Get size in characters (synonym for length) - size_t size() const { return length_; } - - // Check if string is empty. - bool empty() const { return !data_ || length_ == 0; } - - // Get character at specific position - char& operator[](size_t pos) { return data_[pos]; } - - // Get character at specific position (const) - const char& operator[](size_t pos) const { return data_[pos]; } - -private: - char* data_; - size_t length_; -}; - -} // namespace ultralight diff --git a/include/Ultralight/Ultralight.h b/include/Ultralight/Ultralight.h deleted file mode 100644 index edc904d..0000000 --- a/include/Ultralight/Ultralight.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 Ultralight, Inc. All rights reserved. -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include diff --git a/include/Ultralight/View.h b/include/Ultralight/View.h deleted file mode 100644 index d4b966a..0000000 --- a/include/Ultralight/View.h +++ /dev/null @@ -1,244 +0,0 @@ -/// -/// @file View.h -/// -/// @brief The header for the View class. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ultralight { - -/// -/// @brief A View is similar to a tab in a browser-- you load web content into -/// it and display it however you want. @see Renderer::CreateView -/// -/// @note The API is currently not thread-safe, all calls must be made on the -/// main thread. -/// -class UExport View : public RefCounted { -public: - /// - /// Get the URL of the current page loaded into this View, if any. - /// - virtual String url() = 0; - - /// - /// Get the title of the current page loaded into this View, if any. - /// - virtual String title() = 0; - - /// - /// Get the width of the View, in device coordinates. - /// - virtual uint32_t width() const = 0; - - /// - /// Get the height of the View, in device coordinates. - /// - virtual uint32_t height() const = 0; - - /// - /// Check if the main frame of the page is currently loading. - /// - virtual bool is_loading() = 0; - - /// - /// Get the RenderTarget for the View. - /// - /// @note The RenderTarget is only used when you define a custom GPUDriver. - /// - /// During each call to Renderer::Render, each View will be drawn to - /// an offscreen texture/render-buffer. You should use RenderTarget - /// to obtain the internal texture ID for the View and then display - /// it in some quad (eg, call GPUDriver::BindTexture with the texture - /// ID, then draw a textured quad in your 3D engine, making sure to - /// use the UV coords specified in the RenderTarget). - /// - /// @see Overlay.cpp within the AppCore source for an example. - /// - virtual RenderTarget render_target() = 0; - - /// - /// Check if bitmap is dirty (has changed since last call to View::bitmap) - /// - /// @note Only valid when using the default, offscreen GPUDriver. - /// - virtual bool is_bitmap_dirty() = 0; - - /// - /// Get the bitmap for the View (calling this resets the dirty state). - /// - // @note Only valid when using the default, offscreen GPUDriver. - /// - virtual RefPtr bitmap() = 0; - - /// - /// Load a raw string of HTML, the View will navigate to it as a new page. - /// - virtual void LoadHTML(const String& html) = 0; - - /// - /// Load a URL, the View will navigate to it as a new page. - /// - /// @note You can use File URLs (eg, file:///page.html) but you must define - /// your own FileSystem implementation. @see Platform::set_file_system - /// - virtual void LoadURL(const String& url) = 0; - - /// - /// Resize View to a certain size. - /// - /// @param width The initial width, in device coordinates. - /// - /// @param height The initial height, in device coordinates. - /// - /// @note The device coordinates are scaled to pixels by multiplying them - /// with the current DPI scale (@see Config::device_scale_hint) and - /// rounding to the nearest integer value. - /// - virtual void Resize(uint32_t width, uint32_t height) = 0; - - /// - /// Get the page's JSContext for use with the JavaScriptCore API - /// - /// @note We expose the entire JavaScriptCore API to users for maximum - /// flexibility. Each page has its own JSContext that gets reset - /// after each page navigation. You should make all your initial - /// JavaScript calls to the page within the DOMReady event, - /// @see ViewListener::OnDOMReady - /// - virtual JSContextRef js_context() = 0; - - /// - /// Evaluate a raw string of JavaScript and return results as a native - /// JavaScriptCore JSValueRef (@see ) - /// - /// @note This is just a wrapper for JSEvaluateScript() in JavaScriptCore - /// - virtual JSValueRef EvaluateScript(const String& script) = 0; - - /// - /// Whether or not we can navigate backwards in history - /// - virtual bool CanGoBack() = 0; - - /// - /// Whether or not we can navigate forwards in history - /// - virtual bool CanGoForward() = 0; - - /// - /// Navigate backwards in history - /// - virtual void GoBack() = 0; - - /// - /// Navigate forwards in history - /// - virtual void GoForward() = 0; - - /// - /// Navigate to an arbitrary offset in history - /// - virtual void GoToHistoryOffset(int offset) = 0; - - /// - /// Reload current page - /// - virtual void Reload() = 0; - - /// - /// Stop all page loads - /// - virtual void Stop() = 0; - - /// - /// Fire a keyboard event - /// - /// @note Only 'Char' events actually generate text in input fields. - /// - virtual void FireKeyEvent(const KeyEvent& evt) = 0; - - /// - /// Fire a mouse event - /// - virtual void FireMouseEvent(const MouseEvent& evt) = 0; - - /// - /// Fire a scroll event - /// - virtual void FireScrollEvent(const ScrollEvent& evt) = 0; - - /// - /// Set a ViewListener to receive callbacks for View-related events. - /// - /// @note Ownership remains with the caller. - /// - virtual void set_view_listener(ViewListener* listener) = 0; - - /// - /// Get the active ViewListener, if any - /// - virtual ViewListener* view_listener() const = 0; - - /// - /// Set a LoadListener to receive callbacks for Load-related events. - /// - /// @note Ownership remains with the caller. - /// - virtual void set_load_listener(LoadListener* listener) = 0; - - /// - /// Get the active LoadListener, if any - /// - virtual LoadListener* load_listener() const = 0; - - /// - /// Set whether or not this View should be repainted during the next - /// call to Renderer::Render - /// - /// @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. - /// - virtual void set_needs_paint(bool needs_paint) = 0; - - /// - /// Whether or not this View should be repainted during the next call to - /// Renderer::Render. - /// - virtual bool needs_paint() const = 0; - - /// - /// Get the 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 first loads. - /// - /// @note The inspector View is owned by the View and lazily-created on - /// first call. The initial dimensions are 10x10, you should call - /// View::Resize() on the returned View to resize it to your desired - /// dimensions. - /// - virtual RefPtr inspector() = 0; - -protected: - virtual ~View(); -}; - -} // namespace ultralight diff --git a/include/Ultralight/platform/Config.h b/include/Ultralight/platform/Config.h deleted file mode 100644 index 2efba14..0000000 --- a/include/Ultralight/platform/Config.h +++ /dev/null @@ -1,142 +0,0 @@ -/// -/// @file Config.h -/// -/// @brief The header for the Config struct. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include - -namespace ultralight { - -/// -/// The winding order for front-facing triangles. -/// -/// @note In most 3D engines, there is the concept that triangles have a -/// a "front" and a "back". All the front-facing triangles (eg, those -/// that are facing the camera) are rendered, and all back-facing -/// triangles are culled (ignored). The winding-order of the triangle's -/// vertices is used to determine which side is front and back. You -/// should tell Ultralight which winding-order your 3D engine uses. -/// -enum FaceWinding { - /// - /// Clockwise Winding (Direct3D, etc.) - /// - kFaceWinding_Clockwise, - - /// - /// Counter-Clockwise Winding (OpenGL, etc.) - /// - kFaceWinding_CounterClockwise, -}; - -/// -/// @brief Configurations settings for Ultralight. -/// -/// This is intended to be implemented by users and defined before creating the -/// Renderer. @see Platform::set_config. -/// -struct UExport Config { - /// - /// The winding order for front-facing triangles. @see FaceWinding - /// - FaceWinding face_winding = kFaceWinding_CounterClockwise; - - /// - /// Whether or not images should be enabled. - /// - bool enable_images = true; - - /// - /// Whether or not JavaScript should be enabled. - /// - bool enable_javascript = true; - - /// - /// When using the default, offscreen GPU driver, whether or not we - /// should use BGRA byte order (instead of RGBA). @see View::bitmap - /// - bool use_bgra_for_offscreen_rendering = false; - - /// - /// The amount that the application DPI has been scaled (200% = 2.0). - /// Used for scaling device coordinates to pixels and oversampling raster - /// shapes. - /// - double device_scale_hint = 1.0; - - /// - /// Default font-family to use. - /// - String16 font_family_standard = "Times New Roman"; - - /// - /// Default font-family to use for fixed fonts. (pre/code) - /// - String16 font_family_fixed = "Courier New"; - - /// - /// Default font-family to use for serif fonts. - /// - String16 font_family_serif = "Times New Roman"; - - /// - /// Default font-family to use for sans-serif fonts. - /// - String16 font_family_sans_serif = "Arial"; - - /// - /// Default user-agent string. - /// - String16 user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " - "AppleWebKit/602.1 (KHTML, like Gecko) " - "Ultralight/0.9.2 Safari/602.1"; - - /// - /// Default user stylesheet. You should set this to your own custom CSS - /// string to define default styles for various DOM elements, scrollbars, - /// and platform input widgets. - /// - String16 user_stylesheet; - - /// - /// 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. - /// - bool force_repaint = false; - - /// - /// When a CSS animation is active, the amount of time to wait before - /// triggering another repaint. - /// - double animation_timer_delay = 1.0 / 60.0; - - /// - /// Size of WebCore's memory cache in bytes. - /// - /// @note You should increase this if you anticipate handling pages with - /// large resources, Safari typically uses 128+ MiB for its cache. - /// - uint32_t memory_cache_size = 64 * 1024 * 1024; - - /// - /// Number of pages to keep in the cache. Defaults to 0 (none). - /// - /// @note Safari typically caches about 5 pages and maintains an on-disk - /// cache to support typical web-browsing activities. If you increase - /// this, you should probably increase the memory cache size as well. - /// - uint32_t page_cache_size = 0; -}; - -} // namespace ultralight diff --git a/include/Ultralight/platform/FileSystem.h b/include/Ultralight/platform/FileSystem.h deleted file mode 100644 index 5d9a837..0000000 --- a/include/Ultralight/platform/FileSystem.h +++ /dev/null @@ -1,208 +0,0 @@ -/// -/// @file FileSystem.h -/// -/// @brief The header for the FileSystem interface. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -/// -/// File Handle type used as unique ID for opened files. -/// -#if defined(__WIN32__) || defined(_WIN32) -typedef size_t FileHandle; -#else -typedef int FileHandle; -#endif - -/// -/// Handle used to denote an invalid file. -/// -const FileHandle invalidFileHandle = (FileHandle)-1; - -/// -/// The position to seek from in a file, @see FileSystem::SeekFile -/// -enum FileSeekOrigin { - kFileSeekOrigin_Beginning = 0, - kFileSeekOrigin_Current, - kFileSeekOrigin_End -}; - -/// -/// The type of path, @see FileSystem::GetMetadata -/// -enum MetadataType { - kMetadataType_Unknown = 0, - kMetadataType_File, - kMetadataType_Directory, -}; - -/// -/// @brief FileSystem interface, used for all file system operations. -/// -/// This is used for things like loading File URLs (eg, and -/// the JavaScript FileSystem API. If you don't implement this interface, you -/// will not be able to load any File URLs. -/// -/// -/// This is intended to be implemented by users and defined before creating the -/// Renderer. @see Platform::set_file_system. -/// -/// @note To support File URL loading, you ONLY need to implement the -/// following functions: -/// - FileSystem::FileExists -/// - FileSystem::GetFileSize -/// - FileSystem::GetFileMimeType -/// - FileSystem::OpenFile -/// - FileSystem::ReadFromFile -/// - FileSystem::CloseFile -/// -class UExport FileSystem { -public: - virtual ~FileSystem(); - - /// - /// Check if file path exists, return true if exists. - /// - virtual bool FileExists(const String16& path) = 0; - - /// - /// Delete file, return true on success. - /// - virtual bool DeleteFile_(const String16& path) = 0; - - /// - /// Delete empty directory, return true on success. - /// - virtual bool DeleteEmptyDirectory(const String16& path) = 0; - - /// - /// Move file, return true on success. - /// - virtual bool MoveFile_(const String16& old_path, const String16& new_path) = 0; - - /// - /// Get file size, store result in 'result'. Return true on success. - /// - virtual bool GetFileSize(const String16& path, int64_t& result) = 0; - - /// - /// Get file size of previously opened file, store result in 'result'. Return true on success. - /// - virtual bool GetFileSize(FileHandle handle, int64_t& result) = 0; - - /// - /// Get file mime type (eg "text/html"), store result in 'result'. Return true on success. - /// - virtual bool GetFileMimeType(const String16& path, String16& result) = 0; - - /// - /// Get file last modification time, store result in 'result'. Return true on success. - /// - virtual bool GetFileModificationTime(const String16& path, time_t& result) = 0; - - /// - /// Get file creation time, store result in 'result'. Return true on success. - /// - virtual bool GetFileCreationTime(const String16& path, time_t& result) = 0; - - /// - /// Get path type (file or directory). - /// - virtual MetadataType GetMetadataType(const String16& path) = 0; - - /// - /// Concatenate path with another path component. Return concatenated result. - /// - virtual String16 GetPathByAppendingComponent(const String16& path, const String16& component) = 0; - - /// - /// Create directory, return true on success. - /// - virtual bool CreateDirectory_(const String16& path) = 0; - - /// - /// Get home directory path. - /// - virtual String16 GetHomeDirectory() = 0; - - /// - /// Get filename component from path. - /// - virtual String16 GetFilenameFromPath(const String16& path) = 0; - - /// - /// Get directory name from path. - /// - virtual String16 GetDirectoryNameFromPath(const String16& path) = 0; - - /// - /// Get volume from path and store free space in 'result'. Return true on success. - /// - virtual bool GetVolumeFreeSpace(const String16& path, uint64_t& result) = 0; - - /// - /// Get volume from path and return its unique volume id. - /// - virtual int32_t GetVolumeId(const String16& path) = 0; - - /// - /// Get file listing for directory path with optional filter, return vector of file paths. - /// - virtual Ref ListDirectory(const String16& path, const String16& filter) = 0; - - /// - /// Open a temporary file with suggested prefix, store handle in 'handle'. Return path of temporary file. - /// - virtual String16 OpenTemporaryFile(const String16& prefix, FileHandle& handle) = 0; - - /// - /// Open file path for reading or writing. Return file handle on success, or invalidFileHandle on failure. - /// - virtual FileHandle OpenFile(const String16& path, bool open_for_writing) = 0; - - /// - /// Close previously-opened file. - /// - virtual void CloseFile(FileHandle& handle) = 0; - - /// - /// Seek currently-opened file, with offset relative to certain origin. Return new file offset. - /// - virtual int64_t SeekFile(FileHandle handle, int64_t offset, FileSeekOrigin origin) = 0; - - /// - /// Truncate currently-opened file with offset, return true on success. - /// - virtual bool TruncateFile(FileHandle handle, int64_t offset) = 0; - - /// - /// Write to currently-opened file, return number of bytes written or -1 on failure. - /// - virtual int64_t WriteToFile(FileHandle handle, const char* data, int64_t length) = 0; - - /// - /// Read from currently-opened file, return number of bytes read or -1 on failure. - /// - virtual int64_t ReadFromFile(FileHandle handle, char* data, int64_t length) = 0; - - /// - /// Copy file from source to destination, return true on success. - /// - virtual bool CopyFile_(const String16& source_path, const String16& destination_path) = 0; -}; - -} // namespace ultralight diff --git a/include/Ultralight/platform/FontLoader.h b/include/Ultralight/platform/FontLoader.h deleted file mode 100644 index 51b2c91..0000000 --- a/include/Ultralight/platform/FontLoader.h +++ /dev/null @@ -1,86 +0,0 @@ -/// -/// @file FontLoader.h -/// -/// @brief The header for the FontLoader interface. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include -#include -#include - -namespace ultralight { - -/// -/// @brief Font Loader interface, used for all font lookup operations. -/// -/// Every operating system has its own library of installed system fonts. The -/// FontLoader interface is used to lookup these fonts and fetch the actual -/// font data (raw TTF/OTF file data) given a certain font description. -/// -/// You can override this interface to bundle your own fonts or override the -/// default system font loading behavior. -/// -/// This is intended to be implemented by users and defined before creating the -/// Renderer. @see Platform::set_font_loader -/// -class UExport FontLoader { -public: - virtual ~FontLoader(); - - /// - /// Fallback font family name. Will be used if all other fonts fail to load. - /// - /// @note This font should be GUARANTEED to exist (eg, FontLoader::Load - /// won't fail when passed this font family name). - /// - virtual String16 fallback_font() const = 0; - - /// - /// Fallback font family name that can render the specified characters. This - /// is mainly used to support CJK (Chinese, Japanese, Korean) text display. - /// - /// @param characters One or more UTF-16 characters. This is almost ALWAYS - /// a single character. - /// - /// @param weight Font weight. - /// - /// @param italic Whether or not italic is requested. - /// - /// @param size Font size. - /// - /// @return Should return a font family name that can render the text. - /// - virtual String16 fallback_font_for_characters(const String16& characters, - int weight, bool italic, - float size) const = 0; - - /// - /// Get the actual font file data (TTF/OTF) for a given font description. - /// - /// @param family Font family name. - /// - /// @param weight Font weight. - /// - /// @param italic Whether or not italic is requested. - /// - /// @param size Font size. - /// - /// @return A buffer of bytes containing raw font file contents of the - /// font matching the given description. - /// - /// @note As an example of usage, when given the family "Arial", this - /// function should return the raw file contents for "ARIAL.TTF" - /// - virtual Ref Load(const String16& family, int weight, bool italic, - float size) = 0; -}; - -} // namespace ultralight diff --git a/include/Ultralight/platform/GPUDriver.h b/include/Ultralight/platform/GPUDriver.h deleted file mode 100644 index db50819..0000000 --- a/include/Ultralight/platform/GPUDriver.h +++ /dev/null @@ -1,285 +0,0 @@ -/// -/// @file GPUDriver.h -/// -/// @brief The header for the GPUDriver interface. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#pragma warning(disable: 4251) -#include -#include -#include -#include - -namespace ultralight { - -/// -/// @note This pragma pack(push, 1) command is important! Vertex layouts -/// should not be padded with any bytes. -/// -#pragma pack(push, 1) - -/// -/// RenderBuffer description, @see GPUDriver::CreateRenderBuffer. -/// -struct UExport RenderBuffer { - uint32_t texture_id; - uint32_t width; - uint32_t height; - bool has_stencil_buffer; - bool has_depth_buffer; -}; - -/// -/// Vertex layout for path vertices, useful for synthesizing or modifying -/// vertex data. -/// -struct Vertex_2f_4ub_2f { - float pos[2]; - unsigned char color[4]; - float obj[2]; -}; - -/// -/// Vertex layout for quad vertices, useful for synthesizing or modifying -/// vertex data. -/// -struct Vertex_2f_4ub_2f_2f_28f { - 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]; -}; - -/// -/// Vertex formats -/// -enum UExport VertexBufferFormat { - kVertexBufferFormat_2f_4ub_2f, - kVertexBufferFormat_2f_4ub_2f_2f_28f, -}; - -/// -/// Vertex buffer, @see GPUDriver::CreateGeometry -/// -struct UExport VertexBuffer { - VertexBufferFormat format; - uint32_t size; - uint8_t* data; -}; - -/// -/// Vertex index type -/// -typedef uint32_t IndexType; - -/// -/// Vertex index buffer, @see GPUDriver::CreateGeometry -/// -struct UExport IndexBuffer { - uint32_t size; - uint8_t* data; -}; - -/// -/// Shader types, used by GPUState::shader_type -/// -enum UExport ShaderType { - kShaderType_Fill, - kShaderType_FillPath, -}; - -/// -/// GPU state description. -/// -struct UExport GPUState { - float viewport_width; - float viewport_height; - Matrix4x4 transform; - bool enable_texturing; - bool enable_blend; - uint8_t shader_type; - uint32_t render_buffer_id; - uint32_t texture_1_id; - uint32_t texture_2_id; - uint32_t texture_3_id; - float uniform_scalar[8]; - vec4 uniform_vector[8]; - uint8_t clip_size; - Matrix4x4 clip[8]; - bool enable_scissor; - Rect scissor_rect; -}; - -/// -/// Command types, used by Command::command_type -/// -enum UExport CommandType { - kCommandType_ClearRenderBuffer, - kCommandType_DrawGeometry, -}; - -/// -/// Command description, handling one of these should result in either a call to -/// GPUDriver::ClearRenderBuffer or GPUDriver::DrawGeometry. -/// -struct UExport Command { - uint8_t command_type; - GPUState gpu_state; - uint32_t geometry_id; - uint32_t indices_count; - uint32_t indices_offset; -}; - -/// -/// Command list, @see GPUDriver::UpdateCommandList -/// -struct UExport CommandList { - uint32_t size; - Command* commands; -}; - -#pragma pack(pop) - -/// -/// @brief GPUDriver interface, dispatches GPU calls to the native driver. -/// -/// By default, Ultralight uses an offscreen, OpenGL GPUDriver that draws each -/// View to an offscreen Bitmap (@see View::bitmap). You can override this to -/// provide your own GPUDriver and integrate directly with your own 3D engine. -/// -/// This is intended to be implemented by users and defined before creating the -/// Renderer. @see Platform::set_gpu_driver -/// -class UExport GPUDriver { -public: - virtual ~GPUDriver(); - - /// - /// Called before any commands are dispatched during a frame. - /// - virtual void BeginSynchronize() = 0; - - /// - /// Called after any commands are dispatched during a frame. - /// - virtual void EndSynchronize() = 0; - - /// - /// Get the next available texture ID. - /// - virtual uint32_t NextTextureId() = 0; - - /// Create a texture with a certain ID and optional bitmap. If the Bitmap is - /// empty (Bitmap::IsEmpty), then a RTT Texture should be created instead. - /// - virtual void CreateTexture(uint32_t texture_id, - Ref bitmap) = 0; - - /// - /// Update an existing non-RTT texture with new bitmap data. - /// - virtual void UpdateTexture(uint32_t texture_id, - Ref bitmap) = 0; - - /// - /// Bind a texture to a certain texture unit. - /// - virtual void BindTexture(uint8_t texture_unit, - uint32_t texture_id) = 0; - - /// - /// Destroy a texture. - /// - virtual void DestroyTexture(uint32_t texture_id) = 0; - - /// - /// Generate the next available render buffer ID. - /// - virtual uint32_t NextRenderBufferId() = 0; - - /// - /// Create a render buffer with certain ID and buffer description. - /// - virtual void CreateRenderBuffer(uint32_t render_buffer_id, - const RenderBuffer& buffer) = 0; - - /// - /// Bind a render buffer - /// - virtual void BindRenderBuffer(uint32_t render_buffer_id) = 0; - - /// - /// Clear a render buffer (flush pixels to 0). - /// - virtual void ClearRenderBuffer(uint32_t render_buffer_id) = 0; - - /// - /// Destroy a render buffer - /// - virtual void DestroyRenderBuffer(uint32_t render_buffer_id) = 0; - - /// - /// Generate the next available geometry ID. - /// - virtual uint32_t NextGeometryId() = 0; - - /// - /// Create geometry with certain ID and vertex/index data. - /// - virtual void CreateGeometry(uint32_t geometry_id, - const VertexBuffer& vertices, - const IndexBuffer& indices) = 0; - - /// - /// Update existing geometry with new vertex/index data. - /// - virtual void UpdateGeometry(uint32_t geometry_id, - const VertexBuffer& vertices, - const IndexBuffer& indices) = 0; - - /// - /// Draw geometry using the specific index count/offset and GPUState. - /// - virtual void DrawGeometry(uint32_t geometry_id, - uint32_t indices_count, - uint32_t indices_offset, - const GPUState& state) = 0; - - /// - /// Destroy geometry. - /// - virtual void DestroyGeometry(uint32_t geometry_id) = 0; - - /// - /// Update command list (you should copy the commands to your own structure). - /// - virtual void UpdateCommandList(const CommandList& list) = 0; - - /// - /// Check if any commands need drawing. - /// - virtual bool HasCommandsPending() = 0; - - /// - /// Iterate through stored command list and dispatch to ClearRenderBuffer or - /// DrawGeometry, respectively. Command list should be cleared at end of call. - /// - virtual void DrawCommandList() = 0; -}; - -} // namespace ultralight diff --git a/include/Ultralight/platform/Platform.h b/include/Ultralight/platform/Platform.h deleted file mode 100644 index d2d44b7..0000000 --- a/include/Ultralight/platform/Platform.h +++ /dev/null @@ -1,116 +0,0 @@ -/// -/// @file Platform.h -/// -/// @brief The header for the Platform singleton. -/// -/// @author -/// -/// This file is a part of Ultralight, a fast, lightweight, HTML UI engine -/// -/// Website: -/// -/// Copyright (C) 2019 Ultralight, Inc. All rights reserved. -/// -#pragma once -#include - -namespace ultralight { - -struct Config; -class GPUDriver; -class FontLoader; -class FileSystem; - -/// -/// @brief Platform singleton to configure Ultralight and provide user-defined -/// implementations for various platform operations. -/// -/// @note All of these settings and user-defined interfaces should be set -/// BEFORE creating the Renderer. -/// -/// A default GPUDriver and FontLoader are provided, you must provide -/// your own FileSystem interface if you want to load local files. -/// -/// For more info about the defaults @see DefaultGPUDriver and -/// @see DefaultFontLoader. -/// -class UExport Platform { - public: - /// - /// Get the Platform singleton - /// - static Platform& instance(); - - virtual ~Platform(); - - /// - /// Set the Config - /// - virtual void set_config(const Config& config) = 0; - - /// - /// Get the Config - /// - virtual const Config& config() const = 0; - - /// - /// Set the GPU Driver (will handle all rendering) - /// - /// @param gpu_driver A user-defined GPUDriver implementation, ownership - /// remains with the caller. - /// - /// @note If you never call this, the default driver will be used instead. - /// @see DefaultGPUDriver - /// - virtual void set_gpu_driver(GPUDriver* gpu_driver) = 0; - - /// - /// Get the GPU Driver - /// - virtual GPUDriver* gpu_driver() const = 0; - - /// - /// Set the Font Loader (will be used to map font families to actual fonts) - /// - /// @param font_loader A user-defined FontLoader implementation, ownership - /// remains with the caller. - /// - /// @note If you never call this, the default font loader will be used - /// instead. @see DefaultFontLoader - /// - virtual void set_font_loader(FontLoader* font_loader) = 0; - - /// - /// Get the Font Loader - /// - virtual FontLoader* font_loader() const = 0; - - /// - /// Set the File System (will be used for all file system operations) - /// - /// @param file_system A user-defined FileSystem implementation, ownership - /// remains with the caller. - /// - virtual void set_file_system(FileSystem* file_system) = 0; - - /// - /// Get the File System - /// - virtual FileSystem* file_system() const = 0; -}; - -/// -/// The default GPU driver is an OpenGL driver that paints each View to an -/// offscreen bitmap (@see View::bitmap). This is lazily-initialized. -/// -UExport GPUDriver* DefaultGPUDriver(); - -/// -/// The default Font Loader uses the native font loader API for the platform. -/// -/// @note Windows and macOS font loading is implemented but Linux is still in -/// progress-- currently just loads an embedded Roboto font. -/// -UExport FontLoader* DefaultFontLoader(); - -} // namespace ultralight