#include "aliases.h" #include #include #include #include #include #include #include #include #include #include #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 #define IMAGE_WIDTH 300 #define IMAGE_HEIGHT 300 typedef struct { u64 size; u8 *buf; } img_t; img_t load_image(const char *filepath); SDL_Texture *load_texture(SDL_Renderer *renderer, const char *filepath); int main(void) { SDL_Init(SDL_INIT_EVERYTHING); IMG_Init(IMG_INIT_PNG); SDL_Window *window = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); SDL_Renderer *renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); bool running = true; SDL_Event event = {0}; SDL_Texture *texture1 = IMG_LoadTexture(renderer, "ball.png"); SDL_Texture *texture2 = load_texture(renderer, "ball.png"); SDL_Rect dest1 = { .x = 50, .y = 150, .w = IMAGE_WIDTH, .h = IMAGE_HEIGHT, }; SDL_Rect dest2 = { .x = 450, .y = 150, .w = IMAGE_WIDTH, .h = IMAGE_HEIGHT, }; while (running) { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: running = false; break; } } SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_RenderClear(renderer); SDL_RenderCopy(renderer, texture1, NULL, &dest1); SDL_RenderCopy(renderer, texture2, NULL, &dest2); SDL_RenderPresent(renderer); } SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); IMG_Quit(); SDL_Quit(); return 0; } img_t load_image(const char *filepath) { FILE *fp = fopen(filepath, "rb"); if (!fp) { return (img_t){0}; } img_t img = {0}; fseek(fp, 0, SEEK_END); img.size = ftell(fp); fseek(fp, 0, SEEK_SET); img.buf = (u8 *)malloc(img.size); fread((void *)(img.buf), img.size, 1, fp); fclose(fp); return img; } SDL_Texture *load_texture(SDL_Renderer *renderer, const char *filepath) { img_t img = load_image("ball.png"); if (!(img.buf)) { return NULL; } SDL_RWops *ctx = SDL_RWFromMem(img.buf, img.size); SDL_Texture *texture = IMG_LoadTexture_RW(renderer, ctx, 1); free(img.buf); return texture; }