From 39f69ad7d780ae7e49372b1fcbed2b62ec87055f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=B2sweg?= Date: Sun, 5 Jul 2020 08:38:35 +0200 Subject: [PATCH] Initial commit --- .gitignore | 96 +++++++++++++++++++++++ Makefile | 9 +++ assets/radial_gradient-black.jpg | Bin 0 -> 3989 bytes assets/radial_gradient-blue.jpg | Bin 0 -> 7257 bytes assets/radial_gradient-brown.jpg | Bin 0 -> 6173 bytes assets/radial_gradient-green.jpg | Bin 0 -> 6432 bytes assets/radial_gradient-pink.jpg | Bin 0 -> 3861 bytes assets/radial_gradient-purple.jpg | Bin 0 -> 6610 bytes assets/radial_gradient-red.jpg | Bin 0 -> 7033 bytes assets/radial_gradient-yellow.jpg | Bin 0 -> 5003 bytes src/fs.c | 58 ++++++++++++++ src/fs.h | 13 ++++ src/grid.c | 8 ++ src/grid.h | 8 ++ src/main.c | 125 ++++++++++++++++++++++++++++++ src/texture.c | 13 ++++ src/texture.h | 12 +++ 17 files changed, 342 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100755 assets/radial_gradient-black.jpg create mode 100755 assets/radial_gradient-blue.jpg create mode 100755 assets/radial_gradient-brown.jpg create mode 100755 assets/radial_gradient-green.jpg create mode 100755 assets/radial_gradient-pink.jpg create mode 100755 assets/radial_gradient-purple.jpg create mode 100755 assets/radial_gradient-red.jpg create mode 100755 assets/radial_gradient-yellow.jpg create mode 100644 src/fs.c create mode 100644 src/fs.h create mode 100644 src/grid.c create mode 100644 src/grid.h create mode 100644 src/main.c create mode 100644 src/texture.c create mode 100644 src/texture.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7de9058 --- /dev/null +++ b/.gitignore @@ -0,0 +1,96 @@ +# Created by https://www.toptal.com/developers/gitignore/api/vim,c,linux +# Edit at https://www.toptal.com/developers/gitignore?templates=vim,c,linux + +### C ### +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Vim ### +# Swap +[._]*.s[a-v][a-z] +!*.svg # comment out if you don't need vector files +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim +Sessionx.vim + +# Temporary +.netrwhist +# Auto-generated tag files +tags +# Persistent undo +[._]*.un~ + +# End of https://www.toptal.com/developers/gitignore/api/vim,c,linux + +main +build diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ed280fb --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +SOURCES = src/*.c +LIBS = -lSDL2 -lSDL2_image +CFLAGS = -DDEBUG + +main: $(SOURCES) src/*.h + gcc $(SOURCES) $(LIBS) $(CFLAGS) -o main + +run: main + ./main diff --git a/assets/radial_gradient-black.jpg b/assets/radial_gradient-black.jpg new file mode 100755 index 0000000000000000000000000000000000000000..fed924a4cc864e1329e5f3dd9d13bbd5f03515ce GIT binary patch literal 3989 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 Lm9weZ((C^LzVmPD literal 0 HcmV?d00001 diff --git a/assets/radial_gradient-blue.jpg b/assets/radial_gradient-blue.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f551ab4bb1ac94059bf621742188fb2727a6926a GIT binary patch literal 7257 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 literal 0 HcmV?d00001 diff --git a/assets/radial_gradient-brown.jpg b/assets/radial_gradient-brown.jpg new file mode 100755 index 0000000000000000000000000000000000000000..897e81ff37a21b68b7d34f133ef53451ccc8b031 GIT binary patch literal 6173 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 literal 0 HcmV?d00001 diff --git a/assets/radial_gradient-pink.jpg b/assets/radial_gradient-pink.jpg new file mode 100755 index 0000000000000000000000000000000000000000..29b6597c631ad105231ff5fec98ee5d993e767af GIT binary patch literal 3861 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 literal 0 HcmV?d00001 diff --git a/assets/radial_gradient-purple.jpg b/assets/radial_gradient-purple.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2678f7830d311622ee713a4d27299fbdeb1ccf1d GIT binary patch literal 6610 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 literal 0 HcmV?d00001 diff --git a/assets/radial_gradient-yellow.jpg b/assets/radial_gradient-yellow.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1c82307829c70f1778dfc84906313c2a42e78c6f GIT binary patch literal 5003 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 RAR0Sab^pX?(-_RC{}-$^V}<|# literal 0 HcmV?d00001 diff --git a/src/fs.c b/src/fs.c new file mode 100644 index 0000000..f168420 --- /dev/null +++ b/src/fs.c @@ -0,0 +1,58 @@ +#include "fs.h" + +int countFiles(char *path){ + DIR *dp; + int i = 0; + struct dirent *ep; + dp = opendir (path); + + if (dp != NULL){ + while (ep = readdir (dp)) i++; + + (void) closedir (dp); + } + else{ + fprintf(stderr, "Unable to open directory \"%s\".\n", path); + } + + return i - 2; +} + +char **listFiles(char *path){ + int nfiles = countFiles(path); + + if(nfiles < 0){ + fprintf(stderr, "There are no files in the specified assets directory.\n"); + return 0; + } + + + DIR *dp; + struct dirent *ep; + dp = opendir(path); + + if (dp != NULL) { + char **strings = (char **) malloc(sizeof(char **) * nfiles); + + int i = 0; // For assigning the string to the string array + + /* print all the files and directories within directory */ + while ((ep = readdir (dp)) != NULL) { + if(strcmp(ep->d_name,".") && strcmp(ep->d_name,"..")){ + // All this means is allocate space for the length of the string + // plus the \0 character having in mind the size of each character + strings[i] = malloc((strlen(ep->d_name) + strlen(path) + 1) * sizeof(char)); + //strcpy(strings[i],path); + strcpy(strings[i],"assets/"); + strcat(strings[i],ep->d_name); + i++; // if not inside it will give size error since it counts . and .. + if(i == nfiles) return strings; + } + } + closedir (dp); + } else { + /* could not open directory */ + perror ("could not open directory\n"); + return 0; + } +} diff --git a/src/fs.h b/src/fs.h new file mode 100644 index 0000000..c2ba74b --- /dev/null +++ b/src/fs.h @@ -0,0 +1,13 @@ +#ifndef __FS_H__ +#define __FS_H__ + +#include +#include +#include +#include +#include + +int countFiles(char *path); +char **listFiles(char *path); + +#endif diff --git a/src/grid.c b/src/grid.c new file mode 100644 index 0000000..cbf027d --- /dev/null +++ b/src/grid.c @@ -0,0 +1,8 @@ +#include "grid.h" + +int gridHelper(SDL_Rect* rect, int index, SDL_Rect screen, int zoom, int page){ + rect->y = 0; + rect->x = screen.w/20 * index; + + //printf("index %i -- x = %i | y = %i | w = %i | h = %i\n", index, rect->x, rect->y, rect->w, rect->h); +} diff --git a/src/grid.h b/src/grid.h new file mode 100644 index 0000000..ef11653 --- /dev/null +++ b/src/grid.h @@ -0,0 +1,8 @@ +#ifndef __GRID_H__ +#define __GRID_H__ + +#include + +int gridHelper(SDL_Rect* rect, int index, SDL_Rect container, int zoom, int page); + +#endif diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..fea8ed9 --- /dev/null +++ b/src/main.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include + +#define _DEBUG + +#include "texture.h" +#include "fs.h" +#include "grid.h" + +#define SCREEN_WIDTH 640 +#define SCREEN_HEIGHT 480 + +int main(int argc, char* args[]) { + SDL_Window* window = NULL; + SDL_Renderer* renderer = NULL; + + /* SDL Initialization */ + + if (SDL_Init(SDL_INIT_VIDEO) < 0) { + fprintf(stderr, "Could not initialize SDL2: %s\n", SDL_GetError()); + return 1; + } + if (IMG_Init(IMG_INIT_JPG || IMG_INIT_PNG) < 0) { + fprintf(stderr, "Could not initialize SDL2_image: %s\n", IMG_GetError()); + } + + window = SDL_CreateWindow("pscsp", + SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + SCREEN_WIDTH, SCREEN_HEIGHT, + SDL_WINDOW_SHOWN + ); + if (window == NULL) { + fprintf(stderr, "Could not create window: %s\n", SDL_GetError()); + return 1; + } + + renderer = SDL_CreateRenderer( + window, + -1, + SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC + ); + if (renderer == NULL) { + fprintf(stderr, "Could not create renderer: %s\n", SDL_GetError()); + return 1; + } + + const Uint8* currentKeyStates = SDL_GetKeyboardState(NULL); + + /* Init of the game */ + + // Get image file names and their count + char ** imageNames = listFiles("assets/"); + int nfiles = countFiles("assets/"); + + // Allocate space for the images + SDL_Texture **thumbs = (SDL_Texture **) malloc(sizeof(SDL_Texture *) * nfiles); + + // Load the images (and free the strings allocated before) + for(int i = 0; i < nfiles; i++){ + thumbs[i] = NULL; + thumbs[i] = IMG_LoadTexture(renderer, imageNames[i]); + + if(thumbs[i] == NULL){ + fprintf(stderr, "Error on loading image at path \"%s\".\n", imageNames[i]); + } + else{ + fprintf(stderr, "Loaded image on at path \"%s\".\n", imageNames[i]); + } + + free(imageNames[i]); + imageNames[i] = NULL; + } + + SDL_Rect thumbs_container = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; + SDL_Rect thumbs_rect = {40, 40, 40, 40}; + + for(int i = 0; i < nfiles; i++){ + gridHelper(&thumbs_rect, i, thumbs_container, 1, 0); + printf("index %i -- x = %i | y = %i | w = %i | h = %i\n", + i, thumbs_rect.x, thumbs_rect.y, thumbs_rect.w, thumbs_rect.h); + } + + bool quit = false; + SDL_Event e; + while(!quit){ + while(SDL_PollEvent(&e)!=0){ + if(e.type == SDL_QUIT){ + quit = true; + } + } + if(currentKeyStates[SDL_SCANCODE_ESCAPE]){ + return 0; + } + + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xFF); + SDL_RenderClear(renderer); + + // Thumbnail grid rendering + //thumbs_rect.x = 0; + //thumbs_rect.y = 0; + for(int i = 0; i < nfiles; i++){ + gridHelper(&thumbs_rect, i, thumbs_container, 1, 0); + SDL_RenderCopy(renderer, thumbs[i], NULL, &thumbs_rect); + } + + SDL_RenderPresent(renderer); + } + + // Deallocations + printf("\nDeallocating assets...\n"); + for(int i = 0; i < nfiles; i++){ + SDL_DestroyTexture(thumbs[i]); + thumbs[i] = NULL; + } + + SDL_DestroyWindow(window); + window = NULL; + SDL_DestroyRenderer(renderer); + renderer = NULL; + + SDL_Quit(); + return 0; +} diff --git a/src/texture.c b/src/texture.c new file mode 100644 index 0000000..57355d1 --- /dev/null +++ b/src/texture.c @@ -0,0 +1,13 @@ +#include "texture.h" + +SDL_Texture *PSX_loadTexture(char *path){ + SDL_Texture *texture = NULL; + + fprintf(stderr, "Image file string not valid: It's NULL\n"); + + #ifdef DEBUG + printf("Loaded \"%s\"\n", path); + #endif + + return texture; +} diff --git a/src/texture.h b/src/texture.h new file mode 100644 index 0000000..08f7dd6 --- /dev/null +++ b/src/texture.h @@ -0,0 +1,12 @@ +#ifndef __TEXTURE_H__ +#define __TEXTURE_H__ + +#include +#include +#include + +SDL_Texture *PSX_loadTexture(char *path); + +SDL_Rect PSX_GetTextureRect(SDL_Texture* texture); + +#endif