From 4d3bdeaa77cf1ec7c5d97738509ecec4fdf4b7e7 Mon Sep 17 00:00:00 2001 From: REBOL Technologies Date: Wed, 1 Sep 2010 09:55:48 -0700 Subject: [PATCH] RT R3 A105 Hostkit for Win32 --- about.txt | 37 + info.txt | 28 - lib/r3lib.dll | Bin 397312 -> 397312 bytes lib/r3lib.exp | Bin 3901 -> 3879 bytes lib/r3lib.lib | Bin 7504 -> 7470 bytes make-cbp/r3.cbp | 163 +++++ make-cbp/r3.workspace | 6 + makefile => make-gcc/makefile | 54 +- make-vc6/r3.dsp | 277 +++++++ make-vc6/r3.dsw | 29 + make-vc9/r3.sln | 20 + make-vc9/r3.vcproj | 367 ++++++++++ src/agg/agg_compo.cpp | 51 +- src/agg/agg_compo.h | 8 +- src/agg/agg_font_win32_tt.cpp | 148 ++-- src/agg/agg_font_win32_tt.h | 22 +- src/agg/agg_graphics.cpp | 260 ++++--- src/agg/agg_graphics.h | 77 +- src/agg/agg_scanline_bin.h | 8 +- src/agg/agg_scanline_p.h | 50 +- src/agg/agg_scanline_u.h | 114 +-- src/agg/agg_truetype_text.cpp | 302 ++++---- src/agg/agg_truetype_text.h | 54 +- src/agg/graphics.cpp | 399 +++++----- src/agg/rich_text.cpp | 259 +++++++ src/boot/draw.r | 281 +++++++- src/boot/graphics.r | 61 +- src/boot/version.r | 2 +- src/include/agg-draw.h | 70 +- src/include/agg-text.h | 66 ++ src/include/ext-types.h | 4 +- src/include/host-ext-draw.h | 753 +++++++++++++++++++ src/include/host-ext-graphics.h | 528 ++++++++++++++ src/include/host-ext-shape.h | 350 +++++++++ src/include/host-ext-text.h | 228 ++++++ src/include/host-init.h | 407 +++++++++++ src/include/host-lib.h | 6 +- src/include/reb-evtypes.h | 4 +- src/include/reb-ext.h | 28 +- src/include/reb-gob.h | 6 +- src/include/reb-lib.h | 393 ++++++---- src/mezz/view-funcs.r | 4 +- src/os/host-ext-test.c | 191 ----- src/os/host-main.c | 21 +- src/os/win32/host-graphics.c | 1199 ++++++++++++++++++++++++++----- src/os/win32/host-window.c | 35 +- src/tools/form-header.r | 2 +- src/tools/make-host-ext.r | 29 +- src/tools/make-host-init.r | 3 +- tests/caret-test.r | 74 ++ tests/dev-small.jpg | Bin 0 -> 2324 bytes tests/draw-test.r | 507 +++++++++++++ tests/gfx-pre.r | 677 +++++++++++++++++ tests/go.r | 81 +++ tests/shape-test.r | 90 +++ tests/text-test1.r | 110 +++ tests/text-test2.r | 123 ++++ tests/text-test3.r | 99 +++ 58 files changed, 7823 insertions(+), 1342 deletions(-) create mode 100644 about.txt delete mode 100644 info.txt create mode 100644 make-cbp/r3.cbp create mode 100644 make-cbp/r3.workspace rename makefile => make-gcc/makefile (88%) create mode 100644 make-vc6/r3.dsp create mode 100644 make-vc6/r3.dsw create mode 100644 make-vc9/r3.sln create mode 100644 make-vc9/r3.vcproj create mode 100644 src/agg/rich_text.cpp create mode 100644 src/include/agg-text.h create mode 100644 src/include/host-ext-draw.h create mode 100644 src/include/host-ext-graphics.h create mode 100644 src/include/host-ext-shape.h create mode 100644 src/include/host-ext-text.h create mode 100644 src/include/host-init.h delete mode 100644 src/os/host-ext-test.c create mode 100644 tests/caret-test.r create mode 100644 tests/dev-small.jpg create mode 100644 tests/draw-test.r create mode 100644 tests/gfx-pre.r create mode 100644 tests/go.r create mode 100644 tests/shape-test.r create mode 100644 tests/text-test1.r create mode 100644 tests/text-test2.r create mode 100644 tests/text-test3.r diff --git a/about.txt b/about.txt new file mode 100644 index 0000000..22266aa --- /dev/null +++ b/about.txt @@ -0,0 +1,37 @@ +REBOL 3 Host-Kit Source Distribution +From REBOL Technologies in Ukiah, California + + Version: 2.100.105.0.0 (alpha) + Updated: 1-Sep-2010/9:55:48-7:00 + +PURPOSE: + +The purpose of the R3 Host-Kit is to provide developers with a method of +building custom versions of REBOL, including built-in extension modules. + +SEE: + + http://www.rebol.com/r3/docs/concepts/host-kit.html + http://www.rebol.com/r3/docs/concepts/extensions.html + +FEEDBACK: + +R3 Chat is the forum for comments, feedback, code changes, and questions. +Type "chat" at the R3 command line. Most users only need to know about +five commands. Type "help" for doc pages, and "?" for a summary. + +HOW TO BUILD: + +We have included project makefiles for various tool-chains as make-name +directories. Some of these can be run directly from their directories. +Others may require you to move their files to the top directory. + +For some types of builds, you need rebol.exe in your build directory. + +That's it for now. Be productive, lean, and quick, + +-Carl + +Carl Sassenrath +REBOL Chief + diff --git a/info.txt b/info.txt deleted file mode 100644 index 944e38f..0000000 --- a/info.txt +++ /dev/null @@ -1,28 +0,0 @@ -REBOL 3 Host-Kit Source Distribution -From REBOL Technologies in Ukiah, California - - Version: 2.100.104.0.0 (alpha) - Updated: 26-Aug-2010/20:41:49-7:00 - -The purpose of the R3 Host-Kit is to provide developers with a method of -building custom versions of REBOL, including built-in extension modules. - -The license for the R3 Host-Kit is free for commercial, educational, and -hobby uses with "free" meaning "no charge" for such usage. However, -there are a few minor restrictions, so please read this document: - - http://www.rebol.com/r3/docs/concepts/host-kit.html - -Also, if you make a useful addition to R3, please consider publishing it -to the REBOL community. It's a good way to get others involved and it helps -promote the REBOL zen way of programming. - -NOTE: To build R3, you need a copy of rebol.exe in your build directory. - -Enjoy the Host-Kit, - --Carl - -Carl Sassenrath -System and Language Designer - diff --git a/lib/r3lib.dll b/lib/r3lib.dll index 3e4d1120f1b1af6bde335ae5028319f8e6fefe37..9b92f21746f14b12d6ca4975c4399ef1e4cf7e61 100644 GIT binary patch delta 74546 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

|7Lr@;V~-3ptINmOBRz7Fqr zK)Bd;u?B@O^0Sc-WjRm{J~4nwstK)EXuOo^c*WrZ-nlj{sQxA{Hq$k|Pz>-IURE0m zE{C@cq!9>K1yU^PzY$2OWa6Tv&Ha^XvYDDX|hr66ilbJA=afQBEDbXWXy z@OU-e@bmR6{)2d}IyCE@j4u3i9cuU{0#(IQQ=S@3DeO`k+fK-JMooBHJu0G)xkr6k z9=ak=jK2#EUX_G?-$F#_b8ov~7MokYPs$I=|45%d%AlUj<5%iaEIYl12ZT^7_WNhN z4?>#47lcr28p2N?s5)n5MMc@jCnd3&;kvkRx&g#P#XA0e1A5Q!xG}*pv$)uH z6K_QAc+W<(H7+|sv}zDDdb9#|FgOydLB_=mNnQ{AzJRbl!g;_-U>k5B zxBw9H9Yh#}un#Z{XaP(`+-P7{Gh4%E5S{GzP(CS)>NlGjs$Dv`VC+&$t|sWO_!nZH z1Yfkzl(qLcmG6`Z)ABriDhyn-l-~-YLFB=^hEv_z|IZSq8}oVL)I4fgV{L-0323LV zP`f0`iE+q^`2TNn5Pua;kvJ$Cc?2%MFq}n+`l>13E1>M-CXrWU~Xx!N96Fo+LpO}nVj=HCX4N)~R8qGDRY zYev&A)PcW@gcFa%ztYv$)|x! zKq;^j*bhuWAsr8DM}fB1?P&v}6}Iagu~OKgZoEf4jVFIz98Zne{m%SuJXulQ#|bnI z!LtPVMBawM4;=3n52YbRm$PS^ZE+`pSw`Z|J7f5*yiONz+cuutg}$W#-mWXH&+gV0 zRK}C+*Nx;>Kw<*P;ebmeZge48z_Am_<0`QS;dP)^XOcevijY@e6`qd)SAhqBE6N1{ zkw6zm@cf>T zv)j1ZlV*F^$EZ4*g7}x`$`~d-qZc(m`j%ca8i9`qYT!1WXoA|fjjuCN6oTs}>a3NW zdo=e(?Q_3J9Glyf=H_qXQHd0e^s$N154Z6JiBucGH;Gz>mlMI~+xTZm5RlvW`6OCP z+iV{tQ?Qg>&;#Ss3$iN-5~erC4)5hXNj`<}DBytS>Oh%@2WsPa7$CxNfXIIyW9o<4fe_?GA}ZdS#VJ{myFkagZb`WS(8Dt7K| z+>%N|5qz7fP4MMZEXr-XQyR6k2Z4Nj8uiBW^E7Nb+jz}Elt@O~s6nWM9aC(-4MxuD zqG98p=-4ceP8f2xxeK=0nh&Klj+DTE97X@3t$bbvRE}-7V;OXZXcxDQrYLPfCc0_^ z*J_5SV#1?{;<=7<=WOFHW5^$^H5@~AseqftPR+9wuxZ2!LxA6;OsgNevM!rv<5%uHJ zIBG(hdH6W$Yw*s}*x@u+#zFW8@x9~d5T)|$@l;Rj7vrfTdlbaW##1Oe9K?M;qz&Z9 z4}M6=Nk;>yK$o@Rh5tE1>jyLLc_F z9(npp-r0#x7_*A(39jk0#6{|fo4jN)wPZKF`OC?)f<3xn`)mp=AWU`WG{`F2YYWPu zXM}C3)(rXv$ETAsXaGg|vxbkcl z+o8AZyFAKpps#o{E2-{_&b}6ERY_LWbU5?r)M2&;pAaX%9^%xd~Gt$;Q>sMV~N9@iq$ zw3yVAILoSWO!1-GW{&7fuCPO!=u8rB3k4mv%2UP)O0`Dtad|Qvzq56>XUJAUXuIFXS^l% zncu`DsQEGuVz>75EKYTT&i`F&E$tNR2DMCjfI7}YTIXc# z$cgbvQa5kr9hZWAz4>2DsSP{1k%xT>{te>YKgA-S!6$!8Lue(x_9+Fj*Bh2Bqkdrc z{>!L6&MYgIQ6raMztxUdJn5hvFy_w-I8b2a|{3J91i zzH|lovpww%I~fupVpC8Gzn!bFO#g*n4;|w2zCDHK`-extF%F%q>Y6@VluJ8q` zDbT5GuU4Mln9pkP|E{K*thA8-v6=?d^f`%Pz*OUcu>-X0Dh?Pvi@KKgTSEhU>lMAO zsC0n}&GNOv^DY5a1^A;)<)_zB4|eZcUVAMhuoF*Mivf9`Pg{$9{W`z87H1eo{&X!4 zUITgTI;zd~UF3rig4*fpr~`e<53hsLyO}>+N89VPIu9aX0l{3D%G|9-Ol2;KYVvMD zv%ai~IZ?InBkO5MwdS`ghoJ-#q9$*#fr6cK;g)RyL4!6>gi{y1nAMJa*#_##9-rfX zZU9djdB=@(6G6RA*hzK#>Lx6)$2+<27ubn|_~AR|m!MO^#=c}T zHit=~z-h6jdTXvAzUZ|!7J=qcT{u`t_-V!pEk>t)%8g$^TMy&i zzoIyg+YhyNaeWS-oX3Kls_?a6(M^8-YYKJsEf=XSn%pem?|)4-s6L=3fJ;4yEw9kZ0fyKbj?iMO$g%V2LZVtz0cXsZesaF;Ol z_Ah~;-0~Q-UNk4GLp1^El6$g3_(x@Ft6!gYIkO7nktI*Cw;?52y?UM>+>UKvB6lpJ zm>Q-coCvm){20*VxgL;G#QPOdH_w(gv=*(7Ig^^z&8nKw(yV6k-9=QNeb4z#;LnKm@es zQ}#gk)Z%OQ&so6}zbTygqRwSva^VH8Q+>IzpT?0v z%j+@3-VP4vzBw^^VK|U^=mGS9HJ@^TBI!N8T?CO_Jpf_{@oL5RdggKtAGDu5JtJ4Y zX~+i_0#W#v&w2l1>PnsXhGIJ9&9enxV$O16nr3z^Rrv-McRhi+!ojgLK!6K)JY1$hnge%W!Dp6+MyfD@EL&OGx34U;Fq_1tc+ zGhDqW%oyqkiqGDJST!2g$CrvP-MHevsxnjiEdMKBZ>)KgX}IbjGL|`Bby$k<+CgDh z%q?eGJ?+H`-xkY$x0v@;2T`H84HAy;S6t`dzfjDsI^@{n`~6P>mSD{PRvG#~Rcb|V z{NF0Irv8rSjwh+k|Lt|Flhnk?PK}9=If)hUypS(CNfUy%fh28!vfQu684Y%eqh`s% z$iqEGrw-zw|AiD54PA*$=Oh11yWg5T+ryH$P-N=Q!%tC6qc?;1Hooe7ZQ3r~DRmUz z0z?#}5j~tdTzB!$PEn-q|0%F}US$E^<`lJf+Yr5N$QFJY^3tH5(?r{8KKKld;y!%l z85&86{Pr2x>4x#vXJNBEafg3+mJ+KQJ`q*AR2toJu`-8WI7_YT@3Y$D;ae!&@tT!* zo`tptoB}$b{wN^voUO$<+Dp`xKl%Zhi@_Foo>q}tr#Tv(IWaC`t+nRAUZ5$kjt>5j zMi|s9_H&Kx)Q{9jqL;kpWg5c#uJXy3X;HRou2#~%?Tb$|9DgF&3)pj+i9c>WN8Apn22c~|gpom0)} z8WsG^B39oPagDYz9L|2Zj+JBNt#42t538S$@Sb8TN=|Pr=Gd99yMaM==Poy)&=m*r zCO4@TJ6D@`Lr5F=$eXwcO63P`VmGX2bNhuZOBBw_eusMI#SMSpFfp39|AT7R`5sC@ z#91tfxn_N*sOM9D&#jQAdhHiGP@|{9`+u`-#vhbSI0Rl$A&^gx;xV`A98I=W|C9d9 zP|c0oI6kU(H5T}uceq16gQm3AX0t3H-3_-pYTJ!k|H|A}U;NHNPBy8Z@Ne#rU)2Hk z2;V&{z(+{y`NcahyvOlpcPQBZuRE|>p+Y_21_T4mfj)qax4%mxc(Zn7@E|7X9i}6) z09Xply36<6r6Y##vtC1GITFq1+@lE?hKhSoM3(c!`v^YfYwy!a&#q%Mn$l9Cj}#W- zo*CcvaPtGQu!_-q>jN^;S4$pZv+Blj;^`-J2(z-f>%^)HhD#Iwec zmH*OBPc{112>P1xc~2;aU0uY#c|r|*>J*9{p`g=g5T#M114CjkcJN0}Ku{6)eM-5w z{rLPTr9|bA)LOPLFyUi6p`7IDzy>t165%}HP0Q)`@q$rVCt97)o0Q``+=eHYQ+!L$ z5n4SNl3Bf!hxWzSqj?oVGsCBCI`yyNTC&xt(wW*l%T0Kzf6Y&oQw>%+oc~cyjhu(Q z)MP>IOJ3_4#O}+lc!y`&rOlXUFfjP>Z=PWjzc`Fvc!r6>LF+jbwJAL8In?RaJo7m& zr8n{=&nbqL59b%2(-#r1hQ1kBZQ@NO6)#|4eGY~MegL9?lh0u1K>U|LqnCX93;K=f z@})0n0ee)y8@-}M?9L#5@D-V=U4O0hf1~LC$^wlms0WXIO(AiMAmgl2;Dl1_U!FPb zLLr1-imq23BxulsPy9*~jH}#m8`}QY-11s(vwuM{j7Einh>4q@IO1DgQ(c!AgGB+C z3#7RhDK8>NUn)61PG_aU$epNq{7{aHA`;B7-l-7SE<8MXGa{} z(L(xMm=^8v>FY&=<(&w4(CX9#MC2YeV!guIO?+PJCvLBeW(!o`=lOgQv9|K%0U9+q zQ8hE&GqTkI{01?9=N!Elf`S2h?!;IFc6)#=oUxG<`AdH-_Z#^y<4cSc5|jS`b?1O1 zz8-@VHD?d-E?Gn4j}7 z7i~WEF8sd^tN?q!07nLw5%_iw(8Iw@iFNW!Pc)6`8F3;-}Nu8H!c}uR{#8n z|LVdzuqTN;#Fb5>dbW+O>^Ql`%Gwlf5>wocPjh2I?9ODq+Kn}#P=4ACQ?Qo*>BfRv z7`%`Xt83)g*A*F#;?waEwLhM%<*T(1(wMozG&)!N*a7P+#eTM&%R9=<471}hnZ3tK zdvPasR@=Ctmmt~&t`~jfvnc9c|x;{7Tx7HL0uV0sX41mXZRCp#i80?$FfOXPdRS9`KP>|8hg!jpZ)4lm$e zdNG_I_$x2AwMsEmSY2kadDkJ^e`>HhWVr3C^=Gebvp0(-_T40Y%ZCMruJmE@8Ndn2 zj}eYR*b4{%KEnHagsBL#5f<^*zN|xy)gRh72#pua>4{>VPsZC8__6^KyEnmh&!0hY zsm=EXvNSqi3kYJ9W#^FQ+M@Do&ew#oI<(aGT^JiptgI1_h+tvvy~CNjB7(^~5xOA! znP)|?R@mjfj$jRI_GzIN4nzP0PVN!C_`QOAsr+69`!%S6CLi@M`fPn6)Hs)0U4;*a z*`6;+-OV32XB}t)ZyCv2NA8XU^8+rZ>l|phi02wWbKq0pFycN!xDBBKbj0%|+xkdm z#)nk=WlPo~Xb%ikWdT-?jPNA23CxnagmojTwAQhwm*DblR`>AaR;;t}Mj(dCDQA)k z!&dSqxJqrR$xc0llWTgJh`^b@75kX!+VQB?ES>uBb*b9rm|PEtt;9zN3xTfzV-z?E=nrHA zV}NbIZVa4vJZ~cH+ARZVN$9S)PI9d&e zV>@x{R6U+uWQY3m+wtrY`=g%-jkdA`2A9{Nwtk&4NjTlxx?uU`bmQ(_*#V!EU77ql zpzCJG9Xvk(O8Bj=*a@fD61%Zg1iQw=?ks}+m};xvgE11dX1y%4*EkL(4$yVt>Xpcku3@bNogV)dzw?U9KMW8`4#lg!+RvTW(SS!-(iSt1zj z&Bqa^!IMd9$dOl2)W`n-n`q@#Vlm=Ps%$%%!aN9m3pdQ{Ap6siud_gQEa6WrtP6GL z?fbAW^0j@~hb^l@*|us!MURvCd&Afeb}xaS8U|@R({^hZ+vtcB%7XV;bGprsyvJG_ zpqnW%Im<@ac>;Vn|$APoJ1wL>zyNxQkj$w%imXBeL9B+@sGB4#f z#;^chHip$iyfl`zuJHxpR|1PgIxroWJl2*pmNk^vu+vA9%2~3^~JOMTU?uhF+ z(e|GS>?in<@&zBUKF*m_>XLLY;R_)5>m|#<^nmyIf2XpB)%H(?gc3mB$~{br-ZlpUV;>)s!-le3 z*Z6litTtS7e#>EFlZ=*9om= zv5_uQFKSJRU3@#=Jc|Xw3F`Y1MIP zEVRA&1lo~j^)n*fkTX>$#A-W{&u7EXA{{&KYnFC3u)pspUG2! z2XmQR{0VkXgomw6&c$=L0x%I!e;!m&Kq}(G}m)+ z!Gybuj(TgdAw6&*Pg%g$v+cY2%LS}g&9~N_tjeG7u{-M6hAf0ajIHC7MaR&zK*#l% zI3N`m0c-VtqTZtD$?a@Bz8B@~i?9dH;aNqjHzw+M5$lE1nC}iY23HnycChd!<2S#mK%o%u zMwxWAlm3dAxLLAWSfj4g6)#ueIjq&|TFliQ%r9I-BEQ{E{oNI>H#XV!nL$?^v=V{} z*IgJ~l=Vgi-eM;UsJ?BEJ>r)0tBMLR;n6Soh@GszesY!975sV)$&3HA6N0F!t@?jh zL&|Qx9UD7f21ZumON6tFpq<#5JOQEqe=zNMR`C2^zyZ){HZKRKfBrc-Hs66^Li(dh zRK@#1;P*;oR)(h$&f3BFw>Ajit+s16c9(FOb8YP_hngw^vI4Es^vQ65ShPXY0Vr4zXbN zdLNfdSZ#K79}g>G{!S(oG^@LKN(l=Zl#Um8<|MG(;>-A6V8ZQNhe1A^;uF=+et#wI zk25o&1)24@4#v;XShkBsJa4T;rcy^7T6MP;Y5C#O@t!?@+`IYf^9vGa+2-#t%zrbjq444P31qN3_2SUYjLm;{mZ|ra)v|D{P@IMZ- zwUCe2?^sLk=f7c6Ros@Z{{B@3KFrqzfmZd`-}q18v7tfPNKMA?{7lqxi9vA3Lef6H zXbAJ*fKr}%gf(V2Pw-EUu)rE}DF_4tfV!1o<5GU;2y4Mw9k)F{!agK+>YDBSqtNBT zw;;z!;LcGdM;*f!f@fDeM*<%M8vy6yOb!FS$Mdjbe9ti)&~Q_5jJ0oRxC+Y4S0BZy zwc7xqv|lGP?-w!fh|&Bg&Rx%w;0&Plzk$rv;0M9@d&k)h`1AyxV1ZTen@M74PsZJS z*ArMhgZP*e%;fyRX^r!vPuq^1U`M3zN#A3|0v-N~Lk+?@Ct(2rHUO7_ji;bqBJCOA ziL&9R`TkRA!uOXW1)ey2NjsW3$;|E6?}=ds$n4{Rgb- zNZ#i>J4@SbjV`beEW2!$*10#Pn?vUz@h{>G0*nGC0k?m|K?q?3AOx@i>w$^LdlX^Y zOLizf{QaDaGFcax{2}0s=R3%I3Al~-H~9(WZ1N@6(Sg3;y|00`)%^QwY%jK${GZv> zTH>}p_qO5h+x|!_luHQ)T=v_7t}{+FY~$`5IIBQV-DLe?%c}7U3qTP03$&C;{JUS+ zaQ5(H-uPG67vI#(`juIbcE7a1lVf-&N2v=y}5tD-lf=%|G_>Y z>cZo0F)MuhPT#_|)W!Dr7P~?9ZR5ctJ;e77!oel?;9t4V0^DW~fpZE>t_wCj7EH0Y z&tu!mGM0)@dwBml*lT}F;2+&#A!v7vJvecP?e|nZ&{nhX&FW@obg&G9Zxvs0m*v$F zU4Pqe@Sf`P6yKMd^(KtRr4At&0Umb`N1spl>U-=IsvUP9i^asP_t70}%@44aO2+X1 z4{%yC@q!0h;>HK;Hyj}g9%B0a`JhLvbI;ee!K=U%U=MH{_zCzEXmgjz@*OB-fCHY< zl6>(#P7esLJ-~4Up)=r*v^xMjwmo@-^A;Lx^cSm(An`BA;BReb|6*y9*QB}j9XQr4 zPY*N5B{=M(7YWaxahrJ7GZut^Kf`gr#BI;SG}nHx^@)35*|+J%!z9>Zc5amLK~{I$HzfT@w16*{B=0(_-YO6H32%RLy0bc<}NRkzVR=|x(^5=T~rC$2VnAcCRj`o#JL62v-&wSlx`(m>aEI8Up zjLBk?6QArLorbjP?kI&MT-=})fUK~JU-J`=R3$0+n*V+uZT;s@i+kfmRZJ_#h?{V4D!oZ=AfbY!g+Sn7yQi`aZQJndj7y zB3wff)jjAxd>?Q1k$7IY6Wr55_`iRupitcKJc zt`$)=rCQE2Q6*+~bS<7%Q%Ymk*74$+AS9xbD5fu~Ur9)uF&c!J)F{rpr6QbV|KlyS zAerCsmZI6YwY-s!6w8*^;$wWII@sq5eWVmtdYS*>gYop{UcORC7Pp2McuC%TyszZV z9>(!cd?ml^Ej1+hF3_x|B##Gn0PfzB91e5^ihU$m=PSuAK&H-tn1l4@+Pw1i+(ECu zjr7_;vr3FbSo|+Ij=0Hy&`N|WS6=ZHUcZ(U<6P*cjX{ndA6rZ6?YF0+=(|CS|R6*5$JT zq?R7{z-gNQSO`8s{y?Aat?uKekwE9Up|;d6%B#KBr1-%Si@M8%%ogEdXT6`FVkk?( zmGU|fcOSojgV_9dLs?Aji>6sPufj)TMs3LmZrWH|>PP)K3zUZY#P<-n&FWX+S@g8= zn?^x#pfo7nuR0tM)q3%wO_y8WzJ@WmJT$AJ)uPA8$Z5Uoq};y+->`~AwO78qE+;$x z-&%s$lq9tkuNx%Q$Kka{kQ7AM`1^SCJrZLti{HYXXb@hf;W;s(!j)nL-xef!!J+d= zkkpz6E~z8cgjDseBQ=9xN0&NMdaW1HTG6>q5tpMGKKS&0WAu0!#lNqEMLUf91S5Mg z?;0!x!-O<87-KK-xxrE-3_!)fQr}(?QKAk#OeVq^YN~LCO79IRrp|4nC0OJ2_$qNl zSE$b^>JtxPT$XRW2U~i^v_$m+WF=-DW`Ig-OA1dnN{yR%Yn2*q`6J({I+FY>Sd!Zs zB^mQ3Zw`VG!}~16pA~U+`5_}{g>|T|)S$`C)>^apkR3m=R1;GyJgmiU#q`&v+gsQf z`og2QrWm3>_=vhvYxygC8R5Q3pz<2uT2~rX?Qkn?bkgw)tvZ$Sdi5j=zK)nyPil(q z4Zg02arrO*xt{bHEwoLpFV!Q8;%h>{Ub+0I5UEci`(BylEk1D!xzyfp(f`fvNtxd8 zTfir7S>^V4KCppwzOsO@O2NbGQhWWyAvp8?ZTLZ?rs$T4Q}n=wAZ97w*-&Z&7t;F; zrCU^F`>7G;nKp6HP^oj>H;u(+xnIJK+25_lW_oDH`>Pk#Xg)nuY8rHR59u!9=K+w< zDDtXT5pl~McL?STXJm8XXF{b~!B@hx<+T?9a>+mL$CrC_bB1QTRdGM+Nb%-`w;T&bQB-=GbwF_U@L<$S~qp3EP zb9)UE)wel;U;T00eAg-w-?*Y=9Npe$!UBh_4FsT8L z@RyqL+%U;^=*w_zAXNlr^$_-P&;>b@pvUiferVsywVfT`_1+eDPQo@;k`oh<e5gimf~?Lzk*A-#^oy6CJ&@S#J*lQiuf;AosAFN?>| z-2zd-W4wDH%mO|ELV=4sC0^QFzp9Vcjob>FP{n#A;_TC>)_d9>)i^D$cu#C66mr-T z*vZx^LAs~MF)yT>6xz)Dvp04xS=hn;{zNtlqxGkUR-;I8s5Eif^14Yq=#9bCcB#8` zKo~QDlcaV*%gvIo^?Ab7iZgC{n_(yY({5ER0@S@izWffU&?g$iETT2b@j8N=BFqGzJy%K<(bP0JGFnB6xrFmD1=U zKiOC63%|Dd{UrZ)dR93=xUcAkQFiB3`bmx0c|HH4pEQD|a=E`W!XT$r^R%y7BNdX)5dx+tQ>J?9^-CYY--+J%2e!3c-d{cd*pj zIdiDCa0U(KBL}0%4F1_*sS9=HzYWHo>BMUck!Cmk`K1tEkZjsProT}7J{tmc5=DIw zCIVgX46&srzMvoMeOHG_tr|IL#l%k>TMap_v4>mK$1gN72t~>oj$fY0iP2)Oz2LD! zCEsd?DpNZNEyRnb50z@SUu=)dnH<{^KcU=G{R_7~Cc7Vb6)nld+AYp{{@_i$HB5S# z6VoWOY6`OL*U}7TRC9Ewgm0gR^XkK-8C?z!1DgQXfu_SH`3}ODfD4|*yYD*???M&+ z|F}8}u&9E*(ZlYcYYCAq0Rc&A5TsGML0SY6YdW zzTbPF?_Qqg$A5ZeXXebAKL7m#WeWu#6TET;b8P3RX=}I>Pdspv1*imkyLSHn=_i2x zzpSCWY~Yo!-D4DwExZv^8@*u*#|76gq7R?KjbM0sFaA|7nHMMnJGcZHF3=JJ$N@9} z#uw-uJNN+%cC>>^a)57ekSYlt=hV)>FfXM%=HV;q%~Sg zL1(p&0kp}-|L!aWY5sR@Y4917JEpAmY5H!x3a$vTF~+T(^-O| z!H9Wa{q?#%YL~75X9^w+&~s~nR6I6ooj;=M^59cgxU8lBig*c~`3atfDJxb23ac12 zX85v|4h@c5b(e2 zu;{oFAW9L6wqF0-#Y$3?J`Pd0&Y&U3epul8vQf4ovCIO)i434r{G8jYqk%Lr-;Xm z&wVF@e}In&aG_GjTj?BT$@`16L6L2c;^@ql!dyn0Q!#z)UO4&h1S0Sz(Dwa0<-o?VCYVw1(6f|*Pu4zM%?y^;j4 ztp^7v#yz+jgVqrUY5zJRC60C_PY9^4@1MS5(5?&x{6&@T!EeH}j!>O@aDGmvLpWl! z@!CZj^e5z>OH25y1ODW`UeV*Y3l& zu^0kCimqFNe**VEg77~Ak#&mtaRTQ;_3?v?hmKC*<_`kSfNLeF@BCWe23%YVLjKEZ zftdRzD73DwbyUs&1f3Qp1awR?@N2=!k993L__0xGr|@R{XBl9f9tS*Y&S={+xBxch zFgghn+Q7tL{m+SDWyuRvHYUW0M#CXj7>P3h@GbM-G|r*LupzMZ&l4So3x$I1$)qSs z0*DQ~FYXaQjQDdT5C|LON;%4g0J=-OLj-|MB4C>YFybdd%$Xc*M+OnWm@z0pSoEM?G*bZuh2(`h9?&q+{)+)9=uk-% z(EXcOh1Ua4#QLph8LAlHU~cdM1u$;hMsHC-U}^!(n^HnXV8>J-CB%tIhWbPaagl^% zVj)y+jY{_aYjWDqOO((uCTu?+^^*!R#Oy-dq6S{Uj0H8s#r_|+ga364e8TrYL$r6j z|9x-;{FjNQh~Yq$P(u$ff1v+TgPY#K9?we}NFNiN$kd~QEWi$jDmv&9n1LathXg=# zC_@iX(O$O`;5~|1X9zwaAqm~Ru7!H66yU;J4wM@`$RBFd2YLt$Wl=N?kU7{A3RTV8JhzT4WaAAV@2?LlQ#54Zu*Wd0Ls)Pyph&hJVV}_n% zf~KdD1!4Ac!Rl%E*n2-f;hn_`eGn3Ura zhn!%RvZyR^C=@dv%`O2|fzt)3$$QW(aNzLj9>faPcvz(%X>eHNi4^1wyLyhAm4aw7 zT~TLJ&?szz5j`XgSz#hyGW<&us3iA-TXwXcS%C&>_3?iU|9b?0sTGoi5KAHuVjj>A zXaWoY)I}kLDc~8v9S{I`4QK|Ch(U<&G7zE$xJv?hTA=3!R06YWbR-~z5B2pw02)v# z2_dKeW5DvM1gb{{dPScv{+|Ndx&Gt_wTIaC7ra2pU0;I-=8IcoAzoCxEW{5#-#JT= z@#98q%R+)oDLZH2aijPB1R0MLkjs01y;@G_3iuGYzQ zSHGY|A3~IHOe9J}4b%e@l&c!32b3t38sq}1GoCtl&_AG_t3v@4t%!fA4UncH3B5k_ z3$FLuM_s6cN(t(g26#}-P+A&LHf9}aPXoG5d&>yaYuUlr0K8+bGZRb}cA27t zG$CtD1$43|ghK}NeS*$;3?6$TJu3)-1QY=_(BoFn18f5R=b)xM=mbx_3yS+WgoX(@ zqL-gT&X_O-N3`J!hzG`ivV#yUfCa!Y0M8ym+y!U>tnJY`4p0a$3^xPKkp`L{;)yf} zu?08*V5XyO(;;%$&8#+%<;oo3M`1)Ovw~GU(AKjCV58$Rp{Ecg6Z$w8ihZ|zgh-#`A5hK3+xCYFNTRpt zCSpQAEQU~Ua24l#8T16k)PPnhhveX3MkVqyXbj@fji13+T}0lMLx`vf2yp@6{tO|8 z0gY7b;HyFT*F(cFwKlYV1Eh@2hSLZkm;vlf5aJWS zsu@B|0?u0?ghDHX$Oep~TUsG3A~3vf?}J={km!d{cpM+W{)uMWY%bJ9KcxD3PbC|ISnZ}jMu6cWSVy4HiiS#H3aE9pE<_O4rK%zd=WH zr@upI4MC4_u_Hc#G!UY2rXhJ8-(sMKiqYEBkO}60Z7OG=d;izwa0b%FB)u-~NPiA- ze^yY?N}!-okLDm7SU?7kN`v+I6(-QOT$Do1IZK*j@<&X-e4m56EG1nfOtSN zz!KaOlLeRqSgwNek9ELJ3vkm4j_3mT0Rex&Dbx2Lj804>LZ%aV1_qYEAU+9LtbqW4 z>;vZf0H$Q%5P$&!*Wv*QO#$YqAc8KS{|OQa)P0#Cf^3jbKs=xsBpzcPxC1x?FcyFW z@GpYM0nW?7KcIXC2|TUVl3@8U+^now{S|Fk2 zKw|WRgcSibAifZ&cR<*{4(YrNEWZK`z!?m&5P$%1I#>n`QVO!R8I*Y+C=#YUAYWr3 z%JG3aQs4*Zuj_~NE^rIX;z2kFaMo4k6Yy6I^q@!(Lm*)QEr2s19#9VG1Mm+6^I=f_ zJ3xZ~nsR_MUTm$s~9`aRljNx8Pxez)&f z6VGVMy>l=@GPB-PbJA#Y>6`{@Dxz6-Elj1(|I+dqB@V%vDqYETxkBmZbBi|%B(}GZ zfiKha7PezpNAV1s?VXb8U0HRTo8CxwjK>OvCVJo^Iq2s)d=_WsE!TA75`RtYZ8p`p ze+Zy*2qOr6SJ>&FUcI`l=sc|N317z@Zy2?TCrPgg)o_VZ73~^tsv2)eRcdeb)RG7e z`!qNwYEG`o>8BcVd5?9n(70J&roDFZR<^fYSdE?qav{*&!|rJwnrnJ1LBcjZSMg>( z4Z2$zDPco4Q!MsEf{4*LDr=59xV_5CAMx8vY|$WQ-+HojU5BEz9g=@Ql;$&PkI$}k zA_2p@_f7H#q?GY?QNqOmvWrL@$vfDij+5HjhRwL7 z-r~k$m1_z4zRa}p=Vw*Ayv}NY{%pK$ZJ|3U@^R#++Z~MQK#?5Lxm*X{ARKO%x^Yj_!N6@0Ji)XNLRpZ0*d3C{+2Fo?nav`--Y>#7vi@n~ z8^|A4#+_f^Fm`Q92qNCTt9_DM_5v|VN9e3FcPWheAcXZdpmQxiyL4^CMZ0jeG2v6% zJW{owQ{bI$i>cYz2ic$EDPwtRn00i+JCR8z`{VFgZm}MT%^Q*-R2;tF!E%TER1YKf`QOC;Li!fPax{ zUCPOQ)}QgV=BqGy0n$A*_i!Qh9;3a|*SV2K?nzvX(06mk?A~4^w5zy^lE3d!8H72v zenuA21QD4GIJA4CSUo)L`!7ihLK9$rIXaHdM^$y)YagFe3MxDG80vEbX_OYqUv42U zZKpBKgrfAnB+WbQrX+Mmq(2d4*LGNURWP0H-}iNr_IDT#eWpKvO`R*gpiyJb3BC5e zQ%Flb+M0QPXTbiOFP@N*`JEg$%Y$XQ#g`!;CJ*Hn(mo{LHNRqK-B(Sa$g8@03vMUJ z8GV#SoXFn&`-K?u;j5L4cR_1COBG&C$bui6SLph-mUp*0YQ&3P4*6q@DBvg(&fl?P z6E;E*D2q{C8DV{Qc9`LDZXsyb^01D2^qb*L^pVHUas}%HIsRMtZn&&26**Dc8cVvc zIXVk73Y#+j>}*b{<8TH8TS2A#LCe)TxsXtT+TMHneote#1GyUf^@&*ODIAzHYmv2b zLCF&z;fF4Mwcp1E6c_r z!h9AyF!XMCinDr*1sOXTO?c;Ri~8JjBW1BTj?TDQrMraTBwTug$Ic-w=st!RLOVg7c~M{6 z&3+*V{x3M?EtsW$nd5Vz6|;>@aiuBN)5p{IN?%K;zCpyMuSi!X(OTFXf6PHeceIr3 zqZ>bEB+4Yo>)-z9u08&E_UGcVv;Fp!i+E28hQ}B`N9X#|m?P3ero%9ZjHnU0H0Q^< z@bC>^q#5Cv1(}KPkbKDdFqx4;&aQ=vj(e@hxZMPe8H6VM4QXrV7~NpOc9@z-QTHPJ zZQa)p6J(`P-%S~|KeTVj+h82sDaT$ncM@uH0w`ZcrltiLO5kbUu#Qt^H7F~=7ku&z zm+&EVG`-K}3sWNA*47uT#N0wO$fMb;@SlvTZ|5;&#)RZLdFiLf(nn5G#wZ~&bRgkA z6(%QZz~8Mu{5JyByYN9aRdu4)Ecb!f|S?}*z; z!tx`{P2I7S2F(t2IZX}v->+!Y-f=$os~}-V#>-|TH!pzo`DEv-?E{7fq}j-@GNRYD z=PZAcX^Z(jUo=(yF|s)oCDfvp-uqd{z2)0lNqHp?)0lC4HJSAT|A}|Io1>wiiBO;Y z-|=>LV)v66`43vRN5@M(mQ?Q7oQQO~$yYI^44>KAy?b$T$RycHNZx*;RNFk4*dlmS z!61+rTf`PK^BqS>MC=-y4M{K$vcIy6Zar8z%(ebZkuubK>eZw&jqtVh@Yv__vIx zJT_|STyF7JPLtVXS3}ba3B)va#@Qia$Npf7;@sa`*x)}t(l+0ZlhC_lLEf9i)M5`W z9JW1w`{=;owC+;8W(E6seU0C0%oTeihcdXO=lv=%d^(zm+tam<(cn{NuzVDfKwj4<}doE z2Z35g+zS#~vy8B|s&tMCN&P``zQBx)G*~m2-RmMci|H>bZ~2!i)s&l&N;n-^fk(mk zi~6|&V83MAJ;(5kJF}mk#1A(Ot=}!4)^`y@aY~K&Pgl3%jJ3^iQdT}6;`%ZhU-Y|9 ze1)Sw?={zmhz~UK&PV8mtRGcyQx`kuR9UdDU?A!0kShaCGKn|6M;v&g`;hvQQ4m*$d`Dqt}xfGn;&U)Oeq#$+l#F z&FxQ_ZMK~9IJI=%iyo2RlT>i1IkeRCyI0cdR`2JbMn0*Kl}c;5uKpM4G{GT7iuUaC z%++r_Ttg3(f4~3N56Uwk!E_{4-j-x%{!D#j$m{XW?X2O5*)sIY#-35MH=RW77(KbJ z-K70W@RWf0WJ-6(!ZK%_k^W!80Q#-clULT5uNiCpT+-9y(?|40Dlpv$8|jt~(*B|% zJhnjU6wy6Ul%^7hEy$dXr1zf0diJ9KH({G2i_b?lgCq()<#cn|!Z+d!31d67Ql!%P z0@||!Z)fi5Id3q^ypFjMBQ@rI?yY%MPw&EE&M0+Qq%%h@JYG~td1z+3@qqlNz4wvLxIsByGm<4W zOJ;Ejj@q}fW4*mGz7P7`{JpX5SY@x4E%Bb2fUEP1M{;n@YwdIl{Lae-|ETL(B7fy zq-NGjmLvRH6hX+ymF%XL=yuSTiXO0qQee8#j?dc#q_C%&E#q1@znW8T@@bn&ex0iL zv|9PlPr{PIhkZ#Q&~*An_U9SdUtMFpMQu+o_RRf6zQ2q9vs7M&^jl#TN2MH&-5YD) zvf5NxgJo?yB;aCfnB4NObv1Q~xVV>iDtYKj^=0roTG5vacas&NpM@nvEfGjRvR$XJ zaizv*P&3V8sJd5Typ3$DSF;YdslqQ2{_XwGP8WM$^0&PgAIApO2p#da-D*!xK0qwo zT%uosH`=uB>+j00AuS~LlgZz={LEG?81z9gS(LA5{XJU6u^1fIP&+%+T0=Bix4>+4 z-yJ6q$x>VXneJ8^%jrz+e=g?dkW^2=&85!g)=c0s@k%n7hetL1E(5p(HE^GnT{O+B z%@@ampvPUw1_3VtKkAWhLLt{c68AiQsg+^vTVt1pn`t6f&H7{nrC7=qtU}p#%AInMeM8c z*gw2|f?VT@c@OGWdcx9@!YUv;O~YID=L+TG#LP8sh!X?XVhzO3t0@yCM+N7v=v?gW7u$$G@u4F(dNBvEGzsd65--KQcB?|R%Cbd1obxdrSRQJr<^AvCAQ{Bu0 zZin;VQ`z+bQ;im1t(A>%Oa`#IszTQf8yaZydw-92G6&u^mc?0gTIMz3_g43nii&3G z-zWcM8eD6QoTs*~GG=h9Od>NI_!&G}T>9jrQ1B#G;qIlJM`rGPG}lFvw6W=(#l>G| z-4j)5bu6Ye_x)6ze~g%G&Tl1;(d=+A7Cdgu8|YzC=~ZGnAAK^iTZO~>R`%=6!NV`# z1Ab@hO1Hj~*VsTfnS`$yf42GZjx@2C#$ZZy;-j6+WFhih+0Oi-bWqs@9ZOTERNfzn zh3q!?`!heog4&A@4%`8hC#*!=s%u&i!1X)ns* zBuU|0ZvAc9!^d-32P@(%N(x;(K0iD4V2%Zkg+%%#I0E z+IT9eC8MIHJx@ISS7)$Ja(HpNoCjcQo0|P;d+QG;7~R#xRkJ=dXofUC4J^~t{6S6o z?9Qo_z#JcrM0z(==803Z@TZqT`rbx}Ns(eGL70 zrb0#aD!`*pp=i7ti=JZm1%_MW(R#obCn*MG#{VY}ofr-9nr$@{E$8(+>MujpmoBkxL< zTvBwaRU7`648Lk_M1L%JN6Ti-v=%3N=rM#^`krcJv9Edfh`s)10nJixuG*e-+3*)D zCH4IGQS#rBn07)Z%LL5A1u7XYoYul!E>ShoMwhjz?M&L=<__ZQw|cp&Le1xucy(jF z)9>W<(m&vN7 zXOE)Y?DAenGa#`Ml;o55;#fW~t>Y1u=l3ACslSIsoxXM$*s~$VL%)RN3en?gOICVt z(4rny+|~MN`oiXh3hAA}0@V_(&|WjVH(H8~f|y((bQ^130?IuElSyM7{I$}GjPj{( z+np^-_K|1NvRrMNQR$if-H+^pONZSTNqoJ_SgNU%Yo}5dxm)$R?u)+E3Flszf95G8 z#y`DBJNi=f91pjJTlPIVuKMCoeAV=AHRk1`MB6HSg3ZpB1LEaBTEEz{(x};U^XQC3 z?Yt(f;eFOiNWr}APv}vto&cZdvL7~Uj6xIT5}`=1c20}rDc@OFzO4)SGI>;20E3u= zE`Q9VOt-5b27bqh2IUU~NhPeO-u-jyq>)_#n~xEHp_Xl%bBtQ{U42IhVoQg?w54g* zX4z~DqV(tkzOq}*+~KcaDK-PGCIOdwk+ERs5SaPnMV}`PN3%H|(K!??y{1`qPoLr&#sMYV8x| zkDMr~ZZ2-}9(3sKyEDruX5}f04oJfgF4h5q%bS#9hOsmZf&S9Goc0Y)2b@ zA@uSUCFA$bcxR`YNXcGuT%wAOpS2AcUkWqUx!G63QZfoBWGW@`b!f-dYOPL(Q$#ff ziqJ_%o&rxiByOJnj_#vaBG|;0?Oo{$dRwI}FVb?y(s?8i zpbhbpWpv7^o8#2l?l^lLrVj0$RT!JW*l6@Mwf!ZtwHy@sXN)qt-snkv>Ux=#73lgn zzZK()T7E*@*`V$6=Z?L%&bb(EF8r=Ze+3c90g`Wax(um$k{>XdigZ2n>t$(gx`Ze&RWQG+4hV6dlnn{PL5|9XK`ML zXK&=z#s<$^Aa$a=%pM3?D7yK6nk^czo5N&CDnE`P5H{o|#Mw)yg~)Fq*o* z_r~1gn?Ob@PLM<+<pwfpg=eSjgdrBm6eJeLGJG~b1E$;ZU2tu>)F$?160 zv%$q`sF`OHtDN-~>W4vCuIU+HeAlZ88?r%^O&4?y&1 zBPvV3r3n?g@kbqOxMk|_cz`keZ0AsN1v!Q{MqTY(HBLTqv9J~dyEQvv@uLm#bU=E4 zj}%S!*jquw4BzTt_QD-IhW7)uO4*Ts=0+d|gZ_`${-!G{7wc!@^jC3+{+fHI9a_K7 z3dT;KJgSpoA*eftVj6vW7<3OEewXi#??1^hhG{x$&YFd++{qp^w~6(fk{RF=c!O+K zi!FK|XL8HZ4XyS9EhCU%N$N*~I1n&ITiDYV$d!Hhi%%3q9xo821E{=OF+fn)k9T-xq;P-PoduPp6!*e!Ik3)ZEH2+zaE&O3n z{OEyTG`a7_?fbu;ei3ja)mryz8$g_=EjcO;$iPu|Fmn&~< zmFkvfvZC~Z(B;-A7OHD6n0p)#h3O_nEAfcL`u8Ps&JT~LO+OeXR>!`fnMHkHNY?6%zLn56q3tmG;LUj7K z)Q#Pz1WNzu8MC`e4&JsHZx0IVACkU07$%H;DL7v`PtvO2JAm43yA*nhU5Hl_AQmq_ z5$Vvf`r}nEf?J0L_lfQ-xeJobvV=a0<4Q_vvUtYrf;QeRple?X(x+76b>uW|3Dc%+ zi%(z+_DcJ<%iaFvaO5~UKwaiVYQpJ>kRY9$nEESc?ay?k`ulf7eNx6lmF8|v;Y7DB zt>CjbK)NEk1qAa}$Xi!j!Y6Yd-EYNb9(<)tCSpgy4&&rw1@)W#e^MfYg#~3=ir$JJ zK4-Dw_ro%I-uSyiS7Cy}In=IHLM%r&_OWVBA@2S7)#uBI#DZSUkJJZ^q-Jtx*$2qN zK_S{m&OqNX>K)4$r;dA;wI>yG@;Jr$W&tXZ+9?7Ak|@64&+acUELdt37^qaT75nvi zh-_qRvX(WU3z~^{EdLHb%6>FcHocSSK=C72Nj=6l#(>(VazY*_x&apdyt-b!8`X`s zvTnOV`QS#QYO$V}w~O)Jx~y2*s4&hn`Z>qm2@2j3ZhzbIr$^t|tyqu)o5SsX_(@zG%oDwW1%_T9M&u{>Wn6s>Jg zek?ymCjLI5nH@oQp&{+kMee=unp~s#FR>Tylk_3M;`}`uH)G9{aytn+M(*}Y)_jY! zvR?wkvzt7*YIz~$&^(f|>m}K|;%tf3w#KBafJB@@11Ho*IyYa6yJPWJkETuQ9U9Mk zOSYyuekn?<63Kt|An>rLHNddgoxt#=G&@NEaf*r1>eLUz6qesDc>BI3_d|cN`mGqs zf7WL+RytSd-_%HWAw1;tg<9)=>_b?n=Y&hq!>mMjaLzVgwDzrj_Q12%rBSK5#B2_UvKyMee@6i(xb<)G`lG2 z{*ubfenb3jHPdrM)h-T4h5F&^R>B{R(S5rj2lx*p8{??7gsVOtZ&z9zdmOkzEFIY2 z$xA*0Ph#p)r}J;ee={&$UY<)$^_MEiFp-A#}uK8!!7h#jF@kut~8_ zPz#%?ALoreH>Buj#P{d>^R|waNm)h%D#&%E9CvHWF_fI zFzsu_t0vjYUtX87<2cEwHdqf;_R1sq@bo8#3iw>I#Usv)zdw(AyaXPGS%<9{KBTJH z{EVZ*Lu`=rNV=|nmHm6V>gNc_`xnWs!i|@I=r!wUdS@t*F-rqh?=Q~p_ugakaqE0@ zXNC3#6JZIt9I8n0&io;*YuMQb2J*ApuSA6y8f6oF>ri<^CCiy`Tvyer-fI1CuSR30 z*8FEbcTk(I22mB=jL6sN7mr2F8Q!4QNGyy?zA?C5x4a`w_+mYJZi(G>Y`fH$w*0sm zr}sJ8JA=O`8AzHcLc7u0<8MA^8IB{25mz>f(zlXtrQ%gW#GK|dOyz--C2LQQ_SR;L z=-vi=X_Sl;zpd7Tosa!X#dhh}v(WkG#b4Zf2qD7oEWA&3=3~hY(P=Lw8cSN6^L`2F zTJp(jIGMS~Z+@m!OfiP>-J#6otNonJM#eLoI&?rX+zmroIaATAy*8uG$Wa=iGvSlG zjb&`APTYaN+gtPz|1*nB>y5dMaIy9c-1+A(7I0SsNaVcpBT zo11eYUc#n$I%kn*nYoeXZf*A6aU<_`Wn0&ag!({h6q&RJUu?*tD7+iXM}uT=xL8Scflr{KzVAp%?jLy=q7y z@gB+0>LJpy)8=5S#O~maNS=acKg)JV(6^T*D6>E=hfFNrZPB22B{^xgZwmLRJT=lg zu~M$no@aJ=xa#>(&c8*2p0&n1bDdmSHKsOv>Gc{4+1A*c`E?lAvdphbvh9W64i0N= zC+&sfH}Vg%uX(@AgL$~F@^J$^Gp0FrrZbo9Ia(>Rv-HOgh z-IV~imtN_YSVVYojM4nS_6HrQi*3HP@mj8wAOqEJ zuZ!}ykUFjU^jI3z_nKi^>}#M*0nonYY6YR_FJR1LZuGS9y< zUJ{d*f6XeT&bMOy^htXEST9zVKd12wVG4`Yt)EEqR~|ZF9(?_j+_rEU#tMg$>7G60 ztWD5+bhp7Mm)brX+m5MAZ|BAz3*l6-Xuj{(nInkot}?u--~4e%T|}T4zC4t&7b>^; z$U5A2#PtKUf`%aj*3GJ*AblpJVS$)Mok7;ZYuo`bsr7{~vELJoI-ve>W*ByGhQQZi zoEmmyoGQ)KTj{T;N7j*2iL&(7idrzT`?9$DL_SXwz_(2TT)h=8bV#~1W zRf07U2J?B(POi6Zy-4rAr(`11TTN#;5)~$D?eRN*POUHKFuu#RWXQoaxpP(o$Ol9`|3p$}i z_;He9POw@wt|Zsv$!`c>e!WN5_vFqI{R%p#t$*mgcSt^vSNpS@A2@7tBLBDIx5uNBK-3Tn>X@%F3lrh-W9^XQnCJ( zH3!IAlJ)gEQti2#oK!|mj=X|hK9<%8i-KB#X-W@swS}c2V$tt+nb$_~q;t7iz7X$< zfe($!zoF-xkDI{= zYc(kBdG8&6wwQQDR_>Ojuu36g&IftBJOX6wq1 zo|MqqcAL{=mPC!#QXBhKiY7d4w6x@L9}T?cC0Vdf8*k}rD2`x9935Zb2r(J*-Fg$?xe2Yv=UwK1ax} zAMoB4Gz^j(*+|IuP0?yglThwCgbL`HnS9DDXi}d#NpDw*iRv#ik%TMgw z0{3g_r=x6BJ=U3Fs}-syg=x`V{_Xfj@ZaV<+OIFZ+Ebkq-^}@z7FT^>f83wf_N#s) zM((zWIQA?L;BJW<)_phE7_LyOO%%zBn_cL$SdV(_@8T4goh%#JdfruTu8-C~{S`2V`-ZXN(}~j$>|dTCAMSOsL3{Z) z0_{)vI@OqLdv%^RH6qbwy0LO^alq&>A<`&Lt=ILnPANy9p9bwG9++|uWwxHl>PbY< zdhL|EwaHGsb7#0SVbXhrXoH)ZKUs~C|Tz&u7~Z}G%{1F*`u@Q7k@K08JNFlf~*zl+-x{IlndK_7^#Deo?NvrmC zAgSJu)?!L&GE?ox4<9}~@egO?xce?r2G@H`J#mYr_QB!T_enUKa_S`L854%5E2l>k zhdnusTz@K`kiY%a@N<4AwrC+FlLlE@x@2l35GTB0N<3O}c8oP#wDJ4xQgFbBCYCa+ zhPxj!zmrWfcbT}6;?`gns0dYf8i-5uE9)!r+MN2`_0(oW2p4ar3#V;Oy5A+9bw>M( z7UQ*sZCo)wvDG5sM8q;0jmw0?KT9+mm@YqYX>2QM-#nEvy8Po(^@)dz>yr@jn5Nf) zZZpMSq4EC6pX8;gq}Qx6@?ydE3Omc+ErnZ6vzC6XB#B`5dT&<@Z!bTTjn#s9#d1VOjB_J}s?2jVT0#`Y4diUz8y8=q2iVMR zYt0}NjzavH$Xt?_yY>QpMjUqUA|J2UobmRPN$PtvU_9&yNoUlHBxsf($Vs1+>G0-- zT+XAsikcZ@CKHp4g{q%~h0jT*ZDL&59|_Pmz*=VZ=O=fCRs zc19mQVh3w{@$&R}-i-P?uT!Pnc5>l@OsoIqJ)6VCS}7H&VQo$$j_gkDmqp6fa{Yd3 z6IWL4c$3rkSt|F*QE$?z@DP9CW?1ZGWD8|zCDubkfNkR=a&`KJQk#@jVd5M{?)5z` zLyyOzx0Vt&{J&#w+?6+=XR?j9UwX87niS{1N*z0Jyl!JaHzl}GL`T(zSkKNh16`_1h{ zUA@_H7_)A>#)MDO7^hz<2c}k&{bul%Uxe3Bp|f-dg-Z5tn{l2$E{pnBiY$39>Oyql z0~0O~xXMLJgrFuy8lTMGLA5JW1lLI?;y2#Dk4}pkGlIbjlFTrf1tMvPp~-17XJ4x) z@K>Daf;U(ncJz2wAu&?y+swP^uc88Z0?;C}V+|XsQ#MSdb|3Q_T)K3l)^uWQbNtyj zU*$~Sq2U%&!Aeze{;g3!iriMGE^!VLZV-t*H&QFD-4wGqxkVeSeYQCC-0A%@dlzc< z1$Xs~5iPF_@4C+^55i%nKZ&y3SXa9JyOc)0GdUS9@6%Iix11KQiiRWKF4%}H@WnEk z9NfRHzA1k>@-~U%W{A&5ZC7fMkT5-!!bV&i>&%Wy0$mCdk1iYg@)VM3D$*!N)=yib zvZK@VE{05}ueTIiTq0MlM!FEu%vZgysgn~9nr~vUdZHXOzKHt;)tJf)3pM&zsW906 zmb-z}iVRx}4>x+-#2e&{*8P=SUU8b6kM#{fucxxR{)@k6zlA1Nd225OL#(Vv^s6#U zjFUq|Ff}i&0hzyf+%h9lOS&KBqN;xNw2fum81JJUW=7C`nr_x_%*_Q-;YL(OJnD)! zB+9*~hV3{Aco#Voj*Z!WpT|}Xwp84{RLsF7=q~eXpm6S-$rOm+U?!kXJa<(HFt-7{ zs~8W*RhCF<$oG?OicGdFv5dC1oJO-R&j_2wr&9~+dbmXaA9EwJgfo|&Xk4becy33o zyyfKJpgL7)JpMh|AvE#r=kdfHX_lVo6wPB2(e^7;GRMr@ml`pv?maIgtW_Nk3y#j_ z&D~wwA-B4hTA_;Xd}bZ)V^6bhi#q)t`?c;FdRad@9_;mj^bb1wEbEa(HCI;r#J5tZ z-$VjNA^V(iuV}K{k(sdPL|>|=7z2}O6rz-2-_kTW`zfa$&~W}HO@3CFb3Y9K9J3*k z?a^o}mjJcVw4xc?lOcftN!p4Nwc94v8?to~E7?uzrfA8>NKRc{zZOIYIX(?-%mW^-fHX6jpe4-THCB zQ(Oujv0ryy)w3bO`o0WTk!CvOph8)j=%4*Lna_K%*RyXC@$!Z*vP!qv@TOEv3RBK6 zk(|G+r9;-;bmV`GQaPEHU&P10GRrJCPpr^C#@tYM-SHUucxqe*Ff|M&z$;_ zAGP%PV8>v6kn;vNl5ClA!K{_WUIp)qi__}maw0P#&`AqIy^YVu7^P3ZS-v02yCS+z zO11gO!u_s;NTY`U!2^kR?a`wRGMUeRe$A(Q$@FRM;|)6p3)bAw2!=J>j?PO~Pc#Wd zB~x}OP3^=N!Re2RM$Ke1BmHBP>1 zxZfXzjNiSbd)&jSi%1DP7O@IjV)ZSHmQq75zTNe<+(tD(F*qgcTYparQw>~_n~NEl z=0!1xMXr@C&@IQDMI!NgKlt#SdseYvO0a!*p{l>Y<5(n3vz0ycn z-Zcpajxm>sx80SO9plj`ZLX;$G8i_kx^1WDyZV&$fedHuoWzlh=ft6vrQGPl5v<~+ zSQA$s?Ot<-(Vh~I?YGkv3=0Kh04|q@k`BC`aQSI}OFUQ6Lhna;17OFO+)(yznF(8Bf722Fpcft81o(9a=6+M&Bf_;(IyqR7^CciP7FR zU2NgO30_2*5jk(IgCrJ=ma#0AlrYk0>mCb`4~y3XGmHLP&LM9`%eybHbmB|R@Ek#e zGK`ZBNfT=jO@GorsI!nJJ`<7;3O!EvK}?F1nWtI;(Rz%cPOCc38o@FsGX%dry|h!p zP_qV%isn-@dIFHX~2_px>@sqi7=Ce#eI`z~z*l;Zeg=T7*Xok#tV_=9ZdyEQYV@L(2(Vf_4R z?-7@gT`eV;=J`}7!Z z)6TUedz$DYHKJ-g+z(n=;{`v&H=BsnQ?{_GjW!1>u>4*CFZ&M$CTC_E{*QC#Z{u`h zYcU{C&qp5u0<$FcY_b~W1l(6gE*%FonyzdWT&T_oXJ22)Lug+=e{>W?+HUuz*pMzLy`CXZ(O5K z!YgsKzylsMJ0QMw#P^(}hQdQdPZt-@%ztMX=?z7Q;D3Rdrxzxj!XQzL?Ya%2?w@uU zm|?USpiL8+MXApvxX7e?(iVFvAo9&t@>&4BilH2ipeZMz2f7lcUHquR|P? z1#!-Lxf2MyF|L-xV$HB+@0&CWy+`B(xRpv()$BLhgT71320XVW|4#}x3!j|`>VE(v znSX6+_LXhgqk=cb7)vQE+~zBrz5DznDTtE?RaHE~_ZLb3gJ1K8rAp+-(kqp_9Y!!< z;mXlN=#HfOa$#Gk!sq`wan(sE)+uv~!ZEcTV}djYP`ax3n1I$Hv3>!h-K@QXY?NV| zFx4^^=;2*{{VH+`?k=j-*<6mnV1HEXw$X;$gccVY&M1M;!!;-@E|#qRfJH?dBff12sX2@-5eR@)PFM5 zw9$>RXN!J8FL8LC+F$q(ONYHuxhMZ&BSDZRJ2Aa9r8)T{7`hYZ;>)bp6{H#p`e?qH zW^$!UCE;?d_L2x6KYv=NGn>Fc^`!{6apv$9p^M;)yN{{^MTXX!V4m(|XlUTC3Hgv$ zoAP|{-y)FehKMK5_jv#IER6?kI~8c?Xn3bclXZ7x6{~wwUx#nf>v(=De+!+yp^E*% zzAo_NC|XC^wOU^{6r}^YgNk&L)J88WmUqqg=~ztO4gX<-*?;uyY2s9}3z=9?{vB+4 zSfRXE72RMXu;>N(LART}bkmrs`1YQI2G_B;__A7|4pp30Dclz2Y&w&R1LR9LBuna% zBx&H&`N~#F!}#pvJwr(^OlaMpE2}IAv;YGbBKGb{oix1R_PNQ%6&A_eHiF&917?qZ z#})dU5j5jT&3~u!c<#nrTG}XNb-_`cC~2X&3Fd{W`nA6AZawk=Qg>-AJIZx6nRsx2&$Y(sii%bF-CH zw-Q?Bkbi!qzHlJlj@3ihasP+(buaDN$4?cmxFY7~Gt79aRTmi5WwWq`X`|_42#-&Uim0qp#*{PnXD!SoL zQZc)m`CrTP70up?`Aq#+!l4*7h~qFZX87sEdeY4l8Tq=|a^D6N;Dbi~I z|9>Q_XQ-m*3J)~l=Rw`$=HW*8iL4{PX!_;s_N06}l~R$)fWg=sWf_ZjQq=zM1ciRwuDT@io@epMn-v;2E_}#DC(I!SMhxmcb{cS9?bRL9pRwft9ANJ0GSp zL)(RB=b0yNe=EErj0-wl&AgPb#f8?X+IN%(_i$X)WjtoG^m#f>M?sPu!i zRZ2XRxe+EpUK*-da4U&Q5&ktSL+8k0z*7)}Z=g=(%$VdwF4co+Hywe=N0|m?G9HWx?hnpWmtusO6=rxzBCrSUuS7Ik8Bz z5`PHGA(17%Q5<3A!@jE&`;OTTplFHw_%1Ihsc^1S|GJ@@t^DBX3nn^)*j@`~ubO8` zo~BKpQyn`~qfLQFw@k@4Mb=5xCVy@?xeoB~1K47-xsJ%jV;g?$X$AJUEnKgsBDg6z zck#7n&>T5)0!n1L3LETJmTh$BmBrsn2jf7r9^yu*VB3at8|jy-zoM8D!(Sj&MI9 zz&;&=8&rw#zJHEL$Bzp%pF z*23kOhcOJxelv0&!^YVU5Df{cA>rN*z&!1U6BVpn48VQ|#4Cz{g*U8ni=opzmX&Yb z!)j`>42z@GR8%`rS-u|Pc16tXl8&Ck5KOF1bMeEpyeSIxa(^%?0wAUti0H3IGf6{` zJIKz@LYRtKcM}doo4fyP91O1vb^%svoNzlkNuCpMUw$D5b&$W{*)qS>brID04BlfP z#^(A@uMM!FFCi0=6K3HDfpIqsTU2t)nVeS376+<~td5(xw(syBdo2ZD=753YvfPry zU$z%%?8KX|&VLV+|NS>bj0{hlZVg);ZJFI2m)&UoYZWMUte(-{s|i+#6ko~i7^|qw z%h;=iYE~LXVFlIxWyTvZBYG@5e;4i0I1cm`7*^ck5@bVl$~lc63z zlV+Xcj|}4x44@{mvisg#>i%|;zYrJsb16{zYw=#)FjBEIN?T@#JFS0xH|-@7aq}JU zkDB-#OMj4c-X&zd0tsxNCB4fK?3GhoDF2dhbOxEcc6?VOKQ5X4tAQ>UZxeEYSVd`O z6qV<1Y~kT`uo;jNh0dUK!3Z4Ye~s0UUBPAY=Y_<-81FXO;ODzM8xfE(BYba9$saR~ zMyEYzBc=U34=IWlEg|1u<8O&h2md(Wn9_0{CV$Npv54JHmFVa;Hh<#+BkJJ!8_Y}1 zVFdh)YgdhK%kS^qTuJ~z)(f*(S@~o6Ub{+WH?7sMA~yZ-S!OGfcegm6G>VX2kssN! zVNYUN-2c@KRh+8wY?C7C+wC0PmsO?)14NXmu9?CdnsjU*@>x_w-jr~xe-(fcSI7Ma z6Mt@bRZg=)JrLL*#=c=xUAWTaUdN&~DzpZFhxQY4$^N{NU+}s`ElPkg;_K}m;nRa~ zKuS~Gp4%{cab@gRMxv?Z_P0Rj)rj;4R2y(w0(Tt55kO3c%W0cyg{VdzW~x-6_=h5L zK%`Xpzbt+z&1%WOz_Zbtcj)R8iyGld6n~Qux~);4W{ECa!X4}z{7-G2h#X-@LhlHR@qepJ+tZL5J=0w=Hn(B ztq7Qba})3vTGT?G|Ayu0zcJ|?<9{aFlcoX^2D(r}SJ@`i4iRJYGcuyoc{On18q^R$ zZU2)|fTLbjhnW(W#_FZ~;w<^uI&q2g@b4EQlC%EGj z#+&55WIWC=V?Le*g$|ImI`thghF_053(AhZ-|L-I)S9?zJ(mxL^_N!`eSeiJ46Mx4c9wFTO4@^Kg zK*;p}_&g#vFiu6I{@79Adx|@f)}F5~$suR@^*3M`;WGmo|NZQswg!^{%VnGuW==$g z1v;MsPMya86F{zLbGVq%Q9abG>t)E!Y-u>3C=C4YZDdX%7tjhMY?=6eybH@Q=0;I_)`Gg@+F-F(2xY9Mk%Hx2a>Jy=RhDF4Y|$c`8$#1_4H{)q`ZM6=b$s(L9lRTP zEGx(h*Ia0-yMLJ3vAkOZH=%^ho|+w&c7iuZk(O!QZ7WF6OMxDubQd_9ipD!1$k?hW zkaK37tJKKy*h7;w1#0>5UZnvH;kGMJkj>4?M@eXe@Jgj+H~Mv%m}DT62ML-0me4Ey zJmegeWzfNEqGDwfa*jqaoR!`M%ja^dP2tC}3BBmZXMe_|H}i3y(dOl0<^NX6`OC@I zK39Px6+$MBM5-kCi(asI&F<-dy~fwm;qp&pEChpql$^YuENZE0Z)P~lBY(kUb?{yZ z=R|+kt$7#WgFZw&nM%&TynXmUN4PPlC~Y$%S~2B79So&-xp;3`{oPbUfeW|XU$L$6 zpQNOik$+e3d;@PkbqZ>U-EU@dklCh5&a~dF_*fhT#mIG%GnSo%08OB~;(d?q(Yv;- z16~*xxQfXnNQZ^eFM-T~1T+(co+x<%&*D1ASzgnKq8gQsqfEwLJAxWxwnWHbFZk1s z08+!y*p<3~ICj2!F%UsL%NW?SPrWDQPS_%d^X1-k9O! z18=a2u9MHfW=UsgQic{ybj;B3J)FjD2szIC{-Yf**VVndL2Lt9n!JE@n2mnO4IcZ|Q~sIf22>*PdC!Y)C5uf9(?7Ou6D}EPuP9 zjy^#?nWbU4<`|{&Vlk_jd>9_E{qqwvW-*t`FOpGs>~LL&PYk~8pj=po%y5-*8xg0w!@X}~Gd)EGM8?3wXE zJ67_S*PND2Si~|*A|2&Bu+gKIt&AQw;FvwQe?CbvokgPck5pa}r%IOl#%KYb$I8<( zB#Sn?t2yB2y5NJ~$3d$~=EhYltcO!U-MS+?k)N}fY@4~lo~Vi>3}CI}qJQHs6B5dz zH5k+DHJbN6S=9ck_k2Zd87GQe<>Zxl|4w(nq_mus2+hohfg&ajD~u&}s~Dj@Yg}}I zhj&cy$0>PoX1~nP$#5I(*`RbX=%Ngj`henhse|O%XM`zqO@RRBl^=&QYzD06xM5*W zXfR`pzha-;2vce=DSg}b7Jq>A*CS=11kpv!jkyI}!`5{Cu=(gd1`Nrs&>7Qp%pVIv zRP+FD+vhI?ChRU}I!dvgk$2=G1*j5`a)?D^b2SV8mNac?HC}c8C8O;JD?slfBf$pV zM`XqzB!G1~Xo|@J_3CaIbb2Rm^r14r#f2AEg}^gH{fT`5GC5D;dVf*3*zpo1-MqHR z<9(Xu@Oh`~K%J)=CE9Z#?%kD>D?A&>@*0CzhxLz?RYoY4Lt}>w#)48=r)uLJ2&NiI z3rLp9k^f)ItsFX@MoQLGG&C@0J+d%$367M)f%meSqddiS?g09r!*4ETCR8@;#SHc2 z<R=yXE2ZRy*Om-3;=v&V0-ectx+kYtVT|dkXiuNZW@eA*E zll?5+_j)lIog`Kn6T-c&7gBb*;xL{L{4*INA_^3&8LIEPz?|8BJiWx zzpR4eR0Al?e}7$z#kahzb@H63xejEQmyQ%&dOlrpJSpe7kpt}sw)gtukP@t{u@dC* zCP||OK%ZNGs!_~a_eqCMpd(vX9p;cTCZXK2fR1$Td9(fP|HL+;Wc8`3U#$>Hq_ z#$z4IOsZIhVhUELx{9N}_afogDC&UTcp6_+DE3oow?9~fbXkGO0(Lb&`eJRg-p|DG z?7SX^M?0^q?l|hVTU=H!9=9o)A~Lh6?g8Bl+H8-o?gYYju7vAbE2+jY$Xl%bBipp} zI~I?CyMNcRy65bv`Gk)xc;@7pIYk^D!H|6qB-5vG+yLa3M+`8tc$&|~Fjn?WlO9nB zp`F>q@Ni=Gx|#@D;8Ou;^K=m%dy~2%%byXwB?kF*OZO;M;#^s7g)#wFqb1yjmszD; zToH2WurJS5nH4T#xVb3t#IhR`hpc;_p7(T11u{7Nx#axKtHnz( zz_>}GGI%J7!^J&hsbduc{9sFq)qIKBKvlo#o9gF?lu9qQnD;dA6VozR=L#9fY=>A{ z={AW*;PLUVRB33UM>V1Xwi_^z-ZI{fAO&1Ys*bGD0wSjfQtXvXV|+Z^O&gnGqJMIS zR+hBin3ADahty+LhEcboaWMKU9xY#;4a_w!-Z40T;7ajUjM%En8pNU06we=}CpkVz zf+6Bc5b6|j8@S8Yy#8c$f3vH-unBEKLbSTqc#qMaRay-JC@wv8_v~V<-2F&B>l762Lek=3;&&v@s~ZH`j@&cn}52BP$2Zw zyFa?#VxHnK7bi&gwi;@qo#vUz(J=Zt+NMCYMnIDo8t47)Mw;7nC5>NmILB$FHYsUF zfy}z(oJ&EY!c11wR_0ccjSxgoI)BZ506j?5UbDDPnA=ASS9z7#plKlzK#LvU!mmG4;MhUGlSxD*j82)m9tDg=3ljPi>|4+|w^GJs5lcfex6ws()U+-{;rku^As7 zR)$*5w*{B*%{y>*+3Pjxi0IAMHo)Nbk6z?O{ zK=S}TfFY(_;%13dEk3A3+LW3W+B?7;X-)`GePlp{;C8;g-Prh^ExeQ-RG|_06=KX_ zUEBcoY3^jJ_e+355P#Ann3upyxEVy+l-dzYpI|~u@Wy1?ax0nIput+`{pk3M$y*&) zBl9u5R(kPAmdRqXej?Br;61%-F-K>;Ubi^Y%FtdmB6kH`csh`b!$TW)(l&mK`Dui7 zq}8>pPYX`lBw1oY+R?ds2R5oR?sI!OPi9JgSu^L#CYcI#yMOhl2;oxJ%kgqk?{TT8 zW1<_GLW>pF1ya2~&10fauJBLA@Ed?5FKV}F&GMEM#WJBDO4Q1Dl@iL+xB{gfb3vEM zAvX|67~-|R5_p+HjhI;MZ~ETU$ax$Lwr8IU5;Nl+FCYF9>4|#D-25_ivTab8Eq^0AV?a z0pwp-=LBJdC(OGSVJR-uOn)NiPxbWtWt@vkfTKP+Cx5)M!CV1uPWBdiw~^ZT<0lxaK! znDB)Ly?>ryXz!-iHGY5`vaA^hC^NQf5B}Z+yFxvQ5IFFLFMYVP(2s^>vTdYvQKA5- z#5S_7vi1&hAk!N+q#HRFFL+L<@^wih+G>fg@16XJ;etUjye{EyL~^>!iZ#U;917%NeJ%P{JJ zd4pD8fTQHf(Nc$pKnn!1DvW_71(orBf0oji#4e}UF{K$GOBfB_&K<|}(7IL=cYneK zlsCBZK<%tHVGvXr+;;gT@{->x?=j73tKUQ%uyPDj5Q(%dwzGqkY&@0Tv zfFxE1cc%lzNPT>Yz|5D|HB-m>9XlYj958RmDb z6YVTuW@PjWn4RHSikV7!B}hUcBJwN!N-kc1H@@D1lICYVjC)Z_al_;HI9C5+Vgq(< z{fXdRRfQ2cpD1;Ti5FYUL?%)e(oNpZW0`j3*PzhMpF92M!`uh3c1}$MwLBNLfhvzUM9fop7J{UPV@RxXiD z9I#)~YbNgoE-FgkR)6KwSgYvueR7A19zIAMqhD4S2C{U@wuJ0-RAJnsl;d-z0o_5B zv&Y0E>Y#qVg*i|E*9&LX`jBYLF9Gx1GKkg(awcw4BVy7QEFb9MN<>3Gb2w^^ z{ZLYllN^b-G_Wa`%8q6L$v}~?ntEmfgD@1EbsRKnZMkqvB`@)_Ea>A%lZk%hjpu zS*tq_2hyVHg%rG(Gg`|&5mCi7`)`Ocj+$yR3&A8VZhx#bx6HlX+pYNBN=?T@y*&37 z-0N;lvohac_j>bGpb|ZXO@R(x_$+u`^3oSwqKq`m!>nMm|A7;ChItu8ofW6QIDj*j z-CyZ^GLCNeb5uCsSO|IF)!Zf_r?N&NZ-W}MypHxU^e4!&?=(C$QFM8H69xUMXo{f4 z!J5i9Nq_VZoGzm8iK2gAbjBu_)VkD~Qa;&N$rJiO4cxj)h>S{41J{BCDxKvbGI>O( zcvIQ@y=-c07)sLf(Oee+tjuAmmsIZ^jpeoo&z8ND6;LKCKHysxy}Mdqv$sX5N0PG zrhm5fXdW`a{i+o zgcj)arNUDXwy0sEiF)COnL-2sOT;FBLl53@@!Kn#Xc#@ApP0YrW;^ElCGvD~<18!2 zCdW0bKBhTxoc{!bc6G*|w068WC()5!fPbUPmKat?Qi&14 ztkR3ze*mTu+VJ?BGJs1cRrqWu!L9K&am3x!^+%lVn@{QBv-j8gH799{-A1&F&42MV zjlA#)22k2vEuajr$e~L7C(o_U_iM<(8{VV>TanzV3@*74hl0R$a4?rwa*w2Or4dQP zHRb+xN(T^?FvNB&_I;guqG zd!?WH$mELF_oXRu>c&_EAoh!^k$;Zm3f^FrsXHth)n!kpM{M7}{up-#03KD5t^!}Y z|Fn3X=1{Nb$_(<|-`gyZ;e-ig(lAz?(6SqP*dKz=VZDitZ!(HkNx#;^?w&e>QO9M zLG2HkYnMxjj6wZ9=^gc{T&V}sJc0`YLj2(oER1{TN`G0wrbc$JNHQuO-8LeP#dyLP zeL=N452BHvLGNp-tzY8(wt;kmZMSN+UXhLTP}dG3*Q;cHX-eW)>^hCm;+2k0T(!i3 zBr{LUii4KfA>I9IJZfeb{eL;1+jf1h`R@wVoWrm26j4rVvd zY+nZX!RLQC;yY6b(D5PmcL&X)5JD+STVwv?Qkpm?+gXpGH|<+NQ_HZ^s7*HRcd z-J>`3sWo>udvz=-!#J|Y_Yp?5f`~U3LAdrLI~sz+n_y9%w(LrSftHZMxi=PD`aEp6 zhEGGX+T}l|IMimdQ-Y0$*trhh-X%%YL!HSn_NPhc(I>D(lIu-aBu@ek?C1D|u{<`$ z+&b4R$g+6d(VV0JAb%A~cur*v^M}M60zk_Pr{vvMdL$)s&G{04$9WmldEN%RO|bvd zxW<=#^s^fM20DylJ?o#I;W~u$N#{i88p*%kIq6!~f{6*i%9l3XW5QR_t=(_lOO?G6=zno-#XpVub#e^LK2e}LHb^0adW2_Ly?(tWdM8Td#@-Mf$VzY zy37kql2!q+PNq4tz?F{VJV9I-`plOQ%yI*MDFe|d1zpy=ngT5UKM9d&Zb6#(jVWu6 zEa9K8o~FJ zf@FQCl7AaKqxBl~D8Q;US3N0$znwBCkiIQc8&MF<`Xg=>4!(#sn7e~D>MI@7`W}Fv z{7`|^aa(d#dIDC!B4lJQZ_YnT77wA;ZrrL*E!NXfvb^jlp%-64u8vxEmiSyVp|C5I zOU5oLu1wm06)@3A6)M1Lc<@MKIk<3m}*8*m_pDUh}Qu0$;yEWra%%%__V3eI~-9{=8-&evd zh0=vX^1NE$NW4rKEdsx#8$2kl)tL4;ee{fEa^e$xe_yZPcH-Zwg|R1>C#m&O<$p6- zDh9@2*mu}++?fGHkx#qomigC^0~{%|g!K$7Nt*_5^;sd$-f;O1)s^x8-Dy-y{F)zV zQ&i&$b)Q?u9j4>?Uabc}dhiGsM4qMm3hJv6tw#ARs3wv2ohwn|?7l~zr^x3WN*@h{ zJ3cC2Y-tp|C0cW?2}P~?U=g~Ok$>uvNHaprWBtIFB;>5l_S)HXguU4zj-VegTcG80 zAh3wtI2{PZq)2S!nUBzLG!m{;wsBPsLugPG4l(k!CaLAEUKOlC&}N@6i@1;m(OSY^ zX1Z4iFS4;NTyh^x$;bvuZ(CzX;$l4VoEW-YT%D{dkzz>WdEK}HX=Gtkcz=g8>nB^x zOe>BlR;b%cchcc=JG&ia5C01qfK%4n@FA|mN_HWM!+5xU!np=m*Pi= z^M-RyY#%WeF+plQv5P!v^oAK=8dFIE>xF_TK8_WI1^V!ayO9zBQt^_r4Dq&`{aaqP z;<-%zJF3*Lgk6$QrlCO8Cx0q$?j^$Yd$vQPX_E)*W!+G=-rkSBZl)bmZf_ko>Mc>_ zQf|dHt!#m$rjDH0B)6SptooWP|E-K(9&U!R5I8k^*va^%X@}!w$zCZuSU{OtYXE~Z zT1u9HW%ez}B%DV%L-HHA(wi{?Myg#8)!3i`n0^g;0=Y-XR)B^*pnthGt&-jLlov%+ zWn;4Qqy1NlOi(Q3tw}^JBVDVXtUvjy$?{(D&MkSurNNt=Oi2!$O4s$m?pnHkIwTsie;k|xL*igxDmT@8^YTFDg+kq+Re_3UhT~Q zzWBTU0c=FWp!=a(UtkO7B{ZVfhZ0EJ3DG3)*qQCy04yh>8ip=sWrUP;mRm^m4SFYhvItAO!2-u8w@EJb%C0{AEZVAc!tsAkhi4u^Ws8 zC2xv0*#D1LYM1PVbt&udKaSe1fUQmlpLiAQNr|JfzJijA-sBj=Gwhyw=Q)J}n5LBm zrBALGFyrq8^A3S69$;R{>8U?w-r)`H$vQTbH;?i-Z8 zKt2Ts=zsWWL#85x?IDUGYMBWWsMXmY5z9>@5fxkUjsIG#H;PHXH{nQds3$<+8coH^ zF$FjJF_$2X1X(u1OC|ad`WL;^bh?T6y(f_?5KjlRZP}u(ZeES9j6a#6`#`j@5D-|| zsO+vZ-9<2de?!G^Ex|h$6#a_v+~B*TD@F0!SbuR6r(}+Ql(vrvN*r%ceI|f03z^7) zyc(m+2g7}}^T!dh+O@^~a1?W=zQ8CeE;M`d&{A%7D>>lakd_hOXl(Wg_@Z*LRgxJI zZShyOi(Q?U0CZ0--k%jOV+K)KKi|)4YmkNrF|Eu;4IUaw>=;_kvu0NEE&KqVB z$|!N*WE2a;jUu@>KXAAAF#_)IINO`vp6E*I=kR>pM{sQ#iFMUsmw~GsfsaK5ScKx1 zxo#L%X2a2%G)5g%a9i5qU|qg`5JTp#pnombmrzQa2d!$GPd=d`GaC6lT-c@?bkZaS zr=A|@>C&NfB$X``Pf1THK$X}2>bgrH22D?!dZUB8m$9Wu(}XIKE1Zim*}H)M1PCu> zu6~W9SHJd0mKxtQru!WxkT6M=tCjuts1<-}?1#!9o?`*W37zogRvZg9pNSXLLVp8G zr#RzBY+Na4Q~UT#La7Wn?1@#f*IuD+gu;A)&@c(iZHkwl_WST_xQuN`at@BLZQmpxu$^%b&gznO7!zy0 z4Xi|pDo4_NxFgyr=zn&Of5EINVh#`DFKp0kmTvgN+C2?$-1hHpv|z25Z5&F=Eq z)}rgDuG3enzgHp<&G9$r4q^X7a|!dRoCsv#+x{hELUsO$QNjie*tDAq)Yc|f6XsN< z8Kn*q=)}+@_H7Tx7=E@RNPh;6UDP7$tRH)`Ih!mzq{x{L;IdY0tWXiKE(BYgk%X2Ttz7vEQ6fEZjclh2B@6^jQ+f0{WT57 zZ;Ke-ZUbpB%c2Fr+`!o%LPJ=}xYReDlajlM*?wzvaI`8T*HF3f9e-E(YW{bL7KQUMDw1rVgCKqNx@Ed!JPWfLL7LXiHMHFpx}-8=cLk& zEOPz)@e|9GDhdcdWKi1x;MEfuMZA%HjHtalo#7Ck=5<(z)z0$sJ*wNu7(wWxW1Jc2 zIkBm`ViDl_Yp`$DdVgFAkbAE{_W%{Y`el-tv5vRDJ}dvl18P`jftNRSRgGX(3R7z) zBh=|wigmbWd%Og&DAzR~R=RP=2YN}@-u`q8GwHF%Wxa&Q!9(Ff97u%8s^%J$Do7An z34}aj)MItPbY)3_=+9f!)&S;}*AkIa50GRPFF{TL;uLUv8Giypa-8esToslm@!Z#2kM+@rm9wxWICwc9X@9_B&S}4Km6Sck&OhK zK}a^$u+@STBrbkucJhsqJ0yyrkz*i+kS!cRc zm&ho~mJIqNmq^Bk=5$mTp=3IpVARzy6uF^;2a!uV6DKTtg^ReuO_C)&2#{%zo^$$bb=v?WUCSil0MEv~UtJ^$5CJUciF0(^dqw!p&EtGRZTZ~6XvG0J^|sVuiY6y7#Q6I(@=p!)fv^3^qx|!g2R>Y6)eV^nQc7Q64a$mZ_j^rfn z?Lw^-qQZ%Zi~f41VAG-SqHacy+zTbU`TXefZfLTidma7tW-f537s zyrXAS@=Z!L-pZiL>E8KGTas?Ixeh_HxRttaZWiCbHqwFD_P(yGvud$*o$9Zt3JN-A zDc=3yY#IcAYkT35%bJq*=%%8z2eRk?qe_+uF1%S7V=HQdn~^)9L~&?x<0$z0Cxb7s z2!BV!>I2jJ)*l!9oYay675_8!7xcegA`L-9v{A>>MVBmDM0OGZ(C-8I9kF@r{%ErF zpm*uLNh>Q!$?v>7V%Z<&SY7Wk2c+#5-9yxXhMP*60F=zczyD9&C2COD%9YYvO-f+g z5nKe|k66hL@Cdj#^ovh^!*AeX2Z|!~E-DMK84YyrAQ6t-aXY_Xk)(C1CTeh0TbMn!ZGCzm& z9@~4V>I?uzUh1gItj1*&?wX@vzv}IyW~YblYg0(dv41;qEnT>DsD^6=Aq}`@X8iIqo&C z2q}6%pCYoMY^rT9jxe_bEVT_;<*^9JOFXhZva4T-L-v9uvcRJS!K1j=ZBj^3_C{6b z#DNa*sVV{WTTgj*6Wo2h30zHY*FJt4Md75uR8)pS*z<7qa6*wX6s1fRqN1ooAx1R0?0paGUh7)dT1Vx*Xo)s* z!8CGlna{&3E;&?__rdoi^L; z+GFSY8%xH`$eB9LW8v=Z4<0}K*5h=dFwC>tyH>|k?Oo%WQ_}6CnO`pP6_Lc*TYHR4 z_oPQhFCV1V@w-%GlYGMaj8zTO-WLl+JI6%7^z<2d$Y|27DEe}bd*dhj>(f`?JRe>& z<#6y@#nmpGtzMNS-d$f1b}+HxMwQOl(wRL*FL%|kEFQdlPFMFy#_se4yDu@1C+|Fb zB)va6KW*-+H|Jm1o-?hE&vdj8{gsp1-=3}=Lsj$|vT)zqeA1!d$)E?_y11+UuGtiJ z(=nnU`O3L-jt-ey@&uhg(XHv}9Lh^vvnG zdy0?YJ+HL2^XPM$p;uyDa);PjSB^W5-reQ-^>?gvi%+sJx}tKyul@IYexJX0clM&0 zOA?~=!d|&<42C~yJ^11?B=q{RuiMP)TSm@YHrG&nuHxKtm3#ILdCd{%l6_YzkCzH2 zL%j?hlm?p{OgSHbIlnC{?A|df-eu_WfiK%VQ;H@!Kb`4O^6SUb19!V?_wdmiyA?4p zn-y4Tcj`;FiKY}a+uq+YD#h)OvPE*L191UC8ZcOyXb6s(6c$u(___XQ(1@FDoz}IY>s#Bi3h(d0;@xZq;>B)Zh9WEkc? z(O&w#IBdD?hllsC-F%<8ec*`+k#_5B=NshzD*c+$F{pQpPwCv~kf4&dkL!E}%>6>; z?zwqe>bG{?vsD${yWXC`9X>a_YexGhyXt#k3iTI9(>HyH9x&wma`%^X#M4d32Npa{ zOHYZc&`Tp89w-T1c!>P^PUoTY(6B|@TAoy7R<$l#t2$;&LCi3=N;{{+&33MKp?_d* zLbBPCS4csqbzp|~kBH1v>en00Jc%g(?YKGiw6=Cy@1WeEjF_r3g;IKKSk=OT)Y-wR zjk$ITFEhQy2|Chh737uubknWfICa17TRm63y-_?4b#XgWQ2VI;anqXV6Am9+R~JyR z@%@bO31@|k<3G2J9#mu;Q&o?(nD?tG3fME~mvQh#!=rA4qXxd&xh5qlsIoX&nst9? zW9|#jp+D0OpBNmZbF?(F-Tm9Eis)GTw6XO*yR|MhDzwWNA2I9s+3tZhLdKY|bKOByp#lGa?XC8OQ0S5wo`;A3~G1NR=M4P4a{W>)&< z#Q4I&K_}*pDPP>xVch_uYiI28E~PE+y8BxXt-_-4L?Y4uL}1rTb_06)Md+H{xUJ%H z&gVh&o8z)U5&advo8eC>>6K*eHcdXb!rS=OewS~np4$6$=p+w6RM+6*KIZ&BPk+5H z9z8XOoICbuM7Pm<*RPcs%~96NL?O3edP~A_B<-G%dRu? zTHd9_)Ni}H)0HS#sIzRzL6@W``{CZV%Es{xi;G(=H<_H)ygq4vH^rSZmm=eVO4H&@HBPo1K-qw3eWzI7P`g!r|sW5!Ht zQyuK>9FV0u)BascZ&$@toH6nY+Lf}v?}%~!w)cm$i+rj`>1o{;?ys)Mud`W)p8193 zJ{&#f<;R59N*PK(Hb92GtUqw?>@-*X_{lleO z#J1;Mo(_vno;j|3LCU4|c4>B3%x=sXoBFtCkdd?g;X(=W%**IzBz<}vHw zmJ=sJ=X`iSqNjWCwfC!4KKXA=uNm?s)J>7w@8YAVj_%(^C;E*x-=hAg2lDE<>f3cC z!{>j{L%umNGGonS+A}QP!5=v8q3tukH^%qXx5_OKbZ>4^)fv@y?#&!e-CsH@4cA>t zR6V`adsJ3z%cZZsTStt%vR^Q&;eH;HRNK7wPb3sh4sZHMgEl!{ZwtTdeb?pC&S2F6 zHy!d7ljbea(+eqnQhR=mjbvB2uj%#nP3GN(=Oq-a)=b)iuX*3>@#)rA`)6NXU7nxt zUU%}eO&Kbag?r9-&y;K#^QmcdoBD~e2}U_(vrOlTo9Qa|UvVqSc1(Yy8$2`H>&o}5 z1G|=tJ-5f+n*4b(rLo-lNs!y--Cgr*dTLgshpg&?=PG=wd?MD^P7f&=%7+YPeHTrA zY#tW8C~cidqhWoxZgh&pVjrysA!DO5zIDAhYlHWAN;`c|dVjI^#uxTTd(Epgj!!OZ z%s=uK2Snb*aCo`da{tu{xRixaz23+~DGfFLa zP;(9W43GclF>{IUbvt(P$Sa zH)%4r49~nBS5|Yh@{4b647uGP`}4=L(~XWNs2E0J z+gENge|m9V+t%Gfy86yI{vv#~$K>f>u6z&R9^Sk>UTb{(r=Rl=DXwh|)6ZJP+U#5O z?oi4L6Mp4zuZ;GWrHX~OEes9D&wOro+nl=dyyq$Z1LtSHW5dR$mCoz3TxOSV)i6CY z)2~FOHXyWHfK`F#(RZ)b-s!U?^Jv4?)Uxv0gjFl@8~nT+=&*z0gP(RIZN^6I-<&em zyuM#h_tNyZM+=#4uhFroP>`=U8oqp_4r|kR`PdPa`|FqX!4{vaK5Cpch3hzebXd2L z8F%*HfWIsifX(*tdVXPA(el`bGO^7gYf$7B=D~q?TMQ~Z-AS{PH3R$lOg-T7y7zkj z+K~%gOng6kjpmxnJw4V7?^c^_=#lzvN801b*HeEkrrm=ApX{-nu&=+u>uhV4 zitnjj*s=FDLzW*HbHSwlyvaK*FP`r5(_#GsS3TF?Q`wc}vwYUY&iab(o$_|-!JYLA z!Nul`MWle2N^?S`O0`PU7( zdCL!LCVnyvDbzHRS3Z67;@lal!zQzW9xJ*`w>{C36zA+e`>Pk?vZYy~YekmIj|Ifzq>iJTkGwQ9 zd`8#JI6Kbm@tBFsFqbvghpuRHThynt^wGLwTc0^JP5j^x<#PYkk(`(0@+H6bYiIjk z(^~41c(NfEeyB9zcI(s7?Own8+`Q}W9{oINFs4-zqUcCDJ|XR{6lL#|$0}n@$E&oe z-|T06%C?{L>@0Vq*l{u4^3{U8BCh1D`hC2iaA%Kgr+6Q;6uqE!ezEt%172>CU zZqJ&O)F#>7`;*81FbdktPjxxAI`RJ0XQMuD$liV8;A8bmBhL-kZx2Gm}BU;X3BtAZaH?fdgh>bs0dkY^Mu zf7q1TFU@lF6{B~Ls(0O*Dq&jh2`i0ejt#40*6*~8FwV0IwVM34?4|xK6YHq>K(~zi z$uD2uaSI>0)ULUJK9uZx@8G^C$rZZ2@kWoH8G7bb=hAMx*rR2u*kFG&)p=th-PhG{ z^uE=H8&3?;c3LGmszx*?y2Sgg?wxAYtEvY+ z?7qzE&9-Z8Zs_ygG&lHL^|95KEtM|)s!D|C8aE>5n%hOWpUrujyzgb`e8m!LV_xg` z{e7ri?D(*s1AdS2pZdUd`?Aubj`IR;OH-W=Y1~LxX%4T6^wzm$IHbK< z8n|Lr>7(E>PgD0_T1{#fPkh@lWxY#s;!V=?oyyL{g5k`_%Jkvf)E;8;Da{o3va)2^ zTaS=lffG0POAEffsOEb7>cQBK(LEH5%5=2q_k#5JW7FN@h6djledEIK$Xf@zW30o2 zJHAHOhaEzQx0^=bK$5#xJ{_HCQOD*l}o~VQFL98Ul%#=(+h` zit5mdGRMT3TI29-`?PK^>6<$6_7lHfUt4^)JX@k@Tf4xlAbZ=O6)ibGYA#&shjurq zD4F{4{2(ur9-p_rFgYx)7#g?y)~J`S9P=epM@`)3wyt`5*!{tUXAkH;ogY@e>cTCZ zkg2oXM$`7%xgU%B?RK2E*R^nzflbM-b>UOex?A@vnBe|p;EMQ*mqMmJ3EN?nLzVkT z#@US7pSR}dtG$Z+B(t+u$|}FDnP%|abEy38$zgLIxR=M4t)H_sO3OODBDdm^bjmD) z+jm;L!kL?z^4>$fO6FF+oGZM0)9vT<#kWmYJ<0#zGivBZH@8sFa=jLtRrcfRK7<{P zrdsq$snTsvd?zPr8(u?C4mnhJ?WkuCGWp&;%rRly72C#m<9R8HbxyIXDqQ+i-)`D_ z3F)nt)V0^Et30!_b@`87*pItEYaczSdpv#1`vr;pN)LBfZk~Aj%8o{-d=J~BdP|7Y zcTFv9rhOcx^YMj8A9Qw8oQ~G~IUyO|jS|b5dmkfC{Zjg_a9^@wuHt77(r9$*2V#)alqgq`~ zDk>{;cPySNOip`j{7kW8RbLh9(&1Y)mUpZuI_!x~y8Qlq_jTGHp)F9Y%~Os~rVc*l~&&U1V{qkz%h`z=l36CxW2lt4! zOEK{>zw1>JEPbH!GjQ~U=aIL!Nhhek8)%et$0$?wt}CDMfoMnwkNnnKy0z(Je6j!F zri;O+y8bT8z7tqkTz=c%>OSaA4KC>pU9kU&~`uEHUZaaEhAkHT_t-kd^k3K81CS+p-q@z}82<$iKMn+xe8^j#?jI&!N7&y5V@PIW5QCv+aVJL5)sx zwuW!kDfKU}XEvN2Zx>SL-S7L5JvPo8Ms#srGpL~KS9(pLV$z&KlbE~pce0<|cUf*~ z(4H~1z|ng0Mf0YE`I0QkJL#?TeAxFV=qOiAGm!e(P$B&q0()J=FH5d_J+G# zhZq~^Y#d;|vu3@!U%(Le?{~g9QP1>Uh97(DwQl}kvqOtxvgTE9EYy3tuxhI1h@DfY zX**R1dzKE*)PA|)-37(GH_H>}y{J4c&)GE2c&mFai>lp6u2n4b-@kF(;gi14PxzOb zMAd1xb@hK_{i1t_iQal{^Xh`+{12;_&mB+HtDbw*USGcb$Kw~H1N62|lRjRwK+XL4 z-fb>1+Y_)kXCz5P)zsHU?D@XHD*F~ZgY5^mv_{Yw~lI~ z1Mi&v?)P-?u-(zWzWQ{DTJfH-9=oMIa<0XT3J;4c-5u8BHa?7q5VV`uTAOvWc}`hg z*IIG0AmY{Q+vq|UHGKK6%mJf|lNGN9^tt$E(cUjZ=T3fLGo<(S$%AI}YYccWS|cgO z@Q$9_=pEz@+*hT*(M_?g{%tq=lj#S|ejjiR7|~($%+@d6HODai^0uq>7C#3brzg~2 zxc_0~i=OR0O|jxM-6&&EwsussHAi35U-QWeJ(Ab;*xQzw?YYBeht>@#F76k;Ysevm zRC~??-5o_EKTp{@k@PEZn|m|&N^kY~YxAz_ZdiY`&n|i>si@X>*tyJ z%O_Ro(1Wox9ov8 z^D0-)o7GIx@tOCSU9msP*N?ltyQsV2kx{C(6US|~GEX^;PP{nIapi?8=T9lhOy|B? zccS(|z0qvNiKDfeW8BAd`Q#r9e?9(sMELKmVK@B~J`T9(JaV?Qa{JRZgOt}&jhJ2^ zo{xC%`89I#Ycq!upBqc zo=~xF(luQ{yQM6sv2b0c^}*oD%x%4Lbgd`k&wf?7@z|mB@T-j9aD(&Dm-WA@w(QBv zr7bpgqYpl2oRp_v&Dt{0utnh+fT%v#AsPxvHWyjX8z~hFJN;mYtFs6qwnY zzmh%iy|*GXcXBjwI^aO`W)9ZQ+QZ%Vi4J*hpJ{UH$p%CB z&6E#5-fy_)SK2*!Z{jKBb3fzOr8Qb-+ct@6(OY#^d+q7-`Rdatsm)XEMv*CV&Fw!~ zcH5l$^4rb2grCUUfNz&JggG?)oHwj%A@MBisq^Mpo?diK6za{;5*6(vbe+cZB&&5A zI!Tf1G{O|A5fW*Aq(tg)On+u!sWa82{tj^8QB`Rit@eLPm_k*GG^t9Pm%{zgs!CD(?fg%hEmf16 z?1r1>!NAM^UvapqDpiVdZGZcJTdQHP&;kD`2nOR-!9t7vJfnP0`AS^?3zqEIp=#zN zg*{lgs!2Vjz@rCXT?DKTB#ipcR(Y*_ovJkK3y2@Q9|i6IA|Bn;q&wnO8RKjVH7Nq? z`EN0)1SKZj4%1kZRKHh4D{oS`hIbc5bAM1NNEoPExk87Nuu~9azw-&T38 z-WaC-hbXUE-GciI^43LbXsRg6Vf{);g>mbDfWZ2dQm&^abpUhmhZAa^p(d5u!>Q~A z_2IDJ|3jLCU|`sT73=|l_5W`Y*X7S#h&#+1s5V>q$i`+1CJ1(fU_kQ(^-D{#;jw z>(b7?7PNn_EBj&aPkE0PTn&>*RFr*XPgO;t{->|10)45nuUxqwqVK5QyTV3Gf!z4Cq`|Jd+{~eN{J5h7^<`1!YKKLsHm~6qF%_4NGCOQrNT< zHYjZdfsIRH<5Jj<6ci>eB3eV3hFvKG2Omh!u!rq`K7KR9%`1l05?M%{x+}aaYyN!vXpragOlpGi7U>$&x>OCR3Yg3Q zke>eUe~pS(`CkX@+3lod6DnnMLsYpE?%E_IbsR8w!L57ZB; zD=pB$bUb~8zCu5sKhQtvfy@MEF>{`&WZp3P#2#`Sc6U|&NG?IZonS*Y$aO8!Bvn8jH%}Wa+YxvMBxre_0`zidJHU2(x(nS-CE(G#mSlEyM%B07LO8d>eicKZ2jc zOL1dzJNcSKDNm|}4q%eO3=`SQth%g3md4d_0sLnk6<3OzMWxPdVaQ^15|)6~VqNgX zcmqCySU{X2S_q1qPhKTS%8_16E6&lMX%i*@PWUow2xmK+yU(Talu#h}iK%jB$cco3 zrXn+te54T0uo$_Hbf9UN6yJsK!&6~tnRphSjpyR|_-(uuHzBf#Tq2(+B#MY);yO`A zloQX0c+!+|Vk6lYHi@ldJ6Hi0yN}Q2FDm$f!Zu-qxJV2TBg7Q(w0KW^CVmrh<%ROw z@=Ez{rB}oO+(Ki7cq2>U81ztI^d{Phs$pF*4$HwFVNKX#&{Y(E2)~cNz*C76L;+0v zgm_2%Ahby%ax}Suj3<-HD)I&Sj{Hszr=qE1NQ+Q|wKyf@|b{ zaEN$Yj8NWRB#~G`GYAooX8>v1r~x_vwM3VJCtSqxaGvN!&1bI2tdv$)4rr}__B9fP zuc9_HCCoGC3)7V~W=FI3tRJf(%Y^^Nv{u+CTooP)Dx!gCE)rt6Xec+54^d85FOl%j z^u}gkf#BDBuoGAj_6oDaJQxx_@J6H%hU zi(Ug3a_CfaC8~%+i_kadN3=IK9$SPZV!7BQ>?Zabqj5((4BYG}{s?cu&56xmmVR6^ zgq6j75oqZ;U&fd7RiLXnzMgO7U-M0TGtUB|=qir}QIUi~6Ne-qyO4cIDsm9XM6!@< zB=;ZAT!xe@kSe4anTG{nyRd`UKzuYF3#e8`d?Y%E9MX^)L%C5asqNG$T2H1b^cO}8 zy+v!$R-7a{h)$xbI8VF@Zo5mqPo642D9@B<$+H27RU`>8`9b6u#8q7gT(DGT z8_h-Y(L&gAF^XYHm^rRkffK|}au}Tnu4v8dVKG?(w~O1yrGjcRxhyW5%jNR9LavA_ z=B{&PTsc?8RRiMHgWbP|Fx$+va&25YC*jq3EeN^2Amona9r>O7Nj^}B7WN78A}vn> zKv$7u!lDKuC^8$4K!Q$3W6^38^et+PSz#X7X3P$c#4U(Pv;*LRD?Nwypgn2tB>QHK zfr?Bzi_Qj%%BKq<4iy8aTQSbyhe^ya<~mcxlrvS}JR@W>nUid`%tzKFYX;MAleNpj zIgD@R31NefE(l`2s3~78-z@(smw2dj;xvIAf#CQJ*3%cO0HoF+4idkJ{t%K~>EDbs z8^V3y7b)Q3lfrr7k#JTl5j!Btu9R<(-}?iR{whk8kaR-^fYVPxG*JR@$Qi741DXMv zzK(L(SZoRwiJt@jsUoV0I-;IvBwiCuL^Hri8_`ZkNOe++)FGv$KB-E@Q_m=r4yT7P z9Bk8;nZhVsnYoM?go;DVaR_HcOeymoK+~D^VVAQBYzg~}y(bg7$=n%EkM9R3u!@i3 zcktKv6ycCCSez+(h+9NQ`FweW{5b>`l}?PBfHWc{SSuEcSK%M=YB0HWLYo=|{;Vq7 zCQA?pLky6_sYnP3pu}pV3=P5#;Enh@T%YU%z-~egCM`%y5+MmP5~knHUE$P)b4qMU z{WC!>=12CV_EHtJD)WND*`2aM0I#XsNdSNj&QcTrW+mAw%1|%aj@(72VigcjzGHhK zmbKySK&8|PEn*zGhEz0?9JQI6OE00@=y6OKlLrIlv*ToLvTz6!Uu2q`KevIi;4x8B zq#~IE171L;03d$A#^8FyWLXUt#V7HP!AHOInnDj@kbnq+U?bQI&ca+_fv`e|5MqTS zVZU$~4*HBxExZy8MI*65yd_HIh6;I%yjMQp&t<{7^t4KE@m1tp}usvj~ z?1k)|tOXRE#pQ74xF?(^zXmMf7+(Ur|H5|{FyW5yR%j74MX9K?jJ0B{m?oBqWHOTUrw&q; zl$6$|`_M+T360X}^l_SCa+!Rl5KOn2xyM{#Z?FetT>w(7cx&F4pTs*rd~)UI@E-hb z{spfFG;_6ZS)4APC0__etALp$s*+szIuVIMP9ZfAm8?-)VB~+pLks#7?TYn-5O@X~ zgkyLNz5~CA--3gAi8tZuL^q&_eTl&YMa&^Q2v5SB@Fo0-AR+`}+ah2nDPh#ehtU*7 z>xlr33+bhFEd7u+We6r7(u8NgUuLoHY@w`3RxGL(Lmuty&E}uFK27>8j+_ z@;ap(SgCdrz3a#eWHYLUck9etym6A?;SB!`sFz7S;35r_2Ys5k%jf}xtdqTxsc`yS z7#GP!aWPyRfY2`P0>4~1C5#r2if;gjuE?8}b2zB}LAx*{0sVy)<1K_9g+jWvpUR@n zP?xA0>N%waS!g|EXkVGtJb)=A52~GjlY^W=L$NSC2|UA)m_V!~wi8y=dD@)`Wp)Ep zaol>a_7xBo&vsIUR=$n@Hy(T!?8RU)r!)Iew2EzFJ17SR_y05a7{n5rfq7!ym@noJ z7JeDuMJlL`kQ)CpSRSXF=vj~^rpivsdO^(g;5~V7-k101T?98_nNTNWidkZ|m@5{` zZ$TVTl~}+O`_VeI9&JQlqfKZtoOqi8Z3hmmj%i_rGGl;FNt~)A25ubo-{hr}yVN1| zhzV+ejzlqVMlZA+eF4L$VS1P;W`QBtG%OrT!+v7AxIZxi62SFjIrWgLqm397W-w#H zSTYD0F~jf>>#QN#O=7Ga7$;C#7!%1vF)`qg zbR+$iu4H^!e>R8>VMBp+MzTpYEgJn4g=`U9%wA{9*mAatt!C@kdbW{$%{GBqwz6$( zJL@T{=UTWyP$~$4B0-oKDMpDgKu9Ios-5ZA5){Gwpd@h_8;UQ%10gFs2+?vC5lTjr zNn|crOx`1FA-7Sdn&@V_72;DnEn(CdEk=itDj0pH52M`azjvqHoGUYj@nAd|Z`fu4 zWPWdet_=ML7PdeZC@42uq}qwPIN||$us2jn{E;9iN`wOV55htq^BoGP`){;xB3;Qj zqzCCqdXv7SKWQ68hLEAa*>(QXDcTp@b0e@lM#jsmWY#iU*(8|*uqId89GQpAQ|1lv zixK-jEBO7J@nEZ^f>$(`gu@+A3Hc7Q+1`vNdHigU%);wG^| zUMv4BZ&&(2^Pe@CKprInYQfYHH=zL z{iMMA6#wR`^f6``2O~?>Ix~$nqyq_puoQ#G;R*khvu9G8On0Wg%$1wNd2pVbH|Gl! zCWs5+LIJ4u{U7w(03uKr9|`0xhW{n1%l!b%r>J%ESP_Eq6YQU)>`x#`AseY;CI`Hr zj?Ix>12i1QzvXuT7Q7dH#pU8QF+(g;Y8g@MJfS3qc8z|6CSy*JI5$C&r4?(#Fq~(` zF*6xQ`2k2S)H-pvOVY1j8paBxEna|XLp|9D<&h?`nQSH7$aXjkb?PaUj=IqTyHAz@ zH5U!ufFA`>GXf$&xM(YXshre7t<%Z+A}fG5*P=b}KKLjoM>!F*iLSsbgQyS)%VGah z(Mh0oQTwP=U>KQz$k|k`g36}~p-xpyU59c{C~*Fv{77ETPy8P)^QWNn7g7I&n^p2C zpq_gnVX9Ux!sCxUm?Awe158;D^TvH~f4qqJ8-)Mctz!PQK`lz5^RIH55%nh~{*tM4 zR-83w%T3}OxFg(D`3$+lUrk~S^Za)zI0p@etn3vwp0p>OA;#RGl0j36P@Bo+^Z7zZ zGsi-)Eda_&y#TD$I-`s=vJiO>{J1}{h}cYgR}lXuTgqxa#W}#JR6WRrds4i-WIzTq{ z#Xdl&O#oQcBswt0LD@u3Qlus^g8p%+VP#OKsWbFdx}4UR9f34cQm)pSrqm+O5hrvu zx&z&VDu7eGW-FlD+bnYc&snYDwsINVO-@q(X9q9PaBK^906UE>0q%Dn5JrXIxUpO< z_lYwA@-~T|&97DBTC-Ybt@1c_0jzrp?uGBhbMPWujj$yq5e|eC;Y!%brpji><^m?J zmqo*|YID7~zMKhX&W++oj_1a4cAP>7tXd*bmkfq6gQ-nWF0H3tQ6gK+X#-=Nz)uI- z)mN!9_ykHBZ2REmVAldUp4>q1plO*6!0tyuOEiO8MTGJwOw>C|_*)T2bOuCGKS<2} zGhaN%J%IH48P{2M7ze|52dbPXJ)X2GNoy#pC6`GnBL4eD9*iPJ~H2!VNgX|!$z=Mq4Jpq#I_P3@HzXQ zoeDv2BYb*LB&&gXx|Flz8aTxp?hB^|^$P=j03;#){ANCmPvrOTDg0Ha@cibx3cZD4 zP<|1G$-;c#QqhnvrVB@aLtcRLT$%7#XaL{P6?=<=L`Ts@oDT>3P5cG*h8}X}UmrV6 zle@`R$hXMjp;alwOssE@7aFLt25;`4JxS)kp&@rC%KbOg`y9PSFSE`f@UQY>cX*T>^}AwyMkZCFB30`FGMfW zlpI4&B~Jl)_#t!%+r@G6$?|CcZ*%1HK=eCFMZLPj8^$a~ z+Q2xMqT{e)_@JhYEQdmMb<)pP4PC|zKBpMW4rdXTVy)Rp>@;>RyO<3GcDaGw%*L{N z*uzi(E@dl#SN>piz^EdDXC%w=YJO_$QR)7ldCmG?8uluMNq2u~^zPo7YJ_P>+F^c4 zQp+!mVf{n?A8K9LnJPnNE6M(oM*pPZW)1y5lURrUVO)RtRwvh8_gll(+6b`80*o2q v2&lI5{|G})KrmpcRQNO*8WY44VGwIDxH&*6gMdoLAb(FOPrXB(bAU2Aih}aj9#f};a!EQiJqJknStQhpFW7Nc& zNTM-`7*~x^6eE@-wrK2Ka}9QlV&(tN1&#T9^Zfoi&&%99y_`Ac%$ajHdzD-ED!0PZ z((%yA3(k2_*n(%hY_h+#(%oS?ok2+;f3~IG0$&fhuPmVUq*IPjLmHzzqsi2@cmn&} zp3)Rq_NF z_UznZCDhT6l?_x<9E1C2)+e30B4?i=yS;0sm3gwh+$o)@mlmV+eN&1$q5Bb;oE4{XhqD zpJZAMLb=j(G^qDv_&@eN^t@KOE}at8t5N8JOF)H{tZc0v)cF0Gq7l8;h*qlboj-I{ zk5&xE1eFSuflfvmr)+X+MF!=DQzzQ2G;#KzhDw}s7?Cp7*^5GzWzL=yr&yeQXt8qI zxh;h&wOv|d8FEW9YhYMm<=MsejJ)A3&0nTtnmiPoQZ zyNnvyzp}h|yVC3%uS8H-eAi_V)pm2$$y$!+s=Cdj403H;`*IzftOBn9D`dG>M_J}N zj+Ks5YPyY~VC6%%?RMJ*nW0bN$0oH>+POFI2tPdW!odEiW%{{D&7 z{JUn2f3MM8k~-Ib$D}d%7o{BW8SXYkn?av4D;fQg@S-jmiwgEAoqZemzq7d73K^dK z%rd;w)6$2fv$R$B^|G3&%=K+Xe=1vj1E`B~&UZwXIT<@ZO(#&ZTe`Dx`$9jRZrAxo zdfEIcEk0kTOMdi4I;ml8nJ!&d&^;hFU6+tII-q-5Y=BWDtK|bEU0N5B(R^Rsh01dF z1!JSxr>W?jdSRlr;AWHFY@KLSo3}z^8bblQ*fTyQL9Ma#S!Jb3ZKWLY^QA?~Z9h+k z$yH_2;>FzV=&iW=7gCW@$P~76*h< zZ{=XXNb0V%sNd9~Ub;?aTpfVvO4k|H@0HQ@8#sJ~y>0Ft-~-|@CaMw2>iWLaPbsb6 zrloI;PFJP_|3p8vGMzDCwWby;rn@X!k8TM*Au5bd2TQ!G1U0DZbUa!V#Ok5oV6&BM zb{VD&Y|w~3d8Ev3;2(HwY}G_mmD8CL)l?Kf8;7jq^!jE;bI*Xp1fy!JoM@0h+m!kZ z`$yfDHR>MpX3MX3LtaygdG0#VNDEWCPW>?MZCCWBM016zcGqE@z;iDtyBhjo&s=HP zAS>Acvpz+i-a18XJV?|TyGuqD+MJkANpfO}IuYDGXTOa3nDIIrg z(XRQvIboQY8P(IyV8kZX5uF2LwpJ@@y_+RNWci^g%Uu)(XRR5poThPbtNHGg7 z^WyYn*3Hlbb=0HE%G9?bEJUL<)b(18+Wdm^Lk^Vbw7j1vzXiHxO@5mSQSmlWo1-+N zr%q1WxYtTnTRg6;Oe++x>%^-cUUT-z>hs>%E1ARb&ls)O-8%eK(!H~1l9Ej+>5{s5 zI_A(i-P)}FDCj`75-mpS%~J)vD8m}L*73~|!!VfRWX##IYqLr+FD0wLC<_|Z$@;;b zbje0_mnc&MvgXM?eTGZAUAn9;M+yp+=>!?&_0gL<>%px3(sfCKE(;!FimcKx&+0^E zG#S$!)V`=BXJ3H1vkx-*R%aZBj7eI)u5a?Sc#|(6*Bcp=vu_65Du$ z%Vs;&Z&oY+z%s^x)Q!pN5qo8KV=w1yE#j?#wX zX|@+EGhM1o@DVarpZg@EUb-Hgulr7sZ>x&5sVb5>XkhPbc*7?oX$5%cp` zP0_82N*4nd6}tA3D3qc~D5MlL@d3}=)TA|aR&F-&hd8xu+L#U$hc#_NG*21QEY97< z3fa}5aoWmk13%Rb8VEtJ7APgnB3OxDdEM-5nx%Zz+>7=rWzGEtcf2lW!k~^qkwFl? zO-z%6)J;ZFUXSJ%4HH|-4ZB>tn`h2LjS#9@Av?8|R!AKuGTDnvM)QI~a~_D;=mXV^rSO*5FvgF=d|6SL@_ATX*xW`{gAnRd?*LswV%0DvR7HbTl$tA}!*uc*U<8l> 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%0D+pyZ521%`_ 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%0AX`|GX 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 diff --git a/lib/r3lib.exp b/lib/r3lib.exp index db5dcd16ebbb8c11215445525fd30a581ffeed49..b60e3459378812306228b9c856a164ad6fff0d76 100644 GIT binary patch delta 1019 zcmdlhw_J|Xhmnb4(yCe?wTYb4oX?mT7*ZG*7`!IxDl^`j7%0vRl-iixz{u*9lb@VD z`3a-c8M>GlvXK2@WX3QJO_4dnVl)v8h7D*UmJB;lMT`v? zj-ZJcGF+a#pF_Uh4HRrp08|15mKY+M7$PAUB1sq`>=+`s7$QxRV>wM3cTZl*XIx7Aamh^#krx;u>o7zXV2H?L*ei%3a!Lq8TgBu^u1M7;45d97A`>QG=aOf%ocx`u zVR8+(FBc-KO}@-+JXw`TbuuRpFNaHhJS1B>@vKKy^P6Y?F-1QzlR5Q(%MU I%@ur80ZJ;2n*aa+ delta 1067 zcmZY8Pe|Kv6bJBc(iKcvy(kDO3Y%V(O46AA!DEHusMA&)43SXU2(oFw2EMdN zj~xrUjKWSE9tMM1TP*05q4VLWw6Txf3;QH_j`l{K6(6J^59$U|JkpkBpK(% zT57bY^eR;u$OFg}L$9P?#dNoizxwumLt_7=2_<38tU9ipb6G@w>9<#x>;jvXH@h-+ z!FG{JS+fsjO|C3DtST=YO!~Hc-o6Cz3qB0K(Ri6C5s9EoB#N&@V)#KMj+0i=HCzzU zaqSTb1@(-{QhPOm?1 zB4gMhVxlO+YyOXL1SQfG#TOzmd?ymeQL7jlPKoHad=kDmyr|uHv9mVSo2u=yQM`*+ zP>^{+mIN6Q#1&+_F{k#Z&#JIF#q8`8I*-_%VtRK%|CJzBK@J4@EJ#9_XbR%7wEAvn zM{p*{M^;e>q$K;JZusjFa{^Op@;Q{p0i$Qau@cVma&{$OfW;G;wB1H3+26o08xNM% bCi)#bY(C&qyT)$XcLL2Z&UTEjQpfH+t6G@2 diff --git a/lib/r3lib.lib b/lib/r3lib.lib index a4f75b497bbba1a8d306b6679e279328f6f67a00..0da8412cc4d95e188b0f36a4158ed1344d7fd2f1 100644 GIT binary patch delta 1721 zcmb7^NoW&M7{~u<(xgc=%e+}KnY2w^v5IzaLlEME3lx_sLQko*LF&>&tncXC6e?x+(EsO9&#hgz1>6Qou`NTPHArQB6=A4wP-Dy zYin5st~1Gfa^DBiz|9Qsh-Wfo0#6IT3J(~wfTJucvFw`*yc57N)_rw=OH79KMV3FX zc|rWXho337naQyq^Ck-nGEt^vU>~LoV3-ZAu+vpe@QDM=@ske(5qQYMMFEYl(S)T) zB8n{HXn_R*6B(qDg9C$Rqhdn{b^qzJrQV;^^;kC@k2TX+I7ySS^Ud0nsi(CQaMsfBuBp+`e`)2mMUSBUc~Pt0&hBzXrYP3j6QO)rM)`wVsD}=6vp*C7pBi8 zU)SkI)St@Kv!ZK;?x&mSM(WD~?PNL=mTq^`#ZXOgE#E4I6v}R_$v&D&HlWGaE+<3t zc6eS5eqXiwxG0)y&L!c{_PmHoV_rGJ^fud8({gBE!%Ibkb{Okxnvzf&-X!Yjwy{pr zIP}3&5&3`+rL<_(w1HoYMnvGJ=W3w$BFHu0^eyx6rk7fQO!iW?RA#<3BF)Epdz=sU#I^b1R(gNSCNx>KL*Mp?r>AykS3#B3Q|MT*AD*#q|D>>4 OliOr8n!bEZ+lJ}jw_a=?bn1Ld-wxO+VMiI254vadRp-xlkq|#bjtwCKW zt_Gxo%7H-;7k1TEH(iW$GlL5il+NhDtW-pBt&7f5@Z5Kkyc;_U6Mj7MKOgtpb57ps z-oN+W^b&)kqXU)UVH!x=S9cE$S4zQWvJ1d|AUz0VDnND?$gNAv~ca|mK#YqwAX{t!~qd(A8tlWF3R&OLwom(O$ zViWW@Y0;mtm!Ax2q%|bI7zWcoB?HW6f%P2l$^{;pz#AVp=m8NMxX9WBYu)@@GJwl$ ztLOPQbK3$oSsQhLWoCo@uWLX*>kqgA`wGAd_S??driL+`WUgA-1txCq9vcuyX3qQbu2Z~h??kmkMN1qQ}TKh5m zJfes;jb(CyVLTJ>Xfs^NO2e&eDKwNchyKbLB7)xLDy@K$))#2sX`%LB>r1iUQ63W_ z^rb$adIuIB1fuk--mh33>UE94$|FOJ{?m81S-&x)l@|b=G;Z{@S=HD${b8uFvKnz_ zf_9kUnUi*(E9&G8K$5?r>EWK!Yp1vEi01WwF~h4ium4WbIIYo4n{KA9)oH(5ZslX2 z;Hu*2Zu-gk{}%PoBP%SI-)*GZW)R1Viwy0u!zQR1vqW~7QMKgggJMw!rO|08jA@KJ zIE(*H(CL{IR>HRqETW|b?a8YahtxrtbT1#)sK!~;S=bU6tkSbWSO-_=HCM@L^zwxA zzPjcWTRl}*^p3lAMp198cBV}WY7c7o#|vu^dAIp;^+)`{)_Gi8;Ct5}ZfRmh?|m~Z ZYA$kjib&FA(&}0qnwy#G|9Nf>9|2fJfhYg~ diff --git a/make-cbp/r3.cbp b/make-cbp/r3.cbp new file mode 100644 index 0000000..925106d --- /dev/null +++ b/make-cbp/r3.cbp @@ -0,0 +1,163 @@ + + + + + + diff --git a/make-cbp/r3.workspace b/make-cbp/r3.workspace new file mode 100644 index 0000000..89668f1 --- /dev/null +++ b/make-cbp/r3.workspace @@ -0,0 +1,6 @@ + + + + + + diff --git a/makefile b/make-gcc/makefile similarity index 88% rename from makefile rename to make-gcc/makefile index 8613d8f..113e17c 100644 --- a/makefile +++ b/make-gcc/makefile @@ -1,10 +1,14 @@ -#--- REBOL 3.0 Host Makefile - Build A104 -#--- Note: this makefile was generated by make-build.r (27-Aug-2010/3:41:49) +#--- REBOL 3.0 Host Makefile - Build A105 +#--- Note: this makefile was generated by make-build.r (1-Sep-2010/16:55:48) #--- This file intentionally kept simple - to work on all platforms. #--- You will need REBOL 2.6 or 2.7 in your work directory or environment path C= gcc -CFLAGS= -c -O1 -DUNICODE -I src/include/ +#C= cc (an alternative) + +CFLAGS= -c -O1 -DUNICODE -DREB_LIB -I src/include/ +#The REB_LIB flag indicates use direct linkage to reb-lib + LIBS= lib/r3lib.lib -L c:/mingw/lib/ -lm -lwsock32 -lcomdlg32 -lgdi32 -lstdc++ #-lc -lm -lstdc++ @@ -33,7 +37,6 @@ OBJS= \ $O/host-args.o\ $O/host-device.o\ $O/host-stdio.o\ - $O/host-ext-test.o\ $O/dev-net.o\ $O/dev-dns.o\ $O/host-lib.o\ @@ -70,14 +73,11 @@ AGG= \ $O/agg_vpgen_segmentator.o\ $O/agg_compo.o\ $O/agg_graphics.o\ + $O/agg_font_win32_tt.o\ + $O/agg_truetype_text.o\ $O/compositor.o\ - $O/graphics.o - -REBS= \ - reb\ - $S/os/host-init.c\ - $S/os/host-ext-graphics.c\ - $S/os/host-ext-draw.c + $O/graphics.o\ + $O/rich_text.o all: -mkdir obj @@ -89,16 +89,13 @@ core: clean: -del /q obj\* - -del $S\os\host-init.c - -del $S\os\host-ext-graphics.c - -del $S\os\host-ext-draw.c -r3.exe: $(REBS) $(OBJS) $(GFX) $(AGG) r3lib.dll +r3.exe: $(OBJS) $(GFX) $(AGG) r3lib.dll $C $(CFLAGS) -fpack-struct -o $O/host-main.o $S/os/host-main.c $C -o r3.exe $(OBJS) $(GFX) $(AGG) $(LIBS) strip r3.exe -r3core.exe: $(REBS) $(OBJS) r3lib.dll +r3core.exe: $(OBJS) r3lib.dll $C $(CFLAGS) -DCORE_ONLY -fpack-struct -o $O/host-main.o $S/os/host-main.c $C -o r3core.exe $(OBJS) $(LIBS) strip r3core.exe @@ -109,23 +106,16 @@ r3lib.dll: lib/r3lib.dll #--- Convert REBOL files to C files: -reb: +exts: @echo "REBOL 2.6 or 2.7 needs to be in the make directory" rebol -sqw --do "write to-file 'reb now quit" - -$S/os/host-init.c: $T/make-host-init.r $S/mezz/prot-http.r $S/mezz/view-colors.r rebol -sqw $T/make-host-init.r - -$S/os/host-ext-graphics.c: $T/make-host-ext.r $S/boot/graphics.r - rebol -sqw $T/make-host-ext.r - -$S/os/host-ext-draw.c: $T/make-host-ext.r $S/boot/draw.r rebol -sqw $T/make-host-ext.r #--- Host Program: -$O/host-main.o: $S/os/host-main.c $(INCS) $I/reb-host.h $I/host-lib.h $I/rebol-lib.h +$O/host-main.o: $S/os/host-main.c $(INCS) $I/reb-host.h $I/host-lib.h $I/host-init.h $C $(CFLAGS) -fpack-struct -o $O/host-main.o $S/os/host-main.c $O/host-args.o: $S/os/host-args.c $(INCS) $I/reb-config.h $I/reb-c.h $I/reb-args.h @@ -137,9 +127,6 @@ $O/host-device.o: $S/os/host-device.c $(INCS) $I/reb-host.h $I/host-lib.h $O/host-stdio.o: $S/os/host-stdio.c $(INCS) $I/reb-host.h $I/host-lib.h $C $(CFLAGS) -fpack-struct -o $O/host-stdio.o $S/os/host-stdio.c -$O/host-ext-test.o: $S/os/host-ext-test.c $(INCS) $I/reb-host.h $I/host-lib.h - $C $(CFLAGS) -fpack-struct -o $O/host-ext-test.o $S/os/host-ext-test.c - $O/dev-net.o: $S/os/dev-net.c $(INCS) $I/reb-host.h $I/host-lib.h $I/sys-net.h $C $(CFLAGS) -fpack-struct -o $O/dev-net.o $S/os/dev-net.c @@ -164,7 +151,7 @@ $O/dev-event.o: $S/os/win32/dev-event.c $(INCS) $I/reb-host.h $I/host-lib.h $O/dev-clipboard.o: $S/os/win32/dev-clipboard.c $(INCS) $I/reb-host.h $I/host-lib.h $I/sys-net.h $C $(CFLAGS) -fpack-struct -o $O/dev-clipboard.o $S/os/win32/dev-clipboard.c -$O/host-graphics.o: $S/os/win32/host-graphics.c $(INCS) $I/reb-host.h $I/host-lib.h $I/agg-draw.h +$O/host-graphics.o: $S/os/win32/host-graphics.c $(INCS) $I/reb-host.h $I/host-lib.h $I/agg-draw.h $I/agg-text.h $I/host-ext-graphics.h $I/host-ext-draw.h $I/host-ext-shape.h $I/host-ext-text.h $C $(CFLAGS) -fpack-struct -o $O/host-graphics.o $S/os/win32/host-graphics.c $O/host-event.o: $S/os/win32/host-event.c $(INCS) $I/reb-host.h $I/host-lib.h @@ -242,9 +229,18 @@ $O/agg_compo.o: $S/agg/agg_compo.cpp $(INCS) $O/agg_graphics.o: $S/agg/agg_graphics.cpp $(INCS) $C $(CFLAGS) -o $O/agg_graphics.o $S/agg/agg_graphics.cpp +$O/agg_font_win32_tt.o:$S/agg/agg_font_win32_tt.cpp $(INCS) + $C $(CFLAGS) -o $O/agg_font_win32_tt.o $S/agg/agg_font_win32_tt.cpp + +$O/agg_truetype_text.o:$S/agg/agg_truetype_text.cpp $(INCS) + $C $(CFLAGS) -o $O/agg_truetype_text.o $S/agg/agg_truetype_text.cpp + $O/compositor.o: $S/agg/compositor.cpp $(INCS) $C $(CFLAGS) -o $O/compositor.o $S/agg/compositor.cpp $O/graphics.o: $S/agg/graphics.cpp $(INCS) $C $(CFLAGS) -o $O/graphics.o $S/agg/graphics.cpp +$O/rich_text.o: $S/agg/rich_text.cpp $(INCS) + $C $(CFLAGS) -o $O/rich_text.o $S/agg/rich_text.cpp + diff --git a/make-vc6/r3.dsp b/make-vc6/r3.dsp new file mode 100644 index 0000000..adcfa2e --- /dev/null +++ b/make-vc6/r3.dsp @@ -0,0 +1,277 @@ +# Microsoft Developer Studio Project File - Name="r3" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=r3 - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "r3.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "r3.mak" CFG="r3 - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "r3 - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "r3 - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "r3 - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /Zp4 /MD /W3 /GX /O2 /I "..\src\include" /D "NDEBUG" /D "UNICODE" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "REB_LIB" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib r3lib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib /nologo /subsystem:windows /machine:I386 /libpath:"..\lib" +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Desc=copy lib +PostBuild_Cmds=copy ..\lib\r3lib.dll . +# End Special Build Tool + +!ELSEIF "$(CFG)" == "r3 - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /Zp4 /MD /W3 /Gm /GX /ZI /Od /I "..\src\include" /D "_DEBUG" /D "UNICODE" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "REB_LIB" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 r3lib.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"..\lib" +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Desc=copy lib +PostBuild_Cmds=copy ..\lib\r3lib.dll . +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "r3 - Win32 Release" +# Name "r3 - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=..\src\agg\agg_arc.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_arrowhead.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_bezier_arc.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_bspline.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_compo.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_curves.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_font_win32_tt.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_graphics.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_image_filters.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_line_aa_basics.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_path_storage.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_rasterizer_scanline_aa.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_rounded_rect.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_sqrt_tables.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_trans_affine.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_trans_single_path.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_truetype_text.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_vcgen_bspline.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_vcgen_contour.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_vcgen_dash.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_vcgen_markers_term.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_vcgen_smooth_poly1.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_vcgen_stroke.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\agg_vpgen_segmentator.cpp +# End Source File +# Begin Source File + +SOURCE=..\src\agg\compositor.cpp +# End Source File +# Begin Source File + +SOURCE="..\src\os\win32\dev-clipboard.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\dev-dns.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\win32\dev-event.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\win32\dev-file.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\dev-net.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\win32\dev-stdio.c" +# End Source File +# Begin Source File + +SOURCE=..\src\agg\graphics.cpp +# End Source File +# Begin Source File + +SOURCE="..\src\os\host-args.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\host-device.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\win32\host-event.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\win32\host-graphics.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\win32\host-lib.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\host-main.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\host-stdio.c" +# End Source File +# Begin Source File + +SOURCE="..\src\os\win32\host-window.c" +# End Source File +# Begin Source File + +SOURCE=..\src\agg\rich_text.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/make-vc6/r3.dsw b/make-vc6/r3.dsw new file mode 100644 index 0000000..ab0ef6d --- /dev/null +++ b/make-vc6/r3.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "r3"=".\r3.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/make-vc9/r3.sln b/make-vc9/r3.sln new file mode 100644 index 0000000..8f86b90 --- /dev/null +++ b/make-vc9/r3.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "r3", "r3.vcproj", "{F356028A-3FF6-4B23-955D-D5F357F461EF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F356028A-3FF6-4B23-955D-D5F357F461EF}.Debug|Win32.ActiveCfg = Debug|Win32 + {F356028A-3FF6-4B23-955D-D5F357F461EF}.Debug|Win32.Build.0 = Debug|Win32 + {F356028A-3FF6-4B23-955D-D5F357F461EF}.Release|Win32.ActiveCfg = Release|Win32 + {F356028A-3FF6-4B23-955D-D5F357F461EF}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/make-vc9/r3.vcproj b/make-vc9/r3.vcproj new file mode 100644 index 0000000..06ac74b --- /dev/null +++ b/make-vc9/r3.vcproj @@ -0,0 +1,367 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/agg/agg_compo.cpp b/src/agg/agg_compo.cpp index 3c748bd..0b08b16 100644 --- a/src/agg/agg_compo.cpp +++ b/src/agg/agg_compo.cpp @@ -1,12 +1,12 @@ #include "agg_compo.h" //include "agg_effects.h" -//include "agg_truetype_text.h" +#include "agg_truetype_text.h" -//extern "C" void Reb_Print(REBYTE *fmt, ...);//output just for testing +//extern "C" void Reb_Print(char *fmt, ...);//output just for testing extern "C" void Blit_Rect(REBGOB *gob, REBPAR d, REBPAR dsize, REBYTE *src, REBPAR s, REBPAR ssize); -//extern "C" void* Rich_Text; +extern "C" void* Rich_Text; //extern "C" void* Effects; -extern "C" void *RL_Get_Series(REBSER *ser, REBINT what); +extern "C" void *RL_Series(REBSER *ser, REBINT what); namespace agg { @@ -43,7 +43,7 @@ namespace agg m_width = GOB_W_INT(winGob); m_height = GOB_H_INT(winGob); m_stride = 4 * m_width; - + int buflen = m_width * m_height * 4; m_buf = new REBYTE [buflen]; memset(m_buf, 200, buflen); @@ -54,7 +54,7 @@ namespace agg m_width = w; m_height = h; m_stride = 4 * w; - + m_buf = buf; memset(m_buf, 200, w * h * 4); } @@ -125,7 +125,7 @@ namespace agg return result; } } - + } return 0; } @@ -219,7 +219,7 @@ namespace agg //GOB changed offset or size, rerender the old position area REBPAR winOft; - + REBINT obx = oox + osx; REBINT oby = ooy + osy; @@ -395,8 +395,8 @@ namespace agg if (result < 0) return result; /* - HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); - HDC hdcCompatible = CreateCompatibleDC(hdcScreen); + HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); + HDC hdcCompatible = CreateCompatibleDC(hdcScreen); HBITMAP bm = CreateCompatibleBitmap(hdcScreen, m_width,m_height); SetBitmapBits(bm,m_width * m_height * 4,m_buf); SelectObject(hdcCompatible, bm); @@ -525,7 +525,7 @@ namespace agg m_rb_win(pixf); */ m_rbuf_win.attach(m_buf + (ox * 4) + (oy * m_stride), sx, sy, m_stride); - + int abs_ox = ox; int abs_oy = oy; @@ -665,15 +665,6 @@ namespace agg if (result < 0) return result; } break; -#ifdef TEMP_REMOVED - case GOBT_EFFECT: - { -// Reb_Print("GOB EFFECT %dx%d", abs_ox, abs_oy); - ((agg_effects*)Effects)->init(m_rb_win,m_rbuf_win,tx,ty,abs_ox, abs_oy, GOB_ALPHA(gob)); - REBINT result = Effect_Gob(Effects, (REBSER *)GOB_CONTENT(gob)); - if (result < 0) return result; - } - break; case GOBT_STRING: if ( !( @@ -683,15 +674,15 @@ namespace agg ){ // Reb_Print("GOB string: %s" ,GOB_STRING(gob)); rich_text* rt = (rich_text*)Rich_Text; - + rt->rt_reset(); rt->rt_attach_buffer(&m_rbuf_win, tx, ty, ox, oy); - rt->rt_set_text((char *)GOB_STRING(gob)); + rt->rt_set_text((REBCHR*)GOB_STRING(gob), TRUE); rt->rt_push(1); - rt->rt_draw_text(); - } + rt->rt_draw_text(DRAW_TEXT); + } break; case GOBT_TEXT: // Reb_Print("GOB block!: %dx%d", tx, ty); @@ -703,10 +694,20 @@ namespace agg REBINT result = Text_Gob(rt, (REBSER *)GOB_CONTENT(gob)); rt->rt_draw_text(); - + if (result < 0) return result; break; + +#ifdef TEMP_REMOVED + case GOBT_EFFECT: + { +// Reb_Print("GOB EFFECT %dx%d", abs_ox, abs_oy); + ((agg_effects*)Effects)->init(m_rb_win,m_rbuf_win,tx,ty,abs_ox, abs_oy, GOB_ALPHA(gob)); + REBINT result = Effect_Gob(Effects, (REBSER *)GOB_CONTENT(gob)); + if (result < 0) return result; + } + break; #endif } diff --git a/src/agg/agg_compo.h b/src/agg/agg_compo.h index 75735c2..0eb8c58 100644 --- a/src/agg/agg_compo.h +++ b/src/agg/agg_compo.h @@ -3,7 +3,7 @@ extern "C" REBINT Draw_Gob(void *graphics, REBSER *block, REBSER *args); //extern "C" REBINT Effect_Gob(void *effects, REBSER *block); -//extern "C" REBINT Text_Gob(void *graphics, REBSER *gob); +extern "C" REBINT Text_Gob(void *richtext, REBSER *block); namespace agg { @@ -50,8 +50,8 @@ namespace agg //buffer size int m_width; - int m_height; - int m_stride; + int m_height; + int m_stride; //root gob reference REBGOB* m_rootGob; @@ -65,7 +65,7 @@ namespace agg // clipping info rect m_clip_box; - + REBPAR m_final_oft; REBPAR m_final_siz; diff --git a/src/agg/agg_font_win32_tt.cpp b/src/agg/agg_font_win32_tt.cpp index d8fa020..dcf8424 100644 --- a/src/agg/agg_font_win32_tt.cpp +++ b/src/agg/agg_font_win32_tt.cpp @@ -2,8 +2,8 @@ // Anti-Grain Geometry - Version 2.3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // @@ -23,10 +23,11 @@ #else #define GetGlyphOutlineX GetGlyphOutlineW #endif - +#include "reb-config.h" +#include "reb-c.h" +extern "C" void Reb_Print(char *fmt, ...); // a-lib.c namespace agg { - //------------------------------------------------------------------------------ // // This code implements the AUTODIN II polynomial @@ -41,7 +42,7 @@ namespace agg // //------------------------------------------------------------------------------ - static const unsigned crc32tab[256] = + static const unsigned crc32tab[256] = { 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, @@ -114,10 +115,10 @@ namespace agg { unsigned crc = (unsigned)~0; const unsigned char* p; - unsigned len = 0; + unsigned len = 0; unsigned nr = size; - for (len += nr, p = buf; nr--; ++p) + for (len += nr, p = buf; nr--; ++p) { crc = (crc >> 8) ^ crc32tab[(crc ^ *p) & 0xff]; } @@ -171,7 +172,7 @@ namespace agg //------------------------------------------------------------------------ template - void decompose_win32_glyph_bitmap_mono(const char* gbuf, + void decompose_win32_glyph_bitmap_mono(const char* gbuf, int w, int h, int x, int y, bool flip_y, @@ -192,6 +193,7 @@ namespace agg y += h; pitch = -pitch; } + for(i = 0; i < h; i++) { sl.reset_spans(); @@ -215,7 +217,7 @@ namespace agg //------------------------------------------------------------------------ template - void decompose_win32_glyph_bitmap_gray8(const char* gbuf, + void decompose_win32_glyph_bitmap_gray8(const char* gbuf, int w, int h, int x, int y, bool flip_y, @@ -234,13 +236,14 @@ namespace agg y += h; pitch = -pitch; } + for(i = 0; i < h; i++) { sl.reset_spans(); const int8u* p = buf; for(j = 0; j < w; j++) { - if(*p) + if(*p) { unsigned v = *p; if(v == 64) v = 255; @@ -264,7 +267,7 @@ namespace agg template bool decompose_win32_glyph_outline(const char* gbuf, unsigned total_size, - bool flip_y, + bool flip_y, const trans_affine& mtx, PathStorage& path) { @@ -272,11 +275,11 @@ namespace agg const char* end_glyph = gbuf + total_size; double x, y; typedef typename PathStorage::value_type value_type; - + while(cur_glyph < end_glyph) { const TTPOLYGONHEADER* th = (TTPOLYGONHEADER*)cur_glyph; - + const char* end_poly = cur_glyph + th->cb; const char* cur_poly = cur_glyph + sizeof(TTPOLYGONHEADER); @@ -284,13 +287,13 @@ namespace agg y = fx_to_dbl(th->pfxStart.y); if(flip_y) y = -y; mtx.transform(&x, &y); - path.move_to(value_type(dbl_to_int26p6(x)), + path.move_to(value_type(dbl_to_int26p6(x)), value_type(dbl_to_int26p6(y))); while(cur_poly < end_poly) { const TTPOLYCURVE* pc = (const TTPOLYCURVE*)cur_poly; - + if (pc->wType == TT_PRIM_LINE) { int i; @@ -300,11 +303,11 @@ namespace agg y = fx_to_dbl(pc->apfx[i].y); if(flip_y) y = -y; mtx.transform(&x, &y); - path.line_to(value_type(dbl_to_int26p6(x)), + path.line_to(value_type(dbl_to_int26p6(x)), value_type(dbl_to_int26p6(y))); } } - + if (pc->wType == TT_PRIM_QSPLINE) { int u; @@ -312,14 +315,14 @@ namespace agg { POINTFX pnt_b = pc->apfx[u]; // B is always the current point POINTFX pnt_c = pc->apfx[u+1]; - + if (u < pc->cpfx - 2) // If not on last spline, compute C { // midpoint (x,y) *(int*)&pnt_c.x = (*(int*)&pnt_b.x + *(int*)&pnt_c.x) / 2; *(int*)&pnt_c.y = (*(int*)&pnt_b.y + *(int*)&pnt_c.y) / 2; } - + double x2, y2; x = fx_to_dbl(pnt_b.x); y = fx_to_dbl(pnt_b.y); @@ -328,9 +331,9 @@ namespace agg if(flip_y) { y = -y; y2 = -y2; } mtx.transform(&x, &y); mtx.transform(&x2, &y2); - path.curve3(value_type(dbl_to_int26p6(x)), + path.curve3(value_type(dbl_to_int26p6(x)), value_type(dbl_to_int26p6(y)), - value_type(dbl_to_int26p6(x2)), + value_type(dbl_to_int26p6(x2)), value_type(dbl_to_int26p6(y2))); } } @@ -365,8 +368,8 @@ namespace agg //------------------------------------------------------------------------ - font_engine_win32_tt_base::font_engine_win32_tt_base(bool flag32, - HDC dc, + font_engine_win32_tt_base::font_engine_win32_tt_base(bool flag32, + HDC dc, unsigned max_fonts) : m_flag32(flag32), m_dc(dc), @@ -378,7 +381,7 @@ namespace agg m_cur_font(0), m_change_stamp(0), - m_typeface(new char [256-16]), + m_typeface(new wchar_t [256-16]), m_typeface_len(256-16-1), m_signature(new char [256+256-16]), m_height(0), @@ -434,22 +437,22 @@ namespace agg } //------------------------------------------------------------------------ - bool font_engine_win32_tt_base::create_font(const char* typeface_, + bool font_engine_win32_tt_base::create_font(const wchar_t* typeface_, glyph_rendering ren_type) { if(m_dc) { - unsigned len = strlen(typeface_); + unsigned len = wcslen(typeface_); if(len > m_typeface_len) { delete [] m_signature; delete [] m_typeface; - m_typeface = new char [len + 32]; + m_typeface = new wchar_t [len + 32]; m_signature = new char [len + 32 + 256]; m_typeface_len = len + 32 - 1; } - strcpy(m_typeface, typeface_); + wcscpy(m_typeface, typeface_); int h = m_height; int w = m_width; @@ -472,7 +475,7 @@ namespace agg } else { - m_cur_font = ::CreateFont(-h, // height of font + m_cur_font = ::CreateFontW(-h, // height of font w, // average character width 0, // angle of escapement 0, // base-line orientation angle @@ -493,11 +496,11 @@ namespace agg delete [] m_font_names[0]; if(m_old_font) ::SelectObject(m_dc, m_old_font); ::DeleteObject(m_fonts[0]); - memcpy(m_fonts, - m_fonts + 1, + memcpy(m_fonts, + m_fonts + 1, (m_max_fonts - 1) * sizeof(HFONT)); - memcpy(m_font_names, - m_font_names + 1, + memcpy(m_font_names, + m_font_names + 1, (m_max_fonts - 1) * sizeof(char*)); m_num_fonts = m_max_fonts - 1; } @@ -521,7 +524,7 @@ namespace agg //------------------------------------------------------------------------ - bool font_engine_win32_tt_base::create_font(const char* typeface_, + bool font_engine_win32_tt_base::create_font(const wchar_t* typeface_, glyph_rendering ren_type, double height_, double width_, @@ -550,7 +553,7 @@ namespace agg { unsigned gamma_hash = 0; if(m_glyph_rendering == glyph_ren_native_gray8 || - m_glyph_rendering == glyph_ren_agg_mono || + m_glyph_rendering == glyph_ren_agg_mono || m_glyph_rendering == glyph_ren_agg_gray8) { unsigned char gamma_table[rasterizer_scanline_aa<>::aa_num]; @@ -561,9 +564,9 @@ namespace agg } gamma_hash = calc_crc32(gamma_table, sizeof(gamma_table)); } - - sprintf(m_signature, - "%s,%u,%d,%d:%dx%d,%d,%d,%d,%d,%d,%08X", + + sprintf(m_signature, + "%s,%u,%d,%d:%dx%d,%d,%d,%d,%d,%d,%08X", m_typeface, m_char_set, int(m_glyph_rendering), @@ -584,12 +587,12 @@ namespace agg double mtx[6]; char buf[100]; m_affine.store_to(mtx); - sprintf(buf, ",%08X%08X%08X%08X%08X%08X", - dbl_to_plain_fx(mtx[0]), - dbl_to_plain_fx(mtx[1]), - dbl_to_plain_fx(mtx[2]), - dbl_to_plain_fx(mtx[3]), - dbl_to_plain_fx(mtx[4]), + sprintf(buf, ",%08X%08X%08X%08X%08X%08X", + dbl_to_plain_fx(mtx[0]), + dbl_to_plain_fx(mtx[1]), + dbl_to_plain_fx(mtx[2]), + dbl_to_plain_fx(mtx[3]), + dbl_to_plain_fx(mtx[4]), dbl_to_plain_fx(mtx[5])); strcat(m_signature, buf); } @@ -608,7 +611,7 @@ namespace agg switch(m_glyph_rendering) { - case glyph_ren_native_gray8: + case glyph_ren_native_gray8: format = GGO_GRAY8_BITMAP; break; @@ -623,7 +626,6 @@ namespace agg #define GGO_UNHINTED 0x0100 #endif if(!m_hinting) format |= GGO_UNHINTED; - GLYPHMETRICS gm; int total_size = GetGlyphOutlineX(m_dc, glyph_code, @@ -632,8 +634,7 @@ namespace agg buf_size, (void*)m_gbuf, &m_matrix); - - if(total_size < 0) + if(total_size < 0) { // GetGlyphOutline() fails when being called for // GGO_GRAY8_BITMAP and white space (stupid Microsoft). @@ -651,14 +652,14 @@ namespace agg if(total_size < 0) { //Fixed size bitmap font - use TextOut to get the glyph bitmap SIZE area; - GetTextExtentPoint32(m_dc, (char*)&glyph_code, 1, &area); + GetTextExtentPoint32(m_dc, (wchar_t*)&glyph_code, 1, &area); TEXTMETRIC tm; GetTextMetrics(m_dc, &tm); m_glyph_index = glyph_code; m_advance_x = area.cx; m_advance_y = 0; - + area.cx+=tm.tmOverhang; gm.gmBlackBoxX = area.cx; @@ -673,17 +674,17 @@ namespace agg SetBkColor(hbdc,RGB(0,0,0)); SetTextColor(hbdc,RGB(255,255,255)); - TextOut(hbdc,0,0,(char*)&glyph_code, 1); + TextOut(hbdc,0,0,(wchar_t*)&glyph_code, 1); DeleteDC(hbdc); GetBitmapBits(hbm, area.cx * area.cy, m_gbuf); DeleteObject(hbm); - decompose_win32_glyph_bitmap_mono(m_gbuf, + decompose_win32_glyph_bitmap_mono(m_gbuf, gm.gmBlackBoxX, gm.gmBlackBoxY, gm.gmptGlyphOrigin.x, - m_flip_y ? -gm.gmptGlyphOrigin.y : + m_flip_y ? -gm.gmptGlyphOrigin.y : gm.gmptGlyphOrigin.y, m_flip_y, m_scanline_bin, @@ -693,7 +694,7 @@ namespace agg m_bounds.y1 = m_scanlines_bin.min_y(); m_bounds.x2 = m_scanlines_bin.max_x(); m_bounds.y2 = m_scanlines_bin.max_y(); - m_data_size = m_scanlines_bin.byte_size(); + m_data_size = m_scanlines_bin.byte_size(); m_data_type = glyph_data_mono; return true; @@ -706,15 +707,14 @@ namespace agg m_glyph_index = glyph_code; m_advance_x = gm.gmCellIncX; m_advance_y = -gm.gmCellIncY; - switch(m_glyph_rendering) { - case glyph_ren_native_mono: - decompose_win32_glyph_bitmap_mono(m_gbuf, + case glyph_ren_native_mono: + decompose_win32_glyph_bitmap_mono(m_gbuf, gm.gmBlackBoxX, gm.gmBlackBoxY, gm.gmptGlyphOrigin.x, - m_flip_y ? -gm.gmptGlyphOrigin.y : + m_flip_y ? -gm.gmptGlyphOrigin.y : gm.gmptGlyphOrigin.y, m_flip_y, m_scanline_bin, @@ -723,16 +723,16 @@ namespace agg m_bounds.y1 = m_scanlines_bin.min_y(); m_bounds.x2 = m_scanlines_bin.max_x(); m_bounds.y2 = m_scanlines_bin.max_y(); - m_data_size = m_scanlines_bin.byte_size(); + m_data_size = m_scanlines_bin.byte_size(); m_data_type = glyph_data_mono; return true; case glyph_ren_native_gray8: - decompose_win32_glyph_bitmap_gray8(m_gbuf, + decompose_win32_glyph_bitmap_gray8(m_gbuf, gm.gmBlackBoxX, gm.gmBlackBoxY, gm.gmptGlyphOrigin.x, - m_flip_y ? -gm.gmptGlyphOrigin.y : + m_flip_y ? -gm.gmptGlyphOrigin.y : gm.gmptGlyphOrigin.y, m_flip_y, m_rasterizer, @@ -742,7 +742,7 @@ namespace agg m_bounds.y1 = m_scanlines_aa.min_y(); m_bounds.x2 = m_scanlines_aa.max_x(); m_bounds.y2 = m_scanlines_aa.max_y(); - m_data_size = m_scanlines_aa.byte_size(); + m_data_size = m_scanlines_aa.byte_size(); m_data_type = glyph_data_gray8; return true; @@ -753,7 +753,7 @@ namespace agg m_path32.remove_all(); if(decompose_win32_glyph_outline(m_gbuf, total_size, - m_flip_y, + m_flip_y, m_affine, m_path32)) { @@ -772,7 +772,7 @@ namespace agg m_path16.remove_all(); if(decompose_win32_glyph_outline(m_gbuf, total_size, - m_flip_y, + m_flip_y, m_affine, m_path16)) { @@ -796,7 +796,7 @@ namespace agg m_path32.remove_all(); decompose_win32_glyph_outline(m_gbuf, total_size, - m_flip_y, + m_flip_y, m_affine, m_path32); m_rasterizer.add_path(m_curves32); @@ -806,18 +806,18 @@ namespace agg m_path16.remove_all(); decompose_win32_glyph_outline(m_gbuf, total_size, - m_flip_y, + m_flip_y, m_affine, m_path16); m_rasterizer.add_path(m_curves16); } - m_scanlines_bin.prepare(1); // Remove all + m_scanlines_bin.prepare(1); // Remove all render_scanlines(m_rasterizer, m_scanline_bin, m_scanlines_bin); m_bounds.x1 = m_scanlines_bin.min_x(); m_bounds.y1 = m_scanlines_bin.min_y(); m_bounds.x2 = m_scanlines_bin.max_x(); m_bounds.y2 = m_scanlines_bin.max_y(); - m_data_size = m_scanlines_bin.byte_size(); + m_data_size = m_scanlines_bin.byte_size(); m_data_type = glyph_data_mono; return true; @@ -829,7 +829,7 @@ namespace agg m_path32.remove_all(); decompose_win32_glyph_outline(m_gbuf, total_size, - m_flip_y, + m_flip_y, m_affine, m_path32); m_rasterizer.add_path(m_curves32); @@ -839,18 +839,18 @@ namespace agg m_path16.remove_all(); decompose_win32_glyph_outline(m_gbuf, total_size, - m_flip_y, + m_flip_y, m_affine, m_path16); m_rasterizer.add_path(m_curves16); } - m_scanlines_aa.prepare(1); // Remove all + m_scanlines_aa.prepare(1); // Remove all render_scanlines(m_rasterizer, m_scanline_aa, m_scanlines_aa); m_bounds.x1 = m_scanlines_aa.min_x(); m_bounds.y1 = m_scanlines_aa.min_y(); m_bounds.x2 = m_scanlines_aa.max_x(); m_bounds.y2 = m_scanlines_aa.max_y(); - m_data_size = m_scanlines_aa.byte_size(); + m_data_size = m_scanlines_aa.byte_size(); m_data_type = glyph_data_gray8; return true; } @@ -886,7 +886,7 @@ namespace agg //------------------------------------------------------------------------ - bool font_engine_win32_tt_base::pair_less(const KERNINGPAIR v1, + bool font_engine_win32_tt_base::pair_less(const KERNINGPAIR v1, const KERNINGPAIR v2) { if(v1.wFirst != v2.wFirst) return v1.wFirst < v2.wFirst; @@ -913,7 +913,7 @@ namespace agg m_kerning_pairs = new KERNINGPAIR [16384-16]; m_max_kerning_pairs = 16384-16; } - m_num_kerning_pairs = ::GetKerningPairs(m_dc, + m_num_kerning_pairs = ::GetKerningPairs(m_dc, m_max_kerning_pairs, m_kerning_pairs); diff --git a/src/agg/agg_font_win32_tt.h b/src/agg/agg_font_win32_tt.h index c9408dd..c79edf8 100644 --- a/src/agg/agg_font_win32_tt.h +++ b/src/agg/agg_font_win32_tt.h @@ -2,8 +2,8 @@ // Anti-Grain Geometry - Version 2.3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // @@ -57,9 +57,9 @@ namespace agg void pitch_and_family(DWORD p){ m_pitch_and_family = p; } void flip_y(bool flip) { m_flip_y = flip; } void hinting(bool h) { m_hinting = h; } - bool create_font(const char* typeface_, glyph_rendering ren_type); + bool create_font(const wchar_t* typeface_, glyph_rendering ren_type); - bool create_font(const char* typeface_, + bool create_font(const wchar_t* typeface_, glyph_rendering ren_type, double height_, double width_=0.0, @@ -84,7 +84,7 @@ namespace agg // Accessors //-------------------------------------------------------------------- unsigned resolution() const { return m_resolution; } - const char* typeface() const { return m_typeface; } + const wchar_t* typeface() const { return m_typeface; } double height() const { return m_height; } double width() const { return m_width; } int weight() const { return m_weight; } @@ -132,7 +132,7 @@ namespace agg HFONT m_cur_font; int m_change_stamp; - char* m_typeface; + wchar_t* m_typeface; unsigned m_typeface_len; char* m_signature; unsigned m_height; @@ -175,7 +175,7 @@ namespace agg //------------------------------------------------font_engine_win32_tt_int16 - // This class uses values of type int16 (10.6 format) for the vector cache. + // This class uses values of type int16 (10.6 format) for the vector cache. // The vector cache is compact, but when rendering glyphs of height // more that 200 there integer overflow can occur. // @@ -188,13 +188,13 @@ namespace agg typedef font_engine_win32_tt_base::scanlines_aa_type scanlines_aa_type; typedef font_engine_win32_tt_base::scanlines_bin_type scanlines_bin_type; - font_engine_win32_tt_int16(HDC dc, unsigned max_fonts = 32) : + font_engine_win32_tt_int16(HDC dc, unsigned max_fonts = 32) : font_engine_win32_tt_base(false, dc, max_fonts) {} }; //------------------------------------------------font_engine_win32_tt_int32 - // This class uses values of type int32 (26.6 format) for the vector cache. - // The vector cache is twice larger than in font_engine_win32_tt_int16, + // This class uses values of type int32 (26.6 format) for the vector cache. + // The vector cache is twice larger than in font_engine_win32_tt_int16, // but it allows you to render glyphs of very large sizes. // class font_engine_win32_tt_int32 : public font_engine_win32_tt_base @@ -206,7 +206,7 @@ namespace agg typedef font_engine_win32_tt_base::scanlines_aa_type scanlines_aa_type; typedef font_engine_win32_tt_base::scanlines_bin_type scanlines_bin_type; - font_engine_win32_tt_int32(HDC dc, unsigned max_fonts = 32) : + font_engine_win32_tt_int32(HDC dc, unsigned max_fonts = 32) : font_engine_win32_tt_base(true, dc, max_fonts) {} }; diff --git a/src/agg/agg_graphics.cpp b/src/agg/agg_graphics.cpp index 13ef19f..89f3f60 100644 --- a/src/agg/agg_graphics.cpp +++ b/src/agg/agg_graphics.cpp @@ -1,5 +1,5 @@ #include "agg_graphics.h" -//include "agg_truetype_text.h" +#include "agg_truetype_text.h" //include "agg_effects.h" /* @@ -7,11 +7,11 @@ Code by: Richard Smolak (Cyphre) All rights reserved. */ -//extern "C" void* Rich_Text; +extern "C" void* Rich_Text; //extern "C" void* Effects; -//extern "C" REBINT Text_Gob(void *graphics, REBSER *block); +extern "C" REBINT Text_Gob(void *richtext, REBSER *block); //extern "C" REBINT Effect_Gob(void *effects, REBSER *block); - +extern "C" void Reb_Print(char *fmt, ...);//output just for testing namespace agg { @@ -42,7 +42,7 @@ agg_graphics::agg_graphics(ren_buf* buf,int w, int h, int x, int y) : m_actual_width = w; m_actual_height = h; -/* +/* m_defaults = defaults; m_actual_width = m_defaults->width; @@ -50,7 +50,7 @@ agg_graphics::agg_graphics(ren_buf* buf,int w, int h, int x, int y) : */ m_initial_width = m_actual_width; m_initial_height = m_actual_height; - + m_ratio_x = 1; m_ratio_y = 1; @@ -141,9 +141,9 @@ Reb_Print( if (attr.fill_pen_img_buf != 0) { // image pattern fill ren_buf rbuf_img; - // Create the image rendering buffer + // Create the image rendering buffer rbuf_img.attach(attr.fill_pen_img_buf, attr.fill_pen_img_buf_x, attr.fill_pen_img_buf_y, attr.fill_pen_img_buf_x * 4); - + m_img_mtx.reset(); m_img_mtx = attr.mtx; m_img_mtx *= m_output_mtx; @@ -159,8 +159,8 @@ Reb_Print( typedef renderer_scanline_aa renderer_type; typedef renderer_scanline_bin renderer_bin_type; span_allocator sa; - span_gen_type sg(sa, - rbuf_img, + span_gen_type sg(sa, + rbuf_img, m_interpolator_linear); m_ras.reset(); @@ -193,12 +193,12 @@ Reb_Print( typedef span_allocator gouraud_span_alloc_type; typedef renderer_scanline_aa, gouraud_span_gen_type> renderer_gouraud; typedef renderer_scanline_bin, gouraud_span_gen_type> renderer_bin_gouraud; - + gouraud_span_alloc_type span_alloc; gouraud_span_gen_type span_gen(span_alloc); double* vertices; - vertices = getVertices(m_trans, attr.index); + vertices = getVertices(m_trans, attr.index); span_gen.colors( @@ -234,7 +234,7 @@ Reb_Print( ren_base_pre renb_pre(pixf_pre); if (attr.g_color1.a != 0){//color key enabled - // attach the original image to rendering buffer + // attach the original image to rendering buffer rbuf_img.attach(attr.img_buf, (int)attr.coord_x, (int)attr.coord_y, (int)attr.coord_x * 4); //create new buffer for keyed image key_img_buffer = new unsigned char[(int)attr.coord_x * (int)attr.coord_y * 4]; @@ -270,22 +270,22 @@ Reb_Print( m_ras.reset(); m_ras.add_path(m_trans_curved, attr.index); - + span_allocator sa; - + if (attr.img_filter_type == FT_NEAREST){ //Reb_Print ("NN filter"); //nn filter typedef span_image_filter_rgba_nn > span_gen_type; typedef renderer_scanline_aa renderer_type; typedef renderer_scanline_bin renderer_bin_type; - - span_gen_type sg(sa, + + span_gen_type sg(sa, rbuf_img_out, rgba8(255,0,0,255), m_interpolator_linear ); - + if (attr.anti_aliased){ renderer_type ri(renb, sg); render_scanlines(m_ras, m_u_sl, ri); @@ -309,7 +309,7 @@ Reb_Print( filter.calculate(agg::image_filter_gaussian()); break; } - + double* vertices = getVertices(m_trans,attr.index); trans_perspective tr(vertices, vertices); delete[] vertices; @@ -323,7 +323,7 @@ Reb_Print( typedef span_image_filter_rgba > span_gen_type; typedef agg::renderer_scanline_aa renderer_type; typedef agg::renderer_scanline_bin renderer_bin_type; - + span_gen_type sg(sa, rbuf_img_out, *m_buf, m_interpolator_linear, filter, tr); if (attr.anti_aliased){ @@ -339,13 +339,13 @@ Reb_Print( { //Reb_Print ("filter with resampling"); //filter with resampling - + typedef span_image_resample_rgba_affine > span_gen_type; typedef agg::renderer_scanline_aa renderer_type; typedef agg::renderer_scanline_bin renderer_bin_type; span_gen_type sg(sa, rbuf_img_out, *m_buf, m_interpolator_linear, filter, tr); - + sg.blur(attr.img_filter_arg); if (attr.anti_aliased){ @@ -378,7 +378,7 @@ Reb_Print( ren_base_pre renb_pre(pixf_pre); if (attr.g_color1.a != 0){//color key enabled - // attach the original image to rendering buffer + // attach the original image to rendering buffer rbuf_img.attach(attr.img_buf, (int)attr.coord_x, (int)attr.coord_y, (int)attr.coord_x * 4); //create new buffer for keyed image key_img_buffer = new unsigned char[(int)attr.coord_x * (int)attr.coord_y * 4]; @@ -395,7 +395,7 @@ Reb_Print( typedef span_allocator span_alloc_type; span_alloc_type sa; - + typedef wrap_mode_reflect_auto_pow2 wrap_type; m_ras.reset(); @@ -404,9 +404,9 @@ Reb_Print( double* vertices = getVertices(m_trans,attr.index); if (attr.pattern_mode == PM_NORMAL){ - m_trans_perspective.quad_to_rect(vertices, 0, 0, (int)attr.coord_x, (int)attr.coord_y); + m_trans_perspective.quad_to_rect(vertices, 0, 0, attr.coord_x, attr.coord_y); } else { - m_trans_perspective.quad_to_rect(vertices, (int)attr.coord_x2, (int)attr.coord_y2, (int)attr.coord_x3,(int)attr.coord_y3); + m_trans_perspective.quad_to_rect(vertices, attr.coord_x2, attr.coord_y2, attr.coord_x3, attr.coord_y3); } if(m_trans_perspective.is_valid()){ @@ -421,7 +421,7 @@ Reb_Print( typedef renderer_scanline_aa, span_gen_normal> renderer_type; typedef renderer_scanline_bin, span_gen_normal> renderer_bin_type; - span_gen_normal sg(sa, + span_gen_normal sg(sa, rbuf_img_out, rgba8(255,0,0,255), m_interpolator_trans); @@ -440,7 +440,7 @@ Reb_Print( typedef renderer_scanline_aa, span_gen_repeat> renderer_type; typedef renderer_scanline_bin, span_gen_repeat> renderer_bin_type; - span_gen_repeat sg(sa, + span_gen_repeat sg(sa, rbuf_img_out, m_interpolator_trans); if (attr.anti_aliased){ @@ -458,7 +458,7 @@ Reb_Print( typedef renderer_scanline_aa, span_gen_reflect> renderer_type; typedef renderer_scanline_bin, span_gen_reflect> renderer_bin_type; - span_gen_reflect sg(sa, + span_gen_reflect sg(sa, rbuf_img_out, m_interpolator_trans); if (attr.anti_aliased){ @@ -545,14 +545,14 @@ Reb_Print( case FM_RESAMPLE: { //filter with resampling - + //Reb_Print ("Perspective filter with resampling"); - - typedef agg::span_subdiv_adaptor subdiv_adaptor_type; + + typedef agg::span_subdiv_adaptor subdiv_adaptor_type; subdiv_adaptor_type subdiv_adaptor(m_interpolator_persp); if (attr.pattern_mode == PM_NORMAL){ - m_interpolator_persp.quad_to_rect(vertices, 0, 0, (int)attr.coord_x, (int)attr.coord_y); + m_interpolator_persp.quad_to_rect(vertices, 0, 0, attr.coord_x, attr.coord_y); } else { m_interpolator_persp.quad_to_rect(vertices, attr.coord_x2, attr.coord_y2, attr.coord_x3,attr.coord_y3); } @@ -633,7 +633,7 @@ Reb_Print( { typedef span_interpolator_linear<> interpolator_type; - typedef span_gradient gradient_span_gen; @@ -642,7 +642,7 @@ Reb_Print( typedef renderer_scanline_aa , gradient_span_gen> renderer_gradient; typedef renderer_scanline_bin , gradient_span_gen> renderer_bin_gradient; - + gradient_span_alloc span_alloc; m_grad_mtx = attr.mtx; @@ -666,26 +666,25 @@ Reb_Print( } break; -#ifdef TEMP_REMOVED case RT_TEXT: { rich_text* rt = (rich_text*)Rich_Text; - REBPAR pos; + REBXYF pos; double sx = attr.coord_x2 - attr.coord_x; double sy = attr.coord_y2 - attr.coord_y; attr.post_mtx.transform(&attr.coord_x, &attr.coord_y); - pos.x = (int)attr.coord_x; - pos.y = (int)attr.coord_y; + pos.x = attr.coord_x; + pos.y = attr.coord_y; rt->rt_reset(); if (attr.coord_x2 && attr.coord_y2){ rt->rt_attach_buffer(m_buf, (int)sx, (int)sy, m_offset_x, m_offset_y); -// rt->rt_set_clip(pos.x , pos.y, (int)sx + pos.x, (int)sy + pos.y); - rt->rt_set_clip(renb.xmin() , renb.ymin(), renb.xmax(), renb.ymax()); + rt->rt_set_clip((int)pos.x , (int)pos.y, (int)(sx + pos.x), (int)(sy + pos.y)); +// rt->rt_set_clip(renb.xmin() , renb.ymin(), renb.xmax(), renb.ymax()); } else { - rt->rt_attach_buffer(m_buf, m_actual_width - pos.x, m_actual_height - pos.y, m_offset_x, m_offset_y); + rt->rt_attach_buffer(m_buf, m_actual_width - (int)pos.x, m_actual_height - (int)pos.y, m_offset_x, m_offset_y); } REBINT result = Text_Gob(rt, attr.block); @@ -694,11 +693,12 @@ Reb_Print( rt->rt_draw_text(DRAW_TEXT, &pos); } break; +#ifdef TEMP_REMOVED case RT_EFFECT: { double sx = attr.coord_x2 - attr.coord_x; double sy = attr.coord_y2 - attr.coord_y; - + attr.post_mtx.transform(&attr.coord_x, &attr.coord_y); rect cb((int)attr.coord_x, (int)attr.coord_y, (int)(attr.coord_x + sx), (int)(attr.coord_y + sy)); @@ -729,9 +729,9 @@ Reb_Print( } m_ras.filling_rule(fill_non_zero); - + if (attr.stroked) { - // If the *visual* line width is considerable we + // If the *visual* line width is considerable we // turn on processing of curve cusps. //--------------------- if(lw > 1.0) @@ -753,13 +753,13 @@ Reb_Print( typedef renderer_outline_image renderer_type; typedef rasterizer_outline_aa rasterizer_type; - // Create the image rendering buffer + // Create the image rendering buffer rendering_buffer rbuf_img; rbuf_img.attach(attr.pen_img_buf, attr.pen_img_buf_x, attr.pen_img_buf_y, attr.pen_img_buf_x * 4); pixfmt pixf_img(rbuf_img); ren_base renb_img(pixf_img); - pattern_type patt(fltr, renb_img); + pattern_type patt(fltr, renb_img); renderer_type ren_img(renb, patt); rasterizer_type ras_img(ren_img); @@ -787,7 +787,7 @@ Reb_Print( render_scanlines(m_ras, m_p_sl, ren_b); } } - + //render arrows if needed if ((attr.arrow_head > 0) || (attr.arrow_tail > 0)){ double k = ::pow(lw, 0.7); @@ -845,7 +845,7 @@ Reb_Print( // define dashes pattern m_dash.remove_all_dashes(); - + double* pattern = attr.dash_array; for(int j = 1; j < (int)pattern[0]; j+=2) { @@ -906,7 +906,7 @@ Reb_Print( void agg_graphics::agg_resize_buffer(unsigned char *buf, int width, int height) { - + m_buf = buf; m_actual_width = width; @@ -941,7 +941,7 @@ Reb_Print( m_output_mtx = m_resize_mtx; m_output_mtx *= m_post_mtx; - + } void agg_graphics::agg_rotate(double ang) @@ -952,7 +952,7 @@ Reb_Print( m_post_mtx.premultiply(trans_affine_rotation(fmod(ang,360) * pi / 180.0)); m_output_mtx = m_resize_mtx; m_output_mtx *= m_post_mtx; - + } void agg_graphics::agg_translate(double trX, double trY) @@ -961,7 +961,7 @@ Reb_Print( m_post_mtx.premultiply(trans_affine_translation(trX, trY)); m_output_mtx = m_resize_mtx; m_output_mtx *= m_post_mtx; - + } void agg_graphics::agg_scale(double sclX ,double sclY) @@ -990,12 +990,12 @@ Reb_Print( double sx = double(m_actual_width) / double(m_initial_width); double sy = double(m_actual_height) / double(m_initial_height); if(sy < sx) sx = sy; - + m_line_width = w * sx; */ m_line_width = w; m_line_width_mode = mode; - + } path_attributes& agg_graphics::curr_attributes() @@ -1022,7 +1022,7 @@ Reb_Print( m_pen.g = g; m_pen.b = b; } - + } @@ -1040,7 +1040,7 @@ Reb_Print( } else { m_filled = RT_FILL; } - + } void agg_graphics::agg_reset_gradient_pen(){ @@ -1054,7 +1054,7 @@ Reb_Print( unsigned o = 3, of = 2, j = 5; - if (offsets[0] == -1) + if (offsets[0] == -1) offsets = 0; else { //add colors on gradient edges if edge offsets are not default @@ -1084,22 +1084,22 @@ Reb_Print( switch (grad) { - case 0: + case W_DRAW_RADIAL: m_gradient = &gr_circle; break; - case 1: + case W_DRAW_CONIC: m_gradient = &gr_conic; break; - case 2: + case W_DRAW_DIAMOND: m_gradient = &gr_diamond; break; - case 3: + case W_DRAW_LINEAR: m_gradient = &gr_x; break; - case 4: + case W_DRAW_DIAGONAL: m_gradient = &gr_xy; break; - case 5: + case W_DRAW_CUBIC: m_gradient = &gr_sqrt_xy; break; } @@ -1162,12 +1162,12 @@ Reb_Print( void agg_graphics::agg_begin_path() { - + unsigned idx = m_path.start_new_path(); m_attributes.add(path_attributes(idx)); agg_get_attributes(curr_attributes()); } - + void agg_graphics::agg_get_attributes(path_attributes& attr){ attr.filled = m_filled; @@ -1181,7 +1181,7 @@ Reb_Print( attr.arrow_color = m_arrow_color; attr.anti_aliased = m_anti_aliased; attr.fill_rule = m_fill_rule; - + attr.pen = m_pen; attr.fill_pen = m_fill_pen; attr.line_pattern_pen = m_line_pattern_pen; @@ -1230,7 +1230,7 @@ Reb_Print( m_arrow_color = attr.arrow_color; m_anti_aliased = attr.anti_aliased; m_fill_rule = attr.fill_rule; - + m_pen = attr.pen; m_fill_pen = attr.fill_pen; m_line_pattern_pen = attr.line_pattern_pen; @@ -1269,7 +1269,7 @@ Reb_Print( void agg_graphics::agg_init(){ //initial settings m_stroke_cap = butt_cap; //butt_cap square_cap round_cap - m_stroke_join = miter_join;//miter_join miter_join_revert bevel_join round_join + m_stroke_join = miter_join;//miter_join miter_join_revert round_join bevel_join m_dash_cap = butt_cap; m_dash_join = miter_join; m_line_width = 1; @@ -1294,6 +1294,12 @@ Reb_Print( m_img_filter_mode = FM_NORMAL; m_img_filter_arg = 1.0; m_pattern_mode = 0; + m_img_border = 0; + m_img_key_color = rgba8(255,255,255,255); + m_pattern_x = 0; + m_pattern_y = 0; + m_pattern_w = 0; + m_pattern_h = 0; agg_set_gamma(1); m_stroke.inner_join(inner_round); @@ -1344,11 +1350,10 @@ Reb_Print( void agg_graphics::agg_line( - double x1, double y1, + double x1, double y1, double x2, double y2 ) { - agg_begin_path(); m_path.move_to(x1,y1); m_path.line_to(x2,y2); } @@ -1389,7 +1394,7 @@ Reb_Print( void agg_graphics::agg_box( - double x1, double y1, + double x1, double y1, double x2, double y2 ) { @@ -1402,7 +1407,7 @@ Reb_Print( } void agg_graphics::agg_rounded_rect( - double x1, double y1, + double x1, double y1, double x2, double y2, double r ) { @@ -1460,7 +1465,7 @@ Reb_Print( } path_attributes& cattr = curr_attributes(); - + //bspline convertor conv_bspline bspline(m_path); bspline.interpolation_step(1.0 / step); @@ -1475,30 +1480,36 @@ Reb_Print( void agg_graphics::agg_end_poly_img ( unsigned char *img_buf, - int sizX, int sizY, int pw, int ph, int ox, int oy, int outline, int pattern, int r1, int g1, int b1, int a1 + int sizX, int sizY //, int pw, int ph, int ox, int oy, int pattern, ){ path_attributes& cattr = curr_attributes(); + double x,y,w,h; + if (m_pattern_w == 0 || m_pattern_h == 0){ + m_path.vertex(cattr.index, &x, &y); + m_path.vertex(cattr.index+2, &w, &h); + } + cattr.filled = RT_PERSPECTIVE_IMAGE; cattr.coord_x = sizX; cattr.coord_y = sizY; - cattr.coord_x2 = ox; - cattr.coord_y2 = oy; - cattr.coord_x3 = ox + pw; - cattr.coord_y3 = oy + ph; + cattr.coord_x2 = m_pattern_x; //ox; + cattr.coord_y2 = m_pattern_y; //oy; + cattr.coord_x3 = m_pattern_x + ((m_pattern_w == 0) ? w - x : m_pattern_w); //ox + pw; + cattr.coord_y3 = m_pattern_y + ((m_pattern_h == 0) ? h - y : m_pattern_h); //oy + ph; cattr.img_buf = img_buf; - cattr.pattern_mode = pattern; - if (outline == 0){ + cattr.pattern_mode = m_pattern_mode; //pattern; + if (m_img_border == 0){ //outline == 0){ cattr.dashed = false; cattr.stroked = false; } - cattr.g_color1 = rgba8(r1, g1, b1, a1); + cattr.g_color1 = m_img_key_color; //rgba8(r1, g1, b1, a1); m_path.close_polygon(); } void agg_graphics::agg_gtriangle( - REBPAR* p1, REBPAR* p2, REBPAR* p3, REBYTE* c1, REBYTE* c2, REBYTE* c3, double d + REBXYF p1, REBXYF p2, REBXYF p3, REBYTE* c1, REBYTE* c2, REBYTE* c3, double d ) { //add line points @@ -1510,20 +1521,20 @@ Reb_Print( cattr.g_color2 = rgba8(c2[0], c2[1], c2[2], 255 - c2[3]); cattr.g_color3 = rgba8(c3[0], c3[1], c3[2], 255 - c3[3]); } - + cattr.coord_x = d; //sets triangle dilation value - m_path.move_to(p1->x,p1->y); - m_path.line_to(p2->x,p2->y); - m_path.line_to(p3->x,p3->y); + m_path.move_to(p1.x,p1.y); + m_path.line_to(p2.x,p2.y); + m_path.line_to(p3.x,p3.y); m_path.close_polygon(); } void agg_graphics::agg_image( unsigned char *img_buf, - double oftX, double oftY, - int sizX, int sizY, int outline, int r1, int g1, int b1, int a1 + double oftX, double oftY, + int sizX, int sizY //, int outline, int r1, int g1, int b1, int a1 ) { m_img_mtx.reset(); @@ -1544,22 +1555,34 @@ Reb_Print( cattr.coord_y = sizY; cattr.img_buf = img_buf; cattr.mtx = m_img_mtx; - if (outline == 0){ + if (m_img_border == 0){ //outline == 0){ cattr.dashed = false; cattr.stroked = false; } - cattr.g_color1 = rgba8(r1, g1, b1, a1); + cattr.g_color1 = m_img_key_color;//rgba8(r1, g1, b1, a1); + } + + void agg_graphics::agg_image_options(int r, int g, int b, int a ,int border){ + m_img_key_color = rgba8(r, g, b, a); + m_img_border = border; + } + + void agg_graphics::agg_image_pattern(int mode, double x, double y, double w, double h){ + m_pattern_mode = mode; + m_pattern_x = x; + m_pattern_y = x; + m_pattern_w = w; + m_pattern_h = h; } //------------------------------------------------------------------------ int agg_graphics::agg_push_mtx() { -// path_attributes& attr = path_attributes(); -// agg_get_attributes(attr); -// m_stack.add(attr); -// return m_stack.size(); - return 0; + path_attributes attr = path_attributes(); + agg_get_attributes(attr); + m_stack.add(attr); + return m_stack.size(); } @@ -1575,7 +1598,7 @@ Reb_Print( agg_set_attributes(attr); m_stack.remove_last(); - + return m_stack.size(); } @@ -1602,7 +1625,7 @@ Reb_Print( m_post_mtx.invert(); m_output_mtx = m_resize_mtx; } - + void agg_graphics::agg_anti_alias(bool mode) { m_anti_aliased = mode; @@ -1629,7 +1652,7 @@ Reb_Print( { m_fill_rule = mode; } - + void agg_graphics::agg_stroke_join(line_join_e mode) { m_stroke_join = mode; @@ -1665,23 +1688,22 @@ Reb_Print( m_path.add_vertex(0.0, 0.0, path_cmd_stop); //closes the path as it is not used in future processing... } - REBINT agg_graphics::agg_text(REBINT vectorial, REBPAR* p1, REBPAR* p2, REBSER* block) + REBINT agg_graphics::agg_text(REBINT vectorial, REBXYF* p1, REBXYF* p2, REBSER* block) { agg_begin_path(); path_attributes& cattr = curr_attributes(); - int ox, oy; + double ox, oy; if (p1) { ox = p1->x; oy = p1->y; } else ox = oy = 0; - if (vectorial){ //vectorial - int sx,sy; - + double sx,sy; + if (p2) { sx = p2->x; sy = p2->y; @@ -1690,26 +1712,28 @@ Reb_Print( sx = m_actual_width; sy = m_actual_height; } -#ifdef TEMP_REMOVE + rich_text* rt = (rich_text*)Rich_Text; rt->rt_reset(); - - rt->rt_attach_buffer(m_buf, sx - ox, sy - oy, m_offset_x, m_offset_y); - if (p2) rt->rt_set_clip(ox, oy, sx,sy); + rt->rt_attach_buffer(m_buf, (int)(sx - ox), (int)(sy - oy), m_offset_x, m_offset_y); - REBINT result = -1; //// Text_Gob(rt, block); - if (result < 0) return result; + if (p2) rt->rt_set_clip((int)ox, (int)oy, (int)sx,(int)sy); + +// REBINT result = Text_Gob(rt, block); +// if (result < 0) return result; + Text_Gob(rt, block); //force to vectors no matter what was in the dialect block rt->rt_text_mode(2); rt->rt_set_graphics(this); rt->rt_draw_text(DRAW_TEXT, p1); -#endif + // if (p2) agg_set_clip(cattr.clip_x1, cattr.clip_y1, cattr.clip_x2, cattr.clip_y2); } else { //raster +// Reb_Print("agg RASTR text %dx%d %dx%d\n", ox, oy, (int)p2->x, (int)p2->y); cattr.filled = RT_TEXT; cattr.block = block; cattr.coord_x = ox; @@ -1768,7 +1792,7 @@ Reb_Print( void agg_graphics::agg_path_quadratic_curve(int rel, double x1, double y1, // Q, q double x, double y) { - if(rel) + if(rel) { m_path.rel_to_abs(&x1, &y1); m_path.rel_to_abs(&x, &y); @@ -1778,7 +1802,7 @@ Reb_Print( void agg_graphics::agg_path_quadratic_curve_to(int rel, double x, double y) // T, t { - if(rel) + if(rel) { m_path.curve3_rel(x, y); } else { @@ -1788,7 +1812,7 @@ Reb_Print( void agg_graphics::agg_path_cubic_curve(int rel, double x1, double y1, // C, c - double x2, double y2, + double x2, double y2, double x, double y) { if(rel) @@ -1804,7 +1828,7 @@ Reb_Print( void agg_graphics::agg_path_cubic_curve_to(int rel, double x2, double y2, // S, s double x, double y) { - if(rel) + if(rel) { m_path.curve4_rel(x2, y2, x, y); } else { @@ -1815,7 +1839,7 @@ Reb_Print( void agg_graphics::agg_path_arc(int rel, double rx, double ry, // A, c double angle, - int large_arc, + int large_arc, int sweep, double x, double y) { @@ -1828,7 +1852,7 @@ Reb_Print( large_arc_flag = true; } angle = fmod(angle, 360) * pi / 180.0; - if(!rel) + if(!rel) { m_path.arc_to( rx,ry, @@ -1836,7 +1860,7 @@ Reb_Print( large_arc_flag, sweep_flag, x, y); - } else { + } else { m_path.arc_rel( rx,ry, angle, diff --git a/src/agg/agg_graphics.h b/src/agg/agg_graphics.h index b09238a..f6c0237 100644 --- a/src/agg/agg_graphics.h +++ b/src/agg/agg_graphics.h @@ -1,3 +1,6 @@ +//REBOL stuff +#include "reb-host.h" + //basic api #include "agg_scanline_p.h" #include "agg_scanline_u.h" @@ -60,20 +63,21 @@ #include "agg_blur.h" //REBOL stuff -#include "reb-config.h" -#include "reb-c.h" -#include "reb-defs.h" -#include "reb-gob.h" -#undef IS_ERROR +// #include "reb-config.h" +// #include "reb-c.h" +// #include "reb-defs.h" +// #include "reb-gob.h" +// #undef IS_ERROR namespace agg { + #include "host-ext-draw.h" template double* getVertices(VertexSource& pth, unsigned p, double c = 0){ path_storage tmp; tmp.add_path(pth,p); - + double* vertices = new double[tmp.total_vertices() * 2]; double x; double y; @@ -94,7 +98,7 @@ namespace agg { color_key(rgba8 key) : c(key) {} #ifdef ENDIAN_BIG - void operator() (int8u* argb) + void operator() (int8u* argb) { if(argb[1] == c.r && argb[2] == c.g && argb[3] == c.b) { @@ -105,7 +109,7 @@ namespace agg } } #else - void operator() (int8u* bgra) + void operator() (int8u* bgra) { if(bgra[0] == c.b && bgra[1] == c.g && bgra[2] == c.r) { @@ -129,7 +133,7 @@ namespace agg virtual void mode(int mode) = 0; }; - template + template class gradient_polymorphic_wrapper : public gradient_polymorphic_wrapper_base { public: @@ -138,9 +142,9 @@ namespace agg { if (d==0) d=1; // protect from divide by zero in repeat and reflect cases switch (m_mode) { - case 1: //repeat + case W_DRAW_REPEAT: //repeat return m_repeat_adaptor.calculate(x, y, d); - case 2: //reflect + case W_DRAW_REFLECT: //reflect return m_reflect_adaptor.calculate(x, y, d); default: //normal return m_gradient.calculate(x, y, d); @@ -166,16 +170,16 @@ namespace agg static unsigned size() { return 256; } const rgba8& operator [] (unsigned v) const - { - return m_colors[v]; + { + return m_colors[v]; } const rgba8* m_colors; }; - + enum render_types - { + { RT_NONE = 0, RT_FILL, RT_GORAUD, @@ -185,30 +189,30 @@ namespace agg RT_TEXT, RT_EFFECT, RT_CLIPPING - + }; - + enum filter_types - { + { FT_NEAREST = 0, FT_BILINEAR, FT_BICUBIC, FT_GAUSSIAN }; - + enum filter_modes - { + { FM_NORMAL = 0, FM_RESAMPLE }; - + enum pattern_modes - { + { PM_NORMAL = 0, PM_REPEAT, PM_REFLECT }; - + // Basic path attributes struct path_attributes { @@ -429,9 +433,11 @@ namespace agg void agg_curve4 (double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); void agg_end_poly (); void agg_end_bspline (int step, int closed = 0); - void agg_end_poly_img(unsigned char *img_buf, int sizX, int sizY, int pw = 0, int ph = 0, int ox = 0, int oy = 0, int outline = 0, int pattern = 0, int r1 = 0, int g1 = 0, int b1 = 0, int a1 = 0); - void agg_gtriangle(REBPAR* p1, REBPAR* p2, REBPAR* p3, REBYTE* c1, REBYTE* c2, REBYTE* c3, double d = 0.0); - void agg_image(unsigned char *img_buf, double oftX, double oftY, int sizX, int sizY, int outline = 0, int r1 = 0, int g1 = 0, int b1 = 0, int a1 = 0);//, double ang, int ctrX, int ctrY); + void agg_end_poly_img(unsigned char *img_buf, int sizX, int sizY); //, int pw = 0, int ph = 0, int ox = 0, int oy = 0, int outline = 0, int pattern = 0, int r1 = 0, int g1 = 0, int b1 = 0, int a1 = 0); + void agg_gtriangle(REBXYF p1, REBXYF p2, REBXYF p3, REBYTE* c1, REBYTE* c2, REBYTE* c3, double d = 0.0); + void agg_image(unsigned char *img_buf, double oftX, double oftY, int sizX, int sizY); //, int outline = 0, int r1 = 0, int g1 = 0, int b1 = 0, int a1 = 0);//, double ang, int ctrX, int ctrY); + void agg_image_options(int r, int g, int b, int a ,int border); + void agg_image_pattern(int mode, double x, double y, double w, double h); int agg_push_mtx(); int agg_pop_mtx(); @@ -445,7 +451,7 @@ namespace agg void agg_dash_cap(line_cap_e mode); void agg_effect(REBPAR* p1, REBPAR* p2, REBSER* block); - REBINT agg_text(REBINT vectorial, REBPAR* p1, REBPAR* p2, REBSER* block); + REBINT agg_text(REBINT vectorial, REBXYF* p1, REBXYF* p2, REBSER* block); //PATH sub-commands void agg_path_move(int rel, double x, double y); // M, m @@ -456,13 +462,13 @@ namespace agg double x, double y); void agg_path_quadratic_curve_to(int rel, double x, double y); // T, t void agg_path_cubic_curve(int rel, double x1, double y1, // C, c - double x2, double y2, + double x2, double y2, double x, double y); void agg_path_cubic_curve_to(int rel, double x2, double y2, // S, s double x, double y); void agg_path_arc(int rel, double rx, double ry, // A, a double angle, - int large_arc, + int large_arc, int sweep, double x, double y); void agg_path_close(); // Z, z @@ -512,7 +518,7 @@ namespace agg interp_persp m_interpolator_persp; //gradient stuff - unsigned char m_grad_gamma[256]; + unsigned char m_grad_gamma[256]; gradient_polymorphic_wrapper_base* m_gradient; gradient_polymorphic_wrapper gr_circle; gradient_polymorphic_wrapper gr_diamond; @@ -575,6 +581,15 @@ namespace agg int m_arrow_head; int m_arrow_tail; rgba8 m_arrow_color; + + //image + rgba8 m_img_key_color; + double m_img_border; + double m_pattern_x; + double m_pattern_y; + double m_pattern_w; + double m_pattern_h; + }; - + } diff --git a/src/agg/agg_scanline_bin.h b/src/agg/agg_scanline_bin.h index f128f13..a1d2cef 100644 --- a/src/agg/agg_scanline_bin.h +++ b/src/agg/agg_scanline_bin.h @@ -78,7 +78,7 @@ namespace agg m_max_len = max_len; } m_last_x = 0x7FFFFFF0; - m_cur_span = m_spans; + m_cur_span = &m_spans[0]; } //-------------------------------------------------------------------- @@ -129,13 +129,13 @@ namespace agg void reset_spans() { m_last_x = 0x7FFFFFF0; - m_cur_span = m_spans; + m_cur_span = &m_spans[0]; } //-------------------------------------------------------------------- int y() const { return m_y; } - unsigned num_spans() const { return unsigned(m_cur_span - m_spans); } - const_iterator begin() const { return m_spans + 1; } + unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } + const_iterator begin() const { return &m_spans[1]; } private: scanline_bin(const scanline_bin&); diff --git a/src/agg/agg_scanline_p.h b/src/agg/agg_scanline_p.h index ca8a856..83c2176 100644 --- a/src/agg/agg_scanline_p.h +++ b/src/agg/agg_scanline_p.h @@ -2,8 +2,8 @@ // Anti-Grain Geometry - Version 2.3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // @@ -17,12 +17,12 @@ // //---------------------------------------------------------------------------- // -// Adaptation for 32-bit screen coordinates (scanline32_p) has been sponsored by +// Adaptation for 32-bit screen coordinates (scanline32_p) has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. -// +// //---------------------------------------------------------------------------- #ifndef AGG_SCANLINE_P_INCLUDED #define AGG_SCANLINE_P_INCLUDED @@ -33,11 +33,11 @@ namespace agg { //==============================================================scanline_p - // - // This is a general purpose scaline container which supports the interface + // + // This is a general purpose scaline container which supports the interface // used in the rasterizer::render(). See description of agg_scanline_u // for details. - // + // //------------------------------------------------------------------------ template class scanline_p { @@ -86,8 +86,8 @@ namespace agg m_max_len = max_len; } m_last_x = 0x7FFFFFF0; - m_cover_ptr = m_covers; - m_cur_span = m_spans; + m_cover_ptr = &m_covers[0]; + m_cur_span = &m_spans[0]; m_cur_span->len = 0; } @@ -132,8 +132,8 @@ namespace agg //-------------------------------------------------------------------- void add_span(int x, unsigned len, unsigned cover) { - if(x == m_last_x+1 && - m_cur_span->len < 0 && + if(x == m_last_x+1 && + m_cur_span->len < 0 && cover == *m_cur_span->covers) { m_cur_span->len -= (int16)len; @@ -150,24 +150,24 @@ namespace agg } //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; + void finalize(int y) + { + m_y = y; } //-------------------------------------------------------------------- void reset_spans() { m_last_x = 0x7FFFFFF0; - m_cover_ptr = m_covers; - m_cur_span = m_spans; + m_cover_ptr = &m_covers[0]; + m_cur_span = &m_spans[0]; m_cur_span->len = 0; } //-------------------------------------------------------------------- int y() const { return m_y; } - unsigned num_spans() const { return unsigned(m_cur_span - m_spans); } - const_iterator begin() const { return m_spans + 1; } + unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } + const_iterator begin() const { return &m_spans[1]; } private: scanline_p(const scanline_p&); @@ -265,7 +265,7 @@ namespace agg m_max_len = max_len; } m_last_x = 0x7FFFFFF0; - m_cover_ptr = m_covers; + m_cover_ptr = &m_covers[0]; m_spans.remove_all(); } @@ -304,9 +304,9 @@ namespace agg //-------------------------------------------------------------------- void add_span(int x, unsigned len, unsigned cover) { - if(x == m_last_x+1 && + if(x == m_last_x+1 && m_spans.size() && - m_spans.last().len < 0 && + m_spans.last().len < 0 && cover == *m_spans.last().covers) { m_spans.last().len -= coord_type(len); @@ -320,16 +320,16 @@ namespace agg } //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; + void finalize(int y) + { + m_y = y; } //-------------------------------------------------------------------- void reset_spans() { m_last_x = 0x7FFFFFF0; - m_cover_ptr = m_covers; + m_cover_ptr = &m_covers[0]; m_spans.remove_all(); } diff --git a/src/agg/agg_scanline_u.h b/src/agg/agg_scanline_u.h index b89c698..883ffb1 100644 --- a/src/agg/agg_scanline_u.h +++ b/src/agg/agg_scanline_u.h @@ -2,8 +2,8 @@ // Anti-Grain Geometry - Version 2.3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) // -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. +// Permission to copy, use, modify, sell and distribute this software +// is granted provided this copyright notice appears in all copies. // This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // @@ -13,12 +13,12 @@ // http://www.antigrain.com //---------------------------------------------------------------------------- // -// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by +// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by // Liberty Technology Systems, Inc., visit http://lib-sys.com // // Liberty Technology Systems, Inc. is the provider of // PostScript and PDF technology for software developers. -// +// //---------------------------------------------------------------------------- #ifndef AGG_SCANLINE_U_INCLUDED @@ -32,22 +32,22 @@ namespace agg // // Unpacked scanline container class // - // This class is used to transfer data from a scanline rasterizer - // to the rendering buffer. It's organized very simple. The class stores - // information of horizontal spans to render it into a pixel-map buffer. - // Each span has staring X, length, and an array of bytes that determine the - // cover-values for each pixel. - // Before using this class you should know the minimal and maximal pixel + // This class is used to transfer data from a scanline rasterizer + // to the rendering buffer. It's organized very simple. The class stores + // information of horizontal spans to render it into a pixel-map buffer. + // Each span has staring X, length, and an array of bytes that determine the + // cover-values for each pixel. + // Before using this class you should know the minimal and maximal pixel // coordinates of your scanline. The protocol of using is: // 1. reset(min_x, max_x) - // 2. add_cell() / add_span() - accumulate scanline. + // 2. add_cell() / add_span() - accumulate scanline. // When forming one scanline the next X coordinate must be always greater // than the last stored one, i.e. it works only with ordered coordinates. // 3. Call finalize(y) and render the scanline. // 3. Call reset_spans() to prepare for the new scanline. - // + // // 4. Rendering: - // + // // Scanline provides an iterator class that allows you to extract // the spans and the cover values for each pixel. Be aware that clipping // has not been done yet, so you should perform it yourself. @@ -61,10 +61,10 @@ namespace agg // ************************************ // // scanline_u8::const_iterator span = sl.begin(); - // - // unsigned char* row = m_rbuf->row(y); // The the address of the beginning + // + // unsigned char* row = m_rbuf->row(y); // The the address of the beginning // // of the current row - // + // // unsigned num_spans = sl.num_spans(); // Number of spans. It's guaranteed that // // num_spans is always greater than 0. // @@ -75,7 +75,7 @@ namespace agg // // int num_pix = span->len; // Number of pixels of the span. // // Always greater than 0, still it's - // // better to use "int" instead of + // // better to use "int" instead of // // "unsigned" because it's more // // convenient for clipping // int x = span->x; @@ -86,24 +86,24 @@ namespace agg // ************************************** // // unsigned char* dst = row + x; // Calculate the start address of the row. - // // In this case we assume a simple + // // In this case we assume a simple // // grayscale image 1-byte per pixel. // do // { - // *dst++ = *covers++; // Hypotetical rendering. + // *dst++ = *covers++; // Hypotetical rendering. // } // while(--num_pix); // // ++span; - // } + // } // while(--num_spans); // num_spans cannot be 0, so this loop is quite safe //------------------------------------------------------------------------ // // The question is: why should we accumulate the whole scanline when we // could render just separate spans when they're ready? - // That's because using the scanline is generally faster. When is consists + // That's because using the scanline is generally faster. When is consists // of more than one span the conditions for the processor cash system - // are better, because switching between two different areas of memory + // are better, because switching between two different areas of memory // (that can be very large) occurs less frequently. //------------------------------------------------------------------------ template class scanline_u @@ -154,7 +154,7 @@ namespace agg } m_last_x = 0x7FFFFFF0; m_min_x = min_x; - m_cur_span = m_spans; + m_cur_span = &m_spans[0]; } //-------------------------------------------------------------------- @@ -171,7 +171,7 @@ namespace agg m_cur_span++; m_cur_span->x = (coord_type)(x + m_min_x); m_cur_span->len = 1; - m_cur_span->covers = m_covers + x; + m_cur_span->covers = &m_covers[x]; } m_last_x = x; } @@ -180,7 +180,7 @@ namespace agg void add_cells(int x, unsigned len, const CoverT* covers) { x -= m_min_x; - memcpy(m_covers + x, covers, len * sizeof(CoverT)); + memcpy(&m_covers[x], covers, len * sizeof(CoverT)); if(x == m_last_x+1) { m_cur_span->len += (coord_type)len; @@ -190,7 +190,7 @@ namespace agg m_cur_span++; m_cur_span->x = (coord_type)(x + m_min_x); m_cur_span->len = (coord_type)len; - m_cur_span->covers = m_covers + x; + m_cur_span->covers = &m_covers[x]; } m_last_x = x + len - 1; } @@ -199,7 +199,7 @@ namespace agg void add_span(int x, unsigned len, unsigned cover) { x -= m_min_x; - memset(m_covers + x, cover, len); + memset(&m_covers[x], cover, len); if(x == m_last_x+1) { m_cur_span->len += (coord_type)len; @@ -209,29 +209,29 @@ namespace agg m_cur_span++; m_cur_span->x = (coord_type)(x + m_min_x); m_cur_span->len = (coord_type)len; - m_cur_span->covers = m_covers + x; + m_cur_span->covers = &m_covers[x]; } m_last_x = x + len - 1; } //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; + void finalize(int y) + { + m_y = y; } //-------------------------------------------------------------------- void reset_spans() { m_last_x = 0x7FFFFFF0; - m_cur_span = m_spans; + m_cur_span = &m_spans[0]; } //-------------------------------------------------------------------- int y() const { return m_y; } - unsigned num_spans() const { return unsigned(m_cur_span - m_spans); } - const_iterator begin() const { return m_spans + 1; } - iterator begin() { return m_spans + 1; } + unsigned num_spans() const { return unsigned(m_cur_span - &m_spans[0]); } + const_iterator begin() const { return &m_spans[1]; } + iterator begin() { return &m_spans[1]; } private: scanline_u(const self_type&); @@ -260,11 +260,11 @@ namespace agg //=============================================================scanline_am - // + // // The scanline container with alpha-masking - // + // //------------------------------------------------------------------------ - template + template class scanline_am : public scanline_u { public: @@ -286,9 +286,9 @@ namespace agg unsigned count = scanline_type::num_spans(); do { - m_alpha_mask->combine_hspan(span->x, - scanline_type::y(), - span->covers, + m_alpha_mask->combine_hspan(span->x, + scanline_type::y(), + span->covers, span->len); ++span; } @@ -302,7 +302,7 @@ namespace agg //==========================================================scanline_u8_am - template + template class scanline_u8_am : public scanline_am { public: @@ -418,7 +418,7 @@ namespace agg } else { - m_spans.add(span(coord_type(x + m_min_x), 1, m_covers + x)); + m_spans.add(span(coord_type(x + m_min_x), 1, &m_covers[x])); } m_last_x = x; } @@ -427,14 +427,14 @@ namespace agg void add_cells(int x, unsigned len, const cover_type* covers) { x -= m_min_x; - memcpy(m_covers + x, covers, len * sizeof(cover_type)); + memcpy(&m_covers[x], covers, len * sizeof(cover_type)); if(x == m_last_x+1) { m_spans.last().len += coord_type(len); } else { - m_spans.add(span(coord_type(x + m_min_x), coord_type(len), m_covers + x)); + m_spans.add(span(coord_type(x + m_min_x), coord_type(len), &m_covers[x])); } m_last_x = x + len - 1; } @@ -443,22 +443,22 @@ namespace agg void add_span(int x, unsigned len, unsigned cover) { x -= m_min_x; - memset(m_covers + x, cover, len); + memset(&m_covers[x], cover, len); if(x == m_last_x+1) { m_spans.last().len += coord_type(len); } else { - m_spans.add(span(coord_type(x + m_min_x), coord_type(len), m_covers + x)); + m_spans.add(span(coord_type(x + m_min_x), coord_type(len), &m_covers[x])); } m_last_x = x + len - 1; } //-------------------------------------------------------------------- - void finalize(int y) - { - m_y = y; + void finalize(int y) + { + m_y = y; } //-------------------------------------------------------------------- @@ -501,11 +501,11 @@ namespace agg //===========================================================scanline32_am - // + // // The scanline container with alpha-masking - // + // //------------------------------------------------------------------------ - template + template class scanline32_am : public scanline32_u { public: @@ -527,9 +527,9 @@ namespace agg unsigned count = scanline_type::num_spans(); do { - m_alpha_mask->combine_hspan(span->x, - scanline_type::y(), - span->covers, + m_alpha_mask->combine_hspan(span->x, + scanline_type::y(), + span->covers, span->len); ++span; } @@ -543,7 +543,7 @@ namespace agg //========================================================scanline32_u8_am - template + template class scanline32_u8_am : public scanline32_am { public: diff --git a/src/agg/agg_truetype_text.cpp b/src/agg/agg_truetype_text.cpp index 35d4fad..24d99dc 100644 --- a/src/agg/agg_truetype_text.cpp +++ b/src/agg/agg_truetype_text.cpp @@ -7,7 +7,7 @@ #include "agg_compo.h" #include "agg_truetype_text.h" -//extern "C" void Reb_Print(char *fmt, ...);//output just for testing +extern "C" void RL_Print(char *fmt, ...);//output just for testing namespace agg { @@ -21,7 +21,7 @@ namespace agg // m_contour(m_curves) { // m_contour.auto_detect_orientation(false); - + debug = 0; m_gren = glyph_ren_native_mono; @@ -30,14 +30,15 @@ namespace agg m_feng.flip_y(true); m_hinfo = 0; - + m_color_changed = 0; m_font = new font(); m_para = new para(); rt_push(); - } +// Reb_Print("RICH TEXT created!\n"); + } //destructor(can be enhanced) rich_text::~rich_text() @@ -45,6 +46,7 @@ namespace agg rt_reset(); delete m_font; delete m_para; +// Reb_Print("RICH TEXT destroyed!\n"); } text_attributes& rich_text::rt_curr_attributes() @@ -73,13 +75,30 @@ namespace agg void rich_text::rt_reset() { +// Reb_Print("RICH TEXT reset!\n"); rt_text_mode(0); m_color_changed = 0; + wchar_t *last_text = 0; + wchar_t *last_name = 0; + unsigned i; + for(i = 0; i < m_text_attributes.size(); i++){ + text_attributes attr = m_text_attributes[i]; + if (attr.text != last_text && attr.text_gc == FALSE){ + delete[] attr.text; + last_text = attr.text; + } + if (attr.name != last_name && !attr.name_gc){ + delete[] attr.name; + last_name = attr.name; + } + } + m_text_attributes.remove_all(); - m_font->name = (unsigned char *)"Arial"; + m_font->name = L"\x0041\x0072\x0069\x0061\x006C"; //"Arial" + m_font->name_gc = true; m_font->bold = 0; m_font->italic = 0; m_font->underline = 0; @@ -110,8 +129,8 @@ namespace agg m_para->indent_y = 0; m_para->scroll_x = 0; m_para->scroll_y = 0; - m_para->align = SW_LEFT; - m_para->valign = SW_TOP; + m_para->align = W_TEXT_LEFT; + m_para->valign = W_TEXT_TOP; if (m_caret) { delete m_caret; @@ -121,6 +140,10 @@ namespace agg delete m_hinfo; m_hinfo = 0; } + + m_text = 0; + + rt_push(); } void rich_text::rt_attach_buffer(ren_buf* img_buf, int w, int h, int x, int y) @@ -180,7 +203,8 @@ namespace agg attr.bold = m_font->bold; attr.color = rgba8(m_font->color[0],m_font->color[1],m_font->color[2],255 - m_font->color[3]); attr.italic = m_font->italic; - attr.name = (char *)(m_font->name); + attr.name = m_font->name; + attr.name_gc = m_font->name_gc; attr.offset_x = m_font->offset_x; attr.offset_y = m_font->offset_y; attr.shadow_x = m_font->shadow_x; @@ -210,7 +234,9 @@ namespace agg } //push text - attr.text = m_text; + attr.text = (wchar_t*)m_text; + //if set to TRUE don't deallocate text string..REBOL GC will handle it + attr.text_gc = m_text_gc; } @@ -226,7 +252,8 @@ namespace agg m_font->color[2] = attr.color.b; m_font->color[3] = 255 - attr.color.a; m_font->italic = attr.italic; - m_font->name = (unsigned char *)attr.name; + m_font->name = attr.name; + m_font->name_gc = attr.name_gc; m_font->offset_x = attr.offset_x; m_font->offset_y = attr.offset_y; m_font->shadow_x = attr.shadow_x; @@ -273,9 +300,10 @@ namespace agg return 0; } - int rich_text::rt_set_text(char* text) + int rich_text::rt_set_text(REBCHR* text, REBCNT gc) { m_text=text; + m_text_gc = gc; return 0; } @@ -304,9 +332,9 @@ namespace agg attr.desc = tm.tmDescent - 1; attr.asc = tm.tmAscent; - //get text height + //get text height SIZE area; - GetTextExtentPoint32( m_dc, "N", 1, &area ); + GetTextExtentPoint32( m_dc, L"\x004E", 1, &area ); //'N' return area.cy; } return 0; @@ -329,7 +357,8 @@ namespace agg maxSize = attr.size; attrIdx = i; } - if (strchr(attr.text,'\n')) break; +// if (strchr(attr.text,'\n')) break; + if (wcschr(attr.text, L'\x000A')) break; //'\n' } @@ -362,17 +391,17 @@ namespace agg } if(m_feng.create_font(attr.name, m_gren)){ - const char* p = attr.text; + const wchar_t* p = attr.text; if (init){ init = false; p+=offset; } while (*p){ - if (p[0]=='\n') return width; - if ((p[0]==' ') || (p[0]=='\t')) last_width= width; + if (p[0]==L'\x000A') return width; + if ((p[0]==L'\x0020') || (p[0]==L'\x0009')) last_width= width; const glyph_cache* glyph = m_fman.glyph(*p); if(glyph){ - if (p[0] == '\t') { + if (p[0] == L'\x0009') { int tab_width = attr.para.tabs; if (tab_width == 0){ tab_width = 40; @@ -385,7 +414,7 @@ namespace agg if ((attr.para.wrap) && (width >= m_wrap_size_x-m_right_hang)){ int last_word = width; while(*p){ - if ((p[0] == ' ') || (p[0] == '\t') || (p[0] == '\n')){ + if ((p[0] == L'\x0020') || (p[0] == L'\x0009') || (p[0] == L'\x000A')){ break; } const glyph_cache* glyph = m_fman.glyph(*p); @@ -408,7 +437,7 @@ namespace agg } - int rich_text::rt_size_text(REBPAR* size) + int rich_text::rt_size_text(REBXYF* size) { m_tmp_val.pair.x = size->x; m_tmp_val.pair.y = size->y; @@ -424,21 +453,21 @@ namespace agg given screen offset coords sets the offset of caret in text dialect array returns carret info structure for useful text handling --------------------------------------------------------------------*/ - void rich_text::rt_offset_to_caret(REBPAR* offset, REBINT *element, REBINT *position){ - m_tmp_val.pair.x = offset->x+1; - m_tmp_val.pair.y = offset->y; + void rich_text::rt_offset_to_caret(REBXYF offset, REBINT *element, REBINT *position){ + m_tmp_val.pair.x = offset.x+1; + m_tmp_val.pair.y = offset.y; rt_draw_text(OFFSET_TO_CARET); *element = m_tmp_val.pair.x-1; *position = m_tmp_val.pair.y-1; } - + /*------------------------------------------------------------------- given the ofset of caret returns screen offset relative to face returns carret info structure for useful text handling --------------------------------------------------------------------*/ - void rich_text::rt_caret_to_offset(REBPAR* offset, REBINT element, REBINT position){ + void rich_text::rt_caret_to_offset(REBXYF* offset, REBINT element, REBINT position){ m_tmp_val.pair.x = element+1; m_tmp_val.pair.y = position; rt_draw_text(CARET_TO_OFFSET); @@ -450,12 +479,12 @@ namespace agg void rich_text::rt_set_hinfo(hinfo* hinfo) sets text marking(highliting) using the hinfo structure --------------------------------------------------------------------*/ - void rich_text::rt_set_hinfo(REBPAR* highlightStart, REBPAR* highlightEnd){ + void rich_text::rt_set_hinfo(REBXYF highlightStart, REBXYF highlightEnd){ if (!m_hinfo) m_hinfo = new hinfo(); - m_hinfo->hStart.x = highlightStart->x; - m_hinfo->hStart.y = highlightStart->y; - m_hinfo->hEnd.x = highlightEnd->x; - m_hinfo->hEnd.y = highlightEnd->y; + m_hinfo->hStart.x = highlightStart.x; + m_hinfo->hStart.y = highlightStart.y; + m_hinfo->hEnd.x = highlightEnd.x; + m_hinfo->hEnd.y = highlightEnd.y; } /*------------------------------------------------------------------- @@ -463,6 +492,7 @@ namespace agg sets the text rendering mode (0-aliased,1-antialiased,2-vectorial) --------------------------------------------------------------------*/ int rich_text::rt_text_mode(int mode){ +// Reb_Print("rt_text_mode: %d\n", mode); switch(mode) { case 0: @@ -471,7 +501,7 @@ namespace agg break; case 1: m_gren = glyph_ren_agg_gray8; - m_feng.gamma(gamma_power(1.0)); + m_feng.gamma(gamma_power(1.0)); break; case 2: m_gren = glyph_ren_outline; @@ -484,18 +514,18 @@ namespace agg /*------------------------------------------------------------------- --------------------------------------------------------------------*/ - int rich_text::rt_set_caret(REBPAR* offset){ - if (!m_caret) m_caret = new REBPAR(); - m_caret->x = offset->x; - m_caret->y = offset->y; + int rich_text::rt_set_caret(REBXYF offset){ + if (!m_caret) m_caret = new REBXYF(); + m_caret->x = offset.x; + m_caret->y = offset.y; return 0; }; /*-------------------------------------------------------------------- Scrolls text stored in the attribute stack bypassing the dialect parser. --------------------------------------------------------------------*/ - int rich_text::rt_scroll(REBPAR* offset){ - rt_draw_text(DRAW_TEXT, offset); + int rich_text::rt_scroll(REBXYF offset){ + rt_draw_text(DRAW_TEXT, &offset); return 0; } @@ -509,18 +539,18 @@ namespace agg /*------------------------------------------------------------------- - int rich_text::rt_draw_text(int mode, REBPAR* offset) + int rich_text::rt_draw_text(int mode, REBXYF offset) main rendering function, the offset is optional (for fast scroll) it is also used for o-t-c and c-t-o computations --------------------------------------------------------------------*/ - int rich_text::rt_draw_text(int mode, REBPAR* offset) + int rich_text::rt_draw_text(int mode, REBXYF* offset) { unsigned const attrSize = m_text_attributes.size(); if (!attrSize) return 0; - rect clip_box(m_clip_x1, m_clip_y1, m_clip_x2, m_clip_y2); + rect clip_box(m_clip_x1, m_clip_y1, m_clip_x2, m_clip_y2); // m_contour.width(-m_weight.value() * m_height.value() * 0.05); @@ -549,15 +579,15 @@ namespace agg //set vertical aligning int valign = 0; - if (mode == DRAW_TEXT && attr.para.valign != SW_TOP){ - REBPAR total_size; + if (mode == DRAW_TEXT && attr.para.valign != W_TEXT_TOP){ + REBXYF total_size; rt_size_text(&total_size); if (total_size.y == 0) total_size.y = lh; switch (attr.para.valign){ - case SW_BOTTOM: + case W_TEXT_BOTTOM: valign = m_wrap_size_y - total_size.y; break; - case SW_MIDDLE: + case W_TEXT_MIDDLE: valign = (m_wrap_size_y - total_size.y) / 2; break; } @@ -587,7 +617,7 @@ namespace agg //find last text attribute const text_attributes* last_text_attr = &attr; - + for(i = attrSize-1;i>0;i--){ if (m_text_attributes[i].index != 0){ last_text_attr = &m_text_attributes[i]; @@ -599,15 +629,15 @@ namespace agg //precalculate the line width for aligning int lw = 0; //no effect by default - if (attr.para.align == SW_RIGHT) { + if (attr.para.align == W_TEXT_RIGHT) { lw = m_wrap_size_x - rt_line_width(0) - m_right_hang; - } else if (attr.para.align == SW_CENTER) { + } else if (attr.para.align == W_TEXT_CENTER) { lw = (m_wrap_size_x - rt_line_width(0) - m_right_hang) / 2; } //process attribute stack for(i = 0; i < attrSize; i++){ - +//Reb_Print("processing attr: %d\n", i); text_attributes& attr = m_text_attributes[i]; m_feng.height(attr.size); @@ -617,11 +647,12 @@ namespace agg } else { m_feng.weight(FW_DONTCARE); } - +//Reb_Print("create FONT beg\n"); if(m_feng.create_font(attr.name, m_gren)) { +// Reb_Print("create FONT OK\n"); // m_fman.precache(' ', 127); - + if (i == 0){ //compute start of x coord ABC* widths = new ABC [256]; @@ -652,23 +683,25 @@ m_text_pos_x = x0+lw; //get char_width SIZE area; - GetTextExtentPoint32( m_dc, "N", 1, &area ); + GetTextExtentPoint32( m_dc, L"\x004E", 1, &area ); //"N" attr.char_height = area.cy; - + if (attr.index == 0) { //skip attributes holding other than string info continue; } //render string - const char* p = attr.text; + const wchar_t* p = (wchar_t*)attr.text; - int slen = strlen(p); +// int slen = strlen(p); + int slen = wcslen(p); //word wrap support int wrap = 0; - int delim = strcspn (p," \n\t"); +// int delim = strcspn (p," \n\t"); + int delim = wcscspn (p,L"\x0020\x000A\x0009"); //" \n\t" if ((delim > slen)){ area.cx =0; } else { @@ -682,6 +715,7 @@ m_text_pos_x = x0+lw; switch (mode){ case DRAW_TEXT: { +// Reb_Print("DRAW TEXT!\n"); ren_buf tmp_rb; pixfmt_type tmp_pf(tmp_rb); @@ -691,24 +725,24 @@ m_text_pos_x = x0+lw; } else { shadow = false; } - +//Reb_Print("CLIP BOX!\n"); m_ren_base.clip_box(m_clip_x1, m_clip_y1, m_clip_x2, m_clip_y2); //draw text mode while(*p){ - +//Reb_Print("GET GLYPH!\n"); //get glyph const glyph_cache* glyph = m_fman.glyph(*p); - +//Reb_Print("GET GLYPH OK!\n"); if(glyph) { - +//Reb_Print("DRAW GLYPH!\n"); double g_adv_x = glyph->advance_x; bool tabbing = false; //tabbing - if ((attr.isPara) && (p[0]=='\t')) { + if ((attr.isPara) && (p[0]==L'\x0009')) { int tab_width = attr.para.tabs; if (tab_width == 0){ tab_width = 40; @@ -723,10 +757,11 @@ m_text_pos_x = x0+lw; wrap = 1; } - if (((p[0]==' ') || (p[0]=='\t') || ((p - attr.text != 0) && ((p-1)[0]=='\n'))) && (p[1]!=NULL)){ + if (((p[0]==L'\x0020') || (p[0]==L'\x0009') || ((p - attr.text != 0) && ((p-1)[0]==L'\x000A'))) && (p[1]!=0)){ //get new word width for wrap check wrap = 0; - delim = strcspn (p+1," \n\t"); +// delim = strcspn (p+1," \n\t"); + delim = wcscspn (p+1,L"\x0020\x000A\x0009"); //" \n\t" // Reb_Print("delim: %d %d %d %d %d", strlen(p+1), slen, p, attr.text, slen + (attr.text - p) - 1 ); if (delim > slen + (attr.text - p) - 1){ //optimized! this means: (delim > (int)strlen(p+1)) area.cx =0; @@ -743,9 +778,9 @@ m_text_pos_x = x0+lw; (wrap == 0) && (((m_text_pos_x-lw-x0) + area.cx) >= m_wrap_size_x-m_right_hang) ){ - //wrap the line + //wrap the line wrap = 1; - if ((p[0] !=' ') && (p[0] !='\n') && (p[0] != '\t')) p--; + if ((p[0] !=L'\x0020') && (p[0] !=L'\x000A') && (p[0] != L'\x0009')) p--; } if ( @@ -758,19 +793,18 @@ m_text_pos_x = x0+lw; wrap = 3; } else { wrap = 1; - if ((p[0] !=' ') && (p[0] !='\n') && (p[0] != '\t')) p--; + if ((p[0] !=L'\x0020') && (p[0] !=L'\x000A') && (p[0] != L'\x0009')) p--; } } } //line break if ( - (p[0]=='\n') || + (p[0]==L'\x000A') || //'\n' (wrap == 1) ){ - if ( - (m_caret !=0) && ((p[0] == '\n') || (p[0] == ' ') || (p[0] == '\t')) && + (m_caret !=0) && ((p[0] == L'\x000A') || (p[0] == L'\x0020') || (p[0] == L'\x0009')) && (m_caret->x == (int)attr.index) && (m_caret->y == (p - attr.text)+1) ){ @@ -797,7 +831,8 @@ m_text_pos_x = x0+lw; // int slen = strlen(attr.text); if ((slen != 1) && (attr.char_height <= next_lh)){ - if (strchr(p+1,'\n') != NULL) { +// if (strchr(p+1,'\n') != NULL) { + if (wcschr(p+1,L'\x000A') != NULL) { //'\n' m_text_pos_y += attr.asc + prev_max_desc + attr.space_y + 1; mlha = i; lh = attr.char_height; @@ -841,9 +876,9 @@ m_text_pos_x = x0+lw; p++; //precalculate the line width for aligning - if (attr.para.align == SW_RIGHT) { + if (attr.para.align == W_TEXT_RIGHT) { lw = m_wrap_size_x - rt_line_width(i,(p - attr.text)) - m_right_hang; - } else if (attr.para.align == SW_CENTER) { + } else if (attr.para.align == W_TEXT_CENTER) { lw = (m_wrap_size_x - rt_line_width(i,(p - attr.text)) - m_right_hang) / 2; } else { lw = 0; //no effect by defaut @@ -984,12 +1019,12 @@ m_text_pos_x = x0+lw; m_fman.init_embedded_adaptors(glyph, bl, bl + attr.asc); m_ren_bin.color(attr.shadow_color); - - render_scanlines(m_fman.mono_adaptor(), - m_fman.mono_scanline(), + + render_scanlines(m_fman.mono_adaptor(), + m_fman.mono_scanline(), m_ren_bin); - - + + stack_blur_rgba32(tmp_pf, bl, bl); m_ren_base.blend_from(tmp_pf,0,(int)(m_text_pos_x+attr.shadow_x-bl), (int)(m_text_pos_y+attr.shadow_y-attr.asc-bl), 255); delete[] tmp; @@ -998,9 +1033,9 @@ m_text_pos_x = x0+lw; //simple shadow outline m_fman.init_embedded_adaptors(glyph, m_text_pos_x+attr.shadow_x, m_text_pos_y+attr.shadow_y); m_ren_bin.color(attr.shadow_color); - - render_scanlines(m_fman.mono_adaptor(), - m_fman.mono_scanline(), + + render_scanlines(m_fman.mono_adaptor(), + m_fman.mono_scanline(), m_ren_bin); } } @@ -1010,8 +1045,8 @@ m_text_pos_x = x0+lw; m_fman.init_embedded_adaptors(glyph, m_text_pos_x, m_text_pos_y); - render_scanlines(m_fman.mono_adaptor(), - m_fman.mono_scanline(), + render_scanlines(m_fman.mono_adaptor(), + m_fman.mono_scanline(), m_ren_bin); break; @@ -1039,12 +1074,12 @@ m_text_pos_x = x0+lw; m_fman.init_embedded_adaptors(glyph, bl, bl + attr.asc); m_ren_solid.color(attr.shadow_color); - - render_scanlines(m_fman.gray8_adaptor(), - m_fman.gray8_scanline(), + + render_scanlines(m_fman.gray8_adaptor(), + m_fman.gray8_scanline(), m_ren_solid); - - + + stack_blur_rgba32(tmp_pf, bl, bl); m_ren_base.blend_from(tmp_pf,0,(int)(m_text_pos_x+attr.shadow_x-bl), (int)(m_text_pos_y+attr.shadow_y-attr.asc-bl), 255); delete[] tmp; @@ -1053,8 +1088,8 @@ m_text_pos_x = x0+lw; //simple shadow outline m_fman.init_embedded_adaptors(glyph, m_text_pos_x+attr.shadow_x, m_text_pos_y+attr.shadow_y); m_ren_solid.color(attr.shadow_color); - render_scanlines(m_fman.gray8_adaptor(), - m_fman.gray8_scanline(), + render_scanlines(m_fman.gray8_adaptor(), + m_fman.gray8_scanline(), m_ren_solid); } } @@ -1062,15 +1097,14 @@ m_text_pos_x = x0+lw; m_ren_solid.color(attr.color); } m_fman.init_embedded_adaptors(glyph, m_text_pos_x, m_text_pos_y); - render_scanlines(m_fman.gray8_adaptor(), - m_fman.gray8_scanline(), + render_scanlines(m_fman.gray8_adaptor(), + m_fman.gray8_scanline(), m_ren_solid); break; case glyph_data_outline: //render vectorial text - m_fman.init_embedded_adaptors(glyph, m_text_pos_x, m_text_pos_y); m_path_storage->add_path(m_curves, m_cattr->index, false); break; @@ -1105,16 +1139,16 @@ m_text_pos_x = x0+lw; } ++p; } - + if (m_gren == glyph_ren_outline){ - + if (m_color_changed && i >= m_color_changed) { //use richtext colors once it is change in the dialect m_cattr->fill_pen = attr.color; m_cattr->filled = RT_FILL; m_cattr->fill_pen_img_buf = NULL; } - + //close previous path m_path_storage->move_to(0,0); m_path_storage->add_vertex(0.0, 0.0, path_cmd_stop); @@ -1157,7 +1191,7 @@ m_text_pos_x = x0+lw; bool tabbing = false; //tabbing - if ((attr.isPara) && (p[0]=='\t')) { + if ((attr.isPara) && (p[0]==L'\x0009')) { int tab_width = attr.para.tabs; if (tab_width == 0){ tab_width = 40; @@ -1171,10 +1205,11 @@ m_text_pos_x = x0+lw; if (wrap == 3) { wrap = 1; } - if (((p[0]==' ') || (p[0]=='\t') || ((p - attr.text != 0) && ((p-1)[0]=='\n'))) && (p[1]!=NULL)){ + if (((p[0]==L'\x0020') || (p[0]==L'\x0009') || ((p - attr.text != 0) && ((p-1)[0]==L'\x000A'))) && (p[1] != 0)){ //get new word width for wrap check wrap = 0; - delim = strcspn (p+1," \n\t"); +// delim = strcspn (p+1," \n\t"); + delim = wcscspn (p+1,L"\x0020\x000A\x0009"); //" \n\t" if (delim > slen + (attr.text - p) - 1){ //optimized! this means: (delim > (int)strlen(p+1)) area.cx =0; } else { @@ -1190,9 +1225,9 @@ m_text_pos_x = x0+lw; (wrap == 0) && (((m_text_pos_x-lw-x0) + area.cx) >= m_wrap_size_x-m_right_hang) ){ - //wrap the line + //wrap the line wrap = 1; - if ((p[0] !=' ') && (p[0] !='\n') && (p[0] != '\t')) p--; + if ((p[0] !=L'\x0020') && (p[0] !=L'\x000A') && (p[0] != L'\x0009')) p--; } if ( @@ -1205,7 +1240,7 @@ m_text_pos_x = x0+lw; wrap = 3; } else { wrap = 1; - if ((p[0] !=' ') && (p[0] !='\n') && (p[0] != '\t')) p--; + if ((p[0] !=L'\x0020') && (p[0] !=L'\x000A') && (p[0] != L'\x0009')) p--; } } } @@ -1213,7 +1248,7 @@ m_text_pos_x = x0+lw; //line break if ( - (p[0]=='\n') || + (p[0]==L'\x000A') || (wrap == 1) ){ //check the offset to caret condition @@ -1248,7 +1283,8 @@ m_text_pos_x = x0+lw; // int slen = strlen(attr.text); if ((slen != 1) && (attr.char_height <= next_lh)){ - if (strchr(p+1,'\n') != NULL) { +// if (strchr(p+1,'\n') != NULL) { + if (wcschr(p+1,L'\x000A') != NULL) { //'\n' m_text_pos_y += attr.asc + prev_max_desc + attr.space_y + 1; mlha = i; lh = attr.char_height; @@ -1269,7 +1305,7 @@ m_text_pos_x = x0+lw; } } } - + //reset x position if (wrap==1){ @@ -1282,9 +1318,9 @@ m_text_pos_x = x0+lw; p++; //precalculate the line width for aligning - if (attr.para.align == SW_RIGHT) { + if (attr.para.align == W_TEXT_RIGHT) { lw = m_wrap_size_x - rt_line_width(i,(p - attr.text)) - m_right_hang; - } else if (attr.para.align == SW_CENTER) { + } else if (attr.para.align == W_TEXT_CENTER) { lw = (m_wrap_size_x - rt_line_width(i,(p - attr.text)) - m_right_hang) / 2; } else { lw = 0; //no effect by defaut @@ -1316,7 +1352,7 @@ m_text_pos_x = x0+lw; int y = (int)m_text_pos_y - m_text_attributes[mlha].asc;//attr.asc; if ( (px>=x) && - (py>=y) && + (py>=y) && (px <= x + g_adv_x + attr.space_x) && (py <= m_text_pos_y+attr.space_y+m_text_attributes[mlha].desc)//attr.desc) ){ @@ -1379,7 +1415,7 @@ m_text_pos_x = x0+lw; bool tabbing = false; //tabbing - if ((attr.isPara) && (p[0]=='\t')) { + if ((attr.isPara) && (p[0]==L'\x0009')) { int tab_width = attr.para.tabs; if (tab_width == 0){ tab_width = 40; @@ -1393,10 +1429,11 @@ m_text_pos_x = x0+lw; if (wrap == 3) { wrap = 1; } - if (((p[0]==' ') || (p[0]=='\t') || ((p - attr.text != 0) && ((p-1)[0]=='\n'))) && (p[1]!=NULL)){ + if (((p[0]==L'\x0020') || (p[0]==L'\x0009') || ((p - attr.text != 0) && ((p-1)[0]==L'\x000A'))) && (p[1]!= 0)){ //get new word width for wrap check wrap = 0; - delim = strcspn (p+1," \n\t"); +// delim = strcspn (p+1," \n\t"); + delim = wcscspn (p+1,L"\x0020\x000A\x0009"); //" \n\t" if (delim > slen + (attr.text - p) - 1){ //optimized! this means: (delim > (int)strlen(p+1)) area.cx =0; } else { @@ -1412,9 +1449,9 @@ m_text_pos_x = x0+lw; (wrap == 0) && (((m_text_pos_x-lw-x0) + area.cx) >= m_wrap_size_x-m_right_hang) ){ - //wrap the line + //wrap the line wrap = 1; - if ((p[0] !=' ') && (p[0] !='\n') && (p[0] != '\t')) p--; + if ((p[0] !=L'\x0020') && (p[0] !=L'\x000A') && (p[0] != L'\x0009')) p--; } if ( @@ -1427,14 +1464,14 @@ m_text_pos_x = x0+lw; wrap = 3; } else { wrap = 1; - if ((p[0] !=' ') && (p[0] !='\n') && (p[0] != '\t')) p--; + if ((p[0] !=L'\x0020') && (p[0] !=L'\x000A') && (p[0] != L'\x0009')) p--; } } } - + //line break if ( - (p[0]=='\n') || + (p[0]==L'\x000A') || //'\n' (wrap == 1) ){ @@ -1472,7 +1509,8 @@ m_text_pos_x = x0+lw; // int slen = strlen(attr.text); if ((slen != 1) && (attr.char_height <= next_lh)){ - if (strchr(p+1,'\n') != NULL) { +// if (strchr(p+1,'\n') != NULL) { + if (wcschr(p+1,L'\x000A') != NULL) { //'\n' m_text_pos_y += attr.asc + prev_max_desc + attr.space_y + 1; mlha = i; lh = attr.char_height; @@ -1505,9 +1543,9 @@ m_text_pos_x = x0+lw; p++; //precalculate the line width for aligning - if (attr.para.align == SW_RIGHT) { + if (attr.para.align == W_TEXT_RIGHT) { lw = m_wrap_size_x - rt_line_width(i,(p - attr.text)) - m_right_hang; - } else if (attr.para.align == SW_CENTER) { + } else if (attr.para.align == W_TEXT_CENTER) { lw = (m_wrap_size_x - rt_line_width(i,(p - attr.text)) - m_right_hang) / 2; } else { lw = 0; //no effect by defaut @@ -1579,7 +1617,7 @@ m_text_pos_x = x0+lw; bool tabbing = false; //tabbing - if ((attr.isPara) && (p[0]=='\t')) { + if ((attr.isPara) && (p[0]==L'\x0009')) { int tab_width = attr.para.tabs; if (tab_width == 0){ tab_width = 40; @@ -1593,10 +1631,11 @@ m_text_pos_x = x0+lw; if (wrap == 3) { wrap = 1; } - if (((p[0]==' ') || (p[0]=='\t') || ((p - attr.text != 0) && ((p-1)[0]=='\n'))) && (p[1]!=NULL)){ + if (((p[0]==L'\x0020') || (p[0]==L'\x0009') || ((p - attr.text != 0) && ((p-1)[0]==L'\x000A'))) && (p[1] != 0)){ //get new word width for wrap check wrap = 0; - delim = strcspn (p+1," \n\t"); +// delim = strcspn (p+1," \n\t"); + delim = wcscspn (p+1,L"\x0020\x000A\x0009"); //" \n\t" if (delim > slen + (attr.text - p) - 1){ //optimized! this means: (delim > (int)strlen(p+1)) area.cx =0; } else { @@ -1612,9 +1651,9 @@ m_text_pos_x = x0+lw; (wrap == 0) && (((m_text_pos_x-lw-x0) + area.cx) >= m_wrap_size_x-m_right_hang) ){ - //wrap the line + //wrap the line wrap = 1; - if ((p[0] !=' ') && (p[0] !='\n') && (p[0] != '\t')) p--; + if ((p[0] !=L'\x0020') && (p[0] !=L'\x000A') && (p[0] != L'\x0009')) p--; } if ( @@ -1627,14 +1666,14 @@ m_text_pos_x = x0+lw; wrap = 3; } else { wrap = 1; - if ((p[0] !=' ') && (p[0] !='\n') && (p[0] != '\t')) p--; + if ((p[0] !=L'\x0020') && (p[0] !=L'\x000A') && (p[0] != L'\x0009')) p--; } } } - + //line break if ( - (p[0]=='\n') || + (p[0]==L'\x000A') || //'\n' (wrap == 1) ){ @@ -1657,7 +1696,8 @@ m_text_pos_x = x0+lw; // int slen = strlen(attr.text); if ((slen != 1) && (attr.char_height <= next_lh)){ - if (strchr(p+1,'\n') != NULL) { +// if (strchr(p+1,'\n') != NULL) { + if (wcschr(p+1,L'\x000A') != NULL) { //'\n' m_text_pos_y += attr.asc + prev_max_desc + attr.space_y + 1; mlha = i; lh = attr.char_height; @@ -1699,9 +1739,9 @@ m_text_pos_x = x0+lw; p++; //precalculate the line width for aligning - if (attr.para.align == SW_RIGHT) { + if (attr.para.align == W_TEXT_RIGHT) { lw = m_wrap_size_x - rt_line_width(i,(p - attr.text)) - m_right_hang; - } else if (attr.para.align == SW_CENTER) { + } else if (attr.para.align == W_TEXT_CENTER) { lw = (m_wrap_size_x - rt_line_width(i,(p - attr.text)) - m_right_hang) / 2; } else { lw = 0; //no effect by defaut @@ -1765,7 +1805,8 @@ m_text_pos_x = x0+lw; // ((clip) || (glyph->bounds.x1>=glyph->bounds.x2)) && (m_caret !=0) && (m_caret->x == (int)last_text_attr->index) && - (m_caret->y > (int)strlen(last_text_attr->text)) +// (m_caret->y > (int)strlen(last_text_attr->text)) + (m_caret->y > (int)wcslen(last_text_attr->text)) ){ m_ren_base.blend_bar((int)m_text_pos_x-1,(int)(m_text_pos_y-last_text_attr->asc),(int)(m_text_pos_x),(int)(m_text_pos_y+last_text_attr->desc), rgba8(0,0,0,255) ,255); } @@ -1783,7 +1824,8 @@ m_text_pos_x = x0+lw; case OFFSET_TO_CARET: //return tail of last string m_tmp_val.pair.x=last_text_attr->index; - m_tmp_val.pair.y=1+strlen(last_text_attr->text); +// m_tmp_val.pair.y=1+strlen(last_text_attr->text); + m_tmp_val.pair.y=1+wcslen(last_text_attr->text); caret_info.lh_asc=m_text_attributes[mlha].asc; caret_info.lh_desc=m_text_attributes[mlha].desc; diff --git a/src/agg/agg_truetype_text.h b/src/agg/agg_truetype_text.h index 8ddd9f9..26e20b2 100644 --- a/src/agg/agg_truetype_text.h +++ b/src/agg/agg_truetype_text.h @@ -10,7 +10,7 @@ #include "agg_conv_contour.h" #include "agg_pixfmt_rgba_rebol.h" #include "agg_font_win32_tt.h" -//include "words-graphics.h" +#include "host-ext-text.h" namespace agg { @@ -36,12 +36,13 @@ namespace agg //text highlight info typedef struct hinfo { - REBPAR hStart; - REBPAR hEnd; + REBXYF hStart; + REBXYF hEnd; } HINFO; typedef struct font { - REBYTE *name; + wchar_t *name; + REBCNT name_gc; REBINT bold; REBINT italic; REBINT underline; @@ -55,14 +56,15 @@ namespace agg REBINT shadow_y; REBYTE* shadow_color; REBINT shadow_blur; - + ~font() { delete [] color; delete [] shadow_color; } font() : - name((unsigned char *)"Arial"), + name(L"\x0041\x0072\x0069\x0061\x006C"), //"Arial" + name_gc(TRUE), bold(0), italic(0), underline(0), @@ -104,8 +106,8 @@ namespace agg indent_y(0), scroll_x(0), scroll_y(0), - align(SW_LEFT), - valign(SW_TOP) + align(W_TEXT_LEFT), + valign(W_TEXT_TOP) { } } PARA; @@ -117,7 +119,8 @@ namespace agg struct text_attributes { unsigned index; - char *name; + wchar_t *name; + bool name_gc; int bold; int italic; int underline; @@ -131,7 +134,8 @@ namespace agg int shadow_y; rgba8 shadow_color; REBINT shadow_blur; - char *text; + wchar_t *text; + bool text_gc; bool isPara; PARA para; long asc; @@ -141,6 +145,7 @@ namespace agg text_attributes(unsigned idx = 0) : index(idx), name(0), + name_gc(true), bold(0), italic(0), underline(0), @@ -170,8 +175,8 @@ namespace agg para.indent_y=0; para.scroll_x=0; para.scroll_y=0; - para.align=SW_LEFT; - para.valign=SW_TOP; + para.align=W_TEXT_LEFT; + para.valign=W_TEXT_TOP; } }; @@ -208,20 +213,20 @@ namespace agg para* rt_get_para(); void rt_attr_to_font (text_attributes& attr); int rt_drop(unsigned int idx = 1); - int rt_set_text(char* text); + int rt_set_text(REBCHR* text, REBCNT gc); int rt_text_mode(int mode =0); - int rt_draw_text(int mode = DRAW_TEXT, REBPAR* offset = 0); + int rt_draw_text(int mode = DRAW_TEXT, REBXYF* offset=0); - void rt_offset_to_caret(REBPAR* offset, REBINT *element, REBINT *position); - void rt_caret_to_offset(REBPAR* offset, REBINT element, REBINT position); + void rt_offset_to_caret(REBXYF offset, REBINT *element, REBINT *position); + void rt_caret_to_offset(REBXYF* offset, REBINT element, REBINT position); - int rt_set_caret(REBPAR* offset); + int rt_set_caret(REBXYF offset); - int rt_scroll(REBPAR* offset); + int rt_scroll(REBXYF offset); - void rt_set_hinfo(REBPAR* highlightStart, REBPAR* highlightEnd); + void rt_set_hinfo(REBXYF highlightStart, REBXYF highlightEnd); - int rt_size_text(REBPAR* size); + int rt_size_text(REBXYF* size); int rt_text_height(int idx); int rt_max_line_height(int idx); int rt_line_width(int idx, int start = 0); @@ -231,7 +236,7 @@ namespace agg void rt_color_change(); text_attributes& rt_curr_attributes(); - + cinfo caret_info; int debug; @@ -265,15 +270,16 @@ namespace agg path_attributes* m_cattr; double m_text_pos_x; double m_text_pos_y; - char* m_text; + REBCHR* m_text; + REBCNT m_text_gc; font* m_font; para* m_para; tmp_val m_tmp_val; - REBPAR* m_caret; + REBXYF* m_caret; hinfo* m_hinfo; REBPAR m_hstart; REBPAR m_hend; - + unsigned m_color_changed; pixfmt_type m_pf; diff --git a/src/agg/graphics.cpp b/src/agg/graphics.cpp index b81d53a..896c48d 100644 --- a/src/agg/graphics.cpp +++ b/src/agg/graphics.cpp @@ -1,135 +1,78 @@ //exported functions #include "agg_graphics.h" -//include "words-draw.h" // Auto-generated by gen-draw-words.r #undef IS_ERROR -//include "agg_truetype_text.h" - -//extern "C" void Reb_Print(REBYTE *fmt, ...);//output just for testing -//extern "C" void* Rich_Text; -//extern "C" REBINT Text_Gob(void *graphics, REBSER *gob); +//extern "C" void Reb_Print(char *fmt, ...);//output just for testing +extern "C" void* Rich_Text; extern "C" REBINT Draw_Gob(void *graphics, REBSER *block, REBSER *args); namespace agg { - extern "C" void agg_box(void* gr, REBXYF p1, REBXYF p2, REBDEC r) - { - if (r) { - ((agg_graphics*)gr)->agg_rounded_rect(p1.x, p1.y, p2.x, p2.y, r); - } else { - ((agg_graphics*)gr)->agg_box(p1.x, p1.y, p2.x, p2.y); - } - } - - extern "C" void agg_circle(void* gr, REBXYF p, REBXYF r) - { - ((agg_graphics*)gr)->agg_ellipse(p.x, p.y, r.x, r.y); - } - - extern "C" void agg_begin_poly (void* gr, REBXYF p) - { - ((agg_graphics*)gr)->agg_begin_poly(p.x, p.y); - } + extern "C" RL_LIB *RL; extern "C" void agg_add_vertex (void* gr, REBXYF p) { ((agg_graphics*)gr)->agg_add_vertex(p.x, p.y); } - extern "C" void agg_pen(void* gr, REBYTE* col, REBSER* img) - { -// if (img){ -// ((agg_graphics*)gr)->agg_pen(0, 0, 0, 255, IMG_DATA(img), IMG_WIDE(img), IMG_HIGH(img)); -// return; -// } - - if (col) - ((agg_graphics*)gr)->agg_pen(col[0], col[1], col[2], 255 - col[3]); - else - ((agg_graphics*)gr)->agg_pen(0,0,0,0); - - } - - extern "C" void agg_fill_pen(void* gr, REBYTE* col) + extern "C" void agg_anti_alias(void* gr, REBINT mode) { - if (col) - ((agg_graphics*)gr)->agg_fill_pen(col[0], col[1], col[2], 255 - col[3]); - else - ((agg_graphics*)gr)->agg_fill_pen(0, 0, 0, 0); - + ((agg_graphics*)gr)->agg_anti_alias(mode!=0); } - -#ifdef ndef - extern "C" REBINT Draw_Image(REBSER *image, REBSER *block) + extern "C" void agg_arc(void* gr, REBXYF c, REBXYF r, REBDEC ang1, REBDEC ang2, REBINT closed) { - int w = IMG_WIDE(image); - int h = IMG_HIGH(image); - - agg_graphics::ren_buf renbuf(IMG_DATA(image), w, h, w * 4); - agg_graphics::pixfmt pixf(renbuf); - agg_graphics::ren_base rb_win(pixf); - - agg_graphics* graphics = new agg_graphics(&renbuf, w, h, 0, 0); - - REBSER *args = 0; - - REBINT result = Draw_Gob(graphics, block, args); - - if (result < 0) goto do_cleanup; - - result = graphics->agg_render(rb_win); - - do_cleanup: - delete graphics; - - return result; + ((agg_graphics*)gr)->agg_arc(c.x, c.y, r.x, r.y, ang1, ang2, closed); } - extern "C" void agg_get_size(void* gr, REBPAR* p) + extern "C" void agg_arrow(void* gr, REBXYF mode, REBYTE* col) { - ((agg_graphics*)gr)->agg_size(p); + ((agg_graphics*)gr)->agg_arrows(col, (REBINT)mode.x, (REBINT)mode.y); } - extern "C" void agg_anti_alias(void* gr, REBINT mode) + extern "C" void agg_begin_poly (void* gr, REBXYF p) { - ((agg_graphics*)gr)->agg_anti_alias(mode!=0); + ((agg_graphics*)gr)->agg_begin_poly(p.x, p.y); } - extern "C" void agg_arc(void* gr, REBPAR* c, REBPAR* r, REBDEC ang1, REBDEC ang2, REBINT closed) + extern "C" void agg_box(void* gr, REBXYF p1, REBXYF p2, REBDEC r) { - ((agg_graphics*)gr)->agg_arc(c->x, c->y, r->x, r->y, ang1, ang2, closed); + if (r) { + ((agg_graphics*)gr)->agg_rounded_rect(p1.x, p1.y, p2.x, p2.y, r); + } else { + ((agg_graphics*)gr)->agg_box(p1.x, p1.y, p2.x, p2.y); + } } - extern "C" void agg_arrow(void* gr, REBYTE* c, REBPAR* ht) + extern "C" void agg_circle(void* gr, REBXYF p, REBXYF r) { - ((agg_graphics*)gr)->agg_arrows(c, ht->x, ht->y); + ((agg_graphics*)gr)->agg_ellipse(p.x, p.y, r.x, r.y); } - extern "C" void agg_clip(void* gr, REBPAR* p1, REBPAR* p2) + extern "C" void agg_clip(void* gr, REBXYF p1, REBXYF p2) { - ((agg_graphics*)gr)->agg_set_clip(p1->x, p1->y, p2->x, p2->y); + ((agg_graphics*)gr)->agg_set_clip(p1.x, p1.y, p2.x, p2.y); } - extern "C" void agg_curve3(void* gr, REBPAR* p1, REBPAR* p2, REBPAR* p3, REBPAR* p4) + extern "C" void agg_curve3(void* gr, REBXYF p1, REBXYF p2, REBXYF p3) { - ((agg_graphics*)gr)->agg_curve3(p1->x, p1->y, p2->x, p2->y, p3->x, p3->y); + ((agg_graphics*)gr)->agg_curve3(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y); } - extern "C" void agg_curve4(void* gr, REBPAR* p1, REBPAR* p2, REBPAR* p3, REBPAR* p4) + extern "C" void agg_curve4(void* gr, REBXYF p1, REBXYF p2, REBXYF p3, REBXYF p4) { - ((agg_graphics*)gr)->agg_curve4(p1->x, p1->y, p2->x, p2->y, p3->x, p3->y, p4->x, p4->y); + ((agg_graphics*)gr)->agg_curve4(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y); } - extern "C" void agg_ellipse(void* gr, REBPAR* p1, REBPAR* p2) + extern "C" void agg_ellipse(void* gr, REBXYF p1, REBXYF p2) { - REBINT rx = p2->x/2; - REBINT ry = p2->y/2; - ((agg_graphics*)gr)->agg_ellipse(p1->x+rx, p1->y+ry, rx, ry); + REBDEC rx = p2.x / 2; + REBDEC ry = p2.y / 2; + ((agg_graphics*)gr)->agg_ellipse(p1.x + rx, p1.y + ry, rx, ry); } - extern "C" void agg_effect(void* gr, REBPAR* p1, REBPAR* p2, REBSER* block) + extern "C" void agg_end_poly (void* gr) { - ((agg_graphics*)gr)->agg_effect(p1, p2, block); + ((agg_graphics*)gr)->agg_end_poly(); } extern "C" void agg_end_spline (void* gr, REBINT step, REBINT closed) @@ -137,19 +80,24 @@ namespace agg ((agg_graphics*)gr)->agg_end_bspline(step, closed); } - extern "C" void agg_end_poly (void* gr) + extern "C" void agg_fill_pen(void* gr, REBYTE* col) { - ((agg_graphics*)gr)->agg_end_poly(); + if (col) + ((agg_graphics*)gr)->agg_fill_pen(col[0], col[1], col[2], 255 - col[3]); + else + ((agg_graphics*)gr)->agg_fill_pen(0, 0, 0, 0); + } - extern "C" void agg_fill_image_pen(void* gr, REBSER* img) + extern "C" void agg_fill_pen_image(void* gr, REBYTE* img, REBINT w, REBINT h) { - ((agg_graphics*)gr)->agg_fill_pen(0, 0, 0, 255, IMG_DATA(img), IMG_WIDE(img), IMG_HIGH(img)); + ((agg_graphics*)gr)->agg_fill_pen(0, 0, 0, 255, img, w, h); } extern "C" void agg_fill_rule(void* gr, REBINT mode) { - ((agg_graphics*)gr)->agg_fill_rule((agg::filling_rule_e)mode); + if (mode >= W_DRAW_EVEN_ODD && mode <= W_DRAW_NON_ZERO) + ((agg_graphics*)gr)->agg_fill_rule((agg::filling_rule_e)mode); } extern "C" void agg_gamma(void* gr, REBDEC gamma) @@ -157,8 +105,39 @@ namespace agg ((agg_graphics*)gr)->agg_set_gamma(gamma); } - extern "C" void agg_gradient_pen(void* gr, REBINT gradtype, REBPAR* oft, REBDEC begin, REBDEC end, REBDEC ang, REBDEC scX,REBDEC scY, unsigned char *colors, REBDEC* offsets, REBINT mode){ - ((agg_graphics*)gr)->agg_gradient_pen(gradtype, oft->x, oft->y, begin, end, ang, scX, scY, colors, offsets, mode); + extern "C" void agg_gradient_pen(void* gr, REBINT gradtype, REBINT mode, REBXYF oft, REBXYF range, REBDEC angle, REBXYF scale, REBSER* colors){ + + unsigned char colorTuples[256*4+1] = {2, 0,0,0,0, 0,0,0,0, 255,255,255,0}; //max number of color tuples is 256 + one length information char + REBDEC offsets[256] = {0.0 , 0.0, 1.0}; + + //gradient fill + RXIARG val; + REBCNT type,i,j,k; + REBDEC* matrix = new REBDEC[6]; + + for (i = 0, j = 1, k = 5; type = RL_GET_VALUE(colors, i, &val); i++) { + if (type == RXT_DECIMAL || type == RXT_INTEGER) { + offsets[j] = (type == RXT_DECIMAL) ? val.dec64 : val.int64; + + //do some validation + offsets[j] = MIN(MAX(offsets[j], 0.0), 1.0); + if (j != 1 && offsets[j] < offsets[j-1]) + offsets[j] = offsets[j-1]; + if (j != 1 && offsets[j] == offsets[j-1]) + offsets[j-1]-= 0.0000000001; + + j++; + } else if (type == RXT_TUPLE) { + memcpy(&colorTuples[k], val.bytes + 1, 4); + k+=4; + } + } + + //sanity checks + if (j == 1) offsets[0] = -1; + colorTuples[0] = MAX(2, (k - 5) / 4); + + ((agg_graphics*)gr)->agg_gradient_pen(gradtype, oft.x, oft.y, range.x, range.y, angle, scale.x, scale.y, colorTuples, offsets, mode); } extern "C" void agg_invert_matrix(void* gr) @@ -166,45 +145,71 @@ namespace agg ((agg_graphics*)gr)->agg_invert_mtx(); } - extern "C" void agg_image(void* gr, REBSER* img, REBPAR* offset, REBYTE* key, REBINT border, REBINT pattern) + extern "C" void agg_image(void* gr, REBYTE* img, REBINT w, REBINT h,REBXYF offset) { - ((agg_graphics*)gr)->agg_image(IMG_DATA(img), offset->x, offset->y, IMG_WIDE(img), IMG_HIGH(img), border, key[0], key[1], key[2], 255 - key[3]); + ((agg_graphics*)gr)->agg_image(img, offset.x, offset.y, w, h); } - extern "C" void agg_image_perspective(void* gr, REBSER* img, REBPAR* p1, REBYTE* key, REBINT border, REBINT pattern, REBINT ox, REBINT oy, REBINT pw, REBINT ph , REBPAR* p2,REBPAR* p3,REBPAR* p4, REBCNT args) + extern "C" void agg_image_filter(void* gr, REBINT type, REBINT mode, REBDEC blur) { - ((agg_graphics*)gr)->agg_begin_poly(p1->x, p1->y); - switch (args){ - case 10: //scaled - ((agg_graphics*)gr)->agg_add_vertex(p2->x, p1->y); - ((agg_graphics*)gr)->agg_add_vertex(p2->x, p2->y); - ((agg_graphics*)gr)->agg_add_vertex(p1->x, p2->y); - break; - case 11: - ((agg_graphics*)gr)->agg_add_vertex(p2->x, p2->y); - ((agg_graphics*)gr)->agg_add_vertex(p3->x, p3->y); - ((agg_graphics*)gr)->agg_add_vertex(p1->x, p3->y); - break; - case 12: //perspective - ((agg_graphics*)gr)->agg_add_vertex(p2->x, p2->y); - ((agg_graphics*)gr)->agg_add_vertex(p3->x, p3->y); - ((agg_graphics*)gr)->agg_add_vertex(p4->x, p4->y); - break; - - } - ((agg_graphics*)gr)->agg_end_poly_img(IMG_DATA(img), IMG_WIDE(img), IMG_HIGH(img), pw, ph, ox, oy, border, pattern, key[0], key[1], key[2],255 - key[3]); + ((agg_graphics*)gr)->agg_image_filter(type, mode, blur); + } + extern "C" void agg_image_options(void* gr, REBYTE* keyCol, REBINT border) + { + if (keyCol) + ((agg_graphics*)gr)->agg_image_options(keyCol[0], keyCol[1], keyCol[2], 255 - keyCol[3], border); + else + ((agg_graphics*)gr)->agg_image_options(0,0,0,0, border); } + extern "C" void agg_image_pattern(void* gr, REBINT mode, REBXYF offset, REBXYF size){ + if (mode) + ((agg_graphics*)gr)->agg_image_pattern(mode,offset.x,offset.y,size.x,size.y); + else + ((agg_graphics*)gr)->agg_image_pattern(0,0,0,0,0); + } - extern "C" void agg_image_filter(void* gr, REBINT type, REBINT mode, REBDEC blur) + extern "C" void agg_image_scale(void* gr, REBYTE* img, REBINT w, REBINT h, REBSER* points) { - ((agg_graphics*)gr)->agg_image_filter(type, mode, blur); + RXIARG p[4]; + REBCNT type; + REBCNT n, len = 0; + + for (n = 0; type = RL_GET_VALUE(points, n, &p[len]); n++) { + if (type == RXT_PAIR) + if (++len == 4) break; + } + + if (!len) return; + if (len == 1) ((agg_graphics*)gr)->agg_image(img, p[0].pair.x, p[0].pair.y, w, h); + + ((agg_graphics*)gr)->agg_begin_poly(p[0].pair.x, p[0].pair.y); + + switch (len) { + case 2: + ((agg_graphics*)gr)->agg_add_vertex(p[1].pair.x, p[0].pair.y); + ((agg_graphics*)gr)->agg_add_vertex(p[1].pair.x, p[1].pair.y); + ((agg_graphics*)gr)->agg_add_vertex(p[0].pair.x, p[1].pair.y); + break; + case 3: + ((agg_graphics*)gr)->agg_add_vertex(p[1].pair.x, p[1].pair.y); + ((agg_graphics*)gr)->agg_add_vertex(p[2].pair.x, p[2].pair.y); + ((agg_graphics*)gr)->agg_add_vertex(p[0].pair.x, p[2].pair.y); + break; + case 4: + ((agg_graphics*)gr)->agg_add_vertex(p[1].pair.x, p[1].pair.y); + ((agg_graphics*)gr)->agg_add_vertex(p[2].pair.x, p[2].pair.y); + ((agg_graphics*)gr)->agg_add_vertex(p[3].pair.x, p[3].pair.y); + break; + } + + ((agg_graphics*)gr)->agg_end_poly_img(img, w, h); } - extern "C" void agg_line(void* gr, REBPAR* p1, REBPAR* p2) + extern "C" void agg_line(void* gr, REBXYF p1, REBXYF p2) { - ((agg_graphics*)gr)->agg_line(p1->x, p1->y, p2->x, p2->y); + ((agg_graphics*)gr)->agg_line(p1.x, p1.y, p2.x, p2.y); } extern "C" void agg_line_cap(void* gr, REBINT mode) @@ -220,7 +225,7 @@ namespace agg extern "C" void agg_line_pattern(void* gr, REBYTE* col, REBDEC* patterns) { - ((agg_graphics*)gr)->agg_line_pattern(col, patterns); + ((agg_graphics*)gr)->agg_line_pattern(col, patterns); } extern "C" void agg_line_width(void* gr, REBDEC width, REBINT mode) @@ -230,33 +235,41 @@ namespace agg extern "C" void agg_matrix(void* gr, REBSER* mtx) { - REBVAL *slot = BLK_HEAD(mtx); - REBCNT len = SERIES_TAIL(mtx) ,i, num = 0; - - REBDEC* matrix = new REBDEC[6]; - for (i = 0;iagg_set_mtx(matrix); + if (n != 6) return; - delete[] matrix; - } + ((agg_graphics*)gr)->agg_set_mtx(matrix); + delete[] matrix; + } - extern "C" void agg_polygon(void* gr, REBPAR* p1, REBPAR* p2, REBPAR* p3) + extern "C" void agg_pen(void* gr, REBYTE* col) { + if (col) + ((agg_graphics*)gr)->agg_pen(col[0], col[1], col[2], 255 - col[3]); + else + ((agg_graphics*)gr)->agg_pen(0,0,0,0); } + extern "C" void agg_pen_image(void* gr, REBYTE* img, REBINT w, REBINT h) + { + ((agg_graphics*)gr)->agg_pen(0, 0, 0, 255, img, w, h); + } + extern "C" void agg_pop_matrix(void* gr) { ((agg_graphics*)gr)->agg_pop_mtx(); @@ -282,46 +295,41 @@ namespace agg ((agg_graphics*)gr)->agg_rotate(ang); } - extern "C" void agg_scale(void* gr, REBDEC scx, REBDEC scy) + extern "C" void agg_scale(void* gr, REBXYF sc) { - ((agg_graphics*)gr)->agg_scale(scx,scy); + ((agg_graphics*)gr)->agg_scale(sc.x, sc.y); } - extern "C" void agg_skew(void* gr, REBDEC sx, REBDEC sy) + extern "C" void agg_skew(void* gr, REBXYF angle) { - ((agg_graphics*)gr)->agg_skew(sx, sy); + ((agg_graphics*)gr)->agg_skew(angle.x, angle.y); } - extern "C" void agg_spline(void* gr, REBINT seg, REBINT closed, REBPAR* p1, REBPAR* p2) + extern "C" REBINT agg_text(void* gr, REBINT mode, REBXYF p1, REBXYF p2, REBSER* block) { - + return ((agg_graphics*)gr)->agg_text(mode, &p1, &p2, block); } - extern "C" REBINT agg_text(void* gr, REBINT mode, REBPAR* p1, REBPAR* p2, REBSER* block) + extern "C" void agg_transform(void* gr, REBDEC ang, REBXYF ctr, REBXYF sc, REBXYF oft) { - return ((agg_graphics*)gr)->agg_text(mode, p1, p2, block); + ((agg_graphics*)gr)->agg_transform(ang, ctr.x, ctr.y, sc.x, sc.y, oft.x, oft.y); } - extern "C" void agg_transform(void* gr, REBDEC ang, REBPAR* ctr, REBDEC scx, REBDEC scy, REBPAR* oft) + extern "C" void agg_translate(void* gr, REBXYF p) { - ((agg_graphics*)gr)->agg_transform(ang, ctr->x, ctr->y, scx,scy, oft->x, oft->y); + ((agg_graphics*)gr)->agg_translate(p.x, p.y); } - extern "C" void agg_translate(void* gr, REBPAR* p) - { - ((agg_graphics*)gr)->agg_translate(p->x, p->y); - } - - extern "C" void agg_triangle(void* gr, REBPAR* p1, REBPAR* p2, REBPAR* p3, REBYTE* c1, REBYTE* c2, REBYTE* c3, REBDEC dilation) + extern "C" void agg_triangle(void* gr, REBXYF p1, REBXYF p2, REBXYF p3, REBYTE* c1, REBYTE* c2, REBYTE* c3, REBDEC dilation) { ((agg_graphics*)gr)->agg_gtriangle(p1, p2, p3, c1, c2, c3, dilation); } //SHAPE functions - extern "C" void agg_path_open(void* gr) + extern "C" void agg_path_arc(void* gr, REBINT rel, REBXYF p, REBXYF r, REBDEC ang, REBINT sweep, REBINT large) { - ((agg_graphics*)gr)->agg_begin_path(); + ((agg_graphics*)gr)->agg_path_arc(rel, r.x, r.y, ang, large, sweep, p.x, p.y); } extern "C" void agg_path_close(void* gr) @@ -329,51 +337,86 @@ namespace agg ((agg_graphics*)gr)->agg_path_close(); } - - extern "C" void agg_path_arc(void* gr, REBINT rel, REBPAR* p, REBDEC rx, REBDEC ry, REBDEC ang, REBINT sweep, REBINT large) + extern "C" void agg_path_curv(void* gr, REBINT rel, REBXYF p1, REBXYF p2) { - ((agg_graphics*)gr)->agg_path_arc(rel, rx, ry, ang, large, sweep, p->x, p->y); + ((agg_graphics*)gr)->agg_path_cubic_curve_to(rel, p1.x, p1.y, p2.x, p2.y); } - extern "C" void agg_path_curv(void* gr, REBINT rel, REBPAR* p1, REBPAR* p2) + extern "C" void agg_path_curve(void* gr, REBINT rel, REBXYF p1,REBXYF p2, REBXYF p3) { - ((agg_graphics*)gr)->agg_path_cubic_curve_to(rel, p1->x, p1->y, p2->x, p2->y); + ((agg_graphics*)gr)->agg_path_cubic_curve(rel, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y); } - extern "C" void agg_path_curve(void* gr, REBINT rel, REBPAR* p1, REBPAR* p2, REBPAR* p3) + extern "C" void agg_path_hline(void* gr, REBCNT rel, REBDEC x) { - ((agg_graphics*)gr)->agg_path_cubic_curve(rel, p1->x, p1->y, p2->x, p2->y, p3->x, p3->y); + ((agg_graphics*)gr)->agg_path_hline(rel, x); } - extern "C" void agg_path_hline(void* gr, REBCNT rel, REBDEC x) + extern "C" void agg_path_line(void* gr, REBCNT rel, REBXYF p) { - ((agg_graphics*)gr)->agg_path_hline(rel, x); + ((agg_graphics*)gr)->agg_path_line(rel, p.x, p.y); } - - extern "C" void agg_path_line(void* gr, REBCNT rel, REBPAR* p) + extern "C" void agg_path_move(void* gr, REBCNT rel, REBXYF p) { - ((agg_graphics*)gr)->agg_path_line(rel, p->x, p->y); + ((agg_graphics*)gr)->agg_path_move(rel, p.x, p.y); } - extern "C" void agg_path_move(void* gr, REBCNT rel, REBPAR* p) + extern "C" void agg_path_open(void* gr) { - ((agg_graphics*)gr)->agg_path_move(rel, p->x, p->y); + ((agg_graphics*)gr)->agg_begin_path(); } extern "C" void agg_path_vline(void* gr, REBCNT rel, REBDEC y) { - ((agg_graphics*)gr)->agg_path_vline(rel, y); + ((agg_graphics*)gr)->agg_path_vline(rel, y); } - extern "C" void agg_path_qcurv(void* gr, REBINT rel, REBPAR* p) + extern "C" void agg_path_qcurv(void* gr, REBINT rel, REBXYF p) { - ((agg_graphics*)gr)->agg_path_quadratic_curve_to(rel, p->x, p->y); + ((agg_graphics*)gr)->agg_path_quadratic_curve_to(rel, p.x, p.y); } - extern "C" void agg_path_qcurve(void* gr, REBINT rel, REBPAR* p1, REBPAR* p2) + extern "C" void agg_path_qcurve(void* gr, REBINT rel, REBXYF p1, REBXYF p2) { - ((agg_graphics*)gr)->agg_path_quadratic_curve(rel, p1->x, p1->y, p2->x, p2->y); + ((agg_graphics*)gr)->agg_path_quadratic_curve(rel, p1.x, p1.y, p2.x, p2.y); } + + + extern "C" REBINT Draw_Image(REBYTE *image, REBINT w, REBINT h, REBSER *block) + { + agg_graphics::ren_buf renbuf(image, w, h, w * 4); + agg_graphics::pixfmt pixf(renbuf); + agg_graphics::ren_base rb_win(pixf); + + agg_graphics* graphics = new agg_graphics(&renbuf, w, h, 0, 0); + + REBSER *args = 0; + + REBINT result = Draw_Gob(graphics, block, args); + + if (result < 0) goto do_cleanup; + + result = graphics->agg_render(rb_win); + + do_cleanup: + delete graphics; + + return result; + } + +#ifdef ndef + + extern "C" void agg_get_size(void* gr, REBPAR* p) + { + ((agg_graphics*)gr)->agg_size(p); + } + + extern "C" void agg_effect(void* gr, REBPAR* p1, REBPAR* p2, REBSER* block) + { + ((agg_graphics*)gr)->agg_effect(p1, p2, block); + } + + #endif } diff --git a/src/agg/rich_text.cpp b/src/agg/rich_text.cpp new file mode 100644 index 0000000..0e9d332 --- /dev/null +++ b/src/agg/rich_text.cpp @@ -0,0 +1,259 @@ +#include "agg_compo.h" +#include "agg_truetype_text.h" + + +extern "C" void Reb_Print(char *fmt, ...);//output just for testing +extern "C" void *RL_Series(REBSER *ser, REBINT what); + +namespace agg +{ + extern "C" void* Create_RichText() + { + return (void*)new rich_text(GetDC( NULL )); + } + + extern "C" void Destroy_RichText(void* rt) + { + delete (rich_text*)rt; + } + + extern "C" void rt_anti_alias(void* rt, REBINT mode) + { + ((rich_text*)rt)->rt_text_mode(mode); + } + + extern "C" void rt_bold(void* rt, REBINT state) + { + font* font = ((rich_text*)rt)->rt_get_font(); + font->bold = state; + ((rich_text*)rt)->rt_push(); + } + + extern "C" void rt_caret(void* rt, REBXYF* caret, REBXYF* highlightStart, REBXYF highlightEnd) + { + if (highlightStart) ((rich_text*)rt)->rt_set_hinfo(*highlightStart,highlightEnd); + if (caret) ((rich_text*)rt)->rt_set_caret(*caret); + } + + extern "C" void rt_center(void* rt) + { + para* par = ((rich_text*)rt)->rt_get_para(); + par->align = W_TEXT_CENTER; + ((rich_text*)rt)->rt_set_para(par); + ((rich_text*)rt)->rt_push(); + } + + extern "C" void rt_color(void* rt, REBYTE* color) + { + font* font = ((rich_text*)rt)->rt_get_font(); + font->color[0] = color[0]; + font->color[1] = color[1]; + font->color[2] = color[2]; + font->color[3] = color[3]; + ((rich_text*)rt)->rt_push(); + ((rich_text*)rt)->rt_color_change(); + } + + extern "C" void rt_drop(void* rt, REBINT number) + { + ((rich_text*)rt)->rt_drop(number); + } + + extern "C" void rt_font(void* rt, font* font) + { + ((rich_text*)rt)->rt_set_font(font); + ((rich_text*)rt)->rt_push(); + } + + extern "C" void rt_font_size(void* rt, REBINT size) + { + font* font = ((rich_text*)rt)->rt_get_font(); + font->size = size; + ((rich_text*)rt)->rt_push(); + } + + extern "C" void* rt_get_font(void* rt) + { + return (void*)((rich_text*)rt)->rt_get_font(); + } + + + extern "C" void* rt_get_para(void* rt) + { + return (void*)((rich_text*)rt)->rt_get_para(); + } + + extern "C" void rt_italic(void* rt, REBINT state) + { + font* font = ((rich_text*)rt)->rt_get_font(); + font->italic = state; + ((rich_text*)rt)->rt_push(); + } + + extern "C" void rt_left(void* rt) + { + para* par = ((rich_text*)rt)->rt_get_para(); + par->align = W_TEXT_LEFT; + ((rich_text*)rt)->rt_set_para(par); + ((rich_text*)rt)->rt_push(); + } + + extern "C" void rt_newline(void* rt, REBINT index) + { + ((rich_text*)rt)->rt_set_text((REBCHR*)"\n", TRUE); + ((rich_text*)rt)->rt_push(index); + } + + extern "C" void rt_para(void* rt, para* para) + { + ((rich_text*)rt)->rt_set_para(para); + ((rich_text*)rt)->rt_push(); + } + + extern "C" void rt_right(void* rt) + { + para* par = ((rich_text*)rt)->rt_get_para(); + par->align = W_TEXT_RIGHT; + ((rich_text*)rt)->rt_set_para(par); + ((rich_text*)rt)->rt_push(); + } + + extern "C" void rt_scroll(void* rt, REBXYF offset) + { + para* par = ((rich_text*)rt)->rt_get_para(); + par->scroll_x = offset.x; + par->scroll_y = offset.y; + ((rich_text*)rt)->rt_set_para(par); + ((rich_text*)rt)->rt_push(); + } + + extern "C" void rt_shadow(void* rt, REBXYF d, REBYTE* color, REBINT blur) + { + font* font = ((rich_text*)rt)->rt_get_font(); + + font->shadow_x = d.x; + font->shadow_y = d.y; + font->shadow_blur = blur; + + memcpy(font->shadow_color, color, 4); + + ((rich_text*)rt)->rt_push(); + } + + extern "C" void rt_set_font_styles(font* font, u32 word){ + switch (word){ + case W_TEXT_BOLD: + font->bold = TRUE; + break; + case W_TEXT_ITALIC: + font->italic = TRUE; + break; + case W_TEXT_UNDERLINE: + font->underline = TRUE; + break; + } + } + + extern "C" void rt_size_text(void* rt, REBGOB* gob, REBXYF* size) + { + REBINT result = 0; + ((rich_text*)rt)->rt_reset(); + ((rich_text*)rt)->rt_set_clip(0,0, GOB_W(gob),GOB_H(gob)); + if (GOB_TYPE(gob) == GOBT_TEXT){ + result = Text_Gob(rt, (REBSER *)GOB_CONTENT(gob)); + } else if (GOB_TYPE(gob) == GOBT_STRING) { + ((rich_text*)rt)->rt_set_text((REBCHR*)GOB_STRING(gob), TRUE); + ((rich_text*)rt)->rt_push(1); + } else { + size->x = 0; + size->y = 0; + return; + } + + if (result < 0) return; + + ((rich_text*)rt)->rt_size_text(size); + } + + extern "C" void rt_text(void* rt, REBCHR* text, REBINT index, REBCNT gc) + { + ((rich_text*)rt)->rt_set_text((REBCHR*)text, gc); + ((rich_text*)rt)->rt_push(index); + } + + extern "C" void rt_underline(void* rt, REBINT state) + { + font* font = ((rich_text*)rt)->rt_get_font(); + font->underline = state; + ((rich_text*)rt)->rt_push(); + } + + + + + + + + + + + + + + + + + + + extern "C" REBINT rt_offset_to_caret(void* rt, REBGOB *gob, REBXYF xy, REBINT *element, REBINT *position) + { + REBINT result = 0; + ((rich_text*)rt)->rt_reset(); + ((rich_text*)rt)->rt_set_clip(0,0, GOB_W(gob),GOB_H(gob)); + if (GOB_TYPE(gob) == GOBT_TEXT){ + result = Text_Gob(rt, (REBSER *)GOB_CONTENT(gob)); + } else if (GOB_TYPE(gob) == GOBT_STRING) { + ((rich_text*)rt)->rt_set_text((REBCHR*)GOB_STRING(gob), TRUE); + ((rich_text*)rt)->rt_push(1); + } else { + *element = 0; + *position = 0; + return result; + } + + if (result < 0) return result; + + ((rich_text*)rt)->rt_offset_to_caret(xy, element, position); + + return result; + } + + extern "C" REBINT rt_caret_to_offset(void* rt, REBGOB *gob, REBXYF* xy, REBINT element, REBINT position) + { + REBINT result = 0; + ((rich_text*)rt)->rt_reset(); + ((rich_text*)rt)->rt_set_clip(0,0, GOB_W(gob),GOB_H(gob)); + if (GOB_TYPE(gob) == GOBT_TEXT){ + result = Text_Gob(rt, (REBSER *)GOB_CONTENT(gob)); + } else if (GOB_TYPE(gob) == GOBT_STRING) { + ((rich_text*)rt)->rt_set_text((REBCHR*)GOB_STRING(gob), TRUE); + ((rich_text*)rt)->rt_push(1); + } else { + xy->x = 0; + xy->y = 0; + return result; + } + + if (result < 0) return result; + + ((rich_text*)rt)->rt_caret_to_offset(xy, element, position); + + return result; + } + + + + + +} + diff --git a/src/boot/draw.r b/src/boot/draw.r index ac199f6..bfad001 100644 --- a/src/boot/draw.r +++ b/src/boot/draw.r @@ -1,43 +1,290 @@ REBOL [ - Title: "REBOL Draw Graphics" + Title: "REBOL Graphics - DRAW commands" Name: draw Type: extension Exports: none ; Run make-host-ext.r to convert ] +;don't change order of already defined words unless you know what you are doing + words: [ - radial + ;fill-rule + even-odd + non-zero + + ;grad-pen conic + cubic + diagonal diamond linear - diagonal - cubic + radial + normal + repeat + reflect + + ;line-cap + butt + square + rounded + + ;line-join + miter + miter-bevel + round + bevel + + ;line-width + variable + fixed + + ;arc + opened + closed + + ;image + no-border + border + + ;image-filter + nearest + bilinear + bicubic + gaussian + resize + resample + + ;text + raster + vectorial +] + +;temp hack - will be removed later +init-words: command [ + words [block!] +] + +init-words words + +;please alphabetize the order of commands so it easier to lookup things + +anti-alias: command [ + "Turns anti-aliasing on or off." + state [logic!] +] + +arc: command [ + "Draws a partial section of an ellipse or circle." + center [pair!] "The center of the circle" + radius [pair!] "The radius of the circle" + angle-begin [number!] "The angle where the arc begins, in degrees" + angle-length [number!] "The length of the arc in degrees" + 'arc-ending [word!] "Leave the arc: OPENED or CLOSED" +] + +arrow: command [ + "Sets the arrow mode." + mode [pair!] "Possible numbers for combination. 0 for none, 1 for head, 2 for tail" + color [tuple! none!] "Color of the head/tail of the arrow. NONE means use PEN color" ] box: command [ - "Draw a rectangular box." + "Draws a rectangular box." + origin [pair!] "Corner of box" + end [pair!] "End of box" + corner-radius [number!] "Rounds corners" +] + +circle: command [ + "Draws a circle or ellipse." + center [pair!] + radius [pair!] +] + +curve: command [ + "Draws a smooth Bézier curve.(using 3 or 4 points)" + point-1 [pair!] "End point A" + point-2 [pair!] "Control point A" + point-3 [pair!] "End point B, or control point B" + point-4 [pair! none!] "End point B" +] + +clip: command [ + "Specifies a clipping region." origin [pair!] "Corner of box" - size [pair!] "Size of box" + end [pair!] "End of box" +] + +ellipse: command [ + "Draws an ellipse." + origin [pair!] "The upper-left-point of the ellipse bounding box" + diameter [pair!] +] + +fill-pen: command [ + "Sets the area fill pen color." + color [tuple! image! logic!] "Set to OFF to disable fill pen" +] + +fill-rule: command [ + "Determines the algorithm used to determine what area to fill." + 'mode [word!] "Rule type: EVEN-ODD or NON-ZERO" +] + +gamma: command [ + "Sets the gamma correction value." + gamma-value [number!] +] + +grad-pen: command [ + "Sets the color gradient for area filling. To disable it set the color block to NONE." + 'type [word!] "The gradient type: RADIAL CONIC DIAMOND LINEAR DIAGONAL CUBIC" + 'mode [word!] "The gradient rendering mode: NORMAL REPEAT REFLECT" + offset [pair!] "offset from where should the gradient be rendered" + range [pair!] "begin and end of the gradient range" + angle [number!] "rotation of the gradient in degrees" + scale [pair!] "X and Y scale factor" + colors [block! none!] "block containing up to 256 gradient colors (optionally with color offsets)" +] + +image: command [ + "Draws an image, with optional scaling, borders, and color keying." + image [image!] + offset-points [pair! block!] ] -lines: command [ - "Draw lines from a number of points." +image-filter: command [ + "Specifies type of algorithm used when an image is scaled." + 'filter-type [word!] "supported filters: NEAREST, BILINEAR, BICUBIC, GAUSSIAN" + 'filter-mode [word!] "Output quality: RESIZE(low, faster) or RESAMPLE(high, slower)" + blur [number! none!] "Used only in RESAMPLE mode" +] + +image-options: command [ + "Sets options related to image rendering." + key-color [tuple! none!] "Color to be rendered as transparent or NONE to disable it" + 'border-flag [word!] "can be BORDER or NO-BORDER" +] + +image-pattern: command [ + "Configure the image pattern fill settings." + 'pattern-mode [word!] "can be NORMAL, REPEAT or REFLECT" + pattern-offset [pair!] + pattern-size [pair!] "set to 0x0 for auto-size" + +] + +line: command [ + "Draws (poly)line from a number of points." lines [block!] "Block of pairs" ] -circle: command [ - "Draw a circle or ellipse." - origin [pair!] - radius [pair!] +line-cap: command [ + "Sets the style that will be used when drawing the ends of lines." + 'type [word!] "Cap type: BUTT, SQUARE or ROUNDED" +] + +line-join: command [ + "Sets the style that will be used where lines are joined." + 'type [word!] "Join type: MITER, MITER-BEVEL, ROUND, or BEVEL" +] + +line-pattern: command [ + "Sets the line pattern. To disable it set the pattern block to NONE." + color [tuple!] "Dash color" + pattern [block! none!] "Block of dash-size/stroke-size number pairs" +] + +line-width: command [ + "Sets the line width." + width [number!] "Zero, or negative values, produce a line-width of 1." + 'mode [word!] "Line width mode during scaling: FIXED or VARIABLE" +] + +invert-matrix: command [ + "Applies an algebraic matrix inversion operation on the current transformation matrix." +] + +matrix: command [ + "Premultiplies the current transformation matrix with the given block." + matrix-setup [block!] "content must be 6 numbers" ] pen: command [ - "Set the line pen color." - color [tuple!] + "Sets the line pen color." + color [tuple! image! logic!] "Set to OFF to disable pen" ] -fill-pen: command [ - "Set the area fill pen color." - color [tuple!] +polygon: command [ + "Draws a closed area of line segments. First and last points are connected." + vertices [block!] "Block of pairs" +] + +push: command [ + "Stores the current attribute setup in stack." + draw-block [block!] +] + +reset-matrix: command [ + "Resets the current transformation matrix to its default values." +] + +rotate: command [ + "Sets the clockwise rotation in current transformation matrix." + angle [number!] "in degrees" +] + +scale: command [ + "Sets the scaling factor in current transformation matrix." + factor [pair!] +] + +shape: command [ + "Draws shapes using the SHAPE sub-dialect." + commands [block!] "Block of SHAPE sub-commands" +] + +skew: command [ + "Sets a coordinate system skewed from the original by the given number of degrees in specified axis." + angle [pair!] "Positive numbers skew to the right; negative numbers skew to the left." +] + +spline: command [ + "Draws a curve through any number of points. The smoothness of the curve will be determined by the segment factor." + points [block!] "Block of pairs" + segmentation [integer!] + 'spline-ending [word!] "Leave the spline: OPENED or CLOSED" +] + +text: command [ + "Draws a string of text." + offset [pair!] "offset from where should the text be rendered" + size [pair!] "size of the text area" + 'render-mode [word!] "RASTER or VECTORIAL" + rich-text-block [block!] ] + +transform: command [ + "Applies transformation such as translation, scaling, and rotation." + angle [number!] + center [pair!] + scale [pair!] + translation [pair!] +] + +translate: command [ + "Sets the translation in current transformation matrix." + offset [pair!] +] + +triangle: command [ + "Draws triangular polygon with shading parameters (Gouraud shading). Set colors to NONE to turn of shading." + vertex-1 [pair!] + vertex-2 [pair!] + vertex-3 [pair!] + color-1 [tuple! none!] + color-2 [tuple! none!] + color-3 [tuple! none!] + dilation [number!] "Useful for eliminating anitaliased edges" +] \ No newline at end of file diff --git a/src/boot/graphics.r b/src/boot/graphics.r index 7c185dc..5867637 100644 --- a/src/boot/graphics.r +++ b/src/boot/graphics.r @@ -7,44 +7,45 @@ REBOL [ ] init: command [ - "Initialize graphics subsystem (needs to not be exported!)." + "Initialize graphics subsystem." gob [gob!] "The screen gob (root gob)" ] +caret-to-offset: command [ + "Returns the xy offset (pair) for a specific string position in a graphics object." + gob [gob!] + element [integer! block!] "The position of the string in the richtext block" + position [integer! string!] "The position within the string" +] + +cursor: command [ + "Changes the mouse cursor image." + image [integer! image! none!] +] + +offset-to-caret: command [ ;returns pair! instead of the block..needs to be fixed + "Returns the richtext block at the string position for an XY offset in the graphics object." + gob [gob!] + position [pair!] +] + show: command [ "Display or update a graphical object or block of them." gob [gob! none!] ] -;draw: command [ -; "Renders draw dialect (scalable vector graphics) to an image (returned)." -; image [image! pair!] "Image or size of image" -; commands [block!] "Draw commands" -;] -; -;cursor: command [ -; "Changes the mouse cursor image." -; image [integer! image! none!] -;] -; -;size-text: command [ -; "Returns the size of text rendered by a graphics object." -; gob [gob!] -;] -; -;caret-to-offset: command [ -; "Returns the xy offset (pair) for a specific string position in a graphics object." -; gob [gob!] -; element [block! integer!] "The position of the string in the richtext block" -; position [string! integer!] "The position within the string" -;] -; -;offset-to-caret: command [ -; "Returns the richtext block at the string position for an XY offset in the graphics object." -; gob [gob!] -; position [pair!] -;] -; +size-text: command [ + "Returns the size of text rendered by a graphics object." + gob [gob!] +] + +draw: command [ + "Renders draw dialect (scalable vector graphics) to an image (returned)." + image [image! pair!] "Image or size of image" + commands [block!] "Draw commands" +] + + ;#not-yet-used [ ; ;effect: command [ diff --git a/src/boot/version.r b/src/boot/version.r index 8433b51..1fb3ee5 100644 --- a/src/boot/version.r +++ b/src/boot/version.r @@ -1 +1 @@ -2.100.104.3.1 \ No newline at end of file +2.100.105.3.1 \ No newline at end of file diff --git a/src/include/agg-draw.h b/src/include/agg-draw.h index 8ac166b..4dc9ef0 100644 --- a/src/include/agg-draw.h +++ b/src/include/agg-draw.h @@ -1,61 +1,65 @@ //extern AGG-based DRAW functions -extern REBINT Draw_Image(REBSER *image, REBSER *block); +extern REBINT Draw_Image(REBYTE *image, REBINT w, REBINT h, REBSER *block); extern void agg_get_size(void* gr, REBPAR* p); -extern void agg_begin_poly (void* gr, REBXYF p); extern void agg_add_vertex (void* gr, REBXYF p); +extern void agg_anti_alias(void* gr, REBINT mode); +extern void agg_arc(void* gr, REBXYF c, REBXYF r, REBDEC ang1, REBDEC ang2, REBINT closed); +extern void agg_arrow(void* gr, REBXYF mode, REBYTE* col); +extern void agg_begin_poly (void* gr, REBXYF p); extern void agg_box(void* gr, REBXYF p1, REBXYF p2, REBDEC r); extern void agg_circle(void* gr, REBXYF p, REBXYF r); - -extern void agg_anti_alias(void* gr, REBINT mode); -extern void agg_arc(void* gr, REBPAR* c, REBPAR* r, REBDEC ang1, REBDEC ang2, REBINT closed); -extern void agg_arrow(void* gr, REBCHR* c, REBPAR* ht); -extern void agg_clip(void* gr, REBPAR* p1, REBPAR* p2); -extern void agg_curve3(void* gr, REBPAR* p1, REBPAR* p2, REBPAR* p3); -extern void agg_curve4(void* gr, REBPAR* p1, REBPAR* p2, REBPAR* p3, REBPAR* p4); -extern void agg_effect (void* gr, REBPAR* p1, REBPAR* p2, REBSER* block); -extern void agg_end_spline (void* gr, REBINT step, REBINT closed); +extern void agg_clip(void* gr, REBXYF p1, REBXYF p2); +extern void agg_curve3(void* gr, REBXYF p1, REBXYF p2, REBXYF p3); +extern void agg_curve4(void* gr, REBXYF p1, REBXYF p2, REBXYF p3, REBXYF p4); +extern void agg_ellipse(void* gr, REBXYF p1, REBXYF p2); extern void agg_end_poly (void* gr); -extern void agg_ellipse(void* gr, REBPAR* p1, REBPAR* p2); -extern void agg_fill_image_pen(void* gr, REBSER* img); +extern void agg_end_spline (void* gr, REBINT step, REBINT closed); extern void agg_fill_pen(void* gr, REBYTE* color); +extern void agg_fill_pen_image(void* gr, REBYTE* img, REBINT w, REBINT h); extern void agg_fill_rule(void* gr, REBINT mode); extern void agg_gamma(void* gr, REBDEC gamma); -extern void agg_gradient_pen(void* gr, REBINT gradtype, REBPAR* oft, REBDEC begin, REBDEC end, REBDEC ang, REBDEC scX,REBDEC scY, unsigned char *colors, REBDEC* offsets, REBINT mode); +extern void agg_gradient_pen(void* gr, REBINT gradtype, REBINT mode, REBXYF oft, REBXYF range, REBDEC angle, REBXYF scale, REBSER* colors); //REBDEC begin, REBDEC end, REBDEC ang, REBDEC scX,REBDEC scY, REBSER* colors); //unsigned char *colors, REBDEC* offsets); extern void agg_invert_matrix(void* gr); -extern void agg_image(void* gr, REBSER* img, REBPAR* offset, REBYTE* key, REBINT border); +extern void agg_image(void* gr, REBYTE* img, REBINT w, REBINT h,REBXYF offset); extern void agg_image_filter(void* gr, REBINT type, REBINT mode, REBDEC blur); -extern void agg_image_perspective(void* gr, REBSER* img, REBPAR* p1, REBYTE* key, REBINT border, REBINT pattern, REBINT ox, REBINT oy, REBINT pw, REBINT ph, REBPAR* p2,REBPAR* p3,REBPAR* p4, REBCNT args); -extern void agg_line(void* gr, REBPAR* p1, REBPAR* p2); +extern void agg_image_options(void* gr, REBYTE* keyCol, REBINT border); +extern void agg_image_scale(void* gr, REBYTE* img, REBINT w, REBINT h, REBSER* points); +extern void agg_line(void* gr, REBXYF p1, REBXYF p2); extern void agg_line_cap(void* gr, REBINT mode); extern void agg_line_join(void* gr, REBINT mode); extern void agg_line_pattern(void* gr, REBYTE* col, REBDEC* patterns); extern void agg_line_width(void* gr, REBDEC width, REBINT mode); extern void agg_matrix(void* gr, REBSER* mtx); -extern void agg_pen(void* gr, REBYTE* col, REBSER* img); +extern void agg_pen(void* gr, REBYTE* col); +extern void agg_pen_image(void* gr, REBYTE* img, REBINT w, REBINT h); extern void agg_pop_matrix(void* gr); extern void agg_push_matrix(void* gr); extern void agg_reset_gradient_pen(void* gr); extern void agg_reset_matrix(void* gr); extern void agg_rotate(void* gr, REBDEC ang); -extern void agg_scale(void* gr, REBDEC scx, REBDEC scy); -extern void agg_skew(void* gr, REBDEC sx, REBDEC sy); -extern REBINT agg_text(void* gr, REBINT mode, REBPAR* p1, REBPAR* p2, REBSER* block); -extern void agg_transform(void* gr, REBDEC ang, REBPAR* ctr, REBDEC scx, REBDEC scy, REBPAR* oft); -extern void agg_translate(void* gr, REBPAR* p); -extern void agg_triangle(void* gr, REBPAR* p1, REBPAR* p2, REBPAR* p3, REBYTE* c1, REBYTE* c2, REBYTE* c3, REBDEC dilation); +extern void agg_scale(void* gr, REBXYF sc); +extern void agg_skew(void* gr, REBXYF angle); +extern REBINT agg_text(void* gr, REBINT mode, REBXYF p1, REBXYF p2, REBSER* block); +extern void agg_transform(void* gr, REBDEC ang, REBXYF ctr, REBXYF scm, REBXYF oft); +extern void agg_translate(void* gr, REBXYF p); +extern void agg_triangle(void* gr, REBXYF p1, REBXYF p2, REBXYF p3, REBYTE* c1, REBYTE* c2, REBYTE* c3, REBDEC dilation); + + +extern void agg_effect (void* gr, REBPAR* p1, REBPAR* p2, REBSER* block); + + //SHAPE functions -extern void agg_path_open(void* gr); +extern void agg_path_arc(void* gr, REBINT rel, REBXYF p, REBXYF r, REBDEC ang, REBINT sweep, REBINT large); extern void agg_path_close(void* gr); - -extern void agg_path_arc(void* gr, REBINT rel, REBPAR* p, REBDEC rx, REBDEC ry, REBDEC ang, REBINT sweep, REBINT large); -extern void agg_path_curv(void* gr, REBINT rel, REBPAR* p1, REBPAR* p2); -extern void agg_path_curve(void* gr, REBINT rel, REBPAR* p1, REBPAR* p2, REBPAR* p3); extern void agg_path_hline(void* gr,REBINT rel, REBDEC x); -extern void agg_path_line(void* gr, REBINT rel, REBPAR* p); +extern void agg_path_line(void* gr, REBINT rel, REBXYF p); +extern void agg_path_move(void* gr, REBINT rel, REBXYF p); +extern void agg_path_open(void* gr); extern void agg_path_vline(void* gr,REBINT rel, REBDEC y); -extern void agg_path_move(void* gr, REBINT rel, REBPAR* p); -extern void agg_path_qcurv(void* gr, REBINT rel, REBPAR* p); -extern void agg_path_qcurve(void* gr, REBINT rel, REBPAR* p1, REBPAR* p2); +extern void agg_path_curv(void* gr, REBINT rel, REBXYF p1, REBXYF p2); +extern void agg_path_curve(void* gr, REBINT rel, REBXYF p1, REBXYF p2, REBXYF p3); +extern void agg_path_qcurv(void* gr, REBINT rel, REBXYF p); +extern void agg_path_qcurve(void* gr, REBINT rel, REBXYF p1, REBXYF p2); diff --git a/src/include/agg-text.h b/src/include/agg-text.h new file mode 100644 index 0000000..df8125a --- /dev/null +++ b/src/include/agg-text.h @@ -0,0 +1,66 @@ +//typedef struct REBOL_FONT REBFNT; +typedef struct REBOL_FONT { + wchar_t *name; + REBCNT name_gc; + REBINT bold; + REBINT italic; + REBINT underline; + REBINT size; + REBYTE* color; + REBINT offset_x; + REBINT offset_y; + REBINT space_x; + REBINT space_y; + REBINT shadow_x; + REBINT shadow_y; + REBYTE* shadow_color; + REBINT shadow_blur; +} REBFNT; + +//typedef struct REBOL_PARA REBPRA; +typedef struct REBOL_PARA { + REBINT origin_x; + REBINT origin_y; + REBINT margin_x; + REBINT margin_y; + REBINT indent_x; + REBINT indent_y; + REBINT tabs; + REBINT wrap; + REBINT scroll_x; + REBINT scroll_y; + REBINT align; + REBINT valign; +} REBPRA; + +//extern AGG-based compositor functions + +extern void* Create_RichText(); +extern void Destroy_RichText(void* rt); +extern void rt_anti_alias(void* rt, REBINT mode); +extern void rt_bold(void* rt, REBINT state); +extern void rt_caret(void* rt, REBXYF* caret, REBXYF* highlightStart, REBXYF highlightEnd); +extern void rt_center(void* rt); +extern void rt_color(void* rt, REBYTE* col); +extern void rt_drop(void* rt, REBINT number); +extern void rt_font(void* rt, REBFNT* font); +extern void rt_font_size(void* rt, REBINT size); +extern void* rt_get_font(void* rt); +extern void* rt_get_para(void* rt); +extern void rt_italic(void* rt, REBINT state); +extern void rt_left(void* rt); +extern void rt_newline(void* rt, REBINT index); +extern void rt_para(void* rt, REBPRA* para); +extern void rt_right(void* rt); +extern void rt_scroll(void* rt, REBXYF offset); +extern void rt_shadow(void* rt, REBXYF d, REBYTE* color, REBINT blur); +extern void rt_set_font_styles(REBFNT* font, u32 word); +extern void rt_size_text(void* rt, REBGOB* gob, REBXYF* size); +extern void rt_text(void* gr, REBCHR* text, REBINT index, REBCNT gc); +extern void rt_underline(void* rt, REBINT state); + +extern REBINT rt_offset_to_caret(void* rt, REBGOB *gob, REBXYF xy, REBINT *element, REBINT *position); +extern REBINT rt_caret_to_offset(void* rt, REBGOB *gob, REBXYF* xy, REBINT element, REBINT position); + + + diff --git a/src/include/ext-types.h b/src/include/ext-types.h index 4426fa4..4035cdf 100644 --- a/src/include/ext-types.h +++ b/src/include/ext-types.h @@ -7,8 +7,8 @@ ************************************************************************ ** ** Title: Extension Types (Isolators) -** Build: A104 -** Date: 26-Aug-2010/20:40:59-7:00 +** Build: A105 +** Date: 1-Sep-2010 ** File: ext-types.h ** ** AUTO-GENERATED FILE - Do not modify. (From: make-boot.r) diff --git a/src/include/host-ext-draw.h b/src/include/host-ext-draw.h new file mode 100644 index 0000000..cbec5ec --- /dev/null +++ b/src/include/host-ext-draw.h @@ -0,0 +1,753 @@ +/*********************************************************************** +** +** REBOL 3.0 "Invasion" +** Copyright 2010 REBOL Technologies +** All rights reserved. +** +************************************************************************ +** +** Title: REBOL Graphics - DRAW commands +** Build: A105 +** Date: 1-Sep-2010 +** File: host-ext-draw +** +** AUTO-GENERATED FILE - Do not modify. (From: make-host-ext.r) +** +***********************************************************************/ + +enum draw_commands { + CMD_DRAW_INIT_WORDS, + CMD_DRAW_ANTI_ALIAS, + CMD_DRAW_ARC, + CMD_DRAW_ARROW, + CMD_DRAW_BOX, + CMD_DRAW_CIRCLE, + CMD_DRAW_CURVE, + CMD_DRAW_CLIP, + CMD_DRAW_ELLIPSE, + CMD_DRAW_FILL_PEN, + CMD_DRAW_FILL_RULE, + CMD_DRAW_GAMMA, + CMD_DRAW_GRAD_PEN, + CMD_DRAW_IMAGE, + CMD_DRAW_IMAGE_FILTER, + CMD_DRAW_IMAGE_OPTIONS, + CMD_DRAW_IMAGE_PATTERN, + CMD_DRAW_LINE, + CMD_DRAW_LINE_CAP, + CMD_DRAW_LINE_JOIN, + CMD_DRAW_LINE_PATTERN, + CMD_DRAW_LINE_WIDTH, + CMD_DRAW_INVERT_MATRIX, + CMD_DRAW_MATRIX, + CMD_DRAW_PEN, + CMD_DRAW_POLYGON, + CMD_DRAW_PUSH, + CMD_DRAW_RESET_MATRIX, + CMD_DRAW_ROTATE, + CMD_DRAW_SCALE, + CMD_DRAW_SHAPE, + CMD_DRAW_SKEW, + CMD_DRAW_SPLINE, + CMD_DRAW_TEXT, + CMD_DRAW_TRANSFORM, + CMD_DRAW_TRANSLATE, + CMD_DRAW_TRIANGLE, +}; + +enum draw_words { + W_DRAW_0, + W_DRAW_EVEN_ODD, + W_DRAW_NON_ZERO, + W_DRAW_CONIC, + W_DRAW_CUBIC, + W_DRAW_DIAGONAL, + W_DRAW_DIAMOND, + W_DRAW_LINEAR, + W_DRAW_RADIAL, + W_DRAW_NORMAL, + W_DRAW_REPEAT, + W_DRAW_REFLECT, + W_DRAW_BUTT, + W_DRAW_SQUARE, + W_DRAW_ROUNDED, + W_DRAW_MITER, + W_DRAW_MITER_BEVEL, + W_DRAW_ROUND, + W_DRAW_BEVEL, + W_DRAW_VARIABLE, + W_DRAW_FIXED, + W_DRAW_OPENED, + W_DRAW_CLOSED, + W_DRAW_NO_BORDER, + W_DRAW_BORDER, + W_DRAW_NEAREST, + W_DRAW_BILINEAR, + W_DRAW_BICUBIC, + W_DRAW_GAUSSIAN, + W_DRAW_RESIZE, + W_DRAW_RESAMPLE, + W_DRAW_RASTER, + W_DRAW_VECTORIAL, +}; + +#ifdef INCLUDE_EXT_DATA +const unsigned char RX_draw[] = { + 82, 69, 66, 79, 76, 32, 91, 10, 84, 105, + 116, 108, 101, 58, 32, 34, 82, 69, 66, 79, + 76, 32, 71, 114, 97, 112, 104, 105, 99, 115, + 32, 45, 32, 68, 82, 65, 87, 32, 99, 111, + 109, 109, 97, 110, 100, 115, 34, 32, 10, 78, + 97, 109, 101, 58, 32, 100, 114, 97, 119, 32, + 10, 84, 121, 112, 101, 58, 32, 101, 120, 116, + 101, 110, 115, 105, 111, 110, 32, 10, 69, 120, + 112, 111, 114, 116, 115, 58, 32, 110, 111, 110, + 101, 10, 93, 32, 10, 119, 111, 114, 100, 115, + 58, 32, 91, 10, 101, 118, 101, 110, 45, 111, + 100, 100, 32, 10, 110, 111, 110, 45, 122, 101, + 114, 111, 32, 10, 99, 111, 110, 105, 99, 32, + 10, 99, 117, 98, 105, 99, 32, 10, 100, 105, + 97, 103, 111, 110, 97, 108, 32, 10, 100, 105, + 97, 109, 111, 110, 100, 32, 10, 108, 105, 110, + 101, 97, 114, 32, 10, 114, 97, 100, 105, 97, + 108, 32, 10, 110, 111, 114, 109, 97, 108, 32, + 10, 114, 101, 112, 101, 97, 116, 32, 10, 114, + 101, 102, 108, 101, 99, 116, 32, 10, 98, 117, + 116, 116, 32, 10, 115, 113, 117, 97, 114, 101, + 32, 10, 114, 111, 117, 110, 100, 101, 100, 32, + 10, 109, 105, 116, 101, 114, 32, 10, 109, 105, + 116, 101, 114, 45, 98, 101, 118, 101, 108, 32, + 10, 114, 111, 117, 110, 100, 32, 10, 98, 101, + 118, 101, 108, 32, 10, 118, 97, 114, 105, 97, + 98, 108, 101, 32, 10, 102, 105, 120, 101, 100, + 32, 10, 111, 112, 101, 110, 101, 100, 32, 10, + 99, 108, 111, 115, 101, 100, 32, 10, 110, 111, + 45, 98, 111, 114, 100, 101, 114, 32, 10, 98, + 111, 114, 100, 101, 114, 32, 10, 110, 101, 97, + 114, 101, 115, 116, 32, 10, 98, 105, 108, 105, + 110, 101, 97, 114, 32, 10, 98, 105, 99, 117, + 98, 105, 99, 32, 10, 103, 97, 117, 115, 115, + 105, 97, 110, 32, 10, 114, 101, 115, 105, 122, + 101, 32, 10, 114, 101, 115, 97, 109, 112, 108, + 101, 32, 10, 114, 97, 115, 116, 101, 114, 32, + 10, 118, 101, 99, 116, 111, 114, 105, 97, 108, + 10, 93, 32, 10, 105, 110, 105, 116, 45, 119, + 111, 114, 100, 115, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 119, 111, 114, 100, + 115, 32, 91, 98, 108, 111, 99, 107, 33, 93, + 10, 93, 32, 10, 105, 110, 105, 116, 45, 119, + 111, 114, 100, 115, 32, 119, 111, 114, 100, 115, + 32, 10, 97, 110, 116, 105, 45, 97, 108, 105, + 97, 115, 58, 32, 99, 111, 109, 109, 97, 110, + 100, 32, 91, 10, 34, 84, 117, 114, 110, 115, + 32, 97, 110, 116, 105, 45, 97, 108, 105, 97, + 115, 105, 110, 103, 32, 111, 110, 32, 111, 114, + 32, 111, 102, 102, 46, 34, 32, 10, 115, 116, + 97, 116, 101, 32, 91, 108, 111, 103, 105, 99, + 33, 93, 10, 93, 32, 10, 97, 114, 99, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 34, 68, 114, 97, 119, 115, 32, 97, 32, + 112, 97, 114, 116, 105, 97, 108, 32, 115, 101, + 99, 116, 105, 111, 110, 32, 111, 102, 32, 97, + 110, 32, 101, 108, 108, 105, 112, 115, 101, 32, + 111, 114, 32, 99, 105, 114, 99, 108, 101, 46, + 34, 32, 10, 99, 101, 110, 116, 101, 114, 32, + 91, 112, 97, 105, 114, 33, 93, 32, 34, 84, + 104, 101, 32, 99, 101, 110, 116, 101, 114, 32, + 111, 102, 32, 116, 104, 101, 32, 99, 105, 114, + 99, 108, 101, 34, 32, 10, 114, 97, 100, 105, + 117, 115, 32, 91, 112, 97, 105, 114, 33, 93, + 32, 34, 84, 104, 101, 32, 114, 97, 100, 105, + 117, 115, 32, 111, 102, 32, 116, 104, 101, 32, + 99, 105, 114, 99, 108, 101, 34, 32, 10, 97, + 110, 103, 108, 101, 45, 98, 101, 103, 105, 110, + 32, 91, 110, 117, 109, 98, 101, 114, 33, 93, + 32, 34, 84, 104, 101, 32, 97, 110, 103, 108, + 101, 32, 119, 104, 101, 114, 101, 32, 116, 104, + 101, 32, 97, 114, 99, 32, 98, 101, 103, 105, + 110, 115, 44, 32, 105, 110, 32, 100, 101, 103, + 114, 101, 101, 115, 34, 32, 10, 97, 110, 103, + 108, 101, 45, 108, 101, 110, 103, 116, 104, 32, + 91, 110, 117, 109, 98, 101, 114, 33, 93, 32, + 34, 84, 104, 101, 32, 108, 101, 110, 103, 116, + 104, 32, 111, 102, 32, 116, 104, 101, 32, 97, + 114, 99, 32, 105, 110, 32, 100, 101, 103, 114, + 101, 101, 115, 34, 32, 10, 39, 97, 114, 99, + 45, 101, 110, 100, 105, 110, 103, 32, 91, 119, + 111, 114, 100, 33, 93, 32, 34, 76, 101, 97, + 118, 101, 32, 116, 104, 101, 32, 97, 114, 99, + 58, 32, 79, 80, 69, 78, 69, 68, 32, 111, + 114, 32, 67, 76, 79, 83, 69, 68, 34, 10, + 93, 32, 10, 97, 114, 114, 111, 119, 58, 32, + 99, 111, 109, 109, 97, 110, 100, 32, 91, 10, + 34, 83, 101, 116, 115, 32, 116, 104, 101, 32, + 97, 114, 114, 111, 119, 32, 109, 111, 100, 101, + 46, 34, 32, 10, 109, 111, 100, 101, 32, 91, + 112, 97, 105, 114, 33, 93, 32, 123, 80, 111, + 115, 115, 105, 98, 108, 101, 32, 110, 117, 109, + 98, 101, 114, 115, 32, 102, 111, 114, 32, 99, + 111, 109, 98, 105, 110, 97, 116, 105, 111, 110, + 46, 32, 48, 32, 102, 111, 114, 32, 110, 111, + 110, 101, 44, 32, 49, 32, 102, 111, 114, 32, + 104, 101, 97, 100, 44, 32, 50, 32, 102, 111, + 114, 32, 116, 97, 105, 108, 125, 32, 10, 99, + 111, 108, 111, 114, 32, 91, 116, 117, 112, 108, + 101, 33, 32, 110, 111, 110, 101, 33, 93, 32, + 123, 67, 111, 108, 111, 114, 32, 111, 102, 32, + 116, 104, 101, 32, 104, 101, 97, 100, 47, 116, + 97, 105, 108, 32, 111, 102, 32, 116, 104, 101, + 32, 97, 114, 114, 111, 119, 46, 32, 78, 79, + 78, 69, 32, 109, 101, 97, 110, 115, 32, 117, + 115, 101, 32, 80, 69, 78, 32, 99, 111, 108, + 111, 114, 125, 10, 93, 32, 10, 98, 111, 120, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 34, 68, 114, 97, 119, 115, 32, 97, + 32, 114, 101, 99, 116, 97, 110, 103, 117, 108, + 97, 114, 32, 98, 111, 120, 46, 34, 32, 10, + 111, 114, 105, 103, 105, 110, 32, 91, 112, 97, + 105, 114, 33, 93, 32, 34, 67, 111, 114, 110, + 101, 114, 32, 111, 102, 32, 98, 111, 120, 34, + 32, 10, 101, 110, 100, 32, 91, 112, 97, 105, + 114, 33, 93, 32, 34, 69, 110, 100, 32, 111, + 102, 32, 98, 111, 120, 34, 32, 10, 99, 111, + 114, 110, 101, 114, 45, 114, 97, 100, 105, 117, + 115, 32, 91, 110, 117, 109, 98, 101, 114, 33, + 93, 32, 34, 82, 111, 117, 110, 100, 115, 32, + 99, 111, 114, 110, 101, 114, 115, 34, 10, 93, + 32, 10, 99, 105, 114, 99, 108, 101, 58, 32, + 99, 111, 109, 109, 97, 110, 100, 32, 91, 10, + 34, 68, 114, 97, 119, 115, 32, 97, 32, 99, + 105, 114, 99, 108, 101, 32, 111, 114, 32, 101, + 108, 108, 105, 112, 115, 101, 46, 34, 32, 10, + 99, 101, 110, 116, 101, 114, 32, 91, 112, 97, + 105, 114, 33, 93, 32, 10, 114, 97, 100, 105, + 117, 115, 32, 91, 112, 97, 105, 114, 33, 93, + 10, 93, 32, 10, 99, 117, 114, 118, 101, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 34, 68, 114, 97, 119, 115, 32, 97, 32, + 115, 109, 111, 111, 116, 104, 32, 66, 195, 169, + 122, 105, 101, 114, 32, 99, 117, 114, 118, 101, + 46, 40, 117, 115, 105, 110, 103, 32, 51, 32, + 111, 114, 32, 52, 32, 112, 111, 105, 110, 116, + 115, 41, 34, 32, 10, 112, 111, 105, 110, 116, + 45, 49, 32, 91, 112, 97, 105, 114, 33, 93, + 32, 34, 69, 110, 100, 32, 112, 111, 105, 110, + 116, 32, 65, 34, 32, 10, 112, 111, 105, 110, + 116, 45, 50, 32, 91, 112, 97, 105, 114, 33, + 93, 32, 34, 67, 111, 110, 116, 114, 111, 108, + 32, 112, 111, 105, 110, 116, 32, 65, 34, 32, + 10, 112, 111, 105, 110, 116, 45, 51, 32, 91, + 112, 97, 105, 114, 33, 93, 32, 34, 69, 110, + 100, 32, 112, 111, 105, 110, 116, 32, 66, 44, + 32, 111, 114, 32, 99, 111, 110, 116, 114, 111, + 108, 32, 112, 111, 105, 110, 116, 32, 66, 34, + 32, 10, 112, 111, 105, 110, 116, 45, 52, 32, + 91, 112, 97, 105, 114, 33, 32, 110, 111, 110, + 101, 33, 93, 32, 34, 69, 110, 100, 32, 112, + 111, 105, 110, 116, 32, 66, 34, 10, 93, 32, + 10, 99, 108, 105, 112, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 34, 83, 112, + 101, 99, 105, 102, 105, 101, 115, 32, 97, 32, + 99, 108, 105, 112, 112, 105, 110, 103, 32, 114, + 101, 103, 105, 111, 110, 46, 34, 32, 10, 111, + 114, 105, 103, 105, 110, 32, 91, 112, 97, 105, + 114, 33, 93, 32, 34, 67, 111, 114, 110, 101, + 114, 32, 111, 102, 32, 98, 111, 120, 34, 32, + 10, 101, 110, 100, 32, 91, 112, 97, 105, 114, + 33, 93, 32, 34, 69, 110, 100, 32, 111, 102, + 32, 98, 111, 120, 34, 10, 93, 32, 10, 101, + 108, 108, 105, 112, 115, 101, 58, 32, 99, 111, + 109, 109, 97, 110, 100, 32, 91, 10, 34, 68, + 114, 97, 119, 115, 32, 97, 110, 32, 101, 108, + 108, 105, 112, 115, 101, 46, 34, 32, 10, 111, + 114, 105, 103, 105, 110, 32, 91, 112, 97, 105, + 114, 33, 93, 32, 34, 84, 104, 101, 32, 117, + 112, 112, 101, 114, 45, 108, 101, 102, 116, 45, + 112, 111, 105, 110, 116, 32, 111, 102, 32, 116, + 104, 101, 32, 101, 108, 108, 105, 112, 115, 101, + 32, 98, 111, 117, 110, 100, 105, 110, 103, 32, + 98, 111, 120, 34, 32, 10, 100, 105, 97, 109, + 101, 116, 101, 114, 32, 91, 112, 97, 105, 114, + 33, 93, 10, 93, 32, 10, 102, 105, 108, 108, + 45, 112, 101, 110, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 34, 83, 101, 116, + 115, 32, 116, 104, 101, 32, 97, 114, 101, 97, + 32, 102, 105, 108, 108, 32, 112, 101, 110, 32, + 99, 111, 108, 111, 114, 46, 34, 32, 10, 99, + 111, 108, 111, 114, 32, 91, 116, 117, 112, 108, + 101, 33, 32, 105, 109, 97, 103, 101, 33, 32, + 108, 111, 103, 105, 99, 33, 93, 32, 34, 83, + 101, 116, 32, 116, 111, 32, 79, 70, 70, 32, + 116, 111, 32, 100, 105, 115, 97, 98, 108, 101, + 32, 102, 105, 108, 108, 32, 112, 101, 110, 34, + 10, 93, 32, 10, 102, 105, 108, 108, 45, 114, + 117, 108, 101, 58, 32, 99, 111, 109, 109, 97, + 110, 100, 32, 91, 10, 123, 68, 101, 116, 101, + 114, 109, 105, 110, 101, 115, 32, 116, 104, 101, + 32, 97, 108, 103, 111, 114, 105, 116, 104, 109, + 32, 117, 115, 101, 100, 32, 116, 111, 32, 100, + 101, 116, 101, 114, 109, 105, 110, 101, 32, 119, + 104, 97, 116, 32, 97, 114, 101, 97, 32, 116, + 111, 32, 102, 105, 108, 108, 46, 125, 32, 10, + 39, 109, 111, 100, 101, 32, 91, 119, 111, 114, + 100, 33, 93, 32, 34, 82, 117, 108, 101, 32, + 116, 121, 112, 101, 58, 32, 69, 86, 69, 78, + 45, 79, 68, 68, 32, 111, 114, 32, 78, 79, + 78, 45, 90, 69, 82, 79, 34, 10, 93, 32, + 10, 103, 97, 109, 109, 97, 58, 32, 99, 111, + 109, 109, 97, 110, 100, 32, 91, 10, 34, 83, + 101, 116, 115, 32, 116, 104, 101, 32, 103, 97, + 109, 109, 97, 32, 99, 111, 114, 114, 101, 99, + 116, 105, 111, 110, 32, 118, 97, 108, 117, 101, + 46, 34, 32, 10, 103, 97, 109, 109, 97, 45, + 118, 97, 108, 117, 101, 32, 91, 110, 117, 109, + 98, 101, 114, 33, 93, 10, 93, 32, 10, 103, + 114, 97, 100, 45, 112, 101, 110, 58, 32, 99, + 111, 109, 109, 97, 110, 100, 32, 91, 10, 123, + 83, 101, 116, 115, 32, 116, 104, 101, 32, 99, + 111, 108, 111, 114, 32, 103, 114, 97, 100, 105, + 101, 110, 116, 32, 102, 111, 114, 32, 97, 114, + 101, 97, 32, 102, 105, 108, 108, 105, 110, 103, + 46, 32, 84, 111, 32, 100, 105, 115, 97, 98, + 108, 101, 32, 105, 116, 32, 115, 101, 116, 32, + 116, 104, 101, 32, 99, 111, 108, 111, 114, 32, + 98, 108, 111, 99, 107, 32, 116, 111, 32, 78, + 79, 78, 69, 46, 125, 32, 10, 39, 116, 121, + 112, 101, 32, 91, 119, 111, 114, 100, 33, 93, + 32, 123, 84, 104, 101, 32, 103, 114, 97, 100, + 105, 101, 110, 116, 32, 116, 121, 112, 101, 58, + 32, 82, 65, 68, 73, 65, 76, 32, 67, 79, + 78, 73, 67, 32, 68, 73, 65, 77, 79, 78, + 68, 32, 76, 73, 78, 69, 65, 82, 32, 68, + 73, 65, 71, 79, 78, 65, 76, 32, 67, 85, + 66, 73, 67, 125, 32, 10, 39, 109, 111, 100, + 101, 32, 91, 119, 111, 114, 100, 33, 93, 32, + 34, 84, 104, 101, 32, 103, 114, 97, 100, 105, + 101, 110, 116, 32, 114, 101, 110, 100, 101, 114, + 105, 110, 103, 32, 109, 111, 100, 101, 58, 32, + 78, 79, 82, 77, 65, 76, 32, 82, 69, 80, + 69, 65, 84, 32, 82, 69, 70, 76, 69, 67, + 84, 34, 32, 10, 111, 102, 102, 115, 101, 116, + 32, 91, 112, 97, 105, 114, 33, 93, 32, 34, + 111, 102, 102, 115, 101, 116, 32, 102, 114, 111, + 109, 32, 119, 104, 101, 114, 101, 32, 115, 104, + 111, 117, 108, 100, 32, 116, 104, 101, 32, 103, + 114, 97, 100, 105, 101, 110, 116, 32, 98, 101, + 32, 114, 101, 110, 100, 101, 114, 101, 100, 34, + 32, 10, 114, 97, 110, 103, 101, 32, 91, 112, + 97, 105, 114, 33, 93, 32, 34, 98, 101, 103, + 105, 110, 32, 97, 110, 100, 32, 101, 110, 100, + 32, 111, 102, 32, 116, 104, 101, 32, 103, 114, + 97, 100, 105, 101, 110, 116, 32, 114, 97, 110, + 103, 101, 34, 32, 10, 97, 110, 103, 108, 101, + 32, 91, 110, 117, 109, 98, 101, 114, 33, 93, + 32, 34, 114, 111, 116, 97, 116, 105, 111, 110, + 32, 111, 102, 32, 116, 104, 101, 32, 103, 114, + 97, 100, 105, 101, 110, 116, 32, 105, 110, 32, + 100, 101, 103, 114, 101, 101, 115, 34, 32, 10, + 115, 99, 97, 108, 101, 32, 91, 112, 97, 105, + 114, 33, 93, 32, 34, 88, 32, 97, 110, 100, + 32, 89, 32, 115, 99, 97, 108, 101, 32, 102, + 97, 99, 116, 111, 114, 34, 32, 10, 99, 111, + 108, 111, 114, 115, 32, 91, 98, 108, 111, 99, + 107, 33, 32, 110, 111, 110, 101, 33, 93, 32, + 123, 98, 108, 111, 99, 107, 32, 99, 111, 110, + 116, 97, 105, 110, 105, 110, 103, 32, 117, 112, + 32, 116, 111, 32, 50, 53, 54, 32, 103, 114, + 97, 100, 105, 101, 110, 116, 32, 99, 111, 108, + 111, 114, 115, 32, 40, 111, 112, 116, 105, 111, + 110, 97, 108, 108, 121, 32, 119, 105, 116, 104, + 32, 99, 111, 108, 111, 114, 32, 111, 102, 102, + 115, 101, 116, 115, 41, 125, 10, 93, 32, 10, + 105, 109, 97, 103, 101, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 123, 68, 114, + 97, 119, 115, 32, 97, 110, 32, 105, 109, 97, + 103, 101, 44, 32, 119, 105, 116, 104, 32, 111, + 112, 116, 105, 111, 110, 97, 108, 32, 115, 99, + 97, 108, 105, 110, 103, 44, 32, 98, 111, 114, + 100, 101, 114, 115, 44, 32, 97, 110, 100, 32, + 99, 111, 108, 111, 114, 32, 107, 101, 121, 105, + 110, 103, 46, 125, 32, 10, 105, 109, 97, 103, + 101, 32, 91, 105, 109, 97, 103, 101, 33, 93, + 32, 10, 111, 102, 102, 115, 101, 116, 45, 112, + 111, 105, 110, 116, 115, 32, 91, 112, 97, 105, + 114, 33, 32, 98, 108, 111, 99, 107, 33, 93, + 10, 93, 32, 10, 105, 109, 97, 103, 101, 45, + 102, 105, 108, 116, 101, 114, 58, 32, 99, 111, + 109, 109, 97, 110, 100, 32, 91, 10, 123, 83, + 112, 101, 99, 105, 102, 105, 101, 115, 32, 116, + 121, 112, 101, 32, 111, 102, 32, 97, 108, 103, + 111, 114, 105, 116, 104, 109, 32, 117, 115, 101, + 100, 32, 119, 104, 101, 110, 32, 97, 110, 32, + 105, 109, 97, 103, 101, 32, 105, 115, 32, 115, + 99, 97, 108, 101, 100, 46, 125, 32, 10, 39, + 102, 105, 108, 116, 101, 114, 45, 116, 121, 112, + 101, 32, 91, 119, 111, 114, 100, 33, 93, 32, + 123, 115, 117, 112, 112, 111, 114, 116, 101, 100, + 32, 102, 105, 108, 116, 101, 114, 115, 58, 32, + 78, 69, 65, 82, 69, 83, 84, 44, 32, 66, + 73, 76, 73, 78, 69, 65, 82, 44, 32, 66, + 73, 67, 85, 66, 73, 67, 44, 32, 71, 65, + 85, 83, 83, 73, 65, 78, 125, 32, 10, 39, + 102, 105, 108, 116, 101, 114, 45, 109, 111, 100, + 101, 32, 91, 119, 111, 114, 100, 33, 93, 32, + 123, 79, 117, 116, 112, 117, 116, 32, 113, 117, + 97, 108, 105, 116, 121, 58, 32, 82, 69, 83, + 73, 90, 69, 40, 108, 111, 119, 44, 32, 102, + 97, 115, 116, 101, 114, 41, 32, 111, 114, 32, + 82, 69, 83, 65, 77, 80, 76, 69, 40, 104, + 105, 103, 104, 44, 32, 115, 108, 111, 119, 101, + 114, 41, 125, 32, 10, 98, 108, 117, 114, 32, + 91, 110, 117, 109, 98, 101, 114, 33, 32, 110, + 111, 110, 101, 33, 93, 32, 34, 85, 115, 101, + 100, 32, 111, 110, 108, 121, 32, 105, 110, 32, + 82, 69, 83, 65, 77, 80, 76, 69, 32, 109, + 111, 100, 101, 34, 10, 93, 32, 10, 105, 109, + 97, 103, 101, 45, 111, 112, 116, 105, 111, 110, + 115, 58, 32, 99, 111, 109, 109, 97, 110, 100, + 32, 91, 10, 34, 83, 101, 116, 115, 32, 111, + 112, 116, 105, 111, 110, 115, 32, 114, 101, 108, + 97, 116, 101, 100, 32, 116, 111, 32, 105, 109, + 97, 103, 101, 32, 114, 101, 110, 100, 101, 114, + 105, 110, 103, 46, 34, 32, 10, 107, 101, 121, + 45, 99, 111, 108, 111, 114, 32, 91, 116, 117, + 112, 108, 101, 33, 32, 110, 111, 110, 101, 33, + 93, 32, 123, 67, 111, 108, 111, 114, 32, 116, + 111, 32, 98, 101, 32, 114, 101, 110, 100, 101, + 114, 101, 100, 32, 97, 115, 32, 116, 114, 97, + 110, 115, 112, 97, 114, 101, 110, 116, 32, 111, + 114, 32, 78, 79, 78, 69, 32, 116, 111, 32, + 100, 105, 115, 97, 98, 108, 101, 32, 105, 116, + 125, 32, 10, 39, 98, 111, 114, 100, 101, 114, + 45, 102, 108, 97, 103, 32, 91, 119, 111, 114, + 100, 33, 93, 32, 34, 99, 97, 110, 32, 98, + 101, 32, 66, 79, 82, 68, 69, 82, 32, 111, + 114, 32, 78, 79, 45, 66, 79, 82, 68, 69, + 82, 34, 10, 93, 32, 10, 105, 109, 97, 103, + 101, 45, 112, 97, 116, 116, 101, 114, 110, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 34, 67, 111, 110, 102, 105, 103, 117, 114, + 101, 32, 116, 104, 101, 32, 105, 109, 97, 103, + 101, 32, 112, 97, 116, 116, 101, 114, 110, 32, + 102, 105, 108, 108, 32, 115, 101, 116, 116, 105, + 110, 103, 115, 46, 34, 32, 10, 39, 112, 97, + 116, 116, 101, 114, 110, 45, 109, 111, 100, 101, + 32, 91, 119, 111, 114, 100, 33, 93, 32, 34, + 99, 97, 110, 32, 98, 101, 32, 78, 79, 82, + 77, 65, 76, 44, 32, 82, 69, 80, 69, 65, + 84, 32, 111, 114, 32, 82, 69, 70, 76, 69, + 67, 84, 34, 32, 10, 112, 97, 116, 116, 101, + 114, 110, 45, 111, 102, 102, 115, 101, 116, 32, + 91, 112, 97, 105, 114, 33, 93, 32, 10, 112, + 97, 116, 116, 101, 114, 110, 45, 115, 105, 122, + 101, 32, 91, 112, 97, 105, 114, 33, 93, 32, + 34, 115, 101, 116, 32, 116, 111, 32, 48, 120, + 48, 32, 102, 111, 114, 32, 97, 117, 116, 111, + 45, 115, 105, 122, 101, 34, 10, 93, 32, 10, + 108, 105, 110, 101, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 34, 68, 114, 97, + 119, 115, 32, 40, 112, 111, 108, 121, 41, 108, + 105, 110, 101, 32, 102, 114, 111, 109, 32, 97, + 32, 110, 117, 109, 98, 101, 114, 32, 111, 102, + 32, 112, 111, 105, 110, 116, 115, 46, 34, 32, + 10, 108, 105, 110, 101, 115, 32, 91, 98, 108, + 111, 99, 107, 33, 93, 32, 34, 66, 108, 111, + 99, 107, 32, 111, 102, 32, 112, 97, 105, 114, + 115, 34, 10, 93, 32, 10, 108, 105, 110, 101, + 45, 99, 97, 112, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 123, 83, 101, 116, + 115, 32, 116, 104, 101, 32, 115, 116, 121, 108, + 101, 32, 116, 104, 97, 116, 32, 119, 105, 108, + 108, 32, 98, 101, 32, 117, 115, 101, 100, 32, + 119, 104, 101, 110, 32, 100, 114, 97, 119, 105, + 110, 103, 32, 116, 104, 101, 32, 101, 110, 100, + 115, 32, 111, 102, 32, 108, 105, 110, 101, 115, + 46, 125, 32, 10, 39, 116, 121, 112, 101, 32, + 91, 119, 111, 114, 100, 33, 93, 32, 34, 67, + 97, 112, 32, 116, 121, 112, 101, 58, 32, 66, + 85, 84, 84, 44, 32, 83, 81, 85, 65, 82, + 69, 32, 111, 114, 32, 82, 79, 85, 78, 68, + 69, 68, 34, 10, 93, 32, 10, 108, 105, 110, + 101, 45, 106, 111, 105, 110, 58, 32, 99, 111, + 109, 109, 97, 110, 100, 32, 91, 10, 123, 83, + 101, 116, 115, 32, 116, 104, 101, 32, 115, 116, + 121, 108, 101, 32, 116, 104, 97, 116, 32, 119, + 105, 108, 108, 32, 98, 101, 32, 117, 115, 101, + 100, 32, 119, 104, 101, 114, 101, 32, 108, 105, + 110, 101, 115, 32, 97, 114, 101, 32, 106, 111, + 105, 110, 101, 100, 46, 125, 32, 10, 39, 116, + 121, 112, 101, 32, 91, 119, 111, 114, 100, 33, + 93, 32, 34, 74, 111, 105, 110, 32, 116, 121, + 112, 101, 58, 32, 77, 73, 84, 69, 82, 44, + 32, 77, 73, 84, 69, 82, 45, 66, 69, 86, + 69, 76, 44, 32, 82, 79, 85, 78, 68, 44, + 32, 111, 114, 32, 66, 69, 86, 69, 76, 34, + 10, 93, 32, 10, 108, 105, 110, 101, 45, 112, + 97, 116, 116, 101, 114, 110, 58, 32, 99, 111, + 109, 109, 97, 110, 100, 32, 91, 10, 123, 83, + 101, 116, 115, 32, 116, 104, 101, 32, 108, 105, + 110, 101, 32, 112, 97, 116, 116, 101, 114, 110, + 46, 32, 84, 111, 32, 100, 105, 115, 97, 98, + 108, 101, 32, 105, 116, 32, 115, 101, 116, 32, + 116, 104, 101, 32, 112, 97, 116, 116, 101, 114, + 110, 32, 98, 108, 111, 99, 107, 32, 116, 111, + 32, 78, 79, 78, 69, 46, 125, 32, 10, 99, + 111, 108, 111, 114, 32, 91, 116, 117, 112, 108, + 101, 33, 93, 32, 34, 68, 97, 115, 104, 32, + 99, 111, 108, 111, 114, 34, 32, 10, 112, 97, + 116, 116, 101, 114, 110, 32, 91, 98, 108, 111, + 99, 107, 33, 32, 110, 111, 110, 101, 33, 93, + 32, 34, 66, 108, 111, 99, 107, 32, 111, 102, + 32, 100, 97, 115, 104, 45, 115, 105, 122, 101, + 47, 115, 116, 114, 111, 107, 101, 45, 115, 105, + 122, 101, 32, 110, 117, 109, 98, 101, 114, 32, + 112, 97, 105, 114, 115, 34, 10, 93, 32, 10, + 108, 105, 110, 101, 45, 119, 105, 100, 116, 104, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 34, 83, 101, 116, 115, 32, 116, 104, + 101, 32, 108, 105, 110, 101, 32, 119, 105, 100, + 116, 104, 46, 34, 32, 10, 119, 105, 100, 116, + 104, 32, 91, 110, 117, 109, 98, 101, 114, 33, + 93, 32, 123, 90, 101, 114, 111, 44, 32, 111, + 114, 32, 110, 101, 103, 97, 116, 105, 118, 101, + 32, 118, 97, 108, 117, 101, 115, 44, 32, 112, + 114, 111, 100, 117, 99, 101, 32, 97, 32, 108, + 105, 110, 101, 45, 119, 105, 100, 116, 104, 32, + 111, 102, 32, 49, 46, 125, 32, 10, 39, 109, + 111, 100, 101, 32, 91, 119, 111, 114, 100, 33, + 93, 32, 34, 76, 105, 110, 101, 32, 119, 105, + 100, 116, 104, 32, 109, 111, 100, 101, 32, 100, + 117, 114, 105, 110, 103, 32, 115, 99, 97, 108, + 105, 110, 103, 58, 32, 70, 73, 88, 69, 68, + 32, 111, 114, 32, 86, 65, 82, 73, 65, 66, + 76, 69, 34, 10, 93, 32, 10, 105, 110, 118, + 101, 114, 116, 45, 109, 97, 116, 114, 105, 120, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 123, 65, 112, 112, 108, 105, 101, 115, + 32, 97, 110, 32, 97, 108, 103, 101, 98, 114, + 97, 105, 99, 32, 109, 97, 116, 114, 105, 120, + 32, 105, 110, 118, 101, 114, 115, 105, 111, 110, + 32, 111, 112, 101, 114, 97, 116, 105, 111, 110, + 32, 111, 110, 32, 116, 104, 101, 32, 99, 117, + 114, 114, 101, 110, 116, 32, 116, 114, 97, 110, + 115, 102, 111, 114, 109, 97, 116, 105, 111, 110, + 32, 109, 97, 116, 114, 105, 120, 46, 125, 10, + 93, 32, 10, 109, 97, 116, 114, 105, 120, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 123, 80, 114, 101, 109, 117, 108, 116, 105, + 112, 108, 105, 101, 115, 32, 116, 104, 101, 32, + 99, 117, 114, 114, 101, 110, 116, 32, 116, 114, + 97, 110, 115, 102, 111, 114, 109, 97, 116, 105, + 111, 110, 32, 109, 97, 116, 114, 105, 120, 32, + 119, 105, 116, 104, 32, 116, 104, 101, 32, 103, + 105, 118, 101, 110, 32, 98, 108, 111, 99, 107, + 46, 125, 32, 10, 109, 97, 116, 114, 105, 120, + 45, 115, 101, 116, 117, 112, 32, 91, 98, 108, + 111, 99, 107, 33, 93, 32, 34, 99, 111, 110, + 116, 101, 110, 116, 32, 109, 117, 115, 116, 32, + 98, 101, 32, 54, 32, 110, 117, 109, 98, 101, + 114, 115, 34, 10, 93, 32, 10, 112, 101, 110, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 34, 83, 101, 116, 115, 32, 116, 104, + 101, 32, 108, 105, 110, 101, 32, 112, 101, 110, + 32, 99, 111, 108, 111, 114, 46, 34, 32, 10, + 99, 111, 108, 111, 114, 32, 91, 116, 117, 112, + 108, 101, 33, 32, 105, 109, 97, 103, 101, 33, + 32, 108, 111, 103, 105, 99, 33, 93, 32, 34, + 83, 101, 116, 32, 116, 111, 32, 79, 70, 70, + 32, 116, 111, 32, 100, 105, 115, 97, 98, 108, + 101, 32, 112, 101, 110, 34, 10, 93, 32, 10, + 112, 111, 108, 121, 103, 111, 110, 58, 32, 99, + 111, 109, 109, 97, 110, 100, 32, 91, 10, 123, + 68, 114, 97, 119, 115, 32, 97, 32, 99, 108, + 111, 115, 101, 100, 32, 97, 114, 101, 97, 32, + 111, 102, 32, 108, 105, 110, 101, 32, 115, 101, + 103, 109, 101, 110, 116, 115, 46, 32, 70, 105, + 114, 115, 116, 32, 97, 110, 100, 32, 108, 97, + 115, 116, 32, 112, 111, 105, 110, 116, 115, 32, + 97, 114, 101, 32, 99, 111, 110, 110, 101, 99, + 116, 101, 100, 46, 125, 32, 10, 118, 101, 114, + 116, 105, 99, 101, 115, 32, 91, 98, 108, 111, + 99, 107, 33, 93, 32, 34, 66, 108, 111, 99, + 107, 32, 111, 102, 32, 112, 97, 105, 114, 115, + 34, 10, 93, 32, 10, 112, 117, 115, 104, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 34, 83, 116, 111, 114, 101, 115, 32, 116, + 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, + 32, 97, 116, 116, 114, 105, 98, 117, 116, 101, + 32, 115, 101, 116, 117, 112, 32, 105, 110, 32, + 115, 116, 97, 99, 107, 46, 34, 32, 10, 100, + 114, 97, 119, 45, 98, 108, 111, 99, 107, 32, + 91, 98, 108, 111, 99, 107, 33, 93, 10, 93, + 32, 10, 114, 101, 115, 101, 116, 45, 109, 97, + 116, 114, 105, 120, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 123, 82, 101, 115, + 101, 116, 115, 32, 116, 104, 101, 32, 99, 117, + 114, 114, 101, 110, 116, 32, 116, 114, 97, 110, + 115, 102, 111, 114, 109, 97, 116, 105, 111, 110, + 32, 109, 97, 116, 114, 105, 120, 32, 116, 111, + 32, 105, 116, 115, 32, 100, 101, 102, 97, 117, + 108, 116, 32, 118, 97, 108, 117, 101, 115, 46, + 125, 10, 93, 32, 10, 114, 111, 116, 97, 116, + 101, 58, 32, 99, 111, 109, 109, 97, 110, 100, + 32, 91, 10, 123, 83, 101, 116, 115, 32, 116, + 104, 101, 32, 99, 108, 111, 99, 107, 119, 105, + 115, 101, 32, 114, 111, 116, 97, 116, 105, 111, + 110, 32, 105, 110, 32, 99, 117, 114, 114, 101, + 110, 116, 32, 116, 114, 97, 110, 115, 102, 111, + 114, 109, 97, 116, 105, 111, 110, 32, 109, 97, + 116, 114, 105, 120, 46, 125, 32, 10, 97, 110, + 103, 108, 101, 32, 91, 110, 117, 109, 98, 101, + 114, 33, 93, 32, 34, 105, 110, 32, 100, 101, + 103, 114, 101, 101, 115, 34, 10, 93, 32, 10, + 115, 99, 97, 108, 101, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 123, 83, 101, + 116, 115, 32, 116, 104, 101, 32, 115, 99, 97, + 108, 105, 110, 103, 32, 102, 97, 99, 116, 111, + 114, 32, 105, 110, 32, 99, 117, 114, 114, 101, + 110, 116, 32, 116, 114, 97, 110, 115, 102, 111, + 114, 109, 97, 116, 105, 111, 110, 32, 109, 97, + 116, 114, 105, 120, 46, 125, 32, 10, 102, 97, + 99, 116, 111, 114, 32, 91, 112, 97, 105, 114, + 33, 93, 10, 93, 32, 10, 115, 104, 97, 112, + 101, 58, 32, 99, 111, 109, 109, 97, 110, 100, + 32, 91, 10, 34, 68, 114, 97, 119, 115, 32, + 115, 104, 97, 112, 101, 115, 32, 117, 115, 105, + 110, 103, 32, 116, 104, 101, 32, 83, 72, 65, + 80, 69, 32, 115, 117, 98, 45, 100, 105, 97, + 108, 101, 99, 116, 46, 34, 32, 10, 99, 111, + 109, 109, 97, 110, 100, 115, 32, 91, 98, 108, + 111, 99, 107, 33, 93, 32, 34, 66, 108, 111, + 99, 107, 32, 111, 102, 32, 83, 72, 65, 80, + 69, 32, 115, 117, 98, 45, 99, 111, 109, 109, + 97, 110, 100, 115, 34, 10, 93, 32, 10, 115, + 107, 101, 119, 58, 32, 99, 111, 109, 109, 97, + 110, 100, 32, 91, 10, 123, 83, 101, 116, 115, + 32, 97, 32, 99, 111, 111, 114, 100, 105, 110, + 97, 116, 101, 32, 115, 121, 115, 116, 101, 109, + 32, 115, 107, 101, 119, 101, 100, 32, 102, 114, + 111, 109, 32, 116, 104, 101, 32, 111, 114, 105, + 103, 105, 110, 97, 108, 32, 98, 121, 32, 116, + 104, 101, 32, 103, 105, 118, 101, 110, 32, 110, + 117, 109, 98, 101, 114, 32, 111, 102, 32, 100, + 101, 103, 114, 101, 101, 115, 32, 105, 110, 32, + 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, + 97, 120, 105, 115, 46, 125, 32, 10, 97, 110, + 103, 108, 101, 32, 91, 112, 97, 105, 114, 33, + 93, 32, 123, 80, 111, 115, 105, 116, 105, 118, + 101, 32, 110, 117, 109, 98, 101, 114, 115, 32, + 115, 107, 101, 119, 32, 116, 111, 32, 116, 104, + 101, 32, 114, 105, 103, 104, 116, 59, 32, 110, + 101, 103, 97, 116, 105, 118, 101, 32, 110, 117, + 109, 98, 101, 114, 115, 32, 115, 107, 101, 119, + 32, 116, 111, 32, 116, 104, 101, 32, 108, 101, + 102, 116, 46, 125, 10, 93, 32, 10, 115, 112, + 108, 105, 110, 101, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 123, 68, 114, 97, + 119, 115, 32, 97, 32, 99, 117, 114, 118, 101, + 32, 116, 104, 114, 111, 117, 103, 104, 32, 97, + 110, 121, 32, 110, 117, 109, 98, 101, 114, 32, + 111, 102, 32, 112, 111, 105, 110, 116, 115, 46, + 32, 84, 104, 101, 32, 115, 109, 111, 111, 116, + 104, 110, 101, 115, 115, 32, 111, 102, 32, 116, + 104, 101, 32, 99, 117, 114, 118, 101, 32, 119, + 105, 108, 108, 32, 98, 101, 32, 100, 101, 116, + 101, 114, 109, 105, 110, 101, 100, 32, 98, 121, + 32, 116, 104, 101, 32, 115, 101, 103, 109, 101, + 110, 116, 32, 102, 97, 99, 116, 111, 114, 46, + 125, 32, 10, 112, 111, 105, 110, 116, 115, 32, + 91, 98, 108, 111, 99, 107, 33, 93, 32, 34, + 66, 108, 111, 99, 107, 32, 111, 102, 32, 112, + 97, 105, 114, 115, 34, 32, 10, 115, 101, 103, + 109, 101, 110, 116, 97, 116, 105, 111, 110, 32, + 91, 105, 110, 116, 101, 103, 101, 114, 33, 93, + 32, 10, 39, 115, 112, 108, 105, 110, 101, 45, + 101, 110, 100, 105, 110, 103, 32, 91, 119, 111, + 114, 100, 33, 93, 32, 34, 76, 101, 97, 118, + 101, 32, 116, 104, 101, 32, 115, 112, 108, 105, + 110, 101, 58, 32, 79, 80, 69, 78, 69, 68, + 32, 111, 114, 32, 67, 76, 79, 83, 69, 68, + 34, 10, 93, 32, 10, 116, 101, 120, 116, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 34, 68, 114, 97, 119, 115, 32, 97, 32, + 115, 116, 114, 105, 110, 103, 32, 111, 102, 32, + 116, 101, 120, 116, 46, 34, 32, 10, 111, 102, + 102, 115, 101, 116, 32, 91, 112, 97, 105, 114, + 33, 93, 32, 34, 111, 102, 102, 115, 101, 116, + 32, 102, 114, 111, 109, 32, 119, 104, 101, 114, + 101, 32, 115, 104, 111, 117, 108, 100, 32, 116, + 104, 101, 32, 116, 101, 120, 116, 32, 98, 101, + 32, 114, 101, 110, 100, 101, 114, 101, 100, 34, + 32, 10, 115, 105, 122, 101, 32, 91, 112, 97, + 105, 114, 33, 93, 32, 34, 115, 105, 122, 101, + 32, 111, 102, 32, 116, 104, 101, 32, 116, 101, + 120, 116, 32, 97, 114, 101, 97, 34, 32, 10, + 39, 114, 101, 110, 100, 101, 114, 45, 109, 111, + 100, 101, 32, 91, 119, 111, 114, 100, 33, 93, + 32, 34, 82, 65, 83, 84, 69, 82, 32, 111, + 114, 32, 86, 69, 67, 84, 79, 82, 73, 65, + 76, 34, 32, 10, 114, 105, 99, 104, 45, 116, + 101, 120, 116, 45, 98, 108, 111, 99, 107, 32, + 91, 98, 108, 111, 99, 107, 33, 93, 10, 93, + 32, 10, 116, 114, 97, 110, 115, 102, 111, 114, + 109, 58, 32, 99, 111, 109, 109, 97, 110, 100, + 32, 91, 10, 123, 65, 112, 112, 108, 105, 101, + 115, 32, 116, 114, 97, 110, 115, 102, 111, 114, + 109, 97, 116, 105, 111, 110, 32, 115, 117, 99, + 104, 32, 97, 115, 32, 116, 114, 97, 110, 115, + 108, 97, 116, 105, 111, 110, 44, 32, 115, 99, + 97, 108, 105, 110, 103, 44, 32, 97, 110, 100, + 32, 114, 111, 116, 97, 116, 105, 111, 110, 46, + 125, 32, 10, 97, 110, 103, 108, 101, 32, 91, + 110, 117, 109, 98, 101, 114, 33, 93, 32, 10, + 99, 101, 110, 116, 101, 114, 32, 91, 112, 97, + 105, 114, 33, 93, 32, 10, 115, 99, 97, 108, + 101, 32, 91, 112, 97, 105, 114, 33, 93, 32, + 10, 116, 114, 97, 110, 115, 108, 97, 116, 105, + 111, 110, 32, 91, 112, 97, 105, 114, 33, 93, + 10, 93, 32, 10, 116, 114, 97, 110, 115, 108, + 97, 116, 101, 58, 32, 99, 111, 109, 109, 97, + 110, 100, 32, 91, 10, 123, 83, 101, 116, 115, + 32, 116, 104, 101, 32, 116, 114, 97, 110, 115, + 108, 97, 116, 105, 111, 110, 32, 105, 110, 32, + 99, 117, 114, 114, 101, 110, 116, 32, 116, 114, + 97, 110, 115, 102, 111, 114, 109, 97, 116, 105, + 111, 110, 32, 109, 97, 116, 114, 105, 120, 46, + 125, 32, 10, 111, 102, 102, 115, 101, 116, 32, + 91, 112, 97, 105, 114, 33, 93, 10, 93, 32, + 10, 116, 114, 105, 97, 110, 103, 108, 101, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 123, 68, 114, 97, 119, 115, 32, 116, 114, + 105, 97, 110, 103, 117, 108, 97, 114, 32, 112, + 111, 108, 121, 103, 111, 110, 32, 119, 105, 116, + 104, 32, 115, 104, 97, 100, 105, 110, 103, 32, + 112, 97, 114, 97, 109, 101, 116, 101, 114, 115, + 32, 40, 71, 111, 117, 114, 97, 117, 100, 32, + 115, 104, 97, 100, 105, 110, 103, 41, 46, 32, + 83, 101, 116, 32, 99, 111, 108, 111, 114, 115, + 32, 116, 111, 32, 78, 79, 78, 69, 32, 116, + 111, 32, 116, 117, 114, 110, 32, 111, 102, 32, + 115, 104, 97, 100, 105, 110, 103, 46, 125, 32, + 10, 118, 101, 114, 116, 101, 120, 45, 49, 32, + 91, 112, 97, 105, 114, 33, 93, 32, 10, 118, + 101, 114, 116, 101, 120, 45, 50, 32, 91, 112, + 97, 105, 114, 33, 93, 32, 10, 118, 101, 114, + 116, 101, 120, 45, 51, 32, 91, 112, 97, 105, + 114, 33, 93, 32, 10, 99, 111, 108, 111, 114, + 45, 49, 32, 91, 116, 117, 112, 108, 101, 33, + 32, 110, 111, 110, 101, 33, 93, 32, 10, 99, + 111, 108, 111, 114, 45, 50, 32, 91, 116, 117, + 112, 108, 101, 33, 32, 110, 111, 110, 101, 33, + 93, 32, 10, 99, 111, 108, 111, 114, 45, 51, + 32, 91, 116, 117, 112, 108, 101, 33, 32, 110, + 111, 110, 101, 33, 93, 32, 10, 100, 105, 108, + 97, 116, 105, 111, 110, 32, 91, 110, 117, 109, + 98, 101, 114, 33, 93, 32, 34, 85, 115, 101, + 102, 117, 108, 32, 102, 111, 114, 32, 101, 108, + 105, 109, 105, 110, 97, 116, 105, 110, 103, 32, + 97, 110, 105, 116, 97, 108, 105, 97, 115, 101, + 100, 32, 101, 100, 103, 101, 115, 34, 10, 93, + 10, 0, +}; + +#endif diff --git a/src/include/host-ext-graphics.h b/src/include/host-ext-graphics.h new file mode 100644 index 0000000..3f5b8c8 --- /dev/null +++ b/src/include/host-ext-graphics.h @@ -0,0 +1,528 @@ +/*********************************************************************** +** +** REBOL 3.0 "Invasion" +** Copyright 2010 REBOL Technologies +** All rights reserved. +** +************************************************************************ +** +** Title: REBOL Graphics +** Build: A105 +** Date: 1-Sep-2010 +** File: host-ext-graphics +** +** AUTO-GENERATED FILE - Do not modify. (From: make-host-ext.r) +** +***********************************************************************/ + +enum graphics_commands { + CMD_GRAPHICS_INIT, + CMD_GRAPHICS_CARET_TO_OFFSET, + CMD_GRAPHICS_CURSOR, + CMD_GRAPHICS_OFFSET_TO_CARET, + CMD_GRAPHICS_SHOW, + CMD_GRAPHICS_SIZE_TEXT, + CMD_GRAPHICS_DRAW, + CMD_GRAPHICS_VIEW, + CMD_GRAPHICS_UNVIEW, + CMD_GRAPHICS_HANDLE_EVENTS, + CMD_GRAPHICS_UNHANDLE_EVENTS, + CMD_GRAPHICS_HANDLED_EVENTSQ, + CMD_GRAPHICS_DO_EVENTS, + CMD_GRAPHICS_INIT_VIEW_SYSTEM, +}; + +#ifdef INCLUDE_EXT_DATA +const unsigned char RX_graphics[] = { + 82, 69, 66, 79, 76, 32, 91, 10, 84, 105, + 116, 108, 101, 58, 32, 34, 82, 69, 66, 79, + 76, 32, 71, 114, 97, 112, 104, 105, 99, 115, + 34, 32, 10, 78, 97, 109, 101, 58, 32, 103, + 114, 97, 112, 104, 105, 99, 115, 32, 10, 84, + 121, 112, 101, 58, 32, 101, 120, 116, 101, 110, + 115, 105, 111, 110, 32, 10, 69, 120, 112, 111, + 114, 116, 115, 58, 32, 91, 10, 105, 110, 105, + 116, 32, 10, 99, 97, 114, 101, 116, 45, 116, + 111, 45, 111, 102, 102, 115, 101, 116, 32, 10, + 99, 117, 114, 115, 111, 114, 32, 10, 111, 102, + 102, 115, 101, 116, 45, 116, 111, 45, 99, 97, + 114, 101, 116, 32, 10, 115, 104, 111, 119, 32, + 10, 115, 105, 122, 101, 45, 116, 101, 120, 116, + 32, 10, 100, 114, 97, 119, 32, 10, 118, 105, + 101, 119, 32, 10, 117, 110, 118, 105, 101, 119, + 32, 10, 104, 97, 110, 100, 108, 101, 45, 101, + 118, 101, 110, 116, 115, 32, 10, 117, 110, 104, + 97, 110, 100, 108, 101, 45, 101, 118, 101, 110, + 116, 115, 32, 10, 104, 97, 110, 100, 108, 101, + 100, 45, 101, 118, 101, 110, 116, 115, 63, 32, + 10, 100, 111, 45, 101, 118, 101, 110, 116, 115, + 32, 10, 105, 110, 105, 116, 45, 118, 105, 101, + 119, 45, 115, 121, 115, 116, 101, 109, 10, 93, + 10, 93, 32, 10, 105, 110, 105, 116, 58, 32, + 99, 111, 109, 109, 97, 110, 100, 32, 91, 10, + 34, 73, 110, 105, 116, 105, 97, 108, 105, 122, + 101, 32, 103, 114, 97, 112, 104, 105, 99, 115, + 32, 115, 117, 98, 115, 121, 115, 116, 101, 109, + 46, 34, 32, 10, 103, 111, 98, 32, 91, 103, + 111, 98, 33, 93, 32, 34, 84, 104, 101, 32, + 115, 99, 114, 101, 101, 110, 32, 103, 111, 98, + 32, 40, 114, 111, 111, 116, 32, 103, 111, 98, + 41, 34, 10, 93, 32, 10, 99, 97, 114, 101, + 116, 45, 116, 111, 45, 111, 102, 102, 115, 101, + 116, 58, 32, 99, 111, 109, 109, 97, 110, 100, + 32, 91, 10, 123, 82, 101, 116, 117, 114, 110, + 115, 32, 116, 104, 101, 32, 120, 121, 32, 111, + 102, 102, 115, 101, 116, 32, 40, 112, 97, 105, + 114, 41, 32, 102, 111, 114, 32, 97, 32, 115, + 112, 101, 99, 105, 102, 105, 99, 32, 115, 116, + 114, 105, 110, 103, 32, 112, 111, 115, 105, 116, + 105, 111, 110, 32, 105, 110, 32, 97, 32, 103, + 114, 97, 112, 104, 105, 99, 115, 32, 111, 98, + 106, 101, 99, 116, 46, 125, 32, 10, 103, 111, + 98, 32, 91, 103, 111, 98, 33, 93, 32, 10, + 101, 108, 101, 109, 101, 110, 116, 32, 91, 105, + 110, 116, 101, 103, 101, 114, 33, 32, 98, 108, + 111, 99, 107, 33, 93, 32, 34, 84, 104, 101, + 32, 112, 111, 115, 105, 116, 105, 111, 110, 32, + 111, 102, 32, 116, 104, 101, 32, 115, 116, 114, + 105, 110, 103, 32, 105, 110, 32, 116, 104, 101, + 32, 114, 105, 99, 104, 116, 101, 120, 116, 32, + 98, 108, 111, 99, 107, 34, 32, 10, 112, 111, + 115, 105, 116, 105, 111, 110, 32, 91, 105, 110, + 116, 101, 103, 101, 114, 33, 32, 115, 116, 114, + 105, 110, 103, 33, 93, 32, 34, 84, 104, 101, + 32, 112, 111, 115, 105, 116, 105, 111, 110, 32, + 119, 105, 116, 104, 105, 110, 32, 116, 104, 101, + 32, 115, 116, 114, 105, 110, 103, 34, 10, 93, + 32, 10, 99, 117, 114, 115, 111, 114, 58, 32, + 99, 111, 109, 109, 97, 110, 100, 32, 91, 10, + 34, 67, 104, 97, 110, 103, 101, 115, 32, 116, + 104, 101, 32, 109, 111, 117, 115, 101, 32, 99, + 117, 114, 115, 111, 114, 32, 105, 109, 97, 103, + 101, 46, 34, 32, 10, 105, 109, 97, 103, 101, + 32, 91, 105, 110, 116, 101, 103, 101, 114, 33, + 32, 105, 109, 97, 103, 101, 33, 32, 110, 111, + 110, 101, 33, 93, 10, 93, 32, 10, 111, 102, + 102, 115, 101, 116, 45, 116, 111, 45, 99, 97, + 114, 101, 116, 58, 32, 99, 111, 109, 109, 97, + 110, 100, 32, 91, 10, 123, 82, 101, 116, 117, + 114, 110, 115, 32, 116, 104, 101, 32, 114, 105, + 99, 104, 116, 101, 120, 116, 32, 98, 108, 111, + 99, 107, 32, 97, 116, 32, 116, 104, 101, 32, + 115, 116, 114, 105, 110, 103, 32, 112, 111, 115, + 105, 116, 105, 111, 110, 32, 102, 111, 114, 32, + 97, 110, 32, 88, 89, 32, 111, 102, 102, 115, + 101, 116, 32, 105, 110, 32, 116, 104, 101, 32, + 103, 114, 97, 112, 104, 105, 99, 115, 32, 111, + 98, 106, 101, 99, 116, 46, 125, 32, 10, 103, + 111, 98, 32, 91, 103, 111, 98, 33, 93, 32, + 10, 112, 111, 115, 105, 116, 105, 111, 110, 32, + 91, 112, 97, 105, 114, 33, 93, 10, 93, 32, + 10, 115, 104, 111, 119, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 123, 68, 105, + 115, 112, 108, 97, 121, 32, 111, 114, 32, 117, + 112, 100, 97, 116, 101, 32, 97, 32, 103, 114, + 97, 112, 104, 105, 99, 97, 108, 32, 111, 98, + 106, 101, 99, 116, 32, 111, 114, 32, 98, 108, + 111, 99, 107, 32, 111, 102, 32, 116, 104, 101, + 109, 46, 125, 32, 10, 103, 111, 98, 32, 91, + 103, 111, 98, 33, 32, 110, 111, 110, 101, 33, + 93, 10, 93, 32, 10, 115, 105, 122, 101, 45, + 116, 101, 120, 116, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 123, 82, 101, 116, + 117, 114, 110, 115, 32, 116, 104, 101, 32, 115, + 105, 122, 101, 32, 111, 102, 32, 116, 101, 120, + 116, 32, 114, 101, 110, 100, 101, 114, 101, 100, + 32, 98, 121, 32, 97, 32, 103, 114, 97, 112, + 104, 105, 99, 115, 32, 111, 98, 106, 101, 99, + 116, 46, 125, 32, 10, 103, 111, 98, 32, 91, + 103, 111, 98, 33, 93, 10, 93, 32, 10, 100, + 114, 97, 119, 58, 32, 99, 111, 109, 109, 97, + 110, 100, 32, 91, 10, 123, 82, 101, 110, 100, + 101, 114, 115, 32, 100, 114, 97, 119, 32, 100, + 105, 97, 108, 101, 99, 116, 32, 40, 115, 99, + 97, 108, 97, 98, 108, 101, 32, 118, 101, 99, + 116, 111, 114, 32, 103, 114, 97, 112, 104, 105, + 99, 115, 41, 32, 116, 111, 32, 97, 110, 32, + 105, 109, 97, 103, 101, 32, 40, 114, 101, 116, + 117, 114, 110, 101, 100, 41, 46, 125, 32, 10, + 105, 109, 97, 103, 101, 32, 91, 105, 109, 97, + 103, 101, 33, 32, 112, 97, 105, 114, 33, 93, + 32, 34, 73, 109, 97, 103, 101, 32, 111, 114, + 32, 115, 105, 122, 101, 32, 111, 102, 32, 105, + 109, 97, 103, 101, 34, 32, 10, 99, 111, 109, + 109, 97, 110, 100, 115, 32, 91, 98, 108, 111, + 99, 107, 33, 93, 32, 34, 68, 114, 97, 119, + 32, 99, 111, 109, 109, 97, 110, 100, 115, 34, + 10, 93, 32, 10, 115, 121, 115, 116, 101, 109, + 47, 115, 116, 97, 110, 100, 97, 114, 100, 47, + 102, 111, 110, 116, 58, 32, 99, 111, 110, 116, + 101, 120, 116, 32, 91, 10, 110, 97, 109, 101, + 58, 32, 34, 97, 114, 105, 97, 108, 34, 32, + 10, 115, 116, 121, 108, 101, 58, 32, 110, 111, + 110, 101, 32, 10, 115, 105, 122, 101, 58, 32, + 49, 50, 32, 10, 99, 111, 108, 111, 114, 58, + 32, 48, 46, 48, 46, 48, 32, 10, 111, 102, + 102, 115, 101, 116, 58, 32, 50, 120, 50, 32, + 10, 115, 112, 97, 99, 101, 58, 32, 48, 120, + 48, 32, 10, 115, 104, 97, 100, 111, 119, 58, + 32, 110, 111, 110, 101, 10, 93, 32, 10, 115, + 121, 115, 116, 101, 109, 47, 115, 116, 97, 110, + 100, 97, 114, 100, 47, 112, 97, 114, 97, 58, + 32, 99, 111, 110, 116, 101, 120, 116, 32, 91, + 10, 111, 114, 105, 103, 105, 110, 58, 32, 50, + 120, 50, 32, 10, 109, 97, 114, 103, 105, 110, + 58, 32, 50, 120, 50, 32, 10, 105, 110, 100, + 101, 110, 116, 58, 32, 48, 120, 48, 32, 10, + 116, 97, 98, 115, 58, 32, 52, 48, 32, 10, + 119, 114, 97, 112, 63, 58, 32, 116, 114, 117, + 101, 32, 10, 115, 99, 114, 111, 108, 108, 58, + 32, 48, 120, 48, 32, 10, 97, 108, 105, 103, + 110, 58, 32, 39, 108, 101, 102, 116, 32, 10, + 118, 97, 108, 105, 103, 110, 58, 32, 39, 116, + 111, 112, 10, 93, 32, 10, 118, 105, 101, 119, + 58, 32, 102, 117, 110, 99, 32, 91, 10, 34, + 68, 105, 115, 112, 108, 97, 121, 115, 32, 97, + 32, 119, 105, 110, 100, 111, 119, 32, 118, 105, + 101, 119, 46, 34, 32, 10, 119, 105, 110, 100, + 111, 119, 32, 91, 103, 111, 98, 33, 32, 98, + 108, 111, 99, 107, 33, 32, 111, 98, 106, 101, + 99, 116, 33, 93, 32, 34, 87, 105, 110, 100, + 111, 119, 32, 103, 111, 98, 44, 32, 86, 73, + 68, 32, 102, 97, 99, 101, 44, 32, 111, 114, + 32, 86, 73, 68, 32, 108, 97, 121, 111, 117, + 116, 32, 98, 108, 111, 99, 107, 34, 32, 10, + 47, 111, 112, 116, 105, 111, 110, 115, 32, 111, + 112, 116, 115, 32, 91, 98, 108, 111, 99, 107, + 33, 93, 32, 34, 87, 105, 110, 100, 111, 119, + 32, 111, 112, 116, 105, 111, 110, 115, 32, 115, + 112, 101, 99, 32, 98, 108, 111, 99, 107, 34, + 32, 10, 47, 110, 111, 45, 119, 97, 105, 116, + 32, 123, 82, 101, 116, 117, 114, 110, 32, 105, + 109, 109, 101, 100, 105, 97, 116, 101, 108, 121, + 46, 32, 68, 111, 32, 110, 111, 116, 32, 119, + 97, 105, 116, 32, 97, 110, 100, 32, 112, 114, + 111, 99, 101, 115, 115, 32, 101, 118, 101, 110, + 116, 115, 46, 125, 32, 10, 47, 97, 115, 45, + 105, 115, 32, 34, 76, 101, 97, 118, 101, 32, + 119, 105, 110, 100, 111, 119, 32, 97, 115, 32, + 105, 115, 46, 32, 68, 111, 32, 110, 111, 116, + 32, 97, 100, 100, 32, 97, 32, 112, 97, 114, + 101, 110, 116, 32, 103, 111, 98, 46, 34, 32, + 10, 47, 108, 111, 99, 97, 108, 32, 115, 99, + 114, 101, 101, 110, 32, 116, 109, 112, 32, 120, + 121, 10, 93, 32, 91, 10, 105, 102, 32, 110, + 111, 116, 32, 115, 99, 114, 101, 101, 110, 58, + 32, 115, 121, 115, 116, 101, 109, 47, 118, 105, + 101, 119, 47, 115, 99, 114, 101, 101, 110, 45, + 103, 111, 98, 32, 91, 114, 101, 116, 117, 114, + 110, 32, 110, 111, 110, 101, 93, 32, 10, 111, + 112, 116, 115, 58, 32, 109, 97, 107, 101, 32, + 109, 97, 112, 33, 32, 97, 110, 121, 32, 91, + 114, 101, 100, 117, 99, 101, 47, 110, 111, 45, + 115, 101, 116, 32, 111, 112, 116, 115, 32, 91, + 93, 93, 32, 10, 99, 97, 115, 101, 47, 97, + 108, 108, 32, 91, 10, 110, 111, 45, 119, 97, + 105, 116, 32, 91, 111, 112, 116, 115, 47, 110, + 111, 45, 119, 97, 105, 116, 58, 32, 116, 114, + 117, 101, 93, 32, 10, 97, 115, 45, 105, 115, + 32, 91, 111, 112, 116, 115, 47, 97, 115, 45, + 105, 115, 58, 32, 116, 114, 117, 101, 93, 10, + 93, 32, 10, 105, 102, 32, 103, 111, 98, 63, + 32, 119, 105, 110, 100, 111, 119, 32, 91, 10, + 117, 110, 108, 101, 115, 115, 32, 111, 112, 116, + 115, 47, 97, 115, 45, 105, 115, 32, 91, 10, + 116, 109, 112, 58, 32, 119, 105, 110, 100, 111, + 119, 32, 10, 116, 109, 112, 47, 111, 102, 102, + 115, 101, 116, 58, 32, 48, 120, 48, 32, 10, + 119, 105, 110, 100, 111, 119, 58, 32, 109, 97, + 107, 101, 32, 103, 111, 98, 33, 32, 91, 115, + 105, 122, 101, 58, 32, 116, 109, 112, 47, 115, + 105, 122, 101, 93, 32, 10, 97, 112, 112, 101, + 110, 100, 32, 119, 105, 110, 100, 111, 119, 32, + 116, 109, 112, 10, 93, 32, 10, 105, 102, 32, + 97, 110, 121, 32, 91, 111, 112, 116, 115, 47, + 99, 111, 108, 111, 114, 32, 111, 112, 116, 115, + 47, 100, 114, 97, 119, 93, 32, 91, 10, 105, + 110, 115, 101, 114, 116, 32, 119, 105, 110, 100, + 111, 119, 32, 109, 97, 107, 101, 32, 103, 111, + 98, 33, 32, 97, 112, 112, 101, 110, 100, 32, + 99, 111, 112, 121, 32, 91, 10, 115, 105, 122, + 101, 58, 32, 119, 105, 110, 100, 111, 119, 47, + 115, 105, 122, 101, 32, 10, 111, 102, 102, 115, + 101, 116, 58, 32, 48, 120, 48, 10, 93, 32, + 112, 105, 99, 107, 32, 91, 10, 91, 100, 114, + 97, 119, 58, 32, 111, 112, 116, 115, 47, 100, + 114, 97, 119, 93, 32, 10, 91, 99, 111, 108, + 111, 114, 58, 32, 111, 112, 116, 115, 47, 99, + 111, 108, 111, 114, 93, 10, 93, 32, 98, 108, + 111, 99, 107, 63, 32, 111, 112, 116, 115, 47, + 100, 114, 97, 119, 10, 93, 32, 10, 117, 110, + 108, 101, 115, 115, 32, 111, 112, 116, 115, 47, + 104, 97, 110, 100, 108, 101, 114, 32, 91, 10, + 104, 97, 110, 100, 108, 101, 45, 101, 118, 101, + 110, 116, 115, 32, 91, 10, 110, 97, 109, 101, + 58, 32, 39, 118, 105, 101, 119, 45, 100, 101, + 102, 97, 117, 108, 116, 32, 10, 112, 114, 105, + 111, 114, 105, 116, 121, 58, 32, 53, 48, 32, + 10, 104, 97, 110, 100, 108, 101, 114, 58, 32, + 102, 117, 110, 99, 32, 91, 101, 118, 101, 110, + 116, 93, 32, 91, 10, 112, 114, 105, 110, 116, + 32, 91, 34, 118, 105, 101, 119, 45, 101, 118, + 101, 110, 116, 58, 34, 32, 101, 118, 101, 110, + 116, 47, 116, 121, 112, 101, 32, 101, 118, 101, + 110, 116, 47, 111, 102, 102, 115, 101, 116, 93, + 32, 10, 105, 102, 32, 115, 119, 105, 116, 99, + 104, 32, 101, 118, 101, 110, 116, 47, 116, 121, + 112, 101, 32, 91, 10, 99, 108, 111, 115, 101, + 32, 91, 116, 114, 117, 101, 93, 32, 10, 107, + 101, 121, 32, 91, 101, 118, 101, 110, 116, 47, + 107, 101, 121, 32, 61, 32, 101, 115, 99, 97, + 112, 101, 93, 10, 93, 32, 91, 10, 117, 110, + 104, 97, 110, 100, 108, 101, 45, 101, 118, 101, + 110, 116, 115, 32, 115, 101, 108, 102, 32, 10, + 117, 110, 118, 105, 101, 119, 32, 101, 118, 101, + 110, 116, 47, 119, 105, 110, 100, 111, 119, 32, + 10, 113, 117, 105, 116, 10, 93, 32, 10, 115, + 104, 111, 119, 32, 101, 118, 101, 110, 116, 47, + 119, 105, 110, 100, 111, 119, 32, 10, 110, 111, + 110, 101, 10, 93, 10, 93, 10, 93, 10, 93, + 32, 10, 105, 102, 32, 98, 108, 111, 99, 107, + 63, 32, 119, 105, 110, 100, 111, 119, 32, 91, + 10, 119, 105, 110, 100, 111, 119, 58, 32, 108, + 97, 121, 111, 117, 116, 47, 98, 97, 99, 107, + 103, 114, 111, 117, 110, 100, 32, 119, 105, 110, + 100, 111, 119, 32, 97, 110, 121, 32, 91, 111, + 112, 116, 115, 47, 100, 114, 97, 119, 32, 111, + 112, 116, 115, 47, 99, 111, 108, 111, 114, 93, + 10, 93, 32, 10, 105, 102, 32, 111, 98, 106, + 101, 99, 116, 63, 32, 119, 105, 110, 100, 111, + 119, 32, 91, 10, 119, 105, 110, 100, 111, 119, + 58, 32, 97, 112, 112, 101, 110, 100, 32, 109, + 97, 107, 101, 32, 103, 111, 98, 33, 32, 91, + 10, 100, 97, 116, 97, 58, 32, 119, 105, 110, + 100, 111, 119, 32, 10, 115, 105, 122, 101, 58, + 32, 119, 105, 110, 100, 111, 119, 47, 115, 105, + 122, 101, 10, 93, 32, 119, 105, 110, 100, 111, + 119, 47, 103, 111, 98, 32, 10, 119, 105, 110, + 100, 111, 119, 47, 102, 108, 97, 103, 115, 58, + 32, 91, 114, 101, 115, 105, 122, 101, 93, 10, + 93, 32, 10, 119, 105, 110, 100, 111, 119, 47, + 116, 101, 120, 116, 58, 32, 97, 110, 121, 32, + 91, 111, 112, 116, 115, 47, 116, 105, 116, 108, + 101, 32, 119, 105, 110, 100, 111, 119, 47, 116, + 101, 120, 116, 32, 34, 82, 69, 66, 79, 76, + 58, 32, 117, 110, 116, 105, 116, 108, 101, 100, + 34, 93, 32, 10, 105, 102, 32, 111, 112, 116, + 115, 47, 111, 102, 102, 115, 101, 116, 32, 91, + 10, 105, 102, 32, 119, 111, 114, 100, 63, 32, + 111, 112, 116, 115, 47, 111, 102, 102, 115, 101, + 116, 32, 91, 10, 111, 112, 116, 115, 47, 111, + 102, 102, 115, 101, 116, 58, 32, 101, 105, 116, + 104, 101, 114, 32, 111, 112, 116, 115, 47, 111, + 102, 102, 115, 101, 116, 32, 61, 32, 39, 99, + 101, 110, 116, 101, 114, 32, 91, 115, 99, 114, + 101, 101, 110, 47, 115, 105, 122, 101, 32, 45, + 32, 119, 105, 110, 100, 111, 119, 47, 115, 105, + 122, 101, 32, 47, 32, 50, 93, 32, 91, 49, + 48, 48, 120, 49, 48, 48, 93, 10, 93, 32, + 10, 119, 105, 110, 100, 111, 119, 47, 111, 102, + 102, 115, 101, 116, 58, 32, 111, 112, 116, 115, + 47, 111, 102, 102, 115, 101, 116, 10, 93, 32, + 10, 105, 102, 32, 111, 112, 116, 115, 47, 111, + 119, 110, 101, 114, 32, 91, 119, 105, 110, 100, + 111, 119, 47, 111, 119, 110, 101, 114, 58, 32, + 111, 112, 116, 115, 47, 111, 119, 110, 101, 114, + 93, 32, 10, 105, 102, 32, 111, 112, 116, 115, + 47, 102, 108, 97, 103, 115, 32, 91, 119, 105, + 110, 100, 111, 119, 47, 102, 108, 97, 103, 115, + 58, 32, 111, 112, 116, 115, 47, 102, 108, 97, + 103, 115, 93, 32, 10, 105, 102, 32, 111, 112, + 116, 115, 47, 104, 97, 110, 100, 108, 101, 114, + 32, 91, 104, 97, 110, 100, 108, 101, 45, 101, + 118, 101, 110, 116, 115, 32, 111, 112, 116, 115, + 47, 104, 97, 110, 100, 108, 101, 114, 93, 32, + 10, 117, 110, 108, 101, 115, 115, 32, 119, 105, + 110, 100, 111, 119, 32, 61, 32, 115, 99, 114, + 101, 101, 110, 32, 91, 97, 112, 112, 101, 110, + 100, 32, 115, 99, 114, 101, 101, 110, 32, 119, + 105, 110, 100, 111, 119, 93, 32, 10, 115, 104, + 111, 119, 32, 119, 105, 110, 100, 111, 119, 32, + 10, 105, 102, 32, 97, 108, 108, 32, 91, 10, + 110, 111, 116, 32, 111, 112, 116, 115, 47, 110, + 111, 45, 119, 97, 105, 116, 32, 49, 32, 61, + 32, 108, 101, 110, 103, 116, 104, 63, 32, 115, + 99, 114, 101, 101, 110, 10, 93, 32, 91, 10, + 100, 111, 45, 101, 118, 101, 110, 116, 115, 10, + 93, 32, 10, 119, 105, 110, 100, 111, 119, 10, + 93, 32, 10, 117, 110, 118, 105, 101, 119, 58, + 32, 102, 117, 110, 99, 32, 91, 10, 34, 67, + 108, 111, 115, 101, 115, 32, 97, 32, 119, 105, + 110, 100, 111, 119, 32, 118, 105, 101, 119, 46, + 34, 32, 10, 119, 105, 110, 100, 111, 119, 32, + 91, 111, 98, 106, 101, 99, 116, 33, 32, 103, + 111, 98, 33, 32, 119, 111, 114, 100, 33, 32, + 110, 111, 110, 101, 33, 93, 32, 34, 87, 105, + 110, 100, 111, 119, 32, 102, 97, 99, 101, 32, + 111, 114, 32, 71, 79, 66, 46, 32, 39, 97, + 108, 108, 32, 102, 111, 114, 32, 97, 108, 108, + 46, 32, 110, 111, 110, 101, 32, 102, 111, 114, + 32, 108, 97, 115, 116, 34, 32, 10, 47, 108, + 111, 99, 97, 108, 32, 115, 99, 114, 101, 101, + 110, 10, 93, 32, 91, 10, 115, 99, 114, 101, + 101, 110, 58, 32, 115, 121, 115, 116, 101, 109, + 47, 118, 105, 101, 119, 47, 115, 99, 114, 101, + 101, 110, 45, 103, 111, 98, 32, 10, 99, 97, + 115, 101, 32, 91, 10, 111, 98, 106, 101, 99, + 116, 63, 32, 119, 105, 110, 100, 111, 119, 32, + 91, 119, 105, 110, 100, 111, 119, 58, 32, 119, + 105, 110, 100, 111, 119, 47, 103, 111, 98, 47, + 112, 97, 114, 101, 110, 116, 93, 32, 10, 119, + 105, 110, 100, 111, 119, 32, 61, 32, 39, 97, + 108, 108, 32, 91, 115, 104, 111, 119, 32, 99, + 108, 101, 97, 114, 32, 115, 99, 114, 101, 101, + 110, 32, 101, 120, 105, 116, 93, 32, 10, 110, + 111, 116, 32, 119, 105, 110, 100, 111, 119, 32, + 91, 119, 105, 110, 100, 111, 119, 58, 32, 108, + 97, 115, 116, 32, 115, 99, 114, 101, 101, 110, + 93, 10, 93, 32, 10, 114, 101, 109, 111, 118, + 101, 32, 102, 105, 110, 100, 32, 115, 99, 114, + 101, 101, 110, 32, 119, 105, 110, 100, 111, 119, + 32, 10, 115, 104, 111, 119, 32, 119, 105, 110, + 100, 111, 119, 10, 93, 32, 10, 98, 97, 115, + 101, 45, 104, 97, 110, 100, 108, 101, 114, 58, + 32, 99, 111, 110, 116, 101, 120, 116, 32, 91, + 10, 110, 97, 109, 101, 58, 32, 39, 110, 111, + 45, 110, 97, 109, 101, 32, 10, 112, 114, 105, + 111, 114, 105, 116, 121, 58, 32, 48, 10, 93, + 32, 10, 104, 97, 110, 100, 108, 101, 45, 101, + 118, 101, 110, 116, 115, 58, 32, 102, 117, 110, + 99, 32, 91, 10, 34, 65, 100, 100, 115, 32, + 97, 32, 104, 97, 110, 100, 108, 101, 114, 32, + 116, 111, 32, 116, 104, 101, 32, 118, 105, 101, + 119, 32, 101, 118, 101, 110, 116, 32, 115, 121, + 115, 116, 101, 109, 46, 34, 32, 10, 104, 97, + 110, 100, 108, 101, 114, 32, 91, 98, 108, 111, + 99, 107, 33, 93, 32, 10, 47, 108, 111, 99, + 97, 108, 32, 115, 121, 115, 45, 104, 97, 110, + 100, 10, 93, 32, 91, 10, 104, 97, 110, 100, + 108, 101, 114, 58, 32, 109, 97, 107, 101, 32, + 98, 97, 115, 101, 45, 104, 97, 110, 100, 108, + 101, 114, 32, 104, 97, 110, 100, 108, 101, 114, + 32, 10, 115, 121, 115, 45, 104, 97, 110, 100, + 58, 32, 115, 121, 115, 116, 101, 109, 47, 118, + 105, 101, 119, 47, 101, 118, 101, 110, 116, 45, + 112, 111, 114, 116, 47, 108, 111, 99, 97, 108, + 115, 47, 104, 97, 110, 100, 108, 101, 114, 115, + 32, 10, 117, 110, 108, 101, 115, 115, 32, 102, + 111, 114, 101, 97, 99, 104, 32, 91, 104, 101, + 114, 101, 58, 32, 104, 97, 110, 100, 93, 32, + 115, 121, 115, 45, 104, 97, 110, 100, 32, 91, + 10, 105, 102, 32, 104, 97, 110, 100, 108, 101, + 114, 47, 112, 114, 105, 111, 114, 105, 116, 121, + 32, 62, 32, 104, 97, 110, 100, 47, 112, 114, + 105, 111, 114, 105, 116, 121, 32, 91, 10, 105, + 110, 115, 101, 114, 116, 32, 104, 101, 114, 101, + 32, 104, 97, 110, 100, 108, 101, 114, 32, 10, + 98, 114, 101, 97, 107, 47, 114, 101, 116, 117, + 114, 110, 32, 116, 114, 117, 101, 10, 93, 10, + 93, 32, 91, 10, 97, 112, 112, 101, 110, 100, + 32, 115, 121, 115, 45, 104, 97, 110, 100, 32, + 104, 97, 110, 100, 108, 101, 114, 10, 93, 32, + 10, 104, 97, 110, 100, 108, 101, 114, 10, 93, + 32, 10, 117, 110, 104, 97, 110, 100, 108, 101, + 45, 101, 118, 101, 110, 116, 115, 58, 32, 102, + 117, 110, 99, 32, 91, 10, 34, 82, 101, 109, + 111, 118, 101, 115, 32, 97, 32, 104, 97, 110, + 100, 108, 101, 114, 32, 102, 114, 111, 109, 32, + 116, 104, 101, 32, 118, 105, 101, 119, 32, 101, + 118, 101, 110, 116, 32, 115, 121, 115, 116, 101, + 109, 46, 34, 32, 10, 104, 97, 110, 100, 108, + 101, 114, 32, 91, 111, 98, 106, 101, 99, 116, + 33, 93, 10, 93, 32, 91, 10, 114, 101, 109, + 111, 118, 101, 32, 102, 105, 110, 100, 32, 115, + 121, 115, 116, 101, 109, 47, 118, 105, 101, 119, + 47, 101, 118, 101, 110, 116, 45, 112, 111, 114, + 116, 47, 108, 111, 99, 97, 108, 115, 47, 104, + 97, 110, 100, 108, 101, 114, 115, 32, 104, 97, + 110, 100, 108, 101, 114, 32, 10, 101, 120, 105, + 116, 10, 93, 32, 10, 104, 97, 110, 100, 108, + 101, 100, 45, 101, 118, 101, 110, 116, 115, 63, + 58, 32, 102, 117, 110, 99, 32, 91, 10, 123, + 82, 101, 116, 117, 114, 110, 115, 32, 101, 118, + 101, 110, 116, 32, 104, 97, 110, 100, 108, 101, + 114, 32, 111, 98, 106, 101, 99, 116, 32, 109, + 97, 116, 99, 104, 105, 110, 103, 32, 97, 32, + 103, 105, 118, 101, 110, 32, 110, 97, 109, 101, + 46, 125, 32, 10, 110, 97, 109, 101, 10, 93, + 32, 91, 10, 102, 111, 114, 101, 97, 99, 104, + 32, 104, 97, 110, 100, 32, 115, 121, 115, 116, + 101, 109, 47, 118, 105, 101, 119, 47, 101, 118, + 101, 110, 116, 45, 112, 111, 114, 116, 47, 108, + 111, 99, 97, 108, 115, 47, 104, 97, 110, 100, + 108, 101, 114, 115, 32, 91, 10, 105, 102, 32, + 104, 97, 110, 100, 47, 110, 97, 109, 101, 32, + 61, 32, 110, 97, 109, 101, 32, 91, 114, 101, + 116, 117, 114, 110, 32, 104, 97, 110, 100, 93, + 10, 93, 32, 10, 110, 111, 110, 101, 10, 93, + 32, 10, 100, 111, 45, 101, 118, 101, 110, 116, + 115, 58, 32, 102, 117, 110, 99, 32, 91, 10, + 123, 87, 97, 105, 116, 115, 32, 102, 111, 114, + 32, 119, 105, 110, 100, 111, 119, 32, 101, 118, + 101, 110, 116, 115, 46, 32, 82, 101, 116, 117, + 114, 110, 115, 32, 119, 104, 101, 110, 32, 97, + 108, 108, 32, 119, 105, 110, 100, 111, 119, 115, + 32, 97, 114, 101, 32, 99, 108, 111, 115, 101, + 100, 46, 125, 10, 93, 32, 91, 10, 119, 97, + 105, 116, 32, 115, 121, 115, 116, 101, 109, 47, + 118, 105, 101, 119, 47, 101, 118, 101, 110, 116, + 45, 112, 111, 114, 116, 10, 93, 32, 10, 105, + 110, 105, 116, 45, 118, 105, 101, 119, 45, 115, + 121, 115, 116, 101, 109, 58, 32, 102, 117, 110, + 99, 32, 91, 10, 34, 73, 110, 105, 116, 105, + 97, 108, 105, 122, 101, 32, 116, 104, 101, 32, + 86, 105, 101, 119, 32, 115, 117, 98, 115, 121, + 115, 116, 101, 109, 46, 34, 32, 10, 47, 108, + 111, 99, 97, 108, 32, 101, 112, 10, 93, 32, + 91, 10, 105, 110, 105, 116, 32, 115, 121, 115, + 116, 101, 109, 47, 118, 105, 101, 119, 47, 115, + 99, 114, 101, 101, 110, 45, 103, 111, 98, 58, + 32, 109, 97, 107, 101, 32, 103, 111, 98, 33, + 32, 91, 116, 101, 120, 116, 58, 32, 34, 84, + 111, 112, 32, 71, 111, 98, 34, 93, 32, 10, + 105, 102, 32, 115, 121, 115, 116, 101, 109, 47, + 118, 105, 101, 119, 47, 101, 118, 101, 110, 116, + 45, 112, 111, 114, 116, 32, 91, 101, 120, 105, + 116, 93, 32, 10, 101, 112, 58, 32, 111, 112, + 101, 110, 32, 91, 115, 99, 104, 101, 109, 101, + 58, 32, 39, 101, 118, 101, 110, 116, 93, 32, + 10, 115, 121, 115, 116, 101, 109, 47, 118, 105, + 101, 119, 47, 101, 118, 101, 110, 116, 45, 112, + 111, 114, 116, 58, 32, 101, 112, 32, 10, 101, + 112, 47, 108, 111, 99, 97, 108, 115, 58, 32, + 99, 111, 110, 116, 101, 120, 116, 32, 91, 104, + 97, 110, 100, 108, 101, 114, 115, 58, 32, 99, + 111, 112, 121, 32, 91, 93, 93, 32, 10, 101, + 112, 47, 97, 119, 97, 107, 101, 58, 32, 102, + 117, 110, 99, 32, 91, 101, 118, 101, 110, 116, + 32, 47, 108, 111, 99, 97, 108, 32, 104, 93, + 32, 91, 10, 104, 58, 32, 101, 118, 101, 110, + 116, 47, 112, 111, 114, 116, 47, 108, 111, 99, + 97, 108, 115, 47, 104, 97, 110, 100, 108, 101, + 114, 115, 32, 10, 119, 104, 105, 108, 101, 32, + 91, 10, 97, 108, 108, 32, 91, 101, 118, 101, + 110, 116, 32, 110, 111, 116, 32, 116, 97, 105, + 108, 63, 32, 104, 93, 10, 93, 32, 91, 10, + 101, 118, 101, 110, 116, 58, 32, 104, 47, 49, + 47, 104, 97, 110, 100, 108, 101, 114, 32, 101, + 118, 101, 110, 116, 32, 10, 104, 58, 32, 110, + 101, 120, 116, 32, 104, 10, 93, 32, 10, 116, + 97, 105, 108, 63, 32, 115, 121, 115, 116, 101, + 109, 47, 118, 105, 101, 119, 47, 115, 99, 114, + 101, 101, 110, 45, 103, 111, 98, 10, 93, 10, + 93, 32, 10, 105, 110, 105, 116, 45, 118, 105, + 101, 119, 45, 115, 121, 115, 116, 101, 109, 10, + 0, +}; + +#endif diff --git a/src/include/host-ext-shape.h b/src/include/host-ext-shape.h new file mode 100644 index 0000000..8ac953b --- /dev/null +++ b/src/include/host-ext-shape.h @@ -0,0 +1,350 @@ +/*********************************************************************** +** +** REBOL 3.0 "Invasion" +** Copyright 2010 REBOL Technologies +** All rights reserved. +** +************************************************************************ +** +** Title: REBOL Graphics - SHAPE commands +** Build: A105 +** Date: 1-Sep-2010 +** File: host-ext-shape +** +** AUTO-GENERATED FILE - Do not modify. (From: make-host-ext.r) +** +***********************************************************************/ + +enum shape_commands { + CMD_SHAPE_INIT_WORDS, + CMD_SHAPE_ARC, + CMD_SHAPE_ARC_LIT, + CMD_SHAPE_CLOSE, + CMD_SHAPE_CURV, + CMD_SHAPE_CURV_LIT, + CMD_SHAPE_CURVE, + CMD_SHAPE_CURVE_LIT, + CMD_SHAPE_HLINE, + CMD_SHAPE_HLINE_LIT, + CMD_SHAPE_LINE, + CMD_SHAPE_LINE_LIT, + CMD_SHAPE_MOVE, + CMD_SHAPE_MOVE_LIT, + CMD_SHAPE_QCURV, + CMD_SHAPE_QCURV_LIT, + CMD_SHAPE_QCURVE, + CMD_SHAPE_QCURVE_LIT, + CMD_SHAPE_VLINE, + CMD_SHAPE_VLINE_LIT, +}; + +enum shape_words { + W_SHAPE_0, + W_SHAPE_NEGATIVE, + W_SHAPE_POSITIVE, + W_SHAPE_SMALL, + W_SHAPE_LARGE, +}; + +#ifdef INCLUDE_EXT_DATA +const unsigned char RX_shape[] = { + 82, 69, 66, 79, 76, 32, 91, 10, 84, 105, + 116, 108, 101, 58, 32, 34, 82, 69, 66, 79, + 76, 32, 71, 114, 97, 112, 104, 105, 99, 115, + 32, 45, 32, 83, 72, 65, 80, 69, 32, 99, + 111, 109, 109, 97, 110, 100, 115, 34, 32, 10, + 78, 97, 109, 101, 58, 32, 115, 104, 97, 112, + 101, 32, 10, 84, 121, 112, 101, 58, 32, 101, + 120, 116, 101, 110, 115, 105, 111, 110, 32, 10, + 69, 120, 112, 111, 114, 116, 115, 58, 32, 110, + 111, 110, 101, 10, 93, 32, 10, 119, 111, 114, + 100, 115, 58, 32, 91, 10, 110, 101, 103, 97, + 116, 105, 118, 101, 32, 10, 112, 111, 115, 105, + 116, 105, 118, 101, 32, 10, 115, 109, 97, 108, + 108, 32, 10, 108, 97, 114, 103, 101, 10, 93, + 32, 10, 105, 110, 105, 116, 45, 119, 111, 114, + 100, 115, 58, 32, 99, 111, 109, 109, 97, 110, + 100, 32, 91, 10, 119, 111, 114, 100, 115, 32, + 91, 98, 108, 111, 99, 107, 33, 93, 10, 93, + 32, 10, 105, 110, 105, 116, 45, 119, 111, 114, + 100, 115, 32, 119, 111, 114, 100, 115, 32, 10, + 97, 114, 99, 58, 32, 99, 111, 109, 109, 97, + 110, 100, 32, 91, 10, 34, 68, 114, 97, 119, + 115, 32, 97, 110, 32, 101, 108, 108, 105, 112, + 116, 105, 99, 97, 108, 32, 97, 114, 99, 32, + 102, 114, 111, 109, 32, 116, 104, 101, 32, 99, + 117, 114, 114, 101, 110, 116, 32, 112, 111, 105, + 110, 116, 46, 34, 32, 10, 101, 110, 100, 45, + 112, 111, 105, 110, 116, 32, 91, 112, 97, 105, + 114, 33, 93, 32, 10, 114, 97, 100, 105, 117, + 115, 32, 91, 112, 97, 105, 114, 33, 93, 32, + 10, 97, 110, 103, 108, 101, 32, 91, 110, 117, + 109, 98, 101, 114, 33, 93, 32, 10, 39, 115, + 119, 101, 101, 112, 45, 102, 108, 97, 103, 32, + 91, 119, 111, 114, 100, 33, 93, 32, 123, 84, + 104, 101, 32, 97, 114, 99, 32, 119, 105, 108, + 108, 32, 98, 101, 32, 100, 114, 97, 119, 110, + 32, 105, 110, 32, 80, 79, 83, 73, 84, 73, + 86, 69, 32, 111, 114, 32, 78, 69, 71, 65, + 84, 73, 86, 69, 32, 97, 110, 103, 108, 101, + 32, 100, 105, 114, 101, 99, 116, 105, 111, 110, + 125, 32, 10, 39, 97, 114, 99, 45, 102, 108, + 97, 103, 32, 91, 119, 111, 114, 100, 33, 93, + 32, 34, 85, 115, 101, 114, 32, 83, 77, 65, + 76, 76, 32, 111, 114, 32, 76, 65, 82, 71, + 69, 32, 97, 114, 99, 32, 115, 119, 101, 101, + 112, 34, 10, 93, 32, 10, 97, 114, 99, 39, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 123, 68, 114, 97, 119, 115, 32, 97, + 110, 32, 101, 108, 108, 105, 112, 116, 105, 99, + 97, 108, 32, 97, 114, 99, 32, 102, 114, 111, + 109, 32, 116, 104, 101, 32, 99, 117, 114, 114, + 101, 110, 116, 32, 112, 111, 105, 110, 116, 46, + 40, 117, 115, 101, 115, 32, 114, 101, 108, 97, + 116, 105, 118, 101, 32, 99, 111, 111, 114, 100, + 105, 110, 97, 116, 101, 115, 41, 125, 32, 10, + 101, 110, 100, 45, 112, 111, 105, 110, 116, 32, + 91, 112, 97, 105, 114, 33, 93, 32, 10, 114, + 97, 100, 105, 117, 115, 32, 91, 112, 97, 105, + 114, 33, 93, 32, 10, 97, 110, 103, 108, 101, + 32, 91, 110, 117, 109, 98, 101, 114, 33, 93, + 32, 10, 39, 115, 119, 101, 101, 112, 45, 102, + 108, 97, 103, 32, 91, 119, 111, 114, 100, 33, + 93, 32, 123, 84, 104, 101, 32, 97, 114, 99, + 32, 119, 105, 108, 108, 32, 98, 101, 32, 100, + 114, 97, 119, 110, 32, 105, 110, 32, 80, 79, + 83, 73, 84, 73, 86, 69, 32, 111, 114, 32, + 78, 69, 71, 65, 84, 73, 86, 69, 32, 97, + 110, 103, 108, 101, 32, 100, 105, 114, 101, 99, + 116, 105, 111, 110, 125, 32, 10, 39, 97, 114, + 99, 45, 102, 108, 97, 103, 32, 91, 119, 111, + 114, 100, 33, 93, 32, 34, 85, 115, 101, 114, + 32, 83, 77, 65, 76, 76, 32, 111, 114, 32, + 76, 65, 82, 71, 69, 32, 97, 114, 99, 32, + 115, 119, 101, 101, 112, 34, 10, 93, 32, 10, + 99, 108, 111, 115, 101, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 123, 67, 108, + 111, 115, 101, 115, 32, 112, 114, 101, 118, 105, + 111, 117, 115, 108, 121, 32, 100, 101, 102, 105, + 110, 101, 100, 32, 115, 101, 116, 32, 111, 102, + 32, 108, 105, 110, 101, 115, 32, 105, 110, 32, + 116, 104, 101, 32, 83, 72, 65, 80, 69, 32, + 98, 108, 111, 99, 107, 46, 125, 10, 93, 32, + 10, 99, 117, 114, 118, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 123, 68, 114, + 97, 119, 115, 32, 97, 32, 99, 117, 98, 105, + 99, 32, 66, 195, 169, 122, 105, 101, 114, 32, + 99, 117, 114, 118, 101, 32, 111, 114, 32, 112, + 111, 108, 121, 98, 195, 169, 122, 105, 101, 114, + 32, 117, 115, 105, 110, 103, 32, 116, 119, 111, + 32, 112, 111, 105, 110, 116, 115, 46, 125, 32, + 10, 112, 111, 105, 110, 116, 115, 32, 91, 98, + 108, 111, 99, 107, 33, 93, 32, 123, 66, 108, + 111, 99, 107, 32, 111, 102, 32, 112, 111, 105, + 110, 116, 32, 112, 97, 105, 114, 115, 32, 40, + 50, 110, 100, 32, 99, 111, 110, 116, 114, 111, + 108, 32, 112, 111, 105, 110, 116, 44, 32, 101, + 110, 100, 32, 112, 111, 105, 110, 116, 41, 125, + 10, 93, 32, 10, 99, 117, 114, 118, 39, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 123, 68, 114, 97, 119, 115, 32, 97, 32, + 99, 117, 98, 105, 99, 32, 66, 195, 169, 122, + 105, 101, 114, 32, 99, 117, 114, 118, 101, 32, + 111, 114, 32, 112, 111, 108, 121, 98, 195, 169, + 122, 105, 101, 114, 32, 117, 115, 105, 110, 103, + 32, 116, 119, 111, 32, 112, 111, 105, 110, 116, + 115, 46, 40, 117, 115, 101, 115, 32, 114, 101, + 108, 97, 116, 105, 118, 101, 32, 99, 111, 111, + 114, 100, 105, 110, 97, 116, 101, 115, 41, 125, + 32, 10, 112, 111, 105, 110, 116, 115, 32, 91, + 98, 108, 111, 99, 107, 33, 93, 32, 123, 66, + 108, 111, 99, 107, 32, 111, 102, 32, 112, 111, + 105, 110, 116, 32, 112, 97, 105, 114, 115, 32, + 40, 50, 110, 100, 32, 99, 111, 110, 116, 114, + 111, 108, 32, 112, 111, 105, 110, 116, 44, 32, + 101, 110, 100, 32, 112, 111, 105, 110, 116, 41, + 125, 10, 93, 32, 10, 99, 117, 114, 118, 101, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 123, 68, 114, 97, 119, 115, 32, 97, + 32, 99, 117, 98, 105, 99, 32, 66, 195, 169, + 122, 105, 101, 114, 32, 99, 117, 114, 118, 101, + 32, 111, 114, 32, 112, 111, 108, 121, 98, 195, + 169, 122, 105, 101, 114, 32, 117, 115, 105, 110, + 103, 32, 116, 104, 114, 101, 101, 32, 112, 111, + 105, 110, 116, 115, 46, 125, 32, 10, 112, 111, + 105, 110, 116, 115, 32, 91, 98, 108, 111, 99, + 107, 33, 93, 32, 123, 66, 108, 111, 99, 107, + 32, 111, 102, 32, 112, 111, 105, 110, 116, 32, + 116, 114, 105, 112, 108, 101, 116, 115, 32, 40, + 49, 115, 116, 32, 99, 111, 110, 116, 114, 111, + 108, 32, 112, 111, 105, 110, 116, 44, 32, 50, + 110, 100, 32, 99, 111, 110, 116, 114, 111, 108, + 32, 112, 111, 105, 110, 116, 44, 32, 101, 110, + 100, 32, 112, 111, 105, 110, 116, 41, 125, 10, + 93, 32, 10, 99, 117, 114, 118, 101, 39, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 123, 68, 114, 97, 119, 115, 32, 97, 32, + 99, 117, 98, 105, 99, 32, 66, 195, 169, 122, + 105, 101, 114, 32, 99, 117, 114, 118, 101, 32, + 111, 114, 32, 112, 111, 108, 121, 98, 195, 169, + 122, 105, 101, 114, 32, 117, 115, 105, 110, 103, + 32, 116, 104, 114, 101, 101, 32, 112, 111, 105, + 110, 116, 115, 46, 40, 117, 115, 101, 115, 32, + 114, 101, 108, 97, 116, 105, 118, 101, 32, 99, + 111, 111, 114, 100, 105, 110, 97, 116, 101, 115, + 41, 125, 32, 10, 112, 111, 105, 110, 116, 115, + 32, 91, 98, 108, 111, 99, 107, 33, 93, 32, + 123, 66, 108, 111, 99, 107, 32, 111, 102, 32, + 112, 111, 105, 110, 116, 32, 116, 114, 105, 112, + 108, 101, 116, 115, 32, 40, 49, 115, 116, 32, + 99, 111, 110, 116, 114, 111, 108, 32, 112, 111, + 105, 110, 116, 44, 32, 50, 110, 100, 32, 99, + 111, 110, 116, 114, 111, 108, 32, 112, 111, 105, + 110, 116, 44, 32, 101, 110, 100, 32, 112, 111, + 105, 110, 116, 41, 125, 10, 93, 32, 10, 104, + 108, 105, 110, 101, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 34, 68, 114, 97, + 119, 115, 32, 97, 32, 104, 111, 114, 105, 122, + 111, 110, 116, 97, 108, 32, 108, 105, 110, 101, + 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, + 99, 117, 114, 114, 101, 110, 116, 32, 112, 111, + 105, 110, 116, 46, 34, 32, 10, 101, 110, 100, + 45, 120, 32, 91, 110, 117, 109, 98, 101, 114, + 33, 93, 10, 93, 32, 10, 104, 108, 105, 110, + 101, 39, 58, 32, 99, 111, 109, 109, 97, 110, + 100, 32, 91, 10, 123, 68, 114, 97, 119, 115, + 32, 97, 32, 104, 111, 114, 105, 122, 111, 110, + 116, 97, 108, 32, 108, 105, 110, 101, 32, 102, + 114, 111, 109, 32, 116, 104, 101, 32, 99, 117, + 114, 114, 101, 110, 116, 32, 112, 111, 105, 110, + 116, 46, 40, 117, 115, 101, 115, 32, 114, 101, + 108, 97, 116, 105, 118, 101, 32, 99, 111, 111, + 114, 100, 105, 110, 97, 116, 101, 115, 41, 125, + 32, 10, 101, 110, 100, 45, 120, 32, 91, 110, + 117, 109, 98, 101, 114, 33, 93, 10, 93, 32, + 10, 108, 105, 110, 101, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 123, 68, 114, + 97, 119, 115, 32, 97, 32, 108, 105, 110, 101, + 32, 102, 114, 111, 109, 32, 116, 104, 101, 32, + 99, 117, 114, 114, 101, 110, 116, 32, 112, 111, + 105, 110, 116, 32, 116, 104, 114, 111, 117, 103, + 104, 32, 116, 104, 101, 32, 103, 105, 118, 101, + 110, 32, 112, 111, 105, 110, 116, 115, 46, 125, + 32, 10, 112, 111, 105, 110, 116, 115, 32, 91, + 112, 97, 105, 114, 33, 32, 98, 108, 111, 99, + 107, 33, 93, 10, 93, 32, 10, 108, 105, 110, + 101, 39, 58, 32, 99, 111, 109, 109, 97, 110, + 100, 32, 91, 10, 123, 68, 114, 97, 119, 115, + 32, 97, 32, 108, 105, 110, 101, 32, 102, 114, + 111, 109, 32, 116, 104, 101, 32, 99, 117, 114, + 114, 101, 110, 116, 32, 112, 111, 105, 110, 116, + 32, 116, 104, 114, 111, 117, 103, 104, 32, 116, + 104, 101, 32, 103, 105, 118, 101, 110, 32, 112, + 111, 105, 110, 116, 115, 46, 40, 117, 115, 101, + 115, 32, 114, 101, 108, 97, 116, 105, 118, 101, + 32, 99, 111, 111, 114, 100, 105, 110, 97, 116, + 101, 115, 41, 125, 32, 10, 112, 111, 105, 110, + 116, 115, 32, 91, 112, 97, 105, 114, 33, 32, + 98, 108, 111, 99, 107, 33, 93, 10, 93, 32, + 10, 109, 111, 118, 101, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 123, 83, 101, + 116, 39, 115, 32, 116, 104, 101, 32, 115, 116, + 97, 114, 116, 105, 110, 103, 32, 112, 111, 105, + 110, 116, 32, 102, 111, 114, 32, 97, 32, 110, + 101, 119, 32, 112, 97, 116, 104, 32, 119, 105, + 116, 104, 111, 117, 116, 32, 100, 114, 97, 119, + 105, 110, 103, 32, 97, 110, 121, 116, 104, 105, + 110, 103, 46, 125, 32, 10, 112, 111, 105, 110, + 116, 32, 91, 112, 97, 105, 114, 33, 93, 10, + 93, 32, 10, 109, 111, 118, 101, 39, 58, 32, + 99, 111, 109, 109, 97, 110, 100, 32, 91, 10, + 123, 83, 101, 116, 39, 115, 32, 116, 104, 101, + 32, 115, 116, 97, 114, 116, 105, 110, 103, 32, + 112, 111, 105, 110, 116, 32, 102, 111, 114, 32, + 97, 32, 110, 101, 119, 32, 112, 97, 116, 104, + 32, 119, 105, 116, 104, 111, 117, 116, 32, 100, + 114, 97, 119, 105, 110, 103, 32, 97, 110, 121, + 116, 104, 105, 110, 103, 46, 40, 117, 115, 101, + 115, 32, 114, 101, 108, 97, 116, 105, 118, 101, + 32, 99, 111, 111, 114, 100, 105, 110, 97, 116, + 101, 115, 41, 125, 32, 10, 112, 111, 105, 110, + 116, 32, 91, 112, 97, 105, 114, 33, 93, 10, + 93, 32, 10, 113, 99, 117, 114, 118, 58, 32, + 99, 111, 109, 109, 97, 110, 100, 32, 91, 10, + 123, 68, 114, 97, 119, 115, 32, 97, 32, 113, + 117, 97, 100, 114, 97, 116, 105, 99, 32, 66, + 195, 169, 122, 105, 101, 114, 32, 99, 117, 114, + 118, 101, 32, 102, 114, 111, 109, 32, 116, 104, + 101, 32, 99, 117, 114, 114, 101, 110, 116, 32, + 112, 111, 105, 110, 116, 32, 116, 111, 32, 101, + 110, 100, 32, 112, 111, 105, 110, 116, 46, 125, + 32, 10, 101, 110, 100, 45, 112, 111, 105, 110, + 116, 32, 91, 112, 97, 105, 114, 33, 93, 10, + 93, 32, 10, 113, 99, 117, 114, 118, 39, 58, + 32, 99, 111, 109, 109, 97, 110, 100, 32, 91, + 10, 123, 68, 114, 97, 119, 115, 32, 97, 32, + 113, 117, 97, 100, 114, 97, 116, 105, 99, 32, + 66, 195, 169, 122, 105, 101, 114, 32, 99, 117, + 114, 118, 101, 32, 102, 114, 111, 109, 32, 116, + 104, 101, 32, 99, 117, 114, 114, 101, 110, 116, + 32, 112, 111, 105, 110, 116, 32, 116, 111, 32, + 101, 110, 100, 32, 112, 111, 105, 110, 116, 46, + 40, 117, 115, 101, 115, 32, 114, 101, 108, 97, + 116, 105, 118, 101, 32, 99, 111, 111, 114, 100, + 105, 110, 97, 116, 101, 115, 41, 125, 32, 10, + 101, 110, 100, 45, 112, 111, 105, 110, 116, 32, + 91, 112, 97, 105, 114, 33, 93, 10, 93, 32, + 10, 113, 99, 117, 114, 118, 101, 58, 32, 99, + 111, 109, 109, 97, 110, 100, 32, 91, 10, 34, + 68, 114, 97, 119, 115, 32, 97, 32, 113, 117, + 97, 100, 114, 97, 116, 105, 99, 32, 66, 195, + 169, 122, 105, 101, 114, 32, 99, 117, 114, 118, + 101, 32, 117, 115, 105, 110, 103, 32, 116, 119, + 111, 32, 112, 111, 105, 110, 116, 115, 46, 34, + 32, 10, 112, 111, 105, 110, 116, 115, 32, 91, + 98, 108, 111, 99, 107, 33, 93, 32, 34, 66, + 108, 111, 99, 107, 32, 111, 102, 32, 112, 111, + 105, 110, 116, 32, 112, 97, 105, 114, 115, 32, + 40, 99, 111, 110, 116, 114, 111, 108, 32, 112, + 111, 105, 110, 116, 44, 32, 101, 110, 100, 32, + 112, 111, 105, 110, 116, 41, 34, 10, 93, 32, + 10, 113, 99, 117, 114, 118, 101, 39, 58, 32, + 99, 111, 109, 109, 97, 110, 100, 32, 91, 10, + 123, 68, 114, 97, 119, 115, 32, 97, 32, 113, + 117, 97, 100, 114, 97, 116, 105, 99, 32, 66, + 195, 169, 122, 105, 101, 114, 32, 99, 117, 114, + 118, 101, 32, 117, 115, 105, 110, 103, 32, 116, + 119, 111, 32, 112, 111, 105, 110, 116, 115, 46, + 40, 117, 115, 101, 115, 32, 114, 101, 108, 97, + 116, 105, 118, 101, 32, 99, 111, 111, 114, 100, + 105, 110, 97, 116, 101, 115, 41, 125, 32, 10, + 112, 111, 105, 110, 116, 115, 32, 91, 98, 108, + 111, 99, 107, 33, 93, 32, 34, 66, 108, 111, + 99, 107, 32, 111, 102, 32, 112, 111, 105, 110, + 116, 32, 112, 97, 105, 114, 115, 32, 40, 99, + 111, 110, 116, 114, 111, 108, 32, 112, 111, 105, + 110, 116, 44, 32, 101, 110, 100, 32, 112, 111, + 105, 110, 116, 41, 34, 10, 93, 32, 10, 118, + 108, 105, 110, 101, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 34, 68, 114, 97, + 119, 115, 32, 97, 32, 118, 101, 114, 116, 105, + 99, 97, 108, 32, 108, 105, 110, 101, 32, 102, + 114, 111, 109, 32, 116, 104, 101, 32, 99, 117, + 114, 114, 101, 110, 116, 32, 112, 111, 105, 110, + 116, 46, 34, 32, 10, 101, 110, 100, 45, 121, + 32, 91, 110, 117, 109, 98, 101, 114, 33, 93, + 10, 93, 32, 10, 118, 108, 105, 110, 101, 39, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 123, 68, 114, 97, 119, 115, 32, 97, + 32, 118, 101, 114, 116, 105, 99, 97, 108, 32, + 108, 105, 110, 101, 32, 102, 114, 111, 109, 32, + 116, 104, 101, 32, 99, 117, 114, 114, 101, 110, + 116, 32, 112, 111, 105, 110, 116, 46, 40, 117, + 115, 101, 115, 32, 114, 101, 108, 97, 116, 105, + 118, 101, 32, 99, 111, 111, 114, 100, 105, 110, + 97, 116, 101, 115, 41, 125, 32, 10, 101, 110, + 100, 45, 121, 32, 91, 110, 117, 109, 98, 101, + 114, 33, 93, 10, 93, 10, 0, +}; + +#endif diff --git a/src/include/host-ext-text.h b/src/include/host-ext-text.h new file mode 100644 index 0000000..6b3bbe7 --- /dev/null +++ b/src/include/host-ext-text.h @@ -0,0 +1,228 @@ +/*********************************************************************** +** +** REBOL 3.0 "Invasion" +** Copyright 2010 REBOL Technologies +** All rights reserved. +** +************************************************************************ +** +** Title: REBOL Graphics - TEXT commands +** Build: A105 +** Date: 1-Sep-2010 +** File: host-ext-text +** +** AUTO-GENERATED FILE - Do not modify. (From: make-host-ext.r) +** +***********************************************************************/ + +enum text_commands { + CMD_TEXT_INIT_WORDS, + CMD_TEXT_ANTI_ALIAS, + CMD_TEXT_BOLD, + CMD_TEXT_CARET, + CMD_TEXT_CENTER, + CMD_TEXT_COLOR, + CMD_TEXT_DROP, + CMD_TEXT_FONT, + CMD_TEXT_ITALIC, + CMD_TEXT_LEFT, + CMD_TEXT_NEWLINE, + CMD_TEXT_PARA, + CMD_TEXT_RIGHT, + CMD_TEXT_SCROLL, + CMD_TEXT_SHADOW, + CMD_TEXT_SIZE, + CMD_TEXT_TEXT, + CMD_TEXT_UNDERLINE, +}; + +enum text_words { + W_TEXT_0, + W_TEXT_ALIASED, + W_TEXT_ANTIALIASED, + W_TEXT_VECTORIAL, + W_TEXT_NAME, + W_TEXT_STYLE, + W_TEXT_SIZE, + W_TEXT_COLOR, + W_TEXT_OFFSET, + W_TEXT_SPACE, + W_TEXT_SHADOW, + W_TEXT_ORIGIN, + W_TEXT_MARGIN, + W_TEXT_INDENT, + W_TEXT_TABS, + W_TEXT_WRAPQ, + W_TEXT_SCROLL, + W_TEXT_ALIGN, + W_TEXT_VALIGN, + W_TEXT_CENTER, + W_TEXT_RIGHT, + W_TEXT_LEFT, + W_TEXT_MIDDLE, + W_TEXT_TOP, + W_TEXT_BOTTOM, + W_TEXT_BOLD, + W_TEXT_ITALIC, + W_TEXT_UNDERLINE, + W_TEXT_CARET, + W_TEXT_HIGHLIGHT_START, + W_TEXT_HIGHLIGHT_END, +}; + +#ifdef INCLUDE_EXT_DATA +const unsigned char RX_text[] = { + 82, 69, 66, 79, 76, 32, 91, 10, 84, 105, + 116, 108, 101, 58, 32, 34, 82, 69, 66, 79, + 76, 32, 71, 114, 97, 112, 104, 105, 99, 115, + 32, 45, 32, 84, 69, 88, 84, 32, 99, 111, + 109, 109, 97, 110, 100, 115, 34, 32, 10, 78, + 97, 109, 101, 58, 32, 116, 101, 120, 116, 32, + 10, 84, 121, 112, 101, 58, 32, 101, 120, 116, + 101, 110, 115, 105, 111, 110, 32, 10, 69, 120, + 112, 111, 114, 116, 115, 58, 32, 110, 111, 110, + 101, 10, 93, 32, 10, 119, 111, 114, 100, 115, + 58, 32, 91, 10, 97, 108, 105, 97, 115, 101, + 100, 32, 10, 97, 110, 116, 105, 97, 108, 105, + 97, 115, 101, 100, 32, 10, 118, 101, 99, 116, + 111, 114, 105, 97, 108, 32, 10, 110, 97, 109, + 101, 32, 10, 115, 116, 121, 108, 101, 32, 10, + 115, 105, 122, 101, 32, 10, 99, 111, 108, 111, + 114, 32, 10, 111, 102, 102, 115, 101, 116, 32, + 10, 115, 112, 97, 99, 101, 32, 10, 115, 104, + 97, 100, 111, 119, 32, 10, 111, 114, 105, 103, + 105, 110, 32, 10, 109, 97, 114, 103, 105, 110, + 32, 10, 105, 110, 100, 101, 110, 116, 32, 10, + 116, 97, 98, 115, 32, 10, 119, 114, 97, 112, + 63, 32, 10, 115, 99, 114, 111, 108, 108, 32, + 10, 97, 108, 105, 103, 110, 32, 10, 118, 97, + 108, 105, 103, 110, 32, 10, 99, 101, 110, 116, + 101, 114, 32, 10, 114, 105, 103, 104, 116, 32, + 10, 108, 101, 102, 116, 32, 10, 109, 105, 100, + 100, 108, 101, 32, 10, 116, 111, 112, 32, 10, + 98, 111, 116, 116, 111, 109, 32, 10, 98, 111, + 108, 100, 32, 10, 105, 116, 97, 108, 105, 99, + 32, 10, 117, 110, 100, 101, 114, 108, 105, 110, + 101, 32, 10, 99, 97, 114, 101, 116, 32, 10, + 104, 105, 103, 104, 108, 105, 103, 104, 116, 45, + 115, 116, 97, 114, 116, 32, 10, 104, 105, 103, + 104, 108, 105, 103, 104, 116, 45, 101, 110, 100, + 10, 93, 32, 10, 105, 110, 105, 116, 45, 119, + 111, 114, 100, 115, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 119, 111, 114, 100, + 115, 32, 91, 98, 108, 111, 99, 107, 33, 93, + 10, 93, 32, 10, 105, 110, 105, 116, 45, 119, + 111, 114, 100, 115, 32, 119, 111, 114, 100, 115, + 32, 10, 97, 110, 116, 105, 45, 97, 108, 105, + 97, 115, 58, 32, 99, 111, 109, 109, 97, 110, + 100, 32, 91, 10, 34, 83, 101, 116, 115, 32, + 97, 108, 105, 97, 115, 105, 110, 103, 32, 109, + 111, 100, 101, 46, 34, 32, 10, 115, 116, 97, + 116, 101, 32, 91, 108, 111, 103, 105, 99, 33, + 93, 10, 93, 32, 10, 98, 58, 32, 98, 111, + 108, 100, 58, 32, 99, 111, 109, 109, 97, 110, + 100, 32, 91, 10, 34, 83, 101, 116, 115, 32, + 102, 111, 110, 116, 32, 66, 79, 76, 68, 32, + 115, 116, 121, 108, 101, 46, 34, 32, 10, 115, + 116, 97, 116, 101, 32, 91, 108, 111, 103, 105, + 99, 33, 93, 10, 93, 32, 10, 99, 97, 114, + 101, 116, 58, 32, 99, 111, 109, 109, 97, 110, + 100, 32, 91, 10, 34, 83, 101, 116, 115, 32, + 112, 97, 114, 97, 103, 114, 97, 112, 104, 32, + 97, 116, 116, 114, 105, 98, 117, 116, 101, 115, + 46, 34, 32, 10, 99, 97, 114, 101, 116, 45, + 97, 116, 116, 114, 105, 98, 117, 116, 101, 115, + 32, 91, 111, 98, 106, 101, 99, 116, 33, 93, + 10, 93, 32, 10, 99, 101, 110, 116, 101, 114, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 34, 83, 101, 116, 115, 32, 116, 101, + 120, 116, 32, 97, 108, 105, 103, 110, 109, 101, + 110, 116, 46, 34, 10, 93, 32, 10, 99, 111, + 108, 111, 114, 58, 32, 99, 111, 109, 109, 97, + 110, 100, 32, 91, 10, 34, 83, 101, 116, 115, + 32, 102, 111, 110, 116, 32, 99, 111, 108, 111, + 114, 46, 34, 32, 10, 102, 111, 110, 116, 45, + 99, 111, 108, 111, 114, 32, 91, 116, 117, 112, + 108, 101, 33, 93, 10, 93, 32, 10, 100, 114, + 111, 112, 58, 32, 99, 111, 109, 109, 97, 110, + 100, 32, 91, 10, 34, 82, 101, 109, 111, 118, + 101, 115, 32, 78, 32, 112, 114, 101, 118, 105, + 111, 117, 115, 32, 115, 116, 121, 108, 101, 32, + 115, 101, 116, 116, 105, 110, 103, 32, 102, 114, + 111, 109, 32, 116, 104, 101, 32, 115, 116, 97, + 99, 107, 46, 34, 32, 10, 99, 111, 117, 110, + 116, 32, 91, 105, 110, 116, 101, 103, 101, 114, + 33, 93, 10, 93, 32, 10, 102, 111, 110, 116, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 34, 83, 101, 116, 115, 32, 102, 111, + 110, 116, 32, 97, 116, 116, 114, 105, 98, 117, + 116, 101, 115, 46, 34, 32, 10, 102, 111, 110, + 116, 45, 97, 116, 116, 114, 105, 98, 117, 116, + 101, 115, 32, 91, 111, 98, 106, 101, 99, 116, + 33, 93, 10, 93, 32, 10, 105, 58, 32, 105, + 116, 97, 108, 105, 99, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 34, 83, 101, + 116, 115, 32, 102, 111, 110, 116, 32, 73, 84, + 65, 76, 73, 67, 32, 115, 116, 121, 108, 101, + 46, 34, 32, 10, 115, 116, 97, 116, 101, 32, + 91, 108, 111, 103, 105, 99, 33, 93, 10, 93, + 32, 10, 108, 101, 102, 116, 58, 32, 99, 111, + 109, 109, 97, 110, 100, 32, 91, 10, 34, 83, + 101, 116, 115, 32, 116, 101, 120, 116, 32, 97, + 108, 105, 103, 110, 109, 101, 110, 116, 46, 34, + 10, 93, 32, 10, 110, 108, 58, 32, 110, 101, + 119, 108, 105, 110, 101, 58, 32, 99, 111, 109, + 109, 97, 110, 100, 32, 91, 10, 34, 66, 114, + 101, 97, 107, 115, 32, 116, 104, 101, 32, 116, + 101, 120, 116, 32, 108, 105, 110, 101, 46, 34, + 10, 93, 32, 10, 112, 97, 114, 97, 58, 32, + 99, 111, 109, 109, 97, 110, 100, 32, 91, 10, + 34, 83, 101, 116, 115, 32, 112, 97, 114, 97, + 103, 114, 97, 112, 104, 32, 97, 116, 116, 114, + 105, 98, 117, 116, 101, 115, 46, 34, 32, 10, + 112, 97, 114, 97, 45, 97, 116, 116, 114, 105, + 98, 117, 116, 101, 115, 32, 91, 111, 98, 106, + 101, 99, 116, 33, 93, 10, 93, 32, 10, 114, + 105, 103, 104, 116, 58, 32, 99, 111, 109, 109, + 97, 110, 100, 32, 91, 10, 34, 83, 101, 116, + 115, 32, 116, 101, 120, 116, 32, 97, 108, 105, + 103, 110, 109, 101, 110, 116, 46, 34, 10, 93, + 32, 10, 115, 99, 114, 111, 108, 108, 58, 32, + 99, 111, 109, 109, 97, 110, 100, 32, 91, 10, + 34, 83, 101, 116, 115, 32, 116, 101, 120, 116, + 32, 112, 111, 115, 105, 116, 105, 111, 110, 46, + 34, 32, 10, 111, 102, 102, 115, 101, 116, 32, + 91, 112, 97, 105, 114, 33, 93, 10, 93, 32, + 10, 115, 104, 97, 100, 111, 119, 58, 32, 99, + 111, 109, 109, 97, 110, 100, 32, 91, 10, 34, + 69, 110, 97, 98, 108, 101, 115, 32, 115, 104, + 97, 100, 111, 119, 32, 101, 102, 102, 101, 99, + 116, 32, 102, 111, 114, 32, 116, 101, 120, 116, + 46, 34, 32, 10, 111, 102, 102, 115, 101, 116, + 32, 91, 112, 97, 105, 114, 33, 93, 32, 10, + 99, 111, 108, 111, 114, 32, 91, 116, 117, 112, + 108, 101, 33, 93, 32, 10, 115, 112, 114, 101, + 97, 100, 32, 91, 105, 110, 116, 101, 103, 101, + 114, 33, 93, 10, 93, 32, 10, 115, 105, 122, + 101, 58, 32, 99, 111, 109, 109, 97, 110, 100, + 32, 91, 10, 34, 83, 101, 116, 115, 32, 102, + 111, 110, 116, 32, 115, 105, 122, 101, 46, 34, + 32, 10, 102, 111, 110, 116, 45, 115, 105, 122, + 101, 32, 91, 105, 110, 116, 101, 103, 101, 114, + 33, 93, 10, 93, 32, 10, 116, 101, 120, 116, + 58, 32, 99, 111, 109, 109, 97, 110, 100, 32, + 91, 10, 34, 82, 101, 110, 100, 101, 114, 115, + 32, 116, 101, 120, 116, 32, 115, 116, 114, 105, + 110, 103, 46, 34, 32, 10, 116, 101, 120, 116, + 32, 91, 115, 116, 114, 105, 110, 103, 33, 93, + 10, 93, 32, 10, 117, 58, 32, 117, 110, 100, + 101, 114, 108, 105, 110, 101, 58, 32, 99, 111, + 109, 109, 97, 110, 100, 32, 91, 10, 34, 83, + 101, 116, 115, 32, 102, 111, 110, 116, 32, 85, + 78, 68, 69, 82, 76, 73, 78, 69, 32, 115, + 116, 121, 108, 101, 46, 34, 32, 10, 115, 116, + 97, 116, 101, 32, 91, 108, 111, 103, 105, 99, + 33, 93, 10, 93, 10, 0, +}; + +#endif diff --git a/src/include/host-init.h b/src/include/host-init.h new file mode 100644 index 0000000..e1e31dc --- /dev/null +++ b/src/include/host-init.h @@ -0,0 +1,407 @@ +/*********************************************************************** +** +** REBOL 3.0 "Invasion" +** Copyright 2010 REBOL Technologies +** All rights reserved. +** +************************************************************************ +** +** Title: Host custom init code +** Build: A105 +** Date: 1-Sep-2010 +** File: include/host-init.h +** +** AUTO-GENERATED FILE - Do not modify. (From: make-host-init.r) +** +***********************************************************************/ + +#define REB_INIT_SIZE 3863 + +const unsigned char Reb_Init_Code[REB_INIT_SIZE] = { + 120, 156, 213, 26, 219, 146, 219, 68, 118, 159, + 245, 21, 61, 162, 168, 100, 40, 100, 203, 158, + 107, 4, 179, 83, 33, 9, 155, 173, 10, 69, + 10, 134, 39, 149, 31, 20, 169, 109, 139, 145, + 37, 35, 201, 227, 120, 9, 255, 190, 231, 214, + 173, 150, 111, 19, 2, 203, 238, 22, 49, 99, + 119, 159, 62, 125, 110, 125, 110, 221, 95, 169, + 23, 213, 114, 83, 231, 179, 121, 171, 126, 120, + 245, 205, 247, 111, 212, 157, 78, 231, 101, 85, + 84, 179, 92, 55, 106, 20, 252, 168, 151, 193, + 56, 28, 133, 195, 139, 232, 12, 254, 157, 7, + 87, 81, 24, 122, 94, 190, 88, 86, 117, 171, + 22, 85, 182, 42, 180, 138, 189, 54, 111, 11, + 29, 41, 159, 113, 156, 169, 215, 119, 119, 111, + 213, 178, 174, 218, 42, 173, 10, 213, 164, 115, + 189, 208, 190, 242, 30, 116, 221, 228, 85, 25, + 169, 112, 48, 26, 132, 202, 43, 147, 5, 172, + 154, 183, 237, 210, 155, 0, 150, 102, 83, 166, + 65, 181, 140, 212, 116, 85, 166, 42, 166, 45, + 222, 85, 217, 70, 13, 139, 42, 77, 0, 79, + 155, 180, 26, 1, 87, 101, 161, 155, 70, 33, + 192, 144, 6, 85, 92, 45, 117, 73, 3, 206, + 232, 48, 45, 170, 70, 223, 70, 106, 163, 155, + 137, 242, 104, 44, 114, 87, 241, 208, 48, 89, + 39, 247, 48, 17, 213, 58, 201, 2, 34, 130, + 70, 148, 151, 85, 188, 191, 151, 79, 121, 115, + 89, 119, 163, 158, 32, 236, 70, 197, 89, 21, + 212, 250, 151, 149, 110, 120, 95, 216, 197, 161, + 237, 86, 173, 147, 188, 85, 177, 16, 83, 149, + 165, 78, 91, 224, 95, 72, 88, 234, 116, 216, + 230, 11, 93, 173, 96, 93, 140, 82, 8, 116, + 93, 87, 181, 242, 239, 120, 212, 7, 116, 184, + 127, 164, 82, 208, 18, 115, 135, 164, 36, 69, + 129, 210, 210, 5, 160, 19, 186, 242, 114, 90, + 13, 231, 64, 19, 72, 88, 61, 121, 81, 149, + 173, 46, 219, 224, 110, 179, 180, 76, 186, 16, + 195, 62, 192, 50, 169, 27, 189, 7, 81, 31, + 44, 246, 252, 86, 191, 111, 135, 190, 106, 231, + 245, 74, 249, 95, 169, 116, 142, 11, 219, 155, + 159, 238, 190, 13, 174, 125, 111, 66, 74, 100, + 130, 219, 10, 240, 213, 121, 57, 59, 33, 9, + 194, 76, 39, 67, 214, 138, 138, 233, 175, 17, + 155, 129, 218, 210, 129, 177, 5, 253, 0, 116, + 200, 159, 147, 137, 49, 8, 18, 23, 89, 206, + 58, 111, 211, 249, 48, 211, 211, 100, 85, 180, + 138, 192, 134, 45, 83, 45, 114, 87, 162, 49, + 207, 81, 25, 195, 177, 92, 167, 73, 209, 104, + 164, 32, 171, 74, 50, 233, 122, 69, 63, 153, + 202, 238, 55, 171, 40, 230, 191, 145, 131, 66, + 108, 142, 231, 189, 253, 227, 145, 42, 17, 59, + 26, 22, 253, 22, 153, 201, 222, 136, 158, 204, + 96, 15, 235, 194, 49, 209, 74, 48, 244, 141, + 205, 145, 173, 181, 70, 35, 143, 61, 28, 143, + 122, 156, 89, 112, 177, 125, 194, 212, 216, 243, + 96, 167, 205, 161, 64, 11, 43, 55, 1, 238, + 142, 214, 122, 171, 162, 14, 132, 183, 138, 251, + 231, 102, 107, 26, 184, 48, 51, 14, 156, 58, + 170, 36, 84, 14, 252, 97, 200, 5, 254, 143, + 85, 173, 98, 4, 136, 248, 188, 41, 102, 194, + 110, 135, 218, 153, 235, 244, 30, 244, 217, 44, + 171, 18, 212, 100, 167, 80, 148, 107, 240, 63, + 250, 40, 82, 134, 216, 197, 234, 156, 117, 217, + 26, 44, 57, 48, 199, 203, 179, 180, 56, 86, + 83, 84, 213, 253, 106, 233, 250, 33, 154, 66, + 18, 197, 254, 226, 61, 104, 55, 234, 8, 117, + 102, 225, 54, 125, 174, 85, 2, 231, 145, 98, + 193, 246, 60, 20, 75, 116, 115, 148, 251, 238, + 252, 109, 99, 207, 42, 228, 215, 156, 146, 109, + 254, 13, 35, 98, 209, 136, 58, 112, 189, 215, + 143, 186, 6, 71, 175, 8, 125, 166, 58, 183, + 231, 31, 99, 150, 215, 238, 35, 198, 108, 159, + 37, 109, 130, 231, 46, 111, 231, 128, 29, 44, + 84, 197, 57, 184, 167, 153, 174, 111, 247, 249, + 174, 84, 124, 87, 161, 203, 89, 59, 223, 7, + 209, 214, 73, 217, 76, 117, 29, 232, 50, 173, + 112, 11, 240, 235, 126, 58, 95, 149, 247, 58, + 243, 39, 127, 49, 155, 160, 168, 242, 184, 186, + 200, 47, 237, 218, 234, 239, 215, 47, 255, 103, + 108, 168, 115, 38, 104, 76, 236, 144, 208, 215, + 17, 200, 22, 211, 198, 37, 121, 254, 119, 184, + 95, 82, 178, 23, 83, 83, 248, 128, 86, 250, + 97, 31, 228, 176, 128, 72, 152, 204, 200, 95, + 72, 44, 0, 223, 115, 127, 194, 252, 130, 155, + 161, 159, 183, 202, 130, 201, 151, 72, 37, 63, + 131, 5, 154, 113, 161, 131, 247, 58, 65, 87, + 204, 252, 61, 79, 83, 140, 180, 94, 158, 193, + 143, 183, 38, 217, 240, 146, 122, 54, 138, 204, + 90, 199, 169, 110, 113, 112, 55, 175, 171, 245, + 31, 100, 1, 220, 248, 182, 89, 216, 125, 93, + 225, 201, 73, 234, 54, 127, 1, 70, 221, 146, + 0, 105, 63, 115, 210, 158, 214, 186, 93, 213, + 101, 99, 98, 231, 41, 17, 208, 206, 43, 240, + 141, 235, 170, 206, 78, 204, 196, 68, 249, 175, + 6, 179, 129, 250, 199, 171, 187, 47, 213, 235, + 87, 207, 95, 126, 169, 222, 126, 255, 227, 157, + 210, 109, 58, 128, 53, 45, 200, 64, 131, 199, + 153, 230, 133, 118, 214, 252, 250, 207, 82, 165, + 9, 232, 188, 154, 154, 193, 47, 33, 32, 41, + 221, 164, 201, 18, 237, 63, 135, 188, 69, 215, + 32, 138, 5, 88, 244, 83, 13, 27, 172, 26, + 61, 93, 21, 24, 206, 43, 48, 246, 58, 207, + 116, 7, 141, 155, 157, 14, 212, 139, 164, 70, + 152, 147, 223, 64, 206, 198, 67, 136, 144, 32, + 33, 20, 206, 204, 204, 83, 200, 23, 130, 30, + 43, 106, 153, 228, 117, 131, 156, 202, 137, 85, + 49, 70, 31, 43, 238, 188, 76, 234, 205, 9, + 197, 77, 100, 193, 32, 20, 96, 192, 104, 146, + 148, 55, 124, 208, 129, 135, 148, 164, 155, 169, + 100, 213, 86, 139, 164, 205, 33, 220, 21, 27, + 160, 244, 213, 98, 217, 110, 100, 95, 64, 8, + 33, 232, 125, 146, 182, 197, 70, 21, 57, 152, + 23, 238, 48, 0, 38, 36, 210, 194, 97, 128, + 40, 69, 106, 230, 175, 17, 12, 145, 89, 66, + 254, 185, 4, 49, 145, 36, 81, 86, 74, 84, + 244, 153, 175, 128, 11, 241, 79, 40, 250, 91, + 101, 20, 81, 66, 226, 4, 217, 114, 145, 201, + 8, 158, 49, 249, 226, 249, 100, 3, 67, 72, + 136, 125, 245, 226, 135, 55, 223, 162, 233, 0, + 90, 157, 128, 75, 39, 173, 11, 197, 19, 213, + 57, 224, 90, 67, 152, 201, 132, 70, 56, 55, + 136, 153, 64, 137, 6, 225, 16, 145, 77, 36, + 243, 178, 178, 53, 82, 166, 20, 205, 8, 215, + 204, 110, 227, 245, 251, 178, 133, 4, 95, 177, + 59, 189, 181, 75, 236, 38, 201, 210, 93, 138, + 195, 202, 10, 206, 217, 74, 230, 123, 52, 245, + 151, 202, 240, 196, 44, 231, 128, 180, 123, 134, + 222, 178, 165, 110, 31, 34, 80, 1, 121, 51, + 42, 31, 192, 98, 140, 62, 49, 221, 86, 232, + 255, 185, 212, 128, 95, 81, 151, 135, 3, 61, + 48, 227, 214, 6, 20, 42, 20, 193, 153, 128, + 17, 81, 42, 27, 192, 225, 89, 88, 151, 91, + 189, 251, 25, 188, 62, 58, 37, 244, 70, 75, + 32, 207, 255, 98, 248, 5, 208, 192, 63, 131, + 23, 156, 34, 195, 240, 170, 157, 66, 146, 172, + 188, 215, 21, 50, 33, 86, 66, 232, 113, 211, + 32, 207, 212, 215, 127, 87, 215, 33, 41, 151, + 205, 140, 184, 99, 2, 96, 13, 168, 54, 242, + 123, 11, 36, 119, 236, 65, 161, 176, 126, 106, + 32, 166, 61, 159, 145, 146, 185, 34, 131, 220, + 92, 185, 156, 176, 136, 134, 253, 124, 164, 31, + 244, 61, 55, 84, 70, 36, 184, 161, 73, 179, + 130, 34, 47, 245, 246, 24, 21, 17, 153, 136, + 16, 99, 117, 36, 56, 154, 252, 95, 6, 56, + 163, 157, 232, 43, 151, 126, 156, 13, 175, 235, + 92, 210, 176, 225, 78, 169, 180, 235, 69, 153, + 19, 57, 115, 96, 89, 236, 228, 40, 122, 178, + 116, 18, 240, 2, 159, 15, 39, 125, 229, 241, + 42, 177, 45, 148, 18, 209, 27, 208, 214, 65, + 150, 39, 88, 75, 245, 11, 79, 116, 97, 202, + 49, 158, 189, 102, 195, 165, 19, 195, 198, 49, + 104, 90, 190, 179, 139, 123, 234, 144, 26, 241, + 204, 169, 250, 176, 53, 252, 100, 9, 122, 59, + 5, 138, 170, 37, 214, 138, 22, 133, 120, 239, + 15, 106, 85, 23, 96, 199, 79, 45, 115, 6, + 211, 196, 133, 102, 143, 43, 80, 157, 193, 246, + 183, 180, 227, 241, 164, 191, 186, 231, 114, 63, + 152, 195, 106, 54, 181, 46, 99, 11, 157, 29, + 71, 53, 158, 154, 172, 162, 151, 145, 247, 68, + 42, 194, 68, 237, 226, 97, 183, 254, 44, 27, + 169, 108, 172, 208, 168, 200, 54, 122, 85, 141, + 149, 252, 110, 241, 142, 120, 34, 181, 107, 49, + 124, 148, 221, 83, 220, 55, 99, 123, 8, 246, + 153, 49, 81, 113, 160, 126, 217, 241, 25, 166, + 20, 199, 88, 98, 177, 102, 144, 125, 76, 243, + 146, 83, 66, 58, 9, 16, 144, 138, 41, 200, + 20, 230, 198, 60, 55, 108, 147, 188, 64, 190, + 113, 102, 12, 83, 156, 17, 237, 57, 100, 252, + 127, 167, 156, 198, 86, 0, 152, 65, 221, 58, + 248, 1, 209, 214, 121, 181, 95, 0, 8, 86, + 174, 210, 118, 8, 69, 194, 28, 33, 229, 44, + 201, 46, 150, 108, 231, 84, 30, 61, 84, 192, + 244, 129, 20, 59, 118, 142, 251, 126, 16, 66, + 45, 73, 251, 201, 1, 152, 254, 22, 69, 210, + 180, 193, 2, 178, 243, 105, 14, 1, 61, 118, + 188, 72, 210, 182, 122, 129, 39, 6, 80, 226, + 200, 201, 254, 53, 19, 138, 35, 11, 200, 94, + 118, 132, 54, 62, 84, 232, 225, 180, 215, 181, + 114, 220, 176, 155, 176, 90, 17, 39, 102, 106, + 202, 214, 127, 84, 136, 209, 47, 187, 110, 159, + 127, 196, 2, 29, 191, 12, 209, 112, 200, 214, + 32, 146, 73, 252, 247, 85, 252, 153, 15, 73, + 192, 7, 112, 245, 35, 40, 64, 154, 106, 161, + 57, 160, 199, 30, 142, 168, 167, 251, 61, 238, + 19, 28, 62, 85, 222, 7, 5, 96, 99, 128, + 142, 253, 240, 28, 209, 248, 225, 5, 160, 57, + 180, 170, 172, 2, 145, 60, 173, 61, 4, 86, + 221, 159, 34, 127, 132, 252, 12, 73, 241, 195, + 179, 195, 164, 52, 90, 7, 21, 134, 54, 166, + 135, 8, 57, 76, 64, 167, 38, 3, 126, 113, + 24, 124, 133, 63, 234, 234, 253, 230, 40, 185, + 181, 206, 242, 26, 60, 65, 71, 244, 57, 19, + 125, 68, 126, 171, 18, 50, 197, 121, 85, 131, + 229, 90, 66, 174, 14, 131, 19, 17, 1, 46, + 57, 74, 73, 90, 228, 104, 213, 84, 22, 116, + 212, 28, 97, 176, 161, 130, 178, 183, 224, 16, + 168, 52, 82, 3, 20, 97, 3, 217, 40, 248, + 36, 32, 157, 29, 176, 180, 89, 208, 192, 14, + 88, 96, 117, 223, 213, 209, 110, 48, 189, 81, + 79, 230, 220, 135, 217, 219, 169, 32, 19, 255, + 168, 250, 180, 223, 10, 69, 87, 31, 63, 178, + 152, 183, 112, 86, 79, 76, 230, 13, 46, 140, + 34, 10, 157, 217, 126, 11, 20, 221, 46, 34, + 223, 215, 154, 181, 171, 255, 66, 130, 61, 233, + 87, 176, 5, 42, 123, 22, 254, 19, 210, 78, + 87, 13, 20, 55, 14, 1, 224, 151, 50, 152, + 8, 15, 11, 78, 74, 129, 143, 18, 157, 233, + 178, 80, 120, 227, 206, 4, 197, 180, 24, 203, + 25, 36, 123, 210, 227, 197, 99, 192, 189, 246, + 118, 227, 120, 5, 201, 201, 108, 234, 3, 216, + 88, 104, 16, 28, 109, 247, 250, 13, 100, 9, + 24, 201, 59, 70, 40, 253, 23, 169, 114, 7, + 212, 184, 122, 23, 244, 120, 187, 230, 7, 131, + 0, 211, 200, 28, 121, 95, 36, 229, 42, 41, + 40, 30, 213, 40, 92, 238, 221, 60, 34, 119, + 183, 129, 227, 244, 83, 208, 118, 58, 39, 162, + 220, 179, 175, 220, 115, 173, 58, 231, 241, 9, + 86, 65, 108, 238, 104, 117, 103, 247, 199, 68, + 241, 28, 64, 145, 95, 150, 29, 85, 194, 214, + 137, 168, 141, 110, 63, 73, 10, 216, 79, 58, + 196, 244, 35, 4, 197, 166, 151, 38, 243, 62, + 69, 198, 201, 167, 81, 225, 70, 21, 211, 168, + 254, 111, 59, 50, 207, 198, 174, 67, 167, 253, + 184, 194, 222, 194, 82, 188, 143, 251, 179, 52, + 213, 51, 194, 223, 101, 43, 9, 248, 128, 229, + 159, 76, 77, 151, 136, 252, 207, 68, 30, 242, + 100, 198, 161, 253, 177, 34, 152, 75, 220, 143, + 185, 81, 192, 196, 18, 247, 222, 27, 220, 31, + 85, 148, 244, 64, 228, 34, 68, 112, 244, 117, + 244, 9, 250, 49, 93, 226, 206, 211, 80, 147, + 24, 134, 185, 164, 137, 212, 103, 191, 134, 47, + 195, 231, 191, 241, 200, 216, 25, 114, 135, 251, + 21, 140, 0, 74, 95, 118, 187, 20, 137, 184, + 3, 244, 30, 173, 97, 187, 255, 228, 221, 153, + 158, 253, 43, 233, 217, 195, 216, 27, 204, 247, + 191, 147, 35, 207, 2, 183, 61, 35, 246, 249, + 189, 42, 212, 52, 134, 74, 189, 14, 86, 117, + 174, 98, 172, 175, 45, 113, 84, 248, 76, 220, + 186, 191, 187, 118, 222, 41, 0, 247, 20, 165, + 130, 117, 183, 240, 210, 24, 159, 97, 170, 176, + 27, 243, 50, 186, 27, 239, 10, 74, 153, 148, + 113, 236, 9, 61, 65, 41, 61, 166, 254, 95, + 109, 120, 3, 65, 39, 221, 213, 59, 8, 5, + 164, 133, 71, 107, 90, 67, 186, 64, 70, 210, + 179, 137, 223, 108, 41, 227, 214, 186, 31, 125, + 118, 123, 121, 130, 161, 157, 218, 85, 55, 78, + 235, 202, 206, 152, 86, 215, 77, 175, 145, 101, + 59, 114, 210, 222, 176, 208, 88, 116, 122, 91, + 87, 236, 221, 157, 219, 71, 71, 124, 236, 94, + 19, 153, 68, 76, 208, 101, 0, 146, 68, 205, + 193, 171, 193, 105, 158, 249, 189, 7, 1, 31, + 31, 254, 149, 19, 147, 247, 53, 60, 204, 49, + 199, 45, 41, 110, 87, 43, 72, 215, 240, 162, + 41, 192, 106, 89, 45, 238, 71, 240, 25, 171, + 182, 78, 192, 250, 106, 233, 127, 160, 59, 56, + 208, 249, 176, 39, 101, 207, 229, 255, 193, 182, + 136, 91, 161, 82, 239, 58, 54, 120, 142, 223, + 132, 225, 61, 7, 49, 214, 149, 206, 30, 48, + 208, 115, 114, 36, 42, 211, 226, 53, 45, 98, + 6, 93, 65, 240, 40, 186, 92, 167, 171, 126, + 229, 62, 143, 158, 54, 56, 194, 160, 170, 119, + 174, 223, 7, 89, 62, 203, 219, 134, 31, 27, + 152, 6, 10, 72, 138, 92, 137, 46, 51, 201, + 133, 204, 186, 126, 107, 1, 191, 55, 205, 74, + 159, 184, 152, 13, 9, 206, 208, 141, 10, 249, + 38, 170, 35, 11, 149, 17, 27, 247, 166, 158, + 138, 78, 32, 41, 241, 79, 101, 103, 168, 172, + 137, 104, 163, 46, 24, 181, 46, 205, 161, 205, + 174, 180, 158, 192, 174, 48, 205, 114, 163, 51, + 211, 87, 182, 243, 135, 163, 224, 99, 6, 122, + 184, 46, 64, 87, 174, 147, 90, 153, 238, 134, + 60, 104, 216, 163, 25, 17, 129, 163, 147, 251, + 124, 137, 22, 26, 89, 69, 56, 124, 230, 224, + 187, 193, 16, 168, 187, 66, 109, 45, 180, 110, + 99, 210, 189, 222, 11, 105, 220, 224, 82, 48, + 137, 13, 156, 205, 173, 161, 200, 188, 177, 144, + 71, 17, 230, 135, 141, 230, 251, 95, 224, 216, + 208, 41, 113, 91, 110, 132, 15, 245, 168, 60, + 199, 106, 29, 131, 22, 25, 28, 88, 245, 245, + 141, 53, 106, 187, 252, 80, 174, 98, 145, 110, + 157, 138, 179, 113, 24, 134, 127, 88, 137, 82, + 19, 217, 108, 193, 40, 242, 32, 99, 91, 176, + 18, 189, 187, 243, 21, 153, 87, 60, 202, 31, + 141, 207, 206, 47, 46, 175, 174, 159, 133, 201, + 187, 52, 211, 211, 231, 223, 188, 120, 249, 234, + 91, 95, 90, 240, 18, 144, 98, 121, 180, 197, + 81, 201, 62, 252, 122, 13, 132, 215, 119, 24, + 180, 41, 66, 19, 205, 246, 74, 246, 97, 52, + 24, 249, 166, 127, 74, 252, 54, 155, 166, 213, + 11, 20, 93, 153, 37, 117, 198, 129, 0, 231, + 131, 18, 175, 203, 60, 142, 3, 159, 15, 205, + 245, 39, 151, 138, 142, 227, 139, 39, 202, 235, + 181, 159, 145, 20, 122, 52, 21, 169, 209, 133, + 201, 224, 14, 236, 134, 49, 62, 144, 12, 111, + 43, 157, 243, 118, 82, 185, 110, 79, 147, 88, + 36, 105, 139, 241, 134, 245, 96, 239, 163, 220, + 220, 194, 61, 86, 91, 79, 105, 220, 87, 52, + 198, 176, 241, 205, 8, 91, 150, 138, 211, 4, + 107, 5, 14, 51, 230, 134, 155, 58, 101, 246, + 97, 9, 63, 28, 171, 245, 148, 203, 249, 237, + 155, 28, 74, 25, 228, 108, 244, 106, 8, 68, + 207, 101, 63, 204, 225, 211, 50, 103, 165, 233, + 119, 59, 212, 237, 198, 93, 233, 33, 216, 119, + 122, 66, 177, 132, 64, 186, 73, 217, 43, 13, + 200, 104, 147, 66, 124, 141, 112, 76, 29, 5, + 185, 253, 143, 104, 86, 206, 137, 253, 217, 93, + 72, 152, 33, 88, 78, 127, 35, 190, 116, 53, + 131, 6, 165, 96, 227, 213, 6, 18, 18, 192, + 85, 10, 63, 99, 247, 37, 27, 152, 43, 248, + 223, 66, 74, 154, 225, 251, 96, 189, 94, 7, + 136, 19, 179, 51, 138, 128, 58, 235, 30, 183, + 241, 189, 221, 132, 17, 79, 156, 148, 231, 255, + 85, 175, 123, 46, 190, 152, 70, 22, 221, 71, + 235, 253, 56, 30, 177, 10, 228, 238, 128, 81, + 56, 183, 65, 230, 61, 136, 147, 227, 196, 146, + 149, 74, 21, 130, 153, 49, 28, 191, 91, 71, + 82, 148, 204, 245, 68, 241, 29, 196, 124, 76, + 94, 104, 38, 201, 50, 56, 203, 77, 95, 32, + 110, 109, 97, 252, 118, 94, 230, 88, 95, 121, + 93, 174, 20, 41, 243, 186, 143, 61, 139, 121, + 70, 90, 86, 61, 183, 226, 230, 239, 236, 77, + 196, 125, 163, 127, 113, 30, 193, 117, 194, 247, + 250, 218, 113, 119, 228, 172, 205, 226, 197, 27, + 101, 70, 13, 248, 218, 20, 60, 237, 156, 238, + 141, 183, 216, 247, 36, 131, 118, 39, 76, 142, + 13, 238, 105, 218, 189, 89, 0, 28, 209, 112, + 200, 162, 193, 139, 100, 231, 14, 153, 67, 86, + 239, 49, 159, 152, 10, 77, 240, 115, 65, 137, + 67, 164, 80, 185, 2, 49, 61, 69, 50, 243, + 195, 126, 112, 90, 173, 202, 236, 150, 75, 4, + 71, 193, 221, 225, 216, 145, 70, 247, 58, 233, + 48, 214, 45, 107, 113, 202, 212, 61, 119, 200, + 123, 135, 13, 199, 172, 99, 215, 70, 140, 163, + 55, 12, 98, 182, 247, 184, 159, 239, 248, 219, + 211, 206, 235, 208, 115, 0, 39, 183, 244, 142, + 58, 170, 24, 79, 21, 165, 89, 25, 77, 59, + 196, 218, 231, 10, 134, 91, 78, 60, 236, 107, + 96, 250, 45, 39, 13, 78, 108, 189, 159, 74, + 123, 212, 164, 51, 135, 168, 13, 214, 221, 226, + 194, 50, 68, 208, 183, 166, 39, 231, 62, 110, + 221, 42, 188, 88, 128, 242, 158, 213, 78, 50, + 237, 76, 155, 36, 79, 143, 202, 208, 225, 113, + 39, 223, 2, 176, 208, 121, 188, 246, 174, 72, + 210, 123, 124, 72, 30, 226, 67, 242, 180, 74, + 138, 72, 93, 158, 15, 232, 159, 242, 102, 117, + 2, 178, 24, 141, 175, 7, 242, 1, 101, 234, + 117, 139, 217, 248, 232, 42, 28, 200, 7, 82, + 146, 188, 120, 160, 193, 103, 227, 129, 124, 96, + 176, 172, 214, 145, 26, 159, 135, 3, 249, 64, + 112, 155, 83, 112, 27, 95, 92, 12, 228, 131, + 20, 96, 132, 65, 2, 232, 231, 172, 214, 154, + 94, 182, 35, 0, 146, 180, 73, 236, 79, 2, + 168, 49, 155, 160, 73, 156, 222, 232, 162, 160, + 109, 4, 101, 136, 105, 22, 190, 217, 72, 12, + 16, 45, 42, 147, 135, 13, 111, 66, 76, 64, + 2, 63, 165, 215, 243, 192, 21, 172, 104, 53, + 178, 29, 118, 76, 46, 146, 186, 66, 111, 66, + 243, 8, 81, 21, 249, 131, 238, 36, 1, 35, + 203, 85, 189, 44, 180, 1, 161, 85, 21, 164, + 108, 51, 97, 111, 116, 1, 131, 180, 48, 171, + 147, 119, 145, 186, 26, 15, 224, 223, 232, 18, + 248, 173, 171, 53, 162, 62, 123, 54, 184, 124, + 6, 146, 66, 169, 79, 167, 26, 214, 93, 93, + 14, 198, 151, 3, 18, 167, 46, 75, 96, 96, + 116, 25, 14, 174, 199, 131, 243, 11, 108, 255, + 228, 139, 6, 73, 26, 143, 129, 165, 112, 112, + 9, 96, 15, 121, 85, 224, 155, 24, 64, 28, + 14, 158, 133, 136, 58, 71, 101, 142, 174, 174, + 7, 103, 231, 240, 15, 168, 204, 203, 123, 33, + 8, 84, 58, 198, 204, 121, 6, 36, 137, 188, + 194, 139, 1, 106, 165, 77, 8, 47, 144, 119, + 125, 62, 24, 157, 161, 78, 116, 110, 24, 25, + 35, 203, 207, 128, 238, 252, 161, 194, 131, 97, + 117, 135, 43, 49, 217, 195, 181, 23, 162, 227, + 51, 24, 187, 159, 39, 247, 57, 18, 1, 204, + 225, 103, 124, 137, 58, 123, 87, 21, 104, 227, + 163, 243, 49, 75, 121, 68, 214, 160, 147, 22, + 45, 4, 119, 193, 113, 144, 69, 242, 203, 10, + 24, 63, 71, 225, 193, 7, 241, 225, 27, 46, + 116, 217, 225, 224, 156, 4, 191, 78, 200, 254, + 174, 17, 4, 16, 157, 143, 49, 20, 47, 147, + 141, 40, 28, 198, 207, 174, 64, 132, 247, 104, + 184, 204, 51, 155, 192, 34, 199, 28, 151, 209, + 94, 2, 1, 76, 22, 25, 223, 217, 245, 224, + 226, 26, 209, 1, 231, 80, 209, 7, 41, 19, + 75, 75, 249, 35, 134, 38, 236, 35, 121, 227, + 208, 251, 219, 191, 1, 141, 118, 209, 130, 247, + 49, 0, 0}; diff --git a/src/include/host-lib.h b/src/include/host-lib.h index 0e8ad44..1a9aea1 100644 --- a/src/include/host-lib.h +++ b/src/include/host-lib.h @@ -7,8 +7,8 @@ ************************************************************************ ** ** Title: Host Access Library -** Build: A104 -** Date: 26-Aug-2010/20:40:59-7:00 +** Build: A105 +** Date: 1-Sep-2010 ** File: host-lib.h ** ** AUTO-GENERATED FILE - Do not modify. (From: make-os-ext.r) @@ -16,7 +16,7 @@ ***********************************************************************/ -#define HOST_LIB_VER 104 +#define HOST_LIB_VER 105 #define HOST_LIB_SUM 5782 #define HOST_LIB_SIZE 30 diff --git a/src/include/reb-evtypes.h b/src/include/reb-evtypes.h index a942338..de420e4 100644 --- a/src/include/reb-evtypes.h +++ b/src/include/reb-evtypes.h @@ -7,8 +7,8 @@ ************************************************************************ ** ** Title: Event Types -** Build: A104 -** Date: 26-Aug-2010/20:41-7:00 +** Build: A105 +** Date: 1-Sep-2010 ** File: reb-evtypes.h ** ** AUTO-GENERATED FILE - Do not modify. (From: make-boot.r) diff --git a/src/include/reb-ext.h b/src/include/reb-ext.h index 81bf620..b6f8adc 100644 --- a/src/include/reb-ext.h +++ b/src/include/reb-ext.h @@ -7,7 +7,7 @@ ************************************************************************ ** ** Title: Extensions Include File -** Build: A100 +** Build: A105 ** Date: 17-Jul-2010/14:47:24-7:00 ** File: reb-ext.h ** @@ -16,6 +16,18 @@ #include "reb-defs.h" #include "ext-types.h" +/* Prefix naming conventions: + + RL: REBOL library API function (or function access macro) + RXI: REBOL eXtensions Interface (general constructs) + RXA: REBOL eXtensions function Argument (value) + RXR: REBOL eXtensions function Return types + RXE: REBOL eXtensions Error codes + RXC: REBOL eXtensions Callback flag + +*/ + + // Value structure (for passing args to and from): typedef union rxi_arg_val { void *addr; @@ -51,7 +63,13 @@ typedef struct rxi_cmd_frame { RXIARG args[8]; // arg values (64 bits each) } RXIFRM; -typedef int (*RXICAL)(int cmd, RXIFRM *args, void *data); +typedef struct rxi_cmd_context { + void *envr; // for holding a reference to your environment + REBSER *block; // block being evaluated + REBCNT index; // 0-based index of current command in block +} REBCEC; + +typedef int (*RXICAL)(int cmd, RXIFRM *args, REBCEC *ctx); // Access macros (indirect access via RXIFRM pointer): #define RXA_ARG(f,n) ((f)->args[n]) @@ -74,7 +92,7 @@ typedef int (*RXICAL)(int cmd, RXIFRM *args, void *data); #define RXA_MODULE(f,n) (RXA_ARG(f,n).addr) #define RXA_HANDLE(f,n) (RXA_ARG(f,n).addr) #define RXA_IMAGE(f,n) (RXA_ARG(f,n).image) -#define RXA_IMAGE_BITS(f,n) ((REBYTE *)RXI_SERIES_INFO((RXA_ARG(f,n).image), RXI_SER_DATA)) +#define RXA_IMAGE_BITS(f,n) ((REBYTE *)RL_SERIES((RXA_ARG(f,n).image), RXI_SER_DATA)) #define RXA_IMAGE_WIDTH(f,n) (RXA_ARG(f,n).width) #define RXA_IMAGE_HEIGHT(f,n) (RXA_ARG(f,n).height) @@ -94,8 +112,8 @@ enum rxi_return { // Used with RXI_SERIES_INFO: enum { - RXI_SER_TAIL, // series tail index (length of data) RXI_SER_DATA, // pointer to data + RXI_SER_TAIL, // series tail index (length of data) RXI_SER_SIZE, // size of series (in units) RXI_SER_WIDE, // width of series (in bytes) RXI_SER_LEFT, // units free in series (past tail) @@ -113,7 +131,7 @@ enum { #define GET_EXT_ERROR(v) ((v)->int32a) typedef struct rxi_callback_info { - u32 flags; + u32 flags; REBSER *obj; // object that holds the function u32 word; // word id for function (name) RXIARG *args; // argument list for function diff --git a/src/include/reb-gob.h b/src/include/reb-gob.h index cff934a..f325f89 100644 --- a/src/include/reb-gob.h +++ b/src/include/reb-gob.h @@ -150,9 +150,9 @@ struct rebol_gob { // size: 64 bytes! #define GOB_TAIL(g) SERIES_TAIL((g)->pane) #define GOB_HEAD(g) ((REBGOB **)(SERIES_DATA(GOB_PANE(g)))) #else -#define GOB_STRING(g) ((REBYTE *)RL_Get_Series(GOB_CONTENT(g), 0)) -#define GOB_TAIL(g) ((REBCNT)RL_Get_Series(GOB_PANE(g), 1)) -#define GOB_HEAD(g) ((REBGOB **)RL_Get_Series(GOB_PANE(g), 0)) +#define GOB_STRING(g) ((REBYTE *)RL_Series(GOB_CONTENT(g), RXI_SER_DATA)) +#define GOB_TAIL(g) ((REBCNT)RL_Series(GOB_PANE(g), RXI_SER_TAIL)) +#define GOB_HEAD(g) ((REBGOB **)RL_Series(GOB_PANE(g), RXI_SER_DATA)) #endif #define GOB_BITMAP(g) GOB_STRING(g) #define GOB_SKIP(g,n) (GOB_HEAD(g)+n) diff --git a/src/include/reb-lib.h b/src/include/reb-lib.h index b992b58..d26aeec 100644 --- a/src/include/reb-lib.h +++ b/src/include/reb-lib.h @@ -7,176 +7,325 @@ ************************************************************************ ** ** Title: REBOL Host and Extension API -** Build: A104 -** Date: 26-Aug-2010/20:40:59-7:00 -** File: reb-ext-lib.r +** Build: A105 +** Date: 1-Sep-2010 +** File: reb-lib.r ** -** AUTO-GENERATED FILE - Do not modify. (From: make-ext-lib.r) +** AUTO-GENERATED FILE - Do not modify. (From: make-reb-lib.r) ** ***********************************************************************/ -#define RXI_VERS 2 +// These constants are created by the release system and can be used to check +// for compatiblity with the reb-lib DLL (using RL_Version.) +#define RL_VER 2 +#define RL_REV 100 +#define RL_UPD 105 + +// Compatiblity with the lib requires that structs are aligned using the same +// method. This is concrete, not abstract. The macro below uses struct +// sizes to inform the developer that something is wrong. +#define CHECK_STRUCT_ALIGN (sizeof(REBREQ) == 80 && sizeof(REBEVT) == 12) + +// Function entry points for reb-lib (used for MACROS below): typedef struct rebol_ext_api { - //int version; void (*version)(REBYTE vers[]); int (*init)(REBARGS *rargs, void *lib); int (*start)(int reserved); void (*reset)(); void *(*extend)(REBYTE *source, RXICAL call); void (*escape)(REBINT reserved); - int (*do_string)(REBYTE *text); - int (*do_binary)(REBYTE *bin, REBINT length, REBCNT flags, REBCNT key); + int (*do_string)(REBYTE *text, REBCNT flags, RXIARG *result); + int (*do_binary)(REBYTE *bin, REBINT length, REBCNT flags, REBCNT key, RXIARG *result); + int (*do_block)(REBSER *blk, REBCNT flags, RXIARG *result); + void (*do_commands)(REBSER *blk, REBCNT flags, REBCEC *context); void (*print)(REBYTE *fmt, ...); void (*print_tos)(REBCNT flags, REBYTE *marker); int (*event)(REBEVT *evt); - void *(*get_series)(REBSER *ser, REBINT what); - void (*do_commands)(REBSER *blk, void *data); void *(*make_block)(u32 size); void *(*make_string)(u32 size, int unicode); void *(*make_image)(u32 width, u32 height); - void (*gc_protect)(REBSER *series, BOOL protect); + void (*protect_gc)(REBSER *series, u32 flags); int (*get_string)(REBSER *series, u32 index, void **str); u32 (*map_word)(REBYTE *string); u32 *(*map_words)(REBSER *series); REBYTE *(*word_string)(u32 word); u32 (*find_word)(u32 *words, u32 word); - int (*series_info)(REBSER *series, REBCNT what); + int (*series)(REBSER *series, REBCNT what); int (*get_char)(REBSER *series, u32 index); u32 (*set_char)(REBSER *series, u32 index, u32 chr); - int (*get_value)(REBSER *series, u32 index, RXIARG *val); + int (*get_value)(REBSER *series, u32 index, RXIARG *result); int (*set_value)(REBSER *series, u32 index, RXIARG val, int type); u32 *(*words_of_object)(REBSER *obj); - int (*get_field)(REBSER *obj, u32 word, RXIARG *val); + int (*get_field)(REBSER *obj, u32 word, RXIARG *result); int (*set_field)(REBSER *obj, u32 word, RXIARG val, int type); int (*callback)(RXICBI *cbi); -} RXILIB; +} RL_LIB; +// Extension entry point functions: #ifdef TO_WIN32 #define RXIEXT __declspec(dllexport) #else #define RXIEXT extern #endif -RXIEXT const char *RX_Init(int opts, RXILIB *lib); +RXIEXT const char *RX_Init(int opts, RL_LIB *lib); RXIEXT int RX_Quit(int opts); RXIEXT int RX_Call(int cmd, RXIFRM *frm, void *data); -RXILIB *RXI; // Passed to the Init() function +// The macros below will require this base pointer: +extern RL_LIB *RL; // is passed to the RX_Init() function -// Use these macros to access the API library functions: +// Macros to access reb-lib functions (from non-linked extensions): -#define RL_VERSION(a) RXI->version(a) +#define RL_VERSION(a) RL->version(a) /* ** void RL_Version(REBYTE vers[]) ** -***********************************************************************/ +** Obtain current REBOL interpreter version information. +** +** Returns: +** A byte array containing version, revision, update, and more. +** Arguments: +** vers - a byte array to hold the version info. First byte is length, +** followed by version, revision, update, system, variation. +** Notes: +** This function can be called before any other initialization +** to determine version compatiblity with the caller. +** +*/ -#define RL_INIT(a,b) RXI->init(a,b) +#define RL_INIT(a,b) RL->init(a,b) /* ** int RL_Init(REBARGS *rargs, void *lib) ** -** REBOL_HOST_LIB *lib +** Initialize the REBOL interpreter. ** -***********************************************************************/ +** Returns: +** Zero on success, otherwise an error indicating that the +** host library is not compatible with this release. +** Arguments: +** rargs - REBOL command line args and options structure. +** See the host-args.c module for details. +** lib - the host lib (OS_ functions) to be used by REBOL. +** See host-lib.c for details. +** Notes: +** This function will allocate and initialize all memory +** structures used by the REBOL interpreter. This is an +** extensive process that takes time. +** +*/ -#define RL_START(a) RXI->start(a) +#define RL_START(a) RL->start(a) /* ** int RL_Start(int reserved) ** -***********************************************************************/ +** Evaluate the default boot function. +** +** Returns: +** Zero on success, otherwise indicates an error occurred. +** Arguments: +** reserved - must be set to zero +** Notes: +** This function should be called after the host has +** added any custom code or extensions. Note that before +** this function is called, security and startup options +** have not been initialized. The primary content of the boot +** is in mezz-intrinsics.r in system/intrinsic/begin function. +** +*/ -#define RL_RESET() RXI->reset() +#define RL_RESET() RL->reset() /* ** void RL_Reset() ** -** Reset REBOL. Currently only resets the stack. +** Reset REBOL (not implemented) ** -***********************************************************************/ +** Returns: +** nothing +** Arguments: +** none +** Notes: +** Intended to reset the REBOL interpreter. +** +*/ -#define RL_EXTEND(a,b) RXI->extend(a,b) +#define RL_EXTEND(a,b) RL->extend(a,b) /* ** void *RL_Extend(REBYTE *source, RXICAL call) ** -** Adds a boot extension to the system/catalog/boot-exts list. -** Later in the boot, these are used with LOAD-EXTENSION to -** query and potentially init each extension (depending on flag.) +** Appends embedded extension to system/catalog/boot-exts. ** -***********************************************************************/ +** Returns: +** A pointer to the REBOL library (see reb-lib.h). +** Arguments: +** source - A pointer to a UTF-8 (or ASCII) string that provides +** extension module header, function definitions, and other +** related functions and data. +** call - A pointer to the extension's command dispatcher. +** Notes: +** This function simply adds the embedded extension to the +** boot-exts list. All other processing and initialization +** happens later during startup. Each embedded extension is +** queried and init using LOAD-EXTENSION system native. +** See c:extensions-embedded +** +*/ -#define RL_ESCAPE(a) RXI->escape(a) +#define RL_ESCAPE(a) RL->escape(a) /* ** void RL_Escape(REBINT reserved) ** -** Signal that escape is needed. Can be CTRL-C or ESCAPE. +** Signal that code ecaluation needs to be interrupted. ** -***********************************************************************/ +** Returns: +** nothing +** Arguments: +** reserved - must be set to zero. +** Notes: +** This function set's a signal that is checked during evaluation +** and will cause the interpreter to begin processing an escape +** trap. Note that control must be passed back to REBOL for the +** signal to be recognized and handled. +** +*/ -#define RL_DO_STRING(a) RXI->do_string(a) +#define RL_DO_STRING(a,b,c) RL->do_string(a,b,c) /* -** int RL_Do_String(REBYTE *text) +** int RL_Do_String(REBYTE *text, REBCNT flags, RXIARG *result) ** -** Text must be valid UTF-8. -** Returns TRUE if ran ok. +** Load a string and evaluate the resulting block. ** -***********************************************************************/ +** Returns: +** The datatype of the result. +** Arguments: +** text - A null terminated UTF-8 (or ASCII) string to transcode +** into a block and evaluate. +** flags - set to zero for now +** result - value returned from evaluation. +** +*/ -#define RL_DO_BINARY(a,b,c,d) RXI->do_binary(a,b,c,d) +#define RL_DO_BINARY(a,b,c,d,e) RL->do_binary(a,b,c,d,e) /* -** int RL_Do_Binary(REBYTE *bin, REBINT length, REBCNT flags, REBCNT key) +** int RL_Do_Binary(REBYTE *bin, REBINT length, REBCNT flags, REBCNT key, RXIARG *result) ** -** Run a binary encoded script form such as compressed text. +** Evaluate an encoded binary script such as compressed text. ** -** Also include: rebin, cloaked, signed, and encrypted formats. -** Returns TRUE if ran ok. +** Returns: +** The datatype of the result or zero if error in the encoding. +** Arguments: +** bin - by default, a REBOL compressed UTF-8 (or ASCII) script. +** length - the length of the data. +** flags - special flags (set to zero at this time). +** key - encoding, encryption, or signature key. +** result - value returned from evaluation. +** Notes: +** As of A104, only compressed scripts are supported, however, +** rebin, cloaked, signed, and encrypted formats will be supported. ** -***********************************************************************/ +*/ -#define RL_PRINT(a,b) RXI->print(a,b) +#define RL_DO_BLOCK(a,b,c) RL->do_block(a,b,c) /* -** void RL_Print(REBYTE *fmt, ...) +** int RL_Do_Block(REBSER *blk, REBCNT flags, RXIARG *result) ** -***********************************************************************/ +** Evaluate a block. (not implemented) +** +** Returns: +** The datatype of the result or zero if error in the encoding. +** Arguments: +** blk - A pointer to the block series +** flags - set to zero for now +** result - value returned from evaluation +** Notes: +** Not implemented. Contact Carl on R3 Chat if you think you +** could use it for something. +** +*/ -#define RL_PRINT_TOS(a,b) RXI->print_tos(a,b) +#define RL_DO_COMMANDS(a,b,c) RL->do_commands(a,b,c) /* -** void RL_Print_TOS(REBCNT flags, REBYTE *marker) +** void RL_Do_Commands(REBSER *blk, REBCNT flags, REBCEC *context) ** -** Print top of stack value. (Actually it is TOS+1). -** Marker is usually "==" to show output. +** Evaluate a block of extension commands at high speed. ** -***********************************************************************/ +** Returns: +** Nothing +** Arguments: +** blk - a pointer to the block series +** flags - set to zero for now +** context - command evaluation context struct or zero if not used. +** Notes: +** For command blocks only, not for other blocks. +** The context allows passing to each command a struct that is +** used for back-referencing your environment data or for tracking +** the evaluation block and its index. +** +*/ -#define RL_EVENT(a) RXI->event(a) +#define RL_PRINT(a,b) RL->print(a,b) /* -** int RL_Event(REBEVT *evt) +** void RL_Print(REBYTE *fmt, ...) ** -** Appends an application event (e.g. GUI) to the event port. -** Sets signal to get REBOL attention for WAIT and awake. -** Returns 0 if queue is full. +** Low level print of formatted data to the console. ** -** To avoid environment problems, this function only appends -** to the event queue (no auto-expand). So if the queue is full -** an error will be returned. If the event is a CLOSE or other -** high-importance signal, the signal will be raised here. +** Returns: +** nothing +** Arguments: +** fmt - A format string similar but not identical to printf. +** Special options are available. +** ... - Values to be formatted. +** Notes: +** This function is low level and handles only a few C datatypes +** at this time. ** -***********************************************************************/ +*/ -#define RL_GET_SERIES(a,b) RXI->get_series(a,b) +#define RL_PRINT_TOS(a,b) RL->print_tos(a,b) /* -** void *RL_Get_Series(REBSER *ser, REBINT what) +** void RL_Print_TOS(REBCNT flags, REBYTE *marker) ** -** Returns information about a series: data, length +** Print top REBOL stack value to the console. (pending changes) ** -***********************************************************************/ +** Returns: +** Nothing +** Arguments: +** flags - special flags (set to zero at this time). +** marker - placed at beginning of line to indicate output. +** Notes: +** This function is used for the main console evaluation +** input loop to print the results of evaluation from stack. +** The REBOL data stack is an abstract structure that can +** change between releases. This function allows the host +** to print the result of processed functions. +** Note that what is printed is actually TOS+1. +** Marker is usually "==" to show output. +** The system/options/result-types determine which values +** are automatically printed. +** +*/ -#define RL_DO_COMMANDS(a,b) RXI->do_commands(a,b) +#define RL_EVENT(a) RL->event(a) /* -** void RL_Do_Commands(REBSER *blk, void *data) +** int RL_Event(REBEVT *evt) ** -***********************************************************************/ +** Appends an application event (e.g. GUI) to the event port. +** +** Returns: +** Returns TRUE if queued, or FALSE if event queue is full. +** Arguments: +** evt - A properly initialized event structure. The +** contents of this structure are copied as part of +** the function, allowing use of locals. +** Notes: +** Sets a signal to get REBOL attention for WAIT and awake. +** To avoid environment problems, this function only appends +** to the event queue (no auto-expand). So if the queue is full +** +*/ -#define RL_MAKE_BLOCK(a) RXI->make_block(a) +#define RL_MAKE_BLOCK(a) RL->make_block(a) /* ** void *RL_Make_Block(u32 size) ** @@ -195,7 +344,7 @@ RXILIB *RXI; // Passed to the Init() function ** However, you can lock blocks to prevent deallocation. (?? default) */ -#define RL_MAKE_STRING(a,b) RXI->make_string(a,b) +#define RL_MAKE_STRING(a,b) RL->make_string(a,b) /* ** void *RL_Make_String(u32 size, int unicode) ** @@ -216,7 +365,7 @@ RXILIB *RXI; // Passed to the Init() function ** However, you can lock strings to prevent deallocation. (?? default) */ -#define RL_MAKE_IMAGE(a,b) RXI->make_image(a,b) +#define RL_MAKE_IMAGE(a,b) RL->make_image(a,b) /* ** void *RL_Make_Image(u32 width, u32 height) ** @@ -233,9 +382,9 @@ RXILIB *RXI; // Passed to the Init() function ** no references to them from REBOL code (C code does nothing.) */ -#define RL_GC_PROTECT(a,b) RXI->gc_protect(a,b) +#define RL_PROTECT_GC(a,b) RL->protect_gc(a,b) /* -** void RL_GC_Protect(REBSER *series, BOOL protect) +** void RL_Protect_GC(REBSER *series, u32 flags) ** ** Protect memory from garbage collection. ** @@ -243,7 +392,7 @@ RXILIB *RXI; // Passed to the Init() function ** nothing ** Arguments: ** series - a series to protect (block, string, image, ...) -** protect - TRUE to protect, FALSE to unprotect +** flags - set to 1 to protect, 0 to unprotect ** Notes: ** You should only use this function when absolutely necessary, ** because it bypasses garbage collection for the specified series. @@ -254,7 +403,7 @@ RXILIB *RXI; // Passed to the Init() function ** find them, such as in an existing block or object (variable). */ -#define RL_GET_STRING(a,b,c) RXI->get_string(a,b,c) +#define RL_GET_STRING(a,b,c) RL->get_string(a,b,c) /* ** int RL_Get_String(REBSER *series, u32 index, void **str) ** @@ -268,11 +417,13 @@ RXILIB *RXI; // Passed to the Init() function ** index - index from beginning (zero-based) ** str - pointer to first character ** Notes: +** If the len is less than zero, then the string is optimized to +** codepoints (chars) 255 or less for ASCII and LATIN-1 charsets. ** Strings are allowed to move in memory. Therefore, you will want ** to make a copy of the string if needed. */ -#define RL_MAP_WORD(a) RXI->map_word(a) +#define RL_MAP_WORD(a) RL->map_word(a) /* ** u32 RL_Map_Word(REBYTE *string) ** @@ -282,13 +433,13 @@ RXILIB *RXI; // Passed to the Init() function ** The word identifier that matches the string. ** Arguments: ** string - a valid word as a UTF-8 encoded string. -** Note: +** Notes: ** Word identifiers are persistent, and you can use them anytime. ** If the word is new (not found in master symbol table) ** it will be added and the new word identifier is returned. */ -#define RL_MAP_WORDS(a) RXI->map_words(a) +#define RL_MAP_WORDS(a) RL->map_words(a) /* ** u32 *RL_Map_Words(REBSER *series) ** @@ -298,14 +449,14 @@ RXILIB *RXI; // Passed to the Init() function ** An array of global word identifiers (integers). The [0] value is the size. ** Arguments: ** series - block of words as values (from REBOL blocks, not strings.) -** Note: +** Notes: ** Word identifiers are persistent, and you can use them anytime. ** The block can include any kind of word, including set-words, lit-words, etc. ** If the input block contains non-words, they will be skipped. ** The array is allocated with OS_MAKE and you can OS_FREE it any time. */ -#define RL_WORD_STRING(a) RXI->word_string(a) +#define RL_WORD_STRING(a) RL->word_string(a) /* ** REBYTE *RL_Word_String(u32 word) ** @@ -315,7 +466,7 @@ RXILIB *RXI; // Passed to the Init() function ** A copy of the word string, null terminated. ** Arguments: ** word - a global word identifier -** Note: +** Notes: ** The result is a null terminated copy of the name for your own use. ** The string is always UTF-8 encoded (chars > 127 are encoded.) ** In this API, word identifiers are always canonical. Therefore, @@ -323,7 +474,7 @@ RXILIB *RXI; // Passed to the Init() function ** The string is allocated with OS_MAKE and you can OS_FREE it any time. */ -#define RL_FIND_WORD(a,b) RXI->find_word(a,b) +#define RL_FIND_WORD(a,b) RL->find_word(a,b) /* ** u32 RL_Find_Word(u32 *words, u32 word) ** @@ -334,13 +485,13 @@ RXILIB *RXI; // Passed to the Init() function ** Arguments: ** words - a word array like that returned from MAP_WORDS (first element is size) ** word - a word id -** Note: +** Notes: ** The first element of the word array is the length of the array. */ -#define RL_SERIES_INFO(a,b) RXI->series_info(a,b) +#define RL_SERIES(a,b) RL->series(a,b) /* -** int RL_Series_Info(REBSER *series, REBCNT what) +** int RL_Series(REBSER *series, REBCNT what) ** ** Get series information. ** @@ -348,10 +499,12 @@ RXILIB *RXI; // Passed to the Init() function ** Returns information related to a series. ** Arguments: ** series - any series pointer (string or block) -** what - indicates what information to return (see enum) +** what - indicates what information to return (see RXI_SER enum) +** Notes: +** Invalid what arg nums will return zero. */ -#define RL_GET_CHAR(a,b) RXI->get_char(a,b) +#define RL_GET_CHAR(a,b) RL->get_char(a,b) /* ** int RL_Get_Char(REBSER *series, u32 index) ** @@ -363,13 +516,13 @@ RXILIB *RXI; // Passed to the Init() function ** Arguments: ** series - string series pointer ** index - zero based index of character -** Note: +** Notes: ** This function works for byte and unicoded strings. ** The maximum size of a Unicode char is determined by ** R3 build options. The default is 16 bits. */ -#define RL_SET_CHAR(a,b,c) RXI->set_char(a,b,c) +#define RL_SET_CHAR(a,b,c) RL->set_char(a,b,c) /* ** u32 RL_Set_Char(REBSER *series, u32 index, u32 chr) ** @@ -384,9 +537,9 @@ RXILIB *RXI; // Passed to the Init() function ** will be appended. */ -#define RL_GET_VALUE(a,b,c) RXI->get_value(a,b,c) +#define RL_GET_VALUE(a,b,c) RL->get_value(a,b,c) /* -** int RL_Get_Value(REBSER *series, u32 index, RXIARG *val) +** int RL_Get_Value(REBSER *series, u32 index, RXIARG *result) ** ** Get a value from a block. ** @@ -395,10 +548,10 @@ RXILIB *RXI; // Passed to the Init() function ** Arguments: ** series - block series pointer ** index - global word identifier (integer) -** val - gets set to the value of the field +** result - set to the value of the field */ -#define RL_SET_VALUE(a,b,c,d) RXI->set_value(a,b,c,d) +#define RL_SET_VALUE(a,b,c,d) RL->set_value(a,b,c,d) /* ** int RL_Set_Value(REBSER *series, u32 index, RXIARG val, int type) ** @@ -413,7 +566,7 @@ RXILIB *RXI; // Passed to the Init() function ** type - datatype of value */ -#define RL_WORDS_OF_OBJECT(a) RXI->words_of_object(a) +#define RL_WORDS_OF_OBJECT(a) RL->words_of_object(a) /* ** u32 *RL_Words_Of_Object(REBSER *obj) ** @@ -423,14 +576,14 @@ RXILIB *RXI; // Passed to the Init() function ** Returns an array of words used as fields of the object. ** Arguments: ** obj - object pointer (e.g. from RXA_OBJECT) -** Note: +** Notes: ** Returns a word array similar to MAP_WORDS(). -** The array is allocated with OS_MAKE and you can OS_FREE it any time. +** The array is allocated with OS_MAKE. You can OS_FREE it any time. */ -#define RL_GET_FIELD(a,b,c) RXI->get_field(a,b,c) +#define RL_GET_FIELD(a,b,c) RL->get_field(a,b,c) /* -** int RL_Get_Field(REBSER *obj, u32 word, RXIARG *val) +** int RL_Get_Field(REBSER *obj, u32 word, RXIARG *result) ** ** Get a field value (context variable) of an object. ** @@ -439,10 +592,10 @@ RXILIB *RXI; // Passed to the Init() function ** Arguments: ** obj - object pointer (e.g. from RXA_OBJECT) ** word - global word identifier (integer) -** val - gets set to the value of the field +** result - gets set to the value of the field */ -#define RL_SET_FIELD(a,b,c,d) RXI->set_field(a,b,c,d) +#define RL_SET_FIELD(a,b,c,d) RL->set_field(a,b,c,d) /* ** int RL_Set_Field(REBSER *obj, u32 word, RXIARG val, int type) ** @@ -457,7 +610,7 @@ RXILIB *RXI; // Passed to the Init() function ** type - datatype of value */ -#define RL_CALLBACK(a) RXI->callback(a) +#define RL_CALLBACK(a) RL->callback(a) /* ** int RL_Callback(RXICBI *cbi) ** @@ -466,23 +619,21 @@ RXILIB *RXI; // Passed to the Init() function ** Returns: ** Sync callback: type of the result; async callback: true if queued ** Arguments: -** cbi - callback information: -** - special option flags -** - object pointer (where function is located) -** - function name as global word identifier (within above object) -** - argument list passed to callback (see notes below) -** - result value -** Description: +** cbi - callback information including special option flags, +** object pointer (where function is located), function name +** as global word identifier (within above object), argument list +** passed to callback (see notes below), and result value. +** Notes: ** The flag value will determine the type of callback. It can be either ** synchronous, where the code will re-enter the interpreter environment ** and call the specified function, or asynchronous where an EVT_CALLBACK ** event is queued, and the callback will be evaluated later when events ** are processed within the interpreter's environment. -** ** For asynchronous callbacks, the cbi and the args array must be managed ** because the data isn't processed until the callback event is ** handled. Therefore, these cannot be allocated locally on ** the C stack; they should be dynamic (or global if so desired.) +** See c:extensions-callbacks */ @@ -494,29 +645,29 @@ RL_API int RL_Start(int reserved); RL_API void RL_Reset(); RL_API void *RL_Extend(REBYTE *source, RXICAL call); RL_API void RL_Escape(REBINT reserved); -RL_API int RL_Do_String(REBYTE *text); -RL_API int RL_Do_Binary(REBYTE *bin, REBINT length, REBCNT flags, REBCNT key); +RL_API int RL_Do_String(REBYTE *text, REBCNT flags, RXIARG *result); +RL_API int RL_Do_Binary(REBYTE *bin, REBINT length, REBCNT flags, REBCNT key, RXIARG *result); +RL_API int RL_Do_Block(REBSER *blk, REBCNT flags, RXIARG *result); +RL_API void RL_Do_Commands(REBSER *blk, REBCNT flags, REBCEC *context); RL_API void RL_Print(REBYTE *fmt, ...); RL_API void RL_Print_TOS(REBCNT flags, REBYTE *marker); RL_API int RL_Event(REBEVT *evt); -RL_API void *RL_Get_Series(REBSER *ser, REBINT what); -RL_API void RL_Do_Commands(REBSER *blk, void *data); RL_API void *RL_Make_Block(u32 size); RL_API void *RL_Make_String(u32 size, int unicode); RL_API void *RL_Make_Image(u32 width, u32 height); -RL_API void RL_GC_Protect(REBSER *series, BOOL protect); +RL_API void RL_Protect_GC(REBSER *series, u32 flags); RL_API int RL_Get_String(REBSER *series, u32 index, void **str); RL_API u32 RL_Map_Word(REBYTE *string); RL_API u32 *RL_Map_Words(REBSER *series); RL_API REBYTE *RL_Word_String(u32 word); RL_API u32 RL_Find_Word(u32 *words, u32 word); -RL_API int RL_Series_Info(REBSER *series, REBCNT what); +RL_API int RL_Series(REBSER *series, REBCNT what); RL_API int RL_Get_Char(REBSER *series, u32 index); RL_API u32 RL_Set_Char(REBSER *series, u32 index, u32 chr); -RL_API int RL_Get_Value(REBSER *series, u32 index, RXIARG *val); +RL_API int RL_Get_Value(REBSER *series, u32 index, RXIARG *result); RL_API int RL_Set_Value(REBSER *series, u32 index, RXIARG val, int type); RL_API u32 *RL_Words_Of_Object(REBSER *obj); -RL_API int RL_Get_Field(REBSER *obj, u32 word, RXIARG *val); +RL_API int RL_Get_Field(REBSER *obj, u32 word, RXIARG *result); RL_API int RL_Set_Field(REBSER *obj, u32 word, RXIARG val, int type); RL_API int RL_Callback(RXICBI *cbi); diff --git a/src/mezz/view-funcs.r b/src/mezz/view-funcs.r index 3d9806c..cc88d59 100644 --- a/src/mezz/view-funcs.r +++ b/src/mezz/view-funcs.r @@ -39,11 +39,11 @@ view: func [ if not screen: system/view/screen-gob [return none] ; Convert option block to a map: - opts: make map! 4 + opts: make map! any [reduce/no-set opts []] case/all [ no-wait [opts/no-wait: true] as-is [opts/as-is: true] - options [append opts reduce/no-set opts] +; options [append opts reduce/no-set opts] ] ; GOB based view: diff --git a/src/os/host-ext-test.c b/src/os/host-ext-test.c deleted file mode 100644 index 07e8bfb..0000000 --- a/src/os/host-ext-test.c +++ /dev/null @@ -1,191 +0,0 @@ -/*********************************************************************** -** -** REBOL 3.0 "Invasion" -** Copyright 2010 REBOL Technologies -** All rights reserved. -** -************************************************************************ -** -** Title: Test for Embedded Extension Modules -** Date: 18-Aug-2010 -** File: host-ext-test.c -** Author: Carl Sassenrath & Needa Volunteer -** Purpose: -** Provides test code for extensions that can be easily -** built and run in the host-kit. Not part of release, -** but can be used as an example. -** See: http://www.rebol.com/r3/docs/concepts/extensions-embedded.html -** -************************************************************************ -** -** NOTE to PROGRAMMERS: -** -** 1. Keep code clear and simple. -** 2. Document unusual code, reasoning, or gotchas. -** 3. Use same style for code, vars, indent(4), comments, etc. -** 4. Keep in mind Linux, OS X, BSD, big/little endian CPUs. -** 5. Test everything, then test it again. -** -***********************************************************************/ - -#include -#include -#include - -#include "reb-host.h" -#include "host-lib.h" - -char *RX_Spec = - "REBOL [\n" - "Title: {Test of Embedded Extension}\n" - "Name: ext-test\n" - "Type: extension\n" - "Exports: [xtest]\n" - "]\n" - - "xarg0: command [{return zero}]\n" - "xarg1: command [{return first arg} arg]\n" - "xarg2: command [{return second arg} arg1 arg2]\n" - "xword0: command [{return system word from internal string}]\n" - "xword1: command [{return word from string} str [string!]]\n" - "xobj1: command [{return obj field value} obj [object!] field [word!]]\n" - "calls: command [{test sync callback} context [object!] word [word!]]\n" - "calla: command [{test async callback} context [object!] word [word!]]\n" - - "xtest: does [\n" - "foreach blk [\n" - "[xarg0]\n" - "[xarg1 111]\n" - "[xarg1 1.1]\n" - "[xarg1 {test}]\n" - "[xarg1 [1 2 3]]\n" - "[xarg2 111 222]\n" - "[xword0]\n" - "[xword1 {system}]\n" - "[xobj1 system 'version]\n" - - // We just use this context as example. Normally, it would be - // your own object that has your special functions within it. - "[calls system/contexts/exports 'negate]\n" - "[calls system/contexts/exports 'sine]\n" - "[calla system/contexts/exports 'print]\n" - "][\n" - "print [{test:} mold blk]\n" - "prin { } \n" - "probe do blk\n" - "]\n" - "wait 0.1 ; let async events happen\n" - "exit\n" - "]\n" - "print {^/type xtest^/^/}\n" -; - - -REBCNT Test_Sync_Callback(REBSER *obj, REBCNT word, RXIARG *result) -{ - RXICBI cbi; - RXIARG args[4]; - REBCNT n; - - // These can be on the stack, because it's synchronous. - CLEAR(&cbi, sizeof(cbi)); - CLEAR(&args[0], sizeof(args)); - cbi.obj = obj; - cbi.word = word; - cbi.args = args; - - // Pass a single integer arg to the callback function: - RXI_COUNT(args) = 1; - RXI_TYPE(args, 1) = RXT_INTEGER; - - args[1].int64 = 123; - - n = RL_CALLBACK(&cbi); - - *result = cbi.result; - return n; -} - - -REBCNT Test_Async_Callback(REBSER *obj, REBCNT word) -{ - RXICBI *cbi; - RXIARG *args; - REBCNT n; - - // These cannot be on the stack, because they are used - // when the callback happens later. - cbi = MAKE_NEW(*cbi); - CLEAR(cbi, sizeof(cbi)); - args = MAKE_MEM(sizeof(RXIARG) * 4); - CLEAR(args, sizeof(RXIARG) * 4); - cbi->obj = obj; - cbi->word = word; - cbi->args = args; - SET_FLAG(cbi->flags, RXC_ASYNC); - - // Pass a single integer arg to the callback function: - RXI_COUNT(args) = 1; - RXI_TYPE(args, 1) = RXT_INTEGER; - - args[1].int64 = 123; - - n = RL_CALLBACK(cbi); // result is in cbi struct, if wanted - - return n; -} - - -RXIEXT int RX_Call(int cmd, RXIFRM *frm, void *data) { - REBYTE *str; - - switch (cmd) { - - case 0: - RXA_INT64(frm, 1) = 0; - RXA_TYPE(frm, 1) = RXT_INTEGER; - break; - - case 1: - break; // same as arg - - case 2: - RXA_INT64(frm, 1) = RXA_INT64(frm, 2); - RXA_TYPE(frm, 1) = RXA_TYPE(frm, 2); - break; - - case 3: - RXA_WORD(frm, 1) = RL_MAP_WORD("system"); //?? is frame always long enough?? - RXA_TYPE(frm, 1) = RXT_WORD; - break; - - case 4: - RL_GET_STRING(RXA_SERIES(frm, 1), 0, (void*)(&str)); // latin-1 only for test - RXA_WORD(frm, 1) = RL_MAP_WORD(str); - RXA_TYPE(frm, 1) = RXT_WORD; - break; - - case 5: - RXA_TYPE(frm, 1) = RL_GET_FIELD(RXA_OBJECT(frm, 1), RXA_WORD(frm, 2), &RXA_ARG(frm, 1)); - break; - - case 6: - RXA_TYPE(frm, 1) = Test_Sync_Callback(RXA_OBJECT(frm, 1), RXA_WORD(frm, 2), &RXA_ARG(frm, 1)); - break; - - case 7: - RXA_LOGIC(frm, 1) = Test_Async_Callback(RXA_OBJECT(frm, 1), RXA_WORD(frm, 2)); - RXA_TYPE(frm, 1) = RXT_LOGIC; - break; - - default: - return RXR_NO_COMMAND; - } - return RXR_VALUE; -} - - -void Init_Ext_Test(void) -{ - RXI = RL_Extend(&RX_Spec[0], &RX_Call); -} diff --git a/src/os/host-main.c b/src/os/host-main.c index b787886..48abb3d 100644 --- a/src/os/host-main.c +++ b/src/os/host-main.c @@ -43,9 +43,7 @@ #include "reb-host.h" // standard host include files #include "host-lib.h" // OS host library (dispatch table) -//#include "rebol-lib.h" // REBOL library (function prototypes) - -#include "host-init.c" +#include "host-init.h" /**********************************************************************/ @@ -74,7 +72,7 @@ void Put_Str(char *buf); REBYTE *Get_Str(); void Host_Crash(REBYTE *reason) { - OS_Crash("REBOL host failure", reason); + OS_Crash("REBOL Host Failure", reason); } @@ -124,13 +122,18 @@ int main(int argc, char **argv) vers[0] = 5; // len RL_Version(&vers[0]); + // Must be done before an console I/O can occur. Does not use reb-lib, + // so this device should open even if there are other problems. Open_StdIO(); // also sets up interrupt handler - // Initialize the REBOL library: + // Initialize the REBOL library (reb-lib): + if (!CHECK_STRUCT_ALIGN) Host_Crash("Incompatible struct alignment"); if (!Host_Lib) Host_Crash("Missing host lib"); + // !!! Second part will become vers[2] < RL_REV on release!!! + if (vers[1] != RL_VER || vers[2] != RL_REV) Host_Crash("Incompatible reb-lib DLL"); n = RL_Init(&Main_Args, Host_Lib); - if (n == 1) Host_Crash("REBOL DLL wrong size"); - if (n == 2) Host_Crash("REBOL DLL wrong version/checksum"); + if (n == 1) Host_Crash("Host-lib wrong size"); + if (n == 2) Host_Crash("Host-lib wrong version/checksum"); #ifndef CORE_ONLY Init_Windows(); @@ -142,7 +145,7 @@ int main(int argc, char **argv) #endif // Initialize host bundled source code: - RL_Do_Binary((REBYTE *)(&Reb_Init_Code[0]), REB_INIT_SIZE, 0, 0); + RL_Do_Binary((REBYTE *)(&Reb_Init_Code[0]), REB_INIT_SIZE, 0, 0, 0); // Run REBOL's mezzanine bootstrap: n = (Main_Args.options & RO_NO_BOOT) ? TRUE : RL_Start(0); // TRUE on halt @@ -156,7 +159,7 @@ int main(int argc, char **argv) while (TRUE) { Put_Str(PROMPT_STR); if ((line = Get_Str())) { - RL_Do_String(line); + RL_Do_String(line, 0, 0); RL_Print_TOS(0, RESULT_STR); OS_Free(line); } diff --git a/src/os/win32/host-graphics.c b/src/os/win32/host-graphics.c index 8be4cb0..2295833 100644 --- a/src/os/win32/host-graphics.c +++ b/src/os/win32/host-graphics.c @@ -7,9 +7,9 @@ ************************************************************************ ** ** Title: Graphics Compositing -** Date: 5-July-2010 +** Date: 1-Sep-2010 ** File: host-graphics.c -** Author: Carl (and soon Cyphre) +** Author: Cyphre, Carl ** Purpose: Interface from graphics commands to AGG library. ** Tools: make-host-ext.r ** @@ -28,20 +28,93 @@ #include #include "reb-host.h" -#include "host-lib.h" +#include "host-lib.h" #include "agg-draw.h" +#include "agg-text.h" + +#define INCLUDE_EXT_DATA #include "host-ext-graphics.h" #include "host-ext-draw.h" - -// REBOL Sources: -#include "../host-ext-graphics.c" -#include "../host-ext-draw.c" +#include "host-ext-shape.h" +#include "host-ext-text.h" //***** Externs ***** extern REBINT Show_Gob(REBGOB *gob); +extern HCURSOR Cursor; +static REBOOL Custom_Cursor = FALSE; + +static u32* draw_ext_words; +static u32* shape_ext_words; +static u32* text_ext_words; + +void* Rich_Text; + +RL_LIB *RL; // Link back to reb-lib from embedded extensions + +/*********************************************************************** +** +*/ HCURSOR Image_To_Cursor(REBYTE* image, REBINT width, REBINT height) +/* +** Converts REBOL image! to Windows CURSOR +** +***********************************************************************/ +{ + int xHotspot = 0; + int yHotspot = 0; + + HICON result = NULL; + HBITMAP hSourceBitmap; + BITMAPINFO BitmapInfo; + ICONINFO iconinfo; + + //Get the system display DC + HDC hDC = GetDC(NULL); + + //Create DIB + unsigned char* ppvBits; + int bmlen = width * height * 4; + int i; + + BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + BitmapInfo.bmiHeader.biWidth = width; + BitmapInfo.bmiHeader.biHeight = -(signed)height; + BitmapInfo.bmiHeader.biPlanes = 1; + BitmapInfo.bmiHeader.biBitCount = 32; + BitmapInfo.bmiHeader.biCompression = BI_RGB; + BitmapInfo.bmiHeader.biSizeImage = 0; + BitmapInfo.bmiHeader.biXPelsPerMeter = 0; + BitmapInfo.bmiHeader.biYPelsPerMeter = 0; + BitmapInfo.bmiHeader.biClrUsed = 0; + BitmapInfo.bmiHeader.biClrImportant = 0; + + hSourceBitmap = CreateDIBSection(hDC, &BitmapInfo, DIB_RGB_COLORS, (void**)&ppvBits, NULL, 0); + + //Release the system display DC + ReleaseDC(NULL, hDC); + + //Copy the image content to DIB + COPY_MEM(ppvBits, image, bmlen); + + //Invert alphachannel from the REBOL format + for (i = 3;i < bmlen;i+=4){ + ppvBits[i] ^= 0xff; + } + //Create the cursor using the masks and the hotspot values provided + iconinfo.fIcon = FALSE; + iconinfo.xHotspot = xHotspot; + iconinfo.yHotspot = yHotspot; + iconinfo.hbmMask = hSourceBitmap; + iconinfo.hbmColor = hSourceBitmap; + + result = CreateIconIndirect(&iconinfo); + + DeleteObject(hSourceBitmap); + + return result; +} /*********************************************************************** ** @@ -51,11 +124,35 @@ extern REBINT Show_Gob(REBGOB *gob); ** ***********************************************************************/ { - RL_Do_Commands(block, graphics); + REBCEC ctx; + + ctx.envr = graphics; + ctx.block = block; + ctx.index = 0; + + RL_Do_Commands(block, 0, &ctx); return 0; } +/*********************************************************************** +** +*/ REBINT Text_Gob(void *richtext, REBSER *block) +/* +** Temporary trampoline. Move to compositor! +** +***********************************************************************/ +{ + REBCEC ctx; + + ctx.envr = richtext; + ctx.block = block; + ctx.index = 0; + + RL_Do_Commands(block, 0, &ctx); + return 0; +} + /*********************************************************************** ** */ RXIEXT int RXD_Graphics(int cmd, RXIFRM *frm, void *data) @@ -70,10 +167,129 @@ extern REBINT Show_Gob(REBGOB *gob); Show_Gob((REBGOB*)RXA_SERIES(frm, 1)); break; + case CMD_GRAPHICS_SIZE_TEXT: + if (Rich_Text) { + RXA_TYPE(frm, 2) = RXT_PAIR; + rt_size_text(Rich_Text, (REBGOB*)RXA_SERIES(frm, 1),&RXA_PAIR(frm, 2)); + RXA_PAIR(frm, 1).x = RXA_PAIR(frm, 2).x; + RXA_PAIR(frm, 1).y = RXA_PAIR(frm, 2).y; + RXA_TYPE(frm, 1) = RXT_PAIR; + return RXR_VALUE; + } + + break; + + case CMD_GRAPHICS_OFFSET_TO_CARET: + if (Rich_Text) { + REBINT element = 0, position = 0; + rt_offset_to_caret(Rich_Text, (REBGOB*)RXA_SERIES(frm, 1), RXA_PAIR(frm, 2), &element, &position); +// RL_Print("OTC: %d, %d\n", element, position); + REBSER* dialect = (REBSER *)GOB_CONTENT((REBGOB*)RXA_SERIES(frm, 1)); + REBSER* block = RL_MAKE_BLOCK(RL_SERIES(dialect, RXI_SER_TAIL)); + RXIARG val, str; + REBCNT n, type; + for (n = 0; type = RL_GET_VALUE(dialect, n, &val); n++) { + if (n == element) val.index = position; + RL_SET_VALUE(block, n, val, type); + } + + RXA_TYPE(frm, 1) = RXT_BLOCK; + RXA_SERIES(frm, 1) = block; + RXA_INDEX(frm, 1) = element; + + return RXR_VALUE; + } + + break; + + case CMD_GRAPHICS_CARET_TO_OFFSET: + if (Rich_Text) { + REBXYF result; + REBINT elem,pos; + if (RXA_TYPE(frm, 2) == RXT_INTEGER){ + elem = RXA_INT64(frm, 2)-1; + } else { + elem = RXA_INDEX(frm, 2); + } + if (RXA_TYPE(frm, 3) == RXT_INTEGER){ + pos = RXA_INT64(frm, 3)-1; + } else { + pos = RXA_INDEX(frm, 3); + } +// RL_Print("CTO: %d, %d\n", element, position); + rt_caret_to_offset(Rich_Text, (REBGOB*)RXA_SERIES(frm, 1), &result, elem, pos); + + RXA_PAIR(frm, 1).x = result.x; + RXA_PAIR(frm, 1).y = result.y; + RXA_TYPE(frm, 1) = RXT_PAIR; + return RXR_VALUE; + } + break; + + case CMD_GRAPHICS_CURSOR: + { + REBINT n = 0; + REBSER image = 0; + + if (RXA_TYPE(frm, 1) == RXT_IMAGE) { + image = RXA_IMAGE_BITS(frm,1); + } else { + n = RXA_INT64(frm,1); + } + + if (Custom_Cursor) { + //Destroy cursor object only if it is a custom image + DestroyCursor(Cursor); + Custom_Cursor = FALSE; + } + + if (n > 0) + Cursor = LoadCursor(NULL, (LPCTSTR)n); + else if (image) { + Cursor = Image_To_Cursor(image, RXA_IMAGE_WIDTH(frm,1), RXA_IMAGE_HEIGHT(frm,1)); + Custom_Cursor = TRUE; + } else + Cursor = NULL; + + SetCursor(Cursor); + + } + break; + + case CMD_GRAPHICS_DRAW: + { + REBYTE* img = 0; + REBINT w,h; + if (RXA_TYPE(frm, 1) == RXT_IMAGE) { + img = RXA_IMAGE_BITS(frm, 1); + w = RXA_IMAGE_WIDTH(frm, 1); + h = RXA_IMAGE_HEIGHT(frm, 1); + } else { + REBSER* i; + w = RXA_PAIR(frm,1).x; + h = RXA_PAIR(frm,1).y; + i = RL_MAKE_IMAGE(w,h); + img = (REBYTE *)RL_SERIES(i, RXI_SER_DATA); + + RXA_TYPE(frm, 1) = RXT_IMAGE; + RXA_ARG(frm, 1).width = w; + RXA_ARG(frm, 1).height = h; + RXA_ARG(frm, 1).image = i; + } + Draw_Image(img, w, h, RXA_SERIES(frm, 2)); + return RXR_VALUE; + } + break; + case CMD_GRAPHICS_INIT: Gob_Root = (REBGOB*)RXA_SERIES(frm, 1); // system/view/screen-gob Gob_Root->size.x = (REBD32)GetSystemMetrics(SM_CXSCREEN); Gob_Root->size.y = (REBD32)GetSystemMetrics(SM_CYSCREEN); + + //Initialize text rendering context + if (Rich_Text) Destroy_RichText(Rich_Text); + Rich_Text = Create_RichText(); + break; default: @@ -82,26 +298,723 @@ extern REBINT Show_Gob(REBGOB *gob); return RXR_UNSET; } +/*********************************************************************** +** +*/ RXIEXT int RXD_Text(int cmd, RXIFRM *frm, REBCEC *ctx) +/* +** DRAW command dispatcher. +** +***********************************************************************/ +{ + switch (cmd) { + + case CMD_TEXT_INIT_WORDS: + //temp hack - will be removed later + text_ext_words = RL_MAP_WORDS(RXA_SERIES(frm,1)); + break; + + case CMD_TEXT_ANTI_ALIAS: + rt_anti_alias(ctx->envr, RXA_LOGIC(frm, 1)); + break; + + case CMD_TEXT_BOLD: + rt_bold(ctx->envr, RXA_LOGIC(frm, 1)); + break; + + case CMD_TEXT_CARET: + { + RXIARG val; + u32 *words, *w; + REBSER *obj; + REBCNT type; + REBXYF caret, highlightStart, highlightEnd; + REBXYF *pcaret = 0, *phighlightStart = 0; + obj = RXA_OBJECT(frm, 1); +//Reb_Print("RXI_WORDS_OF_OBJECT() called\n"); + words = RL_WORDS_OF_OBJECT(obj); +//Reb_Print("RXI_WORDS_OF_OBJECT() OK\n"); + w = words; + + while (type = RL_GET_FIELD(obj, w[0], &val)) + { +// RL_Print("word: %d %d %d\n", w[0],w[1], (REBYTE)w[1]); + switch(RL_FIND_WORD(text_ext_words,w[0])) + { + case W_TEXT_CARET: + if (type == RXT_BLOCK){ + REBSER* block = val.series; + REBINT len = RL_SERIES(block, RXI_SER_TAIL); + if (len > 1){ + RXIARG pos, elem; + if ( + RL_GET_VALUE(block, 0, &pos) == RXT_BLOCK && + RL_GET_VALUE(block, 1, &elem) == RXT_STRING + ){ + caret.x = 1 + pos.index; + caret.y = 1 + elem.index; + pcaret = ⁁ + } + } + } + break; + + case W_TEXT_HIGHLIGHT_START: + if (type == RXT_BLOCK){ + REBSER* block = val.series; + REBINT len = RL_SERIES(block, RXI_SER_TAIL); + if (len > 1){ + RXIARG pos, elem; + if ( + RL_GET_VALUE(block, 0, &pos) == RXT_BLOCK && + RL_GET_VALUE(block, 1, &elem) == RXT_STRING + ){ + highlightStart.x = 1 + pos.index; + highlightStart.y = 1 + elem.index; + phighlightStart = &highlightStart; + } + } + } + break; + + case W_TEXT_HIGHLIGHT_END: + if (type == RXT_BLOCK){ + REBSER* block = val.series; + REBINT len = RL_SERIES(block, RXI_SER_TAIL); + if (len > 1){ + RXIARG pos, elem; + if ( + RL_GET_VALUE(block, 0, &pos) == RXT_BLOCK && + RL_GET_VALUE(block, 1, &elem) == RXT_STRING + ){ + highlightEnd.x = 1 + pos.index; + highlightEnd.y = 1 + elem.index; + } + } + } + break; + } + + w++; + } + OS_Free(words); + rt_caret(ctx->envr, pcaret, phighlightStart, highlightEnd); + } + + break; + + case CMD_TEXT_CENTER: + rt_center(ctx->envr); + break; + + case CMD_TEXT_COLOR: + rt_color(ctx->envr, RXA_TUPLE(frm,1) + 1); + break; + + case CMD_TEXT_DROP: + rt_drop(ctx->envr, RXA_INT64(frm,1)); + break; + + case CMD_TEXT_FONT: + { + RXIARG val; + u32 *words,*w; + REBSER *obj; + REBCNT type; + REBFNT *font = rt_get_font(ctx->envr); + + obj = RXA_OBJECT(frm, 1); + words = RL_WORDS_OF_OBJECT(obj); + w = words; + + while (type = RL_GET_FIELD(obj, w[0], &val)) + { + switch(RL_FIND_WORD(text_ext_words,w[0])) + { + case W_TEXT_NAME: + if (type == RXT_STRING){ + wchar_t* str; + REBCNT gc = TRUE; + if (RL_GET_STRING(val.series, 0 , (void*)&str) < 0){ + size_t newSize = mbstowcs(NULL, (char*)str, 0) + 1; + size_t origsize = strlen((char*)str) + 1; + //note: following string will be deallocated by the rich text module + wchar_t* wstr = OS_Make(newSize * sizeof( wchar_t )); + mbstowcs(wstr, (char*)str, newSize); + str = wstr; + gc = FALSE; + } + font->name = str; + font->name_gc = gc; + } + break; + + case W_TEXT_STYLE: + switch(type) + { + case RXT_WORD: + { + u32 styleWord = RL_FIND_WORD(text_ext_words,val.int32a); + if (styleWord) rt_set_font_styles(font, styleWord); + } + break; + + case RXT_BLOCK: + { + RXIARG styleVal; + REBCNT styleType; + REBCNT n; + u32 styleWord; + for (n = 0; styleType = RL_GET_VALUE(val.series, n, &styleVal); n++) { + if (styleType == RXT_WORD) { + styleWord = RL_FIND_WORD(text_ext_words,styleVal.int32a); + if (styleWord) rt_set_font_styles(font, styleWord); + } + } + } + break; + } + break; + + case W_TEXT_SIZE: + if (type == RXT_INTEGER) + font->size = val.int64; + break; + + case W_TEXT_COLOR: + if (type == RXT_TUPLE) + memcpy(font->color,val.bytes + 1 , 4); + break; + + case W_TEXT_OFFSET: + if (type == RXT_PAIR) { + font->offset_x = val.pair.x; + font->offset_y = val.pair.y; + } + break; + + case W_TEXT_SPACE: + if (type == RXT_PAIR) { + font->space_x = val.pair.x; + font->space_y = val.pair.y; + } + break; + + case W_TEXT_SHADOW: + switch(type) + { + case RXT_PAIR: + { + font->shadow_x = val.pair.x; + font->shadow_y = val.pair.y; + } + break; + + case RXT_BLOCK: + { + RXIARG shadowVal; + REBCNT shadowType; + REBCNT n; + for (n = 0; shadowType = RL_GET_VALUE(val.series, n, &shadowVal); n++) { + switch (shadowType) + { + case RXT_PAIR: + font->shadow_x = shadowVal.pair.x; + font->shadow_y = shadowVal.pair.y; + break; + + case RXT_TUPLE: + memcpy(font->shadow_color,shadowVal.bytes + 1 , 4); + break; + + case RXT_INTEGER: + font->shadow_blur = shadowVal.int64; + break; + } + } + } + break; + } + break; + } + + w++; + } + OS_Free(words); + rt_font(ctx->envr, font); + } + break; + + case CMD_TEXT_ITALIC: + rt_italic(ctx->envr, RXA_LOGIC(frm, 1)); + break; + + case CMD_TEXT_LEFT: + rt_left(ctx->envr); + break; + + case CMD_TEXT_NEWLINE: + rt_newline(ctx->envr, ctx->index + 1); + break; + + case CMD_TEXT_PARA: + { + RXIARG val; + u32 *words,*w; + REBSER *obj; + REBCNT type; + REBPRA *para = rt_get_para(ctx->envr); + + obj = RXA_OBJECT(frm, 1); + words = RL_WORDS_OF_OBJECT(obj); + w = words; + + while (type = RL_GET_FIELD(obj, w[0], &val)) + { + switch(RL_FIND_WORD(text_ext_words,w[0])) + { + case W_TEXT_ORIGIN: + if (type == RXT_PAIR) { + para->origin_x = val.pair.x; + para->origin_y = val.pair.y; + } + break; + case W_TEXT_MARGIN: + if (type == RXT_PAIR) { + para->margin_x = val.pair.x; + para->margin_y = val.pair.y; + } + break; + case W_TEXT_INDENT: + if (type == RXT_PAIR) { + para->indent_x = val.pair.x; + para->indent_y = val.pair.y; + } + break; + case W_TEXT_TABS: + if (type == RXT_INTEGER) { + para->tabs = val.int64; + } + break; + case W_TEXT_WRAPQ: + if (type == RXT_LOGIC) { + para->wrap = val.int32a; + } + break; + case W_TEXT_SCROLL: + if (type == RXT_PAIR) { + para->scroll_x = val.pair.x; + para->scroll_y = val.pair.y; + } + break; + case W_TEXT_ALIGN: + if (type == RXT_WORD) { + para->align = RL_FIND_WORD(text_ext_words,val.int32a); + } + break; + case W_TEXT_VALIGN: + if (type == RXT_WORD) { + para->valign = RL_FIND_WORD(text_ext_words,val.int32a); + } + break; + } + + w++; + } + OS_Free(words); + rt_para(ctx->envr, para); + } + break; + + case CMD_TEXT_RIGHT: + rt_right(ctx->envr); + break; + + case CMD_TEXT_SCROLL: + rt_scroll(ctx->envr, RXA_PAIR(frm, 1)); + break; + + case CMD_TEXT_SHADOW: + rt_shadow(ctx->envr, RXA_PAIR(frm, 1), RXA_TUPLE(frm,2) + 1, RXA_INT64(frm,3)); + break; + + case CMD_TEXT_SIZE: + rt_font_size(ctx->envr, RXA_INT64(frm,1)); + break; + + case CMD_TEXT_TEXT: + { + REBCHR* str; + REBCNT gc = TRUE; + if (RL_GET_STRING(RXA_SERIES(frm, 1), 0 , (void*)&str) < 0){ + size_t newSize = mbstowcs(NULL, (char*)str, 0) + 1; + size_t origsize = strlen((char*)str) + 1; + //note: following string will be deallocated by the rich text module + wchar_t* wstr = OS_Make(newSize * sizeof( wchar_t )); + mbstowcs(wstr, (char*)str, newSize); + str = (REBCHR*)wstr; + gc = FALSE; + } + rt_text(ctx->envr, str, ctx->index + 2, gc); + } + break; + + case CMD_TEXT_UNDERLINE: + rt_underline(ctx->envr, RXA_LOGIC(frm, 1)); + break; + + default: + return RXR_NO_COMMAND; + } + return RXR_UNSET; +} + + +/*********************************************************************** +** +*/ RXIEXT int RXD_Shape(int cmd, RXIFRM *frm, REBCEC *ctx) +/* +** DRAW command dispatcher. +** +***********************************************************************/ +{ +// Reb_Print("SHAPE called\n"); + REBCNT rel = 0; + + switch (cmd) { + + case CMD_SHAPE_INIT_WORDS: + //temp hack - will be removed later + shape_ext_words = RL_MAP_WORDS(RXA_SERIES(frm,1)); + break; + + case CMD_SHAPE_ARC_LIT: + rel = 1; + case CMD_SHAPE_ARC: + agg_path_arc( + ctx->envr, + rel, + RXA_PAIR(frm, 1), + RXA_PAIR(frm, 2), + (RXA_TYPE(frm, 3) == RXT_DECIMAL) ? RXA_DEC64(frm, 3) : RXA_INT64(frm, 3), + RL_FIND_WORD(shape_ext_words , RXA_WORD(frm, 4)) - W_SHAPE_NEGATIVE, + RL_FIND_WORD(shape_ext_words , RXA_WORD(frm, 5)) - W_SHAPE_SMALL + ); + break; + + case CMD_SHAPE_CLOSE: + agg_path_close(ctx->envr); + break; + + case CMD_SHAPE_CURV_LIT: + rel = 1; + case CMD_SHAPE_CURV: + { + RXIARG val[2]; + REBCNT type; + REBCNT n, m = 0; + REBSER blk = RXA_SERIES(frm, 1); + + for (n = 0; type = RL_GET_VALUE(blk, n, &val[m]); n++) { + if (type == RXT_PAIR && ++m == 2) { + agg_path_curv(ctx->envr, rel, val[0].pair, val[1].pair); + m = 0; + } + } + } + break; + + case CMD_SHAPE_CURVE_LIT: + rel = 1; + case CMD_SHAPE_CURVE: + { + RXIARG val[3]; + REBCNT type; + REBCNT n, m = 0; + REBSER blk = RXA_SERIES(frm, 1); + + for (n = 0; type = RL_GET_VALUE(blk, n, &val[m]); n++) { + if (type == RXT_PAIR && ++m == 3) { + agg_path_curve(ctx->envr, rel, val[0].pair, val[1].pair, val[2].pair); + m = 0; + } + } + } + break; + + case CMD_SHAPE_HLINE_LIT: + rel = 1; + case CMD_SHAPE_HLINE: + agg_path_hline(ctx->envr, rel, (RXA_TYPE(frm, 1) == RXT_DECIMAL) ? RXA_DEC64(frm, 1) : RXA_INT64(frm, 1)); + break; + + case CMD_SHAPE_LINE_LIT: + rel = 1; + case CMD_SHAPE_LINE: + if (RXA_TYPE(frm, 1) == RXT_PAIR) + agg_path_line(ctx->envr, rel, RXA_PAIR(frm, 1)); + else { + RXIARG val; + REBCNT type; + REBCNT n; + REBSER blk = RXA_SERIES(frm, 1); + + for (n = 0; type = RL_GET_VALUE(blk, n, &val); n++) { + if (type == RXT_PAIR) + agg_path_line(ctx->envr, rel, val.pair); + } + } + break; + + case CMD_SHAPE_MOVE_LIT: + rel = 1; + case CMD_SHAPE_MOVE: + agg_path_move(ctx->envr, rel, RXA_PAIR(frm, 1)); + break; + + case CMD_SHAPE_QCURV_LIT: + rel = 1; + case CMD_SHAPE_QCURV: + agg_path_qcurv(ctx->envr, rel, RXA_PAIR(frm, 1)); + break; + + case CMD_SHAPE_QCURVE_LIT: + rel = 1; + case CMD_SHAPE_QCURVE: + { + RXIARG val[2]; + REBCNT type; + REBCNT n, m = 0; + REBSER blk = RXA_SERIES(frm, 1); + + for (n = 0; type = RL_GET_VALUE(blk, n, &val[m]); n++) { + if (type == RXT_PAIR && ++m == 2) { + agg_path_qcurve(ctx->envr, rel, val[0].pair, val[1].pair); + m = 0; + } + } + } + break; + + case CMD_SHAPE_VLINE_LIT: + rel = 1; + case CMD_SHAPE_VLINE: + agg_path_vline(ctx->envr, rel, (RXA_TYPE(frm, 1) == RXT_DECIMAL) ? RXA_DEC64(frm, 1) : RXA_INT64(frm, 1)); + break; + + default: + return RXR_NO_COMMAND; + } + + return RXR_UNSET; +} /*********************************************************************** ** -*/ RXIEXT int RXD_Draw(int cmd, RXIFRM *frm, void *data) +*/ RXIEXT int RXD_Draw(int cmd, RXIFRM *frm, REBCEC *ctx) /* -** DARW command dispatcher. +** DRAW command dispatcher. ** ***********************************************************************/ { switch (cmd) { + case CMD_DRAW_INIT_WORDS: + //temp hack - will be removed later + draw_ext_words = RL_MAP_WORDS(RXA_SERIES(frm,1)); + break; + case CMD_DRAW_ANTI_ALIAS: + agg_anti_alias(ctx->envr, RXA_LOGIC(frm, 1)); + break; + + case CMD_DRAW_ARC: + agg_arc( + ctx->envr, + RXA_PAIR(frm, 1), + RXA_PAIR(frm, 2), + (RXA_TYPE(frm, 3) == RXT_DECIMAL) ? RXA_DEC64(frm, 3) : RXA_INT64(frm, 3), + (RXA_TYPE(frm, 4) == RXT_DECIMAL) ? RXA_DEC64(frm, 4) : RXA_INT64(frm, 4), + RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 5)) - W_DRAW_OPENED + ); + break; + + case CMD_DRAW_ARROW: + agg_arrow(ctx->envr, RXA_PAIR(frm, 1), (RXA_TYPE(frm, 2) == RXT_NONE) ? NULL : RXA_TUPLE(frm, 2)+1); + break; + case CMD_DRAW_BOX: - agg_box(data, RXA_PAIR(frm, 1), RXA_PAIR(frm, 2), 0); + agg_box(ctx->envr, RXA_PAIR(frm, 1), RXA_PAIR(frm, 2), (RXA_TYPE(frm, 3) == RXT_DECIMAL) ? RXA_DEC64(frm, 3) : RXA_INT64(frm, 3)); break; case CMD_DRAW_CIRCLE: - agg_circle(data, RXA_PAIR(frm, 1), RXA_PAIR(frm, 2)); + agg_circle(ctx->envr, RXA_PAIR(frm, 1), RXA_PAIR(frm, 2)); + break; + + case CMD_DRAW_CLIP: + agg_clip(ctx->envr, RXA_PAIR(frm, 1), RXA_PAIR(frm, 2)); + break; + + case CMD_DRAW_CURVE: + if (RXA_TYPE(frm, 4) == RXT_NONE) + agg_curve3(ctx->envr, RXA_PAIR(frm, 1), RXA_PAIR(frm, 2), RXA_PAIR(frm, 3)); + else + agg_curve4(ctx->envr, RXA_PAIR(frm, 1), RXA_PAIR(frm, 2), RXA_PAIR(frm, 3), RXA_PAIR(frm, 4)); + + break; + + case CMD_DRAW_ELLIPSE: + agg_ellipse(ctx->envr, RXA_PAIR(frm, 1), RXA_PAIR(frm, 2)); + break; + + case CMD_DRAW_FILL_PEN: + { + REBYTE* val; + REBCNT type; + REBSER* img; + + if (RXA_TYPE(frm, 1) == RXT_TUPLE) + agg_fill_pen(ctx->envr, RXA_TUPLE(frm, 1)+1); + else if (RXA_TYPE(frm, 1) == RXT_LOGIC && !RXA_LOGIC(frm,1)) + agg_fill_pen(ctx->envr, NULL); + else { + agg_fill_pen_image(ctx->envr, RXA_IMAGE_BITS(frm,1), RXA_IMAGE_WIDTH(frm,1), RXA_IMAGE_HEIGHT(frm,1)); + } + } + break; + + case CMD_DRAW_FILL_RULE: + agg_fill_rule(ctx->envr, RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 1))); + break; + + case CMD_DRAW_GAMMA: + agg_gamma(ctx->envr, (RXA_TYPE(frm, 1) == RXT_DECIMAL) ? RXA_DEC64(frm, 1) : RXA_INT64(frm, 1)); + break; + + case CMD_DRAW_GRAD_PEN: + if (RXA_TYPE(frm, 7) == RXT_NONE) + agg_reset_gradient_pen(ctx->envr); + else + agg_gradient_pen( + ctx->envr, + RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 1)), //type + RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 2)), //mode + RXA_PAIR(frm, 3), //offset + RXA_PAIR(frm, 4), //range - (begin, end) + (RXA_TYPE(frm, 5) == RXT_DECIMAL) ? RXA_DEC64(frm, 5) : RXA_INT64(frm, 5), // angle + RXA_PAIR(frm, 6), // scale + RXA_SERIES(frm, 7) // unsigned char *colors + ); + break; + + case CMD_DRAW_IMAGE: + if (RXA_TYPE(frm, 2) == RXT_PAIR) + agg_image(ctx->envr, RXA_IMAGE_BITS(frm,1), RXA_IMAGE_WIDTH(frm,1), RXA_IMAGE_HEIGHT(frm,1), RXA_PAIR(frm, 2)); + else { + agg_image_scale(ctx->envr, RXA_IMAGE_BITS(frm,1), RXA_IMAGE_WIDTH(frm,1), RXA_IMAGE_HEIGHT(frm,1), RXA_SERIES(frm, 2)); + } + break; + + case CMD_DRAW_IMAGE_FILTER: + agg_image_filter( + ctx->envr, + RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 1)) - W_DRAW_NEAREST, + RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 2)) - W_DRAW_RESIZE, + (RXA_TYPE(frm, 3) == RXT_NONE) ? 1.0 : (RXA_TYPE(frm, 3) == RXT_DECIMAL) ? RXA_DEC64(frm, 3) : RXA_INT64(frm, 3) + ); + break; + + case CMD_DRAW_IMAGE_OPTIONS: + agg_image_options(ctx->envr, (RXA_TYPE(frm, 1) == RXT_NONE) ? NULL : RXA_TUPLE(frm, 1)+1, RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 2)) - W_DRAW_NO_BORDER); + break; + + case CMD_DRAW_IMAGE_PATTERN: + agg_image_pattern(ctx->envr, RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 1)) - W_DRAW_NORMAL, RXA_PAIR(frm, 2), RXA_PAIR(frm, 3)); + break; + + + case CMD_DRAW_LINE: + { + RXIARG val[2]; + REBCNT type; + REBCNT n, m = 0; + REBSER blk = RXA_SERIES(frm, 1); + + for (n = 0; type = RL_GET_VALUE(blk, n, &val[m]); n++) { + if (type == RXT_PAIR) { + switch (++m){ + case 1: + agg_path_open(ctx->envr); + break; + case 2: + agg_line(ctx->envr, val[0].pair,val[1].pair); + val[0] = val[1]; + m--; + break; + } + } + } + } + break; + + case CMD_DRAW_LINE_CAP: + agg_line_cap(ctx->envr, RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 1)) - W_DRAW_BUTT); + break; + + case CMD_DRAW_LINE_JOIN: + agg_line_join(ctx->envr, RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 1)) - W_DRAW_MITER); + break; + + case CMD_DRAW_LINE_WIDTH: + agg_line_width(ctx->envr, (RXA_TYPE(frm, 1) == RXT_DECIMAL) ? RXA_DEC64(frm, 1) : RXA_INT64(frm, 1), RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 2)) - W_DRAW_VARIABLE); + break; + + case CMD_DRAW_LINE_PATTERN: + if (RXA_TYPE(frm, 2) == RXT_NONE) + agg_line_pattern(ctx->envr, NULL, NULL); + else { + REBSER patterns = RXA_SERIES(frm, 2); + REBINT len = RL_SERIES(patterns, RXI_SER_TAIL); + + if (len > 1){ + + RXIARG val; + REBCNT type; + REBCNT n; + REBDEC* pattern = (REBDEC*) malloc ((len + 1) * sizeof(REBDEC)) ; + + pattern[0] = len; + + for (n = 0; type = RL_GET_VALUE(patterns, n, &val); n++) { + if (type == RXT_DECIMAL) + pattern[n+1] = val.dec64; + else if (type == RXT_INTEGER) + pattern[n+1] = val.int64; + else + break; + } + agg_line_pattern(ctx->envr, RXA_TUPLE(frm, 1)+1, pattern); + } + + } + break; + + case CMD_DRAW_INVERT_MATRIX: + agg_invert_matrix(ctx->envr); + break; + + case CMD_DRAW_MATRIX: + agg_matrix(ctx->envr, RXA_SERIES(frm, 1)); + break; + + case CMD_DRAW_PEN: + if (RXA_TYPE(frm, 1) == RXT_TUPLE) + agg_pen(ctx->envr, RXA_TUPLE(frm, 1)+1); + else if (RXA_TYPE(frm, 1) == RXT_LOGIC && !RXA_LOGIC(frm,1)) + agg_pen(ctx->envr, NULL); + else + agg_pen_image(ctx->envr, RXA_IMAGE_BITS(frm,1), RXA_IMAGE_WIDTH(frm,1), RXA_IMAGE_HEIGHT(frm,1)); break; - case CMD_DRAW_LINES: + case CMD_DRAW_POLYGON: { RXIARG val; REBCNT type; @@ -111,20 +1024,121 @@ extern REBINT Show_Gob(REBGOB *gob); for (n = 0; type = RL_GET_VALUE(blk, n, &val); n++) { if (type == RXT_PAIR) { if (n > 0) - agg_add_vertex(data, val.pair); + agg_add_vertex(ctx->envr, val.pair); else - agg_begin_poly(data, val.pair); + agg_begin_poly(ctx->envr, val.pair); } } + agg_end_poly(ctx->envr); } break; - case CMD_DRAW_PEN: - agg_pen(data, RXA_TUPLE(frm, 1)+1, 0); + case CMD_DRAW_PUSH: + { + REBCEC innerCtx; + + innerCtx.envr = ctx->envr; + innerCtx.block = RXA_SERIES(frm, 1); + innerCtx.index = 0; + + agg_push_matrix(ctx->envr); + RL_Do_Commands(RXA_SERIES(frm, 1), 0, &innerCtx); + agg_pop_matrix(ctx->envr); + } + break; + + case CMD_DRAW_RESET_MATRIX: + agg_reset_matrix(ctx->envr); break; - case CMD_DRAW_FILL_PEN: - agg_fill_pen(data, RXA_TUPLE(frm, 1)+1); + case CMD_DRAW_ROTATE: + agg_rotate(ctx->envr, (RXA_TYPE(frm, 1) == RXT_DECIMAL) ? RXA_DEC64(frm, 1) : RXA_INT64(frm, 1)); + break; + + case CMD_DRAW_SCALE: + agg_scale(ctx->envr, RXA_PAIR(frm, 1)); + break; + + case CMD_DRAW_SHAPE: + { + REBCEC innerCtx; + + innerCtx.envr = ctx->envr; + innerCtx.block = RXA_SERIES(frm, 1); + innerCtx.index = 0; + + agg_path_open(ctx->envr); + RL_Do_Commands(RXA_SERIES(frm, 1), 0, &innerCtx); + agg_path_close(ctx->envr); + } + break; + + case CMD_DRAW_SKEW: + agg_skew(ctx->envr, RXA_PAIR(frm, 1)); + break; + + case CMD_DRAW_SPLINE: + { + REBSER points = RXA_SERIES(frm, 1); + REBINT len = RL_SERIES(points, RXI_SER_TAIL); + + if (len > 3){ + RXIARG val; + REBCNT type; + REBCNT n; + + for (n = 0; type = RL_GET_VALUE(points, n, &val); n++) { + if (type == RXT_PAIR) { + if (n > 0) + agg_add_vertex(ctx->envr, val.pair); + else + agg_begin_poly(ctx->envr, val.pair); + } + } + agg_end_spline(ctx->envr, RXA_INT64(frm, 2), RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 3)) - W_DRAW_OPENED); + } + + } + break; + + case CMD_DRAW_TEXT: + agg_text( + ctx->envr, + (RL_FIND_WORD(draw_ext_words , RXA_WORD(frm, 3)) == W_DRAW_VECTORIAL) ? 1 : 0, + RXA_PAIR(frm, 1), + RXA_PAIR(frm, 2), + RXA_SERIES(frm, 4) + ); + break; + + case CMD_DRAW_TRANSFORM: + agg_transform( + ctx->envr, + (RXA_TYPE(frm, 1) == RXT_DECIMAL) ? RXA_DEC64(frm, 1) : RXA_INT64(frm, 1), // angle + RXA_PAIR(frm, 2), // center + RXA_PAIR(frm, 3), // scale + RXA_PAIR(frm, 4) // offset + ); + break; + + case CMD_DRAW_TRANSLATE: + agg_translate(ctx->envr, RXA_PAIR(frm, 1)); + break; + + case CMD_DRAW_TRIANGLE: + { + REBYTE b[4] = {0,0,0,0}; + agg_triangle( + ctx->envr, + RXA_PAIR(frm, 1), // vertex-1 + RXA_PAIR(frm, 2), // vertex-2 + RXA_PAIR(frm, 3), // vertex-3 + (RXA_TYPE(frm, 4) == RXT_NONE) ? NULL : RXA_TUPLE(frm, 4)+1, // color-1 + (RXA_TYPE(frm, 5) == RXT_NONE) ? b : RXA_TUPLE(frm, 5)+1, // color-2 + (RXA_TYPE(frm, 6) == RXT_NONE) ? b : RXA_TUPLE(frm, 6)+1, // color-3 + (RXA_TYPE(frm, 7) == RXT_DECIMAL) ? RXA_DEC64(frm, 7) : RXA_INT64(frm, 7) // dilation + ); + } break; default: @@ -143,76 +1157,14 @@ extern REBINT Show_Gob(REBGOB *gob); ** ***********************************************************************/ { - RXI = RL_Extend((REBYTE *)(&RX_graphics[0]), &RXD_Graphics); + RL = (RL_LIB *)RL_Extend((REBYTE *)(&RX_graphics[0]), &RXD_Graphics); RL_Extend((REBYTE *)(&RX_draw[0]), &RXD_Draw); + RL_Extend((REBYTE *)(&RX_shape[0]), &RXD_Shape); + RL_Extend((REBYTE *)(&RX_text[0]), &RXD_Text); } - - #ifdef OLD__FUNCS_NEED_CONVERSION -/*********************************************************************** -** -*/ HCURSOR Image_To_Cursor(REBSER *image) -/* -** Converts REBOL image! to Windows CURSOR -** -***********************************************************************/ -{ - int xHotspot = 0; - int yHotspot = 0; - - HICON result = NULL; - HBITMAP hSourceBitmap; - BITMAPINFO BitmapInfo; - ICONINFO iconinfo; - - //Get the system display DC - HDC hDC = GetDC(NULL); - - //Create DIB - unsigned char* ppvBits; - int bmlen = IMG_WIDE(image) * IMG_HIGH(image) * 4; - int i; - - BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - BitmapInfo.bmiHeader.biWidth = IMG_WIDE(image); - BitmapInfo.bmiHeader.biHeight = -(signed)IMG_HIGH(image); - BitmapInfo.bmiHeader.biPlanes = 1; - BitmapInfo.bmiHeader.biBitCount = 32; - BitmapInfo.bmiHeader.biCompression = BI_RGB; - BitmapInfo.bmiHeader.biSizeImage = 0; - BitmapInfo.bmiHeader.biXPelsPerMeter = 0; - BitmapInfo.bmiHeader.biYPelsPerMeter = 0; - BitmapInfo.bmiHeader.biClrUsed = 0; - BitmapInfo.bmiHeader.biClrImportant = 0; - - hSourceBitmap = CreateDIBSection(hDC, &BitmapInfo, DIB_RGB_COLORS, &ppvBits, NULL, 0); - - //Release the system display DC - ReleaseDC(NULL, hDC); - - //Copy the image content to DIB - COPY_MEM(ppvBits,IMG_DATA(image), bmlen); - - //Invert alphachannel from the REBOL format - for (i = 3;i < bmlen;i+=4){ - ppvBits[i] ^= 0xff; - } - - //Create the cursor using the masks and the hotspot values provided - iconinfo.fIcon = FALSE; - iconinfo.xHotspot = xHotspot; - iconinfo.yHotspot = yHotspot; - iconinfo.hbmMask = hSourceBitmap; - iconinfo.hbmColor = hSourceBitmap; - - result = CreateIconIndirect(&iconinfo); - - DeleteObject(hSourceBitmap); - - return result; -} /*********************************************************************** @@ -239,50 +1191,10 @@ extern REBINT Show_Gob(REBGOB *gob); met->work_size.x = rect.right; met->work_size.y = rect.bottom; } - - Metrics = *met; -} - -/*********************************************************************** -** -*/ REBINT OS_Size_Text(REBGOB *gob, REBPAR *size) -/* -** Return the area size of the text. -** -***********************************************************************/ -{ -// return rt_size_text(Rich_Text, gob, size); - return 0; -} - - -/*********************************************************************** -** -*/ REBINT OS_Offset_To_Caret(REBGOB *gob, REBPAR xy, REBINT *element, REBINT *position) -/* -** Return the element and position for a given offset pair. -** -***********************************************************************/ -{ -// return rt_offset_to_caret(Rich_Text, gob, &xy, element, position); - return 0; -} - - -/*********************************************************************** -** -*/ REBINT OS_Caret_To_Offset(REBGOB *gob, REBPAR *xy, REBINT element, REBINT position) -/* -** Return the offset pair for a given element and position. -** -***********************************************************************/ -{ -// return rt_caret_to_offset(Rich_Text, gob, xy, element, position); - return 0; + Metrics = *met; } - /*********************************************************************** ** */ REBINT OS_Gob_To_Image(REBSER *image, REBGOB *gob) @@ -296,19 +1208,6 @@ extern REBINT Show_Gob(REBGOB *gob); } -/*********************************************************************** -** -*/ REBINT OS_Draw_Image(REBSER *image, REBSER *block) -/* -** Render DRAW dialect into an image. -** Clip to keep render inside the image provided. -** -***********************************************************************/ -{ - return Draw_Image(image, block); -} - - /*********************************************************************** ** */ REBINT OS_Effect_Image(REBSER *image, REBSER *block) @@ -322,29 +1221,5 @@ extern REBINT Show_Gob(REBGOB *gob); return 0; } - -/*********************************************************************** -** -*/ void OS_Cursor_Image(REBINT n, REBSER *image) -/* -***********************************************************************/ -{ - if (Custom_Cursor) { - //Destroy cursor object only if it is a custom image - DestroyCursor(Cursor); - Custom_Cursor = FALSE; - } - - if (n > 0) - Cursor = LoadCursor(NULL, (LPCTSTR)n); - else if (image) { - Cursor = Image_To_Cursor(image); - Custom_Cursor = TRUE; - } else - Cursor = NULL; - - SetCursor(Cursor); -} - #endif diff --git a/src/os/win32/host-window.c b/src/os/win32/host-window.c index cd5e9a3..de4470e 100644 --- a/src/os/win32/host-window.c +++ b/src/os/win32/host-window.c @@ -33,7 +33,7 @@ #include #include "reb-host.h" -#include "host-lib.h" +#include "host-lib.h" #ifndef NO_COMPOSITOR #include "agg-compositor.h" @@ -64,13 +64,12 @@ extern void* Create_Effects(); static BOOL Registered = FALSE; // Window has been registered static const REBCHR *Window_Class_Name = TXT("REBOLWindow"); static struct gob_window *Gob_Windows; -static REBOOL Custom_Cursor = FALSE; REBGOB *Gob_Root; // Top level GOB (the screen) HCURSOR Cursor; // active cursor image object //REBOL_OS_METRICS Metrics; // window system metrics (sizes, etc.) REBPAR Zero_Pair = {0, 0}; -void* Rich_Text; // temp +//void* Rich_Text; // temp //void* Effects; @@ -211,7 +210,7 @@ static void Free_Window(REBGOB *gob) { /*********************************************************************** ** -*/ BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) +*/ BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) /* ** Callback function which enables/disables events in windows ** specified by lParam @@ -252,6 +251,7 @@ static void Free_Window(REBGOB *gob) { REBCHR *title; int x, y, w, h; HWND parent = NULL; + REBYTE osString = FALSE; if (!Registered) Register_Window(); @@ -267,7 +267,7 @@ static void Free_Window(REBGOB *gob) { SET_GOB_STATE(gob, GOBS_NEW); // Setup window options: - + options = WS_POPUP; // Note: Metrics temporarily disabled in A100 @@ -297,7 +297,11 @@ static void Free_Window(REBGOB *gob) { } } - title = IS_GOB_STRING(gob) ? As_OS_Str(GOB_STRING(gob)) : TXT("REBOL Window"); + if (IS_GOB_STRING(gob)) { + title = As_OS_Str(GOB_STRING(gob)); + osString = TRUE; //make the string don't leak + } else + title = TXT("REBOL Window"); if (GET_GOB_FLAG(gob, GOBF_POPUP)) { parent = GOB_HWIN(GOB_TMP_OWNER(gob)); @@ -318,6 +322,9 @@ static void Free_Window(REBGOB *gob) { NULL, App_Instance, NULL ); + //this needs to be improved when GOB_STRING return unicode/bytes flag in some way + if (osString) + OS_Free(title); if (!window) Host_Crash("CreateWindow failed"); // Enable drag and drop @@ -422,7 +429,9 @@ static void Free_Window(REBGOB *gob) { REBCNT opts = 0; HWND window; WINDOWINFO wi; - wi.cbSize = sizeof(WINDOWINFO); + REBCHR *title; + + wi.cbSize = sizeof(WINDOWINFO); if (!IS_WINDOW(gob)) return; @@ -451,8 +460,12 @@ static void Free_Window(REBGOB *gob) { //if (opts) // SetWindowPos(window, 0, GOB_X(gob), GOB_Y(gob), GOB_W(gob), GOB_H(gob), opts | SWP_NOZORDER); - if (IS_GOB_STRING(gob)) - SetWindowText(window, As_OS_Str(GOB_STRING(gob))); + if (IS_GOB_STRING(gob)){ + title = As_OS_Str(GOB_STRING(gob)); + SetWindowText(window, title); + //don't let the converted string leak! - will be changed once GOB_STRING returns unicode/bytes flag + OS_Free(title); + } /* switch (arg) { @@ -510,7 +523,7 @@ static void Free_Window(REBGOB *gob) { d.x, d.y + dsize.y - 1, dsize.x, -dsize.y, s.x, s.y + ssize.y + 1, ssize.x, -ssize.y, src, &BitmapInfo, DIB_PAL_COLORS, SRCCOPY); - + // Reb_Print("blit: %dx%d %dx%d %dx%d %dx%d" ,d.x, d.y + dsize.y - 1, dsize.x, -dsize.y,s.x, ssize.y + s.y + 1, ssize.x, -ssize.y); SetStretchBltMode(hdc, mode); @@ -533,7 +546,7 @@ static void Free_Window(REBGOB *gob) { if (!IS_WINDOW(gob)) return; - clr = ((color >> 16) & 255) | ((color & 255) << 16) | (color & 255<<8); + clr = ((color >> 16) & 255) | ((color & 255) << 16) | (color & 255<<8); hdc = GetDC(GOB_HWIN(gob)); diff --git a/src/tools/form-header.r b/src/tools/form-header.r index 871a584..134147d 100644 --- a/src/tools/form-header.r +++ b/src/tools/form-header.r @@ -19,7 +19,7 @@ form-header: func [title [string!] file [file!] /gen by] [ ** ** Title: } title { ** Build: A} bv/3 { -** Date: } now { +** Date: } now/date { ** File: } file { ** } by diff --git a/src/tools/make-host-ext.r b/src/tools/make-host-ext.r index 7397c21..c842512 100644 --- a/src/tools/make-host-ext.r +++ b/src/tools/make-host-ext.r @@ -2,8 +2,8 @@ REBOL [ Title: "Build REBOL 3.0 Boot Extension Module" Author: "Carl Sassenrath" Purpose: { - Collects host-kit extension modules and writes out their - source as C files and creates a .h file for their defines. + Collects host-kit extension modules and writes them out + to a .h file in a compilable data format. } ] @@ -43,8 +43,7 @@ to-cstr: either system/version/4 = 3 [ append out {"} append out head data ] - remove head out - + head out ] ] @@ -122,7 +121,7 @@ emit-file: func [ insert exports words ] - foreach word words [emit [tab "CMD_" prefix #"_" form-name word ",^/"]] + foreach word words [emit [tab "CMD_" prefix #"_" replace/all form-name word "'" "_LIT" ",^/"]] emit "};^/^/" if src: select source to-set-word 'words [ @@ -131,14 +130,18 @@ emit-file: func [ foreach word src [emit [tab "W_" prefix #"_" form-name word ",^/"]] emit "};^/^/" ] - write rejoin [%../include/ file %.h] out - clear out - emit form-header/gen join title " - Module Initialization" second split-path file %make-host-ext.r + emit "#ifdef INCLUDE_EXT_DATA^/" data: append trim/head mold/only/flat source newline append data to-char 0 ; null terminator may be required emit ["const unsigned char RX_" name "[] = {^/" to-cstr data "^/};^/^/"] - write rejoin [%../os/ file %.c] out + emit "#endif^/" + + write rejoin [%../include/ file %.h] out + +; clear out +; emit form-header/gen join title " - Module Initialization" second split-path file %make-host-ext.r +; write rejoin [%../os/ file %.c] out ] ;-- Create Files ------------------------------------------------------------- @@ -151,3 +154,11 @@ emit-file %host-ext-graphics [ emit-file %host-ext-draw [ %../boot/draw.r ] + +emit-file %host-ext-shape [ + %../boot/shape.r +] + +emit-file %host-ext-text [ + %../boot/text.r +] diff --git a/src/tools/make-host-init.r b/src/tools/make-host-init.r index bd559e3..0d59fbc 100644 --- a/src/tools/make-host-init.r +++ b/src/tools/make-host-init.r @@ -98,7 +98,6 @@ binary-to-c: either system/version/4 = 3 [ write-c-file: func [ c-file - h-file code /local data comp-data comp-size ][ @@ -183,4 +182,4 @@ load-files: func [ code: load-files files -write-c-file dir/host-init.c %include/host-init.h code +write-c-file %include/host-init.h code diff --git a/tests/caret-test.r b/tests/caret-test.r new file mode 100644 index 0000000..9fa8cfc --- /dev/null +++ b/tests/caret-test.r @@ -0,0 +1,74 @@ +REBOL [ + Title: "Basic CARET test" + Author: cyphre@seznam.cz +] +do %gfx-pre.r +print "CARET Test..." + +;;; WINDOW +win: make gob! [text: "Test Window" offset: 200x100] + +;;; background GOB +gobb: make gob! [] +gobb/color: leaf +gobb/size: 640x144 +win/size: gobb/size +append win gobb + + +;;; color for text background +gobc: make gob! [offset: 100x10] +gobc/size: 345x120 +gobc/color: 255.255.255 +append gobb gobc + +gobt: make gob! [offset: 0x0] +gobt/size: gobc/size + +caret-obj: make object! [ + caret: + highlight-start: + highlight-end: none +] + +gobt/text: to-text [ + size 30 + anti-alias on + caret caret-obj + red "Hello World " + newline + bold green "Hello world 2" + newline + bold off italic blue "Hello world 3" +] copy [] + +caret-obj/caret: reduce [at gobt/text 26 at first at gobt/text 26 8] +caret-obj/highlight-start: reduce [at gobt/text 10 at first at gobt/text 10 5] +caret-obj/highlight-end: reduce [at gobt/text 17 at first at gobt/text 17 6] + +;probe caret-obj + +append gobc gobt + +init-view-system + +view/options win [ + title: "test" + offset: 'center + handler: [ + name: 'my-handler + priority: 100 + handler: func [event] [ + if event/type = 'close [ + unhandle-events self ; Remove this handler from the global list. + unview event/window + quit + ] + none + ] + ] +] + + + + diff --git a/tests/dev-small.jpg b/tests/dev-small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..392e9d9b6c09cd5a7334bb78f193d27acb36a8db GIT binary patch literal 2324 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 C+YGk= literal 0 HcmV?d00001 diff --git a/tests/draw-test.r b/tests/draw-test.r new file mode 100644 index 0000000..717acd6 --- /dev/null +++ b/tests/draw-test.r @@ -0,0 +1,507 @@ +REBOL [ + Title: "Basic DRAW test" + Date: 4-Jan-2008 + Purpose: "Tests many of the basic DRAW dialect commands, eg. lines, boxes, curves, fills etc." +] +do %gfx-pre.r + +black: 0.0.0 +white: 255.255.255 +red: 255.0.0 +green: 0.255.0 +blue: 0.0.255 +yellow: 255.255.0 + +img1: load %dev-small.jpg + +img1-alpha: copy img1 +oft: 0x0 +siz: img1-alpha/size - 1 +repeat y siz/y [ + repeat x siz/x [ + pos: as-pair x + oft/x y + oft/y + pix: pick img1-alpha pos + pix/4: to-integer (x * (255 / siz/x)) + poke img1-alpha pos pix + ] +] + +img2: make image! [44x44] +change/dup img2 255.0.0 22x22 +change/dup at img2 22x0 0.255.0 22x22 +change/dup at img2 0x22 0.0.255 22x22 +change/dup at img2 22x22 255.255.0 22x22 + +;;; WINDOW +win: make gob! [text: "Basic DRAW test" offset: 200x20 size: 800x800] + +;;; background GOB +gobb: make gob! [] +gobb/size: win/size +gobb/color: white +append win gobb + +gobd: make gob! [] +gobd/size: gobb/size + +gobe: make gob! [] +gobe/size: gobd/size +;gobe/effect: [blur] + +gobd/draw: to-draw [ + + pen 0.127.127 + fill-pen 218.188.189 + anti-alias on + line-width 1 + line-cap square + line-join bevel + + ;ANTI-ALIAS + translate 25x25 + arc 0x0 25x25 0 90 + translate 50x0 + arc 0x0 25x25 0 180 + translate 0x50 + arc 0x0 25x25 0 270 + translate -50x0 + arc 0x0 25x25 0 360 + + translate 105x-50 + arc 0x0 25x25 0 90 closed + translate 50x0 + arc 0x0 25x25 0 180 closed + translate 0x50 + arc 0x0 25x25 0 270 closed + translate -50x0 + arc 0x0 25x25 0 360 closed + + + ;ARROW + reset-matrix + translate 200x0 + + translate 10x0 + line 0x90 0x10 + arrow 1x0 + translate 10x0 + line 0x90 0x10 + arrow 2x0 + translate 10x0 + line 0x90 0x10 + arrow 0x1 + translate 10x0 + line 0x90 0x10 + arrow 0x2 + translate 10x0 + line 0x90 0x10 + arrow 1x2 + translate 10x0 + line 0x90 0x10 + arrow 2x1 + translate 10x0 + line 0x90 0x10 + arrow 1x1 + translate 10x0 + line 0x90 0x10 + arrow 2x2 + translate 10x0 + line 0x90 0x10 + arrow 0x0 + + reset-matrix + translate 300x0 + + translate 0x10 + line 10x0 90x0 + arrow 1x0 + translate 0x10 + line 10x0 90x0 + arrow 2x0 + translate 0x10 + line 10x0 90x0 + arrow 0x1 + translate 0x10 + line 10x0 90x0 + arrow 0x2 + translate 0x10 + line 10x0 90x0 + arrow 1x2 + translate 0x10 + line 10x0 90x0 + arrow 2x1 + translate 0x10 + line 10x0 90x0 + arrow 1x1 + translate 0x10 + line 10x0 90x0 + arrow 2x2 + translate 0x10 + line 10x0 90x0 + arrow 0x0 + + ;BOX + reset-matrix + translate 400x0 + box 5x5 95x95 + translate 100x0 + box 5x5 95x45 + box 5x50 95x95 10 + translate 100x0 + box 5x5 45x95 + box 50x5 95x95 10 + translate 100x0 + box 5x5 95x95 10 + + ;CIRCLE + reset-matrix + translate 0x100 + circle 50x50 45x45 + translate 100x0 + circle 50x50 45x22.5 + translate 100x0 + circle 50x50 22.5x45 + + ;CURVE + reset-matrix + translate 300x100 + curve 0x0 100x0 100x100 + translate 100x0 + curve 0x0 100x0 0x100 100x100 + + ;ELLIPSE + reset-matrix + translate 500x100 + ellipse 5x5 95x95 + translate 100x0 + ellipse 5x25 95x50 + translate 100x0 + ellipse 25x5 50x95 + + + ;IMAGE + reset-matrix + translate 0x200 + image-filter bilinear + image img1 + image-options border + image 50x50 img1 + + image-options no-border + translate 100x0 + image img1 5x5 95x95 + translate 100x0 + image img1 30x5 70x95 + + translate 100x0 + image 5x30 95x30 95x70 img1 + reset-matrix + translate 450x250 + rotate 45 + image-options border + image img1 -35x-35 35x35 + rotate -45 + translate 50x-50 + image-options no-border + image img1 35x35 70x15 90x95 10x95 + translate 100x0 + image-options border + image img1 15x5 95x20 55x75 20x93 + translate 100x0 + image-options border 255.0.0 + image img2 5x5 + image-options border 0.255.0 + image img2 49x5 + image-options border 0.0.255 + image img2 5x49 + image-options border 255.0.0 + image img2 49x49 + + reset-matrix + translate 0x300 + image-options no-border + image-pattern repeat + image img1 5x5 95x95 + translate 100x0 + image-pattern repeat 0x0 100x100 + image img1 5x5 95x95 + translate 100x0 + image-pattern repeat 25x25 100x100 + image img1 5x5 95x95 + translate 100x0 + image-pattern repeat 0x0 200x200 + image img1 5x5 95x95 + translate 100x0 + image-pattern reflect + image img1 5x5 95x95 + translate 100x0 + image-pattern reflect 0x0 100x100 + image img1 5x5 95x95 + translate 100x0 + image-pattern reflect 25x25 100x100 + image img1 5x5 95x95 + translate 100x0 + image-pattern reflect 0x0 200x200 + image img1 5x5 95x95 + + reset-matrix + translate 0x400 + image-pattern repeat + image img1 35x5 65x5 95x95 5x95 + translate 100x0 + image-pattern repeat 0x0 100x100 + image img1 35x5 65x5 95x95 5x95 + translate 100x0 + image-pattern repeat 25x25 100x100 + image img1 35x5 65x5 95x95 5x95 + translate 100x0 + image-pattern repeat 0x0 200x200 + image img1 35x5 65x5 95x95 5x95 + translate 100x0 + image-pattern reflect + image img1 35x5 65x5 95x95 5x95 + translate 100x0 + image-pattern reflect 0x0 100x100 + image img1 35x5 65x5 95x95 5x95 + translate 100x0 + image-pattern reflect 25x25 100x100 + image img1 35x5 65x5 95x95 5x95 + translate 100x0 + image-pattern reflect 0x0 200x200 + image img1 35x5 65x5 95x95 5x95 + + ;LINE + reset-matrix + translate 0x500 + + line 5x5 95x5 + line 5x15 95x15 + line 5x25 95x25 + line 5x35 95x35 + line 5x45 95x45 + line 5x55 95x55 + line 5x65 95x65 + line 5x75 95x75 + line 5x85 95x85 + line 5x95 95x95 + + translate 100x0 + line 5x5 5x95 + line 15x5 15x95 + line 25x5 25x95 + line 35x5 35x95 + line 45x5 45x95 + line 55x5 55x95 + line 65x5 65x95 + line 75x5 75x95 + line 85x5 85x95 + line 95x5 95x95 + + translate 100x0 + line 5x5 95x5 + 5x15 95x15 + 5x25 95x25 + 5x35 95x35 + 5x45 95x45 + 5x55 95x55 + 5x65 95x65 + 5x75 95x75 + 5x85 95x85 + 5x95 95x95 + + translate 100x0 + line 5x5 5x95 + 15x5 15x95 + 25x5 25x95 + 35x5 35x95 + 45x5 45x95 + 55x5 55x95 + 65x5 65x95 + 75x5 75x95 + 85x5 85x95 + 95x5 95x95 + + translate 100x0 + line 5x85 15x95 + line 5x75 25x95 + line 5x65 35x95 + line 5x55 45x95 + line 5x45 55x95 + line 5x35 65x95 + line 5x25 75x95 + line 5x15 85x95 + line 5x5 95x95 + line 15x5 95x85 + line 25x5 95x75 + line 35x5 95x65 + line 45x5 95x55 + line 55x5 95x45 + line 65x5 95x35 + line 75x5 95x25 + line 85x5 95x15 + + translate 100x0 + line 5x15 15x5 + line 5x25 25x5 + line 5x35 35x5 + line 5x45 45x5 + line 5x55 55x5 + line 5x65 65x5 + line 5x75 75x5 + line 5x85 85x5 + line 5x95 95x5 + line 15x95 95x15 + line 25x95 95x25 + line 35x95 95x35 + line 45x95 95x45 + line 55x95 95x55 + line 65x95 95x65 + line 75x95 95x75 + line 85x95 95x85 + + translate 100x0 + line 5x85 15x95 + 5x75 25x95 + 5x65 35x95 + 5x55 45x95 + 5x45 55x95 + 5x35 65x95 + 5x25 75x95 + 5x15 85x95 + 5x5 95x95 + 15x5 95x85 + 25x5 95x75 + 35x5 95x65 + 45x5 95x55 + 55x5 95x45 + 65x5 95x35 + 75x5 95x25 + 85x5 95x15 + + translate 100x0 + line 5x15 15x5 + 5x25 25x5 + 5x35 35x5 + 5x45 45x5 + 5x55 55x5 + 5x65 65x5 + 5x75 75x5 + 5x85 85x5 + 5x95 95x5 + 15x95 95x15 + 25x95 95x25 + 35x95 95x35 + 45x95 95x45 + 55x95 95x55 + 65x95 95x65 + 75x95 95x75 + 85x95 95x85 + + ;POLYGON + reset-matrix + translate 0x600 + polygon + 50x5 + 62x40 + 95x40 + 68x60 + 80x95 + 50x74 + 20x95 + 32x60 + 5x40 + 38x40 + + translate 100x0 + polygon + 50x5 + 95x28 + 95x72 + 50x95 + 5x72 + 5x28 + + translate 100x0 + polygon 14x59 17x85 92x57 94x32 52x38 59x15 + + translate 100x0 + polygon + 5x15 15x5 + 5x35 35x5 + 5x55 55x5 + 5x75 75x5 + 5x95 95x5 + 15x95 95x15 + 35x95 95x35 + 55x95 95x55 + 75x95 95x75 + 85x95 95x85 + + ;SPLINE + translate 100x0 + spline 87x71 86x28 50x9 15x30 17x69 50x86 80x67 79x33 50x17 23x34 + 24x64 50x78 73x63 71x37 50x26 30x38 31x60 50x69 65x59 64x41 49x34 37x42 38x56 50x61 58x54 57x45 + 50x42 44x47 46x52 50x53 51x50 50x49 + + translate 100x0 + spline 2 87x71 86x28 50x9 15x30 17x69 50x86 80x67 79x33 50x17 23x34 + 24x64 50x78 73x63 71x37 50x26 30x38 31x60 50x69 65x59 64x41 49x34 37x42 38x56 50x61 58x54 57x45 + 50x42 44x47 46x52 50x53 51x50 50x49 + + translate 100x0 + spline 3 87x71 86x28 50x9 15x30 17x69 50x86 80x67 79x33 50x17 23x34 + 24x64 50x78 73x63 71x37 50x26 30x38 31x60 50x69 65x59 64x41 49x34 37x42 38x56 50x61 58x54 57x45 + 50x42 44x47 46x52 50x53 51x50 50x49 + + translate 100x0 + spline 5 87x71 86x28 50x9 15x30 17x69 50x86 80x67 79x33 50x17 23x34 + 24x64 50x78 73x63 71x37 50x26 30x38 31x60 50x69 65x59 64x41 49x34 37x42 38x56 50x61 58x54 57x45 + 50x42 44x47 46x52 50x53 51x50 50x49 closed + + ;TRIANGLE + reset-matrix + translate 0x700 + triangle 50x5 95x95 + + translate 100x0 + triangle 50x5 95x95 5x95 + + translate 100x0 + triangle 50x5 95x95 5x95 red + + translate 100x0 + triangle 50x5 95x95 5x95 green 2 + + translate 100x0 + triangle 50x5 95x95 5x95 blue -2 + + translate 100x0 + triangle 50x5 95x95 5x95 red green + + translate 100x0 + triangle 50x5 95x95 5x95 red green blue + + translate 100x0 + triangle 50x5 95x95 5x95 255.0.0.200 0.255.0.200 0.0.255.200 + + ;SHAPE + ;TEXT +] copy [] +append gobb gobd +append gobd gobe +init-view-system +view/options win [ + offset: 200x20 + handler: [ + name: 'draw-test-handler + priority: 100 + handler: func [event] [ + if event/type = 'close [ + unhandle-events self ; Remove this handler from the global list. + unview event/window + quit + ] + none + ] + ] +] diff --git a/tests/gfx-pre.r b/tests/gfx-pre.r new file mode 100644 index 0000000..50abd67 --- /dev/null +++ b/tests/gfx-pre.r @@ -0,0 +1,677 @@ +REBOL [ + title: "REBOL Graphics proprocessors for DRAW, SHAPE and TEXT dialects" + author: "Richard 'Cyphre' Smolak" + version: 0.0.8 +] + +context [ + + ext-shape: import 'shape + ext-draw: import 'draw + ext-text: import 'text + + lit-word: false ;flag for lit-word! detection + any-arg?: false ;turns 'any number of arg' mode on/off + + ;---------------------------------------- + ;caommand and argument syntax definitions for dialects + ;---------------------------------------- + + text-args: make object! [ + b: bold: [logic!] + i: italic: [logic!] + u: underline: [logic!] + font: [object!] + para: [object!] + size: [integer!] + shadow: [pair! | tuple! | number!] + scroll: [pair!] + drop: [integer!] + anti-alias: [logic!] + nl: newline: none + caret: [object!] + center: none + left: none + right: none + ] + + shape-args: make object! [ + arc: [ + pair! + | pair! + | number! + | 'sweep + | 'large + ] + close: none + curv: [pair! (any-arg?: true)] + curve: [pair! (any-arg?: true)] + hline: [number!] + line: [pair! (any-arg?: true)] + move: [pair!] + qcurv: [pair!] + qcurve: [pair! (any-arg?: true)] + vline: [number!] + ] + + draw-args: make object! [ + anti-alias: [logic!] + arc: [ + pair! + | pair! + | number! + | number! + | 'closed + ] + arrow: [tuple! | pair!] + box: [pair! | pair! | number!] + curve: [pair! (any-arg?: true)] + circle: [pair! | pair!] + clip: [pair! | pair! | logic!] +; effect: [pair! | pair! | block!] + ellipse: [pair! | pair!] + fill-pen: [tuple! | image! | logic!] + fill-rule: ['even-odd | 'non-zero] + gamma: [number!] + grad-pen: [ + 'conic + | 'cubic + | 'diagonal + | 'diamond + | 'linear + | 'radial + | 'normal + | 'repeat + | 'reflect + | pair! + | pair! + | pair! + | number! + | logic! + | block! + ] + invert-matrix: none + image: [ + image! | + pair! (any-arg?: true) + ] + image-filter: [ + 'nearest + | 'bilinear + | 'bicubic + | 'gaussian + | 'resize + | 'resample + | number! + ] + image-options: [ + tuple! | 'border | 'no-border + ] + image-pattern: [ + 'normal | 'repeat | 'reflect | pair! | pair! + ] + line: [pair! (any-arg?: true)] + line-cap: ['butt | 'square | 'rounded] + line-join: ['miter | 'miter-bevel | 'round | 'bevel] + line-pattern: [logic! | tuple! | number! (any-arg?: true)] + line-width: [number! | 'fixed] + matrix: [block!] + pen: [tuple! | image! | logic!] + polygon: [pair! (any-arg?: true)] + push: [block!] + reset-matrix: none + rotate: [number!] + scale: [pair!] + shape: [block!] + skew: [pair!] + spline: [integer! | 'closed | pair! (any-arg?: true)] + text: ['aliased | 'antialiased | 'vectorial | pair! | pair! | block!] + transform: [number! | pair! | pair! | pair!] + translate: [pair!] + triangle: [pair! | pair! | pair! | tuple! | tuple! | tuple! | number!] + ] + + ;------------------------------------------------------------------------------------- + ;sets of words that are not evaluated during the initial REDUCE on input dialect block + ;------------------------------------------------------------------------------------- + + text-words: words-of text-args + + shape-words: append words-of shape-args [ + sweep + large + ] + + draw-words: append words-of draw-args [ + ;fill-rule + even-odd + non-zero + + ;grad-pen + conic + cubic + diagonal + diamond + linear + radial + + ;grad-pen & image-filter + normal + repeat + reflect + + ;line-cap + butt + square + rounded + + ;line-join + miter + miter-bevel + round + bevel + + ;line-width + fixed + + ;arc + closed + + ;image-options + no-border + border + + ;image-filter + nearest + bilinear + bicubic + gaussian + resize + resample + + ;text + aliased + antialiased + vectorial + ] + + ;------------------------------------------------ + ;rules for allowed commands in the input dialects + ;------------------------------------------------ + + text-command: [ + string! + | tuple! + | 'anti-alias + | 'b + | 'bold + | 'caret + | 'center + | 'drop + | 'font + | 'i + | 'italic + | 'left + | 'nl + | 'newline + | 'para + | 'right + | 'scroll + | 'shadow + | 'size + | 'u + | 'underline + ] + + shape-command: [ + (lit-word: false) + 'arc + | 'close + | 'curv + | 'curve + | 'hline + | 'line + | 'move + | 'qcurv + | 'qcurve + | 'vline + | lit-word! (lit-word: true) + ] + + draw-command: [ + 'anti-alias + | 'arc + | 'arrow + | 'box + | 'circle + | 'clip + | 'curve +; | 'effect + | 'ellipse + | 'fill-pen + | 'fill-rule + | 'gamma + | 'grad-pen + | 'invert-matrix + | 'image + | 'image-filter + | 'image-options + | 'image-pattern + | 'line + | 'line-cap + | 'line-join + | 'line-pattern + | 'line-width + | 'matrix + | 'pen + | 'polygon + | 'push + | 'reset-matrix + | 'rotate + | 'scale + | 'shape + | 'skew + | 'spline + | 'text + | 'transform + | 'translate + | 'triangle + ] + + ;---------------------------------------------------------------- + ; prototypes used for argument storage suring the command parsing + ;---------------------------------------------------------------- + + text-types: make object! [ + logic!: [] + tuple!: [] + integer!: [] + object!: [] + pair!: [] + ] + + shape-types: make object! [ + pair!: [] + integer!: [] + decimal!: [] + word!: [] + ] + + draw-types: make object! [ + logic!: [] + pair!: [] + integer!: [] + decimal!: [] + tuple!: [] + word!: [] + block!: [] + image!: [] + ] + + set 'to-text func [ + src [block!] + dst [block!] + /local + cmd args a text-arg t + ] [ + parse reduce/only src text-words [ + some [ + set cmd text-command ( + args: make text-types [] + text-arg: either word? cmd [ + all [ + text-args/(cmd) + copy text-args/(cmd) + ] + ][ + none + ] + ) + any [ + set a text-arg ( + all [ + not none? a + append select args t: type?/word a a + remove/part find text-arg t 2 + ] + ) + ] + ( + append dst reduce switch/default type?/word cmd [ + string! [ + ['text cmd] + ] + tuple! [ + ['color cmd] + ] + ][ + append dst reduce switch/default cmd [ + anti-alias [ + ['anti-alias either args/logic!/1 = none [true][args/logic!/1]] + ] + b bold [ + ['bold either args/logic!/1 = none [true][args/logic!/1]] + ] + caret [ + ['caret args/object!/1] + ] + center [ + ['center] + ] + drop [ + ['drop args/integer!/1] + ] + font [ + ['font args/object!/1] + ] + i italic [ + ['italic either args/logic!/1 = none [true][args/logic!/1]] + ] + left [ + ['left] + ] + nl newline [ + ['newline] + ] + para [ + ['para args/object!/1] + ] + right [ + ['right] + ] + scroll [ + ['scroll args/pair!/1] + ] + shadow [ + ['shadow args/pair!/1 args/tuple!/1 args/integer!/1] + ] + size [ + ['size args/integer!/1] + ] + u underline [ + ['underline either args/logic!/1 = none [true][args/logic!/1]] + ] + ][[]] + [] + ] + ) + ] + ] + bind/only dst ext-text + ] + + to-shape: func [ + src [block!] + dst [block!] + /local + cmd args a shape-arg t + ] [ + parse reduce/only src shape-words [ + some [ + set cmd shape-command ( + args: make shape-types [] + shape-arg: either word? cmd [ + all [ + shape-args/(cmd) + copy shape-args/(cmd) + ] + ][ + none + ] + ) + any [ + (any-arg?: false) set a shape-arg ( + all [ + not none? a + append select args t: type?/word a a + unless any-arg? [ + remove/part find shape-arg t 2 + ] + ] + ) + ] + ( + append dst reduce switch/default cmd [ + arc [ + [ + either lit-word ['arc']['arc] + args/pair!/1 + args/pair!/2 + any [args/integer!/1 args/decimal!/1] + any [all [args/word!/1 = 'sweep 'positive] 'negative] + any [args/word!/2 all [args/word!/1 = 'large 'large] 'small] + ] + ] + close [ + ['close] + ] + curv [ + [either lit-word ['curv']['curv] args/pair!] + ] + curve [ + [either lit-word ['curve']['curve] args/pair!] + ] + hline [ + [either lit-word ['hline']['hline] any [args/integer!/1 args/decimal!/1]] + ] + line [ + [either lit-word ['line']['line] any [all [args/pair!/2 args/pair!] args/pair!/1]] + ] + move [ + [either lit-word ['move']['move] args/pair!/1] + ] + qcurve [ + [either lit-word ['qcurve']['qcurve] args/pair!] + ] + qcurv [ + [either lit-word ['qcurv']['qcurv] args/pair!/1] + ] + vline [ + [either lit-word ['vline']['vline] any [args/integer!/1 args/decimal!/1]] + ] + ][[]] + ) + ] + ] + bind/only dst ext-shape + ] + + set 'to-draw func [ + src [block!] + dst [block!] + /local + cmd args a t draw-arg + ] [ + parse reduce/only src draw-words [ + some [ + set cmd draw-command ( + args: make draw-types [] + draw-arg: either word? cmd [ + all [ + draw-args/(cmd) + copy draw-args/(cmd) + ] + ][ + none + ] + ) + any [ + (any-arg?: false) set a draw-arg ( + all [ + not none? a + append select args t: type?/word a a + unless any-arg? [ + remove/part find draw-arg t 2 + ] + ] + ) + ] + ( + append dst reduce switch/default cmd [ + anti-alias [ + ['anti-alias args/logic!/1] + ] + arc [ + [ + 'arc + args/pair!/1 + args/pair!/2 + any [args/integer!/1 args/decimal!/1] + any [args/integer!/2 args/decimal!/2] + any [args/word!/1 'opened] + ] + ] + arrow [ + ['arrow args/pair!/1 args/tuple!/1] + ] + box [ + ['box args/pair!/1 any [args/pair!/2 100x100] any [args/integer!/1 args/decimal!/1 0]] + ] + circle [ + [ + 'circle + any [args/pair!/1 50x50] + any [args/pair!/2 50x50] + ] + ] + clip [ + either args/logic!/1 = false [ + ['clip 0x0 10000x10000] ;should be gob/size + ][ + ['clip args/pair!/1 args/pair!/2] + ] + ] + curve [ + ['curve args/pair!/1 args/pair!/2 args/pair!/3 args/pair!/4] + ] + ellipse [ + ['ellipse args/pair!/1 args/pair!/2] + ] + fill-pen [ + ['fill-pen either a: any [args/tuple!/1 args/image!/1 args/logic!/1][a][false]] + ] + fill-rule [ + ['fill-rule args/word!/1] + ] + gamma [ + ['gamma any [args/integer!/1 args/decimal!/1]] + ] + grad-pen [ + [ + 'grad-pen + any [args/word!/1 'linear] + any [args/word!/2 'normal] + any [args/pair!/1 0x0] + any [args/pair!/2 0x100] + any [args/integer!/1 args/decimal!/1 0] + any [args/pair!/3 1x1] + args/block!/1 + ] + ] + image [ + ['image args/image!/1 any [all [args/pair!/2 args/pair!] any [args/pair!/1 0x0]]] + ] + image-filter [ + [ + 'image-filter + any [args/word!/1 'nearest] + any [args/word!/2 'resize] + any [args/integer!/1 args/decimal!/1] + ] + ] + image-options [ + ['image-options args/tuple!/1 any [args/word!/1 'no-border]] + ] + image-pattern [ + [ + 'image-pattern any [args/word!/1 'normal] any [args/pair!/1 0x0] any [args/pair!/2 0x0] + ] + ] + line [ + ['line args/pair!] + ] + line-cap [ + ['line-cap args/word!/1] + ] + line-join [ + ['line-join args/word!/1] + ] + line-pattern [ + ['line-pattern args/tuple!/1 args/block!/1] + ] + line-width [ + ['line-width any [args/integer!/1 args/decimal!/1] any [args/word!/1 'variable]] + ] + invert-matrix [ + ['invert-matrix] + ] + matrix [ + ['matrix args/block!/1] + ] + pen [ + ['pen either a: any [args/tuple!/1 args/image!/1 args/logic!/1][a][false]] + ] + polygon [ + ['polygon args/pair!] + ] + push [ + ['push to-draw args/block!] + ] + reset-matrix [ + ['reset-matrix] + ] + rotate [ + ['rotate any [args/integer!/1 args/decimal!/1]] + ] + scale [ + ['scale args/pair!/1] + ] + shape [ + ['shape to-shape args/block! copy []] + ] + skew [ + ['skew args/pair!/1] + ] + spline [ + ['spline args/pair! any [args/integer!/1 0] any [args/word!/1 'opened]] + ] + text [ + [ + 'text + any [args/pair!/1 0x0] + any [args/pair!/2 0x0] + any [args/word!/1 'raster] + to-text args/block! copy [] + ] + ] + transform [ + [ + 'transform + any [args/integer!/1 args/decimal!/1 0] + any [args/pair!/1 0x0] + any [args/pair!/2 1x1] + any [args/pair!/3 0x0] + ] + ] + translate [ + ['translate args/pair!/1] + ] + triangle [ + [ + 'triangle + args/pair!/1 + any [args/pair!/2 100x100] + any [args/pair!/3 as-pair args/pair!/1/x any [args/pair!/2/y 100]] + args/tuple!/1 + args/tuple!/2 + args/tuple!/3 + any [args/integer!/1 args/decimal!/1 0] + ] + ] + ][[]] + ) + ] + ] + bind/only dst ext-draw + ] +] diff --git a/tests/go.r b/tests/go.r new file mode 100644 index 0000000..3d211f6 --- /dev/null +++ b/tests/go.r @@ -0,0 +1,81 @@ +REBOL [ + Title: "Host-Kit Graphics: Basic GOB Compositing Test" + Version: 1.0.1 + Author: "Carl Sassenrath" + Notes: { + A101: PAIRs are now floating point, and commands like CIRCLE + can pass a pair for second argument. + } +] + +win: view/no-wait main: make gob! [color: black offset: 0x0 size: 500x500] + +to-draw: func [block] [bind reduce block import 'draw] + +units: 32 +pause: .01 + +points: [] +loop 100 [ + clear main + clear points + repeat n units [append points random main/size] + append main make gob! reduce/no-set [ + offset: 0x0 + size: main/size + draw: to-draw ['pen random 255.255.255 'line points] + ] + show main + wait pause +] + +loop 100 [ + clear main + repeat n units [ + sz: random 100x100 + append main make gob! reduce/no-set [ + draw: to-draw [ + 'pen random 255.255.255 + 'fill-pen random 255.255.255.255 + 'circle sz sz * 98% + ] + offset: random 300x300 + size: sz * 2 + ] + ] + show main + wait pause +] + +loop 100 [ + clear main + repeat n units [ + sz: random 100x100 + append main make gob! reduce/no-set [ + draw: to-draw [ + 'pen random 255.255.255 + 'fill-pen random 255.255.255.255 + 'box 2x2 sz 0 + ] + offset: random 400x400 + size: sz + 4x4 + ] + ] + show main + wait pause +] + +loop 100 [ + clear main + repeat n units * 10 [ + append main make gob! reduce/no-set [ + color: random 255.255.255.255 + offset: random 500x500 + size: random 80x80 + ] + ] + show main + wait pause +] + +unview win diff --git a/tests/shape-test.r b/tests/shape-test.r new file mode 100644 index 0000000..2a2a2b8 --- /dev/null +++ b/tests/shape-test.r @@ -0,0 +1,90 @@ +REBOL [Title: "Basic SHAPE test"] + +do %gfx-pre.r + +;;; WINDOW +win: make gob! [text: "Basic SHAPE test" offset: 200x20 size: 800x800] + +;;; background GOB +gobb: make gob! [] +gobb/size: win/size +gobb/color: white +append win gobb + +gobd: make gob! [] +gobd/size: gobb/size + +line-test: [ + move 100x40 'hline 200 + 'move -200x40 hline 300 + move 100x120 'vline 200 + 'move 40x-200 vline 320 + 'move 40x-200 line 300x120 + 'move -120x40 'line 120x0 +] + +curve-test: [ + move 100x450 curve 100x550 300x550 300x450 + move 350x450 'curve 0x100 200x100 200x0 + move 100x550 'vline 100 curv 300x650 300x550 + 'move 50x0 'vline 100 'curv 200x0 200x-100 + move 0x0 +] + +qcurve-test: [ + move 100x700 qcurve 200x800 300x700 + 'move 50x0 'qcurve 100x100 200x0 + move 350x50 'qcurve 100x100 200x0 qcurv 750x50 + move 350x110 'qcurve 100x100 200x0 'qcurv 200x0 + move 0x0 +] + +arc-test1: [ + move 350x400 + line 400x375 + arc 450x350 25x25 -30 sweep + line 500x325 + arc 550x300 25x50 -30 sweep + line 600x275 + arc 650x250 25x75 -30 sweep + line 700x225 + arc 750x200 25x100 -30 sweep + line 800x175 + + move 50x450 + 'line 50x-25 + 'arc 50x-25 25x25 -30 sweep + 'line 50x-25 + 'arc 50x-25 25x50 -30 sweep + 'line 50x-25 + 'arc 50x-25 25x75 -30 sweep + 'line 50x-25 + 'arc 50x-25 25x100 -30 sweep + 'line 50x-25 + move 0x0 +] + +arc-test2: [ + move 700x450 hline 650 arc 700x400 50x50 0 large close + move 675x425 vline 375 arc 625x425 50x50 0 close + move 700x650 'hline -50 'arc 50x-50 50x50 0 large close + move 675x625 'vline -50 'arc -50x50 50x50 0 +] + +gobd/draw: to-draw [ + pen black + shape line-test + pen red + fill-pen blue + shape curve-test + fill-pen green + shape qcurve-test + fill-pen off + shape arc-test1 + fill-pen yellow + shape arc-test2 +] copy [] + +append gobb gobd +window: view/no-wait/as-is win +do-events diff --git a/tests/text-test1.r b/tests/text-test1.r new file mode 100644 index 0000000..f6689e2 --- /dev/null +++ b/tests/text-test1.r @@ -0,0 +1,110 @@ +REBOL [Title: "Basic TEXT test"] + +do %gfx-pre.r + +win-size: 420x640 +;;; WINDOW +win: make gob! reduce/no-set [offset: 200x20 size: 10 + win-size] + +;;; background GOB +gobb: make gob! [] +gobb/size: win/size +gobb/color: white +append win gobb + +append gobb make gob! reduce/no-set [color: sky size: win-size] + +gobt: make gob! reduce/no-set [size: win-size] + +fnt: make system/standard/font [ + name: "Arial" + size: 28 +] +fnt-uni: make system/standard/font [ + name: "Arial Unicode MS" + size: 28 +] + +;note: should every PARA command reset internal values so next TEXT call can be used as a new paragraph? +par: make system/standard/para [ + origin: 0x0 ;works + margin: 0x0 ;Y coord doesn't do anything (should clip text?) + indent: 0x0 ;X cord doesn't work when align=right/center + tabs: 40 ;works + wrap?: true ;works + scroll: 0x0 ;works + align: 'left ;works - problem with indent/x in right/center mode + valign: 'middle ;works +] + +gobt/text: to-text [ + anti-alias + font fnt-uni + underline + bold + "Unicode text works in HostKit!" + drop 2 + size 11 + "You need 'Arial Unicode MS' truetype font for this demo or some other font with wide range of unicode support" + newline + drop 1 + underline off + bold off + navy + "Arabic - ضطفقحڭڦڞ۞" + newline + "Armenian - ՅՌՎՑՓ" + newline + "Bengali - তঃঊঋঐকতোতৢ" + newline + "Chinese - ㌇㌌㌚㌫㍀㍌㍖" + newline + "Czech - ěščřžýáíéňď" + newline + "Greek - αβγδεζ" + newline + "German - äßÖöü" + newline + "Hebrew - סאבגדהוט" + newline + "Hiragana - ばぬぢぽみゆあ" + newline + "Katakana - ゼヂネポヸダジ" + newline + "Panjabi - ੨ਫ਼ਓਔੴ" + newline + "Russian - ДφψЗлйжҒ" + newline + "Thai - ฑญฆญจบฟ" + newline + "Tibetan - གྷཆ༰༯༲༬༣༇༈༊ང྆ཀྵ" +] copy [] + +append gobb gobt + + +window: view/options win [ + title: "Basic TEXT test" + offset: 'center + handler: [ + name: 'my-handler + priority: 100 + handler: func [event] [ + switch event/type [ + close [ + unhandle-events self ; Remove this handler from the global list. + unview event/window + quit + ] + move [ + print ["move:" event/offset] + show win + ] + key [ + probe event/key + ] + ] + none + ] + ] +] diff --git a/tests/text-test2.r b/tests/text-test2.r new file mode 100644 index 0000000..c8ba098 --- /dev/null +++ b/tests/text-test2.r @@ -0,0 +1,123 @@ +REBOL [Title: "Basic TEXT test"] + +do %gfx-pre.r + +win-size: 420x600 +;;; WINDOW +win: make gob! reduce/no-set [offset: 200x20 size: 10 + win-size] + +;;; background GOB +gobb: make gob! [] +gobb/size: win/size +gobb/color: white +append win gobb + +append gobb make gob! reduce/no-set [color: sky size: win-size] + +gobt: make gob! reduce/no-set [size: win-size] + +fnt: make system/standard/font [ + name: "Arial" + size: 28 +] +fnt-uni: make system/standard/font [ + name: "Arial Unicode MS" + size: 28 +] + +;note: should every PARA command reset internal values so next TEXT call can be used as a new paragraph? +par: make system/standard/para [ + origin: 0x0 ;works + margin: 0x0 ;Y coord doesn't do anything (should clip text?) + indent: 0x0 ;X cord doesn't work when align=right/center + tabs: 40 ;works + wrap?: true ;works + scroll: 0x0 ;works + align: 'left ;works - problem with indent/x in right/center mode + valign: 'middle ;works +] + +gobt/text: to-text [ + anti-alias + size 14 + bold + "This text is bold" + italic + " and italic." + drop 2 + "This text is normal again." + newline + size 20 + red + "red" + 0.128.0 + " green" + blue + " blue " + newline + red + "c" + 0.128.0 + "o" + blue + "l" + red + "o" + 0.128.0 + "u" + blue + "r" + red + "f" + 0.128.0 + "u" + blue + "l" + " and " + black + underline + "underlined" + drop 1 + size 12 + right + newline + newline + "Sed convallis magna eu sem. Mauris dictum facilisis augue. Integer lacinia. Suspendisse sagittis ultrices augue. Aliquam ornare wisi eu metus. Vivamus luctus egestas leo. Fusce tellus. Maecenas aliquet accumsan leo. Sed ac dolor sit amet purus malesuada congue. Aliquam erat volutpat. Nulla accumsan, elit sit amet varius semper, nulla mauris mollis quam, tempor suscipit diam nulla vel leo. Fusce nibh. Nulla pulvinar eleifend sem. Fusce wisi. Aliquam erat volutpat. Maecenas lorem. Mauris elementum mauris vitae tortor. Fusce wisi. Duis pulvinar." + newline + newline + center + "Sed convallis magna eu sem. Mauris dictum facilisis augue. Integer lacinia. Suspendisse sagittis ultrices augue. Aliquam ornare wisi eu metus. Vivamus luctus egestas leo. Fusce tellus. Maecenas aliquet accumsan leo. Sed ac dolor sit amet purus malesuada congue. Aliquam erat volutpat. Nulla accumsan, elit sit amet varius semper, nulla mauris mollis quam, tempor suscipit diam nulla vel leo. Fusce nibh. Nulla pulvinar eleifend sem. Fusce wisi. Aliquam erat volutpat. Maecenas lorem. Mauris elementum mauris vitae tortor. Fusce wisi. Duis pulvinar." + newline + newline + left + "Sed convallis magna eu sem. Mauris dictum facilisis augue. Integer lacinia. Suspendisse sagittis ultrices augue. Aliquam ornare wisi eu metus. Vivamus luctus egestas leo. Fusce tellus. Maecenas aliquet accumsan leo. Sed ac dolor sit amet purus malesuada congue. Aliquam erat volutpat. Nulla accumsan, elit sit amet varius semper, nulla mauris mollis quam, tempor suscipit diam nulla vel leo. Fusce nibh. Nulla pulvinar eleifend sem. Fusce wisi. Aliquam erat volutpat. Maecenas lorem. Mauris elementum mauris vitae tortor. Fusce wisi. Duis pulvinar." +] copy [] + +append gobb gobt + + +window: view/options win [ + title: "Basic TEXT test" + offset: 'center + handler: [ + name: 'my-handler + priority: 100 + handler: func [event] [ + switch event/type [ + close [ + unhandle-events self ; Remove this handler from the global list. + unview event/window + quit + ] + move [ + print ["move:" event/offset] + show win + ] + key [ + probe event/key + ] + ] + none + ] + ] +] diff --git a/tests/text-test3.r b/tests/text-test3.r new file mode 100644 index 0000000..0442fcc --- /dev/null +++ b/tests/text-test3.r @@ -0,0 +1,99 @@ +REBOL [Title: "Basic TEXT test"] + +do %gfx-pre.r + +win-size: 420x600 +;;; WINDOW +win: make gob! reduce/no-set [offset: 200x20 size: 10 + win-size] +img: load %dev-small.jpg +;;; background GOB +gobb: make gob! [] +gobb/size: win/size +gobb/color: white +append win gobb + +append gobb make gob! reduce/no-set [color: sky size: win-size] + +gobt: make gob! reduce/no-set [size: win-size] + +fnt: make system/standard/font [ + name: "Arial" + size: 28 +] +fnt-uni: make system/standard/font [ + name: "Arial Unicode MS" + size: 28 +] + +;note: should every PARA command reset internal values so next TEXT call can be used as a new paragraph? +par: make system/standard/para [ + origin: 0x0 ;works + margin: 0x0 ;Y coord doesn't do anything (should clip text?) + indent: 0x0 ;X cord doesn't work when align=right/center + tabs: 40 ;works + wrap?: true ;works + scroll: 0x0 ;works + align: 'left ;works - problem with indent/x in right/center mode + valign: 'middle ;works +] + +caret-obj: make object! [ + caret: + highlight-start: + highlight-end: none +] + +gobt/text: to-text [ + anti-alias + size 30 + navy + "Hello world!" + newline + "This is text test 1." + newline + "This is another text line test 2." + caret caret-obj +] copy [] + +caret-obj/caret: reduce [at gobt/text 8 at first at gobt/text 8 5 ] + +append gobb gobt + + +window: view/options win [ + title: "Basic TEXT test" + offset: 'center + handler: [ + name: 'my-handler + priority: 100 + handler: func [event] [ + switch event/type [ + close [ + unhandle-events self ; Remove this handler from the global list. + unview event/window + quit + ] + move [ + print ["move:" event/offset] + show win + ] + down [ + print [ + "otc:" otc: offset-to-caret gobt event/offset + newline + "cto:" cto: caret-to-offset gobt to-integer otc/x to-integer otc/y + newline + "otc2:" offset-to-caret gobt cto + ] + caret-obj/caret: reduce [at gobt/text otc/1 at first at gobt/text otc/1 otc/2] + ] + alt-down [ + ] + key [ + probe event/key + ] + ] + none + ] + ] +]