From 076e8d2e896fbb687afa90f8be5876161b121334 Mon Sep 17 00:00:00 2001 From: Annika Date: Sun, 5 Jul 2026 06:11:54 -0700 Subject: [PATCH] generalized bresenham LUT generation method --- libwaymini.a | Bin 23038 -> 22878 bytes test | Bin 41176 -> 37080 bytes test.cpp | 158 ++++++++++++++++++++++-------------- waymini | Bin 36896 -> 36896 bytes waymini.o | Bin 13936 -> 13776 bytes xdg-shell-client-protocol.o | Bin 8448 -> 8448 bytes 6 files changed, 99 insertions(+), 59 deletions(-) diff --git a/libwaymini.a b/libwaymini.a index a5a964ab893fb2a78dffbe4d8d71b78c72b20f20..131cff363df2aa8f50a7b8e229a92ebd4043371e 100644 GIT binary patch delta 5008 zcmZ{odu&tJ9mnsz4#BaLYv<9#Kp+MJgp!9H@}e0|>?Y*8%S74`2uh%=%ThY^k8BGn zT9Iy$6NDAAx;qtPB2puwhlctVk52}H>Y;=NRDpa-GDxmd#=lUG- zjn(|5n{)5ye1DJgyT{kp`6{k{_$xK`LjEd6X_|MOJ)BUr#zyvp=2PAA7qv#!4E6-K z1*3oH={6#F?2&uwzAbIh%SQC>Erl#hr(=oXc4O?5;kEv2NylK!P%jyql0Wnq(c9sP z;pIwO^ro@?@0OaR=4_{MH6qh?n(NyY><{kxmGW^$%l3Y?pvYC$su<(Vmg`u;b+{s4<5;HZ$0<)|^gBkfYS2~I z#zvg0%^UYpDgQNE39a^n^h$!egHK;_m5q>?g5>exZ8!b7z{@lyHgh0~`p2yk9|w!sFbagGFF~jiQiHJ*&*Z9pYQ@1jCrL73j90Fypc5l{s{9y@ z{!fgtlxy^L3*9%yTdd1T_OrY)^9aFoSrfzM?%(i=!_nF3MI-vZLD$`c5xw=9@%q@z zM5rbDCs+8Q)pXbTta9VeH~qhV_ls=fm=QfN?Vk9N>Yqu+8E>Y$ZCL02gfae#RlQ0jb#1lZTkETB@YVV@#ZS9?)SXS_TF(8+_VYg>-94d&bk7l6o9;c771S#t zi`sObw$-6m5DDrYQiODSyHhD5`5xgr$bGlzUhP}D{pWPLpLG}fLiMuy1?$Wqy6&V+ z#BD_u{hB(wr%N-Oic(5x66u`m<-#RT&WijrWf{MH zpMMRr)5n6Fo*opgD;2CzuyPuG?0(@ovscWl5Hl4tJ}+1n?@Um4AJV925nG2&&y9pb z_Yey5_VLKagqELkSm7@ zcc@eG@!}V3IbFheMcldcCH0x1oOBr3kS{4k0eOyOa5vpB&SQehvQ`T|CAe%(gW!oA z_F!4{$}UGbjqK1~F+C)B7W-!Dx!Ms?h3rEK)oLXbTqdm)e99TGTYhwrxk>Ck3aV_N z;{pGOkUa~$68JFiD&Ri>j{0ff>p_1t%}wgHqSU~|4RClA_+7!do6*MWW`aazBk@D^c$&EUXW-N{8{&jPQfYq_$B;F)n=20f3H%Y%?z znA4j|0|6Q6k8>0A_`iVTCb|b47f{VBA>#w;w*XJ;dH>0F!UQ^eA2=o$1&;bj;HZBS zIO^Yf9wyM?ufVZGHx}TZF2KJ6-pI_gC2BQ$b8U&qzqDl6_ld_Emp%skFz{yJuL8%# zoE4n!vu}X@cc2$*EU>!%9ylyzu5~4*58SSS8-Jsb6Z!4(+B8~`Zb`( z7C#1D#4)Y1x*<>t1bP}AFwk?L=iB@M9o+VT9v5~HI4*!?Tc1Y$^`j`QbjTIF3J#d~ zml=us$%orppvT1T0>{LEk#TtbGCE}955WNw-v*9>zLbG7;w)ZFfQ;WVj1vIP zHkd$%0pLM$kos}KdFQ;qkAXe}{0-ob&v7#~0~2j?6RFREv4dg+K=IYv6!^?f_o} z`cD^#W6L2C85U%H{)%8?H3?)vO9baF#e!A>$2XEkAr2PW47?oTx8|h34Xs^@2|B<5 z1N8!51A%r4o>}N^;Ojx}bkGG^7SE6OY{|ok`A<4OaMZsB{3!}3J9irRR^V>|@8&%H z{7a=S!^Adl$P+JZ+zDSTxMfZ(w!&C@@)0_f4g7VQhaOH?KeT&!saNJSH~abOxVtvXecl*x<$o+G|cWP}iWv%GhLGK>N3o z<-3bn^^PKzU0)Y|OiJ1-nQySE|_c#(;JvpOrQR)GpT7)S~vr Vk2hV($@m`yJMCT`KN{Lw@_(V0h(7=T delta 5173 zcmZ{o4{#J$9mjX~@;_lOfk3V#kOQu50wLUmkbvNk(4=h2MK0w}V@;hXnTSOlMuM~h zGY4MyvmW7(4?2#bgThR4=!|Kv3JQb4&`4)$Wk9EnwHT)=($oP*X$u6;-*5N5@XZNt zW_REF{Qm#;ZEiPLU(^4a)DLVa`jw_F9Cy6BXFxX=%@WGDe#szXqG-` zEgIS6v+NIA`g*2mP4+db@{f)YS;U5|1Sv=C8!kzZ?+Bgzq!vj~)EQR%LdA6s5xN}u zh-jML$UDiJjDAlCrD<`R6^-`jFLhGq+=7kvt#hYo!5R4?c28hoi~V-Q-WF(RvEOk$ z*@KjZx3|bc5mH>6TaaaYET<-K?+!6LCt9MBf)(HD)4aX63}@=6=?BS!IUTxLXeAaq z?#R`iXfl;ss@J{YB(cu2xE#y=1D8|5)%v)=U?f4=L=uz=RcH-%S9{BQ$wE}*&+?wU zlS(;e)Wny&4~XaUXZW@f8+p6i)uQ-`38bz4VygIaeo0a2-Lba#uQ#PqDe?3CaM8Wn zsnqpWS}CJrMgiT>9Uq<`%PuRC@n{82EW0=G9lC}Fteq)u?|Tk95;*Ey?^=na4n9Xq z8N;nqRZLed`e#b+G{4(>Da&KTexwY(Vzbou}K@X8aK|m!zd*}0V?j}q5Ck{E4bXjwX zozgb9TRSeCAQywqPE4@kGn#gqT9O*MJl4x`Zq9#F9>1uMyzVVeuh$K8nm5nbT|rcV+Y$ZL}&TwRUOK%{Hq|ztL*u9H;3n7TiJlZqp)MQ4R_hz>CWjr0v-siFQ8=u>iWt=hFmz$lQLfvd{G^555v)wW~jflCv z$=tZid|{cnU2id?-x%sNb5@wqU0KiP4LzA}bmR>+=ab7aI!?$K^J%V`(RlW*ti73i z8PD$X>^HPRVi%`NrMGMf?C)Q1RJk}s3)1`!4xmvO| zZqIVFU+;<=#w&vz+`oQ3ZdilSxY3$7xFUbe;L5n0-5zPfS@GcO5y>!q18joOnN9@(#d@lvj9q8f6K zTu&s+;WS=Ica8Z?$yGYDB-ip>KdL!(lKb;SM``tpekoQRS}(uc$El3_Jdnq%vOm0DPs?DKel%F3OTYy&qw}H+>=X<6S`u2nLW7O(XU{C`FSHJ)}@iFN0)2aeYl3P2ybM=z5SuNXew~*&}V?7 zem8JepZibaMG&CDLEsqRIB?WI3mo--3mo;YEdc=<+yagr^2k3yEUpvY$4X)-oet7^ z(oi=j1iTt}8}Nm|j|2Y{@Uy@dyIlPKv7#83^f#%)yKM>B{tIle(z~F~n?&WDoka^8 zTq*x3DDDORX_v>Gdl&`*CbUv=PACkHJ`4Jo(AR*YpWWbRDfkgt&O`M7kJ0zRfGgWZ z2ag{^0Ick%z%lTz!A}F(t4>@|`WzoCcn=IXa0eYct}6qYW8hoBF>p?{W9IycE~lvq zJW+DKH5@ml1k*u)jzSM{v>5cUfUg5bKYM_Kek^qe1dWjC8OizH`+;8s{bj(f0)GOy zkwXg_TyYZ}s^EabssAj%OczN54%`d|PkZ z0vrSX8v-l`KN-2Spuq*qphNl3m7EKJ z5BOT(e*umO-3CtIa$||=^35T=fN3rlx2q~+$K4l7r;GR-H(09uF)${TOWDk6r7`CP)YvvUiu@1?Ufzs(o<3U!SQ6{fr`m#?}8do1f zuK?#V)p*P0?h8K8)#uVM81PhmF8wEstIwqznE;C&71_VCH13zYX∓H1z@1K2AUh zNrSyh&}pEf6_tW{RPjQDaSkxG=xY2>Qk7{IGGjKzzYFMeJK!EV^rp z)zVyBD1KDy#kJ#QmUCgZa85^s`lKQX_ohY`|hxMD{O#M>*ljPm{OSx(P Pyb$-i(~=)Gt}po?rPs}G diff --git a/test b/test index 10e4bd178a5228dd530239df9722d8c6396837e0..2863064929df8c5c22644ece69fdbe8efe36ffc1 100755 GIT binary patch literal 37080 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⪻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 QAn1K}N#Az3;Q>SH=35hAmQX)$KuBsen?Ztv`x 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 diff --git a/test.cpp b/test.cpp index 6e11d54..bb95089 100644 --- a/test.cpp +++ b/test.cpp @@ -40,10 +40,30 @@ namespace UwU { this->x = x; this->y = y; } + Coord2() {} uint32_t x; uint32_t y; }; - + + // trapezoid datatype (horizontally constrained) + struct Trapezoid { + Trapezoid(uint16_t y0, uint16_t y1, uint16_t xl0, uint16_t xl1, uint16_t xr0, uint16_t xr1) { + this->y0 = y0; + this->y1 = y1; + this->xl0 = xl0; + this->xl1 = xl1; + this->xr0 = xr0; + this->xr1 = xr1; + } + Trapezoid() {} + uint16_t y0; + uint16_t y1; + uint16_t xl0; + uint16_t xl1; + uint16_t xr0; + uint16_t xr1; + }; + class Draw { private: @@ -75,6 +95,66 @@ namespace UwU { this->pixels[i + 3] = 0xff; // A } + void bresenhamLow(int16_t y0, uint16_t x1, int16_t y1, int16_t* LUT) { + int16_t dx = int16_t(x1); + int16_t dy = y1 - y0; + int16_t yi = 1; + if (dy < 0) { + yi = -1; + dy = -dy; + } + int16_t d = (2 * dy) - dx; + int16_t y = y0; + for (uint16_t x = 0; x <= x1; x++) { + LUT[x] = y; + if (d > 0) { + y += yi; + d += (2 * (dy - dx)); + } else { + d += (2 * dy); + } + } + return; + } + + void bresenhamHigh(int16_t y0, uint16_t x1, int16_t y1, int16_t* LUT) { + int16_t dx = (int16_t)x1; + int16_t dy = y1 - y0; + int16_t d = (2 * dx) - dy; + int16_t x = 0; + for (int16_t y = y0; y <= y1; y++) { + LUT[x] = y; + if (d > 0) { + x++; + d += (2 * (dx - dy)); + } else { + d += (2 * dx); + } + } + return; + } + + void bresenham(int16_t y0, uint16_t x1, int16_t y1, int16_t* LUT) { + int16_t dy = y1 - y0; + if (dy == 0) { + // catch hline condition + for (uint16_t i = 0; i <= x1; i++) { + LUT[i] = y0; + } + return; + } + if (abs(y1 - y0) <= x1) { + bresenhamLow(y0, x1, y1, LUT); + } else { + if (y0 > y1) { + bresenhamHigh(y1, x1, y0, LUT); + } else { + bresenhamHigh(y0, x1, y1, LUT); + } + } + return; + } + // plot lines if m <= 1 void lineLow(int32_t x0, int32_t y0, int32_t x1, int32_t y1, Color color) { int32_t dx = x1 - x0; @@ -120,42 +200,6 @@ namespace UwU { } return; } - - // plot gradients' lerp t value if m <= 1 - void gradLow(int32_t x1, uint8_t* gradLut) { - int32_t dx = x1; - int32_t dy = 256; - int32_t d = (2 * dy) - dx; - int32_t y = 0; - for (int32_t x = 0; x < x1; x++) { - gradLut[x] = (uint8_t)y; - if (d > 0) { - y++; - d += (2 * (dy -dx)); - } else { - d += (2 * dy); - } - } - return; - } - - // plot gradients' lerp t value if m >1 - void gradHigh(int32_t x1, uint8_t* gradLut) { - int32_t dx = x1; - int32_t dy = 256; - int32_t d = (2 * dx) - dy; - int32_t x = 0; - for (int32_t y = 0; y < 256; y++) { - gradLut[x] = (uint8_t)y; - if (d > 0) { - x++; - d += (2 * (dx -dy)); - } else { - d += (2 * dx); - } - } - return; - } public: struct waymini* wm; @@ -211,34 +255,24 @@ namespace UwU { } // setup gradient coefficient arrays - int32_t w = x1 - x0; - int32_t h = y1 - y0; - uint8_t xGrad[w]; - uint8_t yGrad[h]; + int32_t w = x1 - x0 + 1; + int32_t h = y1 - y0 + 1; + int16_t xGrad[w]; + int16_t yGrad[h]; - // determine m and calculate horizontal gradient coefficients - if (w < 256) { - this->gradHigh(w, xGrad); - } else { - this->gradLow(w, xGrad); - } - - // determine m and calculate vertical gradient coefficients - if (h < 256) { - this->gradHigh(h, yGrad); - } else { - this->gradLow(h, yGrad); - } + // calculate gradient coefficients + this->bresenham(0, w - 1, 255, xGrad); + this->bresenham(0, h - 1, 255, yGrad); // for each point calculate, alpha blend and print color Color Lmix = Color(); Color Rmix = Color(); Color Xmix = Color(); - for (int32_t y = y0; y < y1; y++) { - Lmix = this->lerpColor(colorUL, colorLL, yGrad[y - y0]); - Rmix = this->lerpColor(colorUR, colorLR, yGrad[y - y0]); - for (int32_t x = x0; x < x1; x++) { - Xmix = this->lerpColor(Lmix, Rmix, xGrad[x - x0]); + for (int32_t y = y0; y <= y1; y++) { + Lmix = this->lerpColor(colorUL, colorLL, (uint8_t)yGrad[y - y0]); + Rmix = this->lerpColor(colorUR, colorLR, (uint8_t)yGrad[y - y0]); + for (int32_t x = x0; x <= x1; x++) { + Xmix = this->lerpColor(Lmix, Rmix, (uint8_t)xGrad[x - x0]); putPixel(x, y, Xmix.r, Xmix.g, Xmix.b, Xmix.a); } } @@ -285,6 +319,12 @@ namespace UwU { } } } + + // Draw a horizontally bounded trapezoid + // coords.y1 >= coords.y0 + void trapezoid (Trapezoid coords, Color color) { + + } }; } diff --git a/waymini b/waymini index 351bb7ab0acb30ba2b51061a2ee7714d7453e8c7..84264c42dd51ce0ebaf5f81cf9f84818acbf0830 100755 GIT binary patch delta 4624 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 delta 4783 zcmZWt4^&iD8h>wKa8Q^TR0PUk(6O*wnE_N3)ER|*vkvP}pqOOr(L5@)v5JLa4L0EV z&M<1-JY~5X9y_ZY*|LQ?{%LUt^UtoDsV6V11Inn?8vR701Wd#B0ME<`NGjndfVx2(mQYLrI?S~t;9|1|e z!}(p2@Y$T)k)F=~VOq(#g@W*1gh4rQO{2N!XAn&8uT7Tx`r8HQ!(F`EZOUlCOoXlw zLOzYlPZ-J$=8hEq#xCThKYVK{L{{gPOTMXZKvj_BE47J|f9mIOrY3I$Nm&HvNAxF{ zC2vxye7_*rgUYEpstO@5lo76>XCZqw@8kQ1+*Q?L`D;nOSZoiae^gZ$#+cU=Qq%R? z9KIg*FMAVA84iJ+o{-{df(ZEDZk}GZ+^6g$3ZEn|84{S_>G8@*Kf~H1B=?_fENE2+Zcu~pY z^jZgK!=O&2%#i3iny4W}9?ZU-XnkM|B1HP_wtFKzVnBcbv)2xs%JD4b#oW}Ah%FL=^f>0H<|7W^gQ zQ%5sH){^1z=k|)^o6foRAUtj(dx5Q6w7J|Fhr`20o8qZY)kgcZkwF{n;iCd=&_M&=VKY{0L5~O`7Zes z6)J~IKCk3c^l}$YgQ+no2KmPbWkv~7EOLy*50a^IJy=*gr3YkfpX0pAome#Qq?~(u zeKyzn0;|5`VN#fBAf>IhC?^F<3C~nDGIib5D3C>8eX3w;yoK_Lt_9t1s4G`{U|o4J z;>&)UyGn#7FmR?Waf|g9c<@$GjC`GcL*B8Kv;fN`RLNAX_yM+H2Q1TZe1}wJ3el^D zxRgTt_B#r(8vQ_*PYm{EO;}{B3l17Wu2!ArV*%xV-AEQJjDddTzhroARWKAz<7i;|y6@;fzo`&5Jl$E66PdrFWROm>!MP#l#)A1lK0t7GEk3W zu+C~$W^%9S@eL?#yyG_+rT) zJ0=SqNp7^h&h@DzHGaiO+pR4e?@0dXoZNw-vi=4|QJ`$o{3xXw(!TqU_%|`;HED^d z@3>3u#_b#MOqV-NW8GG>$#q&fdzHEtDNu_sdN%v<&L88b=a3eiA@tBs75&th#x`3U zU>0*eXAabfb_gU`l_#|zV0)p`$@^Nc_Mqf{mCt0c^vG~Nwbd0~Y5ifEEnayX*fE+U z&qVK;do_1YAI(c+cJ^oZj)}ePcq38HhUV*!;`5!{yH%1kaphUakn!l(7hDp9kN#mV z{IVgA5n^@QD2LJXS5IM#Hy^j_xQnVD}*bEE;w*$`sKLRSi z6TrK`e*(=YI@f?!;9X!oFyY^L2LX-*Rsk!4&A{!zc3|Np)vGG#v|dtGs?3E~RCPD- z+JE2(=>u3?@wS;%8X(bbCpf^D#*epViy_B^Nj`pCrzluv-c}i9f4Vb?x<+iFWe9} zceBnnC=k0TM)&8g;v=(87N08q)CCQ#(P?hQa}4%KjT+H{cn*VxH*nsFb`DPvG#o+P zsAxn~@SGT+d>6EV2FGGiOia>IwGxLIEkh<(gAXj6=| zS+`(AobI5pVwSNg#w;2uoJNmsyRkwtR_WZvrA5Y?8OFL9#s<-4^gMT@%4nEv^lXS* zKKRI^Lv)pcj}%kJN8-uHmTLV%RZ;W=!RYY~+7Q>Q55%&!=Eav+gtlGu>Z|}w!B&i> zHGp;*G$YwSqXl~vv~JLbaf%>VfqWaYpXQDBo(8wAaxb2w^aULP*XW!tlqmCM^gpA-T{eHG427Np!SzKAmk4``d0lGbGkHalC!J-I8O= znP|()wXw{YbY{`VvT-X%iXP@#nVl9kLCK^>>#GwIguU$Ll__cAKzN5!l8!kY-aXVDe=2PTno!wm68@tLs;fii0fdbt5WRY$>o4b?Rz}rD;S!5 z3lY&os1v=4ZCjNso@U2a%@V6vQtf83hV7`$7F*b7wJG zVpW@K^&AoZU~GHtJoJA5{48+`+y6Xi_n_a;>~$&eHPbcyQdU|wPi$cC)SZXF^=q=l z8|?ixyL6uEZBML?6XVTOG`WhlW%b#ju4Wp0W8J2-Ail<_y`+Kg9E#jfo;&9Yb95ub zwpU(wH&ML8oc`?ieupO1&(`>lie=2%oE?Aff1owZlj0-)8L|D%lM*BUC(VZ*%hV5R JGY8Bu{|C|=d3*o> diff --git a/waymini.o b/waymini.o index d469f0a906650768182a2f58d161ada0b030ebfa..52701a6c87777714f4517f9002a704617a0da436 100644 GIT binary patch delta 3599 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