123 lines
2.8 KiB
C
123 lines
2.8 KiB
C
#include "app.h"
|
|
#include "app_ressources.h"
|
|
#include <SDL2/SDL.h>
|
|
#include <SDL2/SDL_blendmode.h>
|
|
#include <SDL2/SDL_error.h>
|
|
#include <SDL2/SDL_pixels.h>
|
|
#include <SDL2/SDL_render.h>
|
|
#include <SDL2/SDL_stdinc.h>
|
|
#include <SDL2/SDL_surface.h>
|
|
#include <SDL2/SDL_ttf.h>
|
|
#include <SDL2/SDL_video.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
const Theme defaultTheme = {
|
|
.foreground = { 0xfb, 0xf1, 0xc7, 0xff },
|
|
.background = { 0x28, 0x28, 0x28, 0xff },
|
|
.linenumber = { 0x7c, 0x6f, 0x64, 0xff },
|
|
};
|
|
|
|
TextSize text_size(const char* text, void* font)
|
|
{
|
|
int w, h;
|
|
TTF_SizeText(font, text, &w, &h);
|
|
return (TextSize) { w, h };
|
|
}
|
|
|
|
void render_text(
|
|
SDL_Renderer* renderer, const char* text, TTF_Font* font, int x, int y,
|
|
SDL_Color fg, SDL_Color bg)
|
|
{
|
|
|
|
SDL_Surface* surface = TTF_RenderUTF8_Shaded(font, text, fg, bg);
|
|
|
|
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
|
|
|
|
TextSize size = text_size(text, font);
|
|
SDL_RenderCopy(
|
|
renderer,
|
|
texture,
|
|
nullptr,
|
|
&(SDL_Rect) { x, y, size.width, size.height });
|
|
|
|
SDL_DestroyTexture(texture);
|
|
SDL_FreeSurface(surface);
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
App app_instance;
|
|
App* app = &app_instance;
|
|
app_init(app);
|
|
|
|
for (int i = 1; i < argc; ++i) {
|
|
app_open_file(app, argv[i]);
|
|
}
|
|
app_prepare(app);
|
|
|
|
SDL_Init(SDL_INIT_VIDEO);
|
|
TTF_Init();
|
|
|
|
app_ressources_load(app);
|
|
|
|
SDL_Window* window = SDL_CreateWindow(
|
|
"fed",
|
|
SDL_WINDOWPOS_CENTERED,
|
|
SDL_WINDOWPOS_CENTERED,
|
|
1000,
|
|
1000,
|
|
SDL_WINDOW_RESIZABLE);
|
|
|
|
SDL_Renderer* renderer = SDL_CreateRenderer(window, 0, 0);
|
|
// SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_ADD);
|
|
|
|
uint64_t before = SDL_GetTicks64();
|
|
|
|
while (true) {
|
|
uint64_t now = SDL_GetTicks64();
|
|
uint64_t delta = now - before;
|
|
(void)delta;
|
|
|
|
SDL_Event event;
|
|
while (SDL_PollEvent(&event)) {
|
|
switch (event.type) {
|
|
case SDL_QUIT:
|
|
goto exit_game;
|
|
case SDL_KEYDOWN: {
|
|
switch (event.key.keysym.sym) {
|
|
case SDLK_ESCAPE:
|
|
goto exit_game;
|
|
}
|
|
}
|
|
default:
|
|
app_handle_keydown(app, event.key.keysym.sym);
|
|
}
|
|
}
|
|
|
|
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
|
|
SDL_RenderClear(renderer);
|
|
|
|
app_render(app, renderer);
|
|
|
|
SDL_RenderPresent(renderer);
|
|
SDL_Delay(16);
|
|
|
|
before = now;
|
|
}
|
|
|
|
exit_game:;
|
|
printf("exitting...\n");
|
|
|
|
app_ressources_unload(app);
|
|
|
|
SDL_DestroyRenderer(renderer);
|
|
SDL_DestroyWindow(window);
|
|
|
|
TTF_Quit();
|
|
SDL_Quit();
|
|
|
|
app_deinit(app);
|
|
}
|