From 2134365ad0dbc47360f79d732057fcb753cff18a Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sun, 6 Aug 2023 21:22:15 +0100 Subject: [PATCH] Custom pixel buffer --- build | 3 ++ main.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100755 build create mode 100644 main.c diff --git a/build b/build new file mode 100755 index 0000000..d47f09f --- /dev/null +++ b/build @@ -0,0 +1,3 @@ +#!/bin/bash + +clang -g -Og -lSDL2 main.c -o main diff --git a/main.c b/main.c new file mode 100644 index 0000000..10dc424 --- /dev/null +++ b/main.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define WINDOW_WIDTH 800 +#define WINDOW_HEIGHT 600 + +#define SURFACE_WIDTH 780 +#define SURFACE_HEIGHT 580 + +#define RMASK 0xff000000 +#define GMASK 0x00ff0000 +#define BMASK 0x0000ff00 +#define AMASK 0x000000ff + +#define WHITE 0xff + +typedef struct { + uint32_t x; + uint32_t y; +} coord_t; + +coord_t coord_from_index(uint32_t index, uint32_t w); + +int main(void) { + SDL_Init(SDL_INIT_EVERYTHING); + + 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_Surface *surface = SDL_CreateRGBSurface(0, SURFACE_WIDTH, SURFACE_HEIGHT, + 32, RMASK, GMASK, BMASK, AMASK); + + uint64_t length = surface->h * surface->pitch; + + uint32_t pixels[length]; + memset(pixels, 0, length); + + coord_t coord = {0}; + + uint8_t x = 0; + uint8_t y = 0; + uint32_t c = 0; + + for (uint64_t i = 0; i < length; ++i) { + coord = coord_from_index(i, surface->w); + + x = ((float)coord.x / surface->w) * WHITE; + y = ((float)coord.y / surface->h) * WHITE; + + // clang-format off + c = (((uint32_t)x) << surface->format->Rshift) | + (((uint32_t)y) << surface->format->Gshift) | + AMASK; + // clang-format on + + pixels[i] = c; + } + + SDL_LockSurface(surface); + + surface->pixels = (void *)pixels; + + SDL_UnlockSurface(surface); + + SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, surface); + + SDL_Rect dest = { + .w = surface->w, + .h = surface->h, + .x = (WINDOW_WIDTH - surface->w) / 2, + .y = (WINDOW_HEIGHT - surface->h) / 2, + }; + + while (running) { + while (SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_QUIT: + running = false; + break; + } + } + + SDL_SetRenderDrawColor(renderer, 16, 22, 25, 255); + + SDL_RenderClear(renderer); + + SDL_RenderCopy(renderer, texture, NULL, &dest); + + SDL_RenderPresent(renderer); + } + + SDL_DestroyRenderer(renderer); + + SDL_DestroyWindow(window); + + SDL_Quit(); + + return 0; +} + +coord_t coord_from_index(uint32_t index, uint32_t w) { + coord_t out = {0}; + + out.x = index % w; + + out.y = (index - (index % w)) / w; + + return out; +}