From 5e0fe7c6d999a128ffec0a8a3eb3bbbfbf8bebeb Mon Sep 17 00:00:00 2001 From: Adolfo Reyna Date: Tue, 13 Jan 2026 10:55:21 -0500 Subject: [PATCH] add more low level drawing functions --- app | Bin 93264 -> 93872 bytes low_level_render.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++- low_level_render.h | 13 +++++++++++ main.cpp | 16 +++++++++++++- 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/app b/app index 9862d75c93a3bf70d1fc9f54003268be2181039a..22b3dc50769e7bd3275c3177fa1cfcb3db84faae 100755 GIT binary patch delta 13474 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≫$@9NdkYorJ@Q%r(rLnYS{3%}h5z($7RB$(}CQ#9NrFm_KK>xmgg6 z(2&7UTo=jUZe|Pf^URIRXPLJ!Czv#Qy2+D$CG*gJ8o$K6nEABEHnENc##GJ00p?of z%giq_(?vF|TA^h>?^1LFRXvFEdAAAXKl%1)JK#V|$TogTTasVDy|6rZBH%wliO2#?9R8 zpadf!eSA3b^3%*F+}NpsE6mx2?HD3SyE1WxsTW!}P^fSl?> zhiUaQm`%)Qn8z^BMo#)wzIq!AwzFVPmZorw`CVrEoJ$?Z8?M!_WPXadojEdFt1p3^ z^rtefXWq%&$!yCTp&2Bhf(%wNk70g;xrF(@ndt*J>EAh0v){q|81rG~Pnj<=hm6wn zd%zFuZDJ-1ax{T>mU%t%FU<7Go*Hb((HwL#f5^NX4N-kqu2z4Dxs17m`Aud${Nf8( zA%bqv3%y;52Z!PJ6^8VPDEjkD7=ZnCX!d@q^6MnV(=Tt+Z(hFSB4VE4Rje zGd<%Xew>+}brJ6-4#xGJe^{tM7J-U(UPCx&y==?jMf4{Yti)<12M3u8CTsi+bIWv% z^Pxlz$K0y%66Q|q4zhoOc{#Ql@nPo3*&1Kc*e3R2v5`U&x=0RN&~xG<=ELluk$En! z@@JX5?$Pv5Fb}k99H7(uwNBG`6tkgN<85BX{Ga9#{GAn!V0BXm@MOZ&*ke`BzJslgIfxWZHL0CNvEa5C@XgXFJ1 zeXei!vRxeGv%MgY8pMqVlTH42F`vep5^;18_CF~U^wR`$At0WfqVay_foU4Y7_@qN zI!g|gGSgF9;=eQFd54#iu>i>*9#MLEmX{-;sc~&E_J0J72+6?;QUGtgMdOEk%&T|@ zaR9DP^E3y$nU7a#{3dhMLXAIWzGIQbr+xNy8h;av`6q|RmuP~kJ_n5&>y29d9m_OM zV0J9mIGy?U3XMlHN3GI$g3li9&;Y0T>{n|%%SHm!_fzVnsIx^vewY4({p3A9v%gyYY`2`x+D>VP1dCn3oJqaHEHly72;yv75Emx^Dbb zH-4)df8C9*`ZL-WA>rO0-Dn`G8{;>M6oDJ{)4TD!Zd}`qmv-Yv{g~Pp&-w|7>B|xS z2H)5C#-cpmt^Sv8^@pe`1v4dt^)=aAZw;vh?Kdiu%4 zv@{g^BH>5&qCXOTmM_dm8AzE(1EllmzB1W{pGOLOsVst!@B;-AjATR#LF$A{{8&xk zXR0C;DGbTG){*0vZXz6s4hQOP6cTlrewy#=9(AV|Qan-;Qg5VWq!gr7Bn-P;m{6e3 z_Cfl;JN&=LqYeG?k3&!RNkY5LetezkNGENA)ME$WNzTXQj;P= z@gElbZL@K-cwe$?@nUhbF@E$>wJf7-Rm*}WuRZbPmswjHlu=bt_uJRLZpkY@@^^*i0FT%<<>_w6hCwS!{hVLxNMuZ4G(@;Jn~;ZCFUOfZrSU{QZEdAeZbcL z3~ikA;v-+3pFhU7?1N>eetGM*IV*<#e9z=@%PeV!78Zvihu+sxpH*ct(e|1&q*EwT8+Vn=l>}%&fI{*H`&tKbBbKAb{yT41CT{C3R znmHC*+^cieq`r4)(j;e7)Gc#HKJoFfU(`t<|E6x(^54IF-g!N2QR8&zjus|MtM{}&~?p!dXHS99+-PWmA2!2z=T z@WBo7<5ymt^w6M{n>K!1Rx66By9Wndb|K7YNBvaX+ aJ@wCbU;dAeu09+xdBV@f)xW&;!v6r$rg6>y delta 12072 zcmZ{q3w%>W*1*r)Jes7h^hs&y8%kRW@+i>CD^x&`@@jdMXIo04g+fbP5EMudL_|=s z7Y$;CDy&qN-48ab5@AIUR#0S-MeOp>6uN7Q>{=9EA|T&6xhFN7&o95q9F|Iov}%srR}77UQboLq zEa-zQ$+xv}a-&EJUo}^$9pIZxd;w0*-{qsft)we|wd5|L&K z6CS$^v^8R)w&+8{Acjf-6IJpX8}j7zfZ)!m#LrweI$K@E;CA&3v%1Q_-L_6+ZCfCZ z4@gL1HWV zsVxQfq7-xIZll#X4cu|4cYT`4?flSaO$Ioh+^)A?_UfqQe+Q(5j8Z8kF7)13CMW3P z%w=KL8)(o9mV$q%jMlfk1}K|=+T@%Xa_$bbijqwiTA=Z}$?V0c3blUZ)yJ~8a}FPw z4*d!N;qQ56>kQTw)ZN2ucA)^0!77Zs5|T_w2`_mSQw`R&09$b+RtZPF4oCe(AdgsO zu)fH84R z{cuOR2Ksvq)^a0V(McQDCzT4fOC|QD|5xFw_Ig1|7hyatYw*kIdOlba^^`fGBuA*Cf6R#xxvlzSmgOacN$^p)p%sQK&o(l{oaZrnc(RaX|gR;TkBg(`xI+Fk<0wmc?3~so?%2bw1VP_C(KYS6iFN;1N{bt+rM~ zV0joC_YjUIQXFP-w4rhmg-uplpU<=uv~@?_b!w|CRXBEeol&If)Yj1%XrGAnWmu-j z4nkjX!tt_Kk0MowwxridILy}{Q(Mz9tgeBm7$F=lkYYb>l)}^xl|#{CD(2)cP&l3; zoq?=#9Caep){HdlSODs&P){WsD@kV%>$ITG_bTfd(s@YpuCluBfulx%`Iiw2fpe|0 zK94Vew*Sz4qtf@_SU`@vQAkD|yUJSG9d*8?IYymtz%hq(FiNgn;2te37hJo+-LeZG zjk{^jYpms1PtO6`S}n-lXW+(11^b+x@R5s; zUym+6cD=fv{)$d)%U2f1N54|x`bv(COf*y1$OR74flqG#qeBEPIe!@~$7AR*h?XOE z?~hn+p>E+}>6?zYYOL>|oSry`FjtcNd~O5RGUgjnrdw@+vYZ>N4^iu1@ldsD$}?w8ywR9;y=^_8{!M34MzK%_-G;RFv`ml z3Z?S~`ICfG+9y$Up;3M%@f|Tz9+wo`zdgC#n&c+QA82aZAB zZ5C*9zl+ZX`Fv86d^9OLs13o1og0n8mhUI!NH;^}0m(xR_dIfZ$ArpjlB3o4$;Oz~ zSw5Kji253VDKkbc>1>pPQU*)!g~}n>v9dE>Z(p49nk0P}A{)B>r2Y&a9v;12C@|)d9NjHM+H@inm((GV)PW%8lC$mvn5iDQM^bGTn9tXt$xuwUG>S6eZ z@@Xl^zBQ{=NZW$s<-Hb)ZuXX5ags3DAM_q5Npk}21Nzmf#c=uUfk)K21~#KhLq+GJy=F7mwGZi&Niqv0aNpt)VR0Mezq18KtAR47B1vj%6! z^z;fMOpXjaZmHG!xHhWXHn>5yq(#a#IF8w4jdJ;rm&7Lf4?|?F_=kLLM1mo(scue= z3Lgenlg96sq@h2_KTb@O zvVW2jCZ$L{ev%HJ00#Tj{RQ395_$cu`C19GHxGVoWGunP@hEYhmyY`=Fek_S8_A_&qsLbug9k@-T#7n(#)fpf4DQkVo2A^_> zPdVJD9PLw%^(l|{DHr&Z6R2$FhEsehruvkJ`jqp0%4t63OrLTupK@QH@&KRmD4(+V z2_Kl@Q=a2fp6gRy=u`gKr+m(*e8H!D$)|kTr~IW-HhRKd`%8uWWSK!sZjXb}ShJ!l z77hsGVKtl-C1=%eSTf#G!&ynUQ3K6Vc7q1CtG0^+8aSZ7id$u~_K+UoWat5vD+ca{ zAJX2BfvcS>NET~PDIX{7tLIONH=`h9r>EkJDWb zK&wXpKsP@0A@=={4qfvc=nPPTd1D+vJ?2Gt4YCpQ-iZL)F*l}w8Je)LKNa9G=0V*6 zPLo0!HiUV7I)DrFqj;Zk7xP=#L)~0--U~a8dDlMJY0OLd0Sv~x5$|pCG0z_WFbngl zftWDIXFdeMV)#JNFmX^J0H#n7^Fs0R$Y=!3DkBQQK-7l;G-2+fJRC%GI7kinIzAl< zk|hd6LlnRr%yrS&U^ECzG)Pym+`AKq5uLD+7*Gw40WmQKv_&x>9mNZ$6|o>T$Kn8E zL3JO?IdLFu#E4An0;0r>vEPP;i(NpP7>_-|5N*YL59ZkkAk`;;swn|Omk3f&5{Owz z7(&b&FmFf(scQ-dQwok8^VSrQOc=>+sUVs#Ka05&^O|m;I)sspOan>X9U#3sNb@ki z-yKxu-WcM^=^!dF&&t3CFw_`saVrB<`I$KSOdM$zh>ckweSqO_#d0=2d7FBIINcMZ z7@P`cFA(jRcYOpS_y|btn5%ISZR-uv#onNb!D*V+2gIsAplav~kTeujvxWkUcpUnO zipOy=jD`Rhha;N;s>4$Na;AbfI~7BXxehNGEz>~Y3{A$BDcLt~cq-R^U_-0QuKnQL zn9z4|E^$U1ngsrBKVZ9|7sc^vxc?&Y#vKBea(Pu%WldfA$V&Xog<4xfx)@fzLJfD; zlg{Zs2wWhymZ4%eXgfcKC5sD;`y+ zr`+l(w~;~F;_~AD#nsE|X+G<~8vIm!d07S6g3(PIk7P9N2`4?GMSSGlBe@v_D6Y;fU}i6aX}jCmYh2rh-! zgUf15%NCW_*1_T6iqgtO%i#Usx~l5>3OE`3)Cycf@NuvTnu7r}#jrDIZe@M(+-39U zE}vkBh-I40Q6T*Z8rxsmxk^Ht`lp^Cp4d|QzHCT4t#c=$N;JcZ4m z!UrC8U@I#`GaqGsg4xBqn0Ye3hNuAxvxWH-^L}OnzT(J#48EdBe-U%Khw;7mAq(5pTk;|cNe%tiQ4_MD3zu%I3Vq=5fv@i=H? z-okvA`LE1Q=0O;0PlNa}C;Pq3In3?MbS|R$EQ}QCABx9w5ee#9aGDkFFzfI{K=lJL z5@gVYc@A?G^JZoX^B(4{%-5J(nL{yBo(?Bs{HcKhY}Q;S%Oc%w{JGLNGLBkd6l_ayXeehxtwBD&{YlH#0|LB*=b0b18Fr zSH<66<_hME3Y%dS3$!?La&UloA+wA5x6E{QrVjp{IiFdNBPV+ca~ZQ5&)B5@GIJ~Q zMGu=TaGwQX7zuLF1&@qmFo8Lnc`b7Z^Iw_knHS*5$^H=Y`^!CQrdtp!gVCM78CCojsBV^ye{5o?NJWo@Heq7z_Oy7UVAQBxBU&Vts@oUWVy@>ce^I+y@(T?=%nS;@ecsuhr=8Mc*dYTml-6M*_ zW>&~z4o5|DU}8SVyqP%~bE>Cr0o0)h%rVT(%-PJ-Fem*IZ@rlX_!YwAV0s@#;Ux3> z%=8VA8W@6KE671T^Q+8PnS=T%_4z0#{V~iI=GU3qnaxA86@y5uAcGam+05@U=QDrD zOkYJwzo5Tjzn%F-=A+CXGq*Aa3{dog&=1<1VG;{^D+1WbY+?QnGkxc!2CD}u4%(SN zWUj%6s9v9=)E{P^&3u~K!F=DtIRC0##h@!TL=MI<)0b=FJ?=oLy&UsX^H)2Of zzlnJ?^S8|OC7tT~3{v#34nxNFp@;={M<@!{n7fQuIBBqA&|IkSV&>k{6+Xc{nK^uj zq8~I%sUOQ+!n~S!E3)VP{}v05vVxo0I9qWrX{h2boB059KC=-=LW{D7xr%u+^Eu`{ z%*iH2|Lkmj|4(3nlNI(eXU|bO5IS5jC}MsB8NW?ErmpB6J1M-v(-erzurb`{F@5S83 z%z``?&@B%sOl79q9^!?}bn8RBhM8`Eh=0ROw?M=arcf+&nXE8AC_P+Lr0~nk=2ed? zf)7}r8>es=G$sf2=$IVhzmq&XdYZz^m~Y|grusLTbtZ++GdJ*}{Fym>s#4zzdx-wc zFmI+JC{+XyGge`l*~GixM`q(=N_`KUf9fC%R=AjX5A(~+MWdAZv&`8e71pZB9_PPi zf+FbY5#V(cJ|M_%5pzB6cVaX1WUk-C+|K*@1oM7or-vl#5fA?uh`yVzBfBUg1>cd&?E>%RFeM!b83GPb>U{9_QcF zfz^s&DkbiOjj{o!$kWx0#hWWC`{3qI$?^z)EQG8rg%&Vm=ZB1VM@l7f+-bK zS4`ibAM9Q1uk;S!9#-DBUF#+~CD15-#`F*q{-_1;w=m$w@=ur^fbIP>ykj+{31e~? zR)k~n?@%ntC>)(_v(rS}NdJEPe`EI_vk~2R$DCwq$q+HNgWbh8TUEL^WZRh`w6>KQ z!t!ovrg%xbd!vU~B5WF+=x#e#BtqY<(2Aj|cklET;~%xnStN3_m5?Ms5dI`M%{*-z zc8)%xw5A5qBO3F}uZJG{wC5ag?m6+okESxp zcz)G+V`=E6oZB%6JO7Y${NUkG%e9ef_nrUqg<~U!>Rx&4%jd5DW!cGhj9DUmOVZes zr$0B8FTKBeOYdd9i)zg}s5(0~8r--KRiTBX2e^8Ti;ofcw-g> z_6Yj&_U9+JjQ&*p@~|Z5h_LuS+yC@+)emNA_nO=P>@l$0!_vZX^%VO{Yib8;O7A56 z@Mg{9XHyNEHmg=13h8X9TY75di!p~!Zmj<14;df5{^7CI&cWCB9_lrJz=mh*hMl-) z&D{A$|B}|o_h&>Muc^&XTr_6V+s976Rjey~ZSAnH)}Og`xVmJ^Pn+iM{5q^wcV= clip_x && x < clip_x + clip_width && + y >= clip_y && y < clip_y + clip_height); +} + +// Buffer operations +void LowLevelRenderer::invert_buffer() { + int buffer_size = (V_WIDTH * V_HEIGHT + 7) / 8; // Round up for bit buffer size + for (int i = 0; i < buffer_size; ++i) { + bit_buffer[i] = ~bit_buffer[i]; // Bitwise NOT to invert all bits + } +} + +void LowLevelRenderer::clear_buffer() { + int buffer_size = (V_WIDTH * V_HEIGHT + 7) / 8; + for (int i = 0; i < buffer_size; ++i) { + bit_buffer[i] = 0; + } +} + void LowLevelRenderer::set_pixel(int x, int y, bool on) { if (x < 0 || x >= V_WIDTH || y < 0 || y >= V_HEIGHT) return; + + // Check clipping + if (!is_point_in_clip_rect(x, y)) + return; + int bit_pos = y * V_WIDTH + x; if (on) bit_buffer[bit_pos / 8] |= (1 << (7 - (bit_pos % 8))); diff --git a/low_level_render.h b/low_level_render.h index 6cb19ab..8331425 100644 --- a/low_level_render.h +++ b/low_level_render.h @@ -33,9 +33,12 @@ private: int V_WIDTH; int V_HEIGHT; const unsigned char (*current_font)[96][6]; + bool clipping_enabled; + int clip_x, clip_y, clip_width, clip_height; void draw_corner_arc(int center_x, int center_y, int radius, int quadrant, bool on); void fill_bottom_flat_triangle(int x1, int y1, int x2, int y2, int x3, int y3, bool on); void fill_top_flat_triangle(int x1, int y1, int x2, int y2, int x3, int y3, bool on); + bool is_point_in_clip_rect(int x, int y); public: LowLevelRenderer(uint8_t* buffer, int width, int height); @@ -56,6 +59,16 @@ public: void draw_polygon(const std::vector>& points, bool on); void draw_filled_polygon(const std::vector>& points, bool on); void draw_arc(int center_x, int center_y, int radius, int start_angle, int end_angle, bool on); + + // Clipping functions + void set_clip_rect(int x, int y, int width, int height); + void reset_clip_rect(); + bool is_clipping_enabled() const; + + // Buffer operations + void invert_buffer(); + void clear_buffer(); + void draw_circle(int x, int y, int radius, bool on); void draw_filled_circle(int x, int y, int radius, bool on); void draw_char_vcol(int x, int y, char c); diff --git a/main.cpp b/main.cpp index 7b4e961..40345a1 100644 --- a/main.cpp +++ b/main.cpp @@ -36,6 +36,7 @@ int main() sf::Clock clock; bool toggle = false; + bool inverted = false; while (window.isOpen()) { @@ -87,6 +88,14 @@ int main() { clock.restart(); toggle = !toggle; // Change something every half second + + // Invert display every 4 seconds (8 cycles) + static int cycle_count = 0; + cycle_count++; + if (cycle_count % 8 == 0) { + renderer.invert_buffer(); + inverted = !inverted; + } // Clear buffer for (int i = 0; i < sizeof(bit_buffer); i++) @@ -131,9 +140,14 @@ int main() renderer.draw_line(10, 200, 90, 250, true); renderer.draw_line(110, 200, 190, 250, true); + // Demonstrate clipping - draw a circle that gets clipped + renderer.set_clip_rect(300, 200, 80, 60); // Small rectangle in bottom-right + renderer.draw_filled_circle(340, 230, 40, true); // Circle that extends outside clip rect + renderer.reset_clip_rect(); // Reset to full screen + // Text with different fonts renderer.set_font(&font_acme_5_outlines); - renderer.draw_string_scaled(10, 10, "Drawing Demo", 2); + renderer.draw_string_scaled(10, 10, inverted ? "INVERTED MODE" : "Drawing Demo", 2); renderer.set_font(&font_5x5); renderer.draw_string_scaled(10, 270, command_buffer, 1);