struct Video; struct VideoDriver { VideoDriver(Video& super) : super(super) {} virtual ~VideoDriver() = default; virtual auto create() -> bool { return true; } virtual auto driver() -> string { return "None"; } virtual auto ready() -> bool { return true; } virtual auto hasFullScreen() -> bool { return false; } virtual auto hasMonitor() -> bool { return false; } virtual auto hasExclusive() -> bool { return false; } virtual auto hasContext() -> bool { return false; } virtual auto hasBlocking() -> bool { return false; } virtual auto hasFlush() -> bool { return false; } virtual auto hasFormats() -> vector { return {"ARGB24"}; } virtual auto hasShader() -> bool { return false; } auto hasFormat(string format) -> bool { return (bool)hasFormats().find(format); } virtual auto setFullScreen(bool fullScreen) -> bool { return true; } virtual auto setMonitor(string monitor) -> bool { return true; } virtual auto setExclusive(bool exclusive) -> bool { return true; } virtual auto setContext(uintptr context) -> bool { return true; } virtual auto setBlocking(bool blocking) -> bool { return true; } virtual auto setFlush(bool flush) -> bool { return true; } virtual auto setFormat(string format) -> bool { return true; } virtual auto setShader(string shader) -> bool { return true; } virtual auto clear() -> void {} virtual auto size(uint& width, uint& height) -> void {} virtual auto acquire(uint32_t*& data, uint& pitch, uint width, uint height) -> bool { return false; } virtual auto release() -> void {} virtual auto output(uint width = 0, uint height = 0) -> void {} virtual auto poll() -> void {} protected: Video& super; friend class Video; bool fullScreen = false; string monitor = "Primary"; bool exclusive = false; uintptr context = 0; bool blocking = false; bool flush = false; string format = "ARGB24"; string shader = "Blur"; }; struct Video { static auto hasDrivers() -> vector; static auto hasDriver(string driver) -> bool { return (bool)hasDrivers().find(driver); } static auto optimalDriver() -> string; static auto safestDriver() -> string; struct Monitor { string name; bool primary = false; int x = 0; int y = 0; int width = 0; int height = 0; }; static auto monitor(string name) -> Monitor; static auto hasMonitors() -> vector; static auto hasMonitor(string name) -> bool { for(auto& monitor : hasMonitors()) { if(monitor.name == name) return true; } return false; } Video() : self(*this) { reset(); } explicit operator bool() { return instance->driver() != "None"; } auto reset() -> void { instance = new VideoDriver(*this); } auto create(string driver = "") -> bool; auto driver() -> string { return instance->driver(); } auto ready() -> bool { return instance->ready(); } auto hasFullScreen() -> bool { return instance->hasFullScreen(); } auto hasMonitor() -> bool { return instance->hasMonitor(); } auto hasExclusive() -> bool { return instance->hasExclusive(); } auto hasContext() -> bool { return instance->hasContext(); } auto hasBlocking() -> bool { return instance->hasBlocking(); } auto hasFlush() -> bool { return instance->hasFlush(); } auto hasFormats() -> vector { return instance->hasFormats(); } auto hasShader() -> bool { return instance->hasShader(); } auto hasFormat(string format) -> bool { return instance->hasFormat(format); } auto fullScreen() -> bool { return instance->fullScreen; } auto monitor() -> string { return instance->monitor; } auto exclusive() -> bool { return instance->exclusive; } auto context() -> uintptr { return instance->context; } auto blocking() -> bool { return instance->blocking; } auto flush() -> bool { return instance->flush; } auto format() -> string { return instance->format; } auto shader() -> string { return instance->shader; } auto setMonitor(string monitor) -> bool; auto setFullScreen(bool fullScreen) -> bool; auto setExclusive(bool exclusive) -> bool; auto setContext(uintptr context) -> bool; auto setBlocking(bool blocking) -> bool; auto setFlush(bool flush) -> bool; auto setFormat(string format) -> bool; auto setShader(string shader) -> bool; auto clear() -> void; struct Size { uint width = 0; uint height = 0; }; auto size() -> Size; struct Acquire { explicit operator bool() const { return data; } uint32_t* data = nullptr; uint pitch = 0; }; auto acquire(uint width, uint height) -> Acquire; auto release() -> void; auto output(uint width = 0, uint height = 0) -> void; auto poll() -> void; auto onUpdate(const function&) -> void; auto doUpdate(uint width, uint height) -> void; protected: Video& self; unique_pointer instance; function update; };