From 59965e83fe8a6361c247e22994ebe02c150e9f81 Mon Sep 17 00:00:00 2001 From: Bill Kendrick Date: Thu, 27 Jan 2022 00:08:56 -0800 Subject: [PATCH] WIP More work on color mixer Tweaks to icon. Further modularized how color button rendering works, so it can handle selector (pipette) and mixer overlay icons. Mixer function is basically identical to color picker (rainbow palette) as a placeholder. WORK IN PROGRESS. --- data/images/ui/cmix.png | Bin 13894 -> 16592 bytes docs/CHANGES.txt | 2 +- src/tuxpaint.c | 399 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 381 insertions(+), 20 deletions(-) diff --git a/data/images/ui/cmix.png b/data/images/ui/cmix.png index 71a4b5b27d7270e038f738bb8c1117974c781844..c5089c1a1db1976ec2f78afd73e4a60325ce1fd8 100644 GIT binary patch delta 12017 zcmVkvGLK1Qwb}pspJV=qf35gxVk$Ma zoGt%ii_Ld_srLQr_ouV*{(OJ*&ui|-=Z!0$7d%e|9>e>y=Fflozn*vB2lzUmv*}L< zs`K;0`0<4nKgX{>9q4nSpb>d~S)T*7&w+w}FSySE`sWgItL4v^F!p==eEv-X-$p;i z*R$#K=AZtKh1pw)^91jAaKZ93gwFtizP$;ZUmQPuD7;Z$dZyf;Uvr`v{>?mn|7(os zXsGeGZ~9?XzJGuFX|=Zh%+b%Q75(Qe;ipN?-;ck2-njJpRk>6Dr!&X;`OW|M{BSJkhA(LU173wTjjEVRu zu@XZ)g%ndtIh9mXOFf4ibILiFEKuwvlxRvSxs*~%E4_vqYpS`HT5GGl`4#}p)N(7W zw$^&*oSh?gKHYgk@57HU;z(xXQAQnY^hx;4IMaX3v&=f%?8~pPz>k$zS#`D5x7&o$ zjyvtV%dWfaeh9S_%!wzRe9Eb(o&LRQpJn~!>tC#z`>dM3E2TG8k%>-UKVOnZ6N!2eb?@57ukJ30)e)11~YaqJNRYy z^v8$8uX>2TY#hnlbN~8>wSw<+td<^7_o-&^0mL_5@Cl%x2x&8dWcBW`iK|q+(*6 z8pUK84%2r|^bDIzTJs*nO;+UCc!*I3e1Lxu|L1q`Iv@A$tTy#*cN<(iB8%R5f6Ox_ zregu5fGy`3+vNjh^FE(DLBpz?90$t;caFeh`P7K3SbfZH)w+8R$9LwJ09Ztxu%3YP zLDOZ1iwd+g_8w=K{w|S^Oy8M_Jd!T{+{>B86`rq98!jDTQg6KHQ8(p!(%OKSR! z_cJ2G`yGilBF!{^)2Gn&8rQ*O8Xxs`+sDXfd$$scK!gB1>{L=i-;1n?eT6vhCx>aPlzYC?bRF|b`` zs4I<>moG7&5!Q)r$AdaP%k-WJqS13qVTRCbApoH!owC?|)6@R-i|x)$BY{{%JWrcI9Zf1=K-Wf z-=(m)pkddN+QY@>POzVu0$phFfB#Buad{*YhGKlt6!>JNMdfP~8k_lQ~ z0X1n{P7mt_Zda09f#rXJlq_`gfe#LFWIhB8?IHNgqam*ds@fUrdrQfj9MpUVDN7Hm#2|yq%#Aq_P|rIAL!p)k!7-*R$tE zOaK8Jdb|njfImOxPy&v{A`8wSJg(Woj~fRG67`<=z>cmY;*EdgW@Si6)O&SxPa?qg zxycXcj*#brWzGSJCMfGoIIBSnK1I6_J1N!8?2K#wLHn5?T4ZSQD=LFeW#uX*RAffKXK0Ea`N`>hR2!{_@+4 zV=xx;OvZ`SxFgt$xl;BLB4>cd!OY9?TDwVVC1y-{`XH5&u01BC-XH*I)osDcb`2yU z^%A-cw3s#6W`xtbUqGxC*r`1T*<*T)Plh1kLGERtO2FPMhKA7F;a<~u# zXj7$HE(?E~?Aw?#dn7|(^95z~_yOCo(!JA9*}Nkq(8D3!#0X zpKyP+qB5+=K^&2}en4Z@@9APL=-b*041%OUZU`h68j=(SjF3=iPR%stBh0LF3ztAl zY%uV$9~loUX3&I*;}WV!mbq^>r*%_gNv-M;BmgYP|E%a?%t(poLCzI3?)n6cAc2r@ zV(DD(jCh*e=IRDohwLC>;>vD>_2*4Fyxf1n6)s6F{1dQdNlL%^dU8un0#f6e<}zYR z&=)$$Xs(8D9LyG3pDkJ6h&Qz6hM+M|ts)9@vL0Y-NO>rsmYy>CBN0LRLG1Rf|E@yo zbA{ds&!M1c1sY?cAYmXOP9+x;4s1lUP*N^;Q!s)0{3xWT8_Ub6U=Bmk;wT|?y<6_AaGDLjMf4X zj(gr6o-mj&NC6PqB8Hk^)ojJP5J^)u38^7yuNN;Y`@|*HPgb6T_t{{M$yanUozX9S zqisE6X!}(nDUO#yg&}6VvLvCk`0{^1FfL${4@FLki}1$Vd%^kfeavD?GQk7AgDCNK zc6>9M7^@Y?MvT5d5pNuMivr0dRB<$%^5AeFS1%WuI50u4u~dl$e%H?-Q5U(SC!0e( zGZ1W;?Mg7BB|JKt+>KZ+RT$3vX#N}p&O|HU_ zu;fpLM~E7a7h2%#PVgKVTUv@-&jkw0a^Q~8i$MX*GQ*)2)599tG7TyuZ%H(C1lf<- zxqyNUUFZh1WWT8~R{&DPw9>+bRrP{dt!yoU;51%I3JQ}qIRa~4R%k`I77md?(hH6y zj=45cVB&s4MJ-}}OAWl~1aN-}>8D9NDl8VcZWP!mXc$hz3*v7E7&NA+<-}dA4v+)q z;1Ai5am&CKBPt#To1`2_%X7`|gIfG#%L2XZ?!som7tRJ_rCDmQ_{*TqHC5>fm<@ z$-oB07$?Rbpb^$Ynn-_};_XQ!f1Df5cU@GZAb{f61Qnv)mvb5odoXT;1Hj)I^>Ym@013|M=oTU?1r(=!}? z8<<8`Tbc6bz(JjN!qdja_rI)|H{R}Q(1}!kF7&4b9_Y)$he9LGSkyv(a|o-k>uMkZ&4rStK|$X zd4?ZJRm@GO5psW3R>|~17aLV>j_4Xifn&znC6)v&NXQEjNxb|D2?r)qRBJr9OnXM# z7jWR3(6`S<_`Z_FJ+ZPq+3CUWf~_2kO|--EjO9_O#IenMqt9)3U@#%7a+%g}8WpHu zTmTpH0}nR4VV%})L@3>tF}_E=#$!bvOOANLN%$=+?VG+fZ`BG)#ONUo}LGeWoAQ0 zTmYmk+2^%Y+-vR9p8*!G-SyyXEPwE4Xo?5)1fX+0=7tYEdJ8Y)k-?CJL!96gu!bzI zsaZv@(nNoSXd$ow^Wkt2a8GH^ebg^XK*q0^ailQ6Z1grWTS;F7c8*1`u6mUf>4h-Q zw^UeFgPIAUOtyf+yQ(7LIwGb8DeVJKsMrJ`RWspBauW%TtPtuVc*+VgHmV2_qQu!c z(oWbnTjUz|Q9*On*q;NB*#rIv$Xn?J@9=mDIV69tcQ-y`)*f3BV~3QZ5+~xn8%WL7 z0NMZ)Ie&|~rj#ciz}EC+Qx71FBc%PDx5|eRZ>9R{OL0FacAq3nxH2RQkpqJTgUkR0 zalgc@XPMDO6_pKV&8#p3{&N*x}Ls~GWtOst9z<$+Qq>}2{GJtj|w^TuC zU(Tu}c}YhOB5JD#beX$yUCMT>e4Q$MZrIr?@FsYK7q)xBA7h}QO6m?&P)RteG!x*s zF));38Bh!f6iY&l<8JpwZ?urR%KyY02=bMxDLqTMDw8V1gyw{@n_bOSAOl&k625<- z#-$vIfUO5qf-}=0TdG6?ROvd5EzP0|X+U1#Mp0G>_aIDQK|S+v>zE_9!g;Ol5?CI zji{17UY3h~K;#lHDiN2O+ODiO7_gBiLW~hHXoR4oGi<_?q4$83X-VdBkkzn4>n(;0 zEMQP<73l{UPnIMXmDFT;6qs{i0g=`A(rz8vliONCaOaTLxB8eW`zI3-4(|&w^bN ze9#-kMv`eqIHI^ulK)o4bBGrB)n;omO9~u(2Yhjyvb2ym$Piw^DF`v2HD9WGxO8Po z>mKkRFJa#!cF;~unow)YDh#Rqh$_dD`&m;({Md{WCK@2}YdW%|nCg{VqDQ+8T)HO2 zT(yC%pHtg4L!!95+wp%>4>7m4_7GGp!W(LbDKr(5(a@qr&FZ#8mfY|T75kR9K0@v) zq+aJJZpB=}jJ3l6geI>pV3qMQz0AmjyOByjH}v5QX0G;}^jz0Qu0`+609UX$wV_@e zBugAb)i=e6=#aZHtW6u0ywRnY)mq()U4 zmRG+u-i+3LY-hyrc-5h5^Bx5Vd1CI^7E`;4s-n#;$<7SmYr-66$KUxDx*RkSp0wkKwtjx0>QtR%(JQ#MYaX$hjT=5$Es~vtQIi8Re8c{ z&07zFgi$9FFra@vg7i!$8x1CpB`=8|(yj+|q;k9(8FC=yFh^G=h?1D?os)9VqUJUP z1BvIVUJcSyP=)e(HLaSoDbCVs^9m`J{d1`HDMs&c001OHTZmrgD))73UujPw3hNbi zuxQB1P`SP#JFJzB(kV-_7>m5@tTAGJL-Rj~%Mz4miu$#jW$cV@z>>`6>!Q|{T&ME<_K#koaY z6!k7#Ug3Y$P8mMq107OV1+LzjB9{O$XnwnyD(8^V*LyM1)=Az@7+xp?=&ZXre_lhw zgk~8~)%sM`(VTiBUSV7t;#=BZ`|n`FtvVKo=R4Mb?+4nnfw!|jG|#tzUNp_fIDhLs z#L-dh7Iu|&5Z{kip*>Qm(>`TSK<-=L$94x5{}X@8<}~dprcjuI;_xCRzb$$Oii#%V zi4Wu(bBfT5C>tLW;=owZeGiba`!;rMwM{KX}u5ziRn>2i{l4v z07M5Tp#(RQgU{@BKjNFph{P*Qt4)HeHzk!xGJ=U%Zs6;yT%w=$&>Enrm@dHmXv+#J z5I=vhWT@&ni%HtDYLd?Cm?*;7bIZS~k?40#umWI+xM%b*KmpCT)KGl=>?fsTl2Z$X z>=Rkk`;Z92Z(3SVk)lG85>|KyFVS zja0NB1q&c5_6_s($|@@3EiVg$P>^5qL>JSNBMZs0sRiK{e=ejTBT+gjFH{F>4(H+a z3E^@#D{;BSAD80F6Z~hk9L`G_ik;7E4dnD3qV!3sADWNe5OQ}K}1aUI1PVr zB^uF03-ZzjOyx7Y!W?E$0QP;W?JABEfQ+(dqSTLM)2l8UZ73F%$y`CDNn|nTLSWR$ z5*1Yzf$E%tbn#Kc15vrOqfA&uIFDGsBSxd0frI$yjbO^?OsA%r1YDCyvg5y@1Vv_2 z3HEk8sR=?U5=k%?1~$9pOmdsy;K_ej8tni=RAj;0C=S;u1_{p`?>1@HUj4nh?H1%)^HBrSCV8sb$*Q(Fy}f^Gd43%x zt8Jt2-3GpPV1LzpJ4}k8XB9r+rZ+0XyQH_Q^mqLB zm%P^{fc7y?5(h|W+I(+A8;XAkZdJE~Hf(z5f=TKWWyR2VBxJG(u68$4agS0_SeVVnj-HJr0181Ph2~H%V{8^ahKZPuk{LpXT3^_p-%c-OkUF zYg?F=;=;$*wFtDeJGqsgBsIMJIkOB?3S7SwPp21k167fZpmaKp&|M#hLsl(GZ36l@l_*p3HO$cLd_d z#uShX%J;~(`C2TRcD*=KtLgCw4@`|J070^!&z*&Kz$TV%s)~P+8Bkl011A%_x>dQ% z60Za8ic=xeqZ+Lud53>-z@f(3SFjPERE8(7G)F{#5iJBjD}I=NzrBE4kCpJi4XeDI zw1uZ#UW_%u*(-u9q#Uz}+F+4~*Y4bkx7;N;q}^u4u9Z4*&%Lz$5(CUqUFj%6UW>(2 z0YR2iGt3loU0W#FW_!uZS5)T=Dy1#dcvjiGK+dRgwRJTXEUuh9=- z0u-Ziuw1I^YopD97la^GjC2jbXQCiY0HV#2<581|Y1#tEH@qE)M!E{;rhhRG{WT;m z=Kl7egnNH|G~Z94%~c`OwgL9D`VtqD z%t|P@P%Ft7RiJ-a+`u?bd`SgkzRh2wP9p);>t4Ov-yz6aPwhT3|K+=2&bsay)QBov zKM&aE^8p!ijDf+8XHnf$b1dVEs>r0hV^15CTC3ckQR2+of^6 z+!26kCtc~9K1!dcmJ=iswdtTeH{xdjl~el>NLqMDF8Y6Vjp1yteNiS{H8G0|S$v=e z8Fn=!3R(Sqa|Jt&z1ywf?t97jzbX&DUy6Xst`(6#Sx)#c-E9c0HA|4?PtoEv*}enr z#G@u{R0Hwr5WBkyhzNCN5~71x10W05i|HL|^n-fI!-b!N+GCA`>(xc7;NKcyUwRi> zWTKu-D{6nTo%tR{o2F8?$k*T&Lm-~L_bD~+Y>fLVY~=p95`vgR_-A1hDKgZ)8dcJ0 zDhV)d(o4=hRJTIy^Sc*N{hn%hr&i7cX*QB z1Xp>R8(}>s$pDbiw;hs9o7p%fJ_gsBPkc(g)tG;nv)Wl0Ub!VL$l1#`@)Tw;E+`r< zRs}*3!}|FNuLVgLKjVzhE5udQX<%2>Hk29>sw(Wg-I|)p0E3HPK7eq^Ar7qWn9`k4 zRXax&Tqc|GQ@OdNLOC7>pOFzqQ^gM#T9l*E4O!ZEhn9nsrbQzoP2hPm5tt0U+M8If z1zUe8%afP!ncaB1a{QyrCygh`QmP89)jRc1E>vwDuZd)VM62en(k-qCs%D9qCj>{h zXq%jRY7yK#)~PKBVnM;*%=Rzu6FJ4wjc{+t?}WhdvVDO!!_WyDnbYLk3AbD6Q9`zo`^Y{bH|iz|;9TwWL5OY@SxXhNNnpmBz_B8k zhX``U%g9Kpc4R836`)*|f1Tp6G!+@+#D&EnP!YxyO(i2oEut8gW8~OPT(%Fc-logx zwfl#Pk61*Mx%)9W?WaM0pT`?4hSgE6q#i%r_|pV&Y|n$=RKd!tIV-rQRUs(-Es)BdP<$Wp`4 zOf5SR zIJK2ZZ5DL)E$fz8#)f!2=m~#Ad-YBSbp>PIuLOnH1^p_rpY^sQ<@4ndK23w_kdjQ~ z?Da~8Hkqk$E08^{dRtrYH)Yn~Wbt@9_((pZU~`N)YDdylgFJ(PKX4q+fSoh)_GgK4`e{6KQx6y?S;CtMASiEaQP~-{&&aDFpTo)IHXC}`ZbnM{% z@!|6#9eH@k-~P>1&%L+j!Xf75D;F_pizkYSn+7Gn=|`%jD(b(3Ux)bq$Iwx)+wb!Pmd7Xw}D^td|u86U8Ff zs;>WFcz>&&4{V=?&i`qP@0lQW){o8Hl&r9IF13h4V-wefB$VLo68&N1A`7JE-Eq=6DIvi~>aU zL}V$rs%=u6s&>9D5?*JP!E#|-1*qaUiRIo#oxOd@>bIC8$a-B7wr#w2W%SAG=*QI~ zQp3e=m3eQqPipiz1fvGXw|$YrM_8uU9#Erp=Qvsn>GhU@$&cP8t?E}%{0@=HwyFSp zMyTQWPkTU%rD}fz^0TY;j-`ch_1$_Q{rXj4KimB7djGgw0Y6jz)d2VV!`%vi`Sen& z91K%>^->4)zOxyC!5KL<(-3AT-`fz!?5QDE#T^MmwNl^oGeW|4Z+*+*rC}A@s5X=? zdJ3S{YxRRx(`vw6L9orZpI}|8=c8&_E_9O@G6Te*`MrO`sUF?o6dvq;ZgEoA+#(*o zZgJ{?EP_GA07DyfD#6V2b&u21Zi<>iCHx_#IF!gCqQO`$e4Tch7=B62iS`q%ZZ}g8 zyW=4D9w#hJ%c^U*#(RCelG~99C8+MU+6^sSVt(Bt+ToncaRXQYHjI=bCYTBJeB2sp zBFSmeaV>&?R|GX%U;PA{#FPRC-%rVZ$K zU;0g;c^EAtwpFZv>(sxd)*-Ncn{+VbpbF?w35f&w-CIGI+P%dEcY`1o@a*&~Cj|}! z2NA%E$ywi!;Y?5LuA@7j4Uqca0t}RefdjNj!>L0hYjqcs+{Tn; zK-Pa&PTyXZDeCaJNp~rgV`{_FqWPo9SUV1@u~J*RA1n{c2Jg;j)hEuHCj{#B+T++| z>Ng#J|5}Y$aKBaX7bPfIUC{A~ z(D$sEV~$i_y-oL!4=NSga8&rUy4ecj|KWdLWM)IL>DHaLADp655q}tB1Z&WpM;kJd z#bc>k8iPoi<7TG}w2A_{V~~tl2XlOa`?^^+H!=Y`JW*IO&8lZ~QdRdBGnnmF=vVB^ zl&Bx@P6rqrGOD(!ny41mscu6u4yjU;x7wiPXzG)xevmzQ6}dgGQl$my2SL%)rVM{- zr0T{>H=f~Dri-TYYng(U#$6JC60bv!boCE{1js?v;Dh=uZ(Dgb7PPPv^Myu4EC?~m zKdtxTyKO@ulQP87bMHy!4HjM#E>*b;Vjfw|{1XmhjKo65?8wikflH8fThE{W4{Fi- zqBy61R*Ct`5BuKHr&_GDuThSRYY%_W9z{VDBFuCTSPY>9_UJY+^t!rNvVg>@!*8k) zx~nFaRo!sl2GE@qSa7^b5CzG~kiiQ5?;Zm?)gJ2Y()MkE(!K%ybuvon39R3MKvwFv zo5fDuzZKimZESVj``S&M_hyc+B8RqIUCg(qa}h?`7Vwe;Y3UBaR?)1wqv3zRYjOoV zkjC>iNEqE4jP$g+Z)52H8F+;mtpPBAE>PE9D@6^i2uO~TuuLq+%o7t5O4pWh+NQyF z7VFLoa46MnS->RPm|U4xcUkjDD#yG&u6Y{`HM&oC6lNFLH{{p2)!3vP|5#nuZ%YNK za82E~9qs_t!N|Op#n&3{UZH;;Po_Q-XPjHFH|j}I|1o^Gg+|TTMIvH*lvuh|rXe|p z-_$)1;Dr7k1YF^2rsz(zApfdesMz+Z>M~*s$ht6z1MyWtr-C6-x2i#d=yG^kd6oMk zC1j1P>E5z3P^d&|#?QTmp&5hPYsTGm&MGLVV@|gMLuJ}T*G_#AQb5}Dsl)7PMa6os33X6|AIo`#Y-ufK6#|ch| ztyYi{tEOJMt!+=;qpVI#u-hUc1PyVqhO?nq>U)zqjJ83k6eQ(FTjkPkJHccKcP9?P zgBwQ{!8lvDMc{QAQ&pve?6G<(07RJ)(b_bn9A?=~Ja)sl&l1 zdvAuDP7Qr6OO6fZYE@z25wz&Gjco zwV%L5=q>_n^1XXm7sJy4jC-wy7zO^c-+$@uv#HJk2^U6%;nl82SIZ9ay)N~PsKH^X z{4&ch1Ee`q+v|V21@>+V@4Gn=`>ioJH4`il4J8XcUf^)|#$)ZT!Pnh~sQX29z7)^9 z?S0^YUZD;2DI(50#UHNtalX{Sr`MUyfMk1j9dg0@(_Sh-JpaY6rul37yYu$jm;5Ub zdXz47`<$}LpBqJw%Ea32|LgyN;>R-MPmkYqNcA2pm6Hzt4?#X9b}@VW;s5{vg_8*% z9DhEfMJf(<5Ov5x%`(!-gpkdx3ZYl{Fo-aM7?YT( z&xv9Rp7nK4-BfpRp5@*5XZ0v~lL0<~cz>4ZhDE$VJiTe@ocD>NtRyMK=ftB1U6A;Z z>$1yloQn?od1lner00pF#6q!ygLnWRfjwz}}`TnfS3g<1(YNf_n_v9~(5AHzUs7iiXP`}^3on2C8-PYti;Bp7( zf6^sGa-;w)f1v=ppV2qvfWBLxd(E9&>l~*KK!#?Ox&aOjfsrC*uY0^Z+&Q;@ds_4R z0Y&|Cl>y`}K>z>}Y-v|F)%e`Ei_~`G%aFdG&3z` zGGsS5Vq{@7IW#kqNh7HXH!wIdFf%wgG&MN0{Ugf-lOHEsBV#dSF=8+=I4w9gGdL|Y zWMMWfI5TBrEo3$`W-wwoHa9UjlYuBq3O7_RFgh?dIxsM^x+!i57Vt8Dod5s;24YJ` zL;wH)0002_L%V;IJ~APH2nPW7<7{pK00bFHL_t(Y$E}vnOB-zv$G^K~V`36Tw6AH5 zf|jOKP}@UK+UQNZRs;_P!Mp!}hh98*YcIL97Y~J6#fukFX($OPZ4;#KhDfz98&sO$ z&tywtG`pK`57oT2R$nb07I%Y!(Lx2hcPPk|e?HcEjuSqM@My)z#JIm%0de4rCYxGnovM z$s|@*RuGTJvAViyE-fupJb3WHu-Rgp=S$H&>$)+PYJ+S(e%#>UEPIy*Z{9*@WLcsx>X zZ!fyKy5RA6V6)kT3%|$b&!749=~F&@_>fMgvjl(u_~F9`0&oLxpV*w5nxdj8R1}3% zQ&R*$pU=l9Po7YgW$L=lUjc$?noOlqoS2wkPft(r6mY74>+9%L%OM(#;?=8HdLR&x?%lfw0FY%Fe!m~dWD@Cgx(EP@ zqTv5zdU~1;heL2U9ME;0k|YThl1wI(c=P5B;_HBR8=Ja^!4?f3zkSE zpeRcA)c#q2c6N4z#l^)^OG}G*^X5&IN+p6MgTWxZUM~SK91c^{G-{g0a5&6g(|DPN z!(pnb%1|g&YHn`Uhlhu`yu8dZ==t;K*9v%%YMMp>IJwg2^YP`&mpnQ;qG%WfG);ro z>&4%e_4Re6(`jV0S%|u>qqepdR;v}yo;`!As>o!2GKj@u*A6VpGE`NiEX!rz_VzY( zUH{P;8XFs-sw#XwU#YdV)dirC$z)2`1^NB{bH1&uE!gdLh<3Xj9*+lugM$c#LjUgV z?d1U2Gnvd^Nnce}6`W4zj~%()Zgh8dBM=DuW3^hB=jZ41!C>%@gAWZ25r7blM$y;T zhsw%-%Kv&?Bog7s$OvsV+wsqpG&woRbUMvqvB*RsacR}f%*-$niBOhh%CgM2Z{ISN zO0hg{NOFIFpRZrPW`BSGnZ*kW3*|PF&*v|MBoYZ4hQU)YO_Qc+mLZnY8Dg3y{eC|R zg#z~W_R3Y4NF-8Uzkbc#xN*br<;$1frfP0~ZVtC^--g9v5w4V5k~}y#;Oy)y2L=YN z{G+~j@#0Jay^@qlCFb*a%CgKrAi&3uAG4#QgD#irw~(QsA;w}c8iv7ZjdD>G1(Ljb z_b%$|>(Socj!&OH;oZA;2!%qhTCHelX@S$}L@t*@p-@0wT^&SGymSM?RSqYHVc_sU z@DTg^``F#x#kX(Y006bMwYYQV4jc{#L{Sv}73rn!lG%r*xov;XgZkNF?|loG6osnpzZ zw)}}LHsAT7+V`j5ug=E%_5G)Ro^wAwZe001;dvij%0ete?E&-Lq17y5iq(26`itj~qo=R(21C*0=({c{Vs)$;u z+oS38;-CH>3(;GN&k5e|;DY6A2%iN6{qrVtesFyCA^ZCfKgatuh4NX6BK(Uuef?>y z=xC|&moNGuD_?&<{gkckKQa0_ThV`B5`GGD{`&sQ$Bj$B&dLq_cb^>V=O_Q;<2$!+o%Z;+vm0lTm+v-SH)~utFu1^QN7geyzpb zk8O6E`)QR=UXGV~$Hm+&f`9ne{L?p_qu4s9Snii$*5$o|%`%iZedT3j#GOx2(+%*q zzd!#`UIQ6Sin3ay5!mrAF_QZO3BpZu;Dw3ruLoUOp9>HoK02`&7svovb0N9xZ1KK0 zM<6Q+>MVcVhv)|xa4Gr4B7F>WQSsI5qj^hl_oY609yUA<_ zl^W_Pq?l65sic}(>N(_?Q_i_$fnqPAL{n19rIcD)={3|?Q_Z#1T3hYSw*Y9SmRo7H zwbnbI*|~D(-JKWoKKuwHj$}q2Wz^9|pOnvxGtGZI%dE4_zWfRc{8)LFRaaYmyG<$W zxYN$N?7G|Thf+JioOsg7r<{7)>0epw@CzFoozPLgs) z!n}!&j2ESVg7(Uptu98d%qeHKdAcHb7MYZ@<&-fp7`OB3xNo^L{$*5|`&W50CH{~% z|KERR&M0;NFmr#-+pn^=L__mt>~*1nY6IQJ^SgFmyU6bAI}m6apJ2xBWe30Pp8oi7 z_%ZL1?10I0Tr=h!bE9?ato#&RSYGcrT)HO0ZBO6>lG)_Ftx@&FCK?oxrxg?H)G8)v zIE3$<=vg+mwC25tn`GqJc&Jepe1H-E{VRWXp0|5v>QYBh_J!^XL#3y+h?nfKPwk zA*~f#$a{@8bK#;^PZ7V>`dPflC&D({_F;im!OsDVfM91+XfF@xPRej?VU}{t@ri1Q z8a3%CgYv|viYhqs^&il?`+Cq~K=jSXGnRShOjh)Ng zl}4(B5G=G8w;4upFMG<|j<$Qd-V`00@P*;B%DKB4Q zJ|nCX-HxXff0pSzQ$(ZZn8FO9*+KzAP5Q`U`)yDA`|o>(?PjUYkUB?+)=K#($1vEi zg(9k}gq=@wf(yIr;JyacKTeywjGJ9L#B~5C+GED88}<3BGn_0+nDYQqqwi8kE@;@5 zQhT`B+$r``RWt1*ZrGLD1s8t?%<}t0O4hbat&)wrfLOf1Ov??>p8K3oF>Ru90v27N znCR=;RCyqJzTK}Xo|_w5)D^cwZRf%T57-~_ng^xrXq5n*r_IA-^;T)$4lO_&KuSo- zgfqa3!!5Ma>_r+rR)|_Gs5W;kEBCheviN`&eQ9oh(nRV^Epm3+D4KthlLH3{wjXu& zLE0#Esv~uU6doP4H&_f89Gh12IgpzO@=-IWcw6EkW6;qVK3Za-I^Gb$4ik*afmb!% zD#ZgkcrrTot~bt>g3bC~@&L9AO=4CDpVhgs45~fVaH>R*UN%yibb`_=pr(z>>0#Z% z?P_u>uso2Gg^oV(!3BSg%!h!XJp`Ybic*w5{UP87hN`<9}I-9?k4zFCkMZR=CjXSrk6qGDb}5b5o8GZlJ9v5RR0hYUix3`av=r_o<%G5bEsos$hS$-r~OKIH)gQPU|64 zYovku+bo;Xq>h53;1vabqi|z298mze6C9U`!KcWaC~2rF^%@v&!)-GY>tP<6q|QZ9 zuMbFw9lYCU><}-(H9b+O+BLL>mkdg3OkT49sg4@i$d#UoSTWNH?g1!J9Z%h3rx~M= zJ~S2u-Kod!WjcR%D*6Q_sHtIgxhy1Vt#v92aM0eDSk73b+L+W<8^i_JDI5rbdy6n( zf!CyX68_V4IpVmnHeml=;(ip<02|$b*?_MXGg_tLY51J9fBoP*V51ADIC?g037c#YFm&L? za#a*pYpfw`8jrT37)PA+EE;Se?`GbYM-1idmlm?Fia`1u7@iL0O}Fci6Pvp@Q6-ui zz0p7s78~WRQ51>Jgx4TID1A=6d8+^rjnB;?3)&9ImCMc4p0kuWd_aL`l~TFr%}P`P zkVn>#1tY$fF}0!RS_^Wa2L1iARqgWby{!Uzr_w={oVNhrH2wwc^vQ+Je>G1Lccp+Rz- zz#E1GofZLf=Pg~0DV`X=SP)M2T=mH_7f5gja1Pia9ob@(M%9my5E_w=_R0Z#x;hBU zTPer}H)KeW-XlKfO6o>B4XH|zTs`gwppAKmboIg;AdoPd@pPmo%sESc2svo1ChSX6 z|J8pHW6WjIgbJbNp;tG-5{j$|4pC@eA=SLnBd?tMM;_Zb2szf^<_g9Ii+0zniQ1t{ z(MvVWiZ;R)pa--HmIxnhvACob1i1pD6oCc?447(=5C8R|nI-W(*}QGg_rAKRJ4cBj z56C!xs6}L$799$tlidMGqUS|(tq?I}#)N+^sk;E@0V$zjgR$`mcC{>&`_>#GSoqdV z+GlU>2*OeRQ(w?5SbZAGS0acd;t``qK;_@4B$SrHc3sh#QH70SL9C`KtKpPh`W>Q5 zitaq>c@fjP;#PA1BsY*V1=D3lsDuEv#ka=X!NK5hB;XMW8NIhh!R4`RZ}W;9#yNig zISCe45=YpUe(1^EIv6qp@Qg;Gr&HIVA%GjD0#CYVbUffxX z__cvGrNb@Qi*Eq^F(g3cbQk2k6JqS~$aA5_2GVK@VDV7nwzr<6j_6`B)2g5iibW3Q zaX(56HR6T&6fEXQ0u=#%*#ao^Dh_|pB(;GTv54c%y&+Jpg!1yY;q_#64lvE+w`ep2 z{n0*K+VAxnbobS4rqJU*w3;N|nl=NJPQDlV}^8iYYs2`nJexXoG_@!&#nrl8@%(?aotkK> zBYI>~@9Gkm4{9Lz0$L;>p{aPeWv?p@24P9d4@4v)0}q77VLchGR;4bw{64TjIRxNn z^SSx958Y5uFtov3XcT-udizj%ljI!C1J#M%r0dJh=x33)+F2mVV~L>IOdYAp6H1AT z3*->&daYXFAlvt<>SgL7KofsQ5UHD!jI5$Y@CpQ$TUpjmrPz7r=nWs7x%3BJBT}#l zaFd4qs1ttDyRng6lyb;16Es8;rWQ*PaF5uv(Gd}AZZ3q^^qJRX6yvP4OOxuNmAMdWib1BKRO6#_~-q=O%$v z3!!(Y&!9=yg_NfH?x=qWq-P~wwEs@eO~Xl4cy2j#@m?dM#^ZgET_CYQ3A-SA6ZwaNZJr*Z#-(P^ zwIzQMHXDSw0-$bbL+%x@G5PL=*yf~jCs1~vgxYx{cd;pVlm>sFp-PR&y3T(l@Ikk^ zH0i@sunmBfSt-i#3OZ?KcWil(sw%i4<;xASyD`nS_kcF^%^^&B)EF`JvXI9oWlgQX zZ=|gE!U0Q#TX?>U46xd8A7}y&VLBj9#0iv(pB>Rk2M7VGAtneY%~&)E7$wHKaUTf- zys`7Q`!)3dqCI~ajxVI>1azT`_~ud9^42xPXiFPZkrKmj0&UsFnz7-{p&SrY4z2`z zA>gZ$05maW%JOQv|ZJ7CJur0eKfopM@=D&HO7AcCa`xyjuz4$h~e6biJ7+p zSlk$@D#(Kow3waKa32UmhdS^E;M5pn9hu)<39Egr14LZqe_Xml%q_>s-QQr6{E}W@KN!#FR#7P=_I9lv`y8xv@mI~D`u0P~z))X0y@=RboS$Uew2xx zf{$-K9*Wdm#3H$`a&SyV;{9r=Wk@{*PZ>)qT-SP}3uMUXRQmVc(g&|In20ge{<0*@ z_uqfb&ky|L?=&C^U?bS?kX0Ol%!zlD(nI!LZmGV7`&bb&cfGn%O0MqDXtc@MDA!bW zAvyQu9zxU3;Juj`LW1s&hJA?d#~~=UlMx)aq&ope-l;4!!zTTL*xTherz5kXPewqY zfBM!`1kC{=06frAPZyT$UEi!_YrZCUHadT1K$@aZ72%=L2&8e;N=RuB(O8GD*1(s0 z9|;J;VRXFpn5kJ}ztOMM(ONK?bcqHuS_b4ORHoe@s7BS>&RbV1m~-G7cp)y@joo%% z-JZ5-4ZiDEz)nO$z607f(E}F{HZppc;UIfoVPP0Gsvcv?Z9<)hWEiy>bOv<9>ydvc zECL)2|5g8+Uq2xqaPsSOR2Hp6PgkUh=I=5DS8Y$#>2=ckApOQGa?Er|Csd8Up;Yxc zPdIv3!__4deRJD2$sd3SnMdMkFpMb3=I$9_MN83;Tc6?99ScFaSgHKXj0LZ7k$2K} z_Uo>-HDhXarrWoNIY&%kFUda6i(Uw&B4-9fPFY z*3fW|Izv@9%ItG9GZ5r*BbBe4@1P+y2a%J0Wb+)pXUKyZVRaM;or!$f<63|9+H|Vn zb|XeriiD-q&dolxLj7J|lOAuY?gQJ*gZTt;DArz6hpgdE0ATc+!^g%1_7JRx1yy^E zMe5dQSBF^Zjl3szxMHWKLlFU?MTvr_?r(sT`8TL08$ZLwR#mb#q9`LkDLGs(OK`AU zyUXrfoYE*XKNiXPy8R%> zQWxpRd&(Q+UbO-*7R@=-pl}GF17t}to}h{D`gl8stwkHv-6(#vm_dK?7m7SVu1>9% zi9pxzPEAA8?(i@mA^J`e@u%fc+f*1Xu)4hA3aZr5E_weOA@ccdzJCB_q^kktxw6z+ ziC{t4H0aQ-zm_ctO^m}P6Y+Y4T;Pw>v?+f1;BL;n5qOZ*nx|{9tjV(GZzrq^GZOG` zgm&ra@o(?H&W519T;+)a_V z*VN=lGw|s}{w@hpiTmD38Tm~T@e)E^*TG{yxmwUf1RfdL8QQS%rSoS)Ac7uIzB36?_b zG&+16!BSdeV~TYV?mcSc?Jy@!@F(}=eM8imMrC_-hcb5vMc+rFg>2+DdS z)OF6nYiiwNM-%`rD2kT(U@#V09Vi}(p@(jMIC25o+`SH3eo`QqDF3$XGpFP49M>Vc>N^Ez9gY6C`&mbcHH zeXnnm_TPQiCT(?hyFJN6$ADTxz7&HU-I$=3Wo3Z}f|3#t6^U5THW-at<-LMNsU0a7 zGtw8gk=^LkdC^zPGBu7u2xQgP(k9|9rF&4sQkiur%WBxAc|sL)t`I9ZB-HqH)D~Ae zF>oQLy*+>Y0J?L}<(;guwk5y{D%!mkaFA8U;b2O@euU+u-W=hA#ufl$7b2q6t!d?& z0#O!EoVELvSbT<#QUB0O7E^Pv*5MCHIh>lfzlV3|VoGO=M3;_glzk7iz)&~kKEM4@ zDEuMRElPA!)A1=964_L-`8=d^BX<)rYI9QadtHAE33_B#N{d)3I3C>0$V4xBtQ|O& zq4xj~rQwI%6k?R7^h1rB3*MZ|2xzroHKkS;%0SvkJKOUfdVr<`F|k>V<;SN3G(L1a ztVy^V5FocVAR4IXGkh%i7@c&&_;gJ`StjbBpleZi06S4-dA*tGG!H02_9|f?A|mJ> zh|qub(>rNnDP(R8M7V=qo%!kbU9hFzPyAobNsdOXWFjoE)~e&;}zP96Y>9SX9m&uMIJ+F?N3o*|T& z&Bcb#U2r;?p=z@e8CuvwJI?KDcO*>v+Ovt;C`8rr^xd@i?AhQiK&C|A?s*1Qn}d|) z0W0qDGI{W?!8sps2j|s11vIsni2F`AVe7mdf2#5I8mZhurW%A|Z}uoEg5J>-z-fPa z`?N@Hc)@Fia?cqQ%>-1SUg!Ci?j2C0x^$;u6}jgs?D`I<%umP#Sb4y?Q8qOrM|~1n zbg#X$AVAY8;hsO;=wM@atvr-XH1M&Z>3CPA@x|P0b)CU2pIhsJs>R@5m42+Y!Aa`2 z6c8VaCdlV&3sljjjW-*9Gp~=1e93)N zug?q_@EI|`6AEDs`#JWZ(|FzEz0GMg|Lv5&3z6Qf5Pw%ipHpMEilVkpZFzr&vXNi) z$PYs~sbZI+WN+C|(0scVS<~fo)qAb*xz_nRw;TT`a$V?;YyNP_kJ%Uwd8c^-xY6Ke ztgX&~A}e&V6Zwr^g7shmqwS*DP^@4|&`*byg}W_z;%C=+@8S9zVt9?-$SnUA9)z!L zXQOi-nmD|DXRotQIBwyX#>Iar(fkdz0?miU6vKxJ+qe*fct`T+b$TIkRS>B0#5U~3mXnW}>-uI;;1 z#({>>o`LYu>J-u)x#r83_}{1*^VLgI;fQnG1$rj*f?6gTCOBy(wD%ZQCz-%%o`RWW zv2?%?nZFJ-u5sQwTAOtM1b0FBJP!PtLj*fCib`NH8|EpJN)A-zCZNl;(Gfwz4gBG{ z#)&+kIU(9Nrni5ZGIOc#y0SYvkx~S`Xt%i)0JMkWy{JHP=oFH1v;zXnwEprL`NvLb|xx z^V%I=X_|{@3x)(_ZRGSSHKJh`IoUhw^oU0ZsZZPo+1`JyBksF=16`-1q|&jM81}VM zL~ol9h~t}|A|sdXxiJtZ*tdU=e`!FHb_`LREwc=ba&6i=$5XHx)6{zy{Ii>sV}5%{ zECDu!?qOLNTEAw6tZyehliGBYp}ywEAh1ejr0wv$8+C#N21_uDh$z^6g2cFydkjA6 zh>=wr7yN(orf?DSXlYc7=KRqQqa(CPH&Cpmc4h}g!5*9OjXJ9+VhR18Bu0W*@(65z zDbMFB2XrG;HB8cp8S&kU+-Wb#g`^=JFpO#_T}Q#vZaPzg_$L5dDzu4~)9*Eq7w!!C zFik-MMIBGES4bS!9(6k**qw4+?@2Gy{=&VELDDy%al1TF*n0EK>S!c%>X z`bMql6xl8sKt19}TOx+Ifb)-R*fr9+)EzPwEQc>ntx5I#;!rPEtF)zy$oK>WJLeXkce zuH1cDACH=wO0SwhTnIO&0W#c0KbdQ3VVY|XtQOq&K-?+hNWQ7bbzMcUoddt zc1wT5o*kc`)XCeX^9uCT?p43`C=M7#NOphTfk-&Y9wMUI!JrJE{Y%uK7Hm}URwyEi#Auz_S)$_SI7=B2AKnW48D{Bo2Xf3Q8fkYi? z+yQu_Q-iP}E^;{0)WQk93MSL}Wv}ydTa) zV$-&uar)4~uDtIFC`lZJzek3mnEu?8zUw-WgxD3YLxm!urTJ0A2;AV4&fANY8I1I(xHdE8KD_sd*U@oh z4Z~X0IQ-rw_xpYq0|x~j{%}OpnZKA|{pEz~#*H7%pP%z@kHNc6EZ=!Ump>!}Jxcce zzRI6}UB!I;zRKU)!Qc{SHS_;6gq*oqH6mO900D-RU??1awrWKx4t5Y9kfAz=1yK=4 ztwIqhgj%6h2a}t=ph-iL;^HW{794ymRvlcNb#-tR1i=T0qmz@Oit6(RCiIH<=yvZ zbt_qu0X~6$c$VpgMZ7^gy=m#3_ld)-ASuM>#A60skob}7vdeFr^A7uYX4pt2=ZV9_ zLcWFN7G?!QC7vRVD5^&J{)Z{(jatG*p(j`N3qyQ~{E(g4y(Kls) z-dmt+&7E809H$RJie{C#0S*pIWaLUVKX&0En+k^W??j8Fl9JoHAf;3+vrWbszW45-o*xA`(cXwA?TwFAJ zz21b)X5;Ma%n}ZV%?^iyj*bqRo13YxucxA-0;kiNlT67bNu^SpoSc8Ky1L5J(h`9{ zfc^b_R8{>m7K?2eQ)>Z#CeC89B&w^cZyOsMU$nNi(%jsP+wCSVFYi-jV%WjKfsBld zh~MuQyWO4!#K3F7W#F~pdk6Fycn3&jWu*)a4axTQwxm)i$u1`%qUgFVp-@PMhli!A zs_K0fK?bh?i-A{$uNQxKVW2mA{=mS1tgWp{JRbi*W(LxUM1nvdz}VPWA{L9i0e&~u z(G9!>nt)To*TiRRW@biIRaI0~#pm-OB4P$OKR;)2agks!XaoKN{xxF$HlDv4$hPkv z7;}Dpt}HApq`h9RskF58u0cdZmX?;p< za5|k>tyXGkYW@Iz1ik@&en#$YqjcRF$JyB#sZ{E23o0us;}m~1v1ZnuA%uC6Ycnwsi?uK*kH^_M7Lettf7yZug)%jKe_rG?Sa(eHp?fRItX zXIW2Aj{r&_5TLECjl8_PJEFqELK+$x@caEQgTY{TGMThy#Z3dh0sjC$0kaPg%+Ai@ zcDr#n911`r62a&5eZ1F&!(o}8o|g9Z_WLdSCM#FTL#= zotT)Acswpo{)i$X>2z9Rv6yUcZ_DWDsPy&qNnKr?I2?|gBt1PnvcA49nx@HEwQO!~va+(m^71lPs}--;i`{PL`udtgB0*765hj!AQ4z{hE+(3$ z5s$|Shr?W4TyS-D1%T7(#OL#&sw#@2JbFPw - img_color_sel->w) / 2; - dest.y = (img_color_btns[COLOR_SELECTOR]->h - img_color_sel->h) / 2; - dest.w = img_color_sel->w; - dest.h = img_color_sel->h; - SDL_BlitSurface(img_color_sel, NULL, img_color_btns[COLOR_SELECTOR], &dest); - - dest.x = (img_color_btns[COLOR_SELECTOR + NUM_COLORS]->w - img_color_sel->w) / 2; - dest.y = (img_color_btns[COLOR_SELECTOR + NUM_COLORS]->h - img_color_sel->h) / 2; - SDL_BlitSurface(img_color_sel, NULL, img_color_btns[COLOR_SELECTOR + NUM_COLORS], &dest); + render_color_button(COLOR_SELECTOR, NULL, img_color_sel); } return (chose); @@ -22672,7 +22662,7 @@ static int do_color_picker(void) /* Re-render color picker to show the current color it contains: */ - render_color_button(COLOR_PICKER, img_color_picker_thumb); + render_color_button(COLOR_PICKER, img_color_picker_thumb, NULL); } @@ -22694,11 +22684,367 @@ static int do_color_mix(void) int i; SDL_Surface *alpha_surf; #endif + Uint32(*getpixel_img_color_picker) (SDL_Surface *, int, int); SDL_Rect dest; + int x, y, w; + int ox, oy; + int val_x, val_y, motioner; + int valhat_x, valhat_y, hatmotioner; + int stop; + Uint8 r, g, b; + int done, chose; + SDL_Event event; + SDLKey key; + int color_picker_left, color_picker_top; + int back_left, back_top; + SDL_Rect color_example_dest; + SDL_Surface *backup; + SDL_Rect r_color_picker; + SDL_Rect r_final; + val_x = val_y = motioner = 0; + valhat_x = valhat_y = hatmotioner = 0; + hide_blinking_cursor(); - /* FIXME: Do it */ + do_setcursor(cursor_hand); - return 0; + + /* Draw button box: */ + + playsound(screen, 0, SND_PROMPT, 1, SNDPOS_RIGHT, 128); + + backup = SDL_CreateRGBSurface(screen->flags, screen->w, screen->h, + screen->format->BitsPerPixel, + screen->format->Rmask, + screen->format->Gmask, screen->format->Bmask, screen->format->Amask); + + SDL_BlitSurface(screen, NULL, backup, NULL); + + ox = screen->w - color_button_w / 2; + oy = r_colors.y + r_colors.h / 2; + + r_final.x = r_canvas.x + r_canvas.w / 2 - img_color_picker->w - 4; + r_final.y = r_canvas.h / 2 - img_color_picker->h / 2 - 2; + r_final.w = img_color_picker->w * 2; + r_final.h = img_color_picker->h; + + stop = r_final.h / 2 + 6 + 4; + + for (w = 0; w <= stop; w = w + 4) + { + dest.x = ox - ((ox -r_final.x) * w) / stop; + dest.y = oy - ((oy -r_final.y) * w) / stop; + dest.w = w * 4; + dest.h = w * 2; + + SDL_FillRect(screen, &dest, SDL_MapRGB(screen->format, 255 - (int)(w / button_scale) , 255 -(int)( w / button_scale), 255 - (int)(w / button_scale))); + + SDL_UpdateRect(screen, dest.x, dest.y, dest.w, dest.h); + if (w % 16 == 0) + SDL_Delay(1); + } + + SDL_BlitSurface(backup, NULL, screen, NULL); + +#ifndef NO_PROMPT_SHADOWS + alpha_surf = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_SRCALPHA, + r_final.w + 8, + r_final.h + 16, + screen->format->BitsPerPixel, + screen->format->Rmask, + screen->format->Gmask, screen->format->Bmask, screen->format->Amask); + + if (alpha_surf != NULL) + { + SDL_FillRect(alpha_surf, NULL, SDL_MapRGB(alpha_surf->format, 0, 0, 0)); + SDL_SetAlpha(alpha_surf, SDL_SRCALPHA, 64); + + for (i = 8; i > 0; i = i - 2) + { + dest.x = r_final.x + i - 4; + dest.y = r_final.y + i - 4; + dest.w = r_final.w + 8; + dest.h = r_final.h + 16; + + SDL_BlitSurface(alpha_surf, NULL, screen, &dest); + } + + SDL_FreeSurface(alpha_surf); + } +#endif + + + /* Draw prompt box: */ + + w = w - 6; + dest.x = r_final.x - 2; + dest.w = r_final.w + 4; + dest.h = w * 2; + dest.y = r_final.y - 2; + SDL_FillRect(screen, &dest, SDL_MapRGB(screen->format, 255, 255, 255)); + + + /* Draw color palette: */ + + color_picker_left = r_final.x; + color_picker_top = r_final.y; + + dest.x = color_picker_left; + dest.y = color_picker_top; + + SDL_BlitSurface(img_color_picker, NULL, screen, &dest); + + r_color_picker.x = dest.x; + r_color_picker.y = dest.y; + r_color_picker.w = dest.w; + r_color_picker.h = dest.h; + + + /* Draw last color position: */ + + dest.x = color_picker_x + color_picker_left - 3; + dest.y = color_picker_y + color_picker_top - 1; + dest.w = 7; + dest.h = 3; + + SDL_FillRect(screen, &dest, SDL_MapRGB(screen->format, 0, 0, 0)); + + dest.x = color_picker_x + color_picker_left - 1; + dest.y = color_picker_y + color_picker_top - 3; + dest.w = 3; + dest.h = 7; + + SDL_FillRect(screen, &dest, SDL_MapRGB(screen->format, 0, 0, 0)); + + dest.x = color_picker_x + color_picker_left - 2; + dest.y = color_picker_y + color_picker_top; + dest.w = 5; + dest.h = 1; + + SDL_FillRect(screen, &dest, SDL_MapRGB(screen->format, 255, 255, 255)); + + dest.x = color_picker_x + color_picker_left; + dest.y = color_picker_y + color_picker_top - 2; + dest.w = 1; + dest.h = 5; + + SDL_FillRect(screen, &dest, SDL_MapRGB(screen->format, 255, 255, 255)); + + + /* Determine spot for example color: */ + + color_example_dest.x = color_picker_left + img_color_picker->w + 2; + color_example_dest.y = color_picker_top + 2; + color_example_dest.w = r_final.w / 2 - 2; + color_example_dest.h = r_final.h / 2 - 4; + + + SDL_FillRect(screen, &color_example_dest, SDL_MapRGB(screen->format, 0, 0, 0)); + + color_example_dest.x += 2; + color_example_dest.y += 2; + color_example_dest.w -= 4; + color_example_dest.h -= 4; + + SDL_FillRect(screen, &color_example_dest, SDL_MapRGB(screen->format, 255, 255, 255)); + + color_example_dest.x += 2; + color_example_dest.y += 2; + color_example_dest.w -= 4; + color_example_dest.h -= 4; + + + /* Draw current color picker color: */ + + SDL_FillRect(screen, &color_example_dest, + SDL_MapRGB(screen->format, + color_hexes[COLOR_PICKER][0], + color_hexes[COLOR_PICKER][1], + color_hexes[COLOR_PICKER][2])); + + + + /* Show "Back" button */ + + back_left = + (((PROMPT_W - 96 * 2) + w * 2 - img_color_picker->w) - img_back->w) / 2 + color_picker_left + img_color_picker->w; + back_top = color_picker_top + img_color_picker->h - img_back->h - 2; + + dest.x = back_left; + dest.y = back_top; + + SDL_BlitSurface(img_back, NULL, screen, &dest); + + dest.x = back_left + (img_back->w - img_openlabels_back->w) / 2; + dest.y = back_top + img_back->h - img_openlabels_back->h; + SDL_BlitSurface(img_openlabels_back, NULL, screen, &dest); + + + SDL_Flip(screen); + + + /* Let the user pick a color, or go back: */ + + done = 0; + chose = 0; + x = y = 0; + SDL_WarpMouse(back_left + button_w / 2, back_top - button_w / 2); + + do + { + while (SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + { + chose = 0; + done = 1; + } + else if (event.type == SDL_ACTIVEEVENT) + { + handle_active(&event); + } + else if (event.type == SDL_KEYUP) + { + key = event.key.keysym.sym; + + handle_keymouse(key, SDL_KEYUP, 24, NULL, NULL); + } + else if (event.type == SDL_KEYDOWN) + { + key = event.key.keysym.sym; + + handle_keymouse(key, SDL_KEYDOWN, 24, &r_color_picker, NULL); + + if (key == SDLK_ESCAPE) + { + chose = 0; + done = 1; + } + } + else if (event.type == SDL_MOUSEBUTTONUP && valid_click(event.button.button)) + { + if (event.button.x >= color_picker_left && + event.button.x < color_picker_left + img_color_picker->w && + event.button.y >= color_picker_top && event.button.y < color_picker_top + img_color_picker->h) + { + /* Picked a color! */ + + chose = 1; + done = 1; + + x = event.button.x - color_picker_left; + y = event.button.y - color_picker_top; + + color_picker_x = x; + color_picker_y = y; + } + else if (event.button.x >= back_left && + event.button.x < back_left + img_back->w && + event.button.y >= back_top && event.button.y < back_top + img_back->h) + { + /* Decided to go Back */ + + chose = 0; + done = 1; + } + } + else if (event.type == SDL_MOUSEMOTION) + { + if (event.button.x >= color_picker_left && + event.button.x < color_picker_left + img_color_picker->w && + event.button.y >= color_picker_top && event.button.y < color_picker_top + img_color_picker->h) + { + /* Hovering over the colors! */ + + do_setcursor(cursor_pipette); + + + /* Show a big solid example of the color: */ + + x = event.button.x - color_picker_left; + y = event.button.y - color_picker_top; + + getpixel_img_color_picker = getpixels[img_color_picker->format->BytesPerPixel]; + SDL_GetRGB(getpixel_img_color_picker(img_color_picker, x, y), img_color_picker->format, &r, &g, &b); + + SDL_FillRect(screen, &color_example_dest, SDL_MapRGB(screen->format, r, g, b)); + + SDL_UpdateRect(screen, + color_example_dest.x, + color_example_dest.y, color_example_dest.w, color_example_dest.h); + } + else + { + /* Revert to current color picker color, so we know what it was, + and what we'll get if we go Back: */ + + SDL_FillRect(screen, &color_example_dest, + SDL_MapRGB(screen->format, + color_hexes[COLOR_PICKER][0], + color_hexes[COLOR_PICKER][1], + color_hexes[COLOR_PICKER][2])); + + SDL_UpdateRect(screen, + color_example_dest.x, + color_example_dest.y, color_example_dest.w, color_example_dest.h); + + + /* Change cursor to arrow (or hand, if over Back): */ + + if (event.button.x >= back_left && + event.button.x < back_left + img_back->w && + event.button.y >= back_top && event.button.y < back_top + img_back->h) + do_setcursor(cursor_hand); + else + do_setcursor(cursor_arrow); + } + + oldpos_x = event.motion.x; + oldpos_y = event.motion.y; + } + else if (event.type == SDL_JOYAXISMOTION) + handle_joyaxismotion(event, &motioner, &val_x, &val_y); + + else if (event.type == SDL_JOYHATMOTION) + handle_joyhatmotion(event, oldpos_x, oldpos_y, &valhat_x, &valhat_y, &hatmotioner, &old_hat_ticks); + + else if (event.type == SDL_JOYBALLMOTION) + handle_joyballmotion(event, oldpos_x, oldpos_y); + + else if (event.type == SDL_JOYBUTTONDOWN || event.type == SDL_JOYBUTTONUP) + handle_joybuttonupdown(event, oldpos_x, oldpos_y); + } + + if (motioner | hatmotioner) + handle_motioners(oldpos_x, oldpos_y, motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y); + + SDL_Delay(10); + } + while (!done); + + + /* Set the new color: */ + + if (chose) + { + getpixel_img_color_picker = getpixels[img_color_picker->format->BytesPerPixel]; + SDL_GetRGB(getpixel_img_color_picker(img_color_picker, x, y), img_color_picker->format, &r, &g, &b); + + color_hexes[COLOR_MIXER][0] = r; + color_hexes[COLOR_MIXER][1] = g; + color_hexes[COLOR_MIXER][2] = b; + + + /* Re-render color mixer to show the current color it contains: */ + render_color_button(COLOR_MIXER, NULL, img_color_mix); + } + + + /* Remove the prompt: */ + + update_canvas(0, 0, canvas->w, canvas->h); + + + return (chose); } @@ -22709,8 +23055,9 @@ static int do_color_mix(void) * @param int the_color - the color within the palette (e.g., COLOR_PICKER) (its RGB values will be grabbed via global color_hexes[], and the new button will be rendered into the appropriate img_color_btns[]) * @param SDL_Surface * decoration - a decoration bitmap to be applied to the button (or NULL if none) (e.g., the color picker rainbow that appears around the color picker button's paintwell) */ -static void render_color_button(int the_color, SDL_Surface * decoration) { +static void render_color_button(int the_color, SDL_Surface * decoration, SDL_Surface * icon) { SDL_Surface *tmp_btn_up, *tmp_btn_down; + SDL_Rect dest; double rh, gh, bh; int x, y; Uint32(*getpixel_tmp_btn_up) (SDL_Surface *, int, int); @@ -22785,6 +23132,20 @@ static void render_color_button(int the_color, SDL_Surface * decoration) { SDL_FreeSurface(tmp_btn_up); SDL_FreeSurface(tmp_btn_down); + + if (icon != NULL) + { + /* Apply pipette to color selector entries */ + dest.x = (img_color_btns[the_color]->w - icon->w) / 2; + dest.y = (img_color_btns[the_color]->h - icon->h) / 2; + dest.w = icon->w; + dest.h = icon->h; + SDL_BlitSurface(icon, NULL, img_color_btns[the_color], &dest); + + dest.x = (img_color_btns[the_color + NUM_COLORS]->w - icon->w) / 2; + dest.y = (img_color_btns[the_color + NUM_COLORS]->h - icon->h) / 2; + SDL_BlitSurface(icon, NULL, img_color_btns[the_color + NUM_COLORS], &dest); + } }