From cea421a54eb5e82e189630e4a06662ec190559d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 20 Mar 2021 21:29:43 +0100 Subject: [PATCH] gnujpdf RadialGradientPaint - cycle mode reflect and repeat transparent gradient testdata --- lib/gnujpdf.jar | Bin 178689 -> 188836 bytes .../ffdec_lib/testdata/graphics/graphics.swf | Bin 108384 -> 108525 bytes .../graphics/graphics/DOMDocument.xml | 48 +++- .../graphics/graphics/LIBRARY/ScaledRect.xml | 232 +++++++++--------- .../graphics/graphics/LIBRARY/Sprite1.xml | 4 +- .../graphics/LIBRARY/TransparentGradient.xml | 41 ++++ .../graphics/graphics/META-INF/metadata.xml | 18 +- .../graphics/graphics/bin/SymDepend.cache | Bin 358 -> 385 bytes libsrc/gnujpdf/src/gnu/jpdf/PDFGraphics.java | 2 +- 9 files changed, 221 insertions(+), 124 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/TransparentGradient.xml diff --git a/lib/gnujpdf.jar b/lib/gnujpdf.jar index a91780b9a5ebe97725195974b83f4e94c669596a..57263b0e33275289370c67e9a6608c23b540c5f4 100644 GIT binary patch delta 42324 zcmc${2Yi&((my`uJbm+|7ZM1tAwbB65V|BFolpd%BVY?jC=wD#f`D!9?b>kF6|C4$ zv4U*SD1r^k_1Zi3-ut~4l>c|mv%6UW*L&aJ`+h!uGYSN5Gjrz5d2-rMzMCFR zN}hI@ru&F&qJ^8A*CqGTsx~*@JEXJFzFFD4^$2m~wq)ebsNVk0hvQA6@mqIAj@QM2 zQ2KKPsgsYZI=-r`YISqj%q3MTYC~`D=@4pYoiF|wdb;(U;$O+If1@1xcPh5`(lGlE zI^6z~7TWu0l|yts$}V&SUFyit3lGjp;XxKGdT!)K0J6~z{rPyOty3TRr|}mfo%HBD z=_GA^?a_c3?4*$4q*8AujSg|rX@rwO6P!#s!pWkeooqVI=|F$O`#L9&wmBW?O{WvR z>*R+HdHjAg@bpK&-~PKs^t*{ z6=|Vc=JZZaE2~^pU){X4p?=od6}A3>zR;dIi)P#87u36KY{T-ZrS<*=rTzM#)%-|))6iyoopkI+NkJyIYBg|2_EgW=L4G$d5en)7dwmltZBmtpiIK}Dg|w>x#} zMMNgv$T@_Hkb)gzB{dj?7(lw6XL9-+(#<&|V~jU@`a1eX`y zi<*+S-;U^+oC?rqD5W@uQU_-^`JEBe!x@<{R!<%awb4KIrc%Jt2WcJ8GSafBA6_K& zrvWN+APuJSP`^)dJ>vC${Ei+eL_JcNYr+q0l~(A_7aj3joQkC{m4!}uVs%#sePp?m zO*w)xj<2fg-dI($w5l#f$B?o3Ld~LXq59ngc7eh?^$dk~k4@@D#TErzK-fF{XT2;7 zWj|RV`h=!ES&&;weO>BA{RC;fis$&KfCjiUkOqa$d$Lbn0UhGf5E>*XX>o1yxcZuD z4NL2rEvg7T|76FMVRWcP!(AFdBf$aT)6ztC_}FA&^-+C|_0cdI?a~-7)zN&OkIHEr z4^}D2>NOVsisx7~A@p5KzB!)y+H_c`=Ba_<=PwXrlBUxPi)Oksi)Mo-Mt5=0cCJfD zPzpL*Gi7PLkLJ??i;i^ZC^|ay?R$p~JywwLbG?NwRjYbyQI9ifU0M`vSha>TmbkPu zTBB->P0K<%p6+Vr(sCDE(hz$8{TzEdt#oNBHHNF65(P!gg7U!DGyG-a)->1F*Z3DS zH?FGn^DpM|@pQaPt7%Pm-BY4lvX4%n6D>N)rIYEDaQZi*DCtx>&7#v?I)ly(uPc_t zIg-wH=^S2b_Ugu^&9y+SMdyXSe5PwhA5EvfxpVU4|CVx9MU*sVu%~mewy;3%MUw2{R{zp5m+B@1x6U zxkXomcbzA)Q*63YkinBfyA7e_zYpwjE?w=?HB9wnkgc+zdR3F6J5TgF#>(}A@n3gr+X@h3b|~4_*6^9jbfH4Xu43JM`eQ--$;PWkpv=i6`l)zmO9B zp34${4~_h@AiQ>!Oo5~}$2P25SXUdmv#vb-P7-t%*5a|GvF5;<+4)?DV4k&&G6TI^ zsDros??#CyR<5RdkoKcC>e9Wm1y4>HUO7@*={~GZ0TTQ1MBnle2q1_KaR&>O&Vl>L z+C>HH=_O9>q=G5EA!fEv(JeHxl}hKeP+71-kESXN6!x#s@q2KE(Msj>^7IG|;DiqPckG_CYLniHXUc*!^>o>O%|PECY@ z?J6yfRyq#N(0gix>LRovqY1AOS{0$SXu@+l%bVM|>*;Z%1ix*k^Vid%B^eiawMsHB zi6&yeUF!7-349s%8RkBNu}(M98t!B#ojWByoAsyxbXm1DxBa+_@d9 z`VN}p+)0N!chM~8Zd%~n3zfZvmOI<%1SdjIINRwpq~CPzhstiH&z*Pn0A5AU%XUFl3B@k=j8IgK2kSvbhvA z_tMc873`%Hi^_kcmA}*U->F%rT_|Q%_6RzE3~5P^(-SIhI_;*Xk?M#NR<8W77d=DI zj?9A+97g{jXFvOF#u&#C4_QR~laI=a>sOT>x1wfI*|f2hp|mHQ&^vFYg{+r)hO*u& z+&b;0&N^&@`qx_jttHSQw54uf=M>Ss{v7qXmRDcSj*a-6-?)%k;Z zIe*e&&OVxo=X6+$D|~`3@kzSVr_l~PclmVs&}YzRJ~K4s%_TNlbB~n`(LxWsSrF>- zPFm=jH+zO=y~D;-s~8;a^o;1ewd%rU z*LMct_p~SaY(3+h({&{4U+Wc`R+YSU=!X`X4&6HTqXseBH=GRLNJ{aIq7J^%(vT^q_ANed(J_Kl!H8AHM0Lt8a$r?wc9<`QuqBS6tIP zqu-htN8JP&braixozjQ&sjjPPYI^$52X+9}17UMS?LsjGP<8tsS%#yOWtbbc3}NKK zGKApg$Nz&BIOIQAfi7EtE|h(9ZBujTy*)Yq&g4s)m|%weADVnglgUV$LMcgyQ-`E! z_Z-_Gam`-2z{qfxy2GI;d(W$&0o#w{rRLGS=5n@vV6}} z=|WvC^1HADyRoTKWZKj{(VEaeQ1a>vN9`Tc8HI9&@h({rQyn;%H?guNS8)YR)V=CXapM$ zf$;Mm2shNQY%1FevU_=`;eknFYNDx7AZGHm0t_{qfsHX#R?x+wkZEb;Kv5H(tjt-s z5oR?S;%*F5Q}M3jnHDJ72Gv%&jVv}0k~{-pEJ~DtkaQf4L)tSC(x?)a694o16e=}= zCZaC^#Ae}%zJqjrRBDc9Et+1EksYB9FcnHN3Zscu>H$?=lo5zfZ`Ozr>I;h?qa3eF z({XKXJE9F7wOvVC4&JQ??>2yUSJ1Gel{6};QGw`fjYb2+QV+(_G>HxaT$2GM3;8Jk z>TskbO@k%Mc{5;z&tcw8XR)a7dZKI-#^axkA@M|qwEel)tPP#^NtW=1uK1)!X2z3VKHF4rZ-lSwwo(rARDKz!dGGAwxz_j4Pn(%eavg1ZANn{wP*ljAGw%80w9am*Qa& z?C}oazJ;O#mRT9~X8;F;N}Z`Q{IL7_u?-1Uh*YU=hG=7>9b{rt$qM;4nSzI%WCU0El*Z;sRksDD0?c8*JP z=?GwIMZ;<=Hf+I)u}c#)--Y#XByt)XvR2jCV2$*uES|^{JKCjVFtO6lyAD>HsKsd9 zw6vaUMB6TP={Vx->V_tB=bTf)F}(BEsotdqS`j+^^Rl4Y9dVuJs(N!&__Z^+jydAz z+3FudaI#CMa4&k(%Eo4HeX2{R(di)h@`mGUn;W9gg7i9_>C#zrHgE|Hd1a2;O!9V; z%g=S`JjwvQs_Pn>YDd>KxYf%Tf!?MnH0+DQd~BMMR>D)k|IHZh_t84K)S{3}m(k_n zJykM46#k-{8FuMPS|57&iw>Qx0`Q~#upD%{hP%IU6^+FhA#TDR}%IS z7HxB3(zS$kec64^R=VGXHP?dqu3f>q?!Fnzmeq1k zZ@csky&LXWBJ(j(c%3V=G8$r-T zOY7<&QN=J<94dx~&it-_(nvAN5~E!)MvM*Z`tGW%k)qNSs15(IQWp3abBkTEL@W&*|6^BknJenV^3YX379=%@6_!}(ibl~C+Wq4YyFsjS z#qnZw__UK{Sw~B(6_lQ6O-)>0wYb(2Cx)i|lx?3NAeYj`DWT;*MfjM%iAg@6I9puliuGbc=;v^`FG)0rt6g!8xHf#usdDrLaXr|+ zOaV8>Cr%YNxZ*}$eQs4v&8&uLjSbaJwaq^Cd9y2S5dxKg>8VxAYdP-%ZgHC{Zl}vb z7ymO`+z}qRLKXzYW^oroa5w1Et5W@AhS@Ccb;TC3)uYzT>Z-b0RvEpZDp0n~6_I$^ zlG>`qd7Qi575DF#dj#jUy5hljF88DA?r_D!oEv24(yYd+`ldSYzG|?`6_0SyekJp4 z@fg_NU%lM#v&9qOLI2nW-*lEG;z?);@f0fu&o0o#Gp_hM=a{U^n;W>&KV0#gcpfOJ zX{=g3iWi8(cEmtsOW5K?tgt4?An`KGp!MA1Rad;G)&{po5^sn%E%BBs_K3Gbzx=Dt zeAgB4iT6Xt{W8z|Pz;FDd_g0_=K7Mq9pO5_>B4eBA@s|d})cVT=BK|28%CL z@O@sW$FCFZFT{7Q_+I=FI{w$LJ%19Esr1FF=B0II6RMh)G*`h*%hP`pS7X^q0@M-&pV=$q|Grab_HX6(hf;H;E{)I?zfHHK zh2b@Jd`mQ!VT@=BT8 zZN4psf%Xfz>2Oz$P&~rY5IkbZQ5Y$-@x$znwj2ZAX$H1dHP-s%I9X}Q@vfX8n!@iN zC3DhhSFWn6gHqPzBv&3LCx^EEaY(^bR~{}WgVUOs!51|&F2{n9l|0l8SI(5PLigKl;WSkp?TLcHGoi6KBm!l56BzOP=7$6Xi*vE&FOyPLV-Np6bfe#1Dcx zhOa9S9WNgtl7gqmGhBJ5JPYpNs3|+McJXq|koj!^>`Pmo1BP0{a$TN>WeZOSQn1p_ zk{1Bu(F1}cd5XNql^64D^mt(mW8q~IXA4ir-IjdPl~2j1!z*@+{!;!u{DKtS%zw~pmV7R}?g5bl^)gky z;K~=}OQGA-i(L7NeASY#x$<@SMtHI&rrTxmEm!W5Z-;NzL_fT}>&o}!`{8#qG0gnX zl^@BE!+u>%G(Tnb|18{~i)_^T!j)g5%>}yXT39B(cI7wneXN_q#?3pXa>l4JvnC!s zb=2f3<7Um6IA*3LzYG6E7u}OL^US`LKQc0Y3h&cJaeA3p#p~l=ob`*KZoNX+|57mC zp^xNmuKb-1T>%5_Bl(9bQmBwq`&_uWkZ-K!{TgyK>1rD1m`kDt#x0uRYNlp|HyR?( zK2>vE&8H=W$E3)<-N6c4va6*qZ~Im#X`&XXmZqg!8jQNxVr%%`WwLXf*sNu_S~l-R zyv5Ag%6#}c-ojv`gW^0_>&V4M6YDteu$J#?op~N9P|8ywX(0o+cOJB>tNA5Fu5awP z%425EnsNAHrdnlBL;A^tBujdhTpY>zoHUzUFjb^OEsL} zY7>>s+`N|iIn322d#`J3ZK{&(%ennDSDUWQ2$$QUAbl3HXVvh!*XFp|T9VKqIG|0KML<>z7$$PY8U9E~`09!gUm!42-Yt<|OXD#wGQEFXn zkp@9$Ha4(njS_5F*}Bn|a>;QhVF6P-hk>qhwdK+eR!FX{TiV7AkahGpL%G7$R%(sm zGDj3vKzwQa{Hty4cyv+5CvN?)w8hQ%rLA?f6Bs0$L26#hO8ivqB*xsye0(>`mRaHJ z9Z}RF2xcmqh0{ZB&y`MdwbQjT!hSS$|_nbJSW)>uCJp&Gx}&Vvo9osSbUe^7&P zlnej{lKv?^d7XBNtF7a4O^iFEw#FRU@Sew=D7)O%u86@jzOlBpo*P{0YU^XT8(p^w z;^sQ-Dp$KYR#7<}Yz<=2E*n2nz4^53wT+f`1J=}y+D+lZC(4}gUY{sTx<%V$X}7xC zZBU4TB+)r{Gic%;Hmt0=3MBqsyOTk`tL?ejuJ*L{OzhBmNTE;8)*f|G_77KkPJ0HR&KOrYdEA&;KD2(p)n3$I z!pV1O5#C;LwO2LpW8%@bPkUW^!_wY#wYS(%Z9DXKGG5o-cC~jnR~>d++Iu)(_h)MF zY9C;QLb+k&k6i6z?UV3b$s#v-r}hz#`MIlop?w)TY-hL54A$4K_6>t&&KNgs+$aUr zcf7#A4=-s1^oc(R}` zt2ULz+y+OnuKn(6do}Ee)2kcmkFRZPPHZ)^S9oKC?B8?$R>ce2Y!Fp@sHN=_loR@X zS9VfApZ2FN0H!X(|4709PuIl-mTtfeo!vD_x3m^Zw_`d^nYojfHZ@zi&+8y3*{3@? z{IltLvY-X*)-4NNu&Z~LIdX;KWAbV5!a=CR1W*H}4DjjcIwB#`^=#hMqCtlsR=2i8 z@8IgWOtkh#&?xHY>Ycc#-Jv#0I=gxo9Ues9p3Z<7wyFsX)~mSE)(gO%C;Dt1dL`N4 z-w#uxc8$Mj)k0+T0B87@uc|{fe*1#9UIYhwLJl-Gs=?!&?H`cPvS!r^)xg$E1eF}L zh+FoHHi=gE5A@r5DO`Bb0X#@}c!s90e`!#G*4JOx>^srd&v){P$cttz=Bya-^|g!P z^omXd&Ne>=!xU`2Oi(Y?dCk(}eKCN!cC014=6Ez!8_tG#@!C98kTDahy0|$u{K@_k zqobYdU%IHauBp~nyQX@He?`Lze=GrD_XCfi86apvy#IL9cp}y`-iJSUU{)*#T62f? zsI3pi(gZp|6zIP!Mr=R-;%5Je3`;-m8YR$(`E4bfT2$B2(8%+S*1(>jhw9lY0QDPc z&{42=JVvX<6KDYIe-q@JgXy`Lg$zR{l94CaWj|FQpFq~UeUju^0 z=x6J!Zx!Ng9WIz;KNF~}bP|^?U$q$eTxS)=1dVf#txt_*#b{&e)3^oKvh^7N>tqaO z>rl%2$qEH?AoY<_w6gUhumVo@Vc()9b?TEtK<8^?JR*(pR|pO1+Vt zeM-L#}DV9?ds>~=Z1ex6C>=+ z`uVQ@H@uBZhuOPXztGh$(k~7ll`e+r2(?i%DSwcyhge@mw`4y35}h49`W4ulhYPZC zQuVKNQ4+io$Va@+(t2CRrbL#lfJvu3H2O8Jel7cSGC-PWCo^iB8dfz{*V;NZD;k>F z`VCAx4n=~_)NgY2n`2F)$1AZWJ~>j~UZdOhNotU z{wa6s_gFfdKGRuw<%LgOF7vW|`rTSOy9GbtU!PfeBsx!buutEnXIVP*vM2oy@#)+3 zR-WpE;V#)?Zg5A;qp`H1Y#Muq=W>WsqfdWG>&yMV!N1;SBtME)bT$g;Qgfsy>IrZ9 zldk@ha&|7NTh#=IX&L)E%Jjdx`m+LV1+%f1j|DjEIahyP)vT_AGs-9H^cOq1`b%uc zurx*A;p%U49oFrWqenqpYmckHt-pqRSnlzBbo#EV zzsDNFjn-GEMBLy5SN~A|D11_m$emoLf8y$&ay3>lQ{tyZT<>#N|3d!=CFnSz1UUH0 z)xY+(5A04uT@A?nF8p4O@E3lo{{Re0*QbBWdx6dR&#wMYo-W+-thX)wmvCVR(SO)x z{Wn+tUF|twz>jHTWm|`u*Wf&}b*O8x5*VUX+mPU*!ajwCg_fa**L4uxT*EXh%dlO; zF?`{NJBR_v2KG-F-GENc?iHR^F0&nxZKQHmTKGE$ky_8MHpAt)qI1vyNTM$s;6|2f zWHSPDd7f2kmM&kl92;5{W;%B1;-$?^meB$IDbb)Tfw{F+%h>5P1!OXE)Nz>6(KR~p ziHF~C9zgFVD$;i8`6l2GM8N{U1kW*$53AKg#`7qwQuYB@~RMz3ogYgK)?ph$F1 zP1!#LG`y{+Sdp%?GYJcTommhID{8}wim6e8UnOJCALy!SxFRrDR0R(se{WnA#fPOPd-@2 z(OI5PaKY^ zCr+8wvu7}xz)3P^@VSzD;y_7N=;J+ki>uyoCZ@`9X2DPP9I7Y0uKeWPxO&1x!B0Xw zsCwdXnV;;oQ%|@V`Kbl5?N$lw#`(!d&+3VDXZ6GZa~u<;D90(Y%EzHHo<3f2c%DYs z6;K9ha{TgLUUUN;5on?0Kr3a=GYq|j5T}s4jq(H7u=)8{_kg=CNJW7R#7Oi;wX%7l zh5BuyfdR3NhVZXp$Q^-DhEdySbReDfZKFzVI8ntd7-bl$Ke_ll58QDr0-U#ige^e* zgVY@{WC0xP4aU*jP+`+Z;iJPu63r0FMqjjW0Wi@KMzEjJ9|<1|h$!@7bOtXGm32Hj zV{-l2!i*_bTti8P8B^=WZKCYL3$y6(>MWYxkVP}M)9g#ebs}bR04gEHefwOqx_|3_>Pi)5-RVjlm2V$-R_~ zpL9fl7>CdRa3te+CYo~x4gx#|B9`MQ#)&sR2fh%F{cI6XV|uY0j^RxeO^hLmz01*} z(nAEYj0*Jcar{u6cH&^r!-sYW;^K?Y;R*WS++5r&IJPN^7A`B#%gx(PHRYZ7u_WB1 zRP@L=c5!*qrhVV#CgnPdk1S8gqGjPDOU2kh%X72J({gjlGr0N6#pRARICs;&Yq;K( zS5r!E5<0DJ*K}q06*Mi{ziD;6DLQXjww+d$cjeX#!z25Mvfz?s)y271ZUNw0R-Idz z+oOe+x1nVVLJ-&!=g|Fi5?w2(mfaI25TAs-scHaHO(m6%8>)7{NkN>ZN$akK@JPsA4V! z6=Q6G)JPViDsL20;CXR^1_iI!_XJHt%2K7Hk;2^-v>1a_l1h!mNXdv8-4X?+rD9CAoDPz5-ISxSZ$0)#atkKnK1!*c|d!OF%hXwK>kt2B&0fn)g~H;A=MQDr=yI? zNEL`m8fZ*Gst{x;GNvNc!x$W%+E+}xD#ddkV76H-%i zb8>SVs<+cg)eW0SPbu$`+i}0bj){f-PU|TtkZb1J2ulw4=_ken&uHVB(U=a28xiz> z6Lk_dV;SE!4cjoC=$VnN?z%t5Ln0_m4T8t8QtM^$I`QIj+}*H z?wxeYl-{xY2;CJxRNS>~H1DZ+{Y3!x5;@{!SOc$7x_BLI`X==fZ-Mr2Q@MCY0n6eX zLCnSi*aJ+%iYVBiVTE|nI1*s>q71J%D$X@u#$L*?5WXXfql}}Y2waSgxPwB4z>@oD z3x2lar!_)50vV40eH^j(*fx5yJsQ6Nq+cS)@hjLdU*lHQH-HS|ds4qJj>kgd7~@#L zBaEsz*^Z5p%@?E8-`hI(w8(Ej!S4xl@x}Y|#p&XU)5XVhVX_3FQ9Zg4!k%Jw!5~bL zdEN?S{9`|UP-9_pVM?jS@|2Pl9}AIFQ9PX##Zv&Ze11K-iq~F_(5pzi!7CZO2RsE| z4Ft6L+vxdi^hO(HRgj}}$&$&GCJ`G5qp7RRrec|+hV@Vuhz}bu7QzY=if|xL8XKV1 z;`t~ji+Lva!P1A}q%^lO~er<;s_HlgrUzEzJxIYNaWQdjG0KG zQ=>*gS}480Fp7X~icv7#Jv`+Iy*C+m9zL3fmnU23lOXt{8=hJ#eUD*(3=|c& z&`%NiC6H_6T3#|^FWw{cCzC(dxMZ7P!~OOdh|S~@!l?ZbFaM%l!6&;}0%ZXnmm z#a$boM5chciG%KVpeHHN(OV+qD*<^URmdh9C7Wr2T%{oQcxz%D@`-WCCo0H;4En@4 z=o6!$a~^9EM({*~wMdehPE3qn6O{);+f4`Jp+)!@`H<&cDiQac&t}wT>v$O6VhFNr z?xFrnOyDdkm1olcc@8FWZUX9u#wRe;SOivQ)DJZlBgL|CsIdeop2<*SDN-!t&x$X< z9e|Y=*o1?@8r&b)K(>)>dT{TD`E0|3+-!rq4e<2j@4)}yP z;1lA2PcVWp$R|W02b{(<%z+tcf-xN_Ue?FO+5Y+{+YfI)n}e`@rbtd;p8fb9y({Jk zMv;F9=5QyK$-8JUcA|&MdlHa8JU)lvaqbx&=lkJt<{2L2d*isc;F_u|BN2$nV(=SlV#6-0i;ll|fl^;0Gs^KL(7 z!r@L+P;|k;mM5{tV{B$(C(!Af{Bv4Fe*0eEPUtmpm&Ur3dv%m*;O!m)RsXvw1^@dw zeU>nK!km=Rr{<)LKFo>3Sr0xX`lP#DYN=E0h%c~AnTVk7c~ zCtxYGh^~SAM7Q<0N&#h%DSANIZz3PRL_|@WZtudvK(k5Le3YaGlPFb7rW_3xqn1Vi zEknWM*%c)o<&;_nX;L#mT#np}PHqIK#p1^blo%}{(5Bs$m7;YfQ|qF7^UQ@dE5(Xh ze8Q*;8tgyfefm-OVMD&Xm7on)eGK;sC&jTcu{gDTsz0qVeE1nm|D)h!=5XSLH@dEO2 z!)AqNKwNdcNE;56oubu{t<_@wixdQ&36L6} zcPdPhwF-h%U?89%NCgH0=-nod!q7w5;hw^r8Q8Nwt~89jbP8F1aw5%6Vog)PBczZz?2v#8>c8>N)%xj z9oUTlG4NFdsh1H%MMH74O#+t}EnId1loD@>4JV-+#+=mIPnBS;YA33pJ#$UQ@gOnu zscL9xoCaSZQ$iZ28)pCyJo_`F{Wb$D;ZH}3l;9LhJ|br3>HL_}ev}ImCYT!^B{x1w zu9_B)lB=f06U;Tvg4>m$&Q&8bw zZNxXefjoPgSmeQJDKPPSW*&YefY}Y0B<(J&(7VB%_kcO>g@<|zb=S6nLGGiz+BP+X zBbD`58J|L>HwCtME8}yhjL)G`Em}rmrCPL%vPy+mmP(ash8COz{e=T$gIzd^-kU4p zn0)MT5U256w}|6P?ickEHb9n_ZkDuDtf{az(TY|PJOSHmaS~8~ElETK^X!N?Yi_Gp zGY{lpY~-2yX{brG?V zt9ac8e`I{#6xZhbwkfgyh`6;?Y@P=zH7P0EXg)jt?9SQ7v1hl4J1guwyMq0wvAu>O z=`UNz$#Wv&o&kZ6c3*r~!Xzyr4Yy?i@I} zNqZKI@*JgU&r^Z+B9&;tmuQIg3N6uIqgC4Lbh`EiU8L=yE48=jaqS~|NBfvQ&^{5a z_Nnk|pNWCm=VF5Pg*a0CQk;bRp!SvGt`p!_>VkpJHqHT~mr%8Fu5li7rZ_FeaY#jF zgE%e5aN@LJjN?$uh6^|jDc;k9Ug`fepuvMe%2>xmIpd1B<-R1UCR4Ddi-_I4p^J#8+bK!Cj7+^RCF}hZ$exl+ ziG!RHH^EclCU~cmxDB2X+pQU4Z`kn2X^6BE&$f-COeuX7Mi_nY5fo#w`I(~lim8_p zH$PIM=7%t@q+L-4IR?~ZdZq?SdUs}@S*CblKOa+2segS6S^88;(GOSSdTK9G{jbLX z5|5i|Y(R>~O*O6p<)QYBtK*~1ijHPSM{7T``547Bal8?1qhC-RG~tU=Mr;T>K7<_` zf^QB+C$u=K-_mgg_R&1$No^4?MZ_!Z$688h`icZBrpM`&9>-!j6f`Em(@Bq`F+GmP zYm957qfW&{d4aeA2>aLZO{a)>r~QDdDM??W2K0M%;{&=_bk`~LxlyY@2;6y5ea|E$ zOtng{6;n%gQ6}7VB|9k-A0s&jgMA>VLdWxCL4yrEKgH9`gW|}BO8vaTVy*t|V7pcP zIIl(gT;ZU~Kf_BWio)P;k|N^Ixo0McP5a*E(?-}JR<@nzw1|BbNvt)blr%RlX=gUm9{d}6P z|Ba5+FQ7&|*XS41dHN+mx>R3Bm+K+AM!!s<Jy4#6Baf4ejm8b&m;!1B zZduwCQ=Ky9O?cX?j2n%cK=2RsaiH@vWw1bPiF2a`_y~ZilPQbX zFAB?z*RN+f^kLnj?}TvQMXvq`_0b=rA^PJqT7QD3=(}k?;-_l$r>Q~zJ2mOgsyTbY zzd268X7M6B#d$IwD%tXEj^Yw2V;iWY$2Qk}O0pQivTqa-vw;RCoD;w{O-5vKd*Si| z*}CUu@sOS1JctkM#A(QGgybj@WrW8FUor*9Kc(%veFv-i-2@sYoMXhh^-eTcMtUb2 z%o?~mb}-1zgFyZPApg)CVxTw2IL@5-82f|nK|UZ6@_y|h{~D0-hUyMfXJ_sNO)nG%uHHo%{NYKwNtku7pMl5)y6E)-}tdp-5{+RZ&kyAIKIvrAg! zytalcp^sug>}@ZD>MRR`^F~$T3uDnkAm$2>S5-ulQHxc$2-90ky&n&|F<~yy?)%8&nJty*{ zcGD_6hCD&_ffiZC&}PaS1$V;Khh)nC(bQvScj#EncM(3;7CZHVV^_Z;VOy(o6TEpT z@V{liyOwX9NIhZ4j51E9DR6$xHcq1^<8)eWoIz`ivlNSXb3QRX=M(pvv-UfU%Ean5 z9*7H+#Y(;b*X^wp<8syE|DClW`6~+^qP4lO2O(F)PbIs95KsB~^@NQBq*=akJ;A*# zm+X>t8z`GoCHG7CSSANbl&CJ*BAf4*t0hg<2J30&gJy+MdcQnb&<48oOkI@1-zZO) zFqE^++c7JS_2Yjm18VRy6F;l)!;a_zMN>nb4f`Pc;4IO-=NX%D%9>|reJ{*2^u8BH zL=kBC2lrjP9gEHV0B>8buhJkQ<9f)?jqt$U1pRz7wv4w@ zmT?<(F>Xg#-)1T^?x4Q#2Ub8A9BOQ*F%XTDjR)v(e57%n@gOz`JLqiVVLH!v1Q9xq z(p||hxq?lpEAyQ047BI;l`{y!hW~1x^@`8IMO>!va@jQnYWGmC!Qg z_!dC??u2op!&30c_N~1mpmyU5d}Sos`tazuFw0qhUbi01uk^}wo56$PB)qL1jo{hFsQ{-JwDL2?-=o_bIR5^iZkBAd5J4)8XR$`TU1SsB zX0cehMZOu>BHxL~4BtGJG51PJC7aGE%JLDn#&*BsNmtNhEmL0$~VNsH^cDd)pb z7K^;bDxSk@z4lqd-!5^x}wv~PUrK^wnmycHdKFwo5ibeTkf`+{;xi~MK%PBtWT;zlVW zj6KHN2fzK{gF~E7M>KM=s)9g16#?Q=O5! zc`AWGM)3cA^4D|lYcK!$6TdWZPDE2@ex9&VN08=b(#<<4)w~PK;coJq_fWC9MZx1O zhcWTxFvfTfR~rPIO=Fb6XVQ)_-Ur8N@N5N)4-on2?e^ihPuhNwQxO(}_JsSz!c)2YEMEhnPo#;UYv zodR35E)lJuO%Dg)BqMVd7W-qE+2fem)0o-wRARnBhnO$YX!8}CV!lqZ%s13bJqDZ| zov95Q^F!k!z|2AS>I^l{($b*8zB0hsLFFCVfLC7E!}zO?dvFs$bZgb{sYR`5N(qj< z;43|AE`sB3r~NX z2aS-O&c1v-m4fk%d`=ZI@5M~USZLdR5Oz{=VfnGJFfFJ&jB4>%odIGO%C)-E5UYTO zTis}^Rj8=sA#Gd?X*4drfgk624`PaL2xJSsQ~2K_FNkkNw8cGgNU0998bX?M>w1Y zSTit_nfQ|ib7-P9SIxw;ye4^UpnwKOlRD$*w~C{$FS>MTNocy#eZw_ zn6e=6^KB$uh}#cjEg{QV3W_cVMe(&;Yb6y}jZ|Va(;?O>I>tJl8m-lImbHeiwARw* zpmhSiJ-&)|T9?p!)}{2Jb(u)A){8W2gUGh77KPR|VwSa09Bthosx42ov%B^Xy3P1Z zPUZ!LYcJ6YSfU1Ufp2;t4{`yg5sFEm?vs9}*NQs8<4il_K0UsUX7Cjc`~?!NPj9Uc zPHn^MYT)F48Xka6`@U?OniA;N76|jL5ajnE3TP|!up){nS+OU>vBzgp>>lVDg9fSC zfn?9PGp}cYGY@)wFK%i4MjfyTz}Io2%dU!LGWXQM<4R>AO)V{oXf=USDCjmtr=riT zhj7@m0|!qJv?YN&>mZ}<#@DT%#E4H(zV&n*5$Gj8YUk*v$Wt+otT=Gf1duSo(i9{J`sR-{ zMImWG3HHK4>J$ToAu;ldqGGmD@{EJP@dDs@k+Q6psH63=g2VIXcZ$Q&$@oIeo~V=Y zB~ltjPf?@ucK9n?I`fp-kZ&WiY6`Ydpxr$+T842v zlG>I-1>zye`UM*2H>~vEVc+bx&cS^CnqYzJt#UdjF ze|0Vj+wow3re3g^C2z^iFsA_I9ZZ5fnc6B$el>p9M6?sP$y5kmZC)Eml!UU&$hHw( zV)vs$dm#0)2PdGrIF9aOxq)}$N;X0i^g{CcL?CeP3n&f>#3}y;5aj@(0zeD}5W@k4 zXN7q9{7WEyFn)x@?t}G@k57BHQc)BW1#Os!L4aMrss9cSV*tWffG`fMIG%di-eHSp zt`)`cP~_nOb1gD{GJcL~3k^5DdK&*kF03CN20wqNB1)lGAUs%%EeKz;4A){y72Wgs z)^(c}^=t-&06}Y>8Pl2xi$@(p*a-Zzr%=9qICZh70ZQCVvS$L)*+AG4_}feKXrMix z%IyU--#$uF(Sv?L9Qp;upnpLq;F~3IB=WU)Pucm%*o!NF_~KJPfR2x691Qf5VE6p% zV7GHPIKYS95H|u6!G}lt;HN0|u>ijc;8z3u8i0>GCiY^0zZBrt0sQ3vzaHQ>0Q{8) z0Usn@VEhsXAK!pK2>60O*s2=Lx2 zSxZjPJ^}1;BEG$M5)H6VNmwQW;|LxIO2e3lEt3I2Cq5Z+FnD?=!oz8?K|9VwSLW4dCZI zFgAip5!T5s{M~^2Xf!9cYuDYc-7Ik!F$-DI;L#ru=*c$g?f8w{N;O7AyCayX-Q6xL zQ@a;A=sKcpNA26BfP|L8trj=v~v6akga5od0{Nv;oUr8`z4mNIH^5=W+)HF zau2BRV7y;oZT5N^z>B10m$qXAb--iidg@rRQ`;HQ9@(Njaf>>5nG0m|%?X_0;mZnW zHWH2{wYD>3UolCi`MCg7!M{*_YzeFCogZFQ-oS70{ev3fNadYp$n}_68bj zUyZ+TcnvMFuca0Cb##V(Jw0k~q?hd*={x%tG2XsSOto(pGwjV`xqXLNZQmtMvA2k` z?5*NF`#y1r?HQz6ZB^G zNJv8die7ZEk&uims%64$P332``8G7V{lS-lCeau!FiJpP7bT%-gDBcG3;hH7^-0P#3j=E;mM{vEn=JC$yx6MkTl^_u<_DiE=Mh1IJ4IWHjcOzbsuY8UHX8kIqa zY}Yl`tFg%T`*jnt;Y>mrZxj2aaxA^rQ+CB147CBgpZrxhdsVYPpkzZx$rw z8Cb=^_0-7N_tt>kC!V_^RPXBEiXlp6_{kQ;ss>Q z$W6;lTb7%Vo3V^Pk5F#mV;M=|Yw-mRJR8b!JC(D_lX(k6+Io!7Bkrh3Yt_@|1zPk> z^qm&b;fZ~XpLsmO0U67pIeVg2_Qa~RWh|@avV8UHxC98dwF2W!>_K&-sye$8HsW%r6@2h}9w-9cC~bh+uVins{9e@377 z8Ti9H``74?3|35;Jja1sv}bRjjxol`L|LXjsI3OZM-|BL&ihx1`cf-0@lk{QOQK%5 zzvv!bur>e=-7z>Tz>o}&Er4uoa87nkc9vdqgBXlsUv>F9&x33PnsVhsvvc~g@uH7v z%g~SYvc|M!c^PnF#Tubbtob6Nhi}PmI>!{CKv0SYo@& zqU|ngYnRx}vmIEg>g=+L4;PL$3m?3hvNM7WsvSGD6wMehM$HZFkv=_EerAr?^ylvV zkrwrXRb)mH%kBO9S79%h>Yv;1d%LX=(K4C(+*m0u<&uh=yd022pBK@O+C(`O9WwNY zUb9_ayhUFw@;XHHrkF%YWr>2rW>Jyas;_3TW#lG9bfvcFYb*FRrII^oTq`i|KANZ> zi!UpAdSh=?ZvB0Vpig-ixNUarWD$)2oOf}>Zas5*IB5&b0CLf-4kdD;95 zm?1SXlu+UcKq%n_LMc~$uBE(VZpZCu0GP+^KiA>*smt{MFm_3y_RrFzOeDJn7QjG3w>*?-}*-5?!M~C5+H`f9I%IvCTUQ z0>OUvupqF+`~kXOKz?3ULp2B?mx6t+Ak zvfhx3Jc>tj{Ao>(%7yz;xiEps1&V%cmTabuu$FjN>S8lS)2~WYND=*NI8@Zi-mf~q zW;>8s!z&K{n5kcPKzEP;O26qFV{qQs)?Gq%)g1!-r16~bhOtLqXkB5oT05{=Rk8Q7 zKMs<}ehHT4%amuoLS5}wsfYa<^|xP#KjsZO!VbPk$JlStQhN_I+waiH_PcbB{T^Lv zzfafNAJFYc-(!DF57?j3WA>-?Jkqb)pVNEx7cf1)6uSMn@Y&ypF7~$qf89qE+dqgy z>>tHg`zJBQ{#nej|0$~RmnBy?rnngSmphKQ(n-SK&Fmt!I(`ueItAi>r<>T}6p9y| z?&5W)hj`!VDZX%u#P?1w@rzR|4JRNooD$j1=`90JsqE+Uk%OFmvfLRcM>~V%MCTAW z(-|k%IF<5hXS}@4nJQbI!{v+4H2H%wU2~inTCp=*8|lo|<~sAWB~G=r)~V6XcaGD7 zS2^|CElz{>kh4;I(rMH_aGJGWo#S=gS*>?+PSy*ZQ}q5$P#^A`svqy1rr+wEuD|P? zVdOYx8izS&8MBISm~T^oa_9}xXii0*o^1B&PB$P&Lzfk&ZWj1&gI4)CuF?i zTxNXhgpIwh7hJDktV-OlIc8_pNz$Ih4Lch1*Vj`NK* z!}-=~cD}bxaDK2Z_Sx1IKA+XiwD-!=QQ)9?qX3Ztnva0%bb%M-S#o9v+JDx_(eeBRQ7_L??Q20k43 zEnz1~UzLsRFm=%ybNwhEIx(HZ$OAHSsaAp=KshmZ+xQW|oT3oW!ZduPrcgncp$|fY7dOr^{uZ5kj`0qqo4IBl zzGgE~+iG?+JE6sG+DtPaZPT@@WR=+&TdGWajQS0;3)*Js{l(K}R{))j7?M)cZx&FF zoT=SmcEdq(s4FoN?Pf0k*cC@CTTK2^ zqu;uit}z1uCRkuyL06b1fUq0yYGOM*`vkK$@2WV@EX8M*B)*_I-RxuHucnJbtTAej zq>C%f4-DRY8R8c6WwS5PZ;FWdnAr~?SmJ(jm)RdFN9;gg^7YdVrI))szBp3BYLAII@ln1M-VL_&ZUm~z>D}(gt{eXTXK!1?XOfP$%vEqpp-2goLwS1Bck74p<`PY(eElZ__3wj;!DcC zHLZ6<--@66TJ>$b*=dPsNcFK0v_9arGDkQm8w$6C+iol4Mcr2Jo#%MBm17o-FP2CO z=HWY4o@s-GXWIDkk`89L_zq&YAnyRf1$l{vi?T|384;Gb{feflq`ziuWx2@my=!e}{VpKd3%;^ZyU-8T??3 zZ(_LrpHAR^3IG2N|Ja7P@BAnLX5cvp{VyD^#61FQOXEYt<&RMr}6Nt1ae(YODFQx4W05u58iRS= zc4LfIPY{G6*0F6uM*~qc%!Ix49EsYdbK&itCeEJV{KB@R7mAlz>37?H*$9-+WchVGsgvW93D8=N(G5p*z!dHv$)aT;R1-O>Sx4iQ zOLAM_$<`FiX~CYirnZR%;B<&iLWhW7dVNq%4=>aC79}READEs9^Ot8CjcT$6iOA|aQ$@@ z^eG*Lmbx97<{gX2YppM#cz%c0dXBm%?0ZasBvQS)PNeH}z$ z)O!?Ae{5@I@Yq)Ue7M((Bca|*GEP}MTd$&RvHpo4)n{gV9nXICd z^H~ZlU|d)RO}A#i#{o+O1QDy{2`M6b`Vb+k$%7 zhOPonUVVOBX6LtMc78mw3R2&*ur@WI>0y#J8#a(d0PRKM&0AI?3%rk*$9tiPZja@| zVJsiCoTV&1L!0@T=jtr#g@Yzh^DoSO^>yOQ`M{U+{Am$Qy}{=BvpV^+*dKs&nbBFM z%V;~cgV3KKqO6w%`5=7T50M>z{${`+NJW8ECpMSc7@PS&Tpqyb()l!;E}c&2V-axa zbQ<0+olV0jF_||17N0(|h!u8a8Nc5AiYf@2(qVdn0yj_(((6Q^Unkos)WuGv?sggt zu+wRX-GvIEtbMqhNt5mD2vyj*G~ez{*V2f+C6EL-HUFtd($?%58ZC}rQLQv z+H3cxyX-vrl|6vY*aPWxdk|f)^XZ~JScL2$qMtngfR>)Da|K%HaLvFdN3|}B+bkq^ znN}N5lkZ=FG;alP5krf z_$#cAGl&~jo3m%}UVcM;{aB|0ST){jMxyv|qzwhdRhn+H{@P23j6EDJ{VLtUz46tK zCsYamfOiTf5scQ1cxf<&2&Ut4u6QuPfHgN_&5MWAO_N2;y1>L{5+n4KQ;$&;hSzIw zY|5Lw6d~n2oLV@&N_r#QBaCss9mX>Y8q7VyYeBgvvuXl3c$G-`tDr6VNZ<9`UC;}f zWkaj14aa=cZ1iXqnc;LFG^ZQkCZ8|nvtz!LW|8JOr*(FwBqTab%#HfeTYX&+Kz6fO zohIl>jLG^~w(ys-)aaLB*3e;f)8n3oNEy_=6 z2Hi&UL@E@#hiHXJr+S#1093;=cU&WtV8JmXjD9$%6x%X>oIN+}sm4kHyWFxcLbJ zS{7S=ySS>_SbDf2cJBp|_mlL8?ro@8`R^aSDYK9aT+nah?mZ3&$qTDxKmz()RLCLV z7_a$RPjl=oh;Hm1i>@%oetGH+a~uLT$N74+nB$7xoo0?J=EuqWc=Ni(B-CCyn0*d1 z*#%6{HgL_kz@lf=m^fa~MhG}8oZ^QbKWYcN(Wov-kRZ-=AY0N+Kug5d<+Zi-n}KR} zDMBE7>)}vOcq3!O@?{)xZ--^a1a&~k$%wGW{tjKn9uv5`S(N8MyAHc-UI{2A{&=86 zgD4+BIMsj=UcO-g=4X@GeTYLtJGh4x`u8wD4R>&&_v%FIH4s^8Rl`c?Ph==N7=Q%j z?`Ke0!|nI){qv=rr7HAYbh&2nfqmGA528)cW!9DbM^$HjDm!=wt7&@~RI@B(-5 zbD~eO0#?LAKP_^gd~-3w_yTI}5R_B~XbD1GIwn9%VOEc^ii2K40%+hQC*cM1D7U~| zje_5DB`mdUDL^6$sLmn4F5r1>)fN;kP*8#F4)+ZXZRFDOXL*mQJ8q5a+6$mWfd;gf!RwZ-P;@=r=zvNuR$#5)%(kEGI~VIAZea-B9?1|sQ|OU9 z9CXK@xo@qJxm|As0H4Nys@mKzMB{}6H*Fm-!f2a8TuR5_%H6wYi0kG!}O@1 z0AzZE9z%t>Roz54_rQLGit(#6=V#Z9Y| z)5VhjECpyDJq?V|-kDF)Nq)B{iB8co0Df@jG@W70(waak0ps3B&oTVxra*{ZaOg$) zt^0kw%*e?XQ1*uz zxI(A+qeFk9|3>97xVo;Sl9DT?aBF{`8~C4rS<4yy&@Emk`y_wBO`(xKcIXrO)NNfS zuMRX4FwVZ9zc9RR?`~G{1~1K4@hY8KMAAs#I`kd=&7HPh_AF_nzdLl1WvBehR&88Y z4@5~Ib_i6CkZ9F;+?sa^6V)Q5qQe5)KRzhJ0^V;4QikSpSR|p+g>oNXFLU|`CxKSS zO>ydms&y+@Rc|bqq=YR}9FZ!5?)U4lCx}PDLZ^$2eJ4K19D=v>Ip03!+qVIcgQ#bh zO$~^yNEZOdyjFLQ=jr2v!%y;hXqLKn0Xw0d?usCAqyj!)1rSR75zCTent zN2MPtsv1_+BY-MgAR&ONq0UffXcub%Y6hIOyoEE}2^-}Fx1d4ZDaC?)<>_4*7i_ps z0GHXr3QR?Olj=7CLe0-XdYHJ_38)6PeQ$T`CYcrq>B&YC<#OXiwdQiOg&AOau1(Ny zZGsGI6SP;GAh_DZPz95C@W9=~z|G4WA@VTG;nU^39y|?{DiL&^w8Dm69yUY%@~|%y zC=XkaP*Qo=A5!JvKnQPwR>;BKA4HnMqn+%r|&^wwfBGM}J{^cJQxf2GMHNK??z zrixKCP0XVb;ATw+PSy-jOEbkzOlplo7EDNzf!viRiYSr~_U|Zq4o>+%02+mO zvdOq8ZU^^RNLCTUKf)MO6T~j^XaUs+Oj(Rx2m+IM@pUUTgj?zQaA-@6ZivxMGh2xj zKy51>WJU>6N;~mzTUmYv-JU@|kJ7F|`BB>2N_U1sE|i8vTIg=5#DtLHeJ80Af}=PC zm1DNj!{HR(_@PH`<@@8e#;7?)(IP8@j$<>ES`p<_VcwOC(FxDWwhj~|K|MSY)qPGA z{U%2LRs;pjt>^*IH_=(`Il|=7DgVEHpVKjA(0||`F@#>>*fQup@sCGrs>dlR!tpuf zRwu#;k_Z~{8sdI4MsF8^7PfVPchNqBb!im&MGL(brT_7|CUTeU2dzlWPO2Yix6%hF zy9?Nt^kHX`K7wII=`$`Ic+~%2X3$qC8i>XEApc6=fWt!Hx6RSjH)D4YN5_0x zU{(Z93Y*1(p>R7Yl5>KFkrP1|e}u)0QOM@9s7QnS7Q}QjVI)UI7Z@o~k(HC0F0#4K zu%(GgYZ2YB%PcyOp zVm1zq?!bDWTvR}?r4fskIS4NmNu4g{f-VHbHAn`=WPBL_&R%?6rqyucUs0r0^bMz- zBqJvJH`DX_sW|?07EKO%(e-^W+FLV?(D$OyE6t>J>?PWA3bUPMvB6tq;Z?lMc2^ydg+>)D zjYs5q9wQm=Dym!Fes3zyhE8>lHOVnO*=ga5mx}MlX+yrcalYce#%%-L zv}QT57kesy=ChXXn3Uk^?8!Q_@BGVI?#5=B?)fY@{b+xjYvil5&r#3AXOBU%X9$^r z=`x0L;-Du&!0jpUH~H%P!QHR9pEk<@I@o826dE{90Bnm(eeFHZ3E0=;ZNIzVsC2aN zQ(Nm&a}hpYox?o$9{V0PVsJHMcXv$7e()u(+){B}BVypI^LPC(=d`n-*Mi}-<%n82ooc|c=$^E8n@l?CBEz8-hEUKm34>Q7mvz`a>!{n z?U(>$2aw_Z^etjX(dFa4$X!*YA$W0mio<3paR9Piu1t0xexEmgER1$QY5>$AK+2$S>|?Yk(10*^>E%> zfe>zLf%8A!;2vo~R+dKK{8(QkdQX+K+}JUswPd9XB0b)(aodEQ?wI3pSg#-98znqZ gh8JW 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 QlhH&EV`WBRgC2VO2`Qq8U*X(R*(DPn)x$L}; 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 m_ni#!roqEzd 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

U`sb{S^ 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%0AY(4P~u8sZr|NyephdmLO^|hA1BiC=?VdR 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

ej4m9I6#|Tp(4246P%x( zv2A|aT*ZJrcjv`sC>VSV>G!0tp zgBCMU)F2FyW4{9-$ zyoZaT?zjn)OJ=syp+|9&PN>@e97LH zz)`XSNGPTYFb0m4?ZW(@;RsXfq$;`xELhv`oAud$Thn!7Hpo zruOv70Q;bgzi!m(_}B6?nSGFmqSyQqW_s-sU}4=W0xp9C$^W!mH*`r@Dyt^X;`eb` z44%Whvu&H2crO&(%>j!v|uonZnT_gIVxJ(UZYaFDB=m>U{ONMM^X8bi8r{FFUCY6eYyvK7Au7VZHni#4GgY?^C?m+g4 z+kdhY$OlH2n*PpeS21iBDD!nBJEpDu@>O-ROeH`EHM%f;-lFxst7+dA!R25Qio z|IrIn!f9XqlSo2&hoAa#Q@g+Em5qRzOXQl0pJjwY0s9l3D4!3PNE;K5&G`1U= z`HIU#cZM5Nz6W@^E8*1h!GbG$swkRk*q!_Oo2J=4(HJ(|bHqd*`|-YYC1`6RHwRR4 zqxVI)J7ON6S+CP9r7H?Qyq;DAj*>ld6EqsJBF&M6uCX9Cj4P!WnH2wmAf$L#~sknBZpnrSrmd5F+{Tktq7J}(Xy$451tuZN_=0e z*rq@|&u+_XM3M?*@T4lmU#HRsxf8Wc^&E6~UvVN;q3k4#itBaNbg>0dtQD|SiRcf# zebq9+8W5IFO$7@B{(}iON)o|nw3LO80WZass%zfGnQiRYZ{J`8n!qPtZOeP`<{mx^ zSLTK)x2*0Cu5Q$Q#F--fwqx_j$ckM;ZV>Dvu;ynKbd^>g~u@*g`bbPTo4TVGaAFw z`s1Fjw

    i1q>&S2@plyo7Gpb_5Ab6 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 + - + @@ -43,7 +44,7 @@ - + @@ -100,7 +101,7 @@ - + @@ -241,8 +242,8 @@ !5000 2500|6500 2500!6500 2500|6500 5500!6500 5500|3500 5500!3500 5500|3500 4001"/> - + @@ -2038,6 +2039,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -3279,6 +3300,23 @@ + + + + + + + + + 055 Transparent gradient + + + + + + + + diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/ScaledRect.xml b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/ScaledRect.xml index 5a916f2a8..7d7f1664b 100644 --- a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/ScaledRect.xml +++ b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/ScaledRect.xml @@ -28,150 +28,156 @@ - - - - - - - - - - - - - - - - - + + + + + - - - - + + + + - - + + + + + + + + + + +!1250 500|1500 500"/> + + - +!750 500|750 0"/> + - - - - - - - - - - - - +!1000 500|1250 500"/> + + + + - +!2250 2000|2000 2000"/> + + + + + + + + + + + + + - - - + + +!2250 1250|2250 1500"/> + + + + + + + + + + + + + + - - - - - - - + +!500 1250|750 1250"/> - - - - - +!0 1500|0 1250!0 1250|0 1000"/> + + +!500 1500|500 1250"/> - - +!500 1250|0 1250"/> - +!1500 1500|1500 1250!1500 1250|1250 1250!1250 1250|1250 1500!750 1250|1000 1250!1000 1250|1250 1250!1250 1250|1250 1000!1250 1000|1000 1000!1000 1000|1000 1250"/> + + + + - +!750 2000|1000 2000!1000 2000|1250 2000"/> - - +!1750 2000|2000 2000!2250 2000|2500 2000!1500 2000|1750 2000"/> - - - +!1750 2000|1750 1500!1000 1500|1000 2000"/> diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Sprite1.xml b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Sprite1.xml index f332042fd..9fba238e8 100644 --- a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Sprite1.xml +++ b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/Sprite1.xml @@ -25,9 +25,9 @@ - - + + diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/TransparentGradient.xml b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/TransparentGradient.xml new file mode 100644 index 000000000..3d2f1f8fe --- /dev/null +++ b/libsrc/ffdec_lib/testdata/graphics/graphics/LIBRARY/TransparentGradient.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/META-INF/metadata.xml b/libsrc/ffdec_lib/testdata/graphics/graphics/META-INF/metadata.xml index a78f16d8c..ad7256a24 100644 --- a/libsrc/ffdec_lib/testdata/graphics/graphics/META-INF/metadata.xml +++ b/libsrc/ffdec_lib/testdata/graphics/graphics/META-INF/metadata.xml @@ -5,8 +5,8 @@ xmlns:xmp="http://ns.adobe.com/xap/1.0/"> Adobe Flash Professional CS6 - build 481 2021-03-14T08:29:20+01:00 - 2021-03-17T08:42:06+01:00 - 2021-03-17T08:42:06+01:00 + 2021-03-20T21:28:45+01:00 + 2021-03-20T21:28:45+01:00 @@ -15,7 +15,7 @@ - xmp.iid:B7397545F486EB11AFC39B563C137DD5 + xmp.iid:531E43DEBA89EB11A3D5CC1539172738 xmp.did:D6D3FE199784EB1187FEAE6972EC5115 xmp.did:D6D3FE199784EB1187FEAE6972EC5115 @@ -56,6 +56,18 @@ 2021-03-14T08:29:20+01:00 Adobe Flash Professional CS6 - build 481 + + created + xmp.iid:DBFF96EE0088EB11A3018A6846137125 + 2021-03-14T08:29:20+01:00 + Adobe Flash Professional CS6 - build 481 + + + created + xmp.iid:531E43DEBA89EB11A3D5CC1539172738 + 2021-03-14T08:29:20+01:00 + Adobe Flash Professional CS6 - build 481 + diff --git a/libsrc/ffdec_lib/testdata/graphics/graphics/bin/SymDepend.cache b/libsrc/ffdec_lib/testdata/graphics/graphics/bin/SymDepend.cache index 1078bbf6152958366f686846bc6dac4201284cc8..675687c2a2203a11b365c1def925a5022ed5b041 100644 GIT binary patch literal 385 zcmaKo!A`&I3DW>pBKpTx)|FY5eSo^s6!fgy7h@e9cUTpf^8 zZb!_DO45(YscA3RPvwWg1R@r)YE4|kTky|P2egH+Dqqys&1XKQ_xy?f?J) literal 358 zcma)%%?*M;5QSg#p!`HbY=GDSY6W=kriP^f#0e4+bh3y|*@E5JhXWFfH#V7MX7+pU z?Ir-;qalWHU`juinn{hZPC3p9+QNp3@_=HEiw!?3N!`kb3CRRIj`Da zn|9B12RrpvorQYUus?Ct_Mj~nu{~JONc>0$0q5wUI5d-9N{|6s@8;+yicqo p^xKN0BP79wileMGrhhX*4X7)pnmoj>r+mG~83^M@Sv}Yq`2aubN2UM( diff --git a/libsrc/gnujpdf/src/gnu/jpdf/PDFGraphics.java b/libsrc/gnujpdf/src/gnu/jpdf/PDFGraphics.java index f5aa7ad67..4aaf7eea4 100644 --- a/libsrc/gnujpdf/src/gnu/jpdf/PDFGraphics.java +++ b/libsrc/gnujpdf/src/gnu/jpdf/PDFGraphics.java @@ -1 +1 @@ -/* * $Id: PDFGraphics.java,v 1.6 2007/09/22 12:58:40 gil1 Exp $ * * $Date: 2007/09/22 12:58:40 $ * * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package gnu.jpdf; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Composite; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.Image; import java.awt.LinearGradientPaint; import java.awt.MultipleGradientPaint; import java.awt.Paint; import java.awt.Polygon; import java.awt.RadialGradientPaint; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.RenderingHints.Key; import java.awt.Shape; import java.awt.Stroke; import java.awt.TexturePaint; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.PathIterator; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ColorModel; import java.awt.image.ImageObserver; import java.awt.image.RenderedImage; import java.awt.image.WritableRaster; import java.awt.image.renderable.RenderableImage; import java.awt.print.PageFormat; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.io.Serializable; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; import java.util.logging.Level; import java.util.logging.Logger; /** * This class is our implementation of AWT's Graphics class. It provides a Java * standard way of rendering into a PDF Document's Page. * * @author Peter T Mount, http://www.retep.org.uk/pdf/ * @author Eric Z. Beard, ericzbeard@hotmail.com * @author Gilbert DeLeeuw, gil1@users.sourceforge.net * @version $Revision: 1.6 $, $Date: 2007/09/22 12:58:40 $ * @see gnu.jpdf.PDFGraphics */ public class PDFGraphics extends Graphics2D implements Serializable { /** * One degree in radians */ private static final double degrees_to_radians = Math.PI / 180.0; private static final int FILL = 1; private static final int STROKE = 2; private static final int CLIP = 3; private static final AffineTransform IDENTITY = new AffineTransform(); private static final Stroke DEF_STROKE = new BasicStroke(); /* * NOTE: The original class is the work of Peter T. Mount, who released it * in the uk.org.retep.pdf package. It was modified by Eric Z. Beard as * follows: * The package name was changed to gnu.pdf. * The formatting was changed a little bit. * This used to subclass an abstract class in a different package with * the same name (confusing). Now it's one concrete class. * drawImage() was implemented * It is still licensed under the LGPL. */ // Implementation notes: // // Pages 333-335 of the PDF Reference Manual // // Unless absolutely required, use the moveto, lineto and rectangle // operators to perform those actions. // They contain some extra optimizations // which will reduce the output size by up to half in some cases. // // About fill operators: For correct operation, any fill operation should // start with closeBlock(), which will ensure any previous path is completed, // otherwise you may find the fill will include previous items private static final DecimalFormat df = new DecimalFormat("#.###", new DecimalFormatSymbols(Locale.ENGLISH)); private static final DecimalFormat matDf = new DecimalFormat("0", new DecimalFormatSymbols(Locale.ENGLISH)); static { matDf.setMaximumFractionDigits(340); } //JPEXS: cache for already used images private static Map usedImages = new WeakHashMap(); private Color background; /** * This is true for any Graphics instance that didn't create the stream. * * @see #create */ private boolean child; private Area clip; private AffineTransform clipTransform; /** * This holds the current clipRectangle */ protected Rectangle clipRectangle; private Composite composite; private Graphics2D dg2 = new BufferedImage(2, 2, BufferedImage.TYPE_INT_RGB).createGraphics(); /** * This is the current font (in Java format) */ private Font font; /** * Part of the optimizer: When true, we are drawing a path. */ private boolean inStroke; /** * Part of the optimizer: When true, we are within a Text Block. */ private boolean inText; // true if within a Text Block - see newTextBlock() /** * The stroke line cap code; */ private int lineCap = 0; /** * The stroke line join code */ private int lineJoin = 0; /** * The stroke line width */ private float lineWidth = 1.0f; /** * Part of the optimizer: The last known moveto/lineto x coordinate * * @see #moveto * @see #lineto */ private float lx; // last known moveto/lineto coordinates /** * Part of the optimizer: The last known moveto/lineto y coordinate * * @see #moveto * @see #lineto */ private float ly; // last known moveto/lineto coordinates private float miterLimit = 10.0f; /** * Part of the optimizer: When true, the font has changed. */ private boolean newFont; // true if the font changes - see newTextBlock() /** * This is a reference to the PDFPage we are rendering to. */ private PDFPage page; /** * This is the current pen/fill color */ private Paint paint; private AffineTransform paintTransform; /** * This is the current font (in PDF format) */ private PDFFont pdffont; /** * Part of the optimizer: This is written to the stream when the newPath() * is called. np then clears this value. */ private String pre_np; // PDF space transform private AffineTransform pTransform; /** * This is the PrintWriter used to write PDF drawing commands to the Stream */ private RawPrintWriter pw; /** * RenderingHints */ private RenderingHints rhints = new RenderingHints(null); private Stroke stroke; // Start of Graphics2D properties private AffineTransform transform; /** * Part of the optimizer: The last x coordinate when rendering text */ private float tx; // the last coordinate for text rendering /** * Part of the optimizer: The last y coordinate when rendering text */ private float ty; // the last coordinate for text rendering private String shading = null; private String pattern = null; private Set usedAlphas = new HashSet<>(); private int currentAlpha = 255; private int shadingCount = 0; /** * @see Graphics2D#addRenderingHints(Map) */ @Override public void addRenderingHints(Map hints) { rhints.putAll(hints); } /** * This produces an arc by breaking it down into one or more Bezier curves. * It is used internally to implement the drawArc and fillArc methods. * * @param axc X coordinate of arc centre * @param ayc Y coordinate of arc centre * @param width of bounding rectangle * @param height of bounding rectangle * @param ang1 Start angle * @param ang2 End angle * @param clockwise true to draw clockwise, false anti-clockwise */ public void arc(double axc, double ayc, double width, double height, double ang1, double ang2, boolean clockwise) { double adiff; double x0, y0; double x3r, y3r; boolean first = true; // may not need this //if( ar < 0 ) { //ang1 += fixed_180; //ang2 += fixed_180; //ar = - ar; //} double ang1r = (ang1 % 360.0) * degrees_to_radians; double sin0 = Math.sin(ang1r); double cos0 = Math.cos(ang1r); x0 = axc + width * cos0; y0 = ayc + height * sin0; // NB: !clockwise here as Java Space is inverted to User Space if (!clockwise) { // Quadrant reduction while (ang1 < ang2) { ang2 -= 360.0; } while ((adiff = ang2 - ang1) < -90.0) { double w = sin0; sin0 = -cos0; cos0 = w; x3r = axc + width * cos0; y3r = ayc + height * sin0; arc_add(first, width, height, x0, y0, x3r, y3r, (x0 + width * cos0), (y0 + height * sin0) ); x0 = x3r; y0 = y3r; ang1 -= 90.0; first = false; } } else { // Quadrant reduction while (ang2 < ang1) { ang2 += 360.0; } while ((adiff = ang2 - ang1) > 90.0) { double w = cos0; cos0 = -sin0; sin0 = w; x3r = axc + width * cos0; y3r = ayc + height * sin0; arc_add(first, width, height, x0, y0, x3r, y3r, (x0 + width * cos0), (y0 + height * sin0) ); x0 = x3r; y0 = y3r; ang1 += 90.0; first = false; } } // Compute the intersection of the tangents. // We know that -fixed_90 <= adiff <= fixed_90. double trad = Math.tan(adiff * (degrees_to_radians / 2)); double ang2r = ang2 * degrees_to_radians; double xt = x0 - trad * width * sin0; double yt = y0 + trad * height * cos0; arc_add(first, width, height, x0, y0, (axc + width * Math.cos(ang2r)), (ayc + height * Math.sin(ang2r)), xt, yt); } /** * Used by the arc method to actually add an arc to the path Important: We * write directly to the stream here, because this method operates in User * space, rather than Java space. * * @param first true if the first arc * @param w width * @param h height * @param x0 coordinate * @param y0 coordinate * @param x3 coordinate * @param y3 coordinate * @param xt coordinate * @param yt coordinate */ private void arc_add(boolean first, double w, double h, double x0, double y0, double x3, double y3, double xt, double yt) { double dx = xt - x0, dy = yt - y0; double dist = dx * dx + dy * dy; double w2 = w * w, h2 = h * h; double r2 = w2 + h2; double fw = 0.0, fh = 0.0; if (dist < (r2 * 1.0e8)) { // JM fw = (w2 != 0.0) ? ((4.0 / 3.0) / (1 + Math.sqrt(1 + dist / w2))) : 0.0; fh = (h2 != 0.0) ? ((4.0 / 3.0) / (1 + Math.sqrt(1 + dist / h2))) : 0.0; } // The path must have a starting point if (first) { moveto(x0, y0); } double x = x0 + ((xt - x0) * fw); double y = y0 + ((yt - y0) * fh); x0 = x3 + ((xt - x3) * fw); y0 = y3 + ((yt - y3) * fh); // Finally the actual curve. curveto(x, y, x0, y0, x3, y3); } /** * This simply draws a White Rectangle to clear the area * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void clearRect(int x, int y, int w, int h) { closeBlock(); pw.print("q 1 1 1 RG ");// save state, set colour to White drawRect(x, y, w, h); closeBlock("B Q"); // close fill & stroke, then restore state } /** * @see Graphics2D#clip(Shape) */ @Override public void clip(Shape s) { if (s == null) { setClip(null); return; } Area newClip; if (clip == null) { newClip = new Area(s); } else { newClip = (Area) clip.clone(); newClip.intersect(new Area(s)); } setClip(newClip); } /** * This extra method allows PDF users to clip to a Polygon. * *

    * In theory you could use setClip(), except that java.awt.Graphics only * supports Rectangle with that method, so we will have an extra method. * * @param p Polygon to clip to */ public void clipPolygon(Polygon p) { closeBlock(); // finish off any existing path polygon(p.xpoints, p.ypoints, p.npoints); closeBlock("W"); // clip to current path clipRectangle = p.getBounds(); } /** * Clips to a set of coordinates * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void clipRect(int x, int y, int w, int h) { setClip(x, y, w, h); } /** * All functions should call this to close any existing optimized blocks. */ void closeBlock() { closeBlock("S"); } /** *

    * This is used by code that use the path in any way other than Stroke (like * Fill, close path & Stroke etc). Usually this is used internally.

    * * @param code PDF operators that will close the path */ void closeBlock(String code) { if (inText) { pw.println("ET Q"); // setOrientation(); // fixes Orientation matrix } if (inStroke) { pw.println(code); } inStroke = inText = false; } /** * This is unsupported - how do you do this with Vector graphics? * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param dx coordinate * @param dy coordinate */ @Override public void copyArea(int x, int y, int w, int h, int dx, int dy) { // Hmm... Probably need to keep track of everything // that has been drawn so far to get the contents of an area } //============ Line operations ======================= /** *

    * This returns a child instance of this Graphics object. As with AWT, the * affects of using the parent instance while the child exists, is not * determined.

    * *

    * Once complete, the child should be released with it's dispose() method * which will restore the graphics state to it's parent.

    * * @return Graphics object to render onto the page */ @Override public Graphics create() { closeBlock(); PDFGraphics g = createGraphic(page, pw); // The new instance inherits a few items g.clipRectangle = new Rectangle(clipRectangle); return (Graphics) g; } // end create() /** * This method creates a new instance of the class based on the page and a * print writer. * * @param page the page to attach to * @param pw the PrintWriter to attach to. */ protected PDFGraphics createGraphic(PDFPage page, RawPrintWriter pw) { PDFGraphics g = new PDFGraphics(); g.init(page, pw); return g; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x2,y2) using the current point and (x1,y1) as the * Bezier control points. *

    * The new current point is (x2,y2) * * @param x1 Second control point * @param y1 Second control point * @param x2 Destination point * @param y2 Destination point */ public void curveto(double x1, double y1, double x2, double y2) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + "v"); lx = (float) x2; ly = (float) y2; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x3,y3) using (x1,y1) and (x2,y2) as the Bezier * control points. *

    * The new current point is (x3,y3) * * @param x1 First control point * @param y1 First control point * @param x2 Second control point * @param y2 Second control point * @param x3 Destination point * @param y3 Destination point */ public void curveto(double x1, double y1, double x2, double y2, double x3, double y3) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + cxy(x3, y3) + "c"); lx = (float) x3; ly = (float) y3; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x2,y2) using the current point and (x1,y1) as the * Bezier control points. *

    * The new current point is (x2,y2) * * @param x1 Second control point * @param y1 Second control point * @param x2 Destination point * @param y2 Destination point */ public void curveto(int x1, int y1, int x2, int y2) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + "v"); lx = x2; ly = y2; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x3,y3) using (x1,y1) and (x2,y2) as the Bezier * control points. *

    * The new current point is (x3,y3) * * @param x1 First control point * @param y1 First control point * @param x2 Second control point * @param y2 Second control point * @param x3 Destination point * @param y3 Destination point */ public void curveto(int x1, int y1, int x2, int y2, int x3, int y3) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + cxy(x3, y3) + "c"); lx = x3; ly = y3; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x2,y2) using (x1,y1) and the end point as the * Bezier control points. *

    * The new current point is (x2,y2) * * @param x1 Second control point * @param y1 Second control point * @param x2 Destination point * @param y2 Destination point */ public void curveto2(double x1, double y1, double x2, double y2) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + "y"); lx = (float) x2; ly = (float) y2; } // Arcs are horrible and complex. They are at the end of the // file, because they are the largest. This is because, unlike // Postscript, PDF doesn't have any arc operators, so we must // implement them by converting into one or more Bezier curves // (which is how Postscript does them internally). /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x2,y2) using (x1,y1) and the end point as the * Bezier control points. *

    * The new current point is (x2,y2) * * @param x1 Second control point * @param y1 Second control point * @param x2 Destination point * @param y2 Destination point */ public void curveto2(int x1, int y1, int x2, int y2) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + "y"); lx = x2; ly = y2; } /** * Converts the Java space dimension into pdf. * * @param w width * @param h height * @return String containing the coordinates in PDF space */ private String cwh(double w, double h) { return "" + df.format(w) + " " + df.format(h) + " "; } /** * Converts the Java space dimension into pdf. * * @param w width * @param h height * @return String containing the coordinates in PDF space */ private String cwh(int w, int h) { return cwh((double) w, (double) h); } /** * Converts the Java space coordinates into pdf. * * @param x coordinate * @param y coordinate * @return String containing the coordinates in PDF space */ private String cxy(double x, double y) { return "" + df.format(x) + " " + df.format(y) + " "; } /** * Converts the Java space coordinates into pdf. * * @param x coordinate * @param y coordinate * @return String containing the coordinates in PDF space */ private String cxy(int x, int y) { return cxy((double) x, (double) y); } /** *

    * This releases any resources used by this Graphics object. You must use * this method once finished with it. Leaving it open will leave the PDF * stream in an inconsistent state, and will produce errors.

    * *

    * If this was created with Graphics.create() then the parent instance can * be used again. If not, then this closes the graphics operations for this * page when used with PDFJob.

    * *

    * When using PDFPage, you can create another fresh Graphics instance, which * will draw over this one.

    * */ @Override public void dispose() { closeBlock(); if (clip != null) { restoreState(); } if (child) { pw.println("Q"); // restore graphics context } else { pw.close(); // close the stream if were the parent } } // ********************************************* // **** Implementation of java.awt.Graphics **** // ********************************************* //============ Rectangle operations ======================= /** * @see Graphics2D#draw(Shape) */ @Override public void draw(Shape s) { followPath(s, STROKE); } /** *

    * Not implemented

    * *

    * Draws a 3-D highlighted outline of the specified rectangle. The edges of * the rectangle are highlighted so that they appear to be beveled and lit * from the upper left corner. The colors used for the highlighting effect * are determined based on the current color. The resulting rectangle covers * an area that is width + 1 pixels wide by height + 1 pixels tall. *

    * * @param x an int value * @param y an int value * @param width an int value * @param height an int value * @param raised a boolean value */ @Override public void draw3DRect(int x, int y, int width, int height, boolean raised) { // Not implemented } /** * Draws an arc * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param sa Start angle * @param aa End angle */ @Override public void drawArc(int x, int y, int w, int h, int sa, int aa) { w = w >> 1; h = h >> 1; x += w; y += h; arc((double) x, (double) y, (double) w, (double) h, (double) -sa, (double) (-sa - aa), false); } /** *

    * Not implemented

    * * @param data a byte[] value * @param offset an int value * @param length an int value * @param x an int value * @param y an int value */ @Override public void drawBytes(byte[] data, int offset, int length, int x, int y) { } //============ Optimizers ======================= /** * @see Graphics2D#drawGlyphVector(GlyphVector, float, float) */ @Override public void drawGlyphVector(GlyphVector g, float x, float y) { Shape s = g.getOutline(x, y); fill(s); } /** * @see Graphics2D#drawImage(BufferedImage, BufferedImageOp, int, int) */ @Override public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) { BufferedImage result = img; if (op != null) { result = op.createCompatibleDestImage(img, img.getColorModel()); result = op.filter(img, result); } drawImage(result, x, y, null); } /** * @see Graphics2D#drawImage(Image, AffineTransform, ImageObserver) */ @Override public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) { // return drawImage(img, null, xform, null, obs); return true; } /** *

    * Draw's an image onto the page, with a backing colour.

    * * @param img The java.awt.Image * @param x coordinate on page * @param y coordinate on page * @param bgcolor Background colour * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver obs) { return drawImage(img, x, y, img.getWidth(obs), img.getHeight(obs), bgcolor, obs); } /** * Draw's an image onto the page * * @param img The java.awt.Image * @param x coordinate on page * @param y coordinate on page * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int x, int y, ImageObserver obs) { return drawImage(img, x, y, img.getWidth(obs), img.getHeight(obs), obs); } /** *

    * Draw's an image onto the page, with a backing colour.

    * * @param img The java.awt.Image * @param x coordinate on page * @param y coordinate on page * @param w Width on page * @param h height on page * @param bgcolor Background colour * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int x, int y, int w, int h, Color bgcolor, ImageObserver obs) { closeBlock(); pw.print("q "); // save state Color c = getColor(); // save current colour setColor(bgcolor); // change the colour drawRect(x, y, w, h); closeBlock("B Q"); // fill stroke, restore state paint = c; // restore original colour return drawImage(img, x, y, img.getWidth(obs), img.getHeight(obs), obs); } /** *

    * Draws an image onto the page.

    * *

    * This method is implemented with ASCIIbase85 encoding and the zip stream * deflater. It results in a stream that is anywhere from 3 to 10 times as * big as the image. This obviously needs some improvement, but it works * well for small images

    * * @param img The java.awt.Image * @param x coordinate on page * @param y coordinate on page * @param w Width on page * @param h height on page * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int x, int y, int w, int h, ImageObserver obs) { closeBlock(); PDFImage image; if (usedImages.containsKey(img)) { image = usedImages.get(img); } else { PDFMask mask = new PDFMask(img); page.getPDFDocument().add(mask); image = new PDFImage(img, x, y, w, h, obs, "" + mask.getSerialID() + " 0 R"); // The image needs to be registered in several places page.getPDFDocument().setImageName(image); page.getPDFDocument().add(image); usedImages.put(img, image); } page.addToProcset("/ImageC"); page.addImageResource(image.getName() + " " + image.getSerialID() + " 0 R"); // JM /*page.addResource("/XObject << " + image.getName() + " " + image.getSerialID() + " 0 R >>");*/ // q w 0 0 h x y cm % the coordinate matrix AffineTransform newTransform = new AffineTransform(w, 0, 0, -h, x, y + h); AffineTransform transformToSet = newTransform; pw.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); return false; } /** * Draw's an image onto the page, with scaling *

    * This is not yet supported. * * @param img The java.awt.Image * @param dx1 coordinate on page * @param dy1 coordinate on page * @param dx2 coordinate on page * @param dy2 coordinate on page * @param sx1 coordinate on image * @param sy1 coordinate on image * @param sx2 coordinate on image * @param sy2 coordinate on image * @param bgcolor Background colour * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver obs) { return false; } //============ Clipping operations ======================= /** * Draw's an image onto the page, with scaling *

    * This is not yet supported. * * @param img The java.awt.Image * @param dx1 coordinate on page * @param dy1 coordinate on page * @param dx2 coordinate on page * @param dy2 coordinate on page * @param sx1 coordinate on image * @param sy1 coordinate on image * @param sx2 coordinate on image * @param sy2 coordinate on image * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver obs) { // This shouldn't be too bad, just change the coordinate matrix return false; } /** * Draws a line between two coordinates. * * If the first coordinate is the same as the last one drawn (i.e. a * previous drawLine, moveto, etc) it is ignored. * * @param x1 coordinate * @param y1 coordinate * @param x2 coordinate * @param y2 coordinate */ @Override public void drawLine(int x1, int y1, int x2, int y2) { moveto(x1, y1); lineto(x2, y2); } //============ Arcs operations ============================== // These are the standard Graphics operators. They use the // arc extension operators to achieve the affect. /** *

    * Draws an oval

    * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void drawOval(int x, int y, int w, int h) { drawArc(x, y, w, h, 0, 360); } /** * Draws a polygon, linking the first and last coordinates. * * @param xp Array of x coordinates * @param yp Array of y coordinates * @param np number of points in polygon */ @Override public void drawPolygon(int[] xp, int[] yp, int np) { polygon(xp, yp, np); closeBlock("s"); // close path and stroke } /** * Draws a polyline. The first and last coordinates are not linked. * * @param xp Array of x coordinates * @param yp Array of y coordinates * @param np number of points in polyline */ @Override public void drawPolyline(int[] xp, int[] yp, int np) { polygon(xp, yp, np); // no stroke, as we keep the optimizer in stroke state } /** * We override Graphics.drawRect as it doesn't join the 4 lines. Also, PDF * provides us with a Rectangle operator, so we will use that. * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void drawRect(int x, int y, int w, int h) { draw(new Rectangle(x, y, w, h)); /*newPath(); pw.print(cxy(x, y) + cwh(w, h) + "re "); // rectangle lx = x; // I don't know if this is correct, but lets see if PDF ends ly = y; // the rectangle at it's start. // stroke (optimized)*/ } /** * @see Graphics2D#drawRenderableImage(RenderableImage, AffineTransform) */ @Override public void drawRenderableImage(RenderableImage img, AffineTransform xform) { drawRenderedImage(img.createDefaultRendering(), xform); } /** * @see Graphics2D#drawRenderedImage(RenderedImage, AffineTransform) */ @Override public void drawRenderedImage(RenderedImage img, AffineTransform xform) { BufferedImage image = null; if (img instanceof BufferedImage) { image = (BufferedImage) img; } else { ColorModel cm = img.getColorModel(); int width = img.getWidth(); int height = img.getHeight(); WritableRaster raster = cm.createCompatibleWritableRaster(width, height); boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); Hashtable properties = new Hashtable(); String[] keys = img.getPropertyNames(); if (keys != null) { for (int i = 0; i < keys.length; i++) { properties.put(keys[i], img.getProperty(keys[i])); } } BufferedImage result = new BufferedImage(cm, raster, isAlphaPremultiplied, properties); img.copyData(raster); image = result; } drawImage(image, xform, null); } /** * This is not yet implemented * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param aw a-width * @param ah a-height */ @Override public void drawRoundRect(int x, int y, int w, int h, int aw, int ah) { } //============ Oval operations ======================= /** * Draws a string using a AttributedCharacterIterator. *

    * This is not supported yet, as I have no idea what an * AttributedCharacterIterator is. *

    * This method is new to the Java2 API. */ @Override public void drawString(java.text.AttributedCharacterIterator aci, float x, float y) { } /** * Draws a string using a AttributedCharacterIterator. *

    * This is not supported yet, as I have no idea what an * AttributedCharacterIterator is. *

    * This method is new to the Java2 API. */ @Override public void drawString(java.text.AttributedCharacterIterator aci, int x, int y) { } public void drawStringWithMode(String s, float x, float y, int mode) { newTextBlock(x, y); if (mode > -1) { pw.println("" + mode + " Tr"); } if (pdffont instanceof PDFEmbeddedFont) { pw.print("[("); pw.printRaw(PDFStringHelper.makeRawPDFString(s)); pw.println(")] TJ"); } else { pw.print(PDFStringHelper.makePDFString(s)); pw.println(" Tj"); } closeBlock(); } @Override public void drawString(String s, float x, float y) { drawStringWithMode(s, x, y, -1); } /** * This draws a string. * * @param s * @oaran s String to draw * @param x coordinate * @param y coordinate */ @Override public void drawString(String s, int x, int y) { drawString(s, (float) x, (float) y); } public void drawTransparentString(String s, float x, float y) { drawStringWithMode(s, x, y, 3); } /** * This draws a transparent string. * * @oaran s String to draw * @param x coordinate * @param y coordinate */ public void drawTransparentString(String s, int x, int y) { drawTransparentString(s, (float) x, (float) y); } /** * @see Graphics2D#fill(Shape) */ @Override public void fill(Shape s) { followPath(s, FILL); } /** *

    * Not implemented

    * * @param x an int value * @param y an int value * @param width an int value * @param height an int value * @param raised a boolean value */ @Override public void fill3DRect(int x, int y, int width, int height, boolean raised) { // Not implemented } /** * Fills an arc, joining the start and end coordinates * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param sa Start angle * @param aa End angle */ @Override public void fillArc(int x, int y, int w, int h, int sa, int aa) { // here we fool the optimizer. We force any open path to be closed, // then draw the arc. Finally, as the optimizer hasn't stroke'd the // path, we close and fill it, and mark the Stroke as closed. // // Note: The lineto to the centre of the object is required, because // the fill only fills the arc. Skipping this includes an extra // chord, which isn't correct. Peter May 31 2000 closeBlock(); patternFill(); drawArc(x, y, w, h, sa, aa); lineto(x + (w >> 1), y + (h >> 1)); if (shadingFill()) { return; } closeBlock("b"); // closepath and fill } //============ Extension operations ============================== // These are extensions, and provide access to PDF Specific // operators. /** *

    * Draws a filled oval

    * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void fillOval(int x, int y, int w, int h) { fillArc(x, y, w, h, 0, 360); } //============ Polygon operations ======================= /** * Fills a polygon. * * @param xp Array of x coordinates * @param yp Array of y coordinates * @param np number of points in polygon */ @Override public void fillPolygon(int[] xp, int[] yp, int np) { closeBlock(); // finish off any previous paths patternFill(); polygon(xp, yp, np); if (shadingFill()) { return; } closeBlock("b"); // closepath, fill and stroke } //============ Image operations ======================= /** * Fills a rectangle with the current colour * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void fillRect(int x, int y, int w, int h) { fill(new Rectangle(x, y, w, h)); /* // end any path & stroke. This ensures the fill is on this // rectangle, and not on any previous graphics closeBlock(); patternFill(); drawRect(x, y, w, h); if (shadingFill()) { return; } closeBlock("B"); // rectangle, fill stroke*/ } private void patternFill() { if (pattern != null) { if (paint instanceof TexturePaint) { if (pattern.equals("texture") || !paintTransform.equals(transform)) { initTexturePaint((TexturePaint) paint); paintTransform = transform; } } if (paint instanceof MultipleGradientPaint) { if (pattern.equals("gradient") || !paintTransform.equals(transform)) { initGradientPaint((MultipleGradientPaint) paint); paintTransform = transform; } } pw.println("/Pattern cs"); pw.println(pattern + " scn"); } } private boolean shadingFill() { if (pattern == null && shading != null) { saveState(); pw.println("W n"); if (paint instanceof MultipleGradientPaint) { if (shading.equals("gradient") || !paintTransform.equals(transform)) { initGradientPaint((MultipleGradientPaint) paint); paintTransform = transform; } } pw.println(shading + " sh"); restoreState(); return true; } return false; } //============ Round Rectangle operations ======================= /** * This is not yet implemented * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param aw a-width * @param ah a-height */ @Override public void fillRoundRect(int x, int y, int w, int h, int aw, int ah) { } /////////////////////////////////////////////// // // // implementation specific methods // // private void followPath(Shape s, int drawType) { PathIterator points; if (s == null) { return; } if (drawType == FILL) { patternFill(); } if (drawType == STROKE) { if (!(stroke instanceof BasicStroke)) { s = stroke.createStrokedShape(s); followPath(s, FILL); return; } } // if (drawType==STROKE) { // setStrokeDiff(stroke, oldStroke); // oldStroke = stroke; // setStrokePaint(); // } // else if (drawType==FILL) // setFillPaint(); points = s.getPathIterator(IDENTITY); int segments = 0; float[] coords = new float[6]; while (!points.isDone()) { segments++; int segtype = points.currentSegment(coords); switch (segtype) { case PathIterator.SEG_CLOSE: pw.print("h "); break; case PathIterator.SEG_CUBICTO: curveto(coords[0], coords[1], coords[2], coords[3], coords[4], coords[5]); break; case PathIterator.SEG_LINETO: lineto(coords[0], coords[1]); break; case PathIterator.SEG_MOVETO: moveto(coords[0], coords[1]); break; case PathIterator.SEG_QUADTO: curveto(coords[0], coords[1], coords[2], coords[3]); break; } points.next(); } switch (drawType) { case FILL: if (segments > 0) { if (pattern == null && shading != null) { saveState(); if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD) { closeBlock("W*"); } else { closeBlock("W"); } pw.println("n"); if (paint instanceof MultipleGradientPaint) { if (shading.equals("gradient") || !paintTransform.equals(transform)) { initGradientPaint((MultipleGradientPaint) paint); paintTransform = transform; } } pw.println(shading + " sh"); restoreState(); return; } if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD) { closeBlock("f*"); } else { closeBlock("f"); } } break; case STROKE: if (segments > 0) { closeBlock("S"); } break; case CLIP: default: //drawType==CLIP if (segments == 0) { drawRect(0, 0, 0, 0); } if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD) { closeBlock("W*"); } else { closeBlock("W"); } } } /** * @see Graphics2D#getBackground() */ @Override public Color getBackground() { return background; } /** * Returns the Shape of the clipping region As my JDK docs say, this may * break with Java 2D. * * @return Shape of the clipping region */ @Override public Shape getClip() { return null; } /** * Returns the Rectangle that fits the current clipping region * * @return the Rectangle that fits the current clipping region */ @Override public Rectangle getClipBounds() { return clipRectangle; } //============ Color operations ======================= /** * Returns the current pen Colour * * @return the current pen Colour */ @Override public Color getColor() { return (paint instanceof Color) ? (Color) paint : Color.black; } /** * @see Graphics2D#getComposite() */ @Override public Composite getComposite() { return composite; } /** * @see Graphics2D#getDeviceConfiguration() */ @Override public GraphicsConfiguration getDeviceConfiguration() { return dg2.getDeviceConfiguration(); } /** * Return's the current font. * * @return the current font. */ @Override public Font getFont() { if (font == null) { setFont(new Font("SansSerif", Font.PLAIN, 12)); } return font; } /** * Returns the FontMetrics for a font. *

    * This doesn't work correctly. Perhaps having some way of mapping the base * 14 fonts to our own FontMetrics implementation? * * @param font The java.awt.Font to return the metrics for * @return FontMetrics for a font */ @Override public FontMetrics getFontMetrics(Font font) { Frame dummy = new Frame(); dummy.addNotify(); Image image = dummy.createImage(100, 100); if (image == null) { System.err.println("getFontMetrics: image is null"); } Graphics graphics = image.getGraphics(); return graphics.getFontMetrics(font); } /** * @see Graphics2D#getFontRenderContext() */ @Override public FontRenderContext getFontRenderContext() { boolean antialias = RenderingHints.VALUE_TEXT_ANTIALIAS_ON.equals(getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING)); boolean fractions = RenderingHints.VALUE_FRACTIONALMETRICS_ON.equals(getRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS)); return new FontRenderContext(new AffineTransform(), antialias, fractions); } /** * Returns the associated PDFPage for this graphic * * @return the associated PDFPage for this graphic */ public PDFPage getPage() { return page; } /** * Returns the current pen Colour * * @return the current pen Colour */ @Override public Paint getPaint() { return paint; } /** * @param arg0 a key * @return the rendering hint */ @Override public Object getRenderingHint(Key arg0) { return rhints.get(arg0); } /** * @see Graphics2D#getRenderingHints() */ @Override public RenderingHints getRenderingHints() { return rhints; } /** * @see Graphics2D#getStroke() */ @Override public Stroke getStroke() { return stroke; } /** * @see Graphics2D#getTransform() */ @Override public AffineTransform getTransform() { return new AffineTransform(transform); } /** * Returns the PrintWriter handling the underlying stream * * @return the PrintWriter handling the underlying stream */ public RawPrintWriter getWriter() { return pw; } /** * @see Graphics2D#hit(Rectangle, Shape, boolean) */ @Override public boolean hit(Rectangle rect, Shape s, boolean onStroke) { if (onStroke) { s = stroke.createStrokedShape(s); } Area area = new Area(s); if (clip != null) { area.intersect(clip); } return area.intersects(rect.x, rect.y, rect.width, rect.height); } /** * This initialises the stream by saving the current graphics state, and * setting up the default line width (for us). * * It also sets up the instance ready for graphic operations and any * optimisations. * *

    * For child instances, the stream is already open, so this should keep * things happy. */ private void init() { PageFormat pf = page.getPageFormat(); // save graphics state (restored by dispose) if (child) { pw.print("q "); } // now initialise the instance //setColor(Color.black); paint = Color.black; // possible: if parent.color is not black, then force black? // must check to see what AWT does? // Original User Space Transform (identity) // Transform from Java Space to PDF Space pTransform = new AffineTransform(); pTransform.translate(0, pf.getHeight()); pTransform.scale(1d, -1d); // Combined Transform User->Java->PDF setNewTranform(new AffineTransform()); // Set the line width setStroke(DEF_STROKE); } /** * This is called by PDFPage when creating a Graphcis instance. * * @param page The PDFPage to draw onto. */ protected void init(PDFPage page) { this.page = page; // We are the parent instance child = false; // Now create a stream to store the graphics in PDFStream stream = new PDFStream(); // To view detail in uncompressed format comment out the next line stream.setDeflate(true); page.getPDFDocument().add(stream); page.add(stream); pw = new RawPrintWriter(stream.getOutputStream()); // initially, we are limited to the page size clipRectangle = page.getImageableArea(); // finally initialise the stream init(); } /** * This method is used internally by create() and by the PDFJob class * * @param page PDFPage to draw into * @param pw PrintWriter to use */ protected void init(PDFPage page, RawPrintWriter pw) { this.page = page; this.pw = pw; // In this case, we didn't create the stream (our parent did) // so child is true (see dispose) child = true; // finally initialise the stream init(); } /** * This adds a line segment to the current path * * @param x coordinate * @param y coordinate */ public void lineto(double x, double y) { newPath(); // no optimisation here as it may introduce errors on decimal coordinates. pw.print(cxy(x, y) + "l "); lx = (float) x; ly = (float) y; } /** * This adds a line segment to the current path * * @param x coordinate * @param y coordinate */ public void lineto(int x, int y) { newPath(); if (lx != x && ly != y) { pw.print(cxy(x, y) + "l "); } lx = x; ly = y; } /** * This moves the current drawing point. * * @param x coordinate * @param y coordinate */ public void moveto(double x, double y) { newPath(); // no optimisation here as it may introduce errors on decimal coordinates. pw.print(cxy(x, y) + "m "); lx = (float) x; ly = (float) y; } /** * This moves the current drawing point. * * @param x coordinate * @param y coordinate */ public void moveto(int x, int y) { newPath(); if (lx != x || ly != y) { pw.print(cxy(x, y) + "m "); } lx = x; ly = y; } /** * Functions that draw lines should start by calling this. It starts a new * path unless inStroke is set, in that case it uses the existing path */ void newPath() { if (inText) { closeBlock(); } if (!inStroke) { if (pre_np != null) { pw.print(pre_np); // this is the prefix set by setOrientation() pre_np = null; } pw.print("n "); } inText = false; inStroke = true; // an unlikely coordinate to fool the moveto() optimizer lx = ly = -9999; } /** *

    * Functions that draw text should start by calling this. It starts a text * block (accounting for media orientation) unless we are already in a Text * block.

    * *

    * It also handles if the font has been changed since the current text block * was started, so your function will be current.

    * * @param x x coordinate in java space * @param y y coordinate in java space */ void newTextBlock(float x, float y) { // close the current path if there is one if (inStroke) { closeBlock(); } // create the text block if one is not current. If we are, the newFont // condition at the end catches font changes if (!inText) { // This ensures that there is a font available getFont(); pw.print("q BT "); tx = ty = 0; AffineTransform tm = new AffineTransform(pTransform); pw.println("" + df.format(tm.getScaleX()) + " " + "" + df.format(tm.getShearY()) + " " + "" + df.format(tm.getShearX()) + " " + "" + df.format(tm.getScaleY()) + " " + "" + df.format(tm.getTranslateX()) + " " + "" + df.format(tm.getTranslateY()) + " Tm" ); // produce the text matrix for the media // switch(mediaRot) { // case PageFormat.PORTRAIT: // Portrait // //pw.println("1 0 0 1 0 0 Tm"); // break; // // case PageFormat.LANDSCAPE: // Landscape // pw.println("0 1 -1 0 0 0 Tm"); // rotate // break; // // case 180: // Inverted Portrait // pw.println("1 0 0 -1 0 0 Tm"); // break; // // case PageFormat.REVERSE_LANDSCAPE: // Seascape // pw.println("0 -1 1 0 0 0 Tm"); // rotate // break; // } // move the text cursor by an absolute amount pw.print(txy(x, y) + "Td "); } else { // move the text cursor by a relative amount pw.print(twh(x, y, tx, ty) + "Td "); //pw.print(txy(x,y)+"Td "); } // preserve the coordinates for the next time tx = x; ty = y; if (newFont || !inText) { pw.print(pdffont.getName() + " " + font.getSize() + " Tf "); } // later add colour changes here (if required) inStroke = newFont = false; inText = true; } /** * This is used to add a polygon to the current path. Used by drawPolygon(), * drawPolyline() and fillPolygon() etal * * @param xp Array of x coordinates * @param yp Array of y coordinates * @param np number of points in polygon * @see #drawPolygon * @see #drawPolyline * @see #fillPolygon */ public void polygon(int[] xp, int[] yp, int np) { // newPath() not needed here as moveto does it ;-) moveto(xp[0], yp[0]); for (int i = 1; i < np; i++) { lineto(xp[i], yp[i]); } } /** * @see Graphics2D#rotate(double) */ @Override public void rotate(double theta) { AffineTransform newTransform = new AffineTransform(transform); newTransform.rotate(theta); setNewTranform(newTransform); } /** * @see Graphics2D#rotate(double, double, double) */ @Override public void rotate(double theta, double x, double y) { AffineTransform newTransform = new AffineTransform(transform); newTransform.rotate(theta, x, y); setNewTranform(newTransform); } /** * @see Graphics2D#scale(double, double) */ @Override public void scale(double sx, double sy) { AffineTransform newTransform = new AffineTransform(transform); newTransform.scale(sx, sy); setNewTranform(newTransform); } /** * @see Graphics2D#setBackground(Color) */ @Override public void setBackground(Color color) { background = color; } /** * Clips to a set of coordinates * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void setClip(int x, int y, int w, int h) { /*clipRectangle = new Rectangle(x, y, w, h); closeBlock(); // finish off any existing paths drawRect(x, y, w, h); closeBlock("W n"); // clip to current path*/ setClip(new Rectangle(x, y, w, h)); } /** * As my JDK docs say, this may break with Java 2D. *

    * Sets the clipping region to that of a Shape. * * @param s Shape to clip to. */ @Override public void setClip(Shape s) { closeBlock(); if (clip != null) { restoreState(); transform = clipTransform; } if (s == null) { clip = null; return; } clipTransform = transform; clip = new Area(s); clipRectangle = s.getBounds(); saveState(); followPath(s, CLIP); pw.println("n"); //setClip(r.x, r.y, r.width, r.height); } /** * Sets the color for drawing * * @param c Color to use */ @Override public void setColor(Color c) { setPaint(c); } /** * @see Graphics2D#setComposite(Composite) */ @Override public void setComposite(Composite comp) { this.composite = comp; } /** * This extension sets the line width to the default of 1mm which is what * Java uses when drawing to a PrintJob. */ public void setDefaultLineWidth() { closeBlock(); // draw any path before we change the line width pw.println("1 w"); } /** * This sets the font. * * @param f java.awt.Font to set to. */ @Override public void setFont(Font f) { // optimize: Save some space if the font is already the current one. if (font != f) { font = f; pdffont = page.getFont("/Type1", f.getName(), f.getStyle()); // mark the font as changed newFont = true; } } public void setExistingTtfFont(Font f) { if (font != f) { font = f; pdffont = page.getFont("/TrueType", f.getName(), f.getStyle()); // mark the font as changed newFont = true; } } public void setTtfFont(Font f, File file) throws IOException { if (font != f) { font = f; pdffont = page.getEmbeddedFont(f.getName(), f.getStyle(), file); // mark the font as changed newFont = true; } } private void setLineCap(int cap) { int lineCap = 0; switch (cap) { case BasicStroke.JOIN_MITER: lineCap = 0; break; case BasicStroke.JOIN_ROUND: lineCap = 1; break; case BasicStroke.JOIN_BEVEL: lineCap = 2; break; } if (this.lineCap != lineCap) { closeBlock(); // draw any path before we change the line width this.lineCap = lineCap; pw.println("" + lineCap + " J"); } } private void setLineJoin(int join) { int lineJoin = 0; switch (join) { case BasicStroke.JOIN_MITER: lineJoin = 0; break; case BasicStroke.JOIN_ROUND: lineJoin = 1; break; case BasicStroke.JOIN_BEVEL: lineJoin = 2; break; } if (this.lineJoin != lineJoin) { closeBlock(); // draw any path before we change the line width this.lineJoin = lineJoin; pw.println("" + lineJoin + " j"); } } /** * This extension allows the width of the drawn line to be set * * @param width Line width in pdf graphic units (points) */ public void setLineWidth(float width) { if (width != this.lineWidth) { closeBlock(); // draw any path before we change the line width this.lineWidth = width; pw.println("" + width + " w"); } } private void setMiterLimit(float limit) { if (limit != this.miterLimit) { closeBlock(); // draw any path before we change the line width this.miterLimit = limit; pw.println("" + limit + " M"); } } /** * Sets the paint for drawing * * @param paint Paint to use */ @Override public void setPaint(Paint paint) { this.paint = paint; this.shading = null; this.pattern = null; this.paintTransform = null; if (paint instanceof Color) { Color c = (Color) paint; double r = ((double) c.getRed()) / 255.0; double g = ((double) c.getGreen()) / 255.0; double b = ((double) c.getBlue()) / 255.0; closeBlock(); // This ensures any paths are drawn in the previous if (currentAlpha != c.getAlpha()) { String gsId = "/GSAlpha" + c.getAlpha(); currentAlpha = c.getAlpha(); if (!usedAlphas.contains(c.getAlpha())) { page.addExtGStateResource(gsId + " <>"); usedAlphas.add(currentAlpha); } pw.println(gsId + " gs"); } // colours pw.println("" + r + " " + g + " " + b + " rg " + r + " " + g + " " + b + " RG"); } if (paint instanceof MultipleGradientPaint) { closeBlock(); if ((paint instanceof RadialGradientPaint) || ((paint instanceof LinearGradientPaint) && (((LinearGradientPaint) paint).getCycleMethod() == MultipleGradientPaint.CycleMethod.NO_CYCLE))) { shading = "gradient"; } else { pattern = "gradient"; } } if (paint instanceof TexturePaint) { closeBlock(); pattern = "texture"; } } /*private boolean isPaintShading(Paint p) { return (p instanceof RadialGradientPaint) || ((p instanceof LinearGradientPaint) && (((LinearGradientPaint) p).getCycleMethod() == MultipleGradientPaint.CycleMethod.NO_CYCLE)); }*/ private void initGradientPaint(MultipleGradientPaint grad) { if ((grad instanceof LinearGradientPaint) && (((LinearGradientPaint) grad).getCycleMethod() == MultipleGradientPaint.CycleMethod.REFLECT)) { LinearGradientPaint linGrad = (LinearGradientPaint) grad; Point2D start = linGrad.getStartPoint(); Point2D end = linGrad.getEndPoint(); double deltaX = end.getX() - start.getX(); double deltaY = end.getY() - start.getY(); Point2D newEnd = new Point2D.Double(end.getX() + deltaX, end.getY() + deltaY); int colorCount = grad.getFractions().length; float fractions2[] = new float[colorCount * 2 - 1]; Color colors2[] = new Color[colorCount * 2 - 1]; float fractionsrev[] = new float[linGrad.getFractions().length]; Color colorsrev[] = new Color[linGrad.getColors().length]; for (int i = 0; i < fractionsrev.length; i++) { colorsrev[i] = linGrad.getColors()[i]; fractionsrev[i] = linGrad.getFractions()[i]; } for (int i = 0; i < colorCount; i++) { colors2[i] = colorsrev[i]; fractions2[i] = fractionsrev[i] / 2; } for (int i = 0; i < colorCount; i++) { colors2[colors2.length - i - 1] = colorsrev[i]; fractions2[colors2.length - i - 1] = 1f - fractionsrev[i] / 2; } LinearGradientPaint linGrad2 = new LinearGradientPaint(start, newEnd, fractions2, colors2, MultipleGradientPaint.CycleMethod.REPEAT); grad = linGrad2; } List functions2Refs = new ArrayList<>(); for (int i = 1; i < grad.getColors().length; i++) { final Color color1 = grad.getColors()[i - 1]; final Color color2 = grad.getColors()[i]; PDFObject function2 = new PDFObject(null) { @Override public void write(OutputStream os) throws IOException { writeStart(os); os.write(("/FunctionType 2 /Domain [0 1] /C0 [" + (((float) color1.getRed()) / 255.0f) + " " + (((float) color1.getGreen()) / 255.0f) + " " + (((float) color1.getBlue()) / 255.0f) + "] /C1 [" + (((float) color2.getRed()) / 255.0f) + " " + (((float) color2.getGreen()) / 255.0f) + " " + (((float) color2.getBlue()) / 255.0f) + "] /N 1\n").getBytes()); writeEnd(os); } }; page.getPDFDocument().add(function2); functions2Refs.add(function2.getSerialID() + " 0 R"); } final MultipleGradientPaint fgrad = grad; PDFObject function3 = new PDFObject(null) { @Override public void write(OutputStream os) throws IOException { writeStart(os); os.write(("/FunctionType 3 /Domain [0 1] /Functions [" + String.join(" ", functions2Refs) + "] ").getBytes()); int lastcols = fgrad.getColors().length - 1; List bounds = new ArrayList<>(); List encode = new ArrayList<>(); for (int i = 1; i < fgrad.getColors().length; i++) { if (i < lastcols) { bounds.add("" + fgrad.getFractions()[i]); } encode.add("0 1"); } os.write(("/Bounds [" + String.join(" ", bounds) + "] ").getBytes()); os.write(("/Encode [" + String.join(" ", encode) + "]\n").getBytes()); writeEnd(os); } }; page.getPDFDocument().add(function3); double glen = 0; double divisor = 1; double maxlen = 256; if ((fgrad instanceof LinearGradientPaint) && (fgrad.getCycleMethod() != MultipleGradientPaint.CycleMethod.NO_CYCLE)) { LinearGradientPaint linGrad = (LinearGradientPaint) fgrad; Point2D startPoint = new Point2D.Double(); Point2D endPoint = new Point2D.Double(); startPoint = linGrad.getStartPoint(); endPoint = linGrad.getEndPoint(); double deltaX = endPoint.getX() - startPoint.getX(); double deltaY = endPoint.getY() - startPoint.getY(); glen = Math.sqrt(deltaX * deltaX + deltaY * deltaY); if (glen > maxlen) { divisor = glen / maxlen; glen = maxlen; } } final double flen = glen; PDFObject shading = new PDFObject(null) { @Override public void write(OutputStream os) throws IOException { writeStart(os); if (fgrad instanceof LinearGradientPaint) { LinearGradientPaint linGrad = (LinearGradientPaint) fgrad; MyDoubleRect coords; if (linGrad.getCycleMethod() == MultipleGradientPaint.CycleMethod.NO_CYCLE) { Point2D startPointTrans = new Point2D.Double(); Point2D endPointTrans = new Point2D.Double(); startPointTrans = linGrad.getStartPoint(); endPointTrans = linGrad.getEndPoint(); coords = new MyDoubleRect(startPointTrans.getX(), startPointTrans.getY(), endPointTrans.getX(), endPointTrans.getY()); } else { coords = new MyDoubleRect(0, 0, 0, flen); } os.write(("/ShadingType 2 /ColorSpace /DeviceRGB " + "/Coords [" + matDf.format(coords.xMin) + " " + matDf.format(coords.yMin) + " " + matDf.format(coords.xMax) + " " + matDf.format(coords.yMax) + "] " + "/Domain [0 1] " + "/Function " + function3.getSerialID() + " 0 R /Extend [true true]\n").getBytes()); writeEnd(os); } if (fgrad instanceof RadialGradientPaint) { RadialGradientPaint radGrad = (RadialGradientPaint) fgrad; os.write(("/ShadingType 3 /ColorSpace /DeviceRGB " + "/Coords [" + radGrad.getFocusPoint().getX() + " " + radGrad.getFocusPoint().getY() + " " + "0 " + radGrad.getCenterPoint().getX() + " " + radGrad.getCenterPoint().getY() + " " + radGrad.getRadius() + "] " + "/Domain [0 1] " + "/Function " + function3.getSerialID() + " 0 R /Extend [true true]\n").getBytes()); writeEnd(os); } } }; page.getPDFDocument().add(shading); shadingCount++; if ((grad instanceof LinearGradientPaint) && ((LinearGradientPaint) grad).getCycleMethod() != MultipleGradientPaint.CycleMethod.NO_CYCLE) { LinearGradientPaint linGrad = (LinearGradientPaint) grad; Point2D startPoint = linGrad.getStartPoint(); Point2D endPoint = linGrad.getEndPoint(); Point2D startPointTrans = new Point2D.Double(); Point2D endPointTrans = new Point2D.Double(); transform.transform(linGrad.getStartPoint(), startPointTrans); transform.transform(linGrad.getEndPoint(), endPointTrans); double deltaX = endPoint.getX() - startPoint.getX(); double deltaY = endPoint.getY() - startPoint.getY(); double tana = deltaX / deltaY; double alfa = Math.atan(tana); AffineTransform m = new AffineTransform(); m.concatenate(pTransform); m.concatenate(transform); m.concatenate(AffineTransform.getTranslateInstance(startPoint.getX(), endPoint.getY())); m.concatenate(AffineTransform.getScaleInstance(divisor, divisor)); m.concatenate(AffineTransform.getRotateInstance(-alfa)); String matrixStr = "" + matDf.format(m.getScaleX()) + " " + matDf.format(m.getShearY()) + " " + matDf.format(m.getShearX()) + " " + matDf.format(m.getScaleY()) + " " + matDf.format(m.getTranslateX()) + " " + matDf.format(m.getTranslateY()); final int fCurrentShadingCount = shadingCount; PDFStream innerPattern = new PDFStream("/Pattern") { @Override public void write(OutputStream os) throws IOException { writeStart(os); double w; double h; w = 1; h = flen; os.write("/PatternType 1\n".getBytes()); os.write("/PaintType 1\n".getBytes()); os.write("/TilingType 2\n".getBytes()); os.write(("/BBox [0 0 " + w + " " + h + "]\n").getBytes()); os.write(("/XStep " + w + "\n").getBytes()); os.write(("/YStep " + h + "\n").getBytes()); os.write(("/Resources << " + "/Shading << /Shin" + fCurrentShadingCount + " " + shading.getSerialID() + " 0 R >>" + ">>\n").getBytes()); os.write(("/Matrix [" + matrixStr + "]\n").getBytes()); writeStream(os); } }; OutputStream patOs = innerPattern.getOutputStream(); try { patOs.write(("/Shin" + shadingCount + " sh").getBytes()); } catch (IOException ex) { Logger.getLogger(PDFGraphics.class.getName()).log(Level.SEVERE, null, ex); } page.getPDFDocument().add(innerPattern); page.addPatternResource("/p" + shadingCount + " " + innerPattern.getSerialID() + " 0 R"); this.pattern = "/p" + shadingCount; return; } page.addShadingResource("/Sh" + shadingCount + " " + shading.getSerialID() + " 0 R "); this.shading = "/Sh" + shadingCount; } private void initTexturePaint(TexturePaint texturePaint) { BufferedImage img = texturePaint.getImage(); PDFMask mask = new PDFMask(img); page.getPDFDocument().add(mask); Rectangle2D anchorRect = texturePaint.getAnchorRect(); final double w = anchorRect.getWidth(); final double h = anchorRect.getHeight(); PDFImage image = new PDFImage(img, 0, 0, img.getWidth(), img.getHeight(), new ImageObserver() { @Override public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { return true; } }, "" + mask.getSerialID() + " 0 R"); // The image needs to be registered in several places page.getPDFDocument().setImageName(image); page.getPDFDocument().add(image); usedImages.put(img, image); AffineTransform m = new AffineTransform(); AffineTransform ptt = new AffineTransform(); ptt.concatenate(pTransform); ptt.concatenate(transform); m.concatenate(ptt); String matrixStr = "" + matDf.format(m.getScaleX()) + " " + matDf.format(m.getShearY()) + " " + matDf.format(m.getShearX()) + " " + matDf.format(m.getScaleY()) + " " + matDf.format(m.getTranslateX()) + " " + matDf.format(m.getTranslateY()); PDFStream innerPattern = new PDFStream("/Pattern") { @Override public void write(OutputStream os) throws IOException { writeStart(os); os.write("/PatternType 1\n".getBytes()); os.write("/PaintType 1\n".getBytes()); os.write("/TilingType 2\n".getBytes()); os.write(("/BBox [0 0 " + matDf.format(w) + " " + matDf.format(h) + "]\n").getBytes()); os.write(("/XStep " + matDf.format(w) + "\n").getBytes()); os.write(("/YStep " + matDf.format(h) + "\n").getBytes()); os.write(("/Resources << ").getBytes()); os.write("/XObject << ".getBytes()); os.write((image.getName() + " " + image.getSerialID() + " 0 R").getBytes()); os.write(" >> ".getBytes()); os.write((">>\n").getBytes()); //"1 0 0 1 0 0" os.write(("/Matrix [" + matrixStr + "]\n").getBytes()); writeStream(os); } }; OutputStream patOs = innerPattern.getOutputStream(); PrintWriter patwriter = new PrintWriter(patOs); AffineTransform transformToSet; transformToSet = new AffineTransform(w, 0, 0, -h, 0 - anchorRect.getX(), h - anchorRect.getY()); patwriter.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); transformToSet = new AffineTransform(w, 0, 0, -h, w - anchorRect.getX(), h - anchorRect.getY()); patwriter.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); transformToSet = new AffineTransform(w, 0, 0, -h, 0 - anchorRect.getX(), 2 * h - anchorRect.getY()); patwriter.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); transformToSet = new AffineTransform(w, 0, 0, -h, w - anchorRect.getX(), 2 * h - anchorRect.getY()); patwriter.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); patwriter.flush(); page.getPDFDocument().add(innerPattern); shadingCount++; page.addPatternResource("/p" + shadingCount + " " + innerPattern.getSerialID() + " 0 R"); this.pattern = "/p" + shadingCount; } /** * Not implemented, as this is not supported in the PDF specification. */ @Override public void setPaintMode() { } /** * Sets a rendering hint * * @param arg0 * @param arg1 */ @Override public void setRenderingHint(Key arg0, Object arg1) { if (arg1 != null) { rhints.put(arg0, arg1); } else { rhints.remove(arg0); } } // Add Graphics2D methods. /** * @see Graphics2D#setRenderingHints(Map) */ @Override public void setRenderingHints(Map hints) { rhints.clear(); rhints.putAll(hints); } /** * @see Graphics2D#setStroke(Stroke) */ @Override public void setStroke(Stroke s) { this.stroke = s; if (stroke instanceof BasicStroke) { BasicStroke bs = (BasicStroke) stroke; setLineCap(bs.getEndCap()); setLineJoin(bs.getLineJoin()); setLineWidth(bs.getLineWidth()); setMiterLimit(bs.getMiterLimit()); // TODO: Line dash pattern } } /** * @see Graphics2D#setTransform(AffineTransform) */ @Override public void setTransform(AffineTransform t) { setNewTranform(new AffineTransform(t)); } /** * Not implemented, as this is not supported in the PDF specification. * * @param c1 Color to xor with */ @Override public void setXORMode(Color c1) { } //============ Text operations ======================= /** * @see Graphics2D#shear(double, double) */ @Override public void shear(double shx, double shy) { AffineTransform newTransform = new AffineTransform(transform); newTransform.shear(shx, shy); setNewTranform(newTransform); } /** * @see Graphics2D#transform(AffineTransform) */ @Override public void transform(AffineTransform tx) { AffineTransform newTransform = new AffineTransform(transform); newTransform.concatenate(tx); setNewTranform(newTransform); } /** * @see Graphics2D#translate(double, double) */ @Override public void translate(double tx, double ty) { AffineTransform newTransform = new AffineTransform(transform); newTransform.translate(tx, ty); setNewTranform(newTransform); } /** * @see Graphics#translate(int, int) */ @Override public void translate(int x, int y) { translate((double) x, (double) y); } /** * Converts the Java space coordinates into pdf text space. * * @param x coordinate * @param y coordinate * @param tx coordinate * @param ty coordinate * @return String containing the coordinates in PDF text space */ private String twh(float x, float y, float tx, float ty) { float nx = x, ny = y; float ntx = tx, nty = ty; nx = (float) (x - tx); ny = (float) (y - ty); return "" + df.format(nx) + " " + df.format(ny) + " "; } /** * Converts the Java space coordinates into pdf text space. * * @param x coordinate * @param y coordinate * @return String containing the coordinates in PDF text space */ private String txy(float x, float y) { Point2D ptSrc = new Point2D.Float(x, y); Point2D ptDst = new Point2D.Float(); pTransform.transform(ptSrc, ptDst); return "" + df.format(ptDst.getX()) + " " + df.format(ptDst.getY()) + " "; } private void setNewTranform(AffineTransform t) { closeBlock(); AffineTransform newTransform = new AffineTransform(t); AffineTransform transformToSet = new AffineTransform(newTransform); if (transform != null) { AffineTransform aInv = new AffineTransform(transform); try { aInv.invert(); } catch (NoninvertibleTransformException ex) { Logger.getLogger(PDFGraphics.class.getName()).log(Level.SEVERE, null, ex); } AffineTransform pInv = new AffineTransform(pTransform); try { pInv.invert(); } catch (NoninvertibleTransformException ex) { Logger.getLogger(PDFGraphics.class.getName()).log(Level.SEVERE, null, ex); } transformToSet = new AffineTransform(); transformToSet.concatenate(aInv); transformToSet.concatenate(pInv); transformToSet.concatenate(pTransform); transformToSet.concatenate(newTransform); } else { transformToSet.preConcatenate(pTransform); } transform = newTransform; pw.println("" + matDf.format(transformToSet.getScaleX()) + " " + "" + matDf.format(transformToSet.getShearY()) + " " + "" + matDf.format(transformToSet.getShearX()) + " " + "" + matDf.format(transformToSet.getScaleY()) + " " + "" + matDf.format(transformToSet.getTranslateX()) + " " + "" + matDf.format(transformToSet.getTranslateY()) + " cm" ); } private void saveState() { pw.println("q"); } private void restoreState() { pw.println("Q"); } } // end class PDFGraphics \ No newline at end of file +/* * $Id: PDFGraphics.java,v 1.6 2007/09/22 12:58:40 gil1 Exp $ * * $Date: 2007/09/22 12:58:40 $ * * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package gnu.jpdf; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Composite; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GraphicsConfiguration; import java.awt.Image; import java.awt.LinearGradientPaint; import java.awt.MultipleGradientPaint; import java.awt.Paint; import java.awt.Polygon; import java.awt.RadialGradientPaint; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.RenderingHints.Key; import java.awt.Shape; import java.awt.Stroke; import java.awt.TexturePaint; import java.awt.font.FontRenderContext; import java.awt.font.GlyphVector; import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.PathIterator; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import java.awt.image.ColorModel; import java.awt.image.ImageObserver; import java.awt.image.RenderedImage; import java.awt.image.WritableRaster; import java.awt.image.renderable.RenderableImage; import java.awt.print.PageFormat; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.io.Serializable; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.WeakHashMap; import java.util.logging.Level; import java.util.logging.Logger; /** * This class is our implementation of AWT's Graphics class. It provides a Java * standard way of rendering into a PDF Document's Page. * * @author Peter T Mount, http://www.retep.org.uk/pdf/ * @author Eric Z. Beard, ericzbeard@hotmail.com * @author Gilbert DeLeeuw, gil1@users.sourceforge.net * @version $Revision: 1.6 $, $Date: 2007/09/22 12:58:40 $ * @see gnu.jpdf.PDFGraphics */ public class PDFGraphics extends Graphics2D implements Serializable { /** * One degree in radians */ private static final double degrees_to_radians = Math.PI / 180.0; private static final int FILL = 1; private static final int STROKE = 2; private static final int CLIP = 3; private static final AffineTransform IDENTITY = new AffineTransform(); private static final Stroke DEF_STROKE = new BasicStroke(); /* * NOTE: The original class is the work of Peter T. Mount, who released it * in the uk.org.retep.pdf package. It was modified by Eric Z. Beard as * follows: * The package name was changed to gnu.pdf. * The formatting was changed a little bit. * This used to subclass an abstract class in a different package with * the same name (confusing). Now it's one concrete class. * drawImage() was implemented * It is still licensed under the LGPL. */ // Implementation notes: // // Pages 333-335 of the PDF Reference Manual // // Unless absolutely required, use the moveto, lineto and rectangle // operators to perform those actions. // They contain some extra optimizations // which will reduce the output size by up to half in some cases. // // About fill operators: For correct operation, any fill operation should // start with closeBlock(), which will ensure any previous path is completed, // otherwise you may find the fill will include previous items private static final DecimalFormat df = new DecimalFormat("#.###", new DecimalFormatSymbols(Locale.ENGLISH)); private static final DecimalFormat matDf = new DecimalFormat("0", new DecimalFormatSymbols(Locale.ENGLISH)); static { matDf.setMaximumFractionDigits(340); } //JPEXS: cache for already used images private static Map usedImages = new WeakHashMap(); private Color background; /** * This is true for any Graphics instance that didn't create the stream. * * @see #create */ private boolean child; private Area clip; private AffineTransform clipTransform; /** * This holds the current clipRectangle */ protected Rectangle clipRectangle; private Composite composite; private Graphics2D dg2 = new BufferedImage(2, 2, BufferedImage.TYPE_INT_RGB).createGraphics(); /** * This is the current font (in Java format) */ private Font font; /** * Part of the optimizer: When true, we are drawing a path. */ private boolean inStroke; /** * Part of the optimizer: When true, we are within a Text Block. */ private boolean inText; // true if within a Text Block - see newTextBlock() /** * The stroke line cap code; */ private int lineCap = 0; /** * The stroke line join code */ private int lineJoin = 0; /** * The stroke line width */ private float lineWidth = 1.0f; /** * Part of the optimizer: The last known moveto/lineto x coordinate * * @see #moveto * @see #lineto */ private float lx; // last known moveto/lineto coordinates /** * Part of the optimizer: The last known moveto/lineto y coordinate * * @see #moveto * @see #lineto */ private float ly; // last known moveto/lineto coordinates private float miterLimit = 10.0f; /** * Part of the optimizer: When true, the font has changed. */ private boolean newFont; // true if the font changes - see newTextBlock() /** * This is a reference to the PDFPage we are rendering to. */ private PDFPage page; /** * This is the current pen/fill color */ private Paint paint; private AffineTransform paintTransform; /** * This is the current font (in PDF format) */ private PDFFont pdffont; /** * Part of the optimizer: This is written to the stream when the newPath() * is called. np then clears this value. */ private String pre_np; // PDF space transform private AffineTransform pTransform; /** * This is the PrintWriter used to write PDF drawing commands to the Stream */ private RawPrintWriter pw; /** * RenderingHints */ private RenderingHints rhints = new RenderingHints(null); private Stroke stroke; // Start of Graphics2D properties private AffineTransform transform; /** * Part of the optimizer: The last x coordinate when rendering text */ private float tx; // the last coordinate for text rendering /** * Part of the optimizer: The last y coordinate when rendering text */ private float ty; // the last coordinate for text rendering private String shading = null; private String pattern = null; private Set usedAlphas = new HashSet<>(); private int currentAlpha = 255; private int shadingCount = 0; private static int[] srgbToLinear = new int[256]; static { for (int i = 0; i < 256; i++) { srgbToLinear[i] = convertSRGBtoLinearRGB(i); } } private static int convertSRGBtoLinearRGB(int color) { float input, output; input = color / 255.0f; if (input <= 0.04045f) { output = input / 12.92f; } else { output = (float) Math.pow((input + 0.055) / 1.055, 2.4); } return Math.round(output * 255.0f); } /** * @see Graphics2D#addRenderingHints(Map) */ @Override public void addRenderingHints(Map hints) { rhints.putAll(hints); } /** * This produces an arc by breaking it down into one or more Bezier curves. * It is used internally to implement the drawArc and fillArc methods. * * @param axc X coordinate of arc centre * @param ayc Y coordinate of arc centre * @param width of bounding rectangle * @param height of bounding rectangle * @param ang1 Start angle * @param ang2 End angle * @param clockwise true to draw clockwise, false anti-clockwise */ public void arc(double axc, double ayc, double width, double height, double ang1, double ang2, boolean clockwise) { double adiff; double x0, y0; double x3r, y3r; boolean first = true; // may not need this //if( ar < 0 ) { //ang1 += fixed_180; //ang2 += fixed_180; //ar = - ar; //} double ang1r = (ang1 % 360.0) * degrees_to_radians; double sin0 = Math.sin(ang1r); double cos0 = Math.cos(ang1r); x0 = axc + width * cos0; y0 = ayc + height * sin0; // NB: !clockwise here as Java Space is inverted to User Space if (!clockwise) { // Quadrant reduction while (ang1 < ang2) { ang2 -= 360.0; } while ((adiff = ang2 - ang1) < -90.0) { double w = sin0; sin0 = -cos0; cos0 = w; x3r = axc + width * cos0; y3r = ayc + height * sin0; arc_add(first, width, height, x0, y0, x3r, y3r, (x0 + width * cos0), (y0 + height * sin0) ); x0 = x3r; y0 = y3r; ang1 -= 90.0; first = false; } } else { // Quadrant reduction while (ang2 < ang1) { ang2 += 360.0; } while ((adiff = ang2 - ang1) > 90.0) { double w = cos0; cos0 = -sin0; sin0 = w; x3r = axc + width * cos0; y3r = ayc + height * sin0; arc_add(first, width, height, x0, y0, x3r, y3r, (x0 + width * cos0), (y0 + height * sin0) ); x0 = x3r; y0 = y3r; ang1 += 90.0; first = false; } } // Compute the intersection of the tangents. // We know that -fixed_90 <= adiff <= fixed_90. double trad = Math.tan(adiff * (degrees_to_radians / 2)); double ang2r = ang2 * degrees_to_radians; double xt = x0 - trad * width * sin0; double yt = y0 + trad * height * cos0; arc_add(first, width, height, x0, y0, (axc + width * Math.cos(ang2r)), (ayc + height * Math.sin(ang2r)), xt, yt); } /** * Used by the arc method to actually add an arc to the path Important: We * write directly to the stream here, because this method operates in User * space, rather than Java space. * * @param first true if the first arc * @param w width * @param h height * @param x0 coordinate * @param y0 coordinate * @param x3 coordinate * @param y3 coordinate * @param xt coordinate * @param yt coordinate */ private void arc_add(boolean first, double w, double h, double x0, double y0, double x3, double y3, double xt, double yt) { double dx = xt - x0, dy = yt - y0; double dist = dx * dx + dy * dy; double w2 = w * w, h2 = h * h; double r2 = w2 + h2; double fw = 0.0, fh = 0.0; if (dist < (r2 * 1.0e8)) { // JM fw = (w2 != 0.0) ? ((4.0 / 3.0) / (1 + Math.sqrt(1 + dist / w2))) : 0.0; fh = (h2 != 0.0) ? ((4.0 / 3.0) / (1 + Math.sqrt(1 + dist / h2))) : 0.0; } // The path must have a starting point if (first) { moveto(x0, y0); } double x = x0 + ((xt - x0) * fw); double y = y0 + ((yt - y0) * fh); x0 = x3 + ((xt - x3) * fw); y0 = y3 + ((yt - y3) * fh); // Finally the actual curve. curveto(x, y, x0, y0, x3, y3); } /** * This simply draws a White Rectangle to clear the area * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void clearRect(int x, int y, int w, int h) { closeBlock(); pw.print("q 1 1 1 RG ");// save state, set colour to White drawRect(x, y, w, h); closeBlock("B Q"); // close fill & stroke, then restore state } /** * @see Graphics2D#clip(Shape) */ @Override public void clip(Shape s) { if (s == null) { setClip(null); return; } Area newClip; if (clip == null) { newClip = new Area(s); } else { newClip = (Area) clip.clone(); newClip.intersect(new Area(s)); } setClip(newClip); } /** * This extra method allows PDF users to clip to a Polygon. * *

    * In theory you could use setClip(), except that java.awt.Graphics only * supports Rectangle with that method, so we will have an extra method. * * @param p Polygon to clip to */ public void clipPolygon(Polygon p) { closeBlock(); // finish off any existing path polygon(p.xpoints, p.ypoints, p.npoints); closeBlock("W"); // clip to current path clipRectangle = p.getBounds(); } /** * Clips to a set of coordinates * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void clipRect(int x, int y, int w, int h) { setClip(x, y, w, h); } /** * All functions should call this to close any existing optimized blocks. */ void closeBlock() { closeBlock("S"); } /** *

    * This is used by code that use the path in any way other than Stroke (like * Fill, close path & Stroke etc). Usually this is used internally.

    * * @param code PDF operators that will close the path */ void closeBlock(String code) { if (inText) { pw.println("ET Q"); // setOrientation(); // fixes Orientation matrix } if (inStroke) { pw.println(code); } inStroke = inText = false; } /** * This is unsupported - how do you do this with Vector graphics? * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param dx coordinate * @param dy coordinate */ @Override public void copyArea(int x, int y, int w, int h, int dx, int dy) { // Hmm... Probably need to keep track of everything // that has been drawn so far to get the contents of an area } //============ Line operations ======================= /** *

    * This returns a child instance of this Graphics object. As with AWT, the * affects of using the parent instance while the child exists, is not * determined.

    * *

    * Once complete, the child should be released with it's dispose() method * which will restore the graphics state to it's parent.

    * * @return Graphics object to render onto the page */ @Override public Graphics create() { closeBlock(); PDFGraphics g = createGraphic(page, pw); // The new instance inherits a few items g.clipRectangle = new Rectangle(clipRectangle); return (Graphics) g; } // end create() /** * This method creates a new instance of the class based on the page and a * print writer. * * @param page the page to attach to * @param pw the PrintWriter to attach to. */ protected PDFGraphics createGraphic(PDFPage page, RawPrintWriter pw) { PDFGraphics g = new PDFGraphics(); g.init(page, pw); return g; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x2,y2) using the current point and (x1,y1) as the * Bezier control points. *

    * The new current point is (x2,y2) * * @param x1 Second control point * @param y1 Second control point * @param x2 Destination point * @param y2 Destination point */ public void curveto(double x1, double y1, double x2, double y2) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + "v"); lx = (float) x2; ly = (float) y2; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x3,y3) using (x1,y1) and (x2,y2) as the Bezier * control points. *

    * The new current point is (x3,y3) * * @param x1 First control point * @param y1 First control point * @param x2 Second control point * @param y2 Second control point * @param x3 Destination point * @param y3 Destination point */ public void curveto(double x1, double y1, double x2, double y2, double x3, double y3) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + cxy(x3, y3) + "c"); lx = (float) x3; ly = (float) y3; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x2,y2) using the current point and (x1,y1) as the * Bezier control points. *

    * The new current point is (x2,y2) * * @param x1 Second control point * @param y1 Second control point * @param x2 Destination point * @param y2 Destination point */ public void curveto(int x1, int y1, int x2, int y2) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + "v"); lx = x2; ly = y2; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x3,y3) using (x1,y1) and (x2,y2) as the Bezier * control points. *

    * The new current point is (x3,y3) * * @param x1 First control point * @param y1 First control point * @param x2 Second control point * @param y2 Second control point * @param x3 Destination point * @param y3 Destination point */ public void curveto(int x1, int y1, int x2, int y2, int x3, int y3) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + cxy(x3, y3) + "c"); lx = x3; ly = y3; } /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x2,y2) using (x1,y1) and the end point as the * Bezier control points. *

    * The new current point is (x2,y2) * * @param x1 Second control point * @param y1 Second control point * @param x2 Destination point * @param y2 Destination point */ public void curveto2(double x1, double y1, double x2, double y2) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + "y"); lx = (float) x2; ly = (float) y2; } // Arcs are horrible and complex. They are at the end of the // file, because they are the largest. This is because, unlike // Postscript, PDF doesn't have any arc operators, so we must // implement them by converting into one or more Bezier curves // (which is how Postscript does them internally). /** * This extension appends a Bezier curve to the path. The curve extends from * the current point to (x2,y2) using (x1,y1) and the end point as the * Bezier control points. *

    * The new current point is (x2,y2) * * @param x1 Second control point * @param y1 Second control point * @param x2 Destination point * @param y2 Destination point */ public void curveto2(int x1, int y1, int x2, int y2) { newPath(); pw.println(cxy(x1, y1) + cxy(x2, y2) + "y"); lx = x2; ly = y2; } /** * Converts the Java space dimension into pdf. * * @param w width * @param h height * @return String containing the coordinates in PDF space */ private String cwh(double w, double h) { return "" + df.format(w) + " " + df.format(h) + " "; } /** * Converts the Java space dimension into pdf. * * @param w width * @param h height * @return String containing the coordinates in PDF space */ private String cwh(int w, int h) { return cwh((double) w, (double) h); } /** * Converts the Java space coordinates into pdf. * * @param x coordinate * @param y coordinate * @return String containing the coordinates in PDF space */ private String cxy(double x, double y) { return "" + df.format(x) + " " + df.format(y) + " "; } /** * Converts the Java space coordinates into pdf. * * @param x coordinate * @param y coordinate * @return String containing the coordinates in PDF space */ private String cxy(int x, int y) { return cxy((double) x, (double) y); } /** *

    * This releases any resources used by this Graphics object. You must use * this method once finished with it. Leaving it open will leave the PDF * stream in an inconsistent state, and will produce errors.

    * *

    * If this was created with Graphics.create() then the parent instance can * be used again. If not, then this closes the graphics operations for this * page when used with PDFJob.

    * *

    * When using PDFPage, you can create another fresh Graphics instance, which * will draw over this one.

    * */ @Override public void dispose() { closeBlock(); if (clip != null) { restoreState(); } if (child) { pw.println("Q"); // restore graphics context } else { pw.close(); // close the stream if were the parent } } // ********************************************* // **** Implementation of java.awt.Graphics **** // ********************************************* //============ Rectangle operations ======================= /** * @see Graphics2D#draw(Shape) */ @Override public void draw(Shape s) { followPath(s, STROKE); } /** *

    * Not implemented

    * *

    * Draws a 3-D highlighted outline of the specified rectangle. The edges of * the rectangle are highlighted so that they appear to be beveled and lit * from the upper left corner. The colors used for the highlighting effect * are determined based on the current color. The resulting rectangle covers * an area that is width + 1 pixels wide by height + 1 pixels tall. *

    * * @param x an int value * @param y an int value * @param width an int value * @param height an int value * @param raised a boolean value */ @Override public void draw3DRect(int x, int y, int width, int height, boolean raised) { // Not implemented } /** * Draws an arc * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param sa Start angle * @param aa End angle */ @Override public void drawArc(int x, int y, int w, int h, int sa, int aa) { w = w >> 1; h = h >> 1; x += w; y += h; arc((double) x, (double) y, (double) w, (double) h, (double) -sa, (double) (-sa - aa), false); } /** *

    * Not implemented

    * * @param data a byte[] value * @param offset an int value * @param length an int value * @param x an int value * @param y an int value */ @Override public void drawBytes(byte[] data, int offset, int length, int x, int y) { } //============ Optimizers ======================= /** * @see Graphics2D#drawGlyphVector(GlyphVector, float, float) */ @Override public void drawGlyphVector(GlyphVector g, float x, float y) { Shape s = g.getOutline(x, y); fill(s); } /** * @see Graphics2D#drawImage(BufferedImage, BufferedImageOp, int, int) */ @Override public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) { BufferedImage result = img; if (op != null) { result = op.createCompatibleDestImage(img, img.getColorModel()); result = op.filter(img, result); } drawImage(result, x, y, null); } /** * @see Graphics2D#drawImage(Image, AffineTransform, ImageObserver) */ @Override public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) { // return drawImage(img, null, xform, null, obs); return true; } /** *

    * Draw's an image onto the page, with a backing colour.

    * * @param img The java.awt.Image * @param x coordinate on page * @param y coordinate on page * @param bgcolor Background colour * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver obs) { return drawImage(img, x, y, img.getWidth(obs), img.getHeight(obs), bgcolor, obs); } /** * Draw's an image onto the page * * @param img The java.awt.Image * @param x coordinate on page * @param y coordinate on page * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int x, int y, ImageObserver obs) { return drawImage(img, x, y, img.getWidth(obs), img.getHeight(obs), obs); } /** *

    * Draw's an image onto the page, with a backing colour.

    * * @param img The java.awt.Image * @param x coordinate on page * @param y coordinate on page * @param w Width on page * @param h height on page * @param bgcolor Background colour * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int x, int y, int w, int h, Color bgcolor, ImageObserver obs) { closeBlock(); pw.print("q "); // save state Color c = getColor(); // save current colour setColor(bgcolor); // change the colour drawRect(x, y, w, h); closeBlock("B Q"); // fill stroke, restore state paint = c; // restore original colour return drawImage(img, x, y, img.getWidth(obs), img.getHeight(obs), obs); } /** *

    * Draws an image onto the page.

    * *

    * This method is implemented with ASCIIbase85 encoding and the zip stream * deflater. It results in a stream that is anywhere from 3 to 10 times as * big as the image. This obviously needs some improvement, but it works * well for small images

    * * @param img The java.awt.Image * @param x coordinate on page * @param y coordinate on page * @param w Width on page * @param h height on page * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int x, int y, int w, int h, ImageObserver obs) { closeBlock(); PDFImage image; if (usedImages.containsKey(img)) { image = usedImages.get(img); } else { PDFMask mask = new PDFMask(img); page.getPDFDocument().add(mask); image = new PDFImage(img, x, y, w, h, obs, "" + mask.getSerialID() + " 0 R"); // The image needs to be registered in several places page.getPDFDocument().setImageName(image); page.getPDFDocument().add(image); usedImages.put(img, image); } page.addToProcset("/ImageC"); page.addImageResource(image.getName() + " " + image.getSerialID() + " 0 R"); // JM /*page.addResource("/XObject << " + image.getName() + " " + image.getSerialID() + " 0 R >>");*/ // q w 0 0 h x y cm % the coordinate matrix AffineTransform newTransform = new AffineTransform(w, 0, 0, -h, x, y + h); AffineTransform transformToSet = newTransform; pw.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); return false; } /** * Draw's an image onto the page, with scaling *

    * This is not yet supported. * * @param img The java.awt.Image * @param dx1 coordinate on page * @param dy1 coordinate on page * @param dx2 coordinate on page * @param dy2 coordinate on page * @param sx1 coordinate on image * @param sy1 coordinate on image * @param sx2 coordinate on image * @param sy2 coordinate on image * @param bgcolor Background colour * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver obs) { return false; } //============ Clipping operations ======================= /** * Draw's an image onto the page, with scaling *

    * This is not yet supported. * * @param img The java.awt.Image * @param dx1 coordinate on page * @param dy1 coordinate on page * @param dx2 coordinate on page * @param dy2 coordinate on page * @param sx1 coordinate on image * @param sy1 coordinate on image * @param sx2 coordinate on image * @param sy2 coordinate on image * @param obs ImageObserver * @return true if drawn */ @Override public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver obs) { // This shouldn't be too bad, just change the coordinate matrix return false; } /** * Draws a line between two coordinates. * * If the first coordinate is the same as the last one drawn (i.e. a * previous drawLine, moveto, etc) it is ignored. * * @param x1 coordinate * @param y1 coordinate * @param x2 coordinate * @param y2 coordinate */ @Override public void drawLine(int x1, int y1, int x2, int y2) { moveto(x1, y1); lineto(x2, y2); } //============ Arcs operations ============================== // These are the standard Graphics operators. They use the // arc extension operators to achieve the affect. /** *

    * Draws an oval

    * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void drawOval(int x, int y, int w, int h) { drawArc(x, y, w, h, 0, 360); } /** * Draws a polygon, linking the first and last coordinates. * * @param xp Array of x coordinates * @param yp Array of y coordinates * @param np number of points in polygon */ @Override public void drawPolygon(int[] xp, int[] yp, int np) { polygon(xp, yp, np); closeBlock("s"); // close path and stroke } /** * Draws a polyline. The first and last coordinates are not linked. * * @param xp Array of x coordinates * @param yp Array of y coordinates * @param np number of points in polyline */ @Override public void drawPolyline(int[] xp, int[] yp, int np) { polygon(xp, yp, np); // no stroke, as we keep the optimizer in stroke state } /** * We override Graphics.drawRect as it doesn't join the 4 lines. Also, PDF * provides us with a Rectangle operator, so we will use that. * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void drawRect(int x, int y, int w, int h) { draw(new Rectangle(x, y, w, h)); /*newPath(); pw.print(cxy(x, y) + cwh(w, h) + "re "); // rectangle lx = x; // I don't know if this is correct, but lets see if PDF ends ly = y; // the rectangle at it's start. // stroke (optimized)*/ } /** * @see Graphics2D#drawRenderableImage(RenderableImage, AffineTransform) */ @Override public void drawRenderableImage(RenderableImage img, AffineTransform xform) { drawRenderedImage(img.createDefaultRendering(), xform); } /** * @see Graphics2D#drawRenderedImage(RenderedImage, AffineTransform) */ @Override public void drawRenderedImage(RenderedImage img, AffineTransform xform) { BufferedImage image = null; if (img instanceof BufferedImage) { image = (BufferedImage) img; } else { ColorModel cm = img.getColorModel(); int width = img.getWidth(); int height = img.getHeight(); WritableRaster raster = cm.createCompatibleWritableRaster(width, height); boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); Hashtable properties = new Hashtable(); String[] keys = img.getPropertyNames(); if (keys != null) { for (int i = 0; i < keys.length; i++) { properties.put(keys[i], img.getProperty(keys[i])); } } BufferedImage result = new BufferedImage(cm, raster, isAlphaPremultiplied, properties); img.copyData(raster); image = result; } drawImage(image, xform, null); } /** * This is not yet implemented * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param aw a-width * @param ah a-height */ @Override public void drawRoundRect(int x, int y, int w, int h, int aw, int ah) { } //============ Oval operations ======================= /** * Draws a string using a AttributedCharacterIterator. *

    * This is not supported yet, as I have no idea what an * AttributedCharacterIterator is. *

    * This method is new to the Java2 API. */ @Override public void drawString(java.text.AttributedCharacterIterator aci, float x, float y) { } /** * Draws a string using a AttributedCharacterIterator. *

    * This is not supported yet, as I have no idea what an * AttributedCharacterIterator is. *

    * This method is new to the Java2 API. */ @Override public void drawString(java.text.AttributedCharacterIterator aci, int x, int y) { } public void drawStringWithMode(String s, float x, float y, int mode) { newTextBlock(x, y); if (mode > -1) { pw.println("" + mode + " Tr"); } if (pdffont instanceof PDFEmbeddedFont) { pw.print("[("); pw.printRaw(PDFStringHelper.makeRawPDFString(s)); pw.println(")] TJ"); } else { pw.print(PDFStringHelper.makePDFString(s)); pw.println(" Tj"); } closeBlock(); } @Override public void drawString(String s, float x, float y) { drawStringWithMode(s, x, y, -1); } /** * This draws a string. * * @param s * @oaran s String to draw * @param x coordinate * @param y coordinate */ @Override public void drawString(String s, int x, int y) { drawString(s, (float) x, (float) y); } public void drawTransparentString(String s, float x, float y) { drawStringWithMode(s, x, y, 3); } /** * This draws a transparent string. * * @oaran s String to draw * @param x coordinate * @param y coordinate */ public void drawTransparentString(String s, int x, int y) { drawTransparentString(s, (float) x, (float) y); } /** * @see Graphics2D#fill(Shape) */ @Override public void fill(Shape s) { followPath(s, FILL); } /** *

    * Not implemented

    * * @param x an int value * @param y an int value * @param width an int value * @param height an int value * @param raised a boolean value */ @Override public void fill3DRect(int x, int y, int width, int height, boolean raised) { // Not implemented } /** * Fills an arc, joining the start and end coordinates * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param sa Start angle * @param aa End angle */ @Override public void fillArc(int x, int y, int w, int h, int sa, int aa) { // here we fool the optimizer. We force any open path to be closed, // then draw the arc. Finally, as the optimizer hasn't stroke'd the // path, we close and fill it, and mark the Stroke as closed. // // Note: The lineto to the centre of the object is required, because // the fill only fills the arc. Skipping this includes an extra // chord, which isn't correct. Peter May 31 2000 closeBlock(); patternFill(null/*FIXME!!!*/); drawArc(x, y, w, h, sa, aa); lineto(x + (w >> 1), y + (h >> 1)); if (shadingFill(null)) { return; } closeBlock("b"); // closepath and fill } //============ Extension operations ============================== // These are extensions, and provide access to PDF Specific // operators. /** *

    * Draws a filled oval

    * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void fillOval(int x, int y, int w, int h) { fillArc(x, y, w, h, 0, 360); } //============ Polygon operations ======================= /** * Fills a polygon. * * @param xp Array of x coordinates * @param yp Array of y coordinates * @param np number of points in polygon */ @Override public void fillPolygon(int[] xp, int[] yp, int np) { closeBlock(); // finish off any previous paths patternFill(null /*FIXME!!!*/); polygon(xp, yp, np); if (shadingFill(null)) { return; } closeBlock("b"); // closepath, fill and stroke } //============ Image operations ======================= /** * Fills a rectangle with the current colour * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void fillRect(int x, int y, int w, int h) { fill(new Rectangle(x, y, w, h)); /* // end any path & stroke. This ensures the fill is on this // rectangle, and not on any previous graphics closeBlock(); patternFill(); drawRect(x, y, w, h); if (shadingFill()) { return; } closeBlock("B"); // rectangle, fill stroke*/ } private void patternFill(Shape s) { if (pattern != null) { if (paint instanceof TexturePaint) { if (pattern.equals("texture") || !paintTransform.equals(transform)) { initTexturePaint((TexturePaint) paint); paintTransform = transform; } } if (paint instanceof MultipleGradientPaint) { if (pattern.equals("gradient") || !paintTransform.equals(transform)) { initGradientPaint((MultipleGradientPaint) paint, s); paintTransform = transform; } } pw.println("/Pattern cs"); pw.println(pattern + " scn"); } } private boolean shadingFill(Shape s) { if (pattern == null && shading != null) { saveState(); pw.println("W n"); if (paint instanceof MultipleGradientPaint) { if (shading.equals("gradient") || !paintTransform.equals(transform)) { initGradientPaint((MultipleGradientPaint) paint, s); paintTransform = transform; } } pw.println(shading + " sh"); restoreState(); return true; } return false; } //============ Round Rectangle operations ======================= /** * This is not yet implemented * * @param x coordinate * @param y coordinate * @param w width * @param h height * @param aw a-width * @param ah a-height */ @Override public void fillRoundRect(int x, int y, int w, int h, int aw, int ah) { } /////////////////////////////////////////////// // // // implementation specific methods // // private void followPath(Shape s, int drawType) { PathIterator points; if (s == null) { return; } if (drawType == FILL) { patternFill(s); } if (drawType == STROKE) { if (!(stroke instanceof BasicStroke)) { s = stroke.createStrokedShape(s); followPath(s, FILL); return; } } // if (drawType==STROKE) { // setStrokeDiff(stroke, oldStroke); // oldStroke = stroke; // setStrokePaint(); // } // else if (drawType==FILL) // setFillPaint(); points = s.getPathIterator(IDENTITY); int segments = 0; float[] coords = new float[6]; while (!points.isDone()) { segments++; int segtype = points.currentSegment(coords); switch (segtype) { case PathIterator.SEG_CLOSE: pw.print("h "); break; case PathIterator.SEG_CUBICTO: curveto(coords[0], coords[1], coords[2], coords[3], coords[4], coords[5]); break; case PathIterator.SEG_LINETO: lineto(coords[0], coords[1]); break; case PathIterator.SEG_MOVETO: moveto(coords[0], coords[1]); break; case PathIterator.SEG_QUADTO: curveto(coords[0], coords[1], coords[2], coords[3]); break; } points.next(); } switch (drawType) { case FILL: if (segments > 0) { if (pattern == null && shading != null) { saveState(); if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD) { closeBlock("W*"); } else { closeBlock("W"); } pw.println("n"); if (paint instanceof MultipleGradientPaint) { if (shading.equals("gradient") || !paintTransform.equals(transform)) { initGradientPaint((MultipleGradientPaint) paint, s); paintTransform = transform; } } pw.println(shading + " sh"); restoreState(); return; } if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD) { closeBlock("f*"); } else { closeBlock("f"); } } break; case STROKE: if (segments > 0) { closeBlock("S"); } break; case CLIP: default: //drawType==CLIP if (segments == 0) { drawRect(0, 0, 0, 0); } if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD) { closeBlock("W*"); } else { closeBlock("W"); } } } /** * @see Graphics2D#getBackground() */ @Override public Color getBackground() { return background; } /** * Returns the Shape of the clipping region As my JDK docs say, this may * break with Java 2D. * * @return Shape of the clipping region */ @Override public Shape getClip() { return null; } /** * Returns the Rectangle that fits the current clipping region * * @return the Rectangle that fits the current clipping region */ @Override public Rectangle getClipBounds() { return clipRectangle; } //============ Color operations ======================= /** * Returns the current pen Colour * * @return the current pen Colour */ @Override public Color getColor() { return (paint instanceof Color) ? (Color) paint : Color.black; } /** * @see Graphics2D#getComposite() */ @Override public Composite getComposite() { return composite; } /** * @see Graphics2D#getDeviceConfiguration() */ @Override public GraphicsConfiguration getDeviceConfiguration() { return dg2.getDeviceConfiguration(); } /** * Return's the current font. * * @return the current font. */ @Override public Font getFont() { if (font == null) { setFont(new Font("SansSerif", Font.PLAIN, 12)); } return font; } /** * Returns the FontMetrics for a font. *

    * This doesn't work correctly. Perhaps having some way of mapping the base * 14 fonts to our own FontMetrics implementation? * * @param font The java.awt.Font to return the metrics for * @return FontMetrics for a font */ @Override public FontMetrics getFontMetrics(Font font) { Frame dummy = new Frame(); dummy.addNotify(); Image image = dummy.createImage(100, 100); if (image == null) { System.err.println("getFontMetrics: image is null"); } Graphics graphics = image.getGraphics(); return graphics.getFontMetrics(font); } /** * @see Graphics2D#getFontRenderContext() */ @Override public FontRenderContext getFontRenderContext() { boolean antialias = RenderingHints.VALUE_TEXT_ANTIALIAS_ON.equals(getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING)); boolean fractions = RenderingHints.VALUE_FRACTIONALMETRICS_ON.equals(getRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS)); return new FontRenderContext(new AffineTransform(), antialias, fractions); } /** * Returns the associated PDFPage for this graphic * * @return the associated PDFPage for this graphic */ public PDFPage getPage() { return page; } /** * Returns the current pen Colour * * @return the current pen Colour */ @Override public Paint getPaint() { return paint; } /** * @param arg0 a key * @return the rendering hint */ @Override public Object getRenderingHint(Key arg0) { return rhints.get(arg0); } /** * @see Graphics2D#getRenderingHints() */ @Override public RenderingHints getRenderingHints() { return rhints; } /** * @see Graphics2D#getStroke() */ @Override public Stroke getStroke() { return stroke; } /** * @see Graphics2D#getTransform() */ @Override public AffineTransform getTransform() { return new AffineTransform(transform); } /** * Returns the PrintWriter handling the underlying stream * * @return the PrintWriter handling the underlying stream */ public RawPrintWriter getWriter() { return pw; } /** * @see Graphics2D#hit(Rectangle, Shape, boolean) */ @Override public boolean hit(Rectangle rect, Shape s, boolean onStroke) { if (onStroke) { s = stroke.createStrokedShape(s); } Area area = new Area(s); if (clip != null) { area.intersect(clip); } return area.intersects(rect.x, rect.y, rect.width, rect.height); } /** * This initialises the stream by saving the current graphics state, and * setting up the default line width (for us). * * It also sets up the instance ready for graphic operations and any * optimisations. * *

    * For child instances, the stream is already open, so this should keep * things happy. */ private void init() { PageFormat pf = page.getPageFormat(); // save graphics state (restored by dispose) if (child) { pw.print("q "); } // now initialise the instance //setColor(Color.black); paint = Color.black; // possible: if parent.color is not black, then force black? // must check to see what AWT does? // Original User Space Transform (identity) // Transform from Java Space to PDF Space pTransform = new AffineTransform(); pTransform.translate(0, pf.getHeight()); pTransform.scale(1d, -1d); // Combined Transform User->Java->PDF setNewTranform(new AffineTransform()); // Set the line width setStroke(DEF_STROKE); } /** * This is called by PDFPage when creating a Graphcis instance. * * @param page The PDFPage to draw onto. */ protected void init(PDFPage page) { this.page = page; // We are the parent instance child = false; // Now create a stream to store the graphics in PDFStream stream = new PDFStream(); // To view detail in uncompressed format comment out the next line //stream.setDeflate(true); page.getPDFDocument().add(stream); page.add(stream); pw = new RawPrintWriter(stream.getOutputStream()); // initially, we are limited to the page size clipRectangle = page.getImageableArea(); // finally initialise the stream init(); } /** * This method is used internally by create() and by the PDFJob class * * @param page PDFPage to draw into * @param pw PrintWriter to use */ protected void init(PDFPage page, RawPrintWriter pw) { this.page = page; this.pw = pw; // In this case, we didn't create the stream (our parent did) // so child is true (see dispose) child = true; // finally initialise the stream init(); } /** * This adds a line segment to the current path * * @param x coordinate * @param y coordinate */ public void lineto(double x, double y) { newPath(); // no optimisation here as it may introduce errors on decimal coordinates. pw.print(cxy(x, y) + "l "); lx = (float) x; ly = (float) y; } /** * This adds a line segment to the current path * * @param x coordinate * @param y coordinate */ public void lineto(int x, int y) { newPath(); if (lx != x && ly != y) { pw.print(cxy(x, y) + "l "); } lx = x; ly = y; } /** * This moves the current drawing point. * * @param x coordinate * @param y coordinate */ public void moveto(double x, double y) { newPath(); // no optimisation here as it may introduce errors on decimal coordinates. pw.print(cxy(x, y) + "m "); lx = (float) x; ly = (float) y; } /** * This moves the current drawing point. * * @param x coordinate * @param y coordinate */ public void moveto(int x, int y) { newPath(); if (lx != x || ly != y) { pw.print(cxy(x, y) + "m "); } lx = x; ly = y; } /** * Functions that draw lines should start by calling this. It starts a new * path unless inStroke is set, in that case it uses the existing path */ void newPath() { if (inText) { closeBlock(); } if (!inStroke) { if (pre_np != null) { pw.print(pre_np); // this is the prefix set by setOrientation() pre_np = null; } pw.print("n "); } inText = false; inStroke = true; // an unlikely coordinate to fool the moveto() optimizer lx = ly = -9999; } /** *

    * Functions that draw text should start by calling this. It starts a text * block (accounting for media orientation) unless we are already in a Text * block.

    * *

    * It also handles if the font has been changed since the current text block * was started, so your function will be current.

    * * @param x x coordinate in java space * @param y y coordinate in java space */ void newTextBlock(float x, float y) { // close the current path if there is one if (inStroke) { closeBlock(); } // create the text block if one is not current. If we are, the newFont // condition at the end catches font changes if (!inText) { // This ensures that there is a font available getFont(); pw.print("q BT "); tx = ty = 0; AffineTransform tm = new AffineTransform(pTransform); pw.println("" + df.format(tm.getScaleX()) + " " + "" + df.format(tm.getShearY()) + " " + "" + df.format(tm.getShearX()) + " " + "" + df.format(tm.getScaleY()) + " " + "" + df.format(tm.getTranslateX()) + " " + "" + df.format(tm.getTranslateY()) + " Tm" ); // produce the text matrix for the media // switch(mediaRot) { // case PageFormat.PORTRAIT: // Portrait // //pw.println("1 0 0 1 0 0 Tm"); // break; // // case PageFormat.LANDSCAPE: // Landscape // pw.println("0 1 -1 0 0 0 Tm"); // rotate // break; // // case 180: // Inverted Portrait // pw.println("1 0 0 -1 0 0 Tm"); // break; // // case PageFormat.REVERSE_LANDSCAPE: // Seascape // pw.println("0 -1 1 0 0 0 Tm"); // rotate // break; // } // move the text cursor by an absolute amount pw.print(txy(x, y) + "Td "); } else { // move the text cursor by a relative amount pw.print(twh(x, y, tx, ty) + "Td "); //pw.print(txy(x,y)+"Td "); } // preserve the coordinates for the next time tx = x; ty = y; if (newFont || !inText) { pw.print(pdffont.getName() + " " + font.getSize() + " Tf "); } // later add colour changes here (if required) inStroke = newFont = false; inText = true; } /** * This is used to add a polygon to the current path. Used by drawPolygon(), * drawPolyline() and fillPolygon() etal * * @param xp Array of x coordinates * @param yp Array of y coordinates * @param np number of points in polygon * @see #drawPolygon * @see #drawPolyline * @see #fillPolygon */ public void polygon(int[] xp, int[] yp, int np) { // newPath() not needed here as moveto does it ;-) moveto(xp[0], yp[0]); for (int i = 1; i < np; i++) { lineto(xp[i], yp[i]); } } /** * @see Graphics2D#rotate(double) */ @Override public void rotate(double theta) { AffineTransform newTransform = new AffineTransform(transform); newTransform.rotate(theta); setNewTranform(newTransform); } /** * @see Graphics2D#rotate(double, double, double) */ @Override public void rotate(double theta, double x, double y) { AffineTransform newTransform = new AffineTransform(transform); newTransform.rotate(theta, x, y); setNewTranform(newTransform); } /** * @see Graphics2D#scale(double, double) */ @Override public void scale(double sx, double sy) { AffineTransform newTransform = new AffineTransform(transform); newTransform.scale(sx, sy); setNewTranform(newTransform); } /** * @see Graphics2D#setBackground(Color) */ @Override public void setBackground(Color color) { background = color; } /** * Clips to a set of coordinates * * @param x coordinate * @param y coordinate * @param w width * @param h height */ @Override public void setClip(int x, int y, int w, int h) { /*clipRectangle = new Rectangle(x, y, w, h); closeBlock(); // finish off any existing paths drawRect(x, y, w, h); closeBlock("W n"); // clip to current path*/ setClip(new Rectangle(x, y, w, h)); } /** * As my JDK docs say, this may break with Java 2D. *

    * Sets the clipping region to that of a Shape. * * @param s Shape to clip to. */ @Override public void setClip(Shape s) { closeBlock(); if (clip != null) { restoreState(); transform = clipTransform; } if (s == null) { clip = null; return; } clipTransform = transform; clip = new Area(s); clipRectangle = s.getBounds(); saveState(); followPath(s, CLIP); pw.println("n"); //setClip(r.x, r.y, r.width, r.height); } /** * Sets the color for drawing * * @param c Color to use */ @Override public void setColor(Color c) { setPaint(c); } /** * @see Graphics2D#setComposite(Composite) */ @Override public void setComposite(Composite comp) { this.composite = comp; } /** * This extension sets the line width to the default of 1mm which is what * Java uses when drawing to a PrintJob. */ public void setDefaultLineWidth() { closeBlock(); // draw any path before we change the line width pw.println("1 w"); } /** * This sets the font. * * @param f java.awt.Font to set to. */ @Override public void setFont(Font f) { // optimize: Save some space if the font is already the current one. if (font != f) { font = f; pdffont = page.getFont("/Type1", f.getName(), f.getStyle()); // mark the font as changed newFont = true; } } public void setExistingTtfFont(Font f) { if (font != f) { font = f; pdffont = page.getFont("/TrueType", f.getName(), f.getStyle()); // mark the font as changed newFont = true; } } public void setTtfFont(Font f, File file) throws IOException { if (font != f) { font = f; pdffont = page.getEmbeddedFont(f.getName(), f.getStyle(), file); // mark the font as changed newFont = true; } } private void setLineCap(int cap) { int lineCap = 0; switch (cap) { case BasicStroke.JOIN_MITER: lineCap = 0; break; case BasicStroke.JOIN_ROUND: lineCap = 1; break; case BasicStroke.JOIN_BEVEL: lineCap = 2; break; } if (this.lineCap != lineCap) { closeBlock(); // draw any path before we change the line width this.lineCap = lineCap; pw.println("" + lineCap + " J"); } } private void setLineJoin(int join) { int lineJoin = 0; switch (join) { case BasicStroke.JOIN_MITER: lineJoin = 0; break; case BasicStroke.JOIN_ROUND: lineJoin = 1; break; case BasicStroke.JOIN_BEVEL: lineJoin = 2; break; } if (this.lineJoin != lineJoin) { closeBlock(); // draw any path before we change the line width this.lineJoin = lineJoin; pw.println("" + lineJoin + " j"); } } /** * This extension allows the width of the drawn line to be set * * @param width Line width in pdf graphic units (points) */ public void setLineWidth(float width) { if (width != this.lineWidth) { closeBlock(); // draw any path before we change the line width this.lineWidth = width; pw.println("" + width + " w"); } } private void setMiterLimit(float limit) { if (limit != this.miterLimit) { closeBlock(); // draw any path before we change the line width this.miterLimit = limit; pw.println("" + limit + " M"); } } /** * Sets the paint for drawing * * @param paint Paint to use */ @Override public void setPaint(Paint paint) { this.paint = paint; this.shading = null; this.pattern = null; this.paintTransform = null; if (paint instanceof Color) { Color c = (Color) paint; double r = ((double) c.getRed()) / 255.0; double g = ((double) c.getGreen()) / 255.0; double b = ((double) c.getBlue()) / 255.0; closeBlock(); // This ensures any paths are drawn in the previous if (currentAlpha != c.getAlpha()) { String gsId = "/GSAlpha" + c.getAlpha(); currentAlpha = c.getAlpha(); if (!usedAlphas.contains(c.getAlpha())) { page.addExtGStateResource(gsId + " <>"); usedAlphas.add(currentAlpha); } pw.println(gsId + " gs"); } // colours pw.println("" + r + " " + g + " " + b + " rg " + r + " " + g + " " + b + " RG"); } if (paint instanceof MultipleGradientPaint) { closeBlock(); if ((paint instanceof RadialGradientPaint) || ((paint instanceof LinearGradientPaint) && (((LinearGradientPaint) paint).getCycleMethod() == MultipleGradientPaint.CycleMethod.NO_CYCLE))) { shading = "gradient"; } else { pattern = "gradient"; } } if (paint instanceof TexturePaint) { closeBlock(); pattern = "texture"; } } private boolean useFunctionShading(MultipleGradientPaint fgrad) { return ((fgrad instanceof RadialGradientPaint) && fgrad.getCycleMethod() != MultipleGradientPaint.CycleMethod.NO_CYCLE); } private Color[] convertColorSpace(Color[] colors, MultipleGradientPaint.ColorSpaceType colorSpaceType) { /*if (colorSpaceType == MultipleGradientPaint.ColorSpaceType.LINEAR_RGB) { Color[] ret = new Color[colors.length]; for (int i = 0; i < colors.length; i++) { int argb = colors[i].getRGB(); int a = argb >>> 24; int r = srgbToLinear[(argb >> 16) & 0xff]; int g = srgbToLinear[(argb >> 8) & 0xff]; int b = srgbToLinear[(argb) & 0xff]; ret[i] = new Color(r, g, b, a); } return ret; }*/ //return colors; return colors; } /*private boolean isPaintShading(Paint p) { return (p instanceof RadialGradientPaint) || ((p instanceof LinearGradientPaint) && (((LinearGradientPaint) p).getCycleMethod() == MultipleGradientPaint.CycleMethod.NO_CYCLE)); }*/ private void initGradientPaint(MultipleGradientPaint grad, Shape fillShape) { if ((grad instanceof LinearGradientPaint) && (((LinearGradientPaint) grad).getCycleMethod() == MultipleGradientPaint.CycleMethod.REFLECT)) { LinearGradientPaint linGrad = (LinearGradientPaint) grad; Point2D start = linGrad.getStartPoint(); Point2D end = linGrad.getEndPoint(); double deltaX = end.getX() - start.getX(); double deltaY = end.getY() - start.getY(); Point2D newEnd = new Point2D.Double(end.getX() + deltaX, end.getY() + deltaY); int colorCount = grad.getFractions().length; float fractions2[] = new float[colorCount * 2 - 1]; Color colors2[] = new Color[colorCount * 2 - 1]; float fractionsrev[] = new float[linGrad.getFractions().length]; Color colorsrev[] = new Color[linGrad.getColors().length]; for (int i = 0; i < fractionsrev.length; i++) { colorsrev[i] = linGrad.getColors()[i]; fractionsrev[i] = linGrad.getFractions()[i]; } for (int i = 0; i < colorCount; i++) { colors2[i] = colorsrev[i]; fractions2[i] = fractionsrev[i] / 2; } for (int i = 0; i < colorCount; i++) { colors2[colors2.length - i - 1] = colorsrev[i]; fractions2[colors2.length - i - 1] = 1f - fractionsrev[i] / 2; } LinearGradientPaint linGrad2 = new LinearGradientPaint(start, newEnd, fractions2, colors2, MultipleGradientPaint.CycleMethod.REPEAT); grad = linGrad2; } List functions2Refs = new ArrayList<>(); Color[] colors = convertColorSpace(grad.getColors(), grad.getColorSpace()); for (int i = 1; i < grad.getColors().length; i++) { final Color color1 = colors[i - 1]; final Color color2 = colors[i]; PDFObject function2 = new PDFObject(null) { @Override public void write(OutputStream os) throws IOException { writeStart(os); os.write(("/FunctionType 2 /Domain [0 1] /C0 [" + (((float) color1.getRed()) / 255.0f) + " " + (((float) color1.getGreen()) / 255.0f) + " " + (((float) color1.getBlue()) / 255.0f) + "] /C1 [" + (((float) color2.getRed()) / 255.0f) + " " + (((float) color2.getGreen()) / 255.0f) + " " + (((float) color2.getBlue()) / 255.0f) + "] /N 1\n").getBytes()); writeEnd(os); } }; page.getPDFDocument().add(function2); functions2Refs.add(function2.getSerialID() + " 0 R"); } final MultipleGradientPaint fgrad = grad; PDFObject function3 = new PDFObject(null) { @Override public void write(OutputStream os) throws IOException { writeStart(os); os.write(("/FunctionType 3 /Domain [0 1] /Functions [" + String.join(" ", functions2Refs) + "] ").getBytes()); int lastcols = fgrad.getColors().length - 1; List bounds = new ArrayList<>(); List encode = new ArrayList<>(); for (int i = 1; i < fgrad.getColors().length; i++) { if (i < lastcols) { bounds.add("" + fgrad.getFractions()[i]); } encode.add("0 1"); } os.write(("/Bounds [" + String.join(" ", bounds) + "] ").getBytes()); os.write(("/Encode [" + String.join(" ", encode) + "]\n").getBytes()); writeEnd(os); } }; page.getPDFDocument().add(function3); double glen = 0; double divisor = 1; double maxlen = 256; if ((fgrad instanceof LinearGradientPaint) && (fgrad.getCycleMethod() != MultipleGradientPaint.CycleMethod.NO_CYCLE)) { LinearGradientPaint linGrad = (LinearGradientPaint) fgrad; Point2D startPoint = new Point2D.Double(); Point2D endPoint = new Point2D.Double(); startPoint = linGrad.getStartPoint(); endPoint = linGrad.getEndPoint(); double deltaX = endPoint.getX() - startPoint.getX(); double deltaY = endPoint.getY() - startPoint.getY(); glen = Math.sqrt(deltaX * deltaX + deltaY * deltaY); if (glen > maxlen) { divisor = glen / maxlen; glen = maxlen; } } final double flen = glen; PDFStream radialFunction; if (useFunctionShading(fgrad)) { RadialGradientPaint radGrad = (RadialGradientPaint) fgrad; radialFunction = new PDFStream() { @Override public void write(OutputStream os) throws IOException { writeStart(os); os.write("/FunctionType 4\n".getBytes()); //pdf reference, page 168 os.write("/Domain [-1000000 1000000 -1000000 1000000]\n".getBytes()); os.write("/Range [0 1 0 1 0 1]\n".getBytes()); //3 - R,G,B writeStream(os); } }; //PDF reference, page 176 double a = ((radGrad.getCenterPoint().getX() - radGrad.getFocusPoint().getX()) * (radGrad.getCenterPoint().getX() - radGrad.getFocusPoint().getX()) + (radGrad.getCenterPoint().getY() - radGrad.getFocusPoint().getY()) * (radGrad.getCenterPoint().getY() - radGrad.getFocusPoint().getY()) - radGrad.getRadius() * radGrad.getRadius()); /*double b = 2 * (focalX - x) * (centerX - focalX) + 2 * (focalY - y) * (centerY - focalY); double c = (focalX - x) * (focalX - x) + (focalY - y) * (focalY - y); double D = b * b - 4 * a * c;*/ //(-b + Math.sqrt(D)) / (2 * a) //D = b * b - 4 * a * c; String functionBody = "{\n" + matDf.format(radGrad.getFocusPoint().getX()) + " 2 index sub\n" + matDf.format(radGrad.getCenterPoint().getX() - radGrad.getFocusPoint().getX()) + " mul 2 mul\n" //stack size: 3 + matDf.format(radGrad.getFocusPoint().getY()) + " 2 index sub\n" + matDf.format(radGrad.getCenterPoint().getY() - radGrad.getFocusPoint().getY()) + " mul 2 mul\n" + "add\n" //b, stack size: 3 + matDf.format(radGrad.getFocusPoint().getX()) + " 3 index sub\n" + "dup mul\n" + matDf.format(radGrad.getFocusPoint().getY()) + " 3 index sub\n" + "dup mul\n" + "add\n" //c, stack size: 4 + "1 index dup mul 4 " + matDf.format(a) + " mul 2 index mul sub\n" //D, stack size: 4 + "0 index 0 lt\n" + "{\n" + "1\n" + "}" + "{" + "0 index 0 gt\n" + "{\n" + "2 index neg 1 index sqrt add 2 " + matDf.format(a) + " mul div\n" // x1, stack size: 5 + "3 index neg 2 index sqrt sub 2 " + matDf.format(a) + " mul div\n" // x2, stack size: 6 + "0 index 2 index gt{0 index} {1 index} ifelse\n" + "exch pop exch pop\n" //x, stack size 5 + "}" + "{\n" + "2 index neg 2 " + matDf.format(a) + " mul div\n" // x, stack size 5 + "} ifelse\n" + "} ifelse\n" + "exch pop exch pop exch pop exch pop exch pop\n"; //remove index0,1,2,3,4 if (radGrad.getCycleMethod() == MultipleGradientPaint.CycleMethod.REFLECT) { functionBody += "dup\n"; } if (radGrad.getCycleMethod() == MultipleGradientPaint.CycleMethod.NO_CYCLE) { functionBody += "dup 1 gt {pop 1} if\n"; } else { functionBody += "dup 1 gt {dup floor sub} if\n"; } if (radGrad.getCycleMethod() == MultipleGradientPaint.CycleMethod.REFLECT) { functionBody += "exch floor 2 mod 1 eq {" + "neg 1 add" + "}\n" + "if\n"; } int num = radGrad.getFractions().length; Color[] rcolors = convertColorSpace(radGrad.getColors(), grad.getColorSpace()); for (int i = 0; i < num - 1; i++) { functionBody += "dup " + radGrad.getFractions()[i] + " lt not 1 index " + radGrad.getFractions()[i + 1] + " gt not and\n{\n" + "0 index " + radGrad.getFractions()[i] + " sub " + (radGrad.getFractions()[i + 1] - radGrad.getFractions()[i]) + " div\n" + "0 index " + ((rcolors[i + 1].getRed() - rcolors[i].getRed()) / 255.0) + " mul " + (rcolors[i].getRed() / 255.0) + " add\n" + "1 index " + ((rcolors[i + 1].getGreen() - rcolors[i].getGreen()) / 255.0) + " mul " + (rcolors[i].getGreen() / 255.0) + " add\n" + "2 index " + ((rcolors[i + 1].getBlue() - rcolors[i].getBlue()) / 255.0) + " mul " + (rcolors[i].getBlue() / 255.0) + " add\n"; if (i < num - 2) { functionBody += "}\n{\n"; } } functionBody += "}if\n"; for (int i = 0; i < num - 2; i++) { functionBody += "}ifelse\n"; } functionBody += "}\n"; //System.err.println("" + functionBody); OutputStream funOs = radialFunction.getOutputStream(); try { funOs.write(functionBody.getBytes()); } catch (IOException ex) { Logger.getLogger(PDFGraphics.class.getName()).log(Level.SEVERE, null, ex); } page.getPDFDocument().add(radialFunction); } else { radialFunction = null; } PDFObject shading = new PDFObject(null) { @Override public void write(OutputStream os) throws IOException { writeStart(os); if (fgrad instanceof LinearGradientPaint) { LinearGradientPaint linGrad = (LinearGradientPaint) fgrad; MyDoubleRect coords; if (linGrad.getCycleMethod() == MultipleGradientPaint.CycleMethod.NO_CYCLE) { Point2D startPointTrans = new Point2D.Double(); Point2D endPointTrans = new Point2D.Double(); startPointTrans = linGrad.getStartPoint(); endPointTrans = linGrad.getEndPoint(); coords = new MyDoubleRect(startPointTrans.getX(), startPointTrans.getY(), endPointTrans.getX(), endPointTrans.getY()); } else { coords = new MyDoubleRect(0, 0, 0, flen); } os.write(("/ShadingType 2 /ColorSpace /DeviceRGB " + "/Coords [" + matDf.format(coords.xMin) + " " + matDf.format(coords.yMin) + " " + matDf.format(coords.xMax) + " " + matDf.format(coords.yMax) + "] " + "/Domain [0 1] " + "/Function " + function3.getSerialID() + " 0 R /Extend [true true]\n").getBytes()); writeEnd(os); } if (fgrad instanceof RadialGradientPaint) { if (useFunctionShading(fgrad)) { os.write("/ShadingType 1\n".getBytes()); os.write("/ColorSpace /DeviceRGB\n".getBytes()); os.write(("/Function " + radialFunction.getSerialID() + " 0 R\n").getBytes()); } else { RadialGradientPaint radGrad = (RadialGradientPaint) fgrad; os.write(("/ShadingType 3 /ColorSpace /DeviceRGB " + "/Coords [" + radGrad.getFocusPoint().getX() + " " + radGrad.getFocusPoint().getY() + " " + "0 " + radGrad.getCenterPoint().getX() + " " + radGrad.getCenterPoint().getY() + " " + radGrad.getRadius() + "] " + "/Domain [0 1] " + "/Function " + function3.getSerialID() + " 0 R /Extend [true true]\n").getBytes()); } writeEnd(os); } } }; page.getPDFDocument().add(shading); shadingCount++; if ((grad instanceof LinearGradientPaint) && ((LinearGradientPaint) grad).getCycleMethod() != MultipleGradientPaint.CycleMethod.NO_CYCLE) { LinearGradientPaint linGrad = (LinearGradientPaint) grad; Point2D startPoint = linGrad.getStartPoint(); Point2D endPoint = linGrad.getEndPoint(); Point2D startPointTrans = new Point2D.Double(); Point2D endPointTrans = new Point2D.Double(); transform.transform(linGrad.getStartPoint(), startPointTrans); transform.transform(linGrad.getEndPoint(), endPointTrans); double deltaX = endPoint.getX() - startPoint.getX(); double deltaY = endPoint.getY() - startPoint.getY(); double tana = deltaX / deltaY; double alfa = Math.atan(tana); AffineTransform m = new AffineTransform(); m.concatenate(pTransform); m.concatenate(transform); m.concatenate(AffineTransform.getTranslateInstance(startPoint.getX(), endPoint.getY())); m.concatenate(AffineTransform.getScaleInstance(divisor, divisor)); m.concatenate(AffineTransform.getRotateInstance(-alfa)); String matrixStr = "" + matDf.format(m.getScaleX()) + " " + matDf.format(m.getShearY()) + " " + matDf.format(m.getShearX()) + " " + matDf.format(m.getScaleY()) + " " + matDf.format(m.getTranslateX()) + " " + matDf.format(m.getTranslateY()); final int fCurrentShadingCount = shadingCount; PDFStream innerPattern = new PDFStream("/Pattern") { @Override public void write(OutputStream os) throws IOException { writeStart(os); double w; double h; w = 1; h = flen; os.write("/PatternType 1\n".getBytes()); os.write("/PaintType 1\n".getBytes()); os.write("/TilingType 2\n".getBytes()); os.write(("/BBox [0 0 " + w + " " + h + "]\n").getBytes()); os.write(("/XStep " + w + "\n").getBytes()); os.write(("/YStep " + h + "\n").getBytes()); os.write(("/Resources << " + "/Shading << /Shin" + fCurrentShadingCount + " " + shading.getSerialID() + " 0 R >>" + ">>\n").getBytes()); os.write(("/Matrix [" + matrixStr + "]\n").getBytes()); writeStream(os); } }; OutputStream patOs = innerPattern.getOutputStream(); try { patOs.write(("/Shin" + shadingCount + " sh").getBytes()); } catch (IOException ex) { Logger.getLogger(PDFGraphics.class.getName()).log(Level.SEVERE, null, ex); } page.getPDFDocument().add(innerPattern); page.addPatternResource("/p" + shadingCount + " " + innerPattern.getSerialID() + " 0 R"); this.pattern = "/p" + shadingCount; return; } page.addShadingResource("/Sh" + shadingCount + " " + shading.getSerialID() + " 0 R "); this.shading = "/Sh" + shadingCount; } private void initTexturePaint(TexturePaint texturePaint) { BufferedImage img = texturePaint.getImage(); PDFMask mask = new PDFMask(img); page.getPDFDocument().add(mask); Rectangle2D anchorRect = texturePaint.getAnchorRect(); final double w = anchorRect.getWidth(); final double h = anchorRect.getHeight(); PDFImage image = new PDFImage(img, 0, 0, img.getWidth(), img.getHeight(), new ImageObserver() { @Override public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { return true; } }, "" + mask.getSerialID() + " 0 R"); // The image needs to be registered in several places page.getPDFDocument().setImageName(image); page.getPDFDocument().add(image); usedImages.put(img, image); AffineTransform m = new AffineTransform(); AffineTransform ptt = new AffineTransform(); ptt.concatenate(pTransform); ptt.concatenate(transform); m.concatenate(ptt); String matrixStr = "" + matDf.format(m.getScaleX()) + " " + matDf.format(m.getShearY()) + " " + matDf.format(m.getShearX()) + " " + matDf.format(m.getScaleY()) + " " + matDf.format(m.getTranslateX()) + " " + matDf.format(m.getTranslateY()); PDFStream innerPattern = new PDFStream("/Pattern") { @Override public void write(OutputStream os) throws IOException { writeStart(os); os.write("/PatternType 1\n".getBytes()); os.write("/PaintType 1\n".getBytes()); os.write("/TilingType 2\n".getBytes()); os.write(("/BBox [0 0 " + matDf.format(w) + " " + matDf.format(h) + "]\n").getBytes()); os.write(("/XStep " + matDf.format(w) + "\n").getBytes()); os.write(("/YStep " + matDf.format(h) + "\n").getBytes()); os.write(("/Resources << ").getBytes()); os.write("/XObject << ".getBytes()); os.write((image.getName() + " " + image.getSerialID() + " 0 R").getBytes()); os.write(" >> ".getBytes()); os.write((">>\n").getBytes()); //"1 0 0 1 0 0" os.write(("/Matrix [" + matrixStr + "]\n").getBytes()); writeStream(os); } }; OutputStream patOs = innerPattern.getOutputStream(); PrintWriter patwriter = new PrintWriter(patOs); AffineTransform transformToSet; transformToSet = new AffineTransform(w, 0, 0, -h, 0 - anchorRect.getX(), h - anchorRect.getY()); patwriter.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); transformToSet = new AffineTransform(w, 0, 0, -h, w - anchorRect.getX(), h - anchorRect.getY()); patwriter.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); transformToSet = new AffineTransform(w, 0, 0, -h, 0 - anchorRect.getX(), 2 * h - anchorRect.getY()); patwriter.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); transformToSet = new AffineTransform(w, 0, 0, -h, w - anchorRect.getX(), 2 * h - anchorRect.getY()); patwriter.print("q " + matDf.format(transformToSet.getScaleX()) + " " + matDf.format(transformToSet.getShearY()) + " " + matDf.format(transformToSet.getShearX()) + " " + matDf.format(transformToSet.getScaleY()) + " " + matDf.format(transformToSet.getTranslateX()) + " " + matDf.format(transformToSet.getTranslateY()) + " cm \n" + image.getName() + " Do\nQ\n"); patwriter.flush(); page.getPDFDocument().add(innerPattern); shadingCount++; page.addPatternResource("/p" + shadingCount + " " + innerPattern.getSerialID() + " 0 R"); this.pattern = "/p" + shadingCount; } /** * Not implemented, as this is not supported in the PDF specification. */ @Override public void setPaintMode() { } /** * Sets a rendering hint * * @param arg0 * @param arg1 */ @Override public void setRenderingHint(Key arg0, Object arg1) { if (arg1 != null) { rhints.put(arg0, arg1); } else { rhints.remove(arg0); } } // Add Graphics2D methods. /** * @see Graphics2D#setRenderingHints(Map) */ @Override public void setRenderingHints(Map hints) { rhints.clear(); rhints.putAll(hints); } /** * @see Graphics2D#setStroke(Stroke) */ @Override public void setStroke(Stroke s) { this.stroke = s; if (stroke instanceof BasicStroke) { BasicStroke bs = (BasicStroke) stroke; setLineCap(bs.getEndCap()); setLineJoin(bs.getLineJoin()); setLineWidth(bs.getLineWidth()); setMiterLimit(bs.getMiterLimit()); // TODO: Line dash pattern } } /** * @see Graphics2D#setTransform(AffineTransform) */ @Override public void setTransform(AffineTransform t) { setNewTranform(new AffineTransform(t)); } /** * Not implemented, as this is not supported in the PDF specification. * * @param c1 Color to xor with */ @Override public void setXORMode(Color c1) { } //============ Text operations ======================= /** * @see Graphics2D#shear(double, double) */ @Override public void shear(double shx, double shy) { AffineTransform newTransform = new AffineTransform(transform); newTransform.shear(shx, shy); setNewTranform(newTransform); } /** * @see Graphics2D#transform(AffineTransform) */ @Override public void transform(AffineTransform tx) { AffineTransform newTransform = new AffineTransform(transform); newTransform.concatenate(tx); setNewTranform(newTransform); } /** * @see Graphics2D#translate(double, double) */ @Override public void translate(double tx, double ty) { AffineTransform newTransform = new AffineTransform(transform); newTransform.translate(tx, ty); setNewTranform(newTransform); } /** * @see Graphics#translate(int, int) */ @Override public void translate(int x, int y) { translate((double) x, (double) y); } /** * Converts the Java space coordinates into pdf text space. * * @param x coordinate * @param y coordinate * @param tx coordinate * @param ty coordinate * @return String containing the coordinates in PDF text space */ private String twh(float x, float y, float tx, float ty) { float nx = x, ny = y; float ntx = tx, nty = ty; nx = (float) (x - tx); ny = (float) (y - ty); return "" + df.format(nx) + " " + df.format(ny) + " "; } /** * Converts the Java space coordinates into pdf text space. * * @param x coordinate * @param y coordinate * @return String containing the coordinates in PDF text space */ private String txy(float x, float y) { Point2D ptSrc = new Point2D.Float(x, y); Point2D ptDst = new Point2D.Float(); pTransform.transform(ptSrc, ptDst); return "" + df.format(ptDst.getX()) + " " + df.format(ptDst.getY()) + " "; } private void setNewTranform(AffineTransform t) { closeBlock(); if (true) { //return; } AffineTransform newTransform = new AffineTransform(t); AffineTransform transformToSet = new AffineTransform(newTransform); if (transform != null) { AffineTransform aInv = new AffineTransform(transform); try { aInv.invert(); } catch (NoninvertibleTransformException ex) { Logger.getLogger(PDFGraphics.class.getName()).log(Level.SEVERE, null, ex); } AffineTransform pInv = new AffineTransform(pTransform); try { pInv.invert(); } catch (NoninvertibleTransformException ex) { Logger.getLogger(PDFGraphics.class.getName()).log(Level.SEVERE, null, ex); } transformToSet = new AffineTransform(); transformToSet.concatenate(aInv); transformToSet.concatenate(pInv); transformToSet.concatenate(pTransform); transformToSet.concatenate(newTransform); } else { transformToSet.preConcatenate(pTransform); } transform = newTransform; pw.println("" + matDf.format(transformToSet.getScaleX()) + " " + "" + matDf.format(transformToSet.getShearY()) + " " + "" + matDf.format(transformToSet.getShearX()) + " " + "" + matDf.format(transformToSet.getScaleY()) + " " + "" + matDf.format(transformToSet.getTranslateX()) + " " + "" + matDf.format(transformToSet.getTranslateY()) + " cm" ); } private void saveState() { pw.println("q"); } private void restoreState() { pw.println("Q"); } } \ No newline at end of file