| 212 | } |
| 213 | |
| 214 | void initialize_sdl(MainStruct& mS) { |
| 215 | SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_NAME_STRING, "InfiniPaint"); |
| 216 | SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_VERSION_STRING, VersionConstants::CURRENT_VERSION_STRING.c_str()); |
| 217 | SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_IDENTIFIER_STRING, "com.infinipaint.infinipaint"); |
| 218 | SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_CREATOR_STRING, "Yousef Khadadeh (ErrorAtLine0)"); |
| 219 | SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_COPYRIGHT_STRING, "Copyright (C) 2025-2026 Yousef Khadadeh"); |
| 220 | SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_URL_STRING, "https://infinipaint.com/"); |
| 221 | SDL_SetAppMetadataProperty(SDL_PROP_APP_METADATA_TYPE_STRING, "application"); |
| 222 | |
| 223 | SDL_SetHint(SDL_HINT_APP_NAME, "InfiniPaint"); |
| 224 | SDL_SetHint(SDL_HINT_PEN_TOUCH_EVENTS, "0"); |
| 225 | SDL_SetHint(SDL_HINT_PEN_MOUSE_EVENTS, "0"); |
| 226 | SDL_SetHint(SDL_HINT_MOUSE_TOUCH_EVENTS, "0"); |
| 227 | SDL_SetHint(SDL_HINT_TOUCH_MOUSE_EVENTS, "0"); |
| 228 | SDL_SetHint(SDL_HINT_ANDROID_TRAP_BACK_BUTTON, "1"); |
| 229 | SDL_SetHint(SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT, "#canvas"); // Ensures that SDL only grabs input when browser is focused on canvas |
| 230 | |
| 231 | if(!SDL_Init(SDL_INIT_VIDEO)) |
| 232 | throw std::runtime_error("[SDL_Init] " + std::string(SDL_GetError())); |
| 233 | |
| 234 | Uint32 window_flags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN | SDL_WINDOW_HIGH_PIXEL_DENSITY; |
| 235 | #ifdef USE_BACKEND_VULKAN |
| 236 | window_flags |= SDL_WINDOW_VULKAN; |
| 237 | #elif USE_BACKEND_OPENGL |
| 238 | window_flags |= SDL_WINDOW_OPENGL; |
| 239 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); |
| 240 | |
| 241 | #if defined(__EMSCRIPTEN__) || defined(USE_BACKEND_OPENGLES_3_0) |
| 242 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); |
| 243 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); |
| 244 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); |
| 245 | #elif defined(USE_BACKEND_OPENGL_2_1) |
| 246 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); |
| 247 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); |
| 248 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); |
| 249 | #else |
| 250 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); |
| 251 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); |
| 252 | SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); |
| 253 | #endif |
| 254 | |
| 255 | SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); |
| 256 | SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0); |
| 257 | SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, mS.kStencilBits); |
| 258 | SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); |
| 259 | #endif |
| 260 | |
| 261 | constexpr int DEFAULT_WINDOW_WIDTH = 1000; |
| 262 | constexpr int DEFAULT_WINDOW_HEIGHT = 900; |
| 263 | |
| 264 | #ifdef __EMSCRIPTEN__ |
| 265 | { |
| 266 | Vector2d sizeD; |
| 267 | EMSCRIPTEN_RESULT result = emscripten_get_element_css_size("#canvas", &sizeD.x(), &sizeD.y()); |
| 268 | if(result != EMSCRIPTEN_RESULT_SUCCESS) |
| 269 | std::cout << "Failed to get canvas size" << std::endl; |
| 270 | else { |
| 271 | mS.m->window.writtenSize.x() = mS.m->window.size.x() = sizeD.x(); |
no test coverage detected