]> Nishi Git Mirror - mivfx.git/commitdiff
ズーム
author諏訪子 <suwako@076.moe>
Thu, 2 May 2024 10:58:42 +0000 (19:58 +0900)
committer諏訪子 <suwako@076.moe>
Thu, 2 May 2024 10:58:42 +0000 (19:58 +0900)
main.c

diff --git a/main.c b/main.c
index cd5449cb196525d58786bd095c22422fdeb92c1b..c4001d9521bc758aafa48e8a55a249a98f705639 100644 (file)
--- a/main.c
+++ b/main.c
@@ -18,6 +18,9 @@ int screenHeight;
 int init = 0;
 SDL_Rect renderQuad;
 
+// ズーム
+float zoom = 1.0f;
+
 const char* sofname = "mivfx";
 const char* version = "0.5.0";
 
@@ -64,6 +67,59 @@ void windowevent(SDL_Event e) {
     } else if (e.key.keysym.sym == SDLK_a) {
       // GIFアニメーションの停止・続き、0.6.0から追加する予定
     }
+  } else if (e.type == SDL_MOUSEWHEEL) {
+    // TODO: ノートパソコンでおかしくなる
+    float zoomSpeed = 0.1f;
+    if (e.wheel.y > 0) {
+      zoom += zoomSpeed;
+    } else if (e.wheel.y < 0) {
+      zoom -= zoomSpeed;
+    }
+
+    if (zoom < 0.1f) {
+      zoom = 0.1f;
+    }
+
+    // 画像のサイズが変わった場合
+    float newWidth = (float)imgWidth * zoom;
+    float newHeight = (float)imgHeight * zoom;
+
+    float minLimit = 50.0f;
+    float maxLimitW = (screenWidth - 20);
+    float maxLimitH = (screenHeight - 20);
+
+    // 画像は50x50以下じゃ駄目
+    if (newWidth < minLimit && newWidth < minLimit) {
+      newWidth = minLimit;
+      newHeight = minLimit;
+    } else if (newWidth < minLimit && newHeight >= minLimit) {
+      newWidth = minLimit;
+    } else if (newWidth >= minLimit && newHeight < minLimit) {
+      newHeight = minLimit;
+    }
+
+    // 大きすぎの場合もふざけんな
+    // TODO: 大きすぎの場合は、ズームインを辞める様にして
+    if (newWidth >= maxLimitW && newHeight >= maxLimitH) {
+      newHeight = (screenHeight * aspectRatio) - 20;
+      newWidth = (screenWidth * aspectRatio) - 20;
+    } else if (newWidth >= maxLimitW && newHeight < maxLimitH) {
+      newWidth = (screenWidth * aspectRatio) - 20;
+    } else if (newWidth < maxLimitW && newHeight >= maxLimitH) {
+      newHeight = (screenHeight * aspectRatio) - 20;
+    }
+
+    // テキスチャーのレンダーリングサイズの設定
+    SDL_RenderClear(renderer);
+
+    renderQuad.w = (int)newWidth;
+    renderQuad.h = (int)newHeight;
+    renderQuad.x = (windowWidth - renderQuad.w) / 2;
+    renderQuad.y = (windowHeight - renderQuad.h) / 2;
+
+    SDL_RenderClear(renderer);
+    SDL_RenderCopy(renderer, texture, NULL, &renderQuad);
+    SDL_RenderPresent(renderer);
   } else if (e.type == SDL_WINDOWEVENT && e.window.event == SDL_WINDOWEVENT_RESIZED) {
     // ウィンドウのサイズが変わった場合
     int newWidth = e.window.data1;