4 #include "SDL_opengl.h"
11 SDL_Init(SDL_INIT_VIDEO);
12 m_window = SDL_CreateWindow("IPDF", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
13 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
17 Fatal("Couldn't create window!");
20 m_gl_context = SDL_GL_CreateContext(m_window);
22 ResizeViewport(800, 600);
28 SDL_GL_DeleteContext(m_gl_context);
29 SDL_DestroyWindow(m_window);
33 void Screen::ResizeViewport(int width, int height)
35 glViewport(0, 0, width, height);
36 m_viewport_width = width;
37 m_viewport_height = height;
40 bool Screen::PumpEvents()
43 bool no_quit_requested = true;
44 while (SDL_PollEvent(&evt))
49 no_quit_requested = false;
52 switch (evt.window.event)
54 case SDL_WINDOWEVENT_RESIZED:
55 case SDL_WINDOWEVENT_SIZE_CHANGED:
56 ResizeViewport(evt.window.data1, evt.window.data2);
61 m_last_mouse_x = evt.motion.x;
62 m_last_mouse_y = evt.motion.y;
65 m_mouse_handler(evt.motion.x, evt.motion.y,evt.motion.state, 0);
68 case SDL_MOUSEBUTTONDOWN:
69 case SDL_MOUSEBUTTONUP:
70 m_last_mouse_x = evt.button.x;
71 m_last_mouse_y = evt.button.y;
74 m_mouse_handler(evt.button.x, evt.button.y, evt.button.state, 0);
80 m_mouse_handler(m_last_mouse_x, m_last_mouse_y, 0, evt.wheel.y);
85 Debug("Key %c down", (char)evt.key.keysym.sym);
86 if (isalnum((char)evt.key.keysym.sym))
88 char filename[] = "0.bmp";
89 filename[0] = (char)evt.key.keysym.sym;
97 return no_quit_requested;
100 void Screen::SetMouseCursor(Screen::MouseCursors cursor)
102 SDL_SystemCursor system_cursor_id = SDL_SYSTEM_CURSOR_ARROW;
105 case CursorArrow: system_cursor_id = SDL_SYSTEM_CURSOR_ARROW; break;
106 case CursorWait: system_cursor_id = SDL_SYSTEM_CURSOR_WAIT; break;
107 case CursorWaitArrow: system_cursor_id = SDL_SYSTEM_CURSOR_WAITARROW; break;
108 case CursorMove: system_cursor_id = SDL_SYSTEM_CURSOR_SIZEALL; break;
109 case CursorHand: system_cursor_id = SDL_SYSTEM_CURSOR_HAND; break;
112 SDL_Cursor *system_cursor = SDL_CreateSystemCursor(system_cursor_id);
113 SDL_SetCursor(system_cursor);
114 //TODO: Check if we need to free the system cursors.
117 void Screen::Present()
119 SDL_GL_SwapWindow(m_window);
122 void Screen::ScreenShot(const char * filename) const
124 Debug("Attempting to save BMP to file %s", filename);
125 SDL_Surface * info = SDL_GetWindowSurface(m_window);
128 Fatal("Failed to create info surface from m_window - %s", SDL_GetError());
131 unsigned num_pix = info->w * info->h * info->format->BytesPerPixel;
132 unsigned char * pixels = new unsigned char[num_pix];
135 Fatal("Failed to allocate %u pixel array - %s", num_pix, strerror(errno));
138 SDL_Renderer * renderer = SDL_GetRenderer(m_window);
139 if (renderer == NULL)
141 Fatal("Couldn't get renderer from m_window - %s", SDL_GetError());
143 if (SDL_RenderReadPixels(renderer, &(info->clip_rect), info->format->format, pixels, info->w * info->format->BytesPerPixel) != 0)
145 Fatal("SDL_RenderReadPixels failed - %s", SDL_GetError());
148 // This line is disgusting
149 SDL_Surface * save = SDL_CreateRGBSurfaceFrom(pixels, info->w, info->h, info->format->BitsPerPixel, info->w * info->format->BytesPerPixel,
150 info->format->Rmask, info->format->Gmask, info->format->Bmask, info->format->Amask);
153 Fatal("Couldn't create SDL_Surface from renderer pixel data - %s", SDL_GetError());
155 if (SDL_SaveBMP(save, filename) != 0)
157 Fatal("SDL_SaveBMP to %s failed - %s", filename, SDL_GetError());
160 //SDL_DestroyRenderer(renderer);
161 SDL_FreeSurface(save);
162 SDL_FreeSurface(info);