From 7f24a0d6d8d27d6901b1c5d40002769c8bfadf15 Mon Sep 17 00:00:00 2001 From: Albrecht Schlosser Date: Sun, 21 Jul 2024 22:34:02 +0200 Subject: [PATCH] Update docs and screenshot for fl_line_style() (#1016) As a follow-up to the discussion I used the posted screenshot demo (thanks to Greg), redesigned it using Fl_Grid, and added it as a new test program, including Makefiles and CMakeLists.txt. New file: test/line_style_docs.cxx to create screenshot. Note that the old test/line_style.cxx is not obsolete, it can be used to test the line styles interactively. Docs have been updated in both chapter "Drawing Things" and the function description. Also added the new demo to test/demo.menu under "Images for Manual...". --- FL/fl_draw.H | 4 +- documentation/src/drawing.dox | 33 ++++---- documentation/src/fl_line_style.png | Bin 12988 -> 15818 bytes test/CMakeLists.txt | 1 + test/Makefile | 4 + test/demo.menu | 1 + test/line_style_docs.cxx | 119 ++++++++++++++++++++++++++++ 7 files changed, 144 insertions(+), 18 deletions(-) create mode 100644 test/line_style_docs.cxx diff --git a/FL/fl_draw.H b/FL/fl_draw.H index cc23b28e9..99fe1045f 100644 --- a/FL/fl_draw.H +++ b/FL/fl_draw.H @@ -224,7 +224,7 @@ inline void fl_point(int x, int y) { using \c fl_line_style(0). \image html fl_line_style.png "fl_line_style() styles" - \image latex fl_line_style.png "fl_line_style() styles" width=4cm + \image latex fl_line_style.png "fl_line_style() styles" width=12cm \param[in] style A bitmask which is a bitwise-OR of \ref LineStyles "Line Styles", a cap style, and a join style. If you don't specify a dash type you @@ -256,7 +256,7 @@ inline void fl_line_style(int style, int width = 0, char *dashes = 0) { /// \anchor LineStyles /// /// \image html fl_line_style.png "fl_line_style() styles" -/// \image latex fl_line_style.png "fl_line_style() styles" width=4cm +/// \image latex fl_line_style.png "fl_line_style() styles" width=12cm /// enum { FL_SOLID = 0, ///< line style: solid line diff --git a/documentation/src/drawing.dox b/documentation/src/drawing.dox index 140d73cee..809f9751b 100644 --- a/documentation/src/drawing.dox +++ b/documentation/src/drawing.dox @@ -433,23 +433,16 @@ Please see the documentation for details. \subsection drawing_lines Line Dashes and Thickness -FLTK supports drawing of lines with different styles and -widths. Full functionality is not available under Windows 95, 98, -and Me due to the reduced drawing functionality these operating -systems provide. +FLTK supports drawing of lines with different styles and widths. -void fl_line_style(int style, int width, char* dashes) + void fl_line_style(int style, int width, char* dashes) + + \image html fl_line_style.png "fl_line_style() styles" + \image latex fl_line_style.png "fl_line_style() styles" width=12cm \par Set how to draw lines (the "pen"). If you change this it is your -responsibility to set it back to the default with -\p fl_line_style(0). - -\par -\b Note: -Because of how line styles are implemented on Windows systems, you \e must -set the line style \e after setting the drawing color. If you set the -color after the line style you will lose the line style settings! +responsibility to set it back to the default with \p fl_line_style(0). \par \p style is a bitmask which is a bitwise-OR of the following @@ -483,10 +476,18 @@ terminated with a zero-length entry. A \p NULL pointer or a zero-length array results in a solid line. Odd array sizes are not supported and result in undefined behavior. + +\note +- Full functionality is not available under Windows 95, 98, and Me due to + the reduced drawing functionality these operating systems provide. +- Because of how line styles are implemented on Windows systems, you \e must + set the line style \e after setting the drawing color. If you set the + color after the line style you will lose the line style settings! +- The dashes array does not work under Windows 95, 98, or Me, since those + operating systems do not support complex line styles. \subsection drawing_fast Drawing Fast Shapes diff --git a/documentation/src/fl_line_style.png b/documentation/src/fl_line_style.png index 55683801e8bbfde5128d031a95f68fce3d28cc49..2e0b29cdbc98cb934d14aec70e88bcf70eef968c 100644 GIT binary patch literal 15818 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�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 BO{D+; literal 12988 zcmXwf1yCJL(=~3v-Q9w_ySoHWaDoPRE*j+GT-@Cqg1b8e3GNW=;_mj7=l%Yw*{#{$ znVz1Wv!{EjI$TXf76pkA2?7EFMP5$o3j_pI2m}PAFbwpE1mq5D3IRdU1<=%W{bJ%l z?&$1bVQp(p?&{@ePHygLZ2Y*M{r1KJ?H~OXp7)Sh#~9~d&|I`TG&R4ftJ_@k z^XYNpsB`=NJp-gDY<4BsVtn3xOJF{|i7&AE>HW&T+QsLbVr}v9zBP^FJMzz*)%K=y z!k5#jO&NzS)OVC;2b0&A!*4C)Px>!J$k!NWC!30W&GdUy=b~L_e}pqGbMb{|k zDLGp&Tf-a8avvb>In6LHt~)*Z<=Ar!fSXx;?)?bK&LWeHxkQ5kiEj5|So1<~7<#h{ zgZoZJhyR|Lt@^IH&a;@M?0h+INxRy4e=&bs|1?#Fc+il%_t|x5FUc*cPoS^HL0?8{ zgRj(cJ*DQ{AA3;@X4YVT45poAzjaXVOvgEd2;37Aey)nqE{NoxKz#)sFxDrB;%Sf7 zw~!iq{!9Ex4^hn$jGaOz)l;;K7j(lOtmIf~lKtB|qCMqlHzx(MA6;3FLL)W_!7UKS zjM87Ba#u~2VleTG3eEi7mnn*hK4%ua(iKJeUxo3CkT!~poj}4L<*mtIe^hin;)<=$ zl@4ov`_XwlJ((qVex^VDd_fh(_h+OaN+6xUH(rEulIxnOev;?;ijnEab5Bd#!0z^x zr>tQ|Mew}t*!~;$Usb-#!UR?Jl5F=U%ejr(x64~Hso$OI*SufaYJFs)brc_4La;Ka z2cyCs!3drdHd0Xo+7q^J>;P#M_WIu%IHQ~+gLO?AD<=Q z4IQ6pG|)dfF17t3Uw@;Y@uu?{)|q{XSDW}E(in*tyj(qm8mv|T~AtJK)C)}}3PXVJ;uV4l4W+C{w_Z{|Y!94UQV6*P6`PD-z8*OrFw_Ug~_X(D&4gOngiA79yzpe?E8y#hq9vZ zzKUj(9ihD-bW$%8O+;z^$VJy-b+vwgGx z9iOLG=m>6iF+Fz?eYeKCQb6znMXz;kN@XYfa2gPD@Z8&~(@jU!*)(!o3R zQ$_08dg$}@zKNt`edQ$7_eHqo%NXh+03f@S?~4BNP0BRxmnBaCIm9!J%_34Xgl(cQ zXEn>WV38L6RpQ>$Nnff2M!xFo@=v8~ zoNzN(?Qu?@MMxazqDw57zshKlm47HT&ZE)^wD*4|Qa1J6N;voSuv|?v;ts&HKq}BX z2Wz{9Ue$ZBBT7?@e90!iO!KO2f&V*MLl2ywY#rkZP($>FTY*@LD}lUPl^657hrdM; zsXKCsJitoR-=@2Q^{F8EGcrKQjDwIgA*Xs{ECUZcaYv9WzM{%NHrTuV$qfNC3`uwC zDqn~Fqo{HQdVHTln?OWzng#_IT}Fy53405$D}@S%)$w8o;U*d|RPp@+2{~SMi#56= zUb+yn5GP&ObPfKjOtp(LVNl!J3!IfhN}bOVZ#@)YzV2pMpuP6WgqD&ZZzci>6)Gwh ztbS*}=oIpk63NJ1;g^xpDhgowgfC@d%Dzsj6#t~Q&nU1ez2_)EawfW!9ZMcN$W5VF z2(;LDPJa2aBe{R>+e5luCZfK9`e?3dH%RVTt2Ty2izQFt45<*TEIB0Js7w#BCwy<5 zS_tXJEB3OSMyVB&K4zX{3}LT*Z5FUO6v~i^XnN|U${TjoZ)?A4oi|qt*~3mHA%(8> z8^`l^*UoiVB2J)vz&CkC$TLrt3-d*y4kNXsCrkA6xk%EiZVgS;z()rA*==Zfed zm@&7C`cq?HwWG5U-|$s}trHrCRKCu5v9-*?LH9tK3%`85Y&dx*AQIb!@lkH*m*yNS zA411XhttQ>@E+SI;>Jm;_wm}4mvxi#yrk#mUL z%3%l~Ls|hW40V%*YYoCOl;r8#Sl)=hz4Eex&kE2WSr}=M66bxG8JYq$go_wW>MuzO z7c|BmVgfo|v9#QDc`taY^QaQpx>G2w;iz%t{CO&A4rGyz1Y#X=*__~N6sSy$&$3Ig z_SThpgi>_-RfTaRy$Y{5`%p0pKcN-igo^=?zG0_n@YY=*lKwuXEg!RFHmg>GL7QEa z3|;FM$HFgpq`AT0(vW~?p=vULz2+#se#P-;RQH>69;b1r1K0%g>Xg-MOW0RQvP3;l zQgu5u4pP>=oDjTfBW%5Yg(rcqGIZ(>h9r(B%{zn(`Z7AVu zlI%j_X9EtR*FAN0f>gY!+?@HMkS}+}R&sW_A)bS@<$s+J0rJRh!*K-ZOnkRNIJazc z7Qt&asYcYO0C-8{{Ct5=dQr8-)nz0%Q3xv>xPe+GFg`>KNaNyX>98kaNJW~Cuya^p z6Vb;+47OGY0+hr_w&y+Y8>DW!8WhoK{6`V38coCG-m#w$Dx5X6sV<=)sf$627A8*A zVaDWfMa-g9A=~@PYPIAGzSCR@^bSbAd3LSB5h1YmC^eG5QNkHCx5V>`JJ(p~wI)s| zY`k=|^UC7}BNoKOCn2dQQ)}*f9BhXW&E|sRJ4VB_6Q1mQID?=Z^raqy#z}nOpT3&J z#}vj?a+aq4s=((c1dL9T8e4E0d+3kq+pGMzq*{t(Ysk~P=5Uu4_5a5_06 zo65qfc4L8EM{#6*Q7^oMLhy)KgtdCLOM##F@V6lMJiZ-jk>^no9C*2jb-~mlJ+m*4 z*kV}s#65#$3w`tydwS5S3iReQ6nzAH(S$R7H{|p!I}htQ<5{^U8R=-GLTQ8U8w&WS z&=PbDmIY@0lp}L2&&ZrR5vA6ejB?3w->eb`Q8IszWlF%FXg7Al_UP)fkM~NzQY*Ow zw~&Vh3iY%CL`(u{so^;#pym7+(h_%V$PH}JUnG+Qs;NoGAaL3R!|ktvJ$1=@=;GLt zJmb-_sC_E-3oPshW1q_j8stJ$f2e~Hb%NX2tJJSie&>DKVX-pwpd=0e87JxSXQUz^ zY%mrvM_GIx`B_2?{wU{ecSct9Pbm}ZohoEI zL)Y4%dGokh=zzfMxRt1xDf1&c?f7fzAtuMAfi|eZSgyH1w6sE7gc0N!5f6l~o#m86 zr9pu4zMN5_7fM4YyO=3@4~mY7z#J&`XXK1Q*oyh4-w-p<@v)NaJ11s;t2-Y*g?^Ef zgApuK3bP+Mxj-F~)SHwsoQ&9!iPI`V4R?suV0B3xIeB!#JE4nzeF%HPdR(pe8+KaQ z6ybx7i)@(qR9i*q?YK83WN@&H`W;+*)@GleY;G1xL3iwe}+;U#r?SW;?4 zY-ZkZRVXfMkgqP0U$FOI3lS*{UDK`6yM60bTYo?NB@7ay{Hd`Asc-QJapvuW_4UPZ zikOb0zfPvvo7@I!)916*wGdBuPFyggB{J1ovO@7nHV_sD-Hf$c_U-1#hgnyfoXAb>gDF>-W(yiQ`0^2vt zpPgnVrZDu}Lp1RtWKVGC&W3{6wyNCGrW*>?fILqagElc}K~tdUWmRs})OJ5gb%IUW zwgB;EQX8qi&~csG%RcC(A%a>)u^AU7@HX?Nb8j&HimA*~$hExG97vX9Nn9i?j_7=F z5KALaOpvH;DOzFVC$z88W7*)n2K)Kb(Lhf-|?tG21^1raWq#6WNi>3ze(>zJ|21%+<-uwe0E=K^JB2+ff1&J0@w zbxfqjr3>^MPNesB$CUwsVVYE|k`8Iol6`-r#EFB-EF-k8w4UK@e2QuAWbdw%bmtc{ z9#?r`OnB`>US;VD-spiPY1HTL(TVu9s zHlSOidjykmXuae(R8kKj&TGVhljNq+`X$P&AM!3hhLF zd&h)?)jonHwOfV`c0V;=h#Se6s*m2?hqIM~I@p&Mv|Vgdpp@CFxMYvFZqtse)2hz- zdYFH_iwFflOUo6eC9GMwd1_eN&n_unYBfDC@Jw2ZuCt1xkgo%Ua5V9~kjRQK+G6OMFjq*y zaJ`kmkv!iUj8YQiKjVd@8U1i@;F4;Mwkc;RBrC$>1#%y|4o(#Cp9K&FCsqZ99~!O5 zZ{BS&UXx1$H5kwVrz;qU+8Yzr9-5Nq;V3YSVGn<4wiXTJ?yq5hg@M*K*yRaP?rWMB zf>g?OyqOTVvn8a~`88-V0t-XKW#VDIwz+EMfz4 z0-Js2M7gPTBRXYVxq9j9&=e)pUbQPGmPrj+ScXDY_~R?7*0O#m5@RDrXmz3(#c>Ga z>IB%$+Jo=Yo*4SYI`KQU?CLC(Eh>^>*HDA`!gcva?nf{BK3R42Lf7s+PPmHV1hny* zaRY<%+%P_l+AE8B=ynjfw?o)pjWEIRV`o-LO&qKTidK9LuaXsQEXASkbc_R zRa$16R|~_XvG^xi(aGjGR0wL~#JH7arfeV$Xp4 z9C);k@;yDsNnxNP#c$tgWG7b$t7OrIh|-s7z_Lk}2*+**7O8qam$mUys14A+oehGR zKuZm^>wm;0Ri-AF)%JWtA+$zb@> z&=~CohnT&Asnycxa$s6DZlaC>+#>QXb*yjPQ*q*y!dD}zG2zP^Djm5{Quy^(1x{H3 zF105&u>SB@(}bYDKn9;2iJ<1z^ICk^n)D#2)T zs4}6p54#c4GjPOAqTs;~k9b<|8-A*YP`*{HQkUJ%)wfmMw$s@wd%M{lMwW`&pE5gR z^~3(gZZNM&*gscpQ{xx~8!k#AdhekKan*to3w+?(yp}CF`_a}B_H<)o@YC;Xedx4{ zKT?O_zCaW^N&REN&vUfNux6hxvNM`ives%ot3YMxE7f@kTs0RyuP3)f#6vb)cIY*4 zxFPe2e9h~&l^jR=<$n0+e5Dc}Mt`eL`jk%ygDwmQFlAN5bDxT4S z`6AorVhH&%|4v|qbZ7H%F4p5-xZ{~rYY0zbB1Zql0>}MWV6Z3b?*YtH}CMPB5C{Pfg!zDFwq}VCZOue)?r1aU0NWwo! zCbU1qLwO?=dap{aex?`BQi&8w(I1PKaT2@L4J&Ix53G;fygcXNQppiwxN;#kYn#v!Hu)ycrlwl0!|h^%OEP~*&HU4`8mE|oc=-Z*z8re> zTYGzR=sLQi6G5G^(|j;zfUDvdG0D%*av~IHk*MS3cE*-lAoBobwK%uG-MU9UoftRv znGI4J4l4U!hi@`b=YPRLm%)Cr(cs`fdm!e*Qh-GykB2UZU8!H@h!MZ>Y82aniy`55 zoBGTaTfh6@MEqc%HEn3!{<$%672efH8uc2H#1k#FTs+~hbTx70b?@@B%$ab7wgA}6 zo7I*m?3D2fF5m8A)MgaRMrx|1l4Q6Wg|xf2UubLl=P;DpuXsf3c=LNkn@B;kvf+T* zxqPW<0VZUV?&;$U5>=OSO&evxCVisn-o?WCPv-F(!B=bZSUsqF1GzPqr zFgv(aI={rb9}fI-AnH>X8x7&o$6#9(0Do^Jt~e$S6p8IA$Jz=4-I1mDzigioMDf(? zlP*?lkd~|;%shS}9ktWRZN{%ewJWw_ylu%u9rqPx^f=RNO~@%;c6mQI zTVeVZQ<}G3q@j_BC$p8(h#?W{uFh+zc2%4_hAWmVDP$wFOhG~|3zpJKkcX)vX zBaZOb>E5`Q$Hq;n=G?BMNx#&Sgb-g~CB$!IWyVRIL_%(xK8GA;cc}fFf;J=>e!qZF zRPJv|%&Y7L>P<&X*#c7o8p1ikRP#XYB@ulQB~Zw4X(nO=6sBZ5uazgOM;1ujK6#4; zXw}UEE))_Ax$NueY3e5F z2YCwQV<+g1f`I!Zy|9vu=bf z=QhJN{`-p%bLVWsM|yQ|*h*Hyy>f89mEi2b^Sh>fsC}FhP^IsQPGsXPFQcH2P}}ML z)FhI$=p?^MYv-5a)-1;S`Oc|J>_A+c|G^dtfodYNZSqS(xXHZt_qqXZYC~5k#N0+A zTyY+q;oI4hdtw}~Bf_J1`=q~!{fiSbUd2-b;P7g{XL2S=;EpM!mG3t!0Xg5AlU50U6^ z^!ErN3HEVTT9r&D`1?G+;Uv%)F0EBVh~e(~awH66ZXPQH6V$Lx5r(&`HEc1sJQr4o zo-ERLDM@?(_ZBiY7wr%d4*O^!an#yt6y{fq@m$eObCF6BWuz!=XqjLS%|sK$hArOeqNqc&t}KqAohe!>MTarPOjwV z(&N>!9+Hdduh2kVFRf^o+LV7c$04qK8eG_ibfYM>;5nkCbU7O~1|?(oNi+`~->5CE zp@<9g_c~FT)*zq?Gm}5HvEjKX>D#kcFV=c>uy*lEcwnX@9pso zi^Evsm5Rkq`*?z;BAk1pmgs5X+BWcufjH-bN_PG_E5&+N-sNw;jO*JT9BD`E-5@DL zq?xlEIqE}%AY{V5Fz5L$LdM#vg}Dj2hfCOR4DK+a-O(?IQ>!`AbIyvpQO~`3Ar3R- zT?Xb|hPWbr&o5^&d)al5r>J$M{)Xmf=G*T)5j8q#{u~iCL2U2ev5nwO-bU%WHa1=o z)O|WTTRn6IS{bawQ49HnksLdR0~UIWXk77Mcr-4(O=ZtZkb(gBY`APz;~X>yQSmFQ zOAEy$&c1$Vf_>i8<}1u)PY)q?7majl<5c2%;sgq)hA?^)QVYoP8~DBI3_)BvNM@bu zFev0{t)2;OF_PFwRN#ceJ<|THYfR5ZFqP8M`kLD!j`l6n(c`7ozWi^ktlQ>3Y$Pa~ zeF|fwCpmb$yu5xYqy0alzRY<~L*R~ruEB3k2EPvwSq^8@>jM`jZVM2BXaWMt`&w{dAom@oM5S!eKCKRph4PiY<50aLF0!o8i0 z0&M!XkGgto)iUTsNIH7g-I6CvJ(GeP(;uZB=hl*vYVwkj|G$#sqkbbZOLJ2ZTOIq& zeZKO9_X|3vqEuo_zF-&UO<^TRHT(vyZ-tnCu$h!l=h=pJ*DlkDl?nU`CzYceqnIM>1c&YX$peU zZUC|0$@j1I-)EODs!L3#`nW~dONYNaDX>s8Sbwq+9cuUHK))a{D0AXXcXJ-&J4)uTwTlN>s)PLxUm#ie^wuh20`9 zh0lx4I<9i5!Mg!rGJLc-zDQhUoXuRJ3ifo6kW=e6k$`4VKo}Fe?<+G3@x=Gdcgzf! z)KV!u8JAnLRGToFrI^WVp!Mww)-LcFwOo&DZlg|uUt7ptW8%-Alg0m*!Jp*&6N;IfZZd?zJ$raP;v z;6ye4o(0Z!ZI_0!jdS5cnd-AV70WHlyt z4KGv0Y9F;sY-&oH(vUC^IvA9+bX;nLCJD0SOePg3`Z|6AzRHO!vk@YlJsoi?FU|Mw zZzq{|r|qxrFUi=q3?Fk59p&^~ARt(%{#}rsMWXH>LU>nsWodXYJT?|3B`*Uv;6p^< zDy{1(>0oDPZtn^q>1=M|YW|(v!`jt~TvlFLP3I>n-ba-cx4e|Nrsv9O)~`q+dE8JU zk~>nBuL!t4d;~E4sJxCDB&nw^Y`xVz{(+X2ds`Fc*^#JsfsrK0zQ_o)YqtH-B*+oG z(}-C;t-p++;VX=5XT($ulDOjAifr6EtIM@L7HbyTl{{)LukQ`rl7`+4y-49?2;lms z2{qVYB-tu4`u&qV!|2CJ$nXOx{xw>Hw~RLYy@${ILkBed9K-NHV}yUr+r%^bj=A7B zJeq+?%jNT(4w?oTJ*Q768L-vawhr~RVQTjVpNueV{2-#tr!ZxQ694IN^CEWh-H#xD zSwJarXE^89Ss$YRGZn{61JW;aU^9rzMIS;kXUvhrlmgkzJe76$jzEPV&V*@z62CYl z&nD)S^QH{hi~_fptrJyxgi=&uLIC2$1eA^)1BOIpatiXu-(01GbN=aSyWtiMKLMu-DezbR8xgg))N) z*`G9lL=?36)y_iJWcA~Ia{xB|^^OjEK(q*d*SdLWx*1}>UP`}N!7;4lo4GxZz`TWI z$07_7IR4-nC|c*xPv3G_ZSO}^M=IPE^c5f-Y{Qli{*o|-^UKOEyBJ4 zDJy2`$&oA=fiE0r{r`skDnwmA72Uu$N!0>=W48}U%^bhy#|2xk=E(LIws(xOy0A?! ze0XIXziv4#uJuHNz&?b&O0xHY_C&g>fBTBId!m=E;$!PfCZ3Bqom{_)zb9{7M6FU3 zPwvItxAzLQMrOP?%UPuAefUy^gV@W55$pBVv8&mdho#|;=ff=bu(BTtAmwT^Vw832jc6(rWa^G&gDu4cOLpA$8GSktZvT>j?|Z)9HvN%=6I`=x)6JIcVB z3Y`)eQ%(B*?@@K=%p98kPV!sD2PV{T|MK)p#cXyyt+F}zApM*C4Owf94Wocd%G<5< z%fBNY{5ax7pcN=jfuMYU2~)C&BWjo)ZHDlp^WhPYT5IdgO^`Im7{?}ZFTBgGm-<5s0TKlH26W%Ms3q{n-!RH~{2Mu@W-_S_4 zb5Wxw_JX)TZ{&joImPU205t$8yUMQ}*8676O_vlT;-;kc6S-n*W|pp_$gLHLv@?$* zbI4Ht0$g9NL0X{0)Q{wO)6S>@sGn}tR|JU|0?)i|cAN8LF$j9Ir zI(MFrIVlA4QC)-QtJvTf*(&!Di(%V^{Y443iFXld@0$z{hLahOrQe&6gAQCkIH9M3 z{0U8=r@K#0R+*06N0Tg4Pl%U#*I+N9o$ZGpbapp_KfF z>JMf<0be%?MIXyW1uk6ig{$rEumrexG5oCFn%N9~Nk4b$yL6OVUY+|>kV0bnF&KNNK^LfX0UmYn@>aJ% z1>Ed*nh42QfB2Mcke*r6^JW0#RVfC%y#&|0^L)G(5FAW=p7gpAFbCs}#h%RgR|m?9 zG6!rgR@A)7t$QmAd*1N--?C~O34b@X;uQJEuOBT~7VRGQe^?hphI&5ZD_Lw{_(mo{K^Vd)6j|VM{cha zp7Do*J1dkqQ2L%SSJhMT*ck_aflv5>roAI+n9TM8W+2BuXXSFP#V3aUmqFe1Vsy<_CraAij*o$ z|79peT;94NOzVD~ImmD&()dcNdzev!?L_%$$Ar#?TVn8`@{V$(wK#U1Ek`y7EZyS= z==i>r=EiR!L9%ivU3&!{+>r4wXxf{h17NVtuu(h#IXkQXz4@F!O?`L(7$?sz5rMMZ z>ycYj$KiPQ)IRS`-uFI2#At~G$#r-?_wRqz6FXY726~+0dC;Lftns%YO3QCtIBTx1 zE*(qf?#vuBkNr{Aw(&lBzjfJNGGq<(^?RS58fR1Wp*fY#)$)osvs?GZumapDAS(~* zEEvLkb?6Ty(9XsCnU)nD)QRAVP`u{Rf+xN#{KRlW$)+7tccGb3*AylwHe^oto5m*{gz|^t?H+CVlmakgb_SC-rq6cuQ1Gq7Zu8 zEe()0y1NGdIGpij@xDnC0(E7R`u;kY(OEBG?e)4zx(6#dlKSomKVjYs1jyEq9hoJ1nMSPWZ91_+?cQun=L?rhDG( zO6$2p)lU={o!JF~FJJb2r)m$gU@Hqqb7o0jnb_jZN`#-rr=@&oZo!TC`KOTY zp@Iy(*ErZ32>#2|79uG+)LWYW$0irxU(JyJkDMJMLoH$VCKJgZL(E{IHvOF7p2#B%<<4q<8ela6GhzC-#fV4Ukg12%ZehVxTJ07PV50ZZ$|O8rV2JMz<4PM7q8si z;(8iKPNcpZGV|A9Ug4*hmZ-0?#0O@58^yGwuQDWk1);JIPriIb9Ko{PI8;J_Q+y}V zSCKCGPan=NNp&V86*lQ9Xx0w90N=t3J;k%n5nO;zhyKfvZ%q*#u+NzP%MkJifaYXc zx+(w55dQC83qg#q{Y z>G$9)GppVLkC;4I&;~bP<~rpyn7{~zDE ongsm!b7ERaU}}8g|3Wqnw^ydQys7^2mjxj&ts+$|VI27X03Ue?;Q#;t diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 692730db1..a92d700a3 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -129,6 +129,7 @@ fl_create_example(input_choice input_choice.cxx fltk::fltk) fl_create_example(keyboard "keyboard.cxx;keyboard_ui.fl" fltk::fltk) fl_create_example(label label.cxx fltk::fltk) fl_create_example(line_style line_style.cxx fltk::fltk) +fl_create_example(line_style_docs line_style_docs.cxx fltk::fltk) fl_create_example(list_visuals list_visuals.cxx fltk::fltk) fl_create_example(mandelbrot "mandelbrot_ui.fl;mandelbrot.cxx" fltk::fltk) fl_create_example(menubar menubar.cxx fltk::fltk) diff --git a/test/Makefile b/test/Makefile index 8145134af..c6401b262 100644 --- a/test/Makefile +++ b/test/Makefile @@ -91,6 +91,7 @@ CPPFILES =\ keyboard.cxx \ label.cxx \ line_style.cxx \ + line_style_docs.cxx \ list_visuals.cxx \ mandelbrot.cxx \ menubar.cxx \ @@ -180,6 +181,7 @@ ALL = \ input_choice$(EXEEXT) \ label$(EXEEXT) \ line_style$(EXEEXT) \ + line_style_docs$(EXEEXT) \ list_visuals$(EXEEXT) \ menubar$(EXEEXT) \ message$(EXEEXT) \ @@ -494,6 +496,8 @@ label$(EXEEXT): label.o line_style$(EXEEXT): line_style.o +line_style_docs$(EXEEXT): line_style_docs.o + list_visuals$(EXEEXT): list_visuals.o mandelbrot$(EXEEXT): mandelbrot_ui.o mandelbrot.o diff --git a/test/demo.menu b/test/demo.menu index e608f54e8..2869c6cf9 100644 --- a/test/demo.menu +++ b/test/demo.menu @@ -103,6 +103,7 @@ @i:clock:clock @i:popups:message @i:boxtypes:boxtype + @i:line styles:line_style_docs @i:Resize Examples\n...:@ir @ir:Example\n1:resize-example1 @ir:Example\n2:resize-example2 diff --git a/test/line_style_docs.cxx b/test/line_style_docs.cxx new file mode 100644 index 000000000..650918474 --- /dev/null +++ b/test/line_style_docs.cxx @@ -0,0 +1,119 @@ +// +// Line style image (docs) for the Fast Light Tool Kit (FLTK). +// +// Copyright 2024 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// https://www.fltk.org/COPYING.php +// +// Please see the following page on how to report bugs and issues: +// +// https://www.fltk.org/bugs.php +// + +#include +#include +#include +#include +#include + +// constants + +static const int len = 35; // length of line segments +static const int sep = 15; // separation between items +static const int width[] = {0, 4}; // line widths (thin + thick) + +// This class draws a box with one line style inside an Fl_Grid widget. +// Row and column parameters are used to position the box inside the grid. + +class StyleBox : public Fl_Box { + int style; // line style +public: + StyleBox(int S, int row, int col) // style, row, column + : Fl_Box(0, 0, 0, 0) { + box(FL_FLAT_BOX); + color(FL_WHITE); + style = S; + Fl_Grid *grid = (Fl_Grid *)parent(); + grid->widget(this, row, col, FL_GRID_FILL); + } + const char *style_str(int style) { + switch(style) { + case FL_SOLID : return "FL_SOLID" ; + case FL_DASH : return "FL_DASH" ; + case FL_DOT : return "FL_DOT" ; + case FL_DASHDOT : return "FL_DASHDOT" ; + case FL_DASHDOTDOT : return "FL_DASHDOTDOT" ; + case FL_CAP_FLAT : return "FL_CAP_FLAT" ; + case FL_CAP_ROUND : return "FL_CAP_ROUND" ; + case FL_CAP_SQUARE : return "FL_CAP_SQUARE" ; + case FL_JOIN_MITER : return "FL_JOIN_MITER" ; + case FL_JOIN_ROUND : return "FL_JOIN_ROUND" ; + case FL_JOIN_BEVEL : return "FL_JOIN_BEVEL" ; + default : return "(?)"; + } + } + void draw() FL_OVERRIDE { + int X = x() + sep / 2; + int Y = y() + (h() - len) / 2; + draw_box(); + fl_font(FL_HELVETICA, 12); + fl_color(FL_BLACK); + // draw the text + fl_draw(style_str(style), X, y() + h()/2 + fl_height()/2 - 2); + X += 110; + for (int i = 0; i < 2; i++, X += len + sep) { // thin + thick lines + fl_line_style(style, width[i]); + // ___ + // | + // | + fl_line(X, Y, X + len, Y, X + len, Y + len); + X += len + sep; + // ___ + // / + // / + fl_line(X, Y, X + len, Y, X, Y + len); + } + fl_line_style(FL_SOLID, 0); // restore to default + } +}; + +int main(int argc, char **argv) { + Fl_Double_Window win(660, 340, "fl_line_style()"); + win.color(FL_WHITE); + Fl_Grid grid(4, 4, win.w() - 8, win.h() - 8); + grid.box(FL_FLAT_BOX); + grid.color(0xd0d0d000); // margins and gaps + grid.layout(6, 2, 4, 4); // 6 rows, 2 columns + + // first column + StyleBox sb00(FL_SOLID, 0, 0); + StyleBox sb01(FL_DASH, 1, 0); + StyleBox sb02(FL_DOT, 2, 0); + StyleBox sb03(FL_DASHDOT, 3, 0); + StyleBox sb04(FL_DASHDOTDOT, 4, 0); + + // empty box in row 5 + Fl_Box empty(0, 0, 0, 0); + empty.box(FL_FLAT_BOX); + empty.color(FL_WHITE); + grid.widget(&empty, 5, 0, FL_GRID_FILL); + + // second column + StyleBox sb05(FL_CAP_FLAT, 0, 1); + StyleBox sb06(FL_CAP_ROUND, 1, 1); + StyleBox sb07(FL_CAP_SQUARE, 2, 1); + StyleBox sb08(FL_JOIN_MITER, 3, 1); + StyleBox sb09(FL_JOIN_ROUND, 4, 1); + StyleBox sb10(FL_JOIN_BEVEL, 5, 1); + + grid.end(); + win.end(); + // win.resizable(win); + // win.size_range(win.w(), win.h()); // don't allow to shrink + win.show(argc, argv); + return Fl::run(); +}