From e9db416cf02c8e98d098252c537e2d9a07a918a9 Mon Sep 17 00:00:00 2001 From: odweta Date: Sun, 4 Oct 2026 10:29:43 +0200 Subject: [PATCH] add comments and clear_framebuffer --- Makefile | 3 +++ build/main | Bin 16688 -> 0 bytes src/main.c | 61 +++++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 55 insertions(+), 9 deletions(-) delete mode 100755 build/main diff --git a/Makefile b/Makefile index fd105d5..2f4123c 100644 --- a/Makefile +++ b/Makefile @@ -10,4 +10,7 @@ build: $(SRC) run: build $(OUT) +clean: + rm $(OUT) + .PHONY: build run \ No newline at end of file diff --git a/build/main b/build/main deleted file mode 100755 index 14b1fc6860a8fd83dcb50b6df0ca7f9e88ffc1f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16688 zcmeHOeQ;FO6~CJVj0#DR4-r3DDL5cz2?0{Drff(yJX(+lN!6L^bCZ1`TQM)hD9VhMdBRDMvte{gx>>n-DPCJp&&TeTfP;_FeY|pv(oVRZu z`rMclMooe&^%fciw#;_q}uP4{UBN^LPZ8a`AbAoc}U~_(>37M-?D`u~y84 z?Lu*lm=1h}#FX5x2uM{qURFpe2`>kVcJr}PgkGg!!IXQ56z$x~$R$d`RMaRQ?WSRs zcqg5SI|79%%dPgjQY?gnK8*@cnA+{oWnHZli@L@_I!SSolPMieu_6-gY*@V_5~_`aqp7~yzO@at4Xb_0n6F+ojQ#S$ zAIH?jn>+AuOdv*K6lDX7XMZT0LvqwV`orgM{NSZ$kIw#y*jcqGc*8@Xsy(QK{YD$q z!GiwykTX9QDySpl;rSXK_(h1#Lj@>r8%KM;a{ssQTX$xNPah?)Z6~2lr??FjqSFO0 zg9eM~|JFtSRTn(vg8$3~Z*{>NT>A5Zi+uI3 ziS{kckyzAd4|YZjq3b((V^KY61{0>PE7hWk+gmp4Ek@Ez#QNKfJ~Ndt1VWplVN+I` z6GqT9wi!`uC?O$IFTgtDAyBh>P~zrTyk8n^G|WIE5mO%8Vv$JT9wVxnP?~KCBgx1u zDQcaXx-}dP#db+Q-E0XR&7#oN#z1UP!)1*pDB194;^AVu<+Eg7C$7 zC3+lqEPOxXapI-%w3hByj8D=?7eSqNRZ8!&;T%I0^w@B|_9Gs*;dou=(r3fv^9TtB zY`DCx6aJ75$3AfxvEdw3ls#d?=}}0UjN0%^*$L2nHhhK+AG6^wFsw3e!>cS5Zhkhr z+J?Vo!+ETs_?QhZc3-i%C{;@lC`F(Yfl>ti3laEx^)>&{2LDp24NZGzg%H|<6J}ZN zm^S#!%2#A-xiyOb&MjFC+vm__1eLya?NvCd;6R@2OQLrgUZ~biZk2e_#9|#1hGgh@6ZMt zPvDG6OTTB%(1seP1D;t12R0LeqkVYVT;M%-fUVU&+Glrx5Gx&Em)`wxIyIHFGm5fsZ}M(i7V7j0ds*+VI?WprxU}*>uIMkvm>tb2!)HA#JE)$x_*k zz|_i#m%UKUY=>Sz1nM%^Lq$s;f}I)w2iow=APiS6eN;;y83#p?34_A8Jms!~6YX%| zSx?h`6f}*$2HX995WR%_0o*{K8>Ib_%-x@$u+H*k^N|K9adqc^w0a#? zR>OaQMveqVVJl89KN8q0EAxl8>>Ub>z9e!&q>qBpN8oHQu-7xVd++Q$Ck6wfP#c}S z=dF{yLxG7#oGzp);BY|90~6SYAN)T!kvaj5j_=1eMKCDdxSkITC~UR$s7uyUicBfWHXv=NK=3zc51AdY2?G z!A~LH)bNKBSUjdB#EtiV} z9X*xHJpptK=or$|x!i3)pFESx;gsh%&6D-tMObpKNRZVNv{4Z2rx~pr3jQFP>Mh)0;LF)B2bFJ|1<)e=frtUIAy@nO%>)bw+ahY&A|^@BIYG}+|KNLxEc1!l zbFdI1GvTLv9nO6kAbXtuVBy>(&ZVlMq%FqRQir+U$Ca7j+%9ha8p2r*K48fGgXSaz zpQI!|MULUi9LuF8OwS~Lh~ys;&-+2{KQ&_IWjj39(ed^ZZ6kUY(Kyioq9a5{iH;GS zAbO1GB+*kuA!$>V8lql%QkxFbmn?GPVz;HwDd z^AlKEHo?{dXVX%@;%WGb4vEjR&Mzeu;y$RLe?H$Ce@N=jwelYse;z8u`tP=1FG@di z#1q%DhdeFj=jT#9+sc<`?YE%ffec3HIK=bIBj#J@E$hDz6-UUF2m(?Jcgsg!?4n=m zg0Ba>MqD9k{M-{od*OoO1zb4rR?we?J@P8O3PnT*;KlkG23)?VAw4D!Nd5EkozsBN zD!W4PxMzLLZ!PA3FZo$U$)$8T6fe5yA4I$iPDW13rv{F==)dcNpLW5^A#TO`Il~3N zTjDj=x*qus4El7Hi~eU3FN3=mUuUTQjV}6|0mpdO_(_q-ZHO1iE8ht?jtAk;@00if z;a|!}Tshhec(MI`g!H`*Ki>h|t4s^F`(6C}%0>ToF8Eo%alicBZiX&s+q)9xN?!~z zyn~%#-3;y!03=O#f$HlL`8;~v?A5z4lRgQWp_slS66*{`^pF`#B=umbPjtn4;}OF& zLXZt!R0Ffe!+J202=?oc(w^uS-T10j52bp0`@zJ<>7Z#AsA5h!^heiQw>51E=z*JC zFn?c%RVR8tBT#GECiIruZ*JPMsafb7H*ek0v{~QU+PXc^uD3UB*c{O9iTdXy#}{Po z+us^XD=YcFFfU&>Aj3ZhD+#tj@_Z;9)l*3$WN*guT9`ra=QMfDh?fcX5VK@V?+Hdj zuuuVCJLi`J#8ajo5BC`nyJIVtAHxcva3t_s4M6ridMj9IaQ?akYh{CdC4qC9faPkW}vpCVPZ0)E|W=6g3k{a*vTnhGWqJMh98Khy>AqYVn9Ee0VMhA5?uiVpK^Q zUBYL=!W7|?N8gu-$zkX-dgwIj34u4}ln-@2DGRPcQ^DRaI8){jdEtW-xfhq5d^!c^ z2XIS(XA@PN>nC}BKw_!Ob)=txKRz0>z1uoL)WyQj;ffQY0V;NT=Xyc>o?Am(`<#MDoXIr~qr7={YQ zl>L{dWjm&r+Gp>-pB`$M{(>GO z*ah1$|FXm0dcLIROzZsu893wjD%tb#7hX~%isQpx`1mpQCRDKhY(L^v5~epP*4jGT z|2;_T_Q$+RmFXLnrK&jFe-Gd)_;Z-}y$P@Hb?P(E^fcI3+wA$h%Gz20p|GCf@;u|8 zfB?rXx6kt~Ua!r8!SfFb+wpPyK47^2mOV`*{3}pfhzYsPZ`hvcbTGEt3qR@BDa!4z z2exB=1{fp8?R))7QbYD$evTyrFHt75sC`mrSg<{X(ZaE>SnQO?j*_UYpZiZQu&xFe sPYv!rUw`oZ0ry>5s%;xCgv8= WIDTH || y < 0 || y >= HEIGHT) { + fprintf(stderr, "CRITICAL: attempted buffer overflow in put_pixel\n" + "at x = %d, y = %d", x, y); + return; + } + framebuffer[WIDTH * y + x] = color; } -int main() { - if (SDL_Init(SDL_INIT_VIDEO) != 0) { - fprintf(stderr, "SDL_Init failed! %s\n", SDL_GetError()); - return EXIT_FAILURE; +// fill the entire framebuffer with a given color +void clear_framebuffer(uint32_t color) { + for (int i = 0; i < WIDTH * HEIGHT; i++) { + framebuffer[i] = color; } +} +int main() { SDL_Window *window; SDL_Renderer *renderer; SDL_Texture *texture; SDL_Event event; bool is_running = true; + const double target_frame = 1.0 / 60.0; + + if (SDL_Init(SDL_INIT_VIDEO) != 0) { + fprintf(stderr, "SDL_Init failed! %s\n", SDL_GetError()); + return EXIT_FAILURE; + } + window = SDL_CreateWindow( "SDL Framebuffer", 0, 0, WIDTH, HEIGHT, 0 @@ -57,24 +73,51 @@ int main() { return EXIT_FAILURE; } - for (int i = 0; i < 20; i++) { - for (int j = 0; j < 20; j++) { - put_pixel(i, j, 0x00FF00); - } - } + bool left = true; while (is_running) { + uint64_t start = SDL_GetPerformanceCounter(); + while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { is_running = false; } } + // draw alternating green squares + if (left) { + clear_framebuffer(0x000000); + for (int i = 0; i < 20; i++) { + for (int j = 0; j < 20; j++) { + put_pixel(i, j, 0x00FF00); + } + } + left = false; + } else { + clear_framebuffer(0x000000); + for (int i = 20; i < 40; i++) { + for (int j = 20; j < 40; j++) { + put_pixel(i, j, 0x00FFFF); + } + } + left = true; + } + SDL_Delay(100); + SDL_UpdateTexture(texture, NULL, framebuffer, WIDTH * sizeof(uint32_t)); SDL_RenderClear(renderer); SDL_RenderCopy(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer); + + uint64_t end = SDL_GetPerformanceCounter(); + + double elapsed = (double)(end - start) / (double)SDL_GetPerformanceFrequency(); + + // cap the framerate at '1.0/target_frame' fps + if (elapsed < target_frame) { + SDL_Delay((target_frame - elapsed) * 1000); + } } SDL_DestroyTexture(texture);