Browse Source

Merge pull request #3 from kolumb/letterboxing

Add scaling similar to logical render size in SDL
Alexey Kutepov 5 years ago
parent
commit
503ee682a5
1 changed files with 54 additions and 32 deletions
  1. 54 32
      main.c

+ 54 - 32
main.c

@@ -6,15 +6,15 @@
 #define STB_IMAGE_IMPLEMENTATION
 #define STB_IMAGE_IMPLEMENTATION
 #include "stb_image.h"
 #include "stb_image.h"
 
 
-#define SCREEN_WIDTH 800
-#define SCREEN_HEIGHT 600
 #define FPS 60
 #define FPS 60
 #define DELTA_TIME (1.0f / FPS)
 #define DELTA_TIME (1.0f / FPS)
-#define SPRITE_DIGIT_WIDTH (300 / 2)
-#define SPRITE_DIGIT_HEIGHT (380 / 2)
-#define DIGIT_WIDTH (300 / 2)
-#define DIGIT_HEIGHT (380 / 2)
-#define DIGITS_COUNT 11
+#define SPRITE_CHAR_WIDTH (300 / 2)
+#define SPRITE_CHAR_HEIGHT (380 / 2)
+#define CHAR_WIDTH (300 / 2)
+#define CHAR_HEIGHT (380 / 2)
+#define CHARS_COUNT 8
+#define TEXT_WIDTH (CHAR_WIDTH * CHARS_COUNT)
+#define TEXT_HEIGHT (CHAR_HEIGHT)
 #define WIGGLE_COUNT 3
 #define WIGGLE_COUNT 3
 #define WIGGLE_DURATION (0.40 / WIGGLE_COUNT)
 #define WIGGLE_DURATION (0.40 / WIGGLE_COUNT)
 #define COLON_INDEX 10
 #define COLON_INDEX 10
@@ -78,16 +78,16 @@ SDL_Texture *load_png_file_as_texture(SDL_Renderer *renderer,
 }
 }
 
 
 void render_digit_at(SDL_Renderer *renderer, SDL_Texture *digits, size_t digit_index,
 void render_digit_at(SDL_Renderer *renderer, SDL_Texture *digits, size_t digit_index,
-                     size_t wiggle_index, int *pen_x, int *pen_y, float scale)
+                     size_t wiggle_index, int *pen_x, int *pen_y, float user_scale, float fit_scale)
 {
 {
-    const int effective_digit_width = (int) floorf((float) DIGIT_WIDTH * scale);
-    const int effective_digit_height = (int) floorf((float) DIGIT_HEIGHT * scale);
+    const int effective_digit_width = (int) floorf((float) CHAR_WIDTH * user_scale * fit_scale);
+    const int effective_digit_height = (int) floorf((float) CHAR_HEIGHT * user_scale * fit_scale);
 
 
     const SDL_Rect src_rect = {
     const SDL_Rect src_rect = {
-        (int) (digit_index * SPRITE_DIGIT_WIDTH),
-        (int) (wiggle_index * SPRITE_DIGIT_HEIGHT),
-        SPRITE_DIGIT_WIDTH,
-        SPRITE_DIGIT_HEIGHT
+        (int) (digit_index * SPRITE_CHAR_WIDTH),
+        (int) (wiggle_index * SPRITE_CHAR_HEIGHT),
+        SPRITE_CHAR_WIDTH,
+        SPRITE_CHAR_HEIGHT
     };
     };
     const SDL_Rect dst_rect = {
     const SDL_Rect dst_rect = {
         *pen_x,
         *pen_x,
@@ -99,14 +99,22 @@ void render_digit_at(SDL_Renderer *renderer, SDL_Texture *digits, size_t digit_i
     *pen_x += effective_digit_width;
     *pen_x += effective_digit_width;
 }
 }
 
 
-void initial_pen(SDL_Window *window, int *pen_x, int *pen_y, float scale)
+void initial_pen(SDL_Window *window, int *pen_x, int *pen_y, float user_scale, float *fit_scale)
 {
 {
     int w, h;
     int w, h;
     SDL_GetWindowSize(window, &w, &h);
     SDL_GetWindowSize(window, &w, &h);
 
 
-    const int effective_digit_width = (int) floorf((float) DIGIT_WIDTH * scale);
-    const int effective_digit_height = (int) floorf((float) DIGIT_HEIGHT * scale);
-    *pen_x = w / 2 - effective_digit_width * 8 / 2;
+    float text_aspect_ratio = (float) TEXT_WIDTH / (float) TEXT_HEIGHT;
+    float window_aspect_ratio = (float) w / (float) h;
+    if(text_aspect_ratio > window_aspect_ratio) {
+        *fit_scale = (float) w / (float) TEXT_WIDTH;
+    } else {
+        *fit_scale = (float) h / (float) TEXT_HEIGHT;
+    }
+
+    const int effective_digit_width = (int) floorf((float) CHAR_WIDTH * user_scale * *fit_scale);
+    const int effective_digit_height = (int) floorf((float) CHAR_HEIGHT * user_scale * *fit_scale);
+    *pen_x = w / 2 - effective_digit_width * CHARS_COUNT / 2;
     *pen_y = h / 2 - effective_digit_height / 2;
     *pen_y = h / 2 - effective_digit_height / 2;
 }
 }
 
 
@@ -125,7 +133,7 @@ int main(int argc, char **argv)
     SDL_Window *window =
     SDL_Window *window =
         secp(SDL_CreateWindow(
         secp(SDL_CreateWindow(
                  "sowon",
                  "sowon",
-                 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
+                 0, 0, TEXT_WIDTH, TEXT_HEIGHT,
                  SDL_WINDOW_RESIZABLE));
                  SDL_WINDOW_RESIZABLE));
 
 
     SDL_Renderer *renderer =
     SDL_Renderer *renderer =
@@ -142,7 +150,7 @@ int main(int argc, char **argv)
     size_t wiggle_index = 0;
     size_t wiggle_index = 0;
     float wiggle_cooldown = WIGGLE_DURATION;
     float wiggle_cooldown = WIGGLE_DURATION;
     int paused = 0;
     int paused = 0;
-    float scale = 1.0f;
+    float user_scale = 1.0f;
     while (!quit) {
     while (!quit) {
         // INPUT BEGIN //////////////////////////////
         // INPUT BEGIN //////////////////////////////
         SDL_Event event = {0};
         SDL_Event event = {0};
@@ -163,20 +171,33 @@ int main(int argc, char **argv)
                     }
                     }
                 } break;
                 } break;
 
 
+                case SDLK_KP_PLUS:
                 case SDLK_EQUALS: {
                 case SDLK_EQUALS: {
-                    scale += SCALE_FACTOR * scale;
+                    user_scale += SCALE_FACTOR * user_scale;
                 } break;
                 } break;
 
 
+                case SDLK_KP_MINUS:
                 case SDLK_MINUS: {
                 case SDLK_MINUS: {
-                    scale -= SCALE_FACTOR * scale;
+                    user_scale -= SCALE_FACTOR * user_scale;
                 } break;
                 } break;
 
 
+                case SDLK_KP_0:
                 case SDLK_0: {
                 case SDLK_0: {
-                    scale = 1.0f;
+                    user_scale = 1.0f;
                 } break;
                 } break;
                 }
                 }
             } break;
             } break;
 
 
+            case SDL_MOUSEWHEEL: {
+                if (SDL_GetModState() & KMOD_CTRL) {
+                    if (event.wheel.y > 0) {
+                        user_scale += SCALE_FACTOR * user_scale;
+                    } else if (event.wheel.y < 0) {
+                        user_scale -= SCALE_FACTOR * user_scale;
+                    }
+                }
+            } break;
+
             default: {}
             default: {}
             }
             }
         }
         }
@@ -187,23 +208,24 @@ int main(int argc, char **argv)
         SDL_RenderClear(renderer);
         SDL_RenderClear(renderer);
         {
         {
             int pen_x, pen_y;
             int pen_x, pen_y;
-            initial_pen(window, &pen_x, &pen_y, scale);
+            float fit_scale = 1.0;
+            initial_pen(window, &pen_x, &pen_y, user_scale, &fit_scale);
 
 
             const size_t t = (size_t) ceilf(fmaxf(time, 0.0f));
             const size_t t = (size_t) ceilf(fmaxf(time, 0.0f));
 
 
             const size_t hours = t / 60 / 60;
             const size_t hours = t / 60 / 60;
-            render_digit_at(renderer, digits, hours / 10, wiggle_index, &pen_x, &pen_y, scale);
-            render_digit_at(renderer, digits, hours % 10, wiggle_index, &pen_x, &pen_y, scale);
-            render_digit_at(renderer, digits, COLON_INDEX, wiggle_index, &pen_x, &pen_y, scale);
+            render_digit_at(renderer, digits, hours / 10, wiggle_index, &pen_x, &pen_y, user_scale, fit_scale);
+            render_digit_at(renderer, digits, hours % 10, wiggle_index, &pen_x, &pen_y, user_scale, fit_scale);
+            render_digit_at(renderer, digits, COLON_INDEX, wiggle_index, &pen_x, &pen_y, user_scale, fit_scale);
 
 
             const size_t minutes = t / 60 % 60;
             const size_t minutes = t / 60 % 60;
-            render_digit_at(renderer, digits, minutes / 10, wiggle_index, &pen_x, &pen_y, scale);
-            render_digit_at(renderer, digits, minutes % 10, wiggle_index, &pen_x, &pen_y, scale);
-            render_digit_at(renderer, digits, COLON_INDEX, wiggle_index, &pen_x, &pen_y, scale);
+            render_digit_at(renderer, digits, minutes / 10, wiggle_index, &pen_x, &pen_y, user_scale, fit_scale);
+            render_digit_at(renderer, digits, minutes % 10, wiggle_index, &pen_x, &pen_y, user_scale, fit_scale);
+            render_digit_at(renderer, digits, COLON_INDEX, wiggle_index, &pen_x, &pen_y, user_scale, fit_scale);
 
 
             const size_t seconds = t % 60;
             const size_t seconds = t % 60;
-            render_digit_at(renderer, digits, seconds / 10, wiggle_index, &pen_x, &pen_y, scale);
-            render_digit_at(renderer, digits, seconds % 10, wiggle_index, &pen_x, &pen_y, scale);
+            render_digit_at(renderer, digits, seconds / 10, wiggle_index, &pen_x, &pen_y, user_scale, fit_scale);
+            render_digit_at(renderer, digits, seconds % 10, wiggle_index, &pen_x, &pen_y, user_scale, fit_scale);
         }
         }
         SDL_RenderPresent(renderer);
         SDL_RenderPresent(renderer);
         // RENDER END //////////////////////////////
         // RENDER END //////////////////////////////