← index
MasterX_System/compiler/ETL/etl_test_code/pong/sdl.c
Source: MasterX_System/compiler/ETL/etl_test_code/pong/sdl.c
#include"SDL.h"
#include"SDL_ttf.h"
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

TTF_Font *font = NULL;

void sdl_init() {
    if(SDL_Init(SDL_INIT_VIDEO) < 0) {
        fprintf(stderr, "Error on initilaztion\n");
        fflush(stderr);
        exit(EXIT_FAILURE);
    }
    if(TTF_Init() < 0) {
        fprintf(stderr, "Error on TTF Init: %s\n", TTF_GetError());
        fflush(stderr);
        SDL_Quit();
        exit(EXIT_FAILURE);
    }

    font = TTF_OpenFont("font.ttf", 18);
    if(!font) {
        fprintf(stderr, "Error could not open font: %s\n", TTF_GetError());
        fflush(stderr);
        TTF_Quit();
        SDL_Quit();
        exit(EXIT_FAILURE);
    }

    srand(time(0));
}


SDL_Window *window;
SDL_Renderer *ren;
SDL_Texture *tex;
SDL_Event e;
SDL_Color col;

void sdl_setcolor(long r, long g, long b, long a) {
    SDL_SetRenderDrawColor(ren, (Uint8)r, (Uint8)g, (Uint8)b, (Uint8)a);
}

void sdl_fillrect(long x, long y, long w, long h) {
    SDL_Rect rc;
    rc.x = x;
    rc.y = y;
    rc.w = w;
    rc.h = h;
    SDL_RenderFillRect(ren, &rc);
}

void sdl_drawline(long x1, long y1, long x2, long y2) {
    SDL_RenderDrawLine(ren, x1, y1, x2, y2);
}

void sdl_drawcircle(long center_x, long center_y, long radius) {
    int offset_x = 0;
    int offset_y = radius;
    int d = radius - 1;
    while (offset_y >= offset_x) {
        SDL_RenderDrawPoint(ren, center_x + offset_x, center_y + offset_y);
        SDL_RenderDrawPoint(ren, center_x + offset_y, center_y + offset_x);
        SDL_RenderDrawPoint(ren, center_x - offset_x, center_y + offset_y);
        SDL_RenderDrawPoint(ren, center_x - offset_y, center_y + offset_x);
        SDL_RenderDrawPoint(ren, center_x + offset_x, center_y - offset_y);
        SDL_RenderDrawPoint(ren, center_x + offset_y, center_y - offset_x);
        SDL_RenderDrawPoint(ren, center_x - offset_x, center_y - offset_y);
        SDL_RenderDrawPoint(ren, center_x - offset_y, center_y - offset_x);
        if (d >= 2 * offset_x) {
            d -= 2 * offset_x + 1;
            offset_x += 1;
        } else if (d < 2 * (radius - offset_y)) {
            d += 2 * offset_y - 1;
            offset_y -= 1;
        } else {
            d += 2 * (offset_y - offset_x - 1);
            offset_y -= 1;
            offset_x += 1;
        }
    }
}

long sdl_mousedown() {
    SDL_PumpEvents();
    int x, y;
    Uint32 buttons = SDL_GetMouseState(&x, &y);
    return (buttons & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0;
}

long sdl_mousex() {
    int x, y;
    SDL_GetMouseState(&x, &y);
    return x;
}

long sdl_mousey() {
    int x, y;
    SDL_GetMouseState(&x, &y);
    return y;
}

void sdl_messagebox(const char *message) {
    SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Game Over", message, window);
    printf("%s\n", message);
}


void sdl_create(char *name, long width, long height) {
     window = SDL_CreateWindow(name, 0, 0, width, height, SDL_WINDOW_SHOWN);
     if(window == NULL) {
        fprintf(stderr, "Could not create window: %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
     }
     ren = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if(ren == NULL) {
        fprintf(stderr, "Error could not create renderer: %s\n", SDL_GetError());
        SDL_Quit();
        exit(EXIT_FAILURE);
    }
    
    tex = SDL_CreateTexture(ren, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, width, height);
      
    if(tex == NULL) {
        fprintf(stderr, "Error could not create texture: %s\n", SDL_GetError());
        SDL_Quit();
        exit(EXIT_FAILURE);
    }
}

SDL_Texture *sdl_loadtex(const char *src) {
    SDL_Surface *surf = SDL_LoadBMP(src);
    if(!surf) {
        fprintf(stderr, "Error loading surface: %s\n", src);
        fflush(stderr);
        exit(EXIT_FAILURE);
    }
    SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, surf);
    SDL_FreeSurface(surf);
    if(!tex) {
        fprintf(stderr, "Error creating texture: %s\n", SDL_GetError());
        fflush(stderr);
        exit(EXIT_FAILURE);
    }
    return tex;
}

void sdl_delay(long ms) {
    SDL_Delay(ms);
}

void sdl_destroytex(SDL_Texture *tex) {
    if(tex != NULL)
        SDL_DestroyTexture(tex);
}

void sdl_copytex(SDL_Texture *text, long x, long y, long w, long h) {
    SDL_Rect rc = {x,y,w,h};
    SDL_SetRenderTarget(ren, tex);
    SDL_RenderCopy(ren, tex, NULL, &rc);
}

SDL_Color text_color = { 255, 255, 255, 255 };

void sdl_settextcolor(long r, long g, long b, long a) {
    text_color.r = (unsigned char)r;
    text_color.g = (unsigned char)g;
    text_color.b = (unsigned char)b;
    text_color.a = (unsigned char)a;
}

void sdl_printtext(long x, long y, char *src) {
    if(src == NULL | strlen(src) == 0)
        return;
    SDL_Surface *surf = TTF_RenderText_Solid(font, src, text_color);
    if(!surf) {
        fprintf(stderr, "Error render solid failed %s\n", TTF_GetError());
        return;
    }
    SDL_Texture *text = SDL_CreateTextureFromSurface(ren, surf);
    if(!text) {
        SDL_FreeSurface(surf);
        fprintf(stderr, "Error creating texture: %s\n", TTF_GetError());
        return;
    }

    SDL_Rect rc = {x, y, surf->w, surf->h };
    SDL_FreeSurface(surf);
    SDL_RenderCopy(ren, text, NULL, &rc);
    SDL_DestroyTexture(text);
}

long sdl_keydown(long key) {
    const Uint8 *keys = SDL_GetKeyboardState(0);
    return keys[key];
}

long sdl_getticks() {
    return (long) SDL_GetTicks64();
}

long sdl_pump() {
    while(SDL_PollEvent(&e)) {
            switch(e.type) {
                case SDL_KEYDOWN:
                    if(e.key.keysym.sym == SDLK_ESCAPE) return 0;
                    break;
                case SDL_QUIT:
                    return 0;
                    break;
            }
    }
    return 1;
}


void sdl_settarget(SDL_Texture *text) {
    SDL_SetRenderTarget(ren, text);
}
void sdl_cleartarget() {
    SDL_SetRenderTarget(ren, NULL);
}

void sdl_clear() {
     SDL_RenderClear(ren);
}

void sdl_flip() {
     SDL_RenderPresent(ren);
}

void sdl_release()  {
    SDL_DestroyTexture(tex);
    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(window);
    if(font != NULL)
        TTF_CloseFont(font);
    TTF_Quit();
}

void sdl_quit() {
    SDL_Quit();
}