/* * Sets the viewport and matrix projection */ void S2D_GL_SetViewport(S2D_Window *window) { int ortho_w = window->viewport.width; int ortho_h = window->viewport.height; int x, y, w, h; // calculated GL viewport values x = 0; y = 0; w = window->width; h = window->height; switch (window->viewport.mode) { case S2D_FIXED: w = window->orig_width; h = window->orig_height; y = window->height - h; break; case S2D_EXPAND: ortho_w = w; ortho_h = h; break; case S2D_SCALE: S2D_GL_GetViewportScale(window, &w, &h, NULL); // Center the viewport x = window->width / 2.0 - w/2.0; y = window->height / 2.0 - h/2.0; break; case S2D_STRETCH: break; } glViewport(x, y, w, h); // Set orthographic projection matrix orthoMatrix[0] = 2.0f / (GLfloat)ortho_w; orthoMatrix[5] = -2.0f / (GLfloat)ortho_h; #if GLES S2D_GLES_ApplyProjection(orthoMatrix); #else if (S2D_GL2) { S2D_GL2_ApplyProjection(ortho_w, ortho_h); } else { S2D_GL3_ApplyProjection(orthoMatrix); } #endif }
/* * Get the mouse coordinates relative to the viewport */ void S2D_GetMouseOnViewport(S2D_Window *window, int wx, int wy, int *x, int *y) { double scale; // viewport scale factor int w, h; // width and height of scaled viewport switch (window->viewport.mode) { case S2D_FIXED: *x = wx / (window->orig_width / (double)window->viewport.width); *y = wy / (window->orig_height / (double)window->viewport.height); break; case S2D_SCALE: S2D_GL_GetViewportScale(window, &w, &h, &scale); *x = wx * 1 / scale - (window->width - w) / (2.0 * scale); *y = wy * 1 / scale - (window->height - h) / (2.0 * scale); break; case S2D_STRETCH: *x = wx * window->viewport.width / (double)window->width; *y = wy * window->viewport.height / (double)window->height; break; } }