pax_global_header00006660000000000000000000000064111754011740014513gustar00rootroot0000000000000052 comment=8f64108dd2627162ae39c229fcf054c8fcec349f explorercanvas-0.r3/000077500000000000000000000000001117540117400145735ustar00rootroot00000000000000explorercanvas-0.r3/AUTHORS000066400000000000000000000003151117540117400156420ustar00rootroot00000000000000ExplorerCanvas Google Open Source: Developers: Emil A Eklund Erik Arvidsson Glen Murphy explorercanvas-0.r3/COPYING000066400000000000000000000261361117540117400156360ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. explorercanvas-0.r3/README000066400000000000000000000015371117540117400154610ustar00rootroot00000000000000ExplorerCanvas Copyright 2006 Google Inc. ------------------------------------------------------------------------------- DESCRIPTION Firefox, Safari and Opera 9 support the canvas tag to allow 2D command-based drawing operations. ExplorerCanvas brings the same functionality to Internet Explorer; web developers only need to include a single script tag in their existing canvas webpages to enable this support. ------------------------------------------------------------------------------- INSTALLATION Include the ExplorerCanvas tag in the same directory as your HTML files, and add the following code to your page, preferably in the tag. If you run into trouble, please look at the included example code to see how to best implement thisexplorercanvas-0.r3/examples/000077500000000000000000000000001117540117400164115ustar00rootroot00000000000000explorercanvas-0.r3/examples/example1.html000066400000000000000000000043501117540117400210150ustar00rootroot00000000000000 ExplorerCanvas Example 1 explorercanvas-0.r3/examples/example2.html000066400000000000000000000303331117540117400210160ustar00rootroot00000000000000 ExplorerCanvas Example 1 explorercanvas-0.r3/examples/example3.html000066400000000000000000000156001117540117400210170ustar00rootroot00000000000000
explorercanvas-0.r3/examples/ff.jpg000066400000000000000000000613061117540117400175140ustar00rootroot00000000000000JFIFC  !"$"$C|`" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?6(<):Q@PH֜x"[E=E5EH* UH=jآ(d1E8qXoqy_SSUidn@~ݍɇ!} [94m.bhm Jص~Fe1tAY-GS9M\Ͻ^޻#3;Y.Fep:ׯ᫬L'\ɮuS矡чtfޢ{w# }}Kt~C;c1t0TZg1U*r)oqޤc~ila ]N)}ǎjMeX M)bwh%uΑl']3@35}Ok?,Q˷jQkw;tzAO#g؊TםyL)J>^mSྜ]:?*˜cw .PFF#ӹB yy9I@:פZIJ> UfMݛ)=A'gE'01w̤Y 5V3y71ʪ$cx>c,YkeA95{{ j殒{Y6NoC4W[!%[U8 T=μn-ەN@FcXX3{2U >/n5G0 ҊJJyT\4Utڷ{ _+VC/z0z䬥VTd._C8BiW]o̾ Tg$ <;F%{ Btrqj7VĘ.$?*|Auxoˡ󌧊5c0]ऊ#?+~gkh!Yq,~mLʜ:rO}e,N4l8[]Ko2pjauX7΃2!VZ<пj *GчT^ tYxɮmO fx UTvz5Rƪ?-~kQEd~XE hR(9E8 @)™-QOQH)Tfآ5E< d1E(E2Ҕp(iiQN֞2OQޚQTjE5EH68 zjER3brAN)Tbp) p p`< ANi rd)í2[)P-;ؘIRQIS-ӾFQ]er>>Qmk$2ևRLB2kӈ+Fi^kv_?8o2I+\ s4S] }:3.il2|&eU֔,;\%EmG^ӭ3c#A[|UwKh~^ڄeeF3OsK =*[/<˜okL]i;/n99i.~hٵkY}?kmTtV84ڿVQjwu/_9pJ7g?>A. p@ OQZHtjyxpzPZ|9Z%>'he9i-^}n)zUdOjŊZl 6$"zBX:qc:*'/NRVHB#o=MI :@y--]3 Maƍ="1]zSn,RZs+Y;͔."rDquWx``F*y?SWS}WR͝. Gr>^]!SǗUM&97-K+ ;lzRY-$+!q6{Ky4/aƒ"mStϽRWxUg||]hevƜu dbR;Q}G5r9Vbs:S{{+N PٕmؗTGֶHCƃC{y)LJ{71"Ic=UE %FSb-ac%PE}pg/x:SP}EuGңyϊK͏ ;as:X)/>ts=)Y[>YF]1j0q+EVH&A+Lҵ 6kKNc&/[ھB-#[+MMU'x|F/nPZSX֣$S% wcB NA"rizv^FP8j Y*Ŀ;eo(T3UGJm#p>֮  |QzƗ#j T@^ÿtSwv%QRcFB\ıuޯ,p 5^o-IؾV\*~eŠ-OCHoj!kO$=iUQXZZ%^TiԜWL +y!*z,({9"8|l*h_ftJ ;Oo>d1Vs_ДjEJ.韃)Δ&֍\b֑M"JwYKsR zS;\ȶVaʬ` Aҩ |N͋RyOG(s̔JLre*ޚe5"t=7^#G Ia=F}yo[oj6k ò)#Pԃ㎾m-W\Dy)"SҜY*iO+7ʠ\EGgg\"=}2𥜢XthV2kT*YyuNF҃GA1E8R QA,rwZtKj@2i)Tg!ا(Zzdii/SLE˫t>fEku#V1W?xil# bk)ϸRx犫:j/ ~lb2zi!py>BOJNI&v:m#B)+T ))kODUƼSdWFڣ6٠lg*}Zȱ+[iH+^:`=3ӳ^gyvhGsj5[MYWʹĖNHV&uy3/ #C:Tz՝[r23=k* +\Z{h^X\ #r[}A8y)yu]Q4r/FMå>M}Ox=u=|IGUqJZēi 4idZi]jV1^JXWlHr9j*ۚ/Jv4إhR ))@)hVX)QEQEEr7Vc~G?ֺhkmkel,:26ִ4T&9[ҵ|[r-f/imVuebG_׭Xi:B x?jOY;~'yr^{|z*d5>'Qv{O,T/ZWÄw@s2aǽdlD(F[pj+O0>]N4u%2!d_Eoְ~%jz6㟷iDke13_`Xޱm+>1ximǿq5A2/~YKS4|>_z$t2k İ< QTN\_į|ywWD(~u^5%TaRpO]0)+.[M4p>k{4V[O#Y"FĜ Sp݌<֢Pqvacľ&ƺvgF1Y3ZNtZ<'R=eӬ \,IaՔ@?B?ZjR77<)[1֥~W^v>%IbY#`*_4;WMG#Igu(HK|?3Џ֢/.T=ңffI P9f]h!²>^4Mi4)Q TNN zӇZE(%i›OZdGZpL9iɦ=*Zb"FRcsR%Yi)í4C֚Tc8RN* ANZdœ))t X)8SFlpML( A֜*bFSX-R^L~fHӃZT*P4"L@ ƖSWn*q(hA= in@#|n&x?&#O(/(GG53ޕNc֬놮= K ‡E8wt%e`+P ( ( ( rgp*H HXըbz|[, aﯨo5FUgPcM׌+ "uooVG2[iv}vS힋dЭ?gwgd}yiEUÌ.f52/xםu}twKqy1-^[Oj3C1}0R"k‹We{]-^+'Y## f,U[unZHpzku]SAo,&2dj:ٴYn$; OaTOA.Etl.To,#8#=&Um~1I'7J^Ekm6ep'o*½YySqcڸ~(4+H49.IF7eӃ<whOΏc8R pTc@Hԃ4C)E'pC֞:Szj;8SiýQ,p:ԋT""FRi⚢*9i p5i)9=i rEE^!c cڹ@p']Q/J!qhQ@Q@*ƅRƭC`.v1W!ک#sb?m\,'! {1W|d >e*-ׯ'&_,+ONkJ]=C` rOk3B T#.0};aqar x6:x/SyȽ+7W[O6Cb~m?ZB\^Z|MWB)uI?%`a7Pӡn-dw)zuǽmu$501f#7lSY6j#Xj%?mX0'H5_?x;VѼEo]4 3wɯnҵKMWNMJ8$`:;RsԥˮV|Is2I7/i:n]۸AcOEk3OMMƿAŤ&YOO\EJVᣭ=zHΏqҚ>Tfǎ NԴcOħh?(KL*jb2ELiMǯZED*#)-HO^hDNZjӖ3cJpsSY|qwnތU+sHygv? 8˶䞦lm+=-:jO#<ˉӗ$z%^]Vŏji&+al?*,zqZvp3㉡uk[ N' ,=k;]ڵ ϶LZp+#1=KTꪵ8?Z,}WF,.R}r(`iR$RpIĂbbs#t}8=+t6UF#Ξ8$fZT)Fzc5FLfZzZflDs5_EiiaOozYL5MܷGkxIѤ MbtH 1^UɳWcFu_:}4%;>|N*jRSm-YK*P_3Zz tP1GJz x)v)%=z4iKH:^bj}0td-4Sץ4C*kҥZe!Ҥ^Z2ҞiM zGZr#6=z1iR!MZu2-{Ul$ο ̡J=^΍8yj6|:Tƥ7Ԭ$zf]NEJ(VEPw3Goo$8HRǰ&SzƷy.B}S'aOz/붃Pq^YMF.ҜoFOZ"ڬGznWjtӯ)&fHں@\ZܫBJ-?({l<2kV(R" JMғK#\b pA FZ<4,ZGbǹ'$E;$51IGTLj鯬j+eս0iSSY]Y~c93^JF12Gk_wKz6ZHףUbx$QF3*.X_/%ajReץH)ڞ+Ɏ0S֨-wXO_LJzZhڔRS%^֚í2GM /?О﹒ObЉ-?ARHb\s؏Q^,O`EŠ(^m>>]\pWuܸC\pWj)tV#ڬG Xj'XD5x8yzDG+>8kOCV v'iErUt iX[>7<כEqwN#G}2x&hHaAS#T~(=~L Ǜ6wCkR wWji}7oư.-u;wg4`ܩGYq^j+93'!u\ uDֹGM0I+B{"uU=SxźuYCM[_9f[h+k0cy8)$uI1ļa3}8#*"[v3FbةKTc#XjqI7eyE֟Zy˴QռG+?|J+O|jw^,---k:۶&O'T)ɟ?-=;ŖXՌ{LgS|]>uuy*@`rW35<ܞ=_>֩ߡW>;+?Ed.HDr~3Qd#veg<kSten0cTM:Š(%4QF]?xQqQ^\}kW:VZ"8}pTV,RSD8}Q`è9*<-`Z#v'4՞[?#Oo[J2AWMz & ZV#aPi(S~#y ŕ 0=Ϳ:LZu.ܓo0qW_lm{IC#\18ҾkukkXo5̅h@0? 0է:qVݯ|:TRRwEm~4!Azu_s7)!zajmWB՝%MV#f1sU)^9d',T "$YLb@r񿱩j74 :|nOv FOiQ*^LWF&AjvmmiͪPƼj%nYe_h\K >@[U9Ud8>D*Ym.lgDpn'.i;#+u?f5vJB24 2)˷湍cĩIR 2^\3HrXz̫?c۫%E:Wߢz~+Nտwm/én$yv*n9ڽ)SVHVGv P+01l-Vb{#DGFP{]#ˆ sEKJn72H}ĭ"ngҽEq !|OdƼ_uc3} >3hh5&UEW&ʟ0V&doW״}QZ>`^mu~~ϺcҼIgٺr?%| OKU&wrb^[~5`_%(T2tB-"z;jwMX>Zm(4c袒#Ҟ:zT!)š)GJh8tb-2GzTb)"S֣SR/Z&H)☴T"Ӆ1z4fNJz4TdOR!֣) xңC)LiTC$LL͏Ҙ)¨H KSn?^LO ӏ<ttJSh }ԧVFM7Jmg=E%)Nj{SsVԵQMVc YC) J RНy_#ifY5=mb_#޼<]h5#⾜xᶋpp3#_CMsʳ\2j6:2U>c}4gil䰙*)|ssAž忖+3Ş1w궅#cOCXW\.ROOk :u%K%w~,nQy) z\=▕\flX*8mW ^F◢ҨϡC$.Rir8y[#h49p)Vup&V-F`W?U*Z(QE])5Hc%6$?N.F=?O"($I\?j~!Z++ܪk$#ܟAɯ|5:jXޒF7g|SK)QjUO&'SJk_i[Mt$r~ Fjr 'H- >Z{_k㿔S]Ѐ~qvn*p _2NwyIy.0F8zkD|`h~@Š@iizҚ`4$zií4C$ZQLZxL9zӇL=iژ)!/L2d*1֞H͏kRD1:)ǭxgQ--ynYt%hWݺOpX>l4gp R~xHPt[~_xg$P@:\~k_wrRNh+Sƫb_->}q\B#hM;BQWY9=?ҽIԧ8Vg/c{;ky?A>^Gٴ+<5 [^n~i`k;(eÃPUK3I5Im !'}?{}|%_ gl}O]-~{JUl}F]ЦNm/O2;[hʈ?2OROQE|4)N[$rJR[q&ONY.FI6&OSSޱG}IWg<9;5)Jp_֧!@4M6u"@ix4cZp4i™ xNp%"cH)6=jDSTfNJx r#6H)Qx4c3&>jWEm>Mm]uymHïJ iݓa%({tSRCz/W^k'P ^rGxGlo<;s+?ZܶDGX`xc,DZk8g(.Oe=Q67^Zuk* zVk⫟rF̑g?_C4MJ;h$0GW/.珋-vGqÐ85 jéV [Ķ>~o=N|r/b1⹕ T~2SHnT5]6f|W.ss2i94dr=)&( mIE 3O֊W&(tI) 8UƜ(HOQJ=QS%yO$8} f+2($p) G`I8j:{9>Us54@$2I޳I!I\DEc{cuYoU/4޽s4軟+N)N+)(Ri Q !<SiǃOZSD1SQzޒ -,Tu'WOgscmnrC]+ qx{\oJ{{oz=ުӿSo*_𿈵^yo&#́ ޺?icR12?w+ AZ8v̨և,j r69CÏjgA^@O ?JI;IX2'zȾѼAfM">DgQO_;_èImSȫx95x;njw:2+2R1pߑw5#1ZїPtsY̓էc7ko>F>RI4Jv'&>9ej5w *sYSw7fb?ʠ@'mRKD⳯.<ò3w>]ܙ>D8N֙ikqw'm Á5:Q\!F5&~yOkCE]NM3MXmX`"FP` qI]汦KWO4D =Gvp>Vm;Y:Wc'Rϐu7v~dUH)ҿOϘQE ()妄ǩF֩ANZ`4hH*EZf)˜:SThSF =M36R0(F(ЊƧ휩ڥ7EKt`iۣGsv{g;djwZƃq闏~hꧏ]Nj|9 9l]V殯\iW"9^)~aE*˨QŸ@HL\Tb+ef,XOZ"Ϊ@~\g$2s5E-.H2?*,F#UEhhҼG4gyN6iIҰ+i:s^EjgR&*^knU) fI*/SXβ&mHZw>Z Udi]i[ hNkM1h@iGZJ^$Ӈj`Nd9 jAQ>E4֣S]G3"w{%AύuEzt`5Օ wWsœ|8wUbxhL;M!MPS^f]hУRQc8[4ѕzg8)kvyizqNSaE7B볺W93|8{{{'[̐S`ӖhSF 8SDANuI|zpuWwlZ]$0Wpv=s^aĘ|'꼒ve>.|N; xSݮ~NFw0;;f38ٴ %X*pYk꺯U(RD:ԱFz,qRjqI3'QE U4Pjd5YMJHqXfF8j VtMVj #J'er9Z=d@z>I؁BJƁV^mXu"lү}8#$lX z.oVAa[b;x1录G'qSQK#TbGh5-el'tvk<}NF*,AҸO50zjx3N}2KI9$&O8B1JzW+]:1t:.(^N֏cQEPhrzc<Z w%\Zo%FqFWHks\[Ԓ_Zgacf)?ŻEb~O^UR$79#lV%ď, 9|J5 ;[[[ .YIݎj_bec$JrO?"x|xIэ+=[HexeXjn-J͛Z$[ =7pvmI='\jr_F /L@ɬė N3ݮa8iV啯~TwݳEe/3+ONhkuwv"w6۩J9>w5IjL,`&նθo jCv|d>k 5^'–ZV'eBa]J|rD7ȧuᵺP1zj.$xM|i߯Ҵ~"[1\oP09|42bKF7B?ս|1d0'-m_T7=0LS_wivѾKML1ȍh%3ڪv1ieK:۴uWD$;q9?μIYI,&̱ٶ"*R堝-m}=w~G^_aa!j^Ry+_Mv()J }% N 2lH 8Pi 4-f5isA6$җ5iA4aif)jg\<j%FV2ڪxx5$yU5ÈS5UUZqꝊQ̄SҭGUڠXNcb=Wx^/OoW':RaoGG[?tdŨ/¯[[J@YTFr^pv_6/cY_4Sdei#"=(`SQU412UD525c$CEڬF65r&FMVz͉B9R'~KQ~ys;֝nqZ8}pUX^)afDΟ,Y狵NDuNY'We?gBk/MonfY[Sקy].efK_k|,@4f<#=a?v}x _9@;PZƑ 8cz| 56Nm&x S`SdVyu۪=3L5_ 3[ٶ#3ºE>X̤ɬ\$oNr?*}oI㫖^,rl-x()ӫn7G?ܳ4Xj(]ݯ3G%Ү9YCp?OI]'N3\IkW:.Sd(=h+,d0 ò=9[3iemJ[--+ߝ+S%{&egseRu=F^}ͧ_i7%Oݙ{~*H 2>qޥ5?:3á9ǧ=ɲ|fO).l<]?OV}'<ΰ9]Ngˉ;Iz+gNkhx4j0i™$J`4iܖN2lJ .j0iAؓ41Xx43K h~h0\Ӹ?4ހftjTReW=h0dc6 [VG*&e!OU}F. ^jf py; Ҋ웷ݱ2k[XFTˮi'ڣkj*p 3hqsOGVeO@#O]OFG>mڹ aJ_z#Џ٢A?c4{EOizj捿GJ7W'_)KnU6tIl/hfW={R=h ooo/5eųYwηw]ȧ|SDwQ0u4x؜-Y?gR,|CO{WkQX=eڭ?j4LRRxU;uJE4Sq֖9iQEQEE )⣧M(454ThO[ޣ3|,43nD\{cX kRӼ.ntyMʐ=z┛QЕL+ \=Pٶ ]9u,iT` 6[>+ia%,&kKȃM/"o~NczkW ?rLr/FHlt} TS ѵ'adAXȣqiI"'XYHA^9,|]$-躇-'zI#$1_j>)_j-{4i+mr;TqՈ{Vܬe:J1/!w^iou-@v+H, MYPon̊Sgk_\k1#]/,sҪ|3k'̸}H% t,IUnr`O.yOx X7^tK+܉iq8֗2,yBm{4>vV(Ts-mi(\n1Ji )i`M4 H:SG(cǥ8u u11P:Q@(ER) <zi!@iH9 F 8d2Pz^֞=j!NST%S1ڞD <d4H8vZ R!E8ϿcSL?99fisLV$&ę4~Ӹ?&SsF}FiњaQ2)IzoR A?ZnMv44џjLf)A4vf4Bi3AVBi&MIri4E$A4i!8a4G!J)({Sڜ ҝM҃Lh(  v)dZxT"1NTjyLQO NTCDS8d4H 8p4hp5LQN f F ;4ɰi`ӁKCQ҃NKPj0iӸH .j0iAKD V$.j<昬I2)Xx45>Vj3L.igFsM,;w?ZnE,;4fL ff v4&aI&4&i4 M!4I4&MJ$HM4)!M4 Hi4M&I4W1Aށ1ө:%ozu ( P)GZAKLx/AJ)88ud*hM 4j5 f 4qQxK 8xCCj1ޜhp5hp4Kޙ-NLӁWd?4i^aӁA+f4qXx4+fi"r(sEG@;?J3)ѓL,;?J3ђif>asFi@X\HO8É&WBiMIaI4vRBM&ޓ<*“M&4 AHi\i4RTexplorercanvas-0.r3/excanvas.compiled.js000066400000000000000000000261431117540117400205420ustar00rootroot00000000000000// Copyright 2006 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. document.createElement("canvas").getContext||(function(){var s=Math,j=s.round,F=s.sin,G=s.cos,V=s.abs,W=s.sqrt,k=10,v=k/2;function X(){return this.context_||(this.context_=new H(this))}var L=Array.prototype.slice;function Y(b,a){var c=L.call(arguments,2);return function(){return b.apply(a,c.concat(L.call(arguments)))}}var M={init:function(b){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var a=b||document;a.createElement("canvas");a.attachEvent("onreadystatechange",Y(this.init_,this,a))}},init_:function(b){b.namespaces.g_vml_|| b.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");b.namespaces.g_o_||b.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML");if(!b.styleSheets.ex_canvas_){var a=b.createStyleSheet();a.owningElement.id="ex_canvas_";a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=b.getElementsByTagName("canvas"),d=0;for(;d','","");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};i.stroke=function(b){var a=[],c=P(b?this.fillStyle:this.strokeStyle),d=c.color,f=c.alpha*this.globalAlpha;a.push("g.x)g.x=e.x;if(h.y==null||e.yg.y)g.y=e.y}}a.push(' ">');if(b)if(typeof this.fillStyle=="object"){var m=this.fillStyle,r=0,n={x:0,y:0},o=0,q=1;if(m.type_=="gradient"){var t=m.x1_/this.arcScaleX_,E=m.y1_/this.arcScaleY_,p=this.getCoords_(m.x0_/this.arcScaleX_,m.y0_/this.arcScaleY_), z=this.getCoords_(t,E);r=Math.atan2(z.x-p.x,z.y-p.y)*180/Math.PI;if(r<0)r+=360;if(r<1.0E-6)r=0}else{var p=this.getCoords_(m.x0_,m.y0_),w=g.x-h.x,x=g.y-h.y;n={x:(p.x-h.x)/w,y:(p.y-h.y)/x};w/=this.arcScaleX_*k;x/=this.arcScaleY_*k;var R=s.max(w,x);o=2*m.r0_/R;q=2*m.r1_/R-o}var u=m.colors_;u.sort(function(ba,ca){return ba.offset-ca.offset});var J=u.length,da=u[0].color,ea=u[J-1].color,fa=u[0].alpha*this.globalAlpha,ga=u[J-1].alpha*this.globalAlpha,S=[],l=0;for(;l')}else a.push('');else{var K=this.lineScale_*this.lineWidth;if(K<1)f*=K;a.push("')}a.push("");this.element_.insertAdjacentHTML("beforeEnd",a.join(""))};i.fill=function(){this.stroke(true)};i.closePath=function(){this.currentPath_.push({type:"close"})};i.getCoords_=function(b,a){var c=this.m_;return{x:k*(b*c[0][0]+a*c[1][0]+c[2][0])-v,y:k*(b*c[0][1]+a*c[1][1]+c[2][1])-v}};i.save=function(){var b={};O(this,b);this.aStack_.push(b);this.mStack_.push(this.m_);this.m_=y(I(),this.m_)};i.restore=function(){O(this.aStack_.pop(), this);this.m_=this.mStack_.pop()};function ha(b){var a=0;for(;a<3;a++){var c=0;for(;c<2;c++)if(!isFinite(b[a][c])||isNaN(b[a][c]))return false}return true}function A(b,a,c){if(!!ha(a)){b.m_=a;if(c)b.lineScale_=W(V(a[0][0]*a[1][1]-a[0][1]*a[1][0]))}}i.translate=function(b,a){A(this,y([[1,0,0],[0,1,0],[b,a,1]],this.m_),false)};i.rotate=function(b){var a=G(b),c=F(b);A(this,y([[a,c,0],[-c,a,0],[0,0,1]],this.m_),false)};i.scale=function(b,a){this.arcScaleX_*=b;this.arcScaleY_*=a;A(this,y([[b,0,0],[0,a, 0],[0,0,1]],this.m_),true)};i.transform=function(b,a,c,d,f,h){A(this,y([[b,a,0],[c,d,0],[f,h,1]],this.m_),true)};i.setTransform=function(b,a,c,d,f,h){A(this,[[b,a,0],[c,d,0],[f,h,1]],true)};i.clip=function(){};i.arcTo=function(){};i.createPattern=function(){return new U};function D(b){this.type_=b;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}D.prototype.addColorStop=function(b,a){a=P(a);this.colors_.push({offset:b,color:a.color,alpha:a.alpha})};function U(){}G_vmlCanvasManager= M;CanvasRenderingContext2D=H;CanvasGradient=D;CanvasPattern=U})(); explorercanvas-0.r3/excanvas.js000066400000000000000000000646451117540117400167600ustar00rootroot00000000000000// Copyright 2006 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Known Issues: // // * Patterns are not implemented. // * Radial gradient are not implemented. The VML version of these look very // different from the canvas one. // * Clipping paths are not implemented. // * Coordsize. The width and height attribute have higher priority than the // width and height style values which isn't correct. // * Painting mode isn't implemented. // * Canvas width/height should is using content-box by default. IE in // Quirks mode will draw the canvas using border-box. Either change your // doctype to HTML5 // (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) // or use Box Sizing Behavior from WebFX // (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) // * Non uniform scaling does not correctly scale strokes. // * Optimize. There is always room for speed improvements. // Only add this code if we do not already have a canvas implementation if (!document.createElement('canvas').getContext) { (function() { // alias some functions to make (compiled) code shorter var m = Math; var mr = m.round; var ms = m.sin; var mc = m.cos; var abs = m.abs; var sqrt = m.sqrt; // this is used for sub pixel precision var Z = 10; var Z2 = Z / 2; /** * This funtion is assigned to the elements as element.getContext(). * @this {HTMLElement} * @return {CanvasRenderingContext2D_} */ function getContext() { return this.context_ || (this.context_ = new CanvasRenderingContext2D_(this)); } var slice = Array.prototype.slice; /** * Binds a function to an object. The returned function will always use the * passed in {@code obj} as {@code this}. * * Example: * * g = bind(f, obj, a, b) * g(c, d) // will do f.call(obj, a, b, c, d) * * @param {Function} f The function to bind the object to * @param {Object} obj The object that should act as this when the function * is called * @param {*} var_args Rest arguments that will be used as the initial * arguments when the function is called * @return {Function} A new function that has bound this */ function bind(f, obj, var_args) { var a = slice.call(arguments, 2); return function() { return f.apply(obj, a.concat(slice.call(arguments))); }; } var G_vmlCanvasManager_ = { init: function(opt_doc) { if (/MSIE/.test(navigator.userAgent) && !window.opera) { var doc = opt_doc || document; // Create a dummy element so that IE will allow canvas elements to be // recognized. doc.createElement('canvas'); doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); } }, init_: function(doc) { // create xmlns if (!doc.namespaces['g_vml_']) { doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', '#default#VML'); } if (!doc.namespaces['g_o_']) { doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', '#default#VML'); } // Setup default CSS. Only add one style sheet per document if (!doc.styleSheets['ex_canvas_']) { var ss = doc.createStyleSheet(); ss.owningElement.id = 'ex_canvas_'; ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + // default size is 300x150 in Gecko and Opera 'text-align:left;width:300px;height:150px}' + 'g_vml_\\:*{behavior:url(#default#VML)}' + 'g_o_\\:*{behavior:url(#default#VML)}'; } // find all canvas elements var els = doc.getElementsByTagName('canvas'); for (var i = 0; i < els.length; i++) { this.initElement(els[i]); } }, /** * Public initializes a canvas element so that it can be used as canvas * element from now on. This is called automatically before the page is * loaded but if you are creating elements using createElement you need to * make sure this is called on the element. * @param {HTMLElement} el The canvas element to initialize. * @return {HTMLElement} the element that was created. */ initElement: function(el) { if (!el.getContext) { el.getContext = getContext; // Remove fallback content. There is no way to hide text nodes so we // just remove all childNodes. We could hide all elements and remove // text nodes but who really cares about the fallback content. el.innerHTML = ''; // do not use inline function because that will leak memory el.attachEvent('onpropertychange', onPropertyChange); el.attachEvent('onresize', onResize); var attrs = el.attributes; if (attrs.width && attrs.width.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setWidth_(attrs.width.nodeValue); el.style.width = attrs.width.nodeValue + 'px'; } else { el.width = el.clientWidth; } if (attrs.height && attrs.height.specified) { // TODO: use runtimeStyle and coordsize // el.getContext().setHeight_(attrs.height.nodeValue); el.style.height = attrs.height.nodeValue + 'px'; } else { el.height = el.clientHeight; } //el.getContext().setCoordsize_() } return el; } }; function onPropertyChange(e) { var el = e.srcElement; switch (e.propertyName) { case 'width': el.style.width = el.attributes.width.nodeValue + 'px'; el.getContext().clearRect(); break; case 'height': el.style.height = el.attributes.height.nodeValue + 'px'; el.getContext().clearRect(); break; } } function onResize(e) { var el = e.srcElement; if (el.firstChild) { el.firstChild.style.width = el.clientWidth + 'px'; el.firstChild.style.height = el.clientHeight + 'px'; } } G_vmlCanvasManager_.init(); // precompute "00" to "FF" var dec2hex = []; for (var i = 0; i < 16; i++) { for (var j = 0; j < 16; j++) { dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); } } function createMatrixIdentity() { return [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ]; } function matrixMultiply(m1, m2) { var result = createMatrixIdentity(); for (var x = 0; x < 3; x++) { for (var y = 0; y < 3; y++) { var sum = 0; for (var z = 0; z < 3; z++) { sum += m1[x][z] * m2[z][y]; } result[x][y] = sum; } } return result; } function copyState(o1, o2) { o2.fillStyle = o1.fillStyle; o2.lineCap = o1.lineCap; o2.lineJoin = o1.lineJoin; o2.lineWidth = o1.lineWidth; o2.miterLimit = o1.miterLimit; o2.shadowBlur = o1.shadowBlur; o2.shadowColor = o1.shadowColor; o2.shadowOffsetX = o1.shadowOffsetX; o2.shadowOffsetY = o1.shadowOffsetY; o2.strokeStyle = o1.strokeStyle; o2.globalAlpha = o1.globalAlpha; o2.arcScaleX_ = o1.arcScaleX_; o2.arcScaleY_ = o1.arcScaleY_; o2.lineScale_ = o1.lineScale_; } function processStyle(styleString) { var str, alpha = 1; styleString = String(styleString); if (styleString.substring(0, 3) == 'rgb') { var start = styleString.indexOf('(', 3); var end = styleString.indexOf(')', start + 1); var guts = styleString.substring(start + 1, end).split(','); str = '#'; for (var i = 0; i < 3; i++) { str += dec2hex[Number(guts[i])]; } if (guts.length == 4 && styleString.substr(3, 1) == 'a') { alpha = guts[3]; } } else { str = styleString; } return {color: str, alpha: alpha}; } function processLineCap(lineCap) { switch (lineCap) { case 'butt': return 'flat'; case 'round': return 'round'; case 'square': default: return 'square'; } } /** * This class implements CanvasRenderingContext2D interface as described by * the WHATWG. * @param {HTMLElement} surfaceElement The element that the 2D context should * be associated with */ function CanvasRenderingContext2D_(surfaceElement) { this.m_ = createMatrixIdentity(); this.mStack_ = []; this.aStack_ = []; this.currentPath_ = []; // Canvas context properties this.strokeStyle = '#000'; this.fillStyle = '#000'; this.lineWidth = 1; this.lineJoin = 'miter'; this.lineCap = 'butt'; this.miterLimit = Z * 1; this.globalAlpha = 1; this.canvas = surfaceElement; var el = surfaceElement.ownerDocument.createElement('div'); el.style.width = surfaceElement.clientWidth + 'px'; el.style.height = surfaceElement.clientHeight + 'px'; el.style.overflow = 'hidden'; el.style.position = 'absolute'; surfaceElement.appendChild(el); this.element_ = el; this.arcScaleX_ = 1; this.arcScaleY_ = 1; this.lineScale_ = 1; } var contextPrototype = CanvasRenderingContext2D_.prototype; contextPrototype.clearRect = function() { this.element_.innerHTML = ''; }; contextPrototype.beginPath = function() { // TODO: Branch current matrix so that save/restore has no effect // as per safari docs. this.currentPath_ = []; }; contextPrototype.moveTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.lineTo = function(aX, aY) { var p = this.getCoords_(aX, aY); this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); this.currentX_ = p.x; this.currentY_ = p.y; }; contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, aCP2x, aCP2y, aX, aY) { var p = this.getCoords_(aX, aY); var cp1 = this.getCoords_(aCP1x, aCP1y); var cp2 = this.getCoords_(aCP2x, aCP2y); bezierCurveTo(this, cp1, cp2, p); }; // Helper function that takes the already fixed cordinates. function bezierCurveTo(self, cp1, cp2, p) { self.currentPath_.push({ type: 'bezierCurveTo', cp1x: cp1.x, cp1y: cp1.y, cp2x: cp2.x, cp2y: cp2.y, x: p.x, y: p.y }); self.currentX_ = p.x; self.currentY_ = p.y; } contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { // the following is lifted almost directly from // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes var cp = this.getCoords_(aCPx, aCPy); var p = this.getCoords_(aX, aY); var cp1 = { x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) }; var cp2 = { x: cp1.x + (p.x - this.currentX_) / 3.0, y: cp1.y + (p.y - this.currentY_) / 3.0 }; bezierCurveTo(this, cp1, cp2, p); }; contextPrototype.arc = function(aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise) { aRadius *= Z; var arcType = aClockwise ? 'at' : 'wa'; var xStart = aX + mc(aStartAngle) * aRadius - Z2; var yStart = aY + ms(aStartAngle) * aRadius - Z2; var xEnd = aX + mc(aEndAngle) * aRadius - Z2; var yEnd = aY + ms(aEndAngle) * aRadius - Z2; // IE won't render arches drawn counter clockwise if xStart == xEnd. if (xStart == xEnd && !aClockwise) { xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something // that can be represented in binary } var p = this.getCoords_(aX, aY); var pStart = this.getCoords_(xStart, yStart); var pEnd = this.getCoords_(xEnd, yEnd); this.currentPath_.push({type: arcType, x: p.x, y: p.y, radius: aRadius, xStart: pStart.x, yStart: pStart.y, xEnd: pEnd.x, yEnd: pEnd.y}); }; contextPrototype.rect = function(aX, aY, aWidth, aHeight) { this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); }; contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.stroke(); this.currentPath_ = oldPath; }; contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { var oldPath = this.currentPath_; this.beginPath(); this.moveTo(aX, aY); this.lineTo(aX + aWidth, aY); this.lineTo(aX + aWidth, aY + aHeight); this.lineTo(aX, aY + aHeight); this.closePath(); this.fill(); this.currentPath_ = oldPath; }; contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { var gradient = new CanvasGradient_('gradient'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.x1_ = aX1; gradient.y1_ = aY1; return gradient; }; contextPrototype.createRadialGradient = function(aX0, aY0, aR0, aX1, aY1, aR1) { var gradient = new CanvasGradient_('gradientradial'); gradient.x0_ = aX0; gradient.y0_ = aY0; gradient.r0_ = aR0; gradient.x1_ = aX1; gradient.y1_ = aY1; gradient.r1_ = aR1; return gradient; }; contextPrototype.drawImage = function(image, var_args) { var dx, dy, dw, dh, sx, sy, sw, sh; // to find the original width we overide the width and height var oldRuntimeWidth = image.runtimeStyle.width; var oldRuntimeHeight = image.runtimeStyle.height; image.runtimeStyle.width = 'auto'; image.runtimeStyle.height = 'auto'; // get the original size var w = image.width; var h = image.height; // and remove overides image.runtimeStyle.width = oldRuntimeWidth; image.runtimeStyle.height = oldRuntimeHeight; if (arguments.length == 3) { dx = arguments[1]; dy = arguments[2]; sx = sy = 0; sw = dw = w; sh = dh = h; } else if (arguments.length == 5) { dx = arguments[1]; dy = arguments[2]; dw = arguments[3]; dh = arguments[4]; sx = sy = 0; sw = w; sh = h; } else if (arguments.length == 9) { sx = arguments[1]; sy = arguments[2]; sw = arguments[3]; sh = arguments[4]; dx = arguments[5]; dy = arguments[6]; dw = arguments[7]; dh = arguments[8]; } else { throw Error('Invalid number of arguments'); } var d = this.getCoords_(dx, dy); var w2 = sw / 2; var h2 = sh / 2; var vmlStr = []; var W = 10; var H = 10; // For some reason that I've now forgotten, using divs didn't work vmlStr.push(' ' , '', ''); this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); }; contextPrototype.stroke = function(aFill) { var lineStr = []; var lineOpen = false; var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); var color = a.color; var opacity = a.alpha * this.globalAlpha; var W = 10; var H = 10; lineStr.push(''); if (!aFill) { var lineWidth = this.lineScale_ * this.lineWidth; // VML cannot correctly render a line if the width is less than 1px. // In that case, we dilute the color to make the line look thinner. if (lineWidth < 1) { opacity *= lineWidth; } lineStr.push( '' ); } else if (typeof this.fillStyle == 'object') { var fillStyle = this.fillStyle; var angle = 0; var focus = {x: 0, y: 0}; // additional offset var shift = 0; // scale factor for offset var expansion = 1; if (fillStyle.type_ == 'gradient') { var x0 = fillStyle.x0_ / this.arcScaleX_; var y0 = fillStyle.y0_ / this.arcScaleY_; var x1 = fillStyle.x1_ / this.arcScaleX_; var y1 = fillStyle.y1_ / this.arcScaleY_; var p0 = this.getCoords_(x0, y0); var p1 = this.getCoords_(x1, y1); var dx = p1.x - p0.x; var dy = p1.y - p0.y; angle = Math.atan2(dx, dy) * 180 / Math.PI; // The angle should be a non-negative number. if (angle < 0) { angle += 360; } // Very small angles produce an unexpected result because they are // converted to a scientific notation string. if (angle < 1e-6) { angle = 0; } } else { var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_); var width = max.x - min.x; var height = max.y - min.y; focus = { x: (p0.x - min.x) / width, y: (p0.y - min.y) / height }; width /= this.arcScaleX_ * Z; height /= this.arcScaleY_ * Z; var dimension = m.max(width, height); shift = 2 * fillStyle.r0_ / dimension; expansion = 2 * fillStyle.r1_ / dimension - shift; } // We need to sort the color stops in ascending order by offset, // otherwise IE won't interpret it correctly. var stops = fillStyle.colors_; stops.sort(function(cs1, cs2) { return cs1.offset - cs2.offset; }); var length = stops.length; var color1 = stops[0].color; var color2 = stops[length - 1].color; var opacity1 = stops[0].alpha * this.globalAlpha; var opacity2 = stops[length - 1].alpha * this.globalAlpha; var colors = []; for (var i = 0; i < length; i++) { var stop = stops[i]; colors.push(stop.offset * expansion + shift + ' ' + stop.color); } // When colors attribute is used, the meanings of opacity and o:opacity2 // are reversed. lineStr.push(''); } else { lineStr.push(''); } lineStr.push(''); this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); }; contextPrototype.fill = function() { this.stroke(true); } contextPrototype.closePath = function() { this.currentPath_.push({type: 'close'}); }; /** * @private */ contextPrototype.getCoords_ = function(aX, aY) { var m = this.m_; return { x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 } }; contextPrototype.save = function() { var o = {}; copyState(this, o); this.aStack_.push(o); this.mStack_.push(this.m_); this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); }; contextPrototype.restore = function() { copyState(this.aStack_.pop(), this); this.m_ = this.mStack_.pop(); }; function matrixIsFinite(m) { for (var j = 0; j < 3; j++) { for (var k = 0; k < 2; k++) { if (!isFinite(m[j][k]) || isNaN(m[j][k])) { return false; } } } return true; } function setM(ctx, m, updateLineScale) { if (!matrixIsFinite(m)) { return; } ctx.m_ = m; if (updateLineScale) { // Get the line scale. // Determinant of this.m_ means how much the area is enlarged by the // transformation. So its square root can be used as a scale factor // for width. var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; ctx.lineScale_ = sqrt(abs(det)); } } contextPrototype.translate = function(aX, aY) { var m1 = [ [1, 0, 0], [0, 1, 0], [aX, aY, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.rotate = function(aRot) { var c = mc(aRot); var s = ms(aRot); var m1 = [ [c, s, 0], [-s, c, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), false); }; contextPrototype.scale = function(aX, aY) { this.arcScaleX_ *= aX; this.arcScaleY_ *= aY; var m1 = [ [aX, 0, 0], [0, aY, 0], [0, 0, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { var m1 = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, matrixMultiply(m1, this.m_), true); }; contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { var m = [ [m11, m12, 0], [m21, m22, 0], [dx, dy, 1] ]; setM(this, m, true); }; /******** STUBS ********/ contextPrototype.clip = function() { // TODO: Implement }; contextPrototype.arcTo = function() { // TODO: Implement }; contextPrototype.createPattern = function() { return new CanvasPattern_; }; // Gradient / Pattern Stubs function CanvasGradient_(aType) { this.type_ = aType; this.x0_ = 0; this.y0_ = 0; this.r0_ = 0; this.x1_ = 0; this.y1_ = 0; this.r1_ = 0; this.colors_ = []; } CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { aColor = processStyle(aColor); this.colors_.push({offset: aOffset, color: aColor.color, alpha: aColor.alpha}); }; function CanvasPattern_() {} // set up externs G_vmlCanvasManager = G_vmlCanvasManager_; CanvasRenderingContext2D = CanvasRenderingContext2D_; CanvasGradient = CanvasGradient_; CanvasPattern = CanvasPattern_; })(); } // if explorercanvas-0.r3/testcases/000077500000000000000000000000001117540117400165715ustar00rootroot00000000000000explorercanvas-0.r3/testcases/arc.html000066400000000000000000000015631117540117400202310ustar00rootroot00000000000000 Arc Test

This tests that drawing arches work in the same way in different browsers.

explorercanvas-0.r3/testcases/clearpath.html000066400000000000000000000016561117540117400214320ustar00rootroot00000000000000 Clear path Test

This tests the clearing of the path. You should only see a diamond shape above.

explorercanvas-0.r3/testcases/drawimage.html000066400000000000000000000010761117540117400214230ustar00rootroot00000000000000 Overflow Test explorercanvas-0.r3/testcases/gradient.html000066400000000000000000000014521117540117400212560ustar00rootroot00000000000000 Gradient Test

This tests gradients

explorercanvas-0.r3/testcases/gradient2.html000066400000000000000000000015521117540117400213410ustar00rootroot00000000000000 Gradient Test

This tests gradients

explorercanvas-0.r3/testcases/linewidth.html000066400000000000000000000015671117540117400214570ustar00rootroot00000000000000 Line Width Test

This tests that lines work in the same way in different browsers when you are using sub pixel coordinates.

explorercanvas-0.r3/testcases/overflow.html000066400000000000000000000012571117540117400213270ustar00rootroot00000000000000 Overflow Test

This tests if content gets cropped if painting outside the canvas.

explorercanvas-0.r3/testcases/quadraticcurve.html000066400000000000000000000020341117540117400225000ustar00rootroot00000000000000 Quadratic Curve Test

This tests that drawing quadratic curves work in the same way in different browsers.

explorercanvas-0.r3/testcases/resizing.html000066400000000000000000000030221117540117400213060ustar00rootroot00000000000000 ExplorerCanvas Text Case Fallback content markup explorercanvas-0.r3/testcases/saverestorepath.html000066400000000000000000000015321117540117400226770ustar00rootroot00000000000000 Save/restore path Test

This tests ensures that save/restore does not do anything to the current path. You should see a diamond shape above.

explorercanvas-0.r3/testcases/stroke-scale-rotate.html000066400000000000000000000024701117540117400233520ustar00rootroot00000000000000 Stroke Scale explorercanvas-0.r3/testcases/stroke-should-not-close-path.html000066400000000000000000000011651117540117400251200ustar00rootroot00000000000000