diff options
Diffstat (limited to 'source/modules/asura-core/window/window_impl_sdl.cpp')
-rw-r--r-- | source/modules/asura-core/window/window_impl_sdl.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/source/modules/asura-core/window/window_impl_sdl.cpp b/source/modules/asura-core/window/window_impl_sdl.cpp new file mode 100644 index 0000000..9554e37 --- /dev/null +++ b/source/modules/asura-core/window/window_impl_sdl.cpp @@ -0,0 +1,154 @@ +#include "../core_config.h" + +#if ASURA_WINDOW_SDL + +#include <SDL2/SDL.h> + +#include <asura-utils/exceptions/exception.h> + +#include "window_impl_sdl.h" + +using namespace AEGraphics; + +namespace AsuraEngine +{ + namespace Window + { + +#define asura_flag_to_sdl_flag(flag, _flag, _sdl_flag) \ + if ((flag & _flag) != 0) \ + flag |= _sdl_flag + + WindowImplSDL::WindowImplSDL() + : mWnd(nullptr) + , mGLContext(0) + { + } + + WindowImplSDL::~WindowImplSDL() + { + SDL_GL_DeleteContext(mGLContext); + SDL_DestroyWindow(mWnd); + SDL_FlushEvent(SDL_WINDOWEVENT); + } + + bool WindowImplSDL::Init(const WindowConfig& config) + { + if (SDL_Init(SDL_INIT_VIDEO) < 0) + return false; + + int flag = 0; + asura_flag_to_sdl_flag(flag, WINDOW_FULLSCREEN, SDL_WINDOW_FULLSCREEN); + asura_flag_to_sdl_flag(flag, WINDOW_OPENGL, SDL_WINDOW_OPENGL); + asura_flag_to_sdl_flag(flag, WINDOW_SHOWN, SDL_WINDOW_SHOWN); + asura_flag_to_sdl_flag(flag, WINDOW_HIDDEN, SDL_WINDOW_HIDDEN); + asura_flag_to_sdl_flag(flag, WINDOW_BORDERLESS, SDL_WINDOW_BORDERLESS); + asura_flag_to_sdl_flag(flag, WINDOW_RESIZABLE, SDL_WINDOW_RESIZABLE); + asura_flag_to_sdl_flag(flag, WINDOW_MINIMIZED, SDL_WINDOW_MINIMIZED); + asura_flag_to_sdl_flag(flag, WINDOW_MAXIMIZED, SDL_WINDOW_MAXIMIZED); + asura_flag_to_sdl_flag(flag, WINDOW_INPUT_GRABBED, SDL_WINDOW_INPUT_GRABBED); + asura_flag_to_sdl_flag(flag, WINDOW_INPUT_FOCUS, SDL_WINDOW_INPUT_FOCUS); + asura_flag_to_sdl_flag(flag, WINDOW_MOUSE_FOCUS, SDL_WINDOW_MOUSE_FOCUS); + asura_flag_to_sdl_flag(flag, WINDOW_ALLOW_HIGHDPI, SDL_WINDOW_ALLOW_HIGHDPI); + asura_flag_to_sdl_flag(flag, WINDOW_MOUSE_CAPTURE, SDL_WINDOW_MOUSE_CAPTURE); + asura_flag_to_sdl_flag(flag, WINDOW_ALWAYS_ON_TOP, SDL_WINDOW_ALWAYS_ON_TOP); + + // Set GL window / framebuffer attributes. + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_RETAINED_BACKING, 0); + + mWnd = SDL_CreateWindow(config.title.c_str(), config.x, config.y, config.width, config.height, flag); + + if (!mWnd) + return false; + + // ͼ + try + { + if (config.icon) + { + ImageData* img = config.icon; + if (img->format == COLOR_FORMAT_RGBA8) + { + SDL_Surface *surface; + + img->Lock(); + + int w = img->width, h = img->height; + surface = SDL_CreateRGBSurfaceFrom( + img->pixels, + w, h, + 32, + w * 4, + Color32::RMASK, + Color32::GMASK, + Color32::BMASK, + Color32::AMASK + ); + + img->Unlock(); + + SDL_SetWindowIcon(mWnd, surface); + SDL_FreeSurface(surface); + } + } + } + catch (...) + { + } + + mGLContext = SDL_GL_CreateContext(mWnd); + + if (!mGLContext) + { + SDL_DestroyWindow(mWnd); + return false; + } + + SDL_GL_MakeCurrent(mWnd, mGLContext); + SDL_GL_SetSwapInterval(config.vsync ? 1 : 0); + + return true; + } + + void WindowImplSDL::SetSize(uint width, uint height) + { + SDL_SetWindowSize(mWnd, width, height); + } + + void WindowImplSDL::SetPosition(int x, int y) + { + SDL_SetWindowPosition(mWnd, x, y); + } + + void WindowImplSDL::SetTitils(const std::string& title) + { + SDL_SetWindowTitle(mWnd, title.c_str()); + } + + void WindowImplSDL::Show() + { + SDL_ShowWindow(mWnd); + } + + void WindowImplSDL::Hide() + { + SDL_HideWindow(mWnd); + } + + void WindowImplSDL::SwapRenderBuffer() + { + SDL_GL_SwapWindow(mWnd); + } + + } +} + +#endif // ASURA_WINDOW_SDL
\ No newline at end of file |