From f9a6ec1c1acf3ba58067d957454e5529d6d5e875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Fri, 24 May 2024 19:27:56 +0900 Subject: [PATCH] =?UTF-8?q?=E7=94=BB=E5=83=8F=E3=82=92=E3=83=80=E3=82=A6?= =?UTF-8?q?=E3=83=B3=E3=83=AD=E3=83=BC=E3=83=89=E6=A9=9F=E8=83=BD=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + Makefile | 4 +-- main.c | 88 +++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 66 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 701c962..d6194dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * 再レンダーリングの問題の修正 * 画像回転機能性の追加 * 画像反転機能性の追加 +* 画像をダウンロード機能性 # 0.5.0 * .desktopファイルの追加 diff --git a/Makefile b/Makefile index 23e0140..c0d8dd7 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ UNAME_S!=uname -s UNAME_M!=uname -m -NAME!=cat main.c | grep "const char\* sofname" | awk '{print $$5}' | \ +NAME!=cat main.c | grep "const char \*sofname" | awk '{print $$5}' | \ sed "s/\"//g" | sed "s/;//" -VERSION!=cat main.c | grep "const char\* version" | awk '{print $$5}' | \ +VERSION!=cat main.c | grep "const char \*version" | awk '{print $$5}' | \ sed "s/\"//g" | sed "s/;//" PREFIX=/usr/local diff --git a/main.c b/main.c index a56a215..108b9cd 100644 --- a/main.c +++ b/main.c @@ -3,13 +3,16 @@ #include #include #include +#include +#include #define DELAY_MS 50 -SDL_Window* window = NULL; -SDL_Renderer* renderer = NULL; -SDL_Texture* texture = NULL; +SDL_Window *window = NULL; +SDL_Renderer *renderer = NULL; +SDL_Texture *texture = NULL; bool quit = false; +bool hasdownloaded = false; // DDoSを避ける為 float aspectRatio; int imgX = 10; int imgY = 10; @@ -18,6 +21,8 @@ int imgHeight; int screenWidth; int screenHeight; int init = 0; +char *imgfilename; +char *imgurl; SDL_Rect renderQuad; float newWidth; float newHeight; @@ -37,16 +42,16 @@ float angle = 0.0f; bool flippedH = false; bool flippedV = false; -const char* sofname = "mivfx"; -const char* version = "0.6.0"; +const char *sofname = "mivfx"; +const char *version = "0.6.0"; -bool dlfile(const char* url, const char* filename) { - CURL* curl = curl_easy_init(); +bool dlfile(const char *url, const char *filename) { + CURL *curl = curl_easy_init(); if (!curl) { return false; } - FILE* file = fopen(filename, "wb"); + FILE *file = fopen(filename, "wb"); if (!file) { return false; } @@ -77,6 +82,40 @@ bool dlfile(const char* url, const char* filename) { return true; } +char *fromurl(char *imgfile, char *dir) { + char s[512], *p, *tokens[128]; + char *last; + int i = 0; + imgurl = imgfile; + + snprintf(s, sizeof(s), "%s", imgfile); + + for ( + (p = strtok_r(s, "/", &last)); + p; + (p = strtok_r(NULL, "/", &last)) + ) { + if (i < 127) tokens[i++] = p; + } + + tokens[i] = NULL; + imgfilename = tokens[i - 1]; + + char *res; + + res = (char *)malloc(1024); + if (res == NULL) { + return NULL; + } + + snprintf(res, 1024, "%s/%s", dir, imgfilename); + if (!dlfile(imgfile, res)) { + printf("画像をダウンロードに失敗。URL: %s\n", imgfile); + return NULL; + } + return res; +} + void RenderCopy(SDL_Rect renderQuad) { SDL_RenderCopyEx( renderer, @@ -141,7 +180,14 @@ void windowevent(SDL_Event e) { flippedH = !flippedH; SDL_RenderPresent(renderer); } else if (e.key.keysym.sym == SDLK_o) { - // 画像をダウンロードする(リモート画像のみ) + bool isurl = strncmp(imgurl, "http://", 7) == 0 || + strncmp(imgurl, "https://", 8) == 0; + if (isurl && !hasdownloaded) { + char path[1024]; + getcwd(path, 1024); + if (fromurl(imgurl, path) != NULL) puts("ダウンロード済み"); + hasdownloaded = true; + } } else if (e.key.keysym.sym == SDLK_p) { // 画像をrsync|sftp|http postで使って共有する、0.7.0から追加する予定 } @@ -298,7 +344,7 @@ void usage() { printf("%s-%s\nusage: %s [file or url]\n", sofname, version, sofname); } -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { if (argc < 2) { usage(); return 1; @@ -316,25 +362,20 @@ int main(int argc, char* argv[]) { return 1; } - const char* imgfile = argv[1]; + const char *imgfile = argv[1]; // URLの場合、仮にダウンロードして bool isurl = strncmp(imgfile, "http://", 7) == 0 || strncmp(imgfile, "https://", 8) == 0; - char tmpname[] = "/tmp/netimg.png"; - if (isurl) { - if (!dlfile(imgfile, tmpname)) { - printf("画像をダウンロードに失敗。URL: %s\n", imgfile); - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); - SDL_Quit(); - return 1; - } - imgfile = tmpname; + imgfile = isurl ? fromurl(argv[1], "/tmp") : argv[1]; + if (imgfile == NULL) { + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); } // 画像の読込 - SDL_Surface* imgsurface = IMG_Load(imgfile); + SDL_Surface *imgsurface = IMG_Load(imgfile); if (imgsurface == NULL) { printf("画像の読込に失敗:%s\n", IMG_GetError()); SDL_DestroyRenderer(renderer); @@ -405,9 +446,6 @@ int main(int argc, char* argv[]) { } // 掃除 - if (isurl) { - remove(tmpname); - } SDL_DestroyTexture(texture); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window);